From f91a53d8936d9c387630c6ae4a313002a061a3c9 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 26 May 2018 13:23:58 +0900 Subject: [PATCH 001/369] Update dependencies :rocket: --- package.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 534b0c296d..e67b33ceb7 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "css-loader": "0.28.11", "debug": "3.1.0", "deep-equal": "1.0.1", - "deepcopy": "0.6.3", + "deepcopy": "1.0.0", "diskusage": "0.2.4", "dompurify": "1.0.4", "elasticsearch": "15.0.0", @@ -114,7 +114,7 @@ "gulp-cssnano": "2.1.3", "gulp-htmlmin": "4.0.0", "gulp-imagemin": "4.1.0", - "gulp-mocha": "5.0.0", + "gulp-mocha": "6.0.0", "gulp-pug": "4.0.1", "gulp-rename": "1.2.3", "gulp-replace": "1.0.0", @@ -124,17 +124,17 @@ "gulp-typescript": "4.0.2", "gulp-uglify": "3.0.0", "gulp-util": "3.0.8", - "hard-source-webpack-plugin": "0.6.9", + "hard-source-webpack-plugin": "0.6.10", "highlight.js": "9.12.0", - "html-minifier": "3.5.15", + "html-minifier": "3.5.16", "http-signature": "1.2.0", "inquirer": "5.2.0", "is-root": "2.0.0", "is-url": "1.2.4", "js-yaml": "3.11.0", - "jsdom": "11.10.0", + "jsdom": "11.11.0", "koa": "2.5.1", - "koa-bodyparser": "4.2.0", + "koa-bodyparser": "4.2.1", "koa-compress": "3.0.0", "koa-favicon": "2.0.1", "koa-json-body": "5.3.0", @@ -163,18 +163,18 @@ "object-assign-deep": "0.4.0", "on-build-webpack": "0.1.0", "os-utils": "0.0.14", - "parse5": "4.0.0", + "parse5": "5.0.0", "progress-bar-webpack-plugin": "1.11.0", "prominence": "0.2.0", "promise-sequential": "1.1.1", "pug": "2.0.3", - "punycode": "2.1.0", + "punycode": "2.1.1", "qrcode": "1.2.0", "ratelimiter": "3.0.3", "recaptcha-promise": "0.1.3", "reconnecting-websocket": "3.2.2", "redis": "2.8.0", - "request": "2.86.0", + "request": "2.87.0", "request-promise-native": "1.0.5", "rimraf": "2.6.2", "rndstr": "1.0.0", @@ -193,7 +193,7 @@ "textarea-caret": "3.1.0", "tmp": "0.0.33", "ts-loader": "4.3.0", - "ts-node": "6.0.3", + "ts-node": "6.0.4", "tslint": "5.10.0", "typescript": "2.8.3", "typescript-eslint-parser": "15.0.0", @@ -205,7 +205,7 @@ "vue-cropperjs": "2.2.0", "vue-js-modal": "1.3.13", "vue-json-tree-view": "2.1.4", - "vue-loader": "15.1.0", + "vue-loader": "15.2.1", "vue-material": "^1.0.0-beta-10.2", "vue-router": "3.0.1", "vue-template-compiler": "2.5.16", @@ -214,10 +214,10 @@ "vuex-persistedstate": "^2.5.4", "web-push": "3.3.1", "webfinger.js": "2.6.6", - "webpack": "4.8.3", - "webpack-cli": "2.1.3", + "webpack": "4.9.1", + "webpack-cli": "2.1.4", "websocket": "1.0.26", - "ws": "5.1.1", + "ws": "5.2.0", "xev": "2.0.0" } } From 65a3bac5431c1d11994e9ccff3163f18f5eb2600 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 26 May 2018 13:25:10 +0900 Subject: [PATCH 002/369] :v: --- src/models/user.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/models/user.ts b/src/models/user.ts index 477bb232e4..ff1ae57d73 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -169,9 +169,9 @@ export async function deleteUser(user: string | mongo.ObjectID | IUser) { ).map(x => deleteAccessToken(x))); // このユーザーのNoteをすべて削除 - //await sequential(( - // await Note.find({ userId: u._id }) - //).map(x => () => deleteNote(x))); + await sequential(( + await Note.find({ userId: u._id }) + ).map(x => () => deleteNote(x))); // このユーザーのNoteReactionをすべて削除 await Promise.all(( From 5415b67baac04a7d11a8a296b5c6991fc8726003 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 26 May 2018 16:04:47 +0900 Subject: [PATCH 003/369] Fix bug --- package.json | 2 +- src/models/app.ts | 2 +- src/models/auth-session.ts | 2 +- src/models/drive-file.ts | 2 +- src/models/drive-folder.ts | 2 +- src/models/favorite.ts | 2 +- src/models/messaging-message.ts | 2 +- src/models/note-reaction.ts | 2 +- src/models/note.ts | 2 +- src/models/notification.ts | 2 +- src/models/othello-game.ts | 2 +- src/models/othello-matching.ts | 2 +- src/models/signin.ts | 2 +- src/models/user-list.ts | 2 +- src/models/user.ts | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index e67b33ceb7..3806074de2 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "css-loader": "0.28.11", "debug": "3.1.0", "deep-equal": "1.0.1", - "deepcopy": "1.0.0", + "deepcopy": "0.6.3", "diskusage": "0.2.4", "dompurify": "1.0.4", "elasticsearch": "15.0.0", diff --git a/src/models/app.ts b/src/models/app.ts index 45c95d92d8..7926f2fac2 100644 --- a/src/models/app.ts +++ b/src/models/app.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import deepcopy = require('deepcopy'); +import * as deepcopy from 'deepcopy'; import AccessToken from './access-token'; import db from '../db/mongodb'; import config from '../config'; diff --git a/src/models/auth-session.ts b/src/models/auth-session.ts index 6fe3468a7b..219b1a4c8b 100644 --- a/src/models/auth-session.ts +++ b/src/models/auth-session.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import deepcopy = require('deepcopy'); +import * as deepcopy from 'deepcopy'; import db from '../db/mongodb'; import { pack as packApp } from './app'; diff --git a/src/models/drive-file.ts b/src/models/drive-file.ts index a3a567038e..bb98c11a93 100644 --- a/src/models/drive-file.ts +++ b/src/models/drive-file.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import deepcopy = require('deepcopy'); +import * as deepcopy from 'deepcopy'; import { pack as packFolder } from './drive-folder'; import config from '../config'; import monkDb, { nativeDbConn } from '../db/mongodb'; diff --git a/src/models/drive-folder.ts b/src/models/drive-folder.ts index e7961936aa..cafb9cdf13 100644 --- a/src/models/drive-folder.ts +++ b/src/models/drive-folder.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import deepcopy = require('deepcopy'); +import * as deepcopy from 'deepcopy'; import db from '../db/mongodb'; import DriveFile from './drive-file'; diff --git a/src/models/favorite.ts b/src/models/favorite.ts index d24833f191..45417212e3 100644 --- a/src/models/favorite.ts +++ b/src/models/favorite.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import deepcopy = require('deepcopy'); +import * as deepcopy from 'deepcopy'; import db from '../db/mongodb'; import { pack as packNote } from './note'; diff --git a/src/models/messaging-message.ts b/src/models/messaging-message.ts index a6a50fc8cf..ad2d1657e6 100644 --- a/src/models/messaging-message.ts +++ b/src/models/messaging-message.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import deepcopy = require('deepcopy'); +import * as deepcopy from 'deepcopy'; import { pack as packUser } from './user'; import { pack as packFile } from './drive-file'; import db from '../db/mongodb'; diff --git a/src/models/note-reaction.ts b/src/models/note-reaction.ts index 706ae54c16..e5e108c017 100644 --- a/src/models/note-reaction.ts +++ b/src/models/note-reaction.ts @@ -1,6 +1,6 @@ import * as mongo from 'mongodb'; import $ from 'cafy'; -import deepcopy = require('deepcopy'); +import * as deepcopy from 'deepcopy'; import db from '../db/mongodb'; import Reaction from './note-reaction'; import { pack as packUser } from './user'; diff --git a/src/models/note.ts b/src/models/note.ts index 1274901d45..5d7bab3833 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import deepcopy = require('deepcopy'); +import * as deepcopy from 'deepcopy'; import rap from '@prezzemolo/rap'; import db from '../db/mongodb'; import { IUser, pack as packUser } from './user'; diff --git a/src/models/notification.ts b/src/models/notification.ts index 76871166a9..c4cf1e4efd 100644 --- a/src/models/notification.ts +++ b/src/models/notification.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import deepcopy = require('deepcopy'); +import * as deepcopy from 'deepcopy'; import db from '../db/mongodb'; import { IUser, pack as packUser } from './user'; import { pack as packNote } from './note'; diff --git a/src/models/othello-game.ts b/src/models/othello-game.ts index 297aee3028..1dd375d2e5 100644 --- a/src/models/othello-game.ts +++ b/src/models/othello-game.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import deepcopy = require('deepcopy'); +import * as deepcopy from 'deepcopy'; import db from '../db/mongodb'; import { IUser, pack as packUser } from './user'; diff --git a/src/models/othello-matching.ts b/src/models/othello-matching.ts index 8082c258c8..0efba3ae5d 100644 --- a/src/models/othello-matching.ts +++ b/src/models/othello-matching.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import deepcopy = require('deepcopy'); +import * as deepcopy from 'deepcopy'; import db from '../db/mongodb'; import { IUser, pack as packUser } from './user'; diff --git a/src/models/signin.ts b/src/models/signin.ts index 7f56e1a283..d8b05c0e30 100644 --- a/src/models/signin.ts +++ b/src/models/signin.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import deepcopy = require('deepcopy'); +import * as deepcopy from 'deepcopy'; import db from '../db/mongodb'; const Signin = db.get<ISignin>('signin'); diff --git a/src/models/user-list.ts b/src/models/user-list.ts index 7100fced7e..4cf1de61a4 100644 --- a/src/models/user-list.ts +++ b/src/models/user-list.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import deepcopy = require('deepcopy'); +import * as deepcopy from 'deepcopy'; import db from '../db/mongodb'; const UserList = db.get<IUserList>('userList'); diff --git a/src/models/user.ts b/src/models/user.ts index ff1ae57d73..74ddcc77f9 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import deepcopy = require('deepcopy'); +import * as deepcopy from 'deepcopy'; import sequential = require('promise-sequential'); import rap from '@prezzemolo/rap'; import db from '../db/mongodb'; From ddb413ca52e9c3a2b182c929007efd80727f81cf Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 26 May 2018 16:05:02 +0900 Subject: [PATCH 004/369] :art: --- src/client/app/mobile/views/components/note-preview.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue index 8fa57768e0..f3805ac481 100644 --- a/src/client/app/mobile/views/components/note-preview.vue +++ b/src/client/app/mobile/views/components/note-preview.vue @@ -61,7 +61,7 @@ root(isDark) > header display flex align-items baseline - margin-bottom 4px + margin-bottom 2px white-space nowrap > .avatar From 8f175186bcd62d2a4372eef8147119ed2ccb0f66 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 26 May 2018 16:08:57 +0900 Subject: [PATCH 005/369] Fix bug --- src/client/app/mobile/views/pages/notifications.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/mobile/views/pages/notifications.vue b/src/client/app/mobile/views/pages/notifications.vue index 2e98201caa..64cfa60da0 100644 --- a/src/client/app/mobile/views/pages/notifications.vue +++ b/src/client/app/mobile/views/pages/notifications.vue @@ -24,7 +24,7 @@ export default Vue.extend({ const ok = window.confirm('%i18n:@read-all%'); if (!ok) return; - (this as any).api('notifications/markAsRead_all'); + (this as any).api('notifications/mark_as_read_all'); }, onFetched() { Progress.done(); From f840d491e56b55101491b494a91ee47e0396d395 Mon Sep 17 00:00:00 2001 From: Zero King <l2dy@icloud.com> Date: Sat, 26 May 2018 11:43:09 +0000 Subject: [PATCH 006/369] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a44c7e16ee..842c3e8a34 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ ultimately sophisticated new type of mini-blog based SNS. * Real time contents * ActivityPub compatible -and more! You can touch with your own eyes at [misskey.xyz](https://misskey.xyz). +and more! You can see it with your own eyes at [misskey.xyz](https://misskey.xyz). :package: Create your instance ---------------------------------------------------------------- From 67b3461c242e50a3248f99bb164d160db2823db1 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 26 May 2018 23:20:52 +0900 Subject: [PATCH 007/369] Better mention handling --- .../app/desktop/views/components/post-form.vue | 12 ++++++++++++ src/client/app/mobile/views/components/post-form.vue | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index 0696d4e82b..0e0848524a 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -49,6 +49,7 @@ import Vue from 'vue'; import * as XDraggable from 'vuedraggable'; import getKao from '../../../common/scripts/get-kao'; import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue'; +import parse from '../../../../../text/parse'; export default Vue.extend({ components: { @@ -110,6 +111,17 @@ export default Vue.extend({ this.text = `@${this.reply.user.username}@${this.reply.user.host} `; } + if (this.reply && this.reply.text != null) { + const ast = parse(this.reply.text); + + ast.filter(t => t.type == 'mention').forEach(x => { + const mention = x.host ? `@${x.username}@${x.host}` : `@${x.username}`; + if (this.text.indexOf(`${mention} `) == -1) { + this.text += `${mention} `; + } + }); + } + this.$nextTick(() => { // 書きかけの投稿を復元 const draft = JSON.parse(localStorage.getItem('drafts') || '{}')[this.draftId]; diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index b3b5ffd502..55347b7e53 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -49,6 +49,7 @@ import Vue from 'vue'; import * as XDraggable from 'vuedraggable'; import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue'; import getKao from '../../../common/scripts/get-kao'; +import parse from '../../../../../text/parse'; export default Vue.extend({ components: { @@ -78,6 +79,17 @@ export default Vue.extend({ this.text = `@${this.reply.user.username}@${this.reply.user.host} `; } + if (this.reply && this.reply.text != null) { + const ast = parse(this.reply.text); + + ast.filter(t => t.type == 'mention').forEach(x => { + const mention = x.host ? `@${x.username}@${x.host}` : `@${x.username}`; + if (this.text.indexOf(`${mention} `) == -1) { + this.text += `${mention} `; + } + }); + } + this.$nextTick(() => { this.focus(); }); From 102aaeb3907b06b3a13371474df41cb1160d0084 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 26 May 2018 23:34:20 +0900 Subject: [PATCH 008/369] Darken --- .../app/desktop/views/components/calendar.vue | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/client/app/desktop/views/components/calendar.vue b/src/client/app/desktop/views/components/calendar.vue index 9a93841e52..3b0330cf61 100644 --- a/src/client/app/desktop/views/components/calendar.vue +++ b/src/client/app/desktop/views/components/calendar.vue @@ -138,6 +138,7 @@ root(isDark) background isDark ? #282C37 : #fff border solid 1px rgba(#000, 0.075) border-radius 6px + overflow hidden &[data-melt] background transparent !important @@ -151,9 +152,12 @@ root(isDark) line-height 42px font-size 0.9em font-weight bold - color #888 + color isDark ? #c5ced6 : #888 box-shadow 0 1px rgba(#000, 0.07) + if isDark + background #313543 + > [data-fa] margin-right 4px @@ -165,13 +169,13 @@ root(isDark) width 42px font-size 0.9em line-height 42px - color #ccc + color isDark ? #9baec8 : #ccc &:hover - color #aaa + color isDark ? #b2c1d5 : #aaa &:active - color #999 + color isDark ? #b2c1d5 : #999 &:first-of-type left 0 @@ -194,49 +198,49 @@ root(isDark) font-size 14px &.weekday - color #19a2a9 + color isDark ? #43d5dc : #19a2a9 &[data-is-donichi] - color #ef95a0 + color isDark ? #ff6679 : #ef95a0 &[data-today] - box-shadow 0 0 0 1px #19a2a9 inset + box-shadow 0 0 0 1px isDark ? #43d5dc : #19a2a9 inset border-radius 6px &[data-is-donichi] - box-shadow 0 0 0 1px #ef95a0 inset + box-shadow 0 0 0 1px isDark ? #ff6679 : #ef95a0 inset &.day cursor pointer - color #777 + color isDark ? #c5ced6 : #777 > div border-radius 6px &:hover > div - background rgba(#000, 0.025) + background rgba(#000, isDark ? 0.1 : 0.025) &:active > div - background rgba(#000, 0.05) + background rgba(#000, isDark ? 0.2 : 0.05) &[data-is-donichi] - color #ef95a0 + color isDark ? #ff6679 : #ef95a0 &[data-is-out-of-range] cursor default - color rgba(#777, 0.5) + color rgba(isDark ? #c5ced6 : #777, 0.5) &[data-is-donichi] - color rgba(#ef95a0, 0.5) + color rgba(isDark ? #ff6679 : #ef95a0, 0.5) &[data-selected] font-weight bold > div - background rgba(#000, 0.025) + background rgba(#000, isDark ? 0.1 : 0.025) &:active > div - background rgba(#000, 0.05) + background rgba(#000, isDark ? 0.2 : 0.05) &[data-today] > div From 100557e975a0aab19d0fa42e552ac5bf7882a65f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 26 May 2018 23:37:40 +0900 Subject: [PATCH 009/369] Fix bug --- .../views/components/user-list-timeline.vue | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/client/app/mobile/views/components/user-list-timeline.vue b/src/client/app/mobile/views/components/user-list-timeline.vue index 59d6abbbc1..c0ba995b68 100644 --- a/src/client/app/mobile/views/components/user-list-timeline.vue +++ b/src/client/app/mobile/views/components/user-list-timeline.vue @@ -12,6 +12,7 @@ const fetchLimit = 10; export default Vue.extend({ props: ['list'], + data() { return { fetching: true, @@ -20,15 +21,25 @@ export default Vue.extend({ connection: null }; }, + + computed: { + canFetchMore(): boolean { + return !this.moreFetching && !this.fetching && this.existMore; + } + }, + watch: { $route: 'init' }, + mounted() { this.init(); }, + beforeDestroy() { this.connection.close(); }, + methods: { init() { if (this.connection) this.connection.close(); @@ -39,6 +50,7 @@ export default Vue.extend({ this.fetch(); }, + fetch() { this.fetching = true; @@ -59,7 +71,10 @@ export default Vue.extend({ }, rej); })); }, + more() { + if (!this.canFetchMore) return; + this.moreFetching = true; (this as any).api('notes/user-list-timeline', { @@ -78,13 +93,16 @@ export default Vue.extend({ this.moreFetching = false; }); }, + onNote(note) { // Prepend a note (this.$refs.timeline as any).prepend(note); }, + onUserAdded() { this.fetch(); }, + onUserRemoved() { this.fetch(); } From d29459fa3781043c4e484c876966dbae5c98a538 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 26 May 2018 23:53:22 +0900 Subject: [PATCH 010/369] Fix bug --- .../desktop/views/components/timeline.core.vue | 8 ++++++-- .../views/components/user-list-timeline.vue | 8 ++++++-- .../desktop/views/pages/user/user.timeline.vue | 17 +++++++++++++++-- .../views/components/user-list-timeline.vue | 8 ++++++-- .../mobile/views/components/user-timeline.vue | 9 +++++++-- .../app/mobile/views/pages/home.timeline.vue | 8 ++++++-- 6 files changed, 46 insertions(+), 12 deletions(-) diff --git a/src/client/app/desktop/views/components/timeline.core.vue b/src/client/app/desktop/views/components/timeline.core.vue index 254a5b9d63..3c7e87aea1 100644 --- a/src/client/app/desktop/views/components/timeline.core.vue +++ b/src/client/app/desktop/views/components/timeline.core.vue @@ -120,12 +120,14 @@ export default Vue.extend({ this.moreFetching = true; - (this as any).api(this.endpoint, { + const promise = (this as any).api(this.endpoint, { limit: fetchLimit + 1, untilId: (this.$refs.timeline as any).tail().id, includeMyRenotes: (this as any).clientSettings.showMyRenotes, includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes - }).then(notes => { + }); + + promise.then(notes => { if (notes.length == fetchLimit + 1) { notes.pop(); } else { @@ -134,6 +136,8 @@ export default Vue.extend({ notes.forEach(n => (this.$refs.timeline as any).append(n)); this.moreFetching = false; }); + + return promise; }, onNote(note) { diff --git a/src/client/app/desktop/views/components/user-list-timeline.vue b/src/client/app/desktop/views/components/user-list-timeline.vue index 59d6abbbc1..4f14da70fe 100644 --- a/src/client/app/desktop/views/components/user-list-timeline.vue +++ b/src/client/app/desktop/views/components/user-list-timeline.vue @@ -62,13 +62,15 @@ export default Vue.extend({ more() { this.moreFetching = true; - (this as any).api('notes/user-list-timeline', { + const promise = (this as any).api('notes/user-list-timeline', { listId: this.list.id, limit: fetchLimit + 1, untilId: (this.$refs.timeline as any).tail().id, includeMyRenotes: (this as any).clientSettings.showMyRenotes, includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes - }).then(notes => { + }); + + promise.then(notes => { if (notes.length == fetchLimit + 1) { notes.pop(); } else { @@ -77,6 +79,8 @@ export default Vue.extend({ notes.forEach(n => (this.$refs.timeline as any).append(n)); this.moreFetching = false; }); + + return promise; }, onNote(note) { // Prepend a note diff --git a/src/client/app/desktop/views/pages/user/user.timeline.vue b/src/client/app/desktop/views/pages/user/user.timeline.vue index 576a285104..812b5b4229 100644 --- a/src/client/app/desktop/views/pages/user/user.timeline.vue +++ b/src/client/app/desktop/views/pages/user/user.timeline.vue @@ -21,6 +21,7 @@ const fetchLimit = 10; export default Vue.extend({ props: ['user'], + data() { return { fetching: true, @@ -31,19 +32,23 @@ export default Vue.extend({ date: null }; }, + watch: { mode() { this.fetch(); } }, + mounted() { document.addEventListener('keydown', this.onDocumentKeydown); this.fetch(() => this.$emit('loaded')); }, + beforeDestroy() { document.removeEventListener('keydown', this.onDocumentKeydown); }, + methods: { onDocumentKeydown(e) { if (e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA') { @@ -52,6 +57,7 @@ export default Vue.extend({ } } }, + fetch(cb?) { this.fetching = true; (this.$refs.timeline as any).init(() => new Promise((res, rej) => { @@ -72,15 +78,19 @@ export default Vue.extend({ }, rej); })); }, + more() { this.moreFetching = true; - (this as any).api('users/notes', { + + const promise = (this as any).api('users/notes', { userId: this.user.id, limit: fetchLimit + 1, includeReplies: this.mode == 'with-replies', withMedia: this.mode == 'with-media', untilId: (this.$refs.timeline as any).tail().id - }).then(notes => { + }); + + promise.then(notes => { if (notes.length == fetchLimit + 1) { notes.pop(); } else { @@ -89,7 +99,10 @@ export default Vue.extend({ notes.forEach(n => (this.$refs.timeline as any).append(n)); this.moreFetching = false; }); + + return promise; }, + warp(date) { this.date = date; this.fetch(); diff --git a/src/client/app/mobile/views/components/user-list-timeline.vue b/src/client/app/mobile/views/components/user-list-timeline.vue index c0ba995b68..629151302c 100644 --- a/src/client/app/mobile/views/components/user-list-timeline.vue +++ b/src/client/app/mobile/views/components/user-list-timeline.vue @@ -77,13 +77,15 @@ export default Vue.extend({ this.moreFetching = true; - (this as any).api('notes/user-list-timeline', { + const promise = (this as any).api('notes/user-list-timeline', { listId: this.list.id, limit: fetchLimit + 1, untilId: (this.$refs.timeline as any).tail().id, includeMyRenotes: (this as any).clientSettings.showMyRenotes, includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes - }).then(notes => { + }); + + promise.then(notes => { if (notes.length == fetchLimit + 1) { notes.pop(); } else { @@ -92,6 +94,8 @@ export default Vue.extend({ notes.forEach(n => (this.$refs.timeline as any).append(n)); this.moreFetching = false; }); + + return promise; }, onNote(note) { diff --git a/src/client/app/mobile/views/components/user-timeline.vue b/src/client/app/mobile/views/components/user-timeline.vue index aca6f783b8..6be675c0a7 100644 --- a/src/client/app/mobile/views/components/user-timeline.vue +++ b/src/client/app/mobile/views/components/user-timeline.vue @@ -59,12 +59,15 @@ export default Vue.extend({ if (!this.canFetchMore) return; this.moreFetching = true; - (this as any).api('users/notes', { + + const promise = (this as any).api('users/notes', { userId: this.user.id, withMedia: this.withMedia, limit: fetchLimit + 1, untilId: (this.$refs.timeline as any).tail().id - }).then(notes => { + }); + + promise.then(notes => { if (notes.length == fetchLimit + 1) { notes.pop(); } else { @@ -73,6 +76,8 @@ export default Vue.extend({ notes.forEach(n => (this.$refs.timeline as any).append(n)); this.moreFetching = false; }); + + return promise; } } }); diff --git a/src/client/app/mobile/views/pages/home.timeline.vue b/src/client/app/mobile/views/pages/home.timeline.vue index 4c1c344db1..9ebce53de7 100644 --- a/src/client/app/mobile/views/pages/home.timeline.vue +++ b/src/client/app/mobile/views/pages/home.timeline.vue @@ -111,12 +111,14 @@ export default Vue.extend({ this.moreFetching = true; - (this as any).api(this.endpoint, { + const promise = (this as any).api(this.endpoint, { limit: fetchLimit + 1, untilId: (this.$refs.timeline as any).tail().id, includeMyRenotes: (this as any).clientSettings.showMyRenotes, includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes - }).then(notes => { + }); + + promise.then(notes => { if (notes.length == fetchLimit + 1) { notes.pop(); } else { @@ -125,6 +127,8 @@ export default Vue.extend({ notes.forEach(n => (this.$refs.timeline as any).append(n)); this.moreFetching = false; }); + + return promise; }, onNote(note) { From 83c819a1309c42599f0c4acdbc61942484dc54bd Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 27 May 2018 00:18:44 +0900 Subject: [PATCH 011/369] #1539 --- .../app/desktop/views/components/timeline.vue | 23 +++++++++++- src/client/app/mobile/views/pages/home.vue | 37 ++++++++++++++----- src/client/app/store.ts | 7 ++++ 3 files changed, 57 insertions(+), 10 deletions(-) diff --git a/src/client/app/desktop/views/components/timeline.vue b/src/client/app/desktop/views/components/timeline.vue index a776e40a24..6a243ca563 100644 --- a/src/client/app/desktop/views/components/timeline.vue +++ b/src/client/app/desktop/views/components/timeline.vue @@ -31,8 +31,29 @@ export default Vue.extend({ }; }, + watch: { + src() { + this.$store.commit('device/setTl', { + src: this.src, + arg: this.list + }); + }, + + list() { + this.$store.commit('device/setTl', { + src: this.src, + arg: this.list + }); + } + }, + created() { - if ((this as any).os.i.followingCount == 0) { + if (this.$store.state.device.tl) { + this.src = this.$store.state.device.tl.src; + if (this.src == 'list') { + this.list = this.$store.state.device.tl.arg; + } + } else if ((this as any).os.i.followingCount == 0) { this.src = 'local'; } }, diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue index 5701ff03d5..8d10d96c82 100644 --- a/src/client/app/mobile/views/pages/home.vue +++ b/src/client/app/mobile/views/pages/home.vue @@ -5,7 +5,7 @@ <span v-if="src == 'home'">%fa:home%%i18n:@home%</span> <span v-if="src == 'local'">%fa:R comments%%i18n:@local%</span> <span v-if="src == 'global'">%fa:globe%%i18n:@global%</span> - <span v-if="src.startsWith('list')">%fa:list%{{ list.title }}</span> + <span v-if="src == 'list'">%fa:list%{{ list.title }}</span> </span> <span style="margin-left:8px"> <template v-if="!showNav">%fa:angle-down%</template> @@ -26,17 +26,17 @@ <span :data-active="src == 'local'" @click="src = 'local'">%fa:R comments% %i18n:@local%</span> <span :data-active="src == 'global'" @click="src = 'global'">%fa:globe% %i18n:@global%</span> <template v-if="lists"> - <span v-for="l in lists" :data-active="src == 'list:' + l.id" @click="src = 'list:' + l.id; list = l" :key="l.id">%fa:list% {{ l.title }}</span> + <span v-for="l in lists" :data-active="src == 'list' && list == l" @click="src = 'list'; list = l" :key="l.id">%fa:list% {{ l.title }}</span> </template> </div> </div> </div> <div class="tl"> - <x-tl v-if="src == 'home'" ref="tl" key="home" src="home" @loaded="onLoaded"/> + <x-tl v-if="src == 'home'" ref="tl" key="home" src="home"/> <x-tl v-if="src == 'local'" ref="tl" key="local" src="local"/> <x-tl v-if="src == 'global'" ref="tl" key="global" src="global"/> - <mk-user-list-timeline v-if="src.startsWith('list:')" ref="tl" :key="list.id" :list="list"/> + <mk-user-list-timeline v-if="src == 'list'" ref="tl" :key="list.id" :list="list"/> </div> </main> </mk-ui> @@ -64,6 +64,20 @@ export default Vue.extend({ watch: { src() { this.showNav = false; + + this.$store.commit('device/setTl', { + src: this.src, + arg: this.list + }); + }, + + list() { + this.showNav = false; + + this.$store.commit('device/setTl', { + src: this.src, + arg: this.list + }); }, showNav(v) { @@ -76,7 +90,12 @@ export default Vue.extend({ }, created() { - if ((this as any).os.i.followingCount == 0) { + if (this.$store.state.device.tl) { + this.src = this.$store.state.device.tl.src; + if (this.src == 'list') { + this.list = this.$store.state.device.tl.arg; + } + } else if ((this as any).os.i.followingCount == 0) { this.src = 'local'; } }, @@ -85,6 +104,10 @@ export default Vue.extend({ document.title = 'Misskey'; Progress.start(); + + (this.$refs.tl as any).$once('loaded', () => { + Progress.done(); + }); }, methods: { @@ -92,10 +115,6 @@ export default Vue.extend({ (this as any).apis.post(); }, - onLoaded() { - Progress.done(); - }, - warp() { } diff --git a/src/client/app/store.ts b/src/client/app/store.ts index e300d31d8d..e787b41464 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -68,6 +68,13 @@ export default (os: MiOS) => new Vuex.Store({ mutations: { set(state, x: { key: string; value: any }) { state[x.key] = x.value; + }, + + setTl(state, x) { + state.tl = { + src: x.src, + arg: x.arg + }; } } }, From e7d1b6ec00e75c29c89bf5cf555b5b50812ee7e6 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 27 May 2018 00:27:46 +0900 Subject: [PATCH 012/369] Fix bug --- .../views/components/timeline.core.vue | 15 --------- src/client/app/desktop/views/pages/home.vue | 33 ------------------- 2 files changed, 48 deletions(-) diff --git a/src/client/app/desktop/views/components/timeline.core.vue b/src/client/app/desktop/views/components/timeline.core.vue index 3c7e87aea1..3fcec86e48 100644 --- a/src/client/app/desktop/views/components/timeline.core.vue +++ b/src/client/app/desktop/views/components/timeline.core.vue @@ -34,7 +34,6 @@ export default Vue.extend({ existMore: false, connection: null, connectionId: null, - unreadCount: 0, date: null }; }, @@ -76,7 +75,6 @@ export default Vue.extend({ } document.addEventListener('keydown', this.onKeydown); - document.addEventListener('visibilitychange', this.onVisibilitychange, false); this.fetch(); }, @@ -90,7 +88,6 @@ export default Vue.extend({ this.stream.dispose(this.connectionId); document.removeEventListener('keydown', this.onKeydown); - document.removeEventListener('visibilitychange', this.onVisibilitychange); }, methods: { @@ -141,11 +138,6 @@ export default Vue.extend({ }, onNote(note) { - if (document.hidden && note.userId !== (this as any).os.i.id) { - this.unreadCount++; - document.title = `(${this.unreadCount}) ${getNoteSummary(note)}`; - } - // Prepend a note (this.$refs.timeline as any).prepend(note); }, @@ -163,13 +155,6 @@ export default Vue.extend({ this.fetch(); }, - onVisibilitychange() { - if (!document.hidden) { - this.unreadCount = 0; - document.title = 'Misskey'; - } - }, - onKeydown(e) { if (e.target.tagName != 'INPUT' && e.target.tagName != 'TEXTAREA') { if (e.which == 84) { // t diff --git a/src/client/app/desktop/views/pages/home.vue b/src/client/app/desktop/views/pages/home.vue index e4caa2022e..60b257edb7 100644 --- a/src/client/app/desktop/views/pages/home.vue +++ b/src/client/app/desktop/views/pages/home.vue @@ -7,7 +7,6 @@ <script lang="ts"> import Vue from 'vue'; import Progress from '../../../common/scripts/loading'; -import getNoteSummary from '../../../../../renderers/get-note-summary'; export default Vue.extend({ props: { @@ -16,46 +15,14 @@ export default Vue.extend({ default: 'timeline' } }, - data() { - return { - connection: null, - connectionId: null, - unreadCount: 0 - }; - }, mounted() { document.title = 'Misskey'; - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); - - this.connection.on('note', this.onStreamNote); - document.addEventListener('visibilitychange', this.onVisibilitychange, false); - Progress.start(); }, - beforeDestroy() { - this.connection.off('note', this.onStreamNote); - (this as any).os.stream.dispose(this.connectionId); - document.removeEventListener('visibilitychange', this.onVisibilitychange); - }, methods: { loaded() { Progress.done(); - }, - - onStreamNote(note) { - if (document.hidden && note.userId != (this as any).os.i.id) { - this.unreadCount++; - document.title = `(${this.unreadCount}) ${getNoteSummary(note)}`; - } - }, - - onVisibilitychange() { - if (!document.hidden) { - this.unreadCount = 0; - document.title = 'Misskey'; - } } } }); From f8abc8193b5fecb5e3ff439a819ba05f8db4b56e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 27 May 2018 00:29:31 +0900 Subject: [PATCH 013/369] 2.18.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 3806074de2..5688484b9c 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.17.0", - "clientVersion": "1.0.5731", + "version": "2.18.0", + "clientVersion": "1.0.5784", "codename": "nighthike", "main": "./built/index.js", "private": true, From 728dd446b3fdb3a9ed46de87a46b3f0eb3ccb05d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 27 May 2018 02:56:54 +0900 Subject: [PATCH 014/369] Refactor --- .../app/desktop/views/components/timeline.vue | 17 +++++++++-------- src/client/app/mobile/views/pages/home.vue | 19 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/client/app/desktop/views/components/timeline.vue b/src/client/app/desktop/views/components/timeline.vue index 6a243ca563..27d329d13f 100644 --- a/src/client/app/desktop/views/components/timeline.vue +++ b/src/client/app/desktop/views/components/timeline.vue @@ -33,17 +33,11 @@ export default Vue.extend({ watch: { src() { - this.$store.commit('device/setTl', { - src: this.src, - arg: this.list - }); + this.saveSrc(); }, list() { - this.$store.commit('device/setTl', { - src: this.src, - arg: this.list - }); + this.saveSrc(); } }, @@ -65,6 +59,13 @@ export default Vue.extend({ }, methods: { + saveSrc() { + this.$store.commit('device/setTl', { + src: this.src, + arg: this.list + }); + }, + warp(date) { (this.$refs.tl as any).warp(date); }, diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue index 8d10d96c82..33579185e1 100644 --- a/src/client/app/mobile/views/pages/home.vue +++ b/src/client/app/mobile/views/pages/home.vue @@ -64,20 +64,12 @@ export default Vue.extend({ watch: { src() { this.showNav = false; - - this.$store.commit('device/setTl', { - src: this.src, - arg: this.list - }); + this.saveSrc(); }, list() { this.showNav = false; - - this.$store.commit('device/setTl', { - src: this.src, - arg: this.list - }); + this.saveSrc(); }, showNav(v) { @@ -115,6 +107,13 @@ export default Vue.extend({ (this as any).apis.post(); }, + saveSrc() { + this.$store.commit('device/setTl', { + src: this.src, + arg: this.list + }); + }, + warp() { } From 20bb851c4e4be3e975a41a66b108170b3318ef37 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 27 May 2018 03:01:08 +0900 Subject: [PATCH 015/369] Fix bug --- src/client/app/desktop/views/components/post-form.vue | 11 ++++++++--- src/client/app/mobile/views/components/post-form.vue | 11 ++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index 0e0848524a..39bec6cf0c 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -116,9 +116,14 @@ export default Vue.extend({ ast.filter(t => t.type == 'mention').forEach(x => { const mention = x.host ? `@${x.username}@${x.host}` : `@${x.username}`; - if (this.text.indexOf(`${mention} `) == -1) { - this.text += `${mention} `; - } + + // 自分は除外 + if (this.os.i.username == x.username && x.host == null) return; + + // 重複は除外 + if (this.text.indexOf(`${mention} `) != -1) return; + + this.text += `${mention} `; }); } diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index 55347b7e53..264eb08448 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -84,9 +84,14 @@ export default Vue.extend({ ast.filter(t => t.type == 'mention').forEach(x => { const mention = x.host ? `@${x.username}@${x.host}` : `@${x.username}`; - if (this.text.indexOf(`${mention} `) == -1) { - this.text += `${mention} `; - } + + // 自分は除外 + if (this.os.i.username == x.username && x.host == null) return; + + // 重複は除外 + if (this.text.indexOf(`${mention} `) != -1) return; + + this.text += `${mention} `; }); } From 7cdb790f4e2f8860c0d88be126e115ef2f563cb5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 27 May 2018 04:34:32 +0900 Subject: [PATCH 016/369] Update favicon --- assets/favicon.ico | Bin 360414 -> 270398 bytes assets/favicon/128.png | Bin 2325 -> 0 bytes assets/favicon/128.svg | 161 ------------------------- assets/favicon/16.png | Bin 518 -> 0 bytes assets/favicon/256.png | Bin 4824 -> 0 bytes assets/favicon/256.svg | 161 ------------------------- assets/favicon/32.png | Bin 761 -> 0 bytes assets/favicon/32.svg | 152 ----------------------- assets/favicon/64.png | Bin 1258 -> 0 bytes assets/favicon/64.svg | 152 ----------------------- assets/favicon/favicon.png | Bin 0 -> 6972 bytes assets/favicon/{16.svg => favicon.svg} | 8 +- 12 files changed, 4 insertions(+), 630 deletions(-) delete mode 100644 assets/favicon/128.png delete mode 100644 assets/favicon/128.svg delete mode 100644 assets/favicon/16.png delete mode 100644 assets/favicon/256.png delete mode 100644 assets/favicon/256.svg delete mode 100644 assets/favicon/32.png delete mode 100644 assets/favicon/32.svg delete mode 100644 assets/favicon/64.png delete mode 100644 assets/favicon/64.svg create mode 100644 assets/favicon/favicon.png rename assets/favicon/{16.svg => favicon.svg} (98%) diff --git a/assets/favicon.ico b/assets/favicon.ico index d63c68b016517e26f94913d9460272f815855917..8e2b3ff4ca221e3c4e5f2debdcba4b6fad4809ec 100644 GIT binary patch literal 270398 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 literal 360414 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 AWB>pF diff --git a/assets/favicon/128.png b/assets/favicon/128.png deleted file mode 100644 index 1ccaaeee1c6f460fd041e911dc0083b132695014..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2325 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 diff --git a/assets/favicon/128.svg b/assets/favicon/128.svg deleted file mode 100644 index 34888557b9..0000000000 --- a/assets/favicon/128.svg +++ /dev/null @@ -1,161 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="896" - height="896" - viewBox="0 0 237.06667 237.06667" - version="1.1" - id="svg8" - inkscape:version="0.92.1 r15371" - sodipodi:docname="128.svg" - inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\128.png" - inkscape:export-xdpi="13.714286" - inkscape:export-ydpi="13.714286"> - <defs - id="defs2"> - <inkscape:path-effect - effect="simplify" - id="path-effect5115" - is_visible="true" - steps="1" - threshold="0.000408163" - smooth_angles="360" - helper_size="0" - simplify_individual_paths="false" - simplify_just_coalesce="false" - simplifyindividualpaths="false" - simplifyJustCoalesce="false" /> - <inkscape:path-effect - effect="simplify" - id="path-effect5111" - is_visible="true" - steps="1" - threshold="0.000408163" - smooth_angles="360" - helper_size="0" - simplify_individual_paths="false" - simplify_just_coalesce="false" - simplifyindividualpaths="false" - simplifyJustCoalesce="false" /> - <inkscape:path-effect - effect="simplify" - id="path-effect5104" - is_visible="true" - steps="1" - threshold="0.000408163" - smooth_angles="360" - helper_size="0" - simplify_individual_paths="false" - simplify_just_coalesce="false" - simplifyindividualpaths="false" - simplifyJustCoalesce="false" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.7071068" - inkscape:cx="908.16505" - inkscape:cy="468.2779" - inkscape:document-units="px" - inkscape:current-layer="g4502" - showgrid="true" - units="px" - inkscape:snap-bbox="true" - inkscape:bbox-nodes="true" - inkscape:snap-bbox-edge-midpoints="true" - inkscape:snap-smooth-nodes="true" - inkscape:snap-center="true" - inkscape:snap-page="true" - inkscape:window-width="1920" - inkscape:window-height="1017" - inkscape:window-x="-8" - inkscape:window-y="1072" - inkscape:window-maximized="1" - inkscape:snap-object-midpoints="true" - inkscape:snap-midpoints="true" - inkscape:object-paths="true" - fit-margin-top="0" - fit-margin-left="0" - fit-margin-right="0" - fit-margin-bottom="0" - objecttolerance="1" - guidetolerance="1" - inkscape:snap-nodes="true" - inkscape:snap-others="false" - inkscape:bbox-paths="true" - inkscape:snap-bbox-midpoints="true"> - <inkscape:grid - type="xygrid" - id="grid4504" - spacingx="4.2333334" - spacingy="4.2333334" - empcolor="#ff3fff" - empopacity="0.25098039" - empspacing="4" /> - </sodipodi:namedview> - <metadata - id="metadata5"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="レイヤー 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-30.809093,-10.18601)"> - <g - id="g4502" - transform="matrix(1.096096,0,0,1.096096,47.839369,-94.823577)" - inkscape:export-xdpi="6" - inkscape:export-ydpi="6"> - <rect - style="opacity:1;fill:#2fa1bb;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.96554804;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.97647059" - id="rect4506" - width="216.28276" - height="216.28278" - x="-15.537212" - y="95.803268" /> - <g - style="fill:#ffffff;fill-opacity:1" - transform="translate(-1.3333333e-6,-1.3439941e-6)" - id="g5125"> - <g - transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)" - id="text4489" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - aria-label="Mi"> - <path - sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz" - inkscape:connector-curvature="0" - id="path5210" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#ffffff;fill-opacity:1;stroke-width:0.28950602px" - d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" /> - <path - inkscape:connector-curvature="0" - id="path5212" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#ffffff;fill-opacity:1;stroke-width:0.28950602px" - d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" /> - </g> - </g> - </g> - </g> -</svg> diff --git a/assets/favicon/16.png b/assets/favicon/16.png deleted file mode 100644 index a1d3e1be72e0985aa0f1f62750d88909ca16cf0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 518 zcmV+h0{Q)kP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW zd<bNS00009a7bBm0001X0001X0Zw}+2mk;88FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10fR|IK~y-6#gIEoTu~H-zjf{%%s}t~CMbji!qg+87CwSlXc_|w zA)pW&!6xW0NMWHrzy}UYA<=}`*(p8(f{FxED1jh0mbO9?8Rg!&JH<RQ>foaYS>0x> z^X;_{{BJ3_xc*qUQ8UXRoBBTV@~kw_^m(f`41zI97nvYFeKg$hEBRq#K%&`mQA!O9 zn>#>94#zhm>MB4Q=T{#^UThCY<ZPBq%wg;R7#upFt+>u;k$E2(A9soA)r!cAEf*f= zY<nTBvREIg9N;crW&I7$+fxs#{7=PZe=l|i$9rpt3B-z%4f<t&#uzbF)@rKn^+G#+ z1|%X}U3tI_3gf4*Fy7|Jl)Euqww!88rkZ;LuIeh_r^I`}fUMBFy8yB!{W1qb-IFe~ zCoUV*S3mXAd00VNnU&7?2D^ez0Hkez{o$UILLj-Y`Bl)G^VwEpM<(U>ap=cl{_8LZ z#thCc!uZU!j*9xgjRI%k1Aq3%o37u<#V-SjXqHIdcH+O+A9XE%Lhb{CA^-pY07*qo IM6N<$f(mcgxBvhE diff --git a/assets/favicon/256.png b/assets/favicon/256.png deleted file mode 100644 index b3c4be42af8a52592ca2a7ab8fa81988fd866dfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4824 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 diff --git a/assets/favicon/256.svg b/assets/favicon/256.svg deleted file mode 100644 index 5ecee9e0be..0000000000 --- a/assets/favicon/256.svg +++ /dev/null @@ -1,161 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="896" - height="896" - viewBox="0 0 237.06667 237.06667" - version="1.1" - id="svg8" - inkscape:version="0.92.1 r15371" - sodipodi:docname="256.svg" - inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\256.png" - inkscape:export-xdpi="27.428572" - inkscape:export-ydpi="27.428572"> - <defs - id="defs2"> - <inkscape:path-effect - effect="simplify" - id="path-effect5115" - is_visible="true" - steps="1" - threshold="0.000408163" - smooth_angles="360" - helper_size="0" - simplify_individual_paths="false" - simplify_just_coalesce="false" - simplifyindividualpaths="false" - simplifyJustCoalesce="false" /> - <inkscape:path-effect - effect="simplify" - id="path-effect5111" - is_visible="true" - steps="1" - threshold="0.000408163" - smooth_angles="360" - helper_size="0" - simplify_individual_paths="false" - simplify_just_coalesce="false" - simplifyindividualpaths="false" - simplifyJustCoalesce="false" /> - <inkscape:path-effect - effect="simplify" - id="path-effect5104" - is_visible="true" - steps="1" - threshold="0.000408163" - smooth_angles="360" - helper_size="0" - simplify_individual_paths="false" - simplify_just_coalesce="false" - simplifyindividualpaths="false" - simplifyJustCoalesce="false" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.7071068" - inkscape:cx="908.16505" - inkscape:cy="468.2779" - inkscape:document-units="px" - inkscape:current-layer="g4502" - showgrid="true" - units="px" - inkscape:snap-bbox="true" - inkscape:bbox-nodes="true" - inkscape:snap-bbox-edge-midpoints="true" - inkscape:snap-smooth-nodes="true" - inkscape:snap-center="true" - inkscape:snap-page="true" - inkscape:window-width="1920" - inkscape:window-height="1017" - inkscape:window-x="-8" - inkscape:window-y="1072" - inkscape:window-maximized="1" - inkscape:snap-object-midpoints="true" - inkscape:snap-midpoints="true" - inkscape:object-paths="true" - fit-margin-top="0" - fit-margin-left="0" - fit-margin-right="0" - fit-margin-bottom="0" - objecttolerance="1" - guidetolerance="1" - inkscape:snap-nodes="true" - inkscape:snap-others="false" - inkscape:bbox-paths="true" - inkscape:snap-bbox-midpoints="true"> - <inkscape:grid - type="xygrid" - id="grid4504" - spacingx="4.2333334" - spacingy="4.2333334" - empcolor="#ff3fff" - empopacity="0.25098039" - empspacing="4" /> - </sodipodi:namedview> - <metadata - id="metadata5"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="レイヤー 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-30.809093,-10.18601)"> - <g - id="g4502" - transform="matrix(1.096096,0,0,1.096096,47.839369,-94.823577)" - inkscape:export-xdpi="6" - inkscape:export-ydpi="6"> - <rect - style="opacity:1;fill:#2fa1bb;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.96554804;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.97647059" - id="rect4506" - width="216.28276" - height="216.28278" - x="-15.537212" - y="95.803268" /> - <g - style="fill:#ffffff;fill-opacity:1" - transform="translate(-1.3333333e-6,-1.3439941e-6)" - id="g5125"> - <g - transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)" - id="text4489" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - aria-label="Mi"> - <path - sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz" - inkscape:connector-curvature="0" - id="path5210" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#ffffff;fill-opacity:1;stroke-width:0.28950602px" - d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" /> - <path - inkscape:connector-curvature="0" - id="path5212" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#ffffff;fill-opacity:1;stroke-width:0.28950602px" - d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" /> - </g> - </g> - </g> - </g> -</svg> diff --git a/assets/favicon/32.png b/assets/favicon/32.png deleted file mode 100644 index f0466cce9127f3a324421f36aa48dddc9cf60be2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 761 zcmV<V0tWqwP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW zd<bNS00009a7bBm0002J0002J0UcV#`Tzg`8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10(MD6K~z|U?UqYORACgyf9Kxug+Yi&QINF>DsU!r5mAdm%`A!_ zgu*9M(QDIdVGxrNZGs4b6f8&E2|*9E=vu2DL}5-8Q3+Go!&*e;!V$gqw6KYpJ2P2{ zN-)3O`G4oT=l5MM_g+YmBE<|N?!X(cDiCP^%~!aG>Dl$9a?QJ>S5OsS`>n$&&VCR> zp=)F;>)?y}RYL&24r_-hM-<XUB@ldl=Qw`9lTe_bt*1;3?RMpZrm(iRy5xDH;ogp( zcA(02s;hl9C7Zn+);g3Mv3ocWtSvbmDUFzo!kz?oWv;DsEx*v6=brDq*wg49K0bp@ zzP9TNMP+@Qw8+Nj(k(DAZo@c>93$=0vd+%*NZ{+Rwxb+P(hp+JSDcUW3;I5(z;6*& zdxmqG0Selz6{?&k!87!0j3JU~j-3O278MVghTZsY0^`&bv|A6wzydNSYJN~z{{5Si zRwRaOQITzqXJlz_RayUJ1P~|!X8mdZY;$z4<7lg>wwiXviNcmgX_FH88+-w411hHk za)E4Bc8_L!Jv40sDwMf1!<9{`0FXUVHq`<X@_z^@^Z*H7Dzr_D04le|(Q@GB&twF& z$rBFmn-&2vRQu{m`+}jnOKjU&5FX3Q3)Yk#OV7#Gq<b7qx)zNmx={2DP#D*x5(2>Q zcb>vPB)(s<a@ZTNJ|WDB6R-(snhv3{Z)+7DimqcnMus#4Zu3xhEVDcL8Kfm%n9Gmr zOF!VymEbVfk_z-y6<Y{fQF?*T3RfIkiX%T4iO9(}n^dI%=vR0PoDJJq)d0cT(wide r1YQ9HB6@Oh)|WHM50fHAiW%Ss1kc=<`a=~100000NkvXXu0mjfoBc_e diff --git a/assets/favicon/32.svg b/assets/favicon/32.svg deleted file mode 100644 index 4dfcc68606..0000000000 --- a/assets/favicon/32.svg +++ /dev/null @@ -1,152 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="640" - height="640" - viewBox="0 0 169.33333 169.33333" - version="1.1" - id="svg8" - inkscape:version="0.92.1 r15371" - sodipodi:docname="32.svg" - inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\32.png" - inkscape:export-xdpi="4.8000002" - inkscape:export-ydpi="4.8000002"> - <defs - id="defs2"> - <inkscape:path-effect - effect="simplify" - id="path-effect5115" - is_visible="true" - steps="1" - threshold="0.000408163" - smooth_angles="360" - helper_size="0" - simplify_individual_paths="false" - simplify_just_coalesce="false" - simplifyindividualpaths="false" - simplifyJustCoalesce="false" /> - <inkscape:path-effect - effect="simplify" - id="path-effect5111" - is_visible="true" - steps="1" - threshold="0.000408163" - smooth_angles="360" - helper_size="0" - simplify_individual_paths="false" - simplify_just_coalesce="false" - simplifyindividualpaths="false" - simplifyJustCoalesce="false" /> - <inkscape:path-effect - effect="simplify" - id="path-effect5104" - is_visible="true" - steps="1" - threshold="0.000408163" - smooth_angles="360" - helper_size="0" - simplify_individual_paths="false" - simplify_just_coalesce="false" - simplifyindividualpaths="false" - simplifyJustCoalesce="false" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.7071068" - inkscape:cx="16.781901" - inkscape:cy="343.6089" - inkscape:document-units="px" - inkscape:current-layer="g4502" - showgrid="true" - units="px" - inkscape:snap-bbox="true" - inkscape:bbox-nodes="true" - inkscape:snap-bbox-edge-midpoints="false" - inkscape:snap-smooth-nodes="true" - inkscape:snap-center="true" - inkscape:snap-page="true" - inkscape:window-width="1920" - inkscape:window-height="1017" - inkscape:window-x="-8" - inkscape:window-y="1072" - inkscape:window-maximized="1" - inkscape:snap-object-midpoints="true" - inkscape:snap-midpoints="true" - inkscape:object-paths="true" - fit-margin-top="0" - fit-margin-left="0" - fit-margin-right="0" - fit-margin-bottom="0" - objecttolerance="1" - guidetolerance="1" - inkscape:snap-nodes="false" - inkscape:snap-others="false"> - <inkscape:grid - type="xygrid" - id="grid4504" - spacingx="4.2333334" - spacingy="4.2333334" - empcolor="#ff3fff" - empopacity="0.25098039" - empspacing="4" /> - </sodipodi:namedview> - <metadata - id="metadata5"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="レイヤー 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-30.809093,-77.919343)"> - <g - id="g4502" - transform="matrix(1.096096,0,0,1.096096,13.972699,-60.956914)" - inkscape:export-xdpi="6" - inkscape:export-ydpi="6"> - <g - style="fill:#2fa1bb;fill-opacity:1" - transform="translate(-1.7127735e-6,-1.5982974e-6)" - id="g5125"> - <g - transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)" - id="text4489" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#2fa1bb;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - aria-label="Mi"> - <path - sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz" - inkscape:connector-curvature="0" - id="path5210" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#2fa1bb;fill-opacity:1;stroke-width:0.28950602px" - d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" /> - <path - inkscape:connector-curvature="0" - id="path5212" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#2fa1bb;fill-opacity:1;stroke-width:0.28950602px" - d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" /> - </g> - </g> - </g> - </g> -</svg> diff --git a/assets/favicon/64.png b/assets/favicon/64.png deleted file mode 100644 index 9710052ae73ca84acb5e6436a36291073961f8ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1258 zcmV<G1Qq*<P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00004b3#c}2nYxW zd<bNS00009a7bBm0003y0003y0UzIQaR2}S8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11ZPP^K~#90?U`?gR8<(pfA5{q9W+x35+W@yGPc#3#Uu-%mUdT+ zsDxY!c2_r{kPyt&0z;OJB5187$VFs!c1>aZpcEMFjBFp=pg)^4TBH`WK_vaNz;Y*N z=DdB_RZwT<o@?IBI=^po&oj^a&NJuSd+xp9a5x+ehr{7;I2;a#!|^{u0)InQ;(eK= zz-p9Qpa6U*s#~%vnujj6kwh}HKs{XtdN)W7a7=`^vTcpK5z&kEsq{lCtU<XQ<PSs# z)QfID+}iM6kh*~aSk~Vk`Eqo6pTc8hh81L8Zh7ODAf5p6RC+b=I^dOQaqsk5k(T!x z8j5F+Bzn^uRe7<D)sGS3-cQ?`zOb!breI}`=cjF~@Z$jlv@4NHuMgsx=pA?p*jl+4 zU3&7{V&^%1GP6LH%@ypfFDbiFwf<wR1DLbp;1rOxemaF$;;DgF8_#(?0}raoRzIBx zYi>(rt^?4BX{GwiO(c5Kahv)OAb?5Hd>zVE3#ou?uTN#}swS%6nW+_#KFb~^*Ql8f zfXa=2Vk6A5@C3`^0F+d3u+;)Fqq?{L?E^QJ8?4)vnPE!0AGp@mP(5!ZfCxYMX(Jxr z+xl7u;CUM8e1R~-6wLnl-RbjY&CSWdm{-ufK-q9A)@Q7~s_gNR9=|2_+aY`3FcE4? zG2Okazdr(is!a7t+XbpFk80$WHx7b!R~SAmp4YLbrKM!+7j6K6B1?{+p4L4#nVuW( z&1?m=Izd(=*WR=W(Nzj(FL$E?@2HqNvu*c%5X39`cbl<7WThvpyo`RDgKfaJIXezc zxuzJ)4?lTF;Zm&rnE*l{(UW-s(GAMz>|%7ZG%uAN^o*|0b~I;$_=LU$!XTa+=u**c zh1uhWA_9%-$&laW_d>3^0OGyrMO8LrlMLE(?xbtMRTlt89`#Y&`c-~fy{+9<7l4ZT z?*x&{zZ3koAS%8+3;G{k0+$&Vz?E*`O5*|u!&KlfU@WAcg;75Up#)&WJdEguY8nxq zFBVGogi${Tp#<QSjON;!wt#E`iWdwkDqY#HhhCl#sj-<Qp%UKB(AXW@=0x(nJ|odb z#M7A|CrrugJJPZEC;-X9(8}9l9e`0!g^M1~mqjK{JSWU{EExe_EvJi|DQYohTVL&p z2gH5}Na>`dQqN5Aez6e_pBOsD*ozfkJkR@i+}`(TkLpFsuClMK@Xx~JkAYENq43G) zEe*e0nRa#>;Gl)FAcZqS016|%Ef~JBs!xCbj;&mD3V6durh<0bdX6<9FM-e665c%Y z`29ZtC}wAMz2vehnsWB_0}#zm--NQS!mtWFn{992AH?&}^2Q9xGgR6)sJvT@{rcS5 zk4IK49#)l&73@wLqiyBhC061RUyi0*QRzUbMYI6&5yES^_9mO@T$Xvs^g{7uE$Bj& zi7FfwC6yZ)N{ug-^N6Q14**Yt)+yu#4u~nfFn-c?I2;a#!{Kl^91e%W;c!&qFH<Op UgYrXL(f|Me07*qoM6N<$f+1o}2><{9 diff --git a/assets/favicon/64.svg b/assets/favicon/64.svg deleted file mode 100644 index e2378791a7..0000000000 --- a/assets/favicon/64.svg +++ /dev/null @@ -1,152 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="768" - height="768" - viewBox="0 0 203.2 203.2" - version="1.1" - id="svg8" - inkscape:version="0.92.1 r15371" - sodipodi:docname="64.svg" - inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\64.png" - inkscape:export-xdpi="8" - inkscape:export-ydpi="8"> - <defs - id="defs2"> - <inkscape:path-effect - effect="simplify" - id="path-effect5115" - is_visible="true" - steps="1" - threshold="0.000408163" - smooth_angles="360" - helper_size="0" - simplify_individual_paths="false" - simplify_just_coalesce="false" - simplifyindividualpaths="false" - simplifyJustCoalesce="false" /> - <inkscape:path-effect - effect="simplify" - id="path-effect5111" - is_visible="true" - steps="1" - threshold="0.000408163" - smooth_angles="360" - helper_size="0" - simplify_individual_paths="false" - simplify_just_coalesce="false" - simplifyindividualpaths="false" - simplifyJustCoalesce="false" /> - <inkscape:path-effect - effect="simplify" - id="path-effect5104" - is_visible="true" - steps="1" - threshold="0.000408163" - smooth_angles="360" - helper_size="0" - simplify_individual_paths="false" - simplify_just_coalesce="false" - simplifyindividualpaths="false" - simplifyJustCoalesce="false" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.7071068" - inkscape:cx="16.781901" - inkscape:cy="343.6089" - inkscape:document-units="px" - inkscape:current-layer="g5125" - showgrid="true" - units="px" - inkscape:snap-bbox="true" - inkscape:bbox-nodes="true" - inkscape:snap-bbox-edge-midpoints="false" - inkscape:snap-smooth-nodes="true" - inkscape:snap-center="true" - inkscape:snap-page="true" - inkscape:window-width="1920" - inkscape:window-height="1017" - inkscape:window-x="-8" - inkscape:window-y="1072" - inkscape:window-maximized="1" - inkscape:snap-object-midpoints="true" - inkscape:snap-midpoints="true" - inkscape:object-paths="true" - fit-margin-top="0" - fit-margin-left="0" - fit-margin-right="0" - fit-margin-bottom="0" - objecttolerance="1" - guidetolerance="1" - inkscape:snap-nodes="false" - inkscape:snap-others="false"> - <inkscape:grid - type="xygrid" - id="grid4504" - spacingx="4.2333334" - spacingy="4.2333334" - empcolor="#ff3fff" - empopacity="0.25098039" - empspacing="4" /> - </sodipodi:namedview> - <metadata - id="metadata5"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="レイヤー 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-30.809093,-44.052677)"> - <g - id="g4502" - transform="matrix(1.096096,0,0,1.096096,30.906034,-77.890245)" - inkscape:export-xdpi="6" - inkscape:export-ydpi="6"> - <g - style="fill:#2fa1bb;fill-opacity:0.94117647" - transform="translate(-1.3333333e-6,-1.3439941e-6)" - id="g5125"> - <g - transform="matrix(0.91391326,0,0,0.91391326,7.9719903,17.595761)" - id="text4489" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#2fa1bb;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - aria-label="Mi"> - <path - sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz" - inkscape:connector-curvature="0" - id="path5210" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#2fa1bb;fill-opacity:1;stroke-width:0.28950602px" - d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" /> - <path - inkscape:connector-curvature="0" - id="path5212" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#2fa1bb;fill-opacity:1;stroke-width:0.28950602px" - d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" /> - </g> - </g> - </g> - </g> -</svg> diff --git a/assets/favicon/favicon.png b/assets/favicon/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..2efa2cad61442fc9b0ff1075b0d84cfb6ad531c0 GIT binary patch literal 6972 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 literal 0 HcmV?d00001 diff --git a/assets/favicon/16.svg b/assets/favicon/favicon.svg similarity index 98% rename from assets/favicon/16.svg rename to assets/favicon/favicon.svg index 03aa8bc6bd..9532def728 100644 --- a/assets/favicon/16.svg +++ b/assets/favicon/favicon.svg @@ -15,7 +15,7 @@ version="1.1" id="svg8" inkscape:version="0.92.1 r15371" - sodipodi:docname="16.svg" + sodipodi:docname="favicon.svg" inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\16.png" inkscape:export-xdpi="3" inkscape:export-ydpi="3"> @@ -66,7 +66,7 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="1.4142136" - inkscape:cx="110.21885" + inkscape:cx="15.466544" inkscape:cy="235.92965" inkscape:document-units="px" inkscape:current-layer="g4502" @@ -79,7 +79,7 @@ inkscape:snap-center="true" inkscape:snap-page="true" inkscape:window-width="1920" - inkscape:window-height="1017" + inkscape:window-height="1027" inkscape:window-x="-8" inkscape:window-y="1072" inkscape:window-maximized="1" @@ -111,7 +111,7 @@ <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> + <dc:title></dc:title> </cc:Work> </rdf:RDF> </metadata> From d5f92eed8c4b1a42e0b05f9da2fa86dbc17922f4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 27 May 2018 13:49:09 +0900 Subject: [PATCH 017/369] Refactor --- src/client/app/auth/views/index.vue | 6 +- .../app/common/scripts/streaming/home.ts | 4 +- .../app/common/views/components/avatar.vue | 2 +- .../components/messaging-room.message.vue | 4 +- .../views/components/messaging-room.vue | 8 +- .../app/common/views/components/messaging.vue | 2 +- .../app/common/views/components/note-menu.vue | 2 +- .../common/views/components/othello.game.vue | 10 +-- .../views/components/othello.gameroom.vue | 2 +- .../common/views/components/othello.room.vue | 16 ++-- .../views/components/twitter-setting.vue | 14 ++-- .../app/common/views/components/uploader.vue | 2 +- .../app/desktop/api/choose-drive-file.ts | 17 ++-- .../app/desktop/api/choose-drive-folder.ts | 15 ++-- src/client/app/desktop/api/update-avatar.ts | 32 ++++---- src/client/app/desktop/api/update-banner.ts | 32 ++++---- src/client/app/desktop/script.ts | 5 +- .../desktop/views/components/drive.file.vue | 4 +- .../app/desktop/views/components/home.vue | 4 +- .../views/components/note-detail.sub.vue | 2 +- .../desktop/views/components/note-detail.vue | 4 +- .../desktop/views/components/notes.note.vue | 16 ++-- .../app/desktop/views/components/notes.vue | 12 +-- .../desktop/views/components/post-form.vue | 2 +- .../desktop/views/components/settings.2fa.vue | 8 +- .../desktop/views/components/settings.api.vue | 2 +- .../views/components/settings.profile.vue | 18 ++--- .../app/desktop/views/components/settings.vue | 20 ++--- .../views/components/sub-note-content.vue | 2 +- .../views/components/timeline.core.vue | 10 +-- .../app/desktop/views/components/timeline.vue | 2 +- .../views/components/ui.header.account.vue | 6 +- .../views/components/ui.header.nav.vue | 6 +- .../components/ui.header.notifications.vue | 4 +- .../desktop/views/components/ui.header.vue | 16 ++-- .../app/desktop/views/components/ui.vue | 2 +- .../views/components/user-list-timeline.vue | 10 +-- .../desktop/views/components/user-preview.vue | 2 +- .../desktop/views/components/users-list.vue | 2 +- .../views/components/widget-container.vue | 6 +- .../app/desktop/views/components/window.vue | 4 +- src/client/app/desktop/views/pages/index.vue | 2 +- .../desktop/views/pages/user/user.header.vue | 2 +- .../desktop/views/pages/user/user.home.vue | 2 +- .../desktop/views/pages/user/user.profile.vue | 2 +- .../app/desktop/views/widgets/activity.vue | 2 +- .../app/desktop/views/widgets/profile.vue | 8 +- src/client/app/init.ts | 3 +- src/client/app/mios.ts | 79 +++++-------------- .../mobile/views/components/note-detail.vue | 4 +- .../app/mobile/views/components/note.vue | 16 ++-- .../app/mobile/views/components/notes.vue | 12 +-- .../app/mobile/views/components/post-form.vue | 4 +- .../views/components/sub-note-content.vue | 2 +- .../app/mobile/views/components/ui.header.vue | 12 +-- .../app/mobile/views/components/ui.nav.vue | 10 +-- src/client/app/mobile/views/components/ui.vue | 6 +- .../views/components/user-list-timeline.vue | 10 +-- .../mobile/views/components/users-list.vue | 2 +- .../app/mobile/views/pages/home.timeline.vue | 10 +-- src/client/app/mobile/views/pages/home.vue | 2 +- src/client/app/mobile/views/pages/index.vue | 2 +- .../app/mobile/views/pages/settings.vue | 24 +++--- .../views/pages/settings/settings.profile.vue | 30 +++---- src/client/app/mobile/views/pages/user.vue | 2 +- .../app/mobile/views/pages/user/home.vue | 2 +- .../app/mobile/views/widgets/activity.vue | 2 +- .../app/mobile/views/widgets/profile.vue | 6 +- src/client/app/store.ts | 49 +++++++++--- 69 files changed, 314 insertions(+), 330 deletions(-) diff --git a/src/client/app/auth/views/index.vue b/src/client/app/auth/views/index.vue index 0fcd9bfe53..e53bbd026f 100644 --- a/src/client/app/auth/views/index.vue +++ b/src/client/app/auth/views/index.vue @@ -1,6 +1,6 @@ <template> <div class="index"> - <main v-if="os.isSignedIn"> + <main v-if="$store.getters.isSignedIn"> <p class="fetching" v-if="fetching">読み込み中<mk-ellipsis/></p> <x-form ref="form" @@ -22,7 +22,7 @@ <p>セッションが存在しません。</p> </div> </main> - <main class="signin" v-if="!os.isSignedIn"> + <main class="signin" v-if="!$store.getters.isSignedIn"> <h1>サインインしてください</h1> <mk-signin/> </main> @@ -51,7 +51,7 @@ export default Vue.extend({ } }, mounted() { - if (!this.$root.$data.os.isSignedIn) return; + if (!this.$root.$data.$store.getters.isSignedIn) return; // Fetch session (this as any).api('auth/session/show', { diff --git a/src/client/app/common/scripts/streaming/home.ts b/src/client/app/common/scripts/streaming/home.ts index 44d07e331a..2715b9e0e9 100644 --- a/src/client/app/common/scripts/streaming/home.ts +++ b/src/client/app/common/scripts/streaming/home.ts @@ -24,10 +24,8 @@ export class HomeStream extends Stream { if (os.debug) { console.log('I updated:', i); } - merge(me, i); - // キャッシュ更新 - os.bakeMe(); + os.store.dispatch('mergeMe', i); }); this.on('clientSettingUpdated', x => { diff --git a/src/client/app/common/views/components/avatar.vue b/src/client/app/common/views/components/avatar.vue index 3e1b17635f..a65b62882f 100644 --- a/src/client/app/common/views/components/avatar.vue +++ b/src/client/app/common/views/components/avatar.vue @@ -32,7 +32,7 @@ export default Vue.extend({ ? `rgb(${ this.user.avatarColor.join(',') })` : null, backgroundImage: this.lightmode ? null : `url(${ this.user.avatarUrl }?thumbnail)`, - borderRadius: (this as any).clientSettings.circleIcons ? '100%' : null + borderRadius: this.$store.state.settings.circleIcons ? '100%' : null }; } } diff --git a/src/client/app/common/views/components/messaging-room.message.vue b/src/client/app/common/views/components/messaging-room.message.vue index ef39199dc4..a77b5f3658 100644 --- a/src/client/app/common/views/components/messaging-room.message.vue +++ b/src/client/app/common/views/components/messaging-room.message.vue @@ -8,7 +8,7 @@ <img src="/assets/desktop/messaging/delete.png" alt="Delete"/> </button> <div class="content" v-if="!message.isDeleted"> - <mk-note-html class="text" v-if="message.text" ref="text" :text="message.text" :i="os.i"/> + <mk-note-html class="text" v-if="message.text" ref="text" :text="message.text" :i="$store.state.i"/> <div class="file" v-if="message.file"> <a :href="message.file.url" target="_blank" :title="message.file.name"> <img v-if="message.file.type.split('/')[0] == 'image'" :src="message.file.url" :alt="message.file.name"/> @@ -42,7 +42,7 @@ export default Vue.extend({ }, computed: { isMe(): boolean { - return this.message.userId == (this as any).os.i.id; + return this.message.userId == this.$store.state.i.id; }, urls(): string[] { if (this.message.text) { diff --git a/src/client/app/common/views/components/messaging-room.vue b/src/client/app/common/views/components/messaging-room.vue index 79756b22eb..b2831d6928 100644 --- a/src/client/app/common/views/components/messaging-room.vue +++ b/src/client/app/common/views/components/messaging-room.vue @@ -72,7 +72,7 @@ export default Vue.extend({ }, mounted() { - this.connection = new MessagingStream((this as any).os, (this as any).os.i, this.user.id); + this.connection = new MessagingStream((this as any).os, this.$store.state.i, this.user.id); this.connection.on('message', this.onMessage); this.connection.on('read', this.onRead); @@ -164,7 +164,7 @@ export default Vue.extend({ const isBottom = this.isBottom(); this.messages.push(message); - if (message.userId != (this as any).os.i.id && !document.hidden) { + if (message.userId != this.$store.state.i.id && !document.hidden) { this.connection.send({ type: 'read', id: message.id @@ -176,7 +176,7 @@ export default Vue.extend({ this.$nextTick(() => { this.scrollToBottom(); }); - } else if (message.userId != (this as any).os.i.id) { + } else if (message.userId != this.$store.state.i.id) { // Notify this.notifyNewMessage(); } @@ -229,7 +229,7 @@ export default Vue.extend({ onVisibilitychange() { if (document.hidden) return; this.messages.forEach(message => { - if (message.userId !== (this as any).os.i.id && !message.isRead) { + if (message.userId !== this.$store.state.i.id && !message.isRead) { this.connection.send({ type: 'read', id: message.id diff --git a/src/client/app/common/views/components/messaging.vue b/src/client/app/common/views/components/messaging.vue index 11f9c366d4..2ddec29984 100644 --- a/src/client/app/common/views/components/messaging.vue +++ b/src/client/app/common/views/components/messaging.vue @@ -95,7 +95,7 @@ export default Vue.extend({ methods: { getAcct, isMe(message) { - return message.userId == (this as any).os.i.id; + return message.userId == this.$store.state.i.id; }, onMessage(message) { this.messages = this.messages.filter(m => !( diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue index 88dc22aaf4..fb95055049 100644 --- a/src/client/app/common/views/components/note-menu.vue +++ b/src/client/app/common/views/components/note-menu.vue @@ -3,7 +3,7 @@ <div class="backdrop" ref="backdrop" @click="close"></div> <div class="popover" :class="{ compact }" ref="popover"> <button @click="favorite">%i18n:@favorite%</button> - <button v-if="note.userId == os.i.id" @click="pin">%i18n:@pin%</button> + <button v-if="note.userId == $store.state.i.id" @click="pin">%i18n:@pin%</button> <a v-if="note.uri" :href="note.uri" target="_blank">%i18n:@remote%</a> </div> </div> diff --git a/src/client/app/common/views/components/othello.game.vue b/src/client/app/common/views/components/othello.game.vue index ea75558d10..4c63bd18b8 100644 --- a/src/client/app/common/views/components/othello.game.vue +++ b/src/client/app/common/views/components/othello.game.vue @@ -61,13 +61,13 @@ export default Vue.extend({ computed: { iAmPlayer(): boolean { - if (!(this as any).os.isSignedIn) return false; - return this.game.user1Id == (this as any).os.i.id || this.game.user2Id == (this as any).os.i.id; + if (!this.$store.getters.isSignedIn) return false; + return this.game.user1Id == this.$store.state.i.id || this.game.user2Id == this.$store.state.i.id; }, myColor(): Color { if (!this.iAmPlayer) return null; - if (this.game.user1Id == (this as any).os.i.id && this.game.black == 1) return true; - if (this.game.user2Id == (this as any).os.i.id && this.game.black == 2) return true; + if (this.game.user1Id == this.$store.state.i.id && this.game.black == 1) return true; + if (this.game.user2Id == this.$store.state.i.id && this.game.black == 2) return true; return false; }, opColor(): Color { @@ -91,7 +91,7 @@ export default Vue.extend({ }, isMyTurn(): boolean { if (this.turnUser == null) return null; - return this.turnUser.id == (this as any).os.i.id; + return this.turnUser.id == this.$store.state.i.id; } }, diff --git a/src/client/app/common/views/components/othello.gameroom.vue b/src/client/app/common/views/components/othello.gameroom.vue index dba9ccd16d..2dbd04ce49 100644 --- a/src/client/app/common/views/components/othello.gameroom.vue +++ b/src/client/app/common/views/components/othello.gameroom.vue @@ -25,7 +25,7 @@ export default Vue.extend({ }, created() { this.g = this.game; - this.connection = new OthelloGameStream((this as any).os, (this as any).os.i, this.game); + this.connection = new OthelloGameStream((this as any).os, this.$store.state.i, this.game); this.connection.on('started', this.onStarted); }, beforeDestroy() { diff --git a/src/client/app/common/views/components/othello.room.vue b/src/client/app/common/views/components/othello.room.vue index 86368b3cc3..dcf41f2e04 100644 --- a/src/client/app/common/views/components/othello.room.vue +++ b/src/client/app/common/views/components/othello.room.vue @@ -116,13 +116,13 @@ export default Vue.extend({ return categories.filter((item, pos) => categories.indexOf(item) == pos); }, isAccepted(): boolean { - if (this.game.user1Id == (this as any).os.i.id && this.game.user1Accepted) return true; - if (this.game.user2Id == (this as any).os.i.id && this.game.user2Accepted) return true; + if (this.game.user1Id == this.$store.state.i.id && this.game.user1Accepted) return true; + if (this.game.user2Id == this.$store.state.i.id && this.game.user2Accepted) return true; return false; }, isOpAccepted(): boolean { - if (this.game.user1Id != (this as any).os.i.id && this.game.user1Accepted) return true; - if (this.game.user2Id != (this as any).os.i.id && this.game.user2Accepted) return true; + if (this.game.user1Id != this.$store.state.i.id && this.game.user1Accepted) return true; + if (this.game.user2Id != this.$store.state.i.id && this.game.user2Accepted) return true; return false; } }, @@ -133,8 +133,8 @@ export default Vue.extend({ this.connection.on('init-form', this.onInitForm); this.connection.on('message', this.onMessage); - if (this.game.user1Id != (this as any).os.i.id && this.game.settings.form1) this.form = this.game.settings.form1; - if (this.game.user2Id != (this as any).os.i.id && this.game.settings.form2) this.form = this.game.settings.form2; + if (this.game.user1Id != this.$store.state.i.id && this.game.settings.form1) this.form = this.game.settings.form1; + if (this.game.user2Id != this.$store.state.i.id && this.game.settings.form2) this.form = this.game.settings.form2; }, beforeDestroy() { @@ -185,12 +185,12 @@ export default Vue.extend({ }, onInitForm(x) { - if (x.userId == (this as any).os.i.id) return; + if (x.userId == this.$store.state.i.id) return; this.form = x.form; }, onMessage(x) { - if (x.userId == (this as any).os.i.id) return; + if (x.userId == this.$store.state.i.id) return; this.messages.unshift(x.message); }, diff --git a/src/client/app/common/views/components/twitter-setting.vue b/src/client/app/common/views/components/twitter-setting.vue index 9a2a1c3d40..d1cb78c544 100644 --- a/src/client/app/common/views/components/twitter-setting.vue +++ b/src/client/app/common/views/components/twitter-setting.vue @@ -1,13 +1,13 @@ <template> <div class="mk-twitter-setting"> <p>%i18n:@description%<a :href="`${docsUrl}/link-to-twitter`" target="_blank">%i18n:@detail%</a></p> - <p class="account" v-if="os.i.twitter" :title="`Twitter ID: ${os.i.twitter.userId}`">%i18n:@connected-to%: <a :href="`https://twitter.com/${os.i.twitter.screenName}`" target="_blank">@{{ os.i.twitter.screenName }}</a></p> + <p class="account" v-if="$store.state.i.twitter" :title="`Twitter ID: ${$store.state.i.twitter.userId}`">%i18n:@connected-to%: <a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p> <p> - <a :href="`${apiUrl}/connect/twitter`" target="_blank" @click.prevent="connect">{{ os.i.twitter ? '%i18n:@reconnect%' : '%i18n:@connect%' }}</a> - <span v-if="os.i.twitter"> or </span> - <a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="os.i.twitter" @click.prevent="disconnect">%i18n:@disconnect%</a> + <a :href="`${apiUrl}/connect/twitter`" target="_blank" @click.prevent="connect">{{ $store.state.i.twitter ? '%i18n:@reconnect%' : '%i18n:@connect%' }}</a> + <span v-if="$store.state.i.twitter"> or </span> + <a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter" @click.prevent="disconnect">%i18n:@disconnect%</a> </p> - <p class="id" v-if="os.i.twitter">Twitter ID: {{ os.i.twitter.userId }}</p> + <p class="id" v-if="$store.state.i.twitter">Twitter ID: {{ $store.state.i.twitter.userId }}</p> </div> </template> @@ -24,8 +24,8 @@ export default Vue.extend({ }; }, mounted() { - this.$watch('os.i', () => { - if ((this as any).os.i.twitter) { + this.$watch('$store.state.i', () => { + if (this.$store.state.i.twitter) { if (this.form) this.form.close(); } }, { diff --git a/src/client/app/common/views/components/uploader.vue b/src/client/app/common/views/components/uploader.vue index a6caa80f3c..f4797d89f7 100644 --- a/src/client/app/common/views/components/uploader.vue +++ b/src/client/app/common/views/components/uploader.vue @@ -50,7 +50,7 @@ export default Vue.extend({ reader.readAsDataURL(file); const data = new FormData(); - data.append('i', (this as any).os.i.token); + data.append('i', this.$store.state.i.token); data.append('file', file); if (folder) data.append('folderId', folder); diff --git a/src/client/app/desktop/api/choose-drive-file.ts b/src/client/app/desktop/api/choose-drive-file.ts index fbda600e6e..3d0004b741 100644 --- a/src/client/app/desktop/api/choose-drive-file.ts +++ b/src/client/app/desktop/api/choose-drive-file.ts @@ -1,18 +1,17 @@ +import OS from '../../mios'; import { url } from '../../config'; import MkChooseFileFromDriveWindow from '../views/components/choose-file-from-drive-window.vue'; -export default function(opts) { +export default (os: OS) => opts => { return new Promise((res, rej) => { const o = opts || {}; if (document.body.clientWidth > 800) { - const w = new MkChooseFileFromDriveWindow({ - propsData: { - title: o.title, - multiple: o.multiple, - initFolder: o.currentFolder - } - }).$mount(); + const w = os.new(MkChooseFileFromDriveWindow, { + title: o.title, + multiple: o.multiple, + initFolder: o.currentFolder + }); w.$once('selected', file => { res(file); }); @@ -27,4 +26,4 @@ export default function(opts) { 'height=500, width=800'); } }); -} +}; diff --git a/src/client/app/desktop/api/choose-drive-folder.ts b/src/client/app/desktop/api/choose-drive-folder.ts index 9b33a20d9a..68dc7988b5 100644 --- a/src/client/app/desktop/api/choose-drive-folder.ts +++ b/src/client/app/desktop/api/choose-drive-folder.ts @@ -1,17 +1,16 @@ +import OS from '../../mios'; import MkChooseFolderFromDriveWindow from '../views/components/choose-folder-from-drive-window.vue'; -export default function(opts) { +export default (os: OS) => opts => { return new Promise((res, rej) => { const o = opts || {}; - const w = new MkChooseFolderFromDriveWindow({ - propsData: { - title: o.title, - initFolder: o.currentFolder - } - }).$mount(); + const w = os.new(MkChooseFolderFromDriveWindow, { + title: o.title, + initFolder: o.currentFolder + }); w.$once('selected', folder => { res(folder); }); document.body.appendChild(w.$el); }); -} +}; diff --git a/src/client/app/desktop/api/update-avatar.ts b/src/client/app/desktop/api/update-avatar.ts index 8ddaebc072..887367a24e 100644 --- a/src/client/app/desktop/api/update-avatar.ts +++ b/src/client/app/desktop/api/update-avatar.ts @@ -6,17 +6,15 @@ import ProgressDialog from '../views/components/progress-dialog.vue'; export default (os: OS) => (cb, file = null) => { const fileSelected = file => { - const w = new CropWindow({ - propsData: { - image: file, - title: 'アバターとして表示する部分を選択', - aspectRatio: 1 / 1 - } - }).$mount(); + const w = os.new(CropWindow, { + image: file, + title: 'アバターとして表示する部分を選択', + aspectRatio: 1 / 1 + }); w.$once('cropped', blob => { const data = new FormData(); - data.append('i', os.i.token); + data.append('i', os.store.state.i.token); data.append('file', blob, file.name + '.cropped.png'); os.api('drive/folders/find', { @@ -42,11 +40,9 @@ export default (os: OS) => (cb, file = null) => { }; const upload = (data, folder) => { - const dialog = new ProgressDialog({ - propsData: { - title: '新しいアバターをアップロードしています' - } - }).$mount(); + const dialog = os.new(ProgressDialog, { + title: '新しいアバターをアップロードしています' + }); document.body.appendChild(dialog.$el); if (folder) data.append('folderId', folder.id); @@ -70,8 +66,14 @@ export default (os: OS) => (cb, file = null) => { os.api('i/update', { avatarId: file.id }).then(i => { - os.i.avatarId = i.avatarId; - os.i.avatarUrl = i.avatarUrl; + os.store.commit('updateIKeyValue', { + key: 'avatarId', + value: i.avatarId + }); + os.store.commit('updateIKeyValue', { + key: 'avatarUrl', + value: i.avatarUrl + }); os.apis.dialog({ title: '%fa:info-circle%アバターを更新しました', diff --git a/src/client/app/desktop/api/update-banner.ts b/src/client/app/desktop/api/update-banner.ts index 1a5da272bd..4e6dd4e2c7 100644 --- a/src/client/app/desktop/api/update-banner.ts +++ b/src/client/app/desktop/api/update-banner.ts @@ -6,17 +6,15 @@ import ProgressDialog from '../views/components/progress-dialog.vue'; export default (os: OS) => { const cropImage = file => new Promise((resolve, reject) => { - const w = new CropWindow({ - propsData: { - image: file, - title: 'バナーとして表示する部分を選択', - aspectRatio: 16 / 9 - } - }).$mount(); + const w = os.new(CropWindow, { + image: file, + title: 'バナーとして表示する部分を選択', + aspectRatio: 16 / 9 + }); w.$once('cropped', blob => { const data = new FormData(); - data.append('i', os.i.token); + data.append('i', os.store.state.i.token); data.append('file', blob, file.name + '.cropped.png'); os.api('drive/folders/find', { @@ -44,11 +42,9 @@ export default (os: OS) => { }); const upload = (data, folder) => new Promise((resolve, reject) => { - const dialog = new ProgressDialog({ - propsData: { - title: '新しいバナーをアップロードしています' - } - }).$mount(); + const dialog = os.new(ProgressDialog, { + title: '新しいバナーをアップロードしています' + }); document.body.appendChild(dialog.$el); if (folder) data.append('folderId', folder.id); @@ -73,8 +69,14 @@ export default (os: OS) => { return os.api('i/update', { bannerId: file.id }).then(i => { - os.i.bannerId = i.bannerId; - os.i.bannerUrl = i.bannerUrl; + os.store.commit('updateIKeyValue', { + key: 'bannerId', + value: i.bannerId + }); + os.store.commit('updateIKeyValue', { + key: 'bannerUrl', + value: i.bannerUrl + }); os.apis.dialog({ title: '%fa:info-circle%バナーを更新しました', diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts index 2658a86b95..09a9257ea3 100644 --- a/src/client/app/desktop/script.ts +++ b/src/client/app/desktop/script.ts @@ -2,7 +2,6 @@ * Desktop Client */ -import Vue from 'vue'; import VueRouter from 'vue-router'; // Style @@ -68,8 +67,8 @@ init(async (launch) => { // Launch the app const [, os] = launch(router, os => ({ - chooseDriveFolder, - chooseDriveFile, + chooseDriveFolder: chooseDriveFolder(os), + chooseDriveFile: chooseDriveFile(os), dialog, input, post, diff --git a/src/client/app/desktop/views/components/drive.file.vue b/src/client/app/desktop/views/components/drive.file.vue index fb553e1ae7..fe8f57bc5f 100644 --- a/src/client/app/desktop/views/components/drive.file.vue +++ b/src/client/app/desktop/views/components/drive.file.vue @@ -9,10 +9,10 @@ @contextmenu.prevent.stop="onContextmenu" :title="title" > - <div class="label" v-if="os.i.avatarId == file.id"><img src="/assets/label.svg"/> + <div class="label" v-if="$store.state.i.avatarId == file.id"><img src="/assets/label.svg"/> <p>%i18n:@avatar%</p> </div> - <div class="label" v-if="os.i.bannerId == file.id"><img src="/assets/label.svg"/> + <div class="label" v-if="$store.state.i.bannerId == file.id"><img src="/assets/label.svg"/> <p>%i18n:@banner%</p> </div> <div class="thumbnail" ref="thumbnail" :style="`background-color: ${ background }`"> diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index d84c1e404f..9d34575e55 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -51,7 +51,7 @@ <div class="main"> <a @click="hint">カスタマイズのヒント</a> <div> - <mk-post-form v-if="clientSettings.showPostFormOnTopOfTl"/> + <mk-post-form v-if="$store.state.settings.showPostFormOnTopOfTl"/> <mk-timeline ref="tl" @loaded="onTlLoaded"/> </div> </div> @@ -61,7 +61,7 @@ <component v-for="widget in widgets[place]" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" @chosen="warp"/> </div> <div class="main"> - <mk-post-form v-if="clientSettings.showPostFormOnTopOfTl"/> + <mk-post-form v-if="$store.state.settings.showPostFormOnTopOfTl"/> <mk-timeline ref="tl" @loaded="onTlLoaded" v-if="mode == 'timeline'"/> <mk-mentions @loaded="onTlLoaded" v-if="mode == 'mentions'"/> </div> diff --git a/src/client/app/desktop/views/components/note-detail.sub.vue b/src/client/app/desktop/views/components/note-detail.sub.vue index c798b41b25..0471c70ee7 100644 --- a/src/client/app/desktop/views/components/note-detail.sub.vue +++ b/src/client/app/desktop/views/components/note-detail.sub.vue @@ -16,7 +16,7 @@ <div class="body"> <div class="text"> <span v-if="note.isHidden" style="opacity: 0.5">%i18n:@private%</span> - <mk-note-html v-if="note.text" :text="note.text" :i="os.i"/> + <mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/> </div> <div class="media" v-if="note.mediaIds.length > 0"> <mk-media-list :media-list="note.media"/> diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index 5b48b7a1ba..e64990b4ce 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -39,7 +39,7 @@ <div class="body"> <div class="text"> <span v-if="p.isHidden" style="opacity: 0.5">%i18n:@private%</span> - <mk-note-html v-if="p.text" :text="p.text" :i="os.i"/> + <mk-note-html v-if="p.text" :text="p.text" :i="$store.state.i"/> </div> <div class="media" v-if="p.media.length > 0"> <mk-media-list :media-list="p.media" :raw="true"/> @@ -158,7 +158,7 @@ export default Vue.extend({ // Draw map if (this.p.geo) { - const shouldShowMap = (this as any).os.isSignedIn ? (this as any).clientSettings.showMaps : true; + const shouldShowMap = this.$store.getters.isSignedIn ? this.$store.state.settings.showMaps : true; if (shouldShowMap) { (this as any).os.getGoogleMaps().then(maps => { const uluru = new maps.LatLng(this.p.geo.coordinates[1], this.p.geo.coordinates[0]); diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 4448820eb9..e69e6cdb51 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -1,6 +1,6 @@ <template> <div class="note" tabindex="-1" :title="title" @keydown="onKeydown"> - <div class="reply-to" v-if="p.reply && (!os.isSignedIn || clientSettings.showReplyTarget)"> + <div class="reply-to" v-if="p.reply && (!$store.getters.isSignedIn || $store.state.settings.showReplyTarget)"> <x-sub :note="p.reply"/> </div> <div class="renote" v-if="isRenote"> @@ -43,7 +43,7 @@ <div class="text"> <span v-if="p.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span> <a class="reply" v-if="p.reply">%fa:reply%</a> - <mk-note-html v-if="p.text && !canHideText(p)" :text="p.text" :i="os.i" :class="$style.text"/> + <mk-note-html v-if="p.text && !canHideText(p)" :text="p.text" :i="$store.state.i" :class="$style.text"/> <a class="rp" v-if="p.renote">RP:</a> </div> <div class="media" v-if="p.media.length > 0"> @@ -166,7 +166,7 @@ export default Vue.extend({ }, created() { - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection = (this as any).os.stream.getConnection(); this.connectionId = (this as any).os.stream.use(); } @@ -175,13 +175,13 @@ export default Vue.extend({ mounted() { this.capture(true); - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection.on('_connected_', this.onStreamConnected); } // Draw map if (this.p.geo) { - const shouldShowMap = (this as any).os.isSignedIn ? (this as any).clientSettings.showMaps : true; + const shouldShowMap = this.$store.getters.isSignedIn ? this.$store.state.settings.showMaps : true; if (shouldShowMap) { (this as any).os.getGoogleMaps().then(maps => { const uluru = new maps.LatLng(this.p.geo.coordinates[1], this.p.geo.coordinates[0]); @@ -201,7 +201,7 @@ export default Vue.extend({ beforeDestroy() { this.decapture(true); - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection.off('_connected_', this.onStreamConnected); (this as any).os.stream.dispose(this.connectionId); } @@ -211,7 +211,7 @@ export default Vue.extend({ canHideText, capture(withHandler = false) { - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection.send({ type: 'capture', id: this.p.id @@ -221,7 +221,7 @@ export default Vue.extend({ }, decapture(withHandler = false) { - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection.send({ type: 'decapture', id: this.p.id diff --git a/src/client/app/desktop/views/components/notes.vue b/src/client/app/desktop/views/components/notes.vue index 55b0de3fbd..5a147f31e2 100644 --- a/src/client/app/desktop/views/components/notes.vue +++ b/src/client/app/desktop/views/components/notes.vue @@ -118,24 +118,24 @@ export default Vue.extend({ prepend(note, silent = false) { //#region 弾く - const isMyNote = note.userId == (this as any).os.i.id; + const isMyNote = note.userId == this.$store.state.i.id; const isPureRenote = note.renoteId != null && note.text == null && note.mediaIds.length == 0 && note.poll == null; - if ((this as any).clientSettings.showMyRenotes === false) { + if (this.$store.state.settings.showMyRenotes === false) { if (isMyNote && isPureRenote) { return; } } - if ((this as any).clientSettings.showRenotedMyNotes === false) { - if (isPureRenote && (note.renote.userId == (this as any).os.i.id)) { + if (this.$store.state.settings.showRenotedMyNotes === false) { + if (isPureRenote && (note.renote.userId == this.$store.state.i.id)) { return; } } //#endregion // 投稿が自分のものではないかつ、タブが非表示またはスクロール位置が最上部ではないならタイトルで通知 - if ((document.hidden || !this.isScrollTop()) && note.userId !== (this as any).os.i.id) { + if ((document.hidden || !this.isScrollTop()) && note.userId !== this.$store.state.i.id) { this.unreadCount++; document.title = `(${this.unreadCount}) ${getNoteSummary(note)}`; } @@ -199,7 +199,7 @@ export default Vue.extend({ this.clearNotification(); } - if ((this as any).clientSettings.fetchOnScroll !== false) { + if (this.$store.state.settings.fetchOnScroll !== false) { const current = window.scrollY + window.innerHeight; if (current > document.body.offsetHeight - 8) this.loadMore(); } diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index 39bec6cf0c..8eec677b06 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -118,7 +118,7 @@ export default Vue.extend({ const mention = x.host ? `@${x.username}@${x.host}` : `@${x.username}`; // 自分は除外 - if (this.os.i.username == x.username && x.host == null) return; + if (this.$store.state.i.username == x.username && x.host == null) return; // 重複は除外 if (this.text.indexOf(`${mention} `) != -1) return; diff --git a/src/client/app/desktop/views/components/settings.2fa.vue b/src/client/app/desktop/views/components/settings.2fa.vue index 0809dd798c..3e8c860eba 100644 --- a/src/client/app/desktop/views/components/settings.2fa.vue +++ b/src/client/app/desktop/views/components/settings.2fa.vue @@ -2,8 +2,8 @@ <div class="2fa"> <p>%i18n:@intro%<a href="%i18n:@url%" target="_blank">%i18n:@detail%</a></p> <div class="ui info warn"><p>%fa:exclamation-triangle%%i18n:@caution%</p></div> - <p v-if="!data && !os.i.twoFactorEnabled"><button @click="register" class="ui primary">%i18n:@register%</button></p> - <template v-if="os.i.twoFactorEnabled"> + <p v-if="!data && !$store.state.i.twoFactorEnabled"><button @click="register" class="ui primary">%i18n:@register%</button></p> + <template v-if="$store.state.i.twoFactorEnabled"> <p>%i18n:@already-registered%</p> <button @click="unregister" class="ui">%i18n:@unregister%</button> </template> @@ -54,7 +54,7 @@ export default Vue.extend({ password: password }).then(() => { (this as any).apis.notify('%i18n:@unregistered%'); - (this as any).os.i.twoFactorEnabled = false; + this.$store.state.i.twoFactorEnabled = false; }); }); }, @@ -64,7 +64,7 @@ export default Vue.extend({ token: this.token }).then(() => { (this as any).apis.notify('%i18n:@success%'); - (this as any).os.i.twoFactorEnabled = true; + this.$store.state.i.twoFactorEnabled = true; }).catch(() => { (this as any).apis.notify('%i18n:@failed%'); }); diff --git a/src/client/app/desktop/views/components/settings.api.vue b/src/client/app/desktop/views/components/settings.api.vue index b8eef3de63..113764c3e1 100644 --- a/src/client/app/desktop/views/components/settings.api.vue +++ b/src/client/app/desktop/views/components/settings.api.vue @@ -1,6 +1,6 @@ <template> <div class="root api"> - <p>%i18n:@token% <code>{{ os.i.token }}</code></p> + <p>%i18n:@token% <code>{{ $store.state.i.token }}</code></p> <p>%i18n:@intro%</p> <div class="ui info warn"><p>%fa:exclamation-triangle%%i18n:@caution%</p></div> <p>%i18n:@regeneration-of-token%</p> diff --git a/src/client/app/desktop/views/components/settings.profile.vue b/src/client/app/desktop/views/components/settings.profile.vue index 132ab12f1c..9932cbf7db 100644 --- a/src/client/app/desktop/views/components/settings.profile.vue +++ b/src/client/app/desktop/views/components/settings.profile.vue @@ -2,7 +2,7 @@ <div class="profile"> <label class="avatar ui from group"> <p>%i18n:@avatar%</p> - <img class="avatar" :src="`${os.i.avatarUrl}?thumbnail&size=64`" alt="avatar"/> + <img class="avatar" :src="`${$store.state.i.avatarUrl}?thumbnail&size=64`" alt="avatar"/> <button class="ui" @click="updateAvatar">%i18n:@choice-avatar%</button> </label> <label class="ui from group"> @@ -24,8 +24,8 @@ <button class="ui primary" @click="save">%i18n:@save%</button> <section> <h2>その他</h2> - <mk-switch v-model="os.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/> - <mk-switch v-model="os.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/> + <mk-switch v-model="$store.state.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/> + <mk-switch v-model="$store.state.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/> </section> </div> </template> @@ -43,10 +43,10 @@ export default Vue.extend({ }; }, created() { - this.name = (this as any).os.i.name || ''; - this.location = (this as any).os.i.profile.location; - this.description = (this as any).os.i.description; - this.birthday = (this as any).os.i.profile.birthday; + this.name = this.$store.state.i.name || ''; + this.location = this.$store.state.i.profile.location; + this.description = this.$store.state.i.description; + this.birthday = this.$store.state.i.profile.birthday; }, methods: { updateAvatar() { @@ -64,12 +64,12 @@ export default Vue.extend({ }, onChangeIsBot() { (this as any).api('i/update', { - isBot: (this as any).os.i.isBot + isBot: this.$store.state.i.isBot }); }, onChangeIsCat() { (this as any).api('i/update', { - isCat: (this as any).os.i.isCat + isCat: this.$store.state.i.isCat }); } } diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index dac5fe67cb..1bfff8cc83 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -20,7 +20,7 @@ <section class="web" v-show="page == 'web'"> <h1>%i18n:@behaviour%</h1> - <mk-switch v-model="clientSettings.fetchOnScroll" @change="onChangeFetchOnScroll" text="%i18n:@fetch-on-scroll%"> + <mk-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll" text="%i18n:@fetch-on-scroll%"> <span>%i18n:@fetch-on-scroll-desc%</span> </mk-switch> <mk-switch v-model="autoPopout" text="%i18n:@auto-popout%"> @@ -41,14 +41,14 @@ </div> <div class="div"> <mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/> - <mk-switch v-model="clientSettings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/> - <mk-switch v-model="clientSettings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/> + <mk-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/> + <mk-switch v-model="$store.state.settings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/> </div> - <mk-switch v-model="clientSettings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/> - <mk-switch v-model="clientSettings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/> - <mk-switch v-model="clientSettings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/> - <mk-switch v-model="clientSettings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/> - <mk-switch v-model="clientSettings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%"> + <mk-switch v-model="$store.state.settings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/> + <mk-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/> + <mk-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/> + <mk-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/> + <mk-switch v-model="$store.state.settings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%"> <span>%i18n:@show-maps-desc%</span> </mk-switch> </section> @@ -72,7 +72,7 @@ <section class="web" v-show="page == 'web'"> <h1>%i18n:@mobile%</h1> - <mk-switch v-model="clientSettings.disableViaMobile" @change="onChangeDisableViaMobile" text="%i18n:@disable-via-mobile%"/> + <mk-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile" text="%i18n:@disable-via-mobile%"/> </section> <section class="web" v-show="page == 'web'"> @@ -100,7 +100,7 @@ <section class="notification" v-show="page == 'notification'"> <h1>%i18n:@notification%</h1> - <mk-switch v-model="os.i.settings.autoWatch" @change="onChangeAutoWatch" text="%i18n:@auto-watch%"> + <mk-switch v-model="$store.state.i.settings.autoWatch" @change="onChangeAutoWatch" text="%i18n:@auto-watch%"> <span>%i18n:@auto-watch-desc%</span> </mk-switch> </section> diff --git a/src/client/app/desktop/views/components/sub-note-content.vue b/src/client/app/desktop/views/components/sub-note-content.vue index 03b634b0ff..8aa32cec73 100644 --- a/src/client/app/desktop/views/components/sub-note-content.vue +++ b/src/client/app/desktop/views/components/sub-note-content.vue @@ -3,7 +3,7 @@ <div class="body"> <span v-if="note.isHidden" style="opacity: 0.5">%i18n:@hidden%</span> <a class="reply" v-if="note.replyId">%fa:reply%</a> - <mk-note-html :text="note.text" :i="os.i"/> + <mk-note-html :text="note.text" :i="$store.state.i"/> <a class="rp" v-if="note.renoteId" :href="`/note:${note.renoteId}`">RP: ...</a> </div> <details v-if="note.media.length > 0"> diff --git a/src/client/app/desktop/views/components/timeline.core.vue b/src/client/app/desktop/views/components/timeline.core.vue index 3fcec86e48..44d5967db5 100644 --- a/src/client/app/desktop/views/components/timeline.core.vue +++ b/src/client/app/desktop/views/components/timeline.core.vue @@ -40,7 +40,7 @@ export default Vue.extend({ computed: { alone(): boolean { - return (this as any).os.i.followingCount == 0; + return this.$store.state.i.followingCount == 0; }, stream(): any { @@ -98,8 +98,8 @@ export default Vue.extend({ (this as any).api(this.endpoint, { limit: fetchLimit + 1, untilDate: this.date ? this.date.getTime() : undefined, - includeMyRenotes: (this as any).clientSettings.showMyRenotes, - includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes }).then(notes => { if (notes.length == fetchLimit + 1) { notes.pop(); @@ -120,8 +120,8 @@ export default Vue.extend({ const promise = (this as any).api(this.endpoint, { limit: fetchLimit + 1, untilId: (this.$refs.timeline as any).tail().id, - includeMyRenotes: (this as any).clientSettings.showMyRenotes, - includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes }); promise.then(notes => { diff --git a/src/client/app/desktop/views/components/timeline.vue b/src/client/app/desktop/views/components/timeline.vue index 27d329d13f..0728b78aa9 100644 --- a/src/client/app/desktop/views/components/timeline.vue +++ b/src/client/app/desktop/views/components/timeline.vue @@ -47,7 +47,7 @@ export default Vue.extend({ if (this.src == 'list') { this.list = this.$store.state.device.tl.arg; } - } else if ((this as any).os.i.followingCount == 0) { + } else if (this.$store.state.i.followingCount == 0) { this.src = 'local'; } }, diff --git a/src/client/app/desktop/views/components/ui.header.account.vue b/src/client/app/desktop/views/components/ui.header.account.vue index f3f6539496..8d26691f84 100644 --- a/src/client/app/desktop/views/components/ui.header.account.vue +++ b/src/client/app/desktop/views/components/ui.header.account.vue @@ -1,14 +1,14 @@ <template> <div class="account"> <button class="header" :data-active="isOpen" @click="toggle"> - <span class="username">{{ os.i.username }}<template v-if="!isOpen">%fa:angle-down%</template><template v-if="isOpen">%fa:angle-up%</template></span> - <mk-avatar class="avatar" :user="os.i"/> + <span class="username">{{ $store.state.i.username }}<template v-if="!isOpen">%fa:angle-down%</template><template v-if="isOpen">%fa:angle-up%</template></span> + <mk-avatar class="avatar" :user="$store.state.i"/> </button> <transition name="zoom-in-top"> <div class="menu" v-if="isOpen"> <ul> <li> - <router-link :to="`/@${ os.i.username }`">%fa:user%<span>%i18n:@profile%</span>%fa:angle-right%</router-link> + <router-link :to="`/@${ $store.state.i.username }`">%fa:user%<span>%i18n:@profile%</span>%fa:angle-right%</router-link> </li> <li @click="drive"> <p>%fa:cloud%<span>%i18n:@drive%</span>%fa:angle-right%</p> diff --git a/src/client/app/desktop/views/components/ui.header.nav.vue b/src/client/app/desktop/views/components/ui.header.nav.vue index 0800d96eb6..201b04b039 100644 --- a/src/client/app/desktop/views/components/ui.header.nav.vue +++ b/src/client/app/desktop/views/components/ui.header.nav.vue @@ -1,7 +1,7 @@ <template> <div class="nav"> <ul> - <template v-if="os.isSignedIn"> + <template v-if="$store.getters.isSignedIn"> <li class="home" :class="{ active: $route.name == 'index' }"> <router-link to="/"> %fa:home% @@ -42,7 +42,7 @@ export default Vue.extend({ }; }, mounted() { - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection = (this as any).os.stream.getConnection(); this.connectionId = (this as any).os.stream.use(); @@ -60,7 +60,7 @@ export default Vue.extend({ } }, beforeDestroy() { - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection.off('read_all_messaging_messages', this.onReadAllMessagingMessages); this.connection.off('unread_messaging_message', this.onUnreadMessagingMessage); this.connection.off('othello_invited', this.onOthelloInvited); diff --git a/src/client/app/desktop/views/components/ui.header.notifications.vue b/src/client/app/desktop/views/components/ui.header.notifications.vue index ea814dd7a3..9eaaa62c61 100644 --- a/src/client/app/desktop/views/components/ui.header.notifications.vue +++ b/src/client/app/desktop/views/components/ui.header.notifications.vue @@ -23,7 +23,7 @@ export default Vue.extend({ }; }, mounted() { - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection = (this as any).os.stream.getConnection(); this.connectionId = (this as any).os.stream.use(); @@ -39,7 +39,7 @@ export default Vue.extend({ } }, beforeDestroy() { - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection.off('read_all_notifications', this.onReadAllNotifications); this.connection.off('unread_notification', this.onUnreadNotification); (this as any).os.stream.dispose(this.connectionId); diff --git a/src/client/app/desktop/views/components/ui.header.vue b/src/client/app/desktop/views/components/ui.header.vue index 7729575b56..34464bf4b2 100644 --- a/src/client/app/desktop/views/components/ui.header.vue +++ b/src/client/app/desktop/views/components/ui.header.vue @@ -4,16 +4,16 @@ <div class="main" ref="main"> <div class="backdrop"></div> <div class="main"> - <p ref="welcomeback" v-if="os.isSignedIn">おかえりなさい、<b>{{ os.i | userName }}</b>さん</p> + <p ref="welcomeback" v-if="$store.getters.isSignedIn">おかえりなさい、<b>{{ $store.state.i | userName }}</b>さん</p> <div class="container" ref="mainContainer"> <div class="left"> <x-nav/> </div> <div class="right"> <x-search/> - <x-account v-if="os.isSignedIn"/> - <x-notifications v-if="os.isSignedIn"/> - <x-post v-if="os.isSignedIn"/> + <x-account v-if="$store.getters.isSignedIn"/> + <x-notifications v-if="$store.getters.isSignedIn"/> + <x-post v-if="$store.getters.isSignedIn"/> <x-clock/> </div> </div> @@ -45,11 +45,11 @@ export default Vue.extend({ mounted() { this.$store.commit('setUiHeaderHeight', 48); - if ((this as any).os.isSignedIn) { - const ago = (new Date().getTime() - new Date((this as any).os.i.lastUsedAt).getTime()) / 1000; + if (this.$store.getters.isSignedIn) { + const ago = (new Date().getTime() - new Date(this.$store.state.i.lastUsedAt).getTime()) / 1000; const isHisasiburi = ago >= 3600; - (this as any).os.i.lastUsedAt = new Date(); - (this as any).os.bakeMe(); + this.$store.state.i.lastUsedAt = new Date(); + if (isHisasiburi) { (this.$refs.welcomeback as any).style.display = 'block'; (this.$refs.main as any).style.overflow = 'hidden'; diff --git a/src/client/app/desktop/views/components/ui.vue b/src/client/app/desktop/views/components/ui.vue index 87f932ff14..b6dd22c1f8 100644 --- a/src/client/app/desktop/views/components/ui.vue +++ b/src/client/app/desktop/views/components/ui.vue @@ -4,7 +4,7 @@ <div class="content"> <slot></slot> </div> - <mk-stream-indicator v-if="os.isSignedIn"/> + <mk-stream-indicator v-if="$store.getters.isSignedIn"/> </div> </template> diff --git a/src/client/app/desktop/views/components/user-list-timeline.vue b/src/client/app/desktop/views/components/user-list-timeline.vue index 4f14da70fe..03ac81a4a1 100644 --- a/src/client/app/desktop/views/components/user-list-timeline.vue +++ b/src/client/app/desktop/views/components/user-list-timeline.vue @@ -32,7 +32,7 @@ export default Vue.extend({ methods: { init() { if (this.connection) this.connection.close(); - this.connection = new UserListStream((this as any).os, (this as any).os.i, this.list.id); + this.connection = new UserListStream((this as any).os, this.$store.state.i, this.list.id); this.connection.on('note', this.onNote); this.connection.on('userAdded', this.onUserAdded); this.connection.on('userRemoved', this.onUserRemoved); @@ -46,8 +46,8 @@ export default Vue.extend({ (this as any).api('notes/user-list-timeline', { listId: this.list.id, limit: fetchLimit + 1, - includeMyRenotes: (this as any).clientSettings.showMyRenotes, - includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes }).then(notes => { if (notes.length == fetchLimit + 1) { notes.pop(); @@ -66,8 +66,8 @@ export default Vue.extend({ listId: this.list.id, limit: fetchLimit + 1, untilId: (this.$refs.timeline as any).tail().id, - includeMyRenotes: (this as any).clientSettings.showMyRenotes, - includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes }); promise.then(notes => { diff --git a/src/client/app/desktop/views/components/user-preview.vue b/src/client/app/desktop/views/components/user-preview.vue index b8854a8032..788881ead5 100644 --- a/src/client/app/desktop/views/components/user-preview.vue +++ b/src/client/app/desktop/views/components/user-preview.vue @@ -19,7 +19,7 @@ <p>%i18n:@followers%</p><a>{{ u.followersCount }}</a> </div> </div> - <mk-follow-button v-if="os.isSignedIn && user.id != os.i.id" :user="u"/> + <mk-follow-button v-if="$store.getters.isSignedIn && user.id != $store.state.i.id" :user="u"/> </template> </div> </template> diff --git a/src/client/app/desktop/views/components/users-list.vue b/src/client/app/desktop/views/components/users-list.vue index 1ed5c33b13..0423db8ed7 100644 --- a/src/client/app/desktop/views/components/users-list.vue +++ b/src/client/app/desktop/views/components/users-list.vue @@ -3,7 +3,7 @@ <nav> <div> <span :data-active="mode == 'all'" @click="mode = 'all'">%i18n:@all%<span>{{ count }}</span></span> - <span v-if="os.isSignedIn && youKnowCount" :data-active="mode == 'iknow'" @click="mode = 'iknow'">%i18n:@iknow%<span>{{ youKnowCount }}</span></span> + <span v-if="$store.getters.isSignedIn && youKnowCount" :data-active="mode == 'iknow'" @click="mode = 'iknow'">%i18n:@iknow%<span>{{ youKnowCount }}</span></span> </div> </nav> <div class="users" v-if="!fetching && users.length != 0"> diff --git a/src/client/app/desktop/views/components/widget-container.vue b/src/client/app/desktop/views/components/widget-container.vue index ab8327d39e..488e9cb249 100644 --- a/src/client/app/desktop/views/components/widget-container.vue +++ b/src/client/app/desktop/views/components/widget-container.vue @@ -23,9 +23,9 @@ export default Vue.extend({ }, computed: { withGradient(): boolean { - return (this as any).os.isSignedIn - ? (this as any).clientSettings.gradientWindowHeader != null - ? (this as any).clientSettings.gradientWindowHeader + return this.$store.getters.isSignedIn + ? this.$store.state.settings.gradientWindowHeader != null + ? this.$store.state.settings.gradientWindowHeader : false : false; } diff --git a/src/client/app/desktop/views/components/window.vue b/src/client/app/desktop/views/components/window.vue index ac06ac8e57..e4753f55db 100644 --- a/src/client/app/desktop/views/components/window.vue +++ b/src/client/app/desktop/views/components/window.vue @@ -4,7 +4,7 @@ <div class="main" ref="main" tabindex="-1" :data-is-modal="isModal" @mousedown="onBodyMousedown" @keydown="onKeydown" :style="{ width, height }"> <div class="body"> <header ref="header" - :class="{ withGradient: clientSettings.gradientWindowHeader }" + :class="{ withGradient: $store.state.settings.gradientWindowHeader }" @contextmenu.prevent="() => {}" @mousedown.prevent="onHeaderMousedown" > <h1><slot name="header"></slot></h1> @@ -95,7 +95,7 @@ export default Vue.extend({ }, created() { - if ((this as any).os.store.state.device.autoPopout && this.popoutUrl) { + if (this.$store.state.device.autoPopout && this.popoutUrl) { this.popout(); this.preventMount = true; } else { diff --git a/src/client/app/desktop/views/pages/index.vue b/src/client/app/desktop/views/pages/index.vue index 0ea47d913b..5d11fc5423 100644 --- a/src/client/app/desktop/views/pages/index.vue +++ b/src/client/app/desktop/views/pages/index.vue @@ -1,5 +1,5 @@ <template> -<component :is="os.isSignedIn ? 'home' : 'welcome'"></component> +<component :is="$store.getters.isSignedIn ? 'home' : 'welcome'"></component> </template> <script lang="ts"> diff --git a/src/client/app/desktop/views/pages/user/user.header.vue b/src/client/app/desktop/views/pages/user/user.header.vue index 73af3a4a4c..44910bc7f0 100644 --- a/src/client/app/desktop/views/pages/user/user.header.vue +++ b/src/client/app/desktop/views/pages/user/user.header.vue @@ -63,7 +63,7 @@ export default Vue.extend({ }, onBannerClick() { - if (!(this as any).os.isSignedIn || (this as any).os.i.id != this.user.id) return; + if (!this.$store.getters.isSignedIn || this.$store.state.i.id != this.user.id) return; (this as any).apis.updateBanner().then(i => { this.user.bannerUrl = i.bannerUrl; diff --git a/src/client/app/desktop/views/pages/user/user.home.vue b/src/client/app/desktop/views/pages/user/user.home.vue index 6b242a6129..afaf97dc9e 100644 --- a/src/client/app/desktop/views/pages/user/user.home.vue +++ b/src/client/app/desktop/views/pages/user/user.home.vue @@ -4,7 +4,7 @@ <div ref="left"> <x-profile :user="user"/> <x-photos :user="user"/> - <x-followers-you-know v-if="os.isSignedIn && os.i.id != user.id" :user="user"/> + <x-followers-you-know v-if="$store.getters.isSignedIn && $store.state.i.id != user.id" :user="user"/> <p v-if="user.host === null">%i18n:@last-used-at%: <b><mk-time :time="user.lastUsedAt"/></b></p> </div> </div> diff --git a/src/client/app/desktop/views/pages/user/user.profile.vue b/src/client/app/desktop/views/pages/user/user.profile.vue index 29e49f36a6..5aa08f7c85 100644 --- a/src/client/app/desktop/views/pages/user/user.profile.vue +++ b/src/client/app/desktop/views/pages/user/user.profile.vue @@ -1,6 +1,6 @@ <template> <div class="profile"> - <div class="friend-form" v-if="os.isSignedIn && os.i.id != user.id"> + <div class="friend-form" v-if="$store.getters.isSignedIn && $store.state.i.id != user.id"> <mk-follow-button :user="user" size="big"/> <p class="followed" v-if="user.isFollowed">%i18n:@follows-you%</p> <p class="stalk" v-if="user.isFollowing"> diff --git a/src/client/app/desktop/views/widgets/activity.vue b/src/client/app/desktop/views/widgets/activity.vue index 1be87f590c..73c6d0ef64 100644 --- a/src/client/app/desktop/views/widgets/activity.vue +++ b/src/client/app/desktop/views/widgets/activity.vue @@ -2,7 +2,7 @@ <mk-activity :design="props.design" :init-view="props.view" - :user="os.i" + :user="$store.state.i" @view-changed="viewChanged"/> </template> diff --git a/src/client/app/desktop/views/widgets/profile.vue b/src/client/app/desktop/views/widgets/profile.vue index 5af5b88e23..7b0fea3729 100644 --- a/src/client/app/desktop/views/widgets/profile.vue +++ b/src/client/app/desktop/views/widgets/profile.vue @@ -4,16 +4,16 @@ :data-melt="props.design == 2" > <div class="banner" - :style="os.i.bannerUrl ? `background-image: url(${os.i.bannerUrl}?thumbnail&size=256)` : ''" + :style="$store.state.i.bannerUrl ? `background-image: url(${$store.state.i.bannerUrl}?thumbnail&size=256)` : ''" title="%i18n:@update-banner%" @click="os.apis.updateBanner" ></div> - <mk-avatar class="avatar" :user="os.i" + <mk-avatar class="avatar" :user="$store.state.i" @click="os.apis.updateAvatar" title="%i18n:@update-avatar%" /> - <router-link class="name" :to="os.i | userPage">{{ os.i | userName }}</router-link> - <p class="username">@{{ os.i | acct }}</p> + <router-link class="name" :to="$store.state.i | userPage">{{ $store.state.i | userName }}</router-link> + <p class="username">@{{ $store.state.i | acct }}</p> </div> </template> diff --git a/src/client/app/init.ts b/src/client/app/init.ts index 560ab1a096..58013ec5a8 100644 --- a/src/client/app/init.ts +++ b/src/client/app/init.ts @@ -143,8 +143,7 @@ export default (callback: (launch: (router: VueRouter, api?: (os: MiOS) => API) return { os, api: os.api, - apis: os.apis, - clientSettings: os.store.state.settings + apis: os.apis }; } }); diff --git a/src/client/app/mios.ts b/src/client/app/mios.ts index a5a38a5414..a8da5ddb55 100644 --- a/src/client/app/mios.ts +++ b/src/client/app/mios.ts @@ -1,10 +1,9 @@ import Vue from 'vue'; import { EventEmitter } from 'eventemitter3'; -import * as merge from 'object-assign-deep'; import * as uuid from 'uuid'; import initStore from './store'; -import { hostname, apiUrl, swPublickey, version, lang, googleMapsApiKey } from './config'; +import { apiUrl, swPublickey, version, lang, googleMapsApiKey } from './config'; import Progress from './common/scripts/loading'; import Connection from './common/scripts/streaming/stream'; import { HomeStreamManager } from './common/scripts/streaming/home'; @@ -82,18 +81,6 @@ export default class MiOS extends EventEmitter { return w; } - /** - * A signing user - */ - public i: { [x: string]: any }; - - /** - * Whether signed in - */ - public get isSignedIn() { - return this.i != null; - } - /** * Whether is debug mode */ @@ -218,15 +205,8 @@ export default class MiOS extends EventEmitter { console.error.apply(null, args); } - public bakeMe() { - // ローカルストレージにキャッシュ - localStorage.setItem('me', JSON.stringify(this.i)); - } - public signout() { - localStorage.removeItem('me'); - localStorage.removeItem('settings'); - document.cookie = `i=; domain=${hostname}; expires=Thu, 01 Jan 1970 00:00:01 GMT;`; + this.store.dispatch('logout'); location.href = '/'; } @@ -242,14 +222,14 @@ export default class MiOS extends EventEmitter { this.once('signedin', () => { // Init home stream manager - this.stream = new HomeStreamManager(this, this.i); + this.stream = new HomeStreamManager(this, this.store.state.i); // Init other stream manager - this.streams.localTimelineStream = new LocalTimelineStreamManager(this, this.i); - this.streams.globalTimelineStream = new GlobalTimelineStreamManager(this, this.i); - this.streams.driveStream = new DriveStreamManager(this, this.i); - this.streams.messagingIndexStream = new MessagingIndexStreamManager(this, this.i); - this.streams.othelloStream = new OthelloStreamManager(this, this.i); + this.streams.localTimelineStream = new LocalTimelineStreamManager(this, this.store.state.i); + this.streams.globalTimelineStream = new GlobalTimelineStreamManager(this, this.store.state.i); + this.streams.driveStream = new DriveStreamManager(this, this.store.state.i); + this.streams.messagingIndexStream = new MessagingIndexStreamManager(this, this.store.state.i); + this.streams.othelloStream = new OthelloStreamManager(this, this.store.state.i); }); //#endregion @@ -300,51 +280,29 @@ export default class MiOS extends EventEmitter { }; // フェッチが完了したとき - const fetched = me => { - this.i = me; - - // ローカルストレージにキャッシュ - this.bakeMe(); - + const fetched = () => { this.emit('signedin'); // Finish init callback(); - //#region Note - // Init service worker if (this.shouldRegisterSw) this.registerSw(); - - //#endregion }; - // Get cached account data - const cachedMe = JSON.parse(localStorage.getItem('me')); - - //#region キャッシュされた設定を復元 - const cachedSettings = JSON.parse(localStorage.getItem('settings')); - - if (cachedSettings) { - this.store.dispatch('settings/merge', cachedSettings); - } - //#endregion - // キャッシュがあったとき - if (cachedMe) { - if (cachedMe.token == null) { + if (this.store.state.i != null) { + if (this.store.state.i.token == null) { this.signout(); return; } // とりあえずキャッシュされたデータでお茶を濁して(?)おいて、 - fetched(cachedMe); + fetched(); // 後から新鮮なデータをフェッチ - fetchme(cachedMe.token, freshData => { - merge(cachedMe, freshData); - - this.store.dispatch('settings/merge', freshData.clientSettings); + fetchme(this.store.state.i.token, freshData => { + this.store.dispatch('mergeMe', freshData); }); } else { // Get token from cookie @@ -352,9 +310,8 @@ export default class MiOS extends EventEmitter { fetchme(i, me => { if (me) { - this.store.dispatch('settings/merge', me.clientSettings); - - fetched(me); + this.store.dispatch('login', me); + fetched(); } else { // Finish init callback(); @@ -375,7 +332,7 @@ export default class MiOS extends EventEmitter { if (!isSwSupported) return; // Reject when not signed in to Misskey - if (!this.isSignedIn) return; + if (!this.store.getters.isSignedIn) return; // When service worker activated navigator.serviceWorker.ready.then(registration => { @@ -484,7 +441,7 @@ export default class MiOS extends EventEmitter { }); } else { // Append a credential - if (this.isSignedIn) (data as any).i = this.i.token; + if (this.store.getters.isSignedIn) (data as any).i = this.store.state.i.token; const req = { id: uuid(), diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index 244dbb6c03..eb934431d2 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -31,7 +31,7 @@ <div class="body"> <div class="text"> <span v-if="p.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span> - <mk-note-html v-if="p.text" :text="p.text" :i="os.i"/> + <mk-note-html v-if="p.text" :text="p.text" :i="$store.state.i"/> </div> <div class="tags" v-if="p.tags && p.tags.length > 0"> <router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link> @@ -147,7 +147,7 @@ export default Vue.extend({ // Draw map if (this.p.geo) { - const shouldShowMap = (this as any).os.isSignedIn ? (this as any).clientSettings.showMaps : true; + const shouldShowMap = this.$store.getters.isSignedIn ? this.$store.state.settings.showMaps : true; if (shouldShowMap) { (this as any).os.getGoogleMaps().then(maps => { const uluru = new maps.LatLng(this.p.geo.coordinates[1], this.p.geo.coordinates[0]); diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 2004263d22..42d3ffe40e 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -1,6 +1,6 @@ <template> <div class="note" :class="{ renote: isRenote, smart: $store.state.device.postStyle == 'smart' }"> - <div class="reply-to" v-if="p.reply && (!os.isSignedIn || clientSettings.showReplyTarget)"> + <div class="reply-to" v-if="p.reply && (!$store.getters.isSignedIn || $store.state.settings.showReplyTarget)"> <x-sub :note="p.reply"/> </div> <div class="renote" v-if="isRenote"> @@ -43,7 +43,7 @@ <div class="text"> <span v-if="p.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span> <a class="reply" v-if="p.reply">%fa:reply%</a> - <mk-note-html v-if="p.text && !canHideText(p)" :text="p.text" :i="os.i" :class="$style.text"/> + <mk-note-html v-if="p.text && !canHideText(p)" :text="p.text" :i="$store.state.i" :class="$style.text"/> <a class="rp" v-if="p.renote != null">RP:</a> </div> <div class="media" v-if="p.media.length > 0"> @@ -141,7 +141,7 @@ export default Vue.extend({ }, created() { - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection = (this as any).os.stream.getConnection(); this.connectionId = (this as any).os.stream.use(); } @@ -150,13 +150,13 @@ export default Vue.extend({ mounted() { this.capture(true); - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection.on('_connected_', this.onStreamConnected); } // Draw map if (this.p.geo) { - const shouldShowMap = (this as any).os.isSignedIn ? (this as any).clientSettings.showMaps : true; + const shouldShowMap = this.$store.getters.isSignedIn ? this.$store.state.settings.showMaps : true; if (shouldShowMap) { (this as any).os.getGoogleMaps().then(maps => { const uluru = new maps.LatLng(this.p.geo.coordinates[1], this.p.geo.coordinates[0]); @@ -176,7 +176,7 @@ export default Vue.extend({ beforeDestroy() { this.decapture(true); - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection.off('_connected_', this.onStreamConnected); (this as any).os.stream.dispose(this.connectionId); } @@ -186,7 +186,7 @@ export default Vue.extend({ canHideText, capture(withHandler = false) { - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection.send({ type: 'capture', id: this.p.id @@ -196,7 +196,7 @@ export default Vue.extend({ }, decapture(withHandler = false) { - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection.send({ type: 'decapture', id: this.p.id diff --git a/src/client/app/mobile/views/components/notes.vue b/src/client/app/mobile/views/components/notes.vue index e77698dea9..fbba111664 100644 --- a/src/client/app/mobile/views/components/notes.vue +++ b/src/client/app/mobile/views/components/notes.vue @@ -121,24 +121,24 @@ export default Vue.extend({ prepend(note, silent = false) { //#region 弾く - const isMyNote = note.userId == (this as any).os.i.id; + const isMyNote = note.userId == this.$store.state.i.id; const isPureRenote = note.renoteId != null && note.text == null && note.mediaIds.length == 0 && note.poll == null; - if ((this as any).clientSettings.showMyRenotes === false) { + if (this.$store.state.settings.showMyRenotes === false) { if (isMyNote && isPureRenote) { return; } } - if ((this as any).clientSettings.showRenotedMyNotes === false) { - if (isPureRenote && (note.renote.userId == (this as any).os.i.id)) { + if (this.$store.state.settings.showRenotedMyNotes === false) { + if (isPureRenote && (note.renote.userId == this.$store.state.i.id)) { return; } } //#endregion // 投稿が自分のものではないかつ、タブが非表示またはスクロール位置が最上部ではないならタイトルで通知 - if ((document.hidden || !this.isScrollTop()) && note.userId !== (this as any).os.i.id) { + if ((document.hidden || !this.isScrollTop()) && note.userId !== this.$store.state.i.id) { this.unreadCount++; document.title = `(${this.unreadCount}) ${getNoteSummary(note)}`; } @@ -195,7 +195,7 @@ export default Vue.extend({ this.clearNotification(); } - if ((this as any).clientSettings.fetchOnScroll !== false) { + if (this.$store.state.settings.fetchOnScroll !== false) { // 親要素が display none だったら弾く // https://github.com/syuilo/misskey/issues/1569 // http://d.hatena.ne.jp/favril/20091105/1257403319 diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index 264eb08448..f999988c60 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -86,7 +86,7 @@ export default Vue.extend({ const mention = x.host ? `@${x.username}@${x.host}` : `@${x.username}`; // 自分は除外 - if (this.os.i.username == x.username && x.host == null) return; + if (this.$store.state.i.username == x.username && x.host == null) return; // 重複は除外 if (this.text.indexOf(`${mention} `) != -1) return; @@ -194,7 +194,7 @@ export default Vue.extend({ post() { this.posting = true; - const viaMobile = (this as any).clientSettings.disableViaMobile !== true; + const viaMobile = this.$store.state.settings.disableViaMobile !== true; (this as any).api('notes/create', { text: this.text == '' ? undefined : this.text, mediaIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined, diff --git a/src/client/app/mobile/views/components/sub-note-content.vue b/src/client/app/mobile/views/components/sub-note-content.vue index cc50977a58..bb96d65147 100644 --- a/src/client/app/mobile/views/components/sub-note-content.vue +++ b/src/client/app/mobile/views/components/sub-note-content.vue @@ -3,7 +3,7 @@ <div class="body"> <span v-if="note.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span> <a class="reply" v-if="note.replyId">%fa:reply%</a> - <mk-note-html v-if="note.text" :text="note.text" :i="os.i"/> + <mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/> <a class="rp" v-if="note.renoteId">RP: ...</a> </div> <details v-if="note.media.length > 0"> diff --git a/src/client/app/mobile/views/components/ui.header.vue b/src/client/app/mobile/views/components/ui.header.vue index a49462b159..09aa18f769 100644 --- a/src/client/app/mobile/views/components/ui.header.vue +++ b/src/client/app/mobile/views/components/ui.header.vue @@ -3,7 +3,7 @@ <mk-special-message/> <div class="main" ref="main"> <div class="backdrop"></div> - <p ref="welcomeback" v-if="os.isSignedIn">おかえりなさい、<b>{{ os.i | userName }}</b>さん</p> + <p ref="welcomeback" v-if="$store.getters.isSignedIn">おかえりなさい、<b>{{ $store.state.i | userName }}</b>さん</p> <div class="content" ref="mainContainer"> <button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button> <template v-if="hasUnreadNotifications || hasUnreadMessagingMessages || hasGameInvitations">%fa:circle%</template> @@ -35,7 +35,7 @@ export default Vue.extend({ mounted() { this.$store.commit('setUiHeaderHeight', 48); - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection = (this as any).os.stream.getConnection(); this.connectionId = (this as any).os.stream.use(); @@ -60,10 +60,10 @@ export default Vue.extend({ } }); - const ago = (new Date().getTime() - new Date((this as any).os.i.lastUsedAt).getTime()) / 1000; + const ago = (new Date().getTime() - new Date(this.$store.state.i.lastUsedAt).getTime()) / 1000; const isHisasiburi = ago >= 3600; - (this as any).os.i.lastUsedAt = new Date(); - (this as any).os.bakeMe(); + this.$store.state.i.lastUsedAt = new Date(); + if (isHisasiburi) { (this.$refs.welcomeback as any).style.display = 'block'; (this.$refs.main as any).style.overflow = 'hidden'; @@ -109,7 +109,7 @@ export default Vue.extend({ } }, beforeDestroy() { - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection.off('read_all_notifications', this.onReadAllNotifications); this.connection.off('unread_notification', this.onUnreadNotification); this.connection.off('read_all_messaging_messages', this.onReadAllMessagingMessages); diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue index aa469bd1c8..5f0cc831cc 100644 --- a/src/client/app/mobile/views/components/ui.nav.vue +++ b/src/client/app/mobile/views/components/ui.nav.vue @@ -9,9 +9,9 @@ </transition> <transition name="nav"> <div class="body" v-if="isOpen"> - <router-link class="me" v-if="os.isSignedIn" :to="`/@${os.i.username}`"> - <img class="avatar" :src="`${os.i.avatarUrl}?thumbnail&size=128`" alt="avatar"/> - <p class="name">{{ os.i | userName }}</p> + <router-link class="me" v-if="$store.getters.isSignedIn" :to="`/@${$store.state.i.username}`"> + <img class="avatar" :src="`${$store.state.i.avatarUrl}?thumbnail&size=128`" alt="avatar"/> + <p class="name">{{ $store.state.i | userName }}</p> </router-link> <div class="links"> <ul> @@ -55,7 +55,7 @@ export default Vue.extend({ }; }, mounted() { - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection = (this as any).os.stream.getConnection(); this.connectionId = (this as any).os.stream.use(); @@ -82,7 +82,7 @@ export default Vue.extend({ } }, beforeDestroy() { - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection.off('read_all_notifications', this.onReadAllNotifications); this.connection.off('unread_notification', this.onUnreadNotification); this.connection.off('read_all_messaging_messages', this.onReadAllMessagingMessages); diff --git a/src/client/app/mobile/views/components/ui.vue b/src/client/app/mobile/views/components/ui.vue index 325ce9d40e..7e2d39f259 100644 --- a/src/client/app/mobile/views/components/ui.vue +++ b/src/client/app/mobile/views/components/ui.vue @@ -8,7 +8,7 @@ <div class="content"> <slot></slot> </div> - <mk-stream-indicator v-if="os.isSignedIn"/> + <mk-stream-indicator v-if="$store.getters.isSignedIn"/> </div> </template> @@ -32,7 +32,7 @@ export default Vue.extend({ }; }, mounted() { - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection = (this as any).os.stream.getConnection(); this.connectionId = (this as any).os.stream.use(); @@ -40,7 +40,7 @@ export default Vue.extend({ } }, beforeDestroy() { - if ((this as any).os.isSignedIn) { + if (this.$store.getters.isSignedIn) { this.connection.off('notification', this.onNotification); (this as any).os.stream.dispose(this.connectionId); } diff --git a/src/client/app/mobile/views/components/user-list-timeline.vue b/src/client/app/mobile/views/components/user-list-timeline.vue index 629151302c..2c1564b7ed 100644 --- a/src/client/app/mobile/views/components/user-list-timeline.vue +++ b/src/client/app/mobile/views/components/user-list-timeline.vue @@ -43,7 +43,7 @@ export default Vue.extend({ methods: { init() { if (this.connection) this.connection.close(); - this.connection = new UserListStream((this as any).os, (this as any).os.i, this.list.id); + this.connection = new UserListStream((this as any).os, this.$store.state.i, this.list.id); this.connection.on('note', this.onNote); this.connection.on('userAdded', this.onUserAdded); this.connection.on('userRemoved', this.onUserRemoved); @@ -58,8 +58,8 @@ export default Vue.extend({ (this as any).api('notes/user-list-timeline', { listId: this.list.id, limit: fetchLimit + 1, - includeMyRenotes: (this as any).clientSettings.showMyRenotes, - includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes }).then(notes => { if (notes.length == fetchLimit + 1) { notes.pop(); @@ -81,8 +81,8 @@ export default Vue.extend({ listId: this.list.id, limit: fetchLimit + 1, untilId: (this.$refs.timeline as any).tail().id, - includeMyRenotes: (this as any).clientSettings.showMyRenotes, - includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes }); promise.then(notes => { diff --git a/src/client/app/mobile/views/components/users-list.vue b/src/client/app/mobile/views/components/users-list.vue index 6175067459..a57b821293 100644 --- a/src/client/app/mobile/views/components/users-list.vue +++ b/src/client/app/mobile/views/components/users-list.vue @@ -2,7 +2,7 @@ <div class="mk-users-list"> <nav> <span :data-active="mode == 'all'" @click="mode = 'all'">%i18n:@all%<span>{{ count }}</span></span> - <span v-if="os.isSignedIn && youKnowCount" :data-active="mode == 'iknow'" @click="mode = 'iknow'">%i18n:@known%<span>{{ youKnowCount }}</span></span> + <span v-if="$store.getters.isSignedIn && youKnowCount" :data-active="mode == 'iknow'" @click="mode = 'iknow'">%i18n:@known%<span>{{ youKnowCount }}</span></span> </nav> <div class="users" v-if="!fetching && users.length != 0"> <mk-user-preview v-for="u in users" :user="u" :key="u.id"/> diff --git a/src/client/app/mobile/views/pages/home.timeline.vue b/src/client/app/mobile/views/pages/home.timeline.vue index 9ebce53de7..364367b940 100644 --- a/src/client/app/mobile/views/pages/home.timeline.vue +++ b/src/client/app/mobile/views/pages/home.timeline.vue @@ -38,7 +38,7 @@ export default Vue.extend({ computed: { alone(): boolean { - return (this as any).os.i.followingCount == 0; + return this.$store.state.i.followingCount == 0; }, stream(): any { @@ -92,8 +92,8 @@ export default Vue.extend({ (this as any).api(this.endpoint, { limit: fetchLimit + 1, untilDate: this.date ? this.date.getTime() : undefined, - includeMyRenotes: (this as any).clientSettings.showMyRenotes, - includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes }).then(notes => { if (notes.length == fetchLimit + 1) { notes.pop(); @@ -114,8 +114,8 @@ export default Vue.extend({ const promise = (this as any).api(this.endpoint, { limit: fetchLimit + 1, untilId: (this.$refs.timeline as any).tail().id, - includeMyRenotes: (this as any).clientSettings.showMyRenotes, - includeRenotedMyNotes: (this as any).clientSettings.showRenotedMyNotes + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes }); promise.then(notes => { diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue index 33579185e1..c0c2ee8ab5 100644 --- a/src/client/app/mobile/views/pages/home.vue +++ b/src/client/app/mobile/views/pages/home.vue @@ -87,7 +87,7 @@ export default Vue.extend({ if (this.src == 'list') { this.list = this.$store.state.device.tl.arg; } - } else if ((this as any).os.i.followingCount == 0) { + } else if (this.$store.state.i.followingCount == 0) { this.src = 'local'; } }, diff --git a/src/client/app/mobile/views/pages/index.vue b/src/client/app/mobile/views/pages/index.vue index 0ea47d913b..5d11fc5423 100644 --- a/src/client/app/mobile/views/pages/index.vue +++ b/src/client/app/mobile/views/pages/index.vue @@ -1,5 +1,5 @@ <template> -<component :is="os.isSignedIn ? 'home' : 'welcome'"></component> +<component :is="$store.getters.isSignedIn ? 'home' : 'welcome'"></component> </template> <script lang="ts"> diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index 3bb25f88f8..8da7a76633 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -17,22 +17,22 @@ </div> <div> - <md-switch v-model="clientSettings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</md-switch> + <md-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</md-switch> </div> <div> <div class="md-body-2">%i18n:@timeline%</div> <div> - <md-switch v-model="clientSettings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</md-switch> + <md-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</md-switch> </div> <div> - <md-switch v-model="clientSettings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</md-switch> + <md-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</md-switch> </div> <div> - <md-switch v-model="clientSettings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</md-switch> + <md-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</md-switch> </div> </div> @@ -52,11 +52,11 @@ <md-card-content> <div> - <md-switch v-model="clientSettings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</md-switch> + <md-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</md-switch> </div> <div> - <md-switch v-model="clientSettings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</md-switch> + <md-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</md-switch> </div> <div> @@ -64,7 +64,7 @@ </div> <div> - <md-switch v-model="clientSettings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</md-switch> + <md-switch v-model="$store.state.settings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</md-switch> </div> <div> @@ -100,11 +100,11 @@ </md-card-header> <md-card-content> - <p class="account" v-if="os.i.twitter"><a :href="`https://twitter.com/${os.i.twitter.screenName}`" target="_blank">@{{ os.i.twitter.screenName }}</a></p> + <p class="account" v-if="$store.state.i.twitter"><a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p> <p> - <a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ os.i.twitter ? '%i18n:@twitter-reconnect%' : '%i18n:@twitter-connect%' }}</a> - <span v-if="os.i.twitter"> or </span> - <a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="os.i.twitter">%i18n:@twitter-disconnect%</a> + <a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ $store.state.i.twitter ? '%i18n:@twitter-reconnect%' : '%i18n:@twitter-connect%' }}</a> + <span v-if="$store.state.i.twitter"> or </span> + <a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter">%i18n:@twitter-disconnect%</a> </p> </md-card-content> </md-card> @@ -156,7 +156,7 @@ export default Vue.extend({ computed: { name(): string { - return Vue.filter('userName')((this as any).os.i); + return Vue.filter('userName')(this.$store.state.i); }, darkmode: { diff --git a/src/client/app/mobile/views/pages/settings/settings.profile.vue b/src/client/app/mobile/views/pages/settings/settings.profile.vue index c16c44e133..f3444eb1f0 100644 --- a/src/client/app/mobile/views/pages/settings/settings.profile.vue +++ b/src/client/app/mobile/views/pages/settings/settings.profile.vue @@ -82,15 +82,15 @@ export default Vue.extend({ }, created() { - this.name = (this as any).os.i.name || ''; - this.username = (this as any).os.i.username; - this.location = (this as any).os.i.profile.location; - this.description = (this as any).os.i.description; - this.birthday = (this as any).os.i.profile.birthday; - this.avatarId = (this as any).os.i.avatarId; - this.bannerId = (this as any).os.i.bannerId; - this.isBot = (this as any).os.i.isBot; - this.isCat = (this as any).os.i.isCat; + this.name = this.$store.state.i.name || ''; + this.username = this.$store.state.i.username; + this.location = this.$store.state.i.profile.location; + this.description = this.$store.state.i.description; + this.birthday = this.$store.state.i.profile.birthday; + this.avatarId = this.$store.state.i.avatarId; + this.bannerId = this.$store.state.i.bannerId; + this.isBot = this.$store.state.i.isBot; + this.isCat = this.$store.state.i.isCat; }, methods: { @@ -99,7 +99,7 @@ export default Vue.extend({ const data = new FormData(); data.append('file', file); - data.append('i', (this as any).os.i.token); + data.append('i', this.$store.state.i.token); fetch(apiUrl + '/drive/files/create', { method: 'POST', @@ -121,7 +121,7 @@ export default Vue.extend({ const data = new FormData(); data.append('file', file); - data.append('i', (this as any).os.i.token); + data.append('i', this.$store.state.i.token); fetch(apiUrl + '/drive/files/create', { method: 'POST', @@ -152,10 +152,10 @@ export default Vue.extend({ isCat: this.isCat }).then(i => { this.saving = false; - (this as any).os.i.avatarId = i.avatarId; - (this as any).os.i.avatarUrl = i.avatarUrl; - (this as any).os.i.bannerId = i.bannerId; - (this as any).os.i.bannerUrl = i.bannerUrl; + this.$store.state.i.avatarId = i.avatarId; + this.$store.state.i.avatarUrl = i.avatarUrl; + this.$store.state.i.bannerId = i.bannerId; + this.$store.state.i.bannerUrl = i.bannerUrl; alert('%i18n:@saved%'); }); diff --git a/src/client/app/mobile/views/pages/user.vue b/src/client/app/mobile/views/pages/user.vue index 84fd7eda02..b3b820650c 100644 --- a/src/client/app/mobile/views/pages/user.vue +++ b/src/client/app/mobile/views/pages/user.vue @@ -11,7 +11,7 @@ <a class="avatar"> <img :src="user.avatarUrl" alt="avatar"/> </a> - <mk-follow-button v-if="os.isSignedIn && os.i.id != user.id" :user="user"/> + <mk-follow-button v-if="$store.getters.isSignedIn && $store.state.i.id != user.id" :user="user"/> </div> <div class="title"> <h1>{{ user | userName }}</h1> diff --git a/src/client/app/mobile/views/pages/user/home.vue b/src/client/app/mobile/views/pages/user/home.vue index d02daf5027..8b57276b17 100644 --- a/src/client/app/mobile/views/pages/user/home.vue +++ b/src/client/app/mobile/views/pages/user/home.vue @@ -25,7 +25,7 @@ <x-friends :user="user"/> </div> </section> - <section class="followers-you-know" v-if="os.isSignedIn && os.i.id !== user.id"> + <section class="followers-you-know" v-if="$store.getters.isSignedIn && $store.state.i.id !== user.id"> <h2>%fa:users%%i18n:@followers-you-know%</h2> <div> <x-followers-you-know :user="user"/> diff --git a/src/client/app/mobile/views/widgets/activity.vue b/src/client/app/mobile/views/widgets/activity.vue index 7763be41f5..85f925ceda 100644 --- a/src/client/app/mobile/views/widgets/activity.vue +++ b/src/client/app/mobile/views/widgets/activity.vue @@ -3,7 +3,7 @@ <mk-widget-container :show-header="!props.compact"> <template slot="header">%fa:chart-bar%アクティビティ</template> <div :class="$style.body"> - <mk-activity :user="os.i"/> + <mk-activity :user="$store.state.i"/> </div> </mk-widget-container> </div> diff --git a/src/client/app/mobile/views/widgets/profile.vue b/src/client/app/mobile/views/widgets/profile.vue index 59c1ec7c0e..a94f7e94b8 100644 --- a/src/client/app/mobile/views/widgets/profile.vue +++ b/src/client/app/mobile/views/widgets/profile.vue @@ -2,13 +2,13 @@ <div class="mkw-profile"> <mk-widget-container> <div :class="$style.banner" - :style="os.i.bannerUrl ? `background-image: url(${os.i.bannerUrl}?thumbnail&size=256)` : ''" + :style="$store.state.i.bannerUrl ? `background-image: url(${$store.state.i.bannerUrl}?thumbnail&size=256)` : ''" ></div> <img :class="$style.avatar" - :src="`${os.i.avatarUrl}?thumbnail&size=96`" + :src="`${$store.state.i.avatarUrl}?thumbnail&size=96`" alt="avatar" /> - <router-link :class="$style.name" :to="os.i | userPage">{{ os.i | userName }}</router-link> + <router-link :class="$style.name" :to="$store.state.i | userPage">{{ $store.state.i | userName }}</router-link> </mk-widget-container> </div> </template> diff --git a/src/client/app/store.ts b/src/client/app/store.ts index e787b41464..c27ff0dfcf 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -2,6 +2,7 @@ import Vuex from 'vuex'; import createPersistedState from 'vuex-persistedstate'; import MiOS from './mios'; +import { hostname } from './config'; const defaultSettings = { home: [], @@ -33,23 +34,29 @@ const defaultDeviceSettings = { }; export default (os: MiOS) => new Vuex.Store({ - plugins: [store => { - store.subscribe((mutation, state) => { - if (mutation.type.startsWith('settings/')) { - localStorage.setItem('settings', JSON.stringify(state.settings)); - } - }); - }, createPersistedState({ - paths: ['device'], - filter: mut => mut.type.startsWith('device/') + plugins: [createPersistedState({ + paths: ['i', 'device', 'settings'] })], state: { + i: null, indicate: false, uiHeaderHeight: 0 }, + getters: { + isSignedIn: state => state.i != null + }, + mutations: { + updateI(state, x) { + state.i = x; + }, + + updateIKeyValue(state, x) { + state.i[x.key] = x.value; + }, + indicate(state, x) { state.indicate = x; }, @@ -59,6 +66,28 @@ export default (os: MiOS) => new Vuex.Store({ } }, + actions: { + login(ctx, i) { + ctx.commit('updateI', i); + ctx.dispatch('settings/merge', i.clientSettings); + }, + + logout(ctx) { + ctx.commit('updateI', null); + document.cookie = `i=; domain=${hostname}; expires=Thu, 01 Jan 1970 00:00:01 GMT;`; + }, + + mergeMe(ctx, me) { + Object.entries(me).forEach(([key, value]) => { + ctx.commit('updateIKeyValue', { key, value }); + }); + + if (me.clientSettings) { + ctx.dispatch('settings/merge', me.clientSettings); + } + }, + }, + modules: { device: { namespaced: true, @@ -134,7 +163,7 @@ export default (os: MiOS) => new Vuex.Store({ set(ctx, x) { ctx.commit('set', x); - if (os.isSignedIn) { + if (ctx.rootGetters.isSignedIn) { os.api('i/update_client_setting', { name: x.key, value: x.value From e477de6dd0998a96ff81e2133a657d3fec33eb89 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 27 May 2018 13:58:35 +0900 Subject: [PATCH 018/369] 2.18.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5688484b9c..e09491f26a 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.18.0", - "clientVersion": "1.0.5784", + "version": "2.18.1", + "clientVersion": "1.0.5789", "codename": "nighthike", "main": "./built/index.js", "private": true, From fa1a85f682302c3629326198b3cb5ecf738d3cd7 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 27 May 2018 18:12:39 +0900 Subject: [PATCH 019/369] Fix bug --- src/client/app/desktop/api/contextmenu.ts | 17 ++++++++--------- src/client/app/desktop/api/dialog.ts | 17 ++++++++--------- src/client/app/desktop/api/input.ts | 21 ++++++++++----------- src/client/app/desktop/api/notify.ts | 13 ++++++------- src/client/app/desktop/api/post.ts | 21 +++++++++------------ src/client/app/desktop/script.ts | 8 ++++---- 6 files changed, 45 insertions(+), 52 deletions(-) diff --git a/src/client/app/desktop/api/contextmenu.ts b/src/client/app/desktop/api/contextmenu.ts index b70d7122d3..c92f087551 100644 --- a/src/client/app/desktop/api/contextmenu.ts +++ b/src/client/app/desktop/api/contextmenu.ts @@ -1,16 +1,15 @@ +import OS from '../../mios'; import Ctx from '../views/components/context-menu.vue'; -export default function(e, menu, opts?) { +export default (os: OS) => (e, menu, opts?) => { const o = opts || {}; - const vm = new Ctx({ - propsData: { - menu, - x: e.pageX - window.pageXOffset, - y: e.pageY - window.pageYOffset, - } - }).$mount(); + const vm = os.new(Ctx, { + menu, + x: e.pageX - window.pageXOffset, + y: e.pageY - window.pageYOffset, + }); vm.$once('closed', () => { if (o.closed) o.closed(); }); document.body.appendChild(vm.$el); -} +}; diff --git a/src/client/app/desktop/api/dialog.ts b/src/client/app/desktop/api/dialog.ts index 07935485b0..32785cf828 100644 --- a/src/client/app/desktop/api/dialog.ts +++ b/src/client/app/desktop/api/dialog.ts @@ -1,16 +1,15 @@ +import OS from '../../mios'; import Dialog from '../views/components/dialog.vue'; -export default function(opts) { +export default (os: OS) => opts => { return new Promise<string>((res, rej) => { const o = opts || {}; - const d = new Dialog({ - propsData: { - title: o.title, - text: o.text, - modal: o.modal, - buttons: o.actions - } - }).$mount(); + const d = os.new(Dialog, { + title: o.title, + text: o.text, + modal: o.modal, + buttons: o.actions + }); d.$once('clicked', id => { res(id); }); diff --git a/src/client/app/desktop/api/input.ts b/src/client/app/desktop/api/input.ts index ce26a8112f..bd7bfa0129 100644 --- a/src/client/app/desktop/api/input.ts +++ b/src/client/app/desktop/api/input.ts @@ -1,20 +1,19 @@ +import OS from '../../mios'; import InputDialog from '../views/components/input-dialog.vue'; -export default function(opts) { +export default (os: OS) => opts => { return new Promise<string>((res, rej) => { const o = opts || {}; - const d = new InputDialog({ - propsData: { - title: o.title, - placeholder: o.placeholder, - default: o.default, - type: o.type || 'text', - allowEmpty: o.allowEmpty - } - }).$mount(); + const d = os.new(InputDialog, { + title: o.title, + placeholder: o.placeholder, + default: o.default, + type: o.type || 'text', + allowEmpty: o.allowEmpty + }); d.$once('done', text => { res(text); }); document.body.appendChild(d.$el); }); -} +}; diff --git a/src/client/app/desktop/api/notify.ts b/src/client/app/desktop/api/notify.ts index 1f89f40ce6..72e5827607 100644 --- a/src/client/app/desktop/api/notify.ts +++ b/src/client/app/desktop/api/notify.ts @@ -1,10 +1,9 @@ +import OS from '../../mios'; import Notification from '../views/components/ui-notification.vue'; -export default function(message) { - const vm = new Notification({ - propsData: { - message - } - }).$mount(); +export default (os: OS) => message => { + const vm = os.new(Notification, { + message + }); document.body.appendChild(vm.$el); -} +}; diff --git a/src/client/app/desktop/api/post.ts b/src/client/app/desktop/api/post.ts index b569610e1d..af71829c7b 100644 --- a/src/client/app/desktop/api/post.ts +++ b/src/client/app/desktop/api/post.ts @@ -1,21 +1,18 @@ +import OS from '../../mios'; import PostFormWindow from '../views/components/post-form-window.vue'; import RenoteFormWindow from '../views/components/renote-form-window.vue'; -export default function(opts) { +export default (os: OS) => opts => { const o = opts || {}; if (o.renote) { - const vm = new RenoteFormWindow({ - propsData: { - renote: o.renote - } - }).$mount(); + const vm = os.new(RenoteFormWindow, { + renote: o.renote + }); document.body.appendChild(vm.$el); } else { - const vm = new PostFormWindow({ - propsData: { - reply: o.reply - } - }).$mount(); + const vm = os.new(PostFormWindow, { + reply: o.reply + }); document.body.appendChild(vm.$el); } -} +}; diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts index 09a9257ea3..8fb6096afa 100644 --- a/src/client/app/desktop/script.ts +++ b/src/client/app/desktop/script.ts @@ -69,10 +69,10 @@ init(async (launch) => { const [, os] = launch(router, os => ({ chooseDriveFolder: chooseDriveFolder(os), chooseDriveFile: chooseDriveFile(os), - dialog, - input, - post, - notify, + dialog: dialog(os), + input: input(os), + post: post(os), + notify: notify(os), updateAvatar: updateAvatar(os), updateBanner: updateBanner(os) })); From 46ef86e478b6b32ec35ac70a8ecdf18e709bcf4f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 27 May 2018 18:18:18 +0900 Subject: [PATCH 020/369] :art: --- src/client/app/desktop/views/components/window.vue | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/client/app/desktop/views/components/window.vue b/src/client/app/desktop/views/components/window.vue index e4753f55db..ec044ad27e 100644 --- a/src/client/app/desktop/views/components/window.vue +++ b/src/client/app/desktop/views/components/window.vue @@ -488,7 +488,10 @@ root(isDark) &:focus &:not([data-is-modal]) > .body - box-shadow 0 0 0px 1px rgba($theme-color, 0.5), 0 2px 6px 0 rgba(#000, 0.2) + if isDark + box-shadow 0 0 0px 1px rgba($theme-color, 0.5), 0 2px 12px 0 rgba(#000, 0.5) + else + box-shadow 0 0 0px 1px rgba($theme-color, 0.5), 0 2px 6px 0 rgba(#000, 0.2) > .handle $size = 8px @@ -556,7 +559,11 @@ root(isDark) overflow hidden background isDark ? #282C37 : #fff border-radius 6px - box-shadow 0 2px 6px 0 rgba(#000, 0.2) + + if isDark + box-shadow 0 2px 12px 0 rgba(#000, 0.5) + else + box-shadow 0 2px 6px 0 rgba(#000, 0.2) > header $header-height = 40px From 46a953a9d8f2e155d67d436b8f32dfb7907f21ca Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 27 May 2018 18:18:51 +0900 Subject: [PATCH 021/369] 2.18.2 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e09491f26a..1850b22b9e 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.18.1", - "clientVersion": "1.0.5789", + "version": "2.18.2", + "clientVersion": "1.0.5793", "codename": "nighthike", "main": "./built/index.js", "private": true, From fd1eea21d2578ad3a2491ac48e833a4b227dc5d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Miko=C5=82ajczak?= <me@m4sk.in> Date: Sun, 27 May 2018 14:51:57 +0200 Subject: [PATCH 022/369] some moar i18n MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marcin Mikołajczak <me@m4sk.in> --- locales/ja.yml | 44 +++++++++++++++++++ .../views/components/drive.file-detail.vue | 2 +- .../app/mobile/views/components/drive.vue | 16 +++---- .../mobile/views/components/friends-maker.vue | 10 ++--- .../mobile/views/components/note-detail.vue | 6 +-- .../mobile/views/components/note-preview.vue | 6 +-- .../app/mobile/views/components/note.sub.vue | 6 +-- .../app/mobile/views/components/note.vue | 6 +-- .../app/mobile/views/components/notes.vue | 4 +- .../app/mobile/views/components/post-form.vue | 10 ++--- .../views/components/sub-note-content.vue | 2 +- 11 files changed, 78 insertions(+), 34 deletions(-) diff --git a/locales/ja.yml b/locales/ja.yml index 0fcbca5361..ab87494f93 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -724,6 +724,16 @@ mobile/views/components/drive.vue: load-more: "もっと読み込む" nothing-in-drive: "ドライブには何もありません" folder-is-empty: "このフォルダは空です" + prompt: "何をしますか?(数字を入力してください): <1 → ファイルをアップロード | 2 → ファイルをURLでアップロード | 3 → フォルダ作成 | 4 → このフォルダ名を変更 | 5 → このフォルダを移動 | 6 → このフォルダを削除>" + deletion-alert: "ごめんなさい!フォルダの削除は未実装です...。" + folder-name: "フォルダー名" + root-rename-alert: "現在いる場所はルートで、フォルダではないため名前の変更はできません。名前を変更したいフォルダに移動してからやってください。" + root-move-alert: "現在いる場所はルートで、フォルダではないため移動はできません。移動したいフォルダに移動してからやってください。" + url-prompt: "アップロードしたいファイルのURL" + uploading: "アップロードをリクエストしました。アップロードが完了するまで時間がかかる場合があります。" + +mobile/views/components/drive-file-detail.vue: + rename: "名前を変更" mobile/views/components/drive-file-chooser.vue: select-file: "ファイルを選択" @@ -742,26 +752,60 @@ mobile/views/components/follow-button.vue: follow: "フォロー" unfollow: "フォロー解除" +mobile/views/components/friends-maker.vue: + title: "気になるユーザーをフォロー" + empty: "おすすめのユーザーは見つかりませんでした。" + fetching: "読み込んでいます" + refresh: "もっと見る" + close: "閉じる" + mobile/views/components/note.vue: reposted-by: "{}がRenote" + more: "もっと見る" + less: "隠す" + hidden: "この投稿は非公開です" + location: "位置情報" mobile/views/components/note-detail.vue: reply: "返信" reaction: "リアクション" + is-renote: "がRenote" + hidden: "この投稿は非公開です" + location: "位置情報" + +mobile/views/components/note-preview.vue: + admin: "admin" + bot: "bot" + cat: "cat" + +mobile/views/components/note-sub.vue: + admin: "admin" + bot: "bot" + cat: "cat" + +mobile/views/components/notes.vue: + failed: "読み込みに失敗しました。" + retry: "リトライ" mobile/views/components/notifications.vue: more: "もっと見る" empty: "ありません!" mobile/views/components/post-form.vue: + add-visible-user: "ユーザーを追加" submit: "投稿" reply: "返信" renote: "Renote" renote-placeholder: "この投稿を引用... (オプション)" reply-placeholder: "この投稿への返信..." note-placeholder: "いまどうしてる?" + cw-placeholder: "内容への注釈 (オプション)" + location-alert: "お使いの端末は位置情報に対応していません" + error: "エラー" + username-prompt: "ユーザー名を入力してください" mobile/views/components/sub-note-content.vue: + hidden: "この投稿は非公開です" media-count: "{}個のメディア" poll: "投票" diff --git a/src/client/app/mobile/views/components/drive.file-detail.vue b/src/client/app/mobile/views/components/drive.file-detail.vue index ddf17d2723..ad29135268 100644 --- a/src/client/app/mobile/views/components/drive.file-detail.vue +++ b/src/client/app/mobile/views/components/drive.file-detail.vue @@ -93,7 +93,7 @@ export default Vue.extend({ }, methods: { rename() { - const name = window.prompt('名前を変更', this.file.name); + const name = window.prompt('%i18n:@rename%', this.file.name); if (name == null || name == '' || name == this.file.name) return; (this as any).api('drive/files/update', { fileId: this.file.id, diff --git a/src/client/app/mobile/views/components/drive.vue b/src/client/app/mobile/views/components/drive.vue index 8e35e6c88b..8adf6d8543 100644 --- a/src/client/app/mobile/views/components/drive.vue +++ b/src/client/app/mobile/views/components/drive.vue @@ -372,7 +372,7 @@ export default Vue.extend({ }, openContextMenu() { - const fn = window.prompt('何をしますか?(数字を入力してください): <1 → ファイルをアップロード | 2 → ファイルをURLでアップロード | 3 → フォルダ作成 | 4 → このフォルダ名を変更 | 5 → このフォルダを移動 | 6 → このフォルダを削除>'); + const fn = window.prompt('%i18n:@prompt%'); if (fn == null || fn == '') return; switch (fn) { case '1': @@ -391,7 +391,7 @@ export default Vue.extend({ this.moveFolder(); break; case '6': - alert('ごめんなさい!フォルダの削除は未実装です...。'); + alert('%i18n:@deletion-alert%'); break; } }, @@ -401,7 +401,7 @@ export default Vue.extend({ }, createFolder() { - const name = window.prompt('フォルダー名'); + const name = window.prompt('%i18n:@folder-name%'); if (name == null || name == '') return; (this as any).api('drive/folders/create', { name: name, @@ -413,10 +413,10 @@ export default Vue.extend({ renameFolder() { if (this.folder == null) { - alert('現在いる場所はルートで、フォルダではないため名前の変更はできません。名前を変更したいフォルダに移動してからやってください。'); + alert('%i18n:@root-rename-alert%'); return; } - const name = window.prompt('フォルダー名', this.folder.name); + const name = window.prompt('%i18n:@folder-name%', this.folder.name); if (name == null || name == '') return; (this as any).api('drive/folders/update', { name: name, @@ -428,7 +428,7 @@ export default Vue.extend({ moveFolder() { if (this.folder == null) { - alert('現在いる場所はルートで、フォルダではないため移動はできません。移動したいフォルダに移動してからやってください。'); + alert('%i18n:@root-move-alert%'); return; } (this as any).apis.chooseDriveFolder().then(folder => { @@ -442,13 +442,13 @@ export default Vue.extend({ }, urlUpload() { - const url = window.prompt('アップロードしたいファイルのURL'); + const url = window.prompt('%i18n:@url-prompt%'); if (url == null || url == '') return; (this as any).api('drive/files/upload_from_url', { url: url, folderId: this.folder ? this.folder.id : undefined }); - alert('アップロードをリクエストしました。アップロードが完了するまで時間がかかる場合があります。'); + alert('%i18n:@uploading%'); }, onChangeLocalFile() { diff --git a/src/client/app/mobile/views/components/friends-maker.vue b/src/client/app/mobile/views/components/friends-maker.vue index ba4abe341f..e0461d2bc2 100644 --- a/src/client/app/mobile/views/components/friends-maker.vue +++ b/src/client/app/mobile/views/components/friends-maker.vue @@ -1,13 +1,13 @@ <template> <div class="mk-friends-maker"> - <p class="title">気になるユーザーをフォロー:</p> + <p class="title">%i18n:@title%:</p> <div class="users" v-if="!fetching && users.length > 0"> <mk-user-card v-for="user in users" :key="user.id" :user="user"/> </div> - <p class="empty" v-if="!fetching && users.length == 0">おすすめのユーザーは見つかりませんでした。</p> - <p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%読み込んでいます<mk-ellipsis/></p> - <a class="refresh" @click="refresh">もっと見る</a> - <button class="close" @click="close" title="閉じる">%fa:times%</button> + <p class="empty" v-if="!fetching && users.length == 0">%i18n:@empty%</p> + <p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@fetching%<mk-ellipsis/></p> + <a class="refresh" @click="refresh">%i18n:@refresh%</a> + <button class="close" @click="close" title="%i18n:@close%">%fa:times%</button> </div> </template> diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index eb934431d2..9282848d7a 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -17,7 +17,7 @@ </div> <div class="renote" v-if="isRenote"> <p> - <mk-avatar class="avatar" :user="note.user"/>%fa:retweet%<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>がRenote + <mk-avatar class="avatar" :user="note.user"/>%fa:retweet%<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>%i18n:@is-renote% </p> </div> <article> @@ -30,7 +30,7 @@ </header> <div class="body"> <div class="text"> - <span v-if="p.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span> + <span v-if="p.isHidden" style="opacity: 0.5">(%i18n:@hidden%)</span> <mk-note-html v-if="p.text" :text="p.text" :i="$store.state.i"/> </div> <div class="tags" v-if="p.tags && p.tags.length > 0"> @@ -41,7 +41,7 @@ </div> <mk-poll v-if="p.poll" :note="p"/> <mk-url-preview v-for="url in urls" :url="url" :key="url"/> - <a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a> + <a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> <div class="map" v-if="p.geo" ref="map"></div> <div class="renote" v-if="p.renote"> <mk-note-preview :note="p.renote"/> diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue index f3805ac481..1c97e610d7 100644 --- a/src/client/app/mobile/views/components/note-preview.vue +++ b/src/client/app/mobile/views/components/note-preview.vue @@ -5,9 +5,9 @@ <header> <mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/> <router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link> - <span class="is-admin" v-if="note.user.isAdmin">admin</span> - <span class="is-bot" v-if="note.user.isBot">bot</span> - <span class="is-cat" v-if="note.user.isCat">cat</span> + <span class="is-admin" v-if="note.user.isAdmin">%i18n:@admin%</span> + <span class="is-bot" v-if="note.user.isBot">%i18n:@bot%</span> + <span class="is-cat" v-if="note.user.isCat">%i18n:@cat%</span> <span class="username"><mk-acct :user="note.user"/></span> <router-link class="time" :to="note | notePage"> <mk-time :time="note.createdAt"/> diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue index 149a78ecde..42787e6d75 100644 --- a/src/client/app/mobile/views/components/note.sub.vue +++ b/src/client/app/mobile/views/components/note.sub.vue @@ -5,9 +5,9 @@ <header> <mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/> <router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link> - <span class="is-admin" v-if="note.user.isAdmin">admin</span> - <span class="is-bot" v-if="note.user.isBot">bot</span> - <span class="is-cat" v-if="note.user.isCat">cat</span> + <span class="is-admin" v-if="note.user.isAdmin">%i18n:@admin%</span> + <span class="is-bot" v-if="note.user.isBot">%i18n:@bot%</span> + <span class="is-cat" v-if="note.user.isCat">%i18n:@cat%</span> <span class="username"><mk-acct :user="note.user"/></span> <div class="info"> <span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span> diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 42d3ffe40e..5cc864f319 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -37,11 +37,11 @@ <div class="body"> <p v-if="p.cw != null" class="cw"> <span class="text" v-if="p.cw != ''">{{ p.cw }}</span> - <span class="toggle" @click="showContent = !showContent">{{ showContent ? '隠す' : 'もっと見る' }}</span> + <span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@less%' : '%i18n:@more%' }}</span> </p> <div class="content" v-show="p.cw == null || showContent"> <div class="text"> - <span v-if="p.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span> + <span v-if="p.isHidden" style="opacity: 0.5">(%i18n:@hidden%)</span> <a class="reply" v-if="p.reply">%fa:reply%</a> <mk-note-html v-if="p.text && !canHideText(p)" :text="p.text" :i="$store.state.i" :class="$style.text"/> <a class="rp" v-if="p.renote != null">RP:</a> @@ -54,7 +54,7 @@ <router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link> </div> <mk-url-preview v-for="url in urls" :url="url" :key="url"/> - <a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a> + <a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> <div class="map" v-if="p.geo" ref="map"></div> <div class="renote" v-if="p.renote"> <mk-note-preview :note="p.renote"/> diff --git a/src/client/app/mobile/views/components/notes.vue b/src/client/app/mobile/views/components/notes.vue index fbba111664..09cee966a3 100644 --- a/src/client/app/mobile/views/components/notes.vue +++ b/src/client/app/mobile/views/components/notes.vue @@ -9,8 +9,8 @@ </div> <div v-if="!fetching && requestInitPromise != null"> - <p>読み込みに失敗しました。</p> - <button @click="resolveInitPromise">リトライ</button> + <p>%i18n:@failed%</p> + <button @click="resolveInitPromise">%i18n:@retry%</button> </div> <transition-group name="mk-notes" class="transition"> diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index f999988c60..f5badb48cc 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -17,9 +17,9 @@ <mk-note-preview v-if="renote" :note="renote"/> <div v-if="visibility == 'specified'" class="visibleUsers"> <span v-for="u in visibleUsers">{{ u | userName }}<a @click="removeVisibleUser(u)">[x]</a></span> - <a @click="addVisibleUser">+ユーザーを追加</a> + <a @click="addVisibleUser">+%i18n:@add-visible-user%</a> </div> - <input v-show="useCw" v-model="cw" placeholder="内容への注釈 (オプション)"> + <input v-show="useCw" v-model="cw" placeholder="%i18n:@cw-placeholder%"> <textarea v-model="text" ref="text" :disabled="posting" :placeholder="reply ? '%i18n:@reply-placeholder%' : renote ? '%i18n:@renote-placeholder%' : '%i18n:@note-placeholder%'"></textarea> <div class="attaches" v-show="files.length != 0"> <x-draggable class="files" :list="files" :options="{ animation: 150 }"> @@ -141,14 +141,14 @@ export default Vue.extend({ setGeo() { if (navigator.geolocation == null) { - alert('お使いの端末は位置情報に対応していません'); + alert('%i18n:@location-alert%'); return; } navigator.geolocation.getCurrentPosition(pos => { this.geo = pos.coords; }, err => { - alert('エラー: ' + err.message); + alert('%i18n:@error%: ' + err.message); }, { enableHighAccuracy: true }); @@ -171,7 +171,7 @@ export default Vue.extend({ addVisibleUser() { (this as any).apis.input({ - title: 'ユーザー名を入力してください' + title: '%i18n:@username-prompt%' }).then(username => { (this as any).api('users/show', { username diff --git a/src/client/app/mobile/views/components/sub-note-content.vue b/src/client/app/mobile/views/components/sub-note-content.vue index bb96d65147..023dec70d2 100644 --- a/src/client/app/mobile/views/components/sub-note-content.vue +++ b/src/client/app/mobile/views/components/sub-note-content.vue @@ -1,7 +1,7 @@ <template> <div class="mk-sub-note-content"> <div class="body"> - <span v-if="note.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span> + <span v-if="note.isHidden" style="opacity: 0.5">(%i18n:@hidden%)</span> <a class="reply" v-if="note.replyId">%fa:reply%</a> <mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/> <a class="rp" v-if="note.renoteId">RP: ...</a> From 0d6ccd489dce89c2920bc806216b9c2585fe1a88 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 27 May 2018 22:39:20 +0900 Subject: [PATCH 023/369] :v: --- locales/ja.yml | 46 +++++--- src/client/app/common/views/widgets/index.ts | 2 + src/client/app/common/views/widgets/memo.vue | 110 ++++++++++++++++++ .../app/desktop/views/components/home.vue | 39 ++++--- src/client/app/mobile/views/pages/widgets.vue | 23 ++-- src/client/app/store.ts | 3 +- 6 files changed, 173 insertions(+), 50 deletions(-) create mode 100644 src/client/app/common/views/widgets/memo.vue diff --git a/locales/ja.yml b/locales/ja.yml index ab87494f93..90764f7e60 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -43,6 +43,28 @@ common: update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。" my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" + widgets: + profile: "プロフィール" + calendar: "カレンダー" + timemachine: "カレンダー(タイムマシン)" + activity: "アクティビティ" + rss: "RSSリーダー" + memo: "メモ" + trends: "トレンド" + photo-stream: "フォトストリーム" + slideshow: "スライドショー" + version: "バージョン" + broadcast: "ブロードキャスト" + notifications: "通知" + users: "おすすめユーザー" + polls: "投票" + post-form: "投稿フォーム" + messaging: "メッセージ" + server: "サーバー情報" + donation: "寄付のお願い" + nav: "ナビゲーション" + tips: "ヒント" + common/views/components/connect-failed.vue: title: "サーバーに接続できません" description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。" @@ -201,6 +223,11 @@ common/views/widgets/server.vue: title: "サーバー情報" toggle: "表示を切り替え" +common/views/widgets/memo.vue: + title: "メモ" + memo: "ここに書いて!" + save: "保存" + desktop/views/components/activity.chart.vue: total: "Black ... Total" notes: "Blue ... Notes" @@ -319,25 +346,6 @@ desktop/views/components/game-window.vue: desktop/views/components/home.vue: done: "完了" add-widget: "ウィジェットを追加:" - profile: "プロフィール" - calendar: "カレンダー" - timemachine: "カレンダー(タイムマシン)" - activity: "アクティビティ" - rss: "RSSリーダー" - trends: "トレンド" - photostream: "フォトストリーム" - slideshow: "スライドショー" - version: "バージョン" - broadcast: "ブロードキャスト" - notifications: "通知" - users: "おすすめユーザー" - polls: "投票" - post-form: "投稿フォーム" - messaging: "メッセージ" - server: "サーバー情報" - donation: "寄付のお願い" - nav: "ナビゲーション" - tips: "ヒント" add: "追加" desktop/views/input-dialog.vue: diff --git a/src/client/app/common/views/widgets/index.ts b/src/client/app/common/views/widgets/index.ts index 9107d90ce7..7ef4e02092 100644 --- a/src/client/app/common/views/widgets/index.ts +++ b/src/client/app/common/views/widgets/index.ts @@ -3,6 +3,7 @@ import Vue from 'vue'; import wVersion from './version.vue'; import wRss from './rss.vue'; import wServer from './server.vue'; +import wMemo from './memo.vue'; import wBroadcast from './broadcast.vue'; import wCalendar from './calendar.vue'; import wPhotoStream from './photo-stream.vue'; @@ -19,5 +20,6 @@ Vue.component('mkw-tips', wTips); Vue.component('mkw-donation', wDonation); Vue.component('mkw-broadcast', wBroadcast); Vue.component('mkw-server', wServer); +Vue.component('mkw-memo', wMemo); Vue.component('mkw-rss', wRss); Vue.component('mkw-version', wVersion); diff --git a/src/client/app/common/views/widgets/memo.vue b/src/client/app/common/views/widgets/memo.vue new file mode 100644 index 0000000000..3f599c82a0 --- /dev/null +++ b/src/client/app/common/views/widgets/memo.vue @@ -0,0 +1,110 @@ +<template> +<div class="mkw-memo"> + <mk-widget-container :show-header="!props.compact"> + <template slot="header">%fa:R sticky-note%%i18n:@title%</template> + + <div class="mkw-memo--body"> + <textarea v-model="text" placeholder="%i18n:@memo%" @input="onChange"></textarea> + <button @click="saveMemo" :disabled="!changed">%i18n:@save%</button> + </div> + </mk-widget-container> +</div> +</template> + +<script lang="ts"> +import define from '../../define-widget'; + +export default define({ + name: 'memo', + props: () => ({ + compact: false + }) +}).extend({ + data() { + return { + text: null, + changed: false + }; + }, + + created() { + this.text = this.$store.state.settings.memo; + + this.$watch('$store.state.settings.memo', text => { + this.text = text; + }); + }, + + methods: { + func() { + this.props.compact = !this.props.compact; + this.save(); + }, + + onChange() { + this.changed = true; + }, + + saveMemo() { + this.$store.dispatch('settings/set', { + key: 'memo', + value: this.text + }); + this.changed = false; + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +root(isDark) + .mkw-memo--body + padding-bottom 28px + 16px + + > textarea + display block + width 100% + max-width 100% + min-width 100% + padding 16px + color isDark ? #fff : #222 + background isDark ? #282c37 : #fff + border none + border-bottom solid 1px isDark ? #1c2023 : #eee + + > button + display block + position absolute + bottom 8px + right 8px + margin 0 + padding 0 10px + height 28px + color $theme-color-foreground + background $theme-color !important + outline none + border none + border-radius 4px + transition background 0.1s ease + cursor pointer + + &:hover + background lighten($theme-color, 10%) !important + + &:active + background darken($theme-color, 10%) !important + transition background 0s ease + + &:disabled + opacity 0.7 + cursor default + +.mkw-memo[data-darkmode] + root(true) + +.mkw-memo:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index 9d34575e55..f51fed7454 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -6,25 +6,26 @@ <div class="adder"> <p>%i18n:@add-widget%</p> <select v-model="widgetAdderSelected"> - <option value="profile">%i18n:@profile%</option> - <option value="calendar">%i18n:@calendar%</option> - <option value="timemachine">%i18n:@timemachine%</option> - <option value="activity">%i18n:@activity%</option> - <option value="rss">%i18n:@rss%</option> - <option value="trends">%i18n:@trends%</option> - <option value="photo-stream">%i18n:@photo-stream%</option> - <option value="slideshow">%i18n:@slideshow%</option> - <option value="version">%i18n:@version%</option> - <option value="broadcast">%i18n:@broadcast%</option> - <option value="notifications">%i18n:@notifications%</option> - <option value="users">%i18n:@users%</option> - <option value="polls">%i18n:@polls%</option> - <option value="post-form">%i18n:@post-form%</option> - <option value="messaging">%i18n:@messaging%</option> - <option value="server">%i18n:@server%</option> - <option value="donation">%i18n:@donation%</option> - <option value="nav">%i18n:@nav%</option> - <option value="tips">%i18n:@tips%</option> + <option value="profile">%i18n:common.widgets.profile%</option> + <option value="calendar">%i18n:common.widgets.calendar%</option> + <option value="timemachine">%i18n:common.widgets.timemachine%</option> + <option value="activity">%i18n:common.widgets.activity%</option> + <option value="rss">%i18n:common.widgets.rss%</option> + <option value="trends">%i18n:common.widgets.trends%</option> + <option value="photo-stream">%i18n:common.widgets.photo-stream%</option> + <option value="slideshow">%i18n:common.widgets.slideshow%</option> + <option value="version">%i18n:common.widgets.version%</option> + <option value="broadcast">%i18n:common.widgets.broadcast%</option> + <option value="notifications">%i18n:common.widgets.notifications%</option> + <option value="users">%i18n:common.widgets.users%</option> + <option value="polls">%i18n:common.widgets.polls%</option> + <option value="post-form">%i18n:common.widgets.post-form%</option> + <option value="messaging">%i18n:common.widgets.messaging%</option> + <option value="memo">%i18n:common.widgets.memo%</option> + <option value="server">%i18n:common.widgets.server%</option> + <option value="donation">%i18n:common.widgets.donation%</option> + <option value="nav">%i18n:common.widgets.nav%</option> + <option value="tips">%i18n:common.widgets.tips%</option> </select> <button @click="addWidget">%i18n:@add%</button> </div> diff --git a/src/client/app/mobile/views/pages/widgets.vue b/src/client/app/mobile/views/pages/widgets.vue index 03abcabe8f..9d047fa635 100644 --- a/src/client/app/mobile/views/pages/widgets.vue +++ b/src/client/app/mobile/views/pages/widgets.vue @@ -8,17 +8,18 @@ <template v-if="customizing"> <header> <select v-model="widgetAdderSelected"> - <option value="profile">プロフィール</option> - <option value="calendar">カレンダー</option> - <option value="activity">アクティビティ</option> - <option value="rss">RSSリーダー</option> - <option value="photo-stream">フォトストリーム</option> - <option value="slideshow">スライドショー</option> - <option value="version">バージョン</option> - <option value="server">サーバー情報</option> - <option value="donation">寄付のお願い</option> - <option value="nav">ナビゲーション</option> - <option value="tips">ヒント</option> + <option value="profile">%i18n:common.widgets.profile%</option> + <option value="calendar">%i18n:common.widgets.calendar%</option> + <option value="activity">%i18n:common.widgets.activity%</option> + <option value="rss">%i18n:common.widgets.rss%</option> + <option value="photo-stream">%i18n:common.widgets.photo-stream%</option> + <option value="slideshow">%i18n:common.widgets.slideshow%</option> + <option value="version">%i18n:common.widgets.version%</option> + <option value="server">%i18n:common.widgets.server%</option> + <option value="memo">%i18n:common.widgets.memo%</option> + <option value="donation">%i18n:common.widgets.donation%</option> + <option value="nav">%i18n:common.widgets.nav%</option> + <option value="tips">%i18n:common.widgets.tips%</option> </select> <button @click="addWidget">追加</button> <p><a @click="hint">カスタマイズのヒント</a></p> diff --git a/src/client/app/store.ts b/src/client/app/store.ts index c27ff0dfcf..905ec0501c 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -16,7 +16,8 @@ const defaultSettings = { showMyRenotes: true, showRenotedMyNotes: true, loadRemoteMedia: true, - disableViaMobile: false + disableViaMobile: false, + memo: null }; const defaultDeviceSettings = { From 4ff95be53bdd9db382cbb92b5dbb4dabd0c78ad2 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 27 May 2018 22:41:05 +0900 Subject: [PATCH 024/369] Fix --- src/client/app/mobile/views/widgets/profile.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/mobile/views/widgets/profile.vue b/src/client/app/mobile/views/widgets/profile.vue index a94f7e94b8..beae1ffa36 100644 --- a/src/client/app/mobile/views/widgets/profile.vue +++ b/src/client/app/mobile/views/widgets/profile.vue @@ -56,7 +56,7 @@ export default define({ left 92px margin 0 line-height 100px - color #fff + color #fff !important // !important is for md font-weight bold text-shadow 0 0 8px rgba(#000, 0.5) From c5ef18bc7a3c19bb73d3bc1fb67c6e6ad45735df Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 27 May 2018 22:52:14 +0900 Subject: [PATCH 025/369] Fix --- locales/ja.yml | 2 +- src/client/app/mobile/views/components/note-detail.vue | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/locales/ja.yml b/locales/ja.yml index 90764f7e60..06ef453de8 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -777,7 +777,7 @@ mobile/views/components/note.vue: mobile/views/components/note-detail.vue: reply: "返信" reaction: "リアクション" - is-renote: "がRenote" + reposted-by: "{}がRenote" hidden: "この投稿は非公開です" location: "位置情報" diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index 9282848d7a..91b8c20111 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -17,7 +17,13 @@ </div> <div class="renote" v-if="isRenote"> <p> - <mk-avatar class="avatar" :user="note.user"/>%fa:retweet%<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>%i18n:@is-renote% + <mk-avatar class="avatar" :user="note.user"/> + %fa:retweet% + <router-link class="name" :href="note.user | userPage">{{ note.user | userName }}</router-link> + <span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span> + <a class="name" :href="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</a> + <span>{{ '%i18n:@reposted-by%'.substr('%i18n:@reposted-by%'.indexOf('}') + 1) }}</span> + <mk-time :time="note.createdAt"/> </p> </div> <article> From 79821f00fbc5f3ca0386559885a40bb8a132b735 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 27 May 2018 23:19:57 +0900 Subject: [PATCH 026/369] Fix bug --- src/services/drive/add-file.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts index 0e42a00bf6..35a7a42d80 100644 --- a/src/services/drive/add-file.ts +++ b/src/services/drive/add-file.ts @@ -226,7 +226,7 @@ export default async function( const properties = {}; - let propPromises = []; + let propPromises: Array<Promise<void>> = []; const isImage = ['image/jpeg', 'image/gif', 'image/png'].includes(mime); @@ -271,7 +271,7 @@ export default async function( propPromises = [calcWh(), calcAvg()]; } - const [folder] = await Promise.all([fetchFolder(), propPromises]); + const [folder] = await Promise.all([fetchFolder(), Promise.all(propPromises)]); const metadata = { userId: user._id, From ed862188176047809ea7c41d923878db24e4b804 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 27 May 2018 23:20:45 +0900 Subject: [PATCH 027/369] 2.19.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 1850b22b9e..9a99154773 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.18.2", - "clientVersion": "1.0.5793", + "version": "2.19.0", + "clientVersion": "1.0.5840", "codename": "nighthike", "main": "./built/index.js", "private": true, From 1a91b6d03e4972c6683ee4313e2142a941ff8a3b Mon Sep 17 00:00:00 2001 From: Zero King <l2dy@icloud.com> Date: Sun, 27 May 2018 16:09:59 +0000 Subject: [PATCH 028/369] Fix --- src/client/app/desktop/api/dialog.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/desktop/api/dialog.ts b/src/client/app/desktop/api/dialog.ts index 32785cf828..23f35b7aa9 100644 --- a/src/client/app/desktop/api/dialog.ts +++ b/src/client/app/desktop/api/dialog.ts @@ -15,4 +15,4 @@ export default (os: OS) => opts => { }); document.body.appendChild(d.$el); }); -} +}; From fe30e4e3a5360c534952ed837e1277d13444f606 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 13:55:21 +0900 Subject: [PATCH 029/369] Fix bug --- src/client/app/desktop/views/components/timeline.core.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/client/app/desktop/views/components/timeline.core.vue b/src/client/app/desktop/views/components/timeline.core.vue index 44d5967db5..1728dad286 100644 --- a/src/client/app/desktop/views/components/timeline.core.vue +++ b/src/client/app/desktop/views/components/timeline.core.vue @@ -5,7 +5,7 @@ <mk-ellipsis-icon/> </div> - <mk-notes ref="timeline" :more="canFetchMore ? more : null"> + <mk-notes ref="timeline" :more="existMore ? more : null"> <p :class="$style.empty" slot="empty"> %fa:R comments%%i18n:@empty% </p> @@ -15,7 +15,6 @@ <script lang="ts"> import Vue from 'vue'; -import getNoteSummary from '../../../../../renderers/get-note-summary'; const fetchLimit = 10; From 85114ebd743b528dfb9bf1989a215f919defc68b Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 13:58:57 +0900 Subject: [PATCH 030/369] :art: --- src/client/app/desktop/views/components/notes.note.sub.vue | 1 + src/client/app/desktop/views/components/notes.note.vue | 1 + src/client/app/mobile/views/components/note-preview.vue | 1 + src/client/app/mobile/views/components/note.sub.vue | 1 + src/client/app/mobile/views/components/note.vue | 1 + 5 files changed, 5 insertions(+) diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue index 5f0c46b4c6..997e1d5050 100644 --- a/src/client/app/desktop/views/components/notes.note.sub.vue +++ b/src/client/app/desktop/views/components/notes.note.sub.vue @@ -89,6 +89,7 @@ root(isDark) > .is-admin > .is-bot > .is-cat + align-self center margin 0 0.5em 0 0 padding 1px 5px font-size 10px diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index e69e6cdb51..c4ad67c2f8 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -435,6 +435,7 @@ root(isDark) > .is-admin > .is-bot > .is-cat + align-self center margin 0 .5em 0 0 padding 1px 6px font-size 12px diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue index 1c97e610d7..e328238da0 100644 --- a/src/client/app/mobile/views/components/note-preview.vue +++ b/src/client/app/mobile/views/components/note-preview.vue @@ -86,6 +86,7 @@ root(isDark) > .is-admin > .is-bot > .is-cat + align-self center margin 0 0.5em 0 0 padding 1px 6px font-size 10px diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue index 42787e6d75..afdfe7d229 100644 --- a/src/client/app/mobile/views/components/note.sub.vue +++ b/src/client/app/mobile/views/components/note.sub.vue @@ -109,6 +109,7 @@ root(isDark) > .is-admin > .is-bot > .is-cat + align-self center margin 0 0.5em 0 0 padding 1px 5px font-size 10px diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 5cc864f319..35e1c24b07 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -389,6 +389,7 @@ root(isDark) > .is-admin > .is-bot > .is-cat + align-self center margin 0 0.5em 0 0 padding 1px 6px font-size 12px From ceda2ca89661d1bd3889453997fe0868a8c31e9d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 14:39:46 +0900 Subject: [PATCH 031/369] Implement delete note --- locales/ja.yml | 24 ++++++---- .../app/common/views/components/note-menu.vue | 10 +++++ .../views/components/note-detail.sub.vue | 1 + .../desktop/views/components/note-detail.vue | 1 + .../desktop/views/components/notes.note.vue | 3 +- .../views/components/sub-note-content.vue | 5 ++- .../mobile/views/components/note-detail.vue | 3 +- .../app/mobile/views/components/note.vue | 3 +- .../views/components/sub-note-content.vue | 5 ++- src/remote/activitypub/kernel/delete/note.ts | 10 +---- src/remote/activitypub/renderer/delete.ts | 4 ++ src/renderers/get-note-summary.ts | 4 ++ src/server/api/endpoints.ts | 5 +++ src/server/api/endpoints/notes/delete.ts | 26 +++++++++++ src/services/note/delete.ts | 44 +++++++++++++++++++ 15 files changed, 125 insertions(+), 23 deletions(-) create mode 100644 src/remote/activitypub/renderer/delete.ts create mode 100644 src/server/api/endpoints/notes/delete.ts create mode 100644 src/services/note/delete.ts diff --git a/locales/ja.yml b/locales/ja.yml index 06ef453de8..d8bc94b293 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -126,6 +126,8 @@ common/views/components/nav.vue: common/views/components/note-menu.vue: favorite: "お気に入り" pin: "ピン留め" + delete: "削除" + delete-confirm: "この投稿を削除しますか?" remote: "投稿元で見る" common/views/components/poll.vue: @@ -360,14 +362,16 @@ desktop/views/components/messaging-window.vue: desktop/views/components/note-detail.vue: more: "会話をもっと読み込む" - private: "(この投稿は非公開です)" + private: "この投稿は非公開です" + deleted: "この投稿は削除されました" reposted-by: "{}がRenote" location: "位置情報" renote: "Renote" add-reaction: "リアクション" desktop/views/components/note-detail.sub.vue: - private: "(この投稿は非公開です)" + private: "この投稿は非公開です" + deleted: "この投稿は削除されました" desktop/views/components/notes.note.vue: reposted-by: "{}がRenote" @@ -565,8 +569,9 @@ desktop/views/components/settings.profile.vue: is-cat: "このアカウントはCatです" desktop/views/components/sub-note-content.vue: - hidden: "(この投稿は非公開です)" - media: "つのメディア" + private: "この投稿は非公開です" + deleted: "この投稿は削除されました" + media-count: "{}つのメディア" poll: "投票" desktop/views/components/taskmanager.vue: @@ -771,14 +776,16 @@ mobile/views/components/note.vue: reposted-by: "{}がRenote" more: "もっと見る" less: "隠す" - hidden: "この投稿は非公開です" + private: "この投稿は非公開です" + deleted: "この投稿は削除されました" location: "位置情報" mobile/views/components/note-detail.vue: reply: "返信" reaction: "リアクション" reposted-by: "{}がRenote" - hidden: "この投稿は非公開です" + private: "この投稿は非公開です" + deleted: "この投稿は削除されました" location: "位置情報" mobile/views/components/note-preview.vue: @@ -813,8 +820,9 @@ mobile/views/components/post-form.vue: username-prompt: "ユーザー名を入力してください" mobile/views/components/sub-note-content.vue: - hidden: "この投稿は非公開です" - media-count: "{}個のメディア" + private: "この投稿は非公開です" + deleted: "この投稿は削除されました" + media-count: "{}つのメディア" poll: "投票" mobile/views/components/timeline.vue: diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue index fb95055049..a400610a2b 100644 --- a/src/client/app/common/views/components/note-menu.vue +++ b/src/client/app/common/views/components/note-menu.vue @@ -4,6 +4,7 @@ <div class="popover" :class="{ compact }" ref="popover"> <button @click="favorite">%i18n:@favorite%</button> <button v-if="note.userId == $store.state.i.id" @click="pin">%i18n:@pin%</button> + <button v-if="note.userId == $store.state.i.id" @click="del">%i18n:@delete%</button> <a v-if="note.uri" :href="note.uri" target="_blank">%i18n:@remote%</a> </div> </div> @@ -59,6 +60,15 @@ export default Vue.extend({ }); }, + del() { + if (!window.confirm('%i18n:@delete-confirm%')) return; + (this as any).api('notes/delete', { + noteId: this.note.id + }).then(() => { + this.$destroy(); + }); + }, + favorite() { (this as any).api('notes/favorites/create', { noteId: this.note.id diff --git a/src/client/app/desktop/views/components/note-detail.sub.vue b/src/client/app/desktop/views/components/note-detail.sub.vue index 0471c70ee7..00e54ff1a6 100644 --- a/src/client/app/desktop/views/components/note-detail.sub.vue +++ b/src/client/app/desktop/views/components/note-detail.sub.vue @@ -16,6 +16,7 @@ <div class="body"> <div class="text"> <span v-if="note.isHidden" style="opacity: 0.5">%i18n:@private%</span> + <span v-if="note.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span> <mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/> </div> <div class="media" v-if="note.mediaIds.length > 0"> diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index e64990b4ce..63b2150110 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -39,6 +39,7 @@ <div class="body"> <div class="text"> <span v-if="p.isHidden" style="opacity: 0.5">%i18n:@private%</span> + <span v-if="p.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span> <mk-note-html v-if="p.text" :text="p.text" :i="$store.state.i"/> </div> <div class="media" v-if="p.media.length > 0"> diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index c4ad67c2f8..f293ffacfb 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -41,7 +41,8 @@ </p> <div class="content" v-show="p.cw == null || showContent"> <div class="text"> - <span v-if="p.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span> + <span v-if="p.isHidden" style="opacity: 0.5">%i18n:@private%</span> + <span v-if="p.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span> <a class="reply" v-if="p.reply">%fa:reply%</a> <mk-note-html v-if="p.text && !canHideText(p)" :text="p.text" :i="$store.state.i" :class="$style.text"/> <a class="rp" v-if="p.renote">RP:</a> diff --git a/src/client/app/desktop/views/components/sub-note-content.vue b/src/client/app/desktop/views/components/sub-note-content.vue index 8aa32cec73..46e1b802b9 100644 --- a/src/client/app/desktop/views/components/sub-note-content.vue +++ b/src/client/app/desktop/views/components/sub-note-content.vue @@ -1,13 +1,14 @@ <template> <div class="mk-sub-note-content"> <div class="body"> - <span v-if="note.isHidden" style="opacity: 0.5">%i18n:@hidden%</span> + <span v-if="note.isHidden" style="opacity: 0.5">%i18n:@private%</span> + <span v-if="note.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span> <a class="reply" v-if="note.replyId">%fa:reply%</a> <mk-note-html :text="note.text" :i="$store.state.i"/> <a class="rp" v-if="note.renoteId" :href="`/note:${note.renoteId}`">RP: ...</a> </div> <details v-if="note.media.length > 0"> - <summary>({{ note.media.length }}%i18n:@media%)</summary> + <summary>({{ '%i18n:@media-count%'.replace('{}', note.media.length) }})</summary> <mk-media-list :media-list="note.media"/> </details> <details v-if="note.poll"> diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index 91b8c20111..8ab766e1dc 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -36,7 +36,8 @@ </header> <div class="body"> <div class="text"> - <span v-if="p.isHidden" style="opacity: 0.5">(%i18n:@hidden%)</span> + <span v-if="p.isHidden" style="opacity: 0.5">(%i18n:@private%)</span> + <span v-if="p.deletedAt" style="opacity: 0.5">(%i18n:@deleted%)</span> <mk-note-html v-if="p.text" :text="p.text" :i="$store.state.i"/> </div> <div class="tags" v-if="p.tags && p.tags.length > 0"> diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 35e1c24b07..997d83a6fe 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -41,7 +41,8 @@ </p> <div class="content" v-show="p.cw == null || showContent"> <div class="text"> - <span v-if="p.isHidden" style="opacity: 0.5">(%i18n:@hidden%)</span> + <span v-if="p.isHidden" style="opacity: 0.5">(%i18n:@private%)</span> + <span v-if="p.deletedAt" style="opacity: 0.5">(%i18n:@deleted%)</span> <a class="reply" v-if="p.reply">%fa:reply%</a> <mk-note-html v-if="p.text && !canHideText(p)" :text="p.text" :i="$store.state.i" :class="$style.text"/> <a class="rp" v-if="p.renote != null">RP:</a> diff --git a/src/client/app/mobile/views/components/sub-note-content.vue b/src/client/app/mobile/views/components/sub-note-content.vue index 023dec70d2..4ad90b97df 100644 --- a/src/client/app/mobile/views/components/sub-note-content.vue +++ b/src/client/app/mobile/views/components/sub-note-content.vue @@ -1,13 +1,14 @@ <template> <div class="mk-sub-note-content"> <div class="body"> - <span v-if="note.isHidden" style="opacity: 0.5">(%i18n:@hidden%)</span> + <span v-if="note.isHidden" style="opacity: 0.5">(%i18n:@private%)</span> + <span v-if="note.deletedAt" style="opacity: 0.5">(%i18n:@deleted%)</span> <a class="reply" v-if="note.replyId">%fa:reply%</a> <mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/> <a class="rp" v-if="note.renoteId">RP: ...</a> </div> <details v-if="note.media.length > 0"> - <summary>({{ note.media.length }}個のメディア)</summary> + <summary>({{ '%i18n:@media-count%'.replace('{}', note.media.length) }})</summary> <mk-media-list :media-list="note.media"/> </details> <details v-if="note.poll"> diff --git a/src/remote/activitypub/kernel/delete/note.ts b/src/remote/activitypub/kernel/delete/note.ts index b2868f69a3..1951982f69 100644 --- a/src/remote/activitypub/kernel/delete/note.ts +++ b/src/remote/activitypub/kernel/delete/note.ts @@ -2,6 +2,7 @@ import * as debug from 'debug'; import Note from '../../../../models/note'; import { IRemoteUser } from '../../../../models/user'; +import deleteNode from '../../../../services/note/delete'; const log = debug('misskey:activitypub'); @@ -18,12 +19,5 @@ export default async function(actor: IRemoteUser, uri: string): Promise<void> { throw new Error('投稿を削除しようとしているユーザーは投稿の作成者ではありません'); } - Note.update({ _id: note._id }, { - $set: { - deletedAt: new Date(), - text: null, - mediaIds: [], - poll: null - } - }); + await deleteNode(actor, note); } diff --git a/src/remote/activitypub/renderer/delete.ts b/src/remote/activitypub/renderer/delete.ts new file mode 100644 index 0000000000..d15cb447e6 --- /dev/null +++ b/src/remote/activitypub/renderer/delete.ts @@ -0,0 +1,4 @@ +export default object => ({ + type: 'Delete', + object +}); diff --git a/src/renderers/get-note-summary.ts b/src/renderers/get-note-summary.ts index 643e2d09ba..ec7c74cf9f 100644 --- a/src/renderers/get-note-summary.ts +++ b/src/renderers/get-note-summary.ts @@ -3,6 +3,10 @@ * @param {*} note (packされた)投稿 */ const summarize = (note: any): string => { + if (note.deletedAt) { + return '(削除された投稿)'; + } + if (note.isHidden) { return '(非公開の投稿)'; } diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts index 892da3540f..908d9574a5 100644 --- a/src/server/api/endpoints.ts +++ b/src/server/api/endpoints.ts @@ -494,6 +494,11 @@ const endpoints: Endpoint[] = [ }, kind: 'note-write' }, + { + name: 'notes/delete', + withCredential: true, + kind: 'note-write' + }, { name: 'notes/renotes' }, diff --git a/src/server/api/endpoints/notes/delete.ts b/src/server/api/endpoints/notes/delete.ts new file mode 100644 index 0000000000..9bbb1541d6 --- /dev/null +++ b/src/server/api/endpoints/notes/delete.ts @@ -0,0 +1,26 @@ +import $ from 'cafy'; import ID from '../../../../cafy-id'; +import Note from '../../../../models/note'; +import deleteNote from '../../../../services/note/delete'; + +/** + * Delete a note + */ +module.exports = (params, user) => new Promise(async (res, rej) => { + // Get 'noteId' parameter + const [noteId, noteIdErr] = $.type(ID).get(params.noteId); + if (noteIdErr) return rej('invalid noteId param'); + + // Fetch note + const note = await Note.findOne({ + _id: noteId, + userId: user._id + }); + + if (note === null) { + return rej('note not found'); + } + + await deleteNote(user, note); + + res(); +}); diff --git a/src/services/note/delete.ts b/src/services/note/delete.ts new file mode 100644 index 0000000000..793f0090be --- /dev/null +++ b/src/services/note/delete.ts @@ -0,0 +1,44 @@ +import Note, { INote } from '../../models/note'; +import { IUser, isLocalUser } from '../../models/user'; +import { publishNoteStream } from '../../publishers/stream'; +import renderDelete from '../../remote/activitypub/renderer/delete'; +import pack from '../../remote/activitypub/renderer'; +import { deliver } from '../../queue'; +import Following from '../../models/following'; +import renderNote from '../../remote/activitypub/renderer/note'; + +/** + * 投稿を削除します。 + * @param user 投稿者 + * @param note 投稿 + */ +export default async function(user: IUser, note: INote) { + await Note.update({ + _id: note._id, + userId: user._id + }, { + $set: { + deletedAt: new Date(), + text: null, + mediaIds: [], + poll: null + } + }); + + publishNoteStream(note._id, 'deleted'); + + //#region ローカルの投稿なら削除アクティビティを配送 + if (isLocalUser(user)) { + const content = pack(renderDelete(await renderNote(note))); + + const followings = await Following.find({ + followeeId: user._id, + '_follower.host': { $ne: null } + }); + + followings.forEach(following => { + deliver(user, content, following._follower.inbox); + }); + } + //#endregion +} From 0a7c0f30fdd96b11246485b3a98f608b2cfc7407 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 14:54:16 +0900 Subject: [PATCH 032/369] :art: --- src/client/app/desktop/views/components/note-preview.vue | 7 +++---- src/client/app/desktop/views/components/notes.note.sub.vue | 1 - src/client/app/desktop/views/components/notes.note.vue | 2 -- .../app/desktop/views/components/post-form-window.vue | 2 +- src/client/app/mobile/views/components/note-preview.vue | 6 +++++- src/client/app/mobile/views/components/note.sub.vue | 1 - src/client/app/mobile/views/components/note.vue | 2 -- 7 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/client/app/desktop/views/components/note-preview.vue b/src/client/app/desktop/views/components/note-preview.vue index 302c5e803f..a25eedb8f7 100644 --- a/src/client/app/desktop/views/components/note-preview.vue +++ b/src/client/app/desktop/views/components/note-preview.vue @@ -42,9 +42,9 @@ root(isDark) > .avatar display block float left - margin 0 16px 0 0 - width 52px - height 52px + margin 0 12px 0 0 + width 48px + height 48px border-radius 8px > .main @@ -85,7 +85,6 @@ root(isDark) cursor default margin 0 padding 0 - font-size 1.1em color isDark ? #959ba7 : #717171 .mk-note-preview[data-darkmode] diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue index 997e1d5050..467b503bd9 100644 --- a/src/client/app/desktop/views/components/notes.note.sub.vue +++ b/src/client/app/desktop/views/components/notes.note.sub.vue @@ -126,7 +126,6 @@ root(isDark) cursor default margin 0 padding 0 - font-size 1.1em color isDark ? #959ba7 : #717171 pre diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index f293ffacfb..570a100768 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -480,7 +480,6 @@ root(isDark) margin 0 padding 0 overflow-wrap break-word - font-size 1.1em color isDark ? #fff : #717171 > .text @@ -507,7 +506,6 @@ root(isDark) margin 0 padding 0 overflow-wrap break-word - font-size 1.1em color isDark ? #fff : #717171 >>> .title diff --git a/src/client/app/desktop/views/components/post-form-window.vue b/src/client/app/desktop/views/components/post-form-window.vue index 18bb39f9bc..c55d6f1a1e 100644 --- a/src/client/app/desktop/views/components/post-form-window.vue +++ b/src/client/app/desktop/views/components/post-form-window.vue @@ -71,6 +71,6 @@ export default Vue.extend({ content ')' .notePreview - margin 16px 22px + margin 16px 22px 0 22px </style> diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue index e328238da0..fc7520bac7 100644 --- a/src/client/app/mobile/views/components/note-preview.vue +++ b/src/client/app/mobile/views/components/note-preview.vue @@ -54,6 +54,11 @@ root(isDark) height 48px border-radius 8px + @media (max-width 500px) + margin 0 10px 0 0 + width 44px + height 44px + > .main float left width calc(100% - 60px) @@ -114,7 +119,6 @@ root(isDark) cursor default margin 0 padding 0 - font-size 1.1em color isDark ? #959ba7 : #717171 .mk-note-preview[data-darkmode] diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue index afdfe7d229..18d41cc7eb 100644 --- a/src/client/app/mobile/views/components/note.sub.vue +++ b/src/client/app/mobile/views/components/note.sub.vue @@ -147,7 +147,6 @@ root(isDark) cursor default margin 0 padding 0 - font-size 1.1em color isDark ? #959ba7 : #717171 pre diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 997d83a6fe..c3994197c4 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -429,7 +429,6 @@ root(isDark) margin 0 padding 0 overflow-wrap break-word - font-size 1.1em color isDark ? #fff : #717171 > .text @@ -455,7 +454,6 @@ root(isDark) margin 0 padding 0 overflow-wrap break-word - font-size 1.1em color isDark ? #fff : #717171 >>> .title From 858efafe77e15de84588d0d348487ee27324a68b Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 14:59:55 +0900 Subject: [PATCH 033/369] :art: --- .../common/views/components/url-preview.vue | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/client/app/common/views/components/url-preview.vue b/src/client/app/common/views/components/url-preview.vue index 028b911e24..38979871c1 100644 --- a/src/client/app/common/views/components/url-preview.vue +++ b/src/client/app/common/views/components/url-preview.vue @@ -68,7 +68,7 @@ iframe root(isDark) > a display block - font-size 16px + font-size 14px border solid 1px isDark ? #191b1f : #eee border-radius 4px overflow hidden @@ -136,8 +136,17 @@ root(isDark) left 0 width 100% + @media (max-width 550px) + font-size 12px + + > .thumbnail + height 80px + + > article + padding 12px + @media (max-width 500px) - font-size 8px + font-size 10px > .thumbnail height 70px @@ -145,6 +154,16 @@ root(isDark) > article padding 8px + > header + margin-bottom 4px + + > footer + margin-top 4px + + > img + width 12px + height 12px + .mk-url-preview[data-darkmode] root(true) From f0c031ecdb7b830bbec731d9197072157e8fdb9e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 15:04:47 +0900 Subject: [PATCH 034/369] Fix bug --- src/client/app/common/views/components/welcome-timeline.vue | 2 +- src/client/app/desktop/views/components/sub-note-content.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/app/common/views/components/welcome-timeline.vue b/src/client/app/common/views/components/welcome-timeline.vue index cad59d24f0..a9d558df66 100644 --- a/src/client/app/common/views/components/welcome-timeline.vue +++ b/src/client/app/common/views/components/welcome-timeline.vue @@ -13,7 +13,7 @@ </div> </header> <div class="text"> - <mk-note-html :text="note.text"/> + <mk-note-html v-if="note.text" :text="note.text"/> </div> </div> </div> diff --git a/src/client/app/desktop/views/components/sub-note-content.vue b/src/client/app/desktop/views/components/sub-note-content.vue index 46e1b802b9..ec41329c4a 100644 --- a/src/client/app/desktop/views/components/sub-note-content.vue +++ b/src/client/app/desktop/views/components/sub-note-content.vue @@ -4,7 +4,7 @@ <span v-if="note.isHidden" style="opacity: 0.5">%i18n:@private%</span> <span v-if="note.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span> <a class="reply" v-if="note.replyId">%fa:reply%</a> - <mk-note-html :text="note.text" :i="$store.state.i"/> + <mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/> <a class="rp" v-if="note.renoteId" :href="`/note:${note.renoteId}`">RP: ...</a> </div> <details v-if="note.media.length > 0"> From 95e5800b36d58b59529d018c74c03ff98a2a8d67 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 15:06:32 +0900 Subject: [PATCH 035/369] Improve RSS widget --- src/client/app/common/views/widgets/rss.vue | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/client/app/common/views/widgets/rss.vue b/src/client/app/common/views/widgets/rss.vue index 9e2c6b6490..eca23d0226 100644 --- a/src/client/app/common/views/widgets/rss.vue +++ b/src/client/app/common/views/widgets/rss.vue @@ -19,12 +19,12 @@ import define from '../../../common/define-widget'; export default define({ name: 'rss', props: () => ({ - compact: false + compact: false, + url: 'http://news.yahoo.co.jp/pickup/rss.xml' }) }).extend({ data() { return { - url: 'http://news.yahoo.co.jp/pickup/rss.xml', items: [], fetching: true, clock: null @@ -43,7 +43,7 @@ export default define({ this.save(); }, fetch() { - fetch(`https://api.rss2json.com/v1/api.json?rss_url=${this.url}`, { + fetch(`https://api.rss2json.com/v1/api.json?rss_url=${this.props.url}`, { cache: 'no-cache' }).then(res => { res.json().then(feed => { @@ -53,7 +53,9 @@ export default define({ }); }, setting() { - alert('not implemented yet'); + this.props.url =window.prompt('URL', this.props.url); + this.save(); + this.fetch(); } } }); From 83bbd6b64f59a9a4a672ffbf57bffdcb5d5accf3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 15:09:06 +0900 Subject: [PATCH 036/369] :art: --- src/client/app/desktop/views/components/notes.note.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 570a100768..271332ba0b 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -348,7 +348,7 @@ root(isDark) > .renote display flex align-items center - padding 16px 32px + padding 16px 32px 8px 32px line-height 28px white-space pre color #9dbb00 From 39d05b75db78c1fb820ff65f30c2e37b8f78cfa4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 15:10:57 +0900 Subject: [PATCH 037/369] Fix bug --- src/client/app/common/views/widgets/rss.vue | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/client/app/common/views/widgets/rss.vue b/src/client/app/common/views/widgets/rss.vue index eca23d0226..7ac453e450 100644 --- a/src/client/app/common/views/widgets/rss.vue +++ b/src/client/app/common/views/widgets/rss.vue @@ -53,9 +53,12 @@ export default define({ }); }, setting() { - this.props.url =window.prompt('URL', this.props.url); - this.save(); - this.fetch(); + const url = window.prompt('URL', this.props.url); + if (url && url != '') { + this.props.url = url; + this.save(); + this.fetch(); + } } } }); From b57dd8de4049680b132b5f51e1c6e76adeac4b08 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 15:14:45 +0900 Subject: [PATCH 038/369] 2.20.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9a99154773..b3162d296b 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.19.0", - "clientVersion": "1.0.5840", + "version": "2.20.0", + "clientVersion": "1.0.5868", "codename": "nighthike", "main": "./built/index.js", "private": true, From 48a17629bbf668b3dabda4a2e866dc7f97179aa0 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 15:30:26 +0900 Subject: [PATCH 039/369] Fix --- locales/ja.yml | 2 ++ .../app/desktop/views/components/note-preview.vue | 2 +- .../desktop/views/components/notes.note.sub.vue | 8 ++++---- .../app/mobile/views/components/note-preview.vue | 3 +++ .../app/mobile/views/components/note.sub.vue | 14 +++++++------- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/locales/ja.yml b/locales/ja.yml index d8bc94b293..8fc82d1680 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -379,6 +379,8 @@ desktop/views/components/notes.note.vue: renote: "Renote" add-reaction: "リアクション" detail: "詳細" + private: "この投稿は非公開です" + deleted: "この投稿は削除されました" desktop/views/components/notes.vue: error: "読み込みに失敗しました。" diff --git a/src/client/app/desktop/views/components/note-preview.vue b/src/client/app/desktop/views/components/note-preview.vue index a25eedb8f7..26c8a7d25c 100644 --- a/src/client/app/desktop/views/components/note-preview.vue +++ b/src/client/app/desktop/views/components/note-preview.vue @@ -49,7 +49,7 @@ root(isDark) > .main float left - width calc(100% - 68px) + width calc(100% - 60px) > header display flex diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue index 467b503bd9..ca8aaeede0 100644 --- a/src/client/app/desktop/views/components/notes.note.sub.vue +++ b/src/client/app/desktop/views/components/notes.note.sub.vue @@ -57,14 +57,14 @@ root(isDark) > .avatar display block float left - margin 0 14px 0 0 - width 52px - height 52px + margin 0 12px 0 0 + width 48px + height 48px border-radius 8px > .main float left - width calc(100% - 66px) + width calc(100% - 60px) > header display flex diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue index fc7520bac7..c3e57d3381 100644 --- a/src/client/app/mobile/views/components/note-preview.vue +++ b/src/client/app/mobile/views/components/note-preview.vue @@ -63,6 +63,9 @@ root(isDark) float left width calc(100% - 60px) + @media (max-width 500px) + width calc(100% - 54px) + > header display flex align-items baseline diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue index 18d41cc7eb..9b9dd9e667 100644 --- a/src/client/app/mobile/views/components/note.sub.vue +++ b/src/client/app/mobile/views/components/note.sub.vue @@ -62,21 +62,21 @@ root(isDark) display block float left margin 0 10px 0 0 - width 44px - height 44px + width 42px + height 42px border-radius 8px @media (min-width 500px) - margin-right 16px - width 52px - height 52px + margin-right 14px + width 50px + height 50px > .main float left - width calc(100% - 54px) + width calc(100% - 52px) @media (min-width 500px) - width calc(100% - 68px) + width calc(100% - 64px) > header display flex From d1dd2d3c18f8878dad79d78297633b69793219d3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 15:30:47 +0900 Subject: [PATCH 040/369] 2.20.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b3162d296b..328b72dfe3 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.20.0", - "clientVersion": "1.0.5868", + "version": "2.20.1", + "clientVersion": "1.0.5871", "codename": "nighthike", "main": "./built/index.js", "private": true, From ba1b1a73b6aa6f7e821ae6cf3339f101699d32c3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 21:31:20 +0900 Subject: [PATCH 041/369] :v: --- locales/ja.yml | 6 +- src/client/app/base.pug | 2 +- .../app/common/views/components/forkit.vue | 2 +- .../app/desktop/views/pages/welcome.vue | 180 ++++-- src/client/app/init.ts | 8 - src/client/assets/welcome-bg.dark.svg | 1 + src/client/assets/welcome-bg.light.svg | 1 + src/client/assets/welcome-bg.svg | 579 ------------------ src/client/assets/welcome-fg.svg | 380 ------------ 9 files changed, 125 insertions(+), 1034 deletions(-) create mode 100644 src/client/assets/welcome-bg.dark.svg create mode 100644 src/client/assets/welcome-bg.light.svg delete mode 100644 src/client/assets/welcome-bg.svg delete mode 100644 src/client/assets/welcome-fg.svg diff --git a/locales/ja.yml b/locales/ja.yml index 8fc82d1680..44fa0ef538 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -3,7 +3,9 @@ meta: divider: "" common: - misskey: "Misskeyで皆と共有しよう。" + misskey: "A planet of fediverse" + about-title: "A ⭐ of fediverse." + about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。" time: unknown: "なぞのじかん" @@ -631,6 +633,8 @@ desktop/views/components/window.vue: close: "閉じる" desktop/views/pages/welcome.vue: + about: "詳しく..." + gotit: "わかった" signin: "ログイン" signup: "新規登録" signin-button: "やってる" diff --git a/src/client/app/base.pug b/src/client/app/base.pug index c182fd6f64..a77a8a9595 100644 --- a/src/client/app/base.pug +++ b/src/client/app/base.pug @@ -19,7 +19,7 @@ html | Misskey block desc - meta(name='description' content='A SNS') + meta(name='description' content='A planet of fediverse') block meta diff --git a/src/client/app/common/views/components/forkit.vue b/src/client/app/common/views/components/forkit.vue index 2a463ebfd7..bb71db19db 100644 --- a/src/client/app/common/views/components/forkit.vue +++ b/src/client/app/common/views/components/forkit.vue @@ -13,7 +13,7 @@ .a display block - position absolute + position fixed top 0 right 0 diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 91ad4b61c3..c406f9b0a4 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -4,9 +4,20 @@ <template v-if="$store.state.device.darkmode">%fa:moon%</template> <template v-else>%fa:R moon%</template> </button> - <main> + <main v-if="about" class="about"> + <article> + <h1>%i18n:common.about-title%</h1> + <p v-html="'%i18n:common.about%'"></p> + <span class="gotit" @click="about = false">%i18n:@gotit%</span> + </article> + </main> + <main v-else class="index"> <img :src="$store.state.device.darkmode ? 'assets/title-dark.svg' : 'assets/title.svg'" alt="Misskey"> - <p><button class="signup" @click="signup">%i18n:@signup-button%</button><button class="signin" @click="signin">%i18n:@signin-button%</button></p> + <p class="desc"><b>%i18n:common.misskey%</b> - <span @click="about = true">%i18n:@about%</span></p> + <p class="account"> + <button class="signup" @click="signup">%i18n:@signup-button%</button> + <button class="signin" @click="signin">%i18n:@signin-button%</button> + </p> <div class="tl"> <header>%fa:comments R% %i18n:@timeline%<div><span></span><span></span><span></span></div></header> @@ -33,12 +44,12 @@ <script lang="ts"> import Vue from 'vue'; -import { docsUrl, copyright, lang } from '../../../config'; +import { copyright } from '../../../config'; export default Vue.extend({ data() { return { - aboutUrl: `${docsUrl}/${lang}/about`, + about: false, copyright }; }, @@ -73,9 +84,12 @@ root(isDark) display flex flex-direction column flex 1 + background-image isDark ? url('/assets/welcome-bg.dark.svg') : url('/assets/welcome-bg.light.svg') + background-size cover + background-position center > button - position absolute + position fixed z-index 1 top 0 left 0 @@ -87,81 +101,119 @@ root(isDark) flex 1 padding 64px 0 0 0 text-align center - color isDark ? #9aa4b3 : #555 - > img - width 350px + &.about + color isDark ? #fff : #627574 - > p - margin 8px 0 - line-height 2em + > article + max-width 700px + margin 42px auto 0 auto + padding 64px + background isDark ? #282C37 : #fff + box-shadow 0 8px 32px rgba(#000, 0.15) - button - padding 8px 16px - font-size inherit + > h1 + margin 0 + font-variant small-caps - .signup - color $theme-color - border solid 2px $theme-color - border-radius 4px + > p + margin 20px 0 + line-height 2em - &:focus - box-shadow 0 0 0 3px rgba($theme-color, 0.2) + > .gotit + color $theme-color + cursor pointer - &:hover - color $theme-color-foreground - background $theme-color + &:hover + text-decoration underline - &:active - color $theme-color-foreground - background darken($theme-color, 10%) - border-color darken($theme-color, 10%) + &.index + color isDark ? #9aa4b3 : #555 - .signin - &:hover - color isDark ? #fff : #000 + > img + width 350px - > .tl - margin 32px auto 0 auto - width 410px - text-align left - background isDark ? #313543 : #fff - border-radius 8px - box-shadow 0 8px 32px rgba(#000, 0.15) - overflow hidden + > .desc + margin -12px 0 24px 0 + color isDark ? #fff : #555 - > header - z-index 1 - padding 12px 16px - color isDark ? #e3e5e8 : #888d94 - box-shadow 0 1px 0px rgba(#000, 0.1) + > span + color $theme-color + cursor pointer - > div - position absolute - top 0 - right 0 - padding inherit + &:hover + text-decoration underline - > span - display inline-block - height 11px - width 11px - margin-left 6px - border-radius 100% - vertical-align middle + > .account + margin 8px 0 + line-height 2em - &:nth-child(1) - background #5BCC8B + button + padding 8px 16px + font-size inherit - &:nth-child(2) - background #E6BB46 + .signup + color $theme-color + border solid 2px $theme-color + border-radius 4px - &:nth-child(3) - background #DF7065 + &:focus + box-shadow 0 0 0 3px rgba($theme-color, 0.2) - > .mk-welcome-timeline - max-height 350px - overflow auto + &:hover + color $theme-color-foreground + background $theme-color + + &:active + color $theme-color-foreground + background darken($theme-color, 10%) + border-color darken($theme-color, 10%) + + .signin + &:hover + color isDark ? #fff : #000 + + > .tl + margin 32px auto 0 auto + width 410px + text-align left + background isDark ? #313543 : #fff + border-radius 8px + box-shadow 0 8px 32px rgba(#000, 0.15) + overflow hidden + + > header + z-index 1 + padding 12px 16px + color isDark ? #e3e5e8 : #888d94 + box-shadow 0 1px 0px rgba(#000, 0.1) + + > div + position absolute + top 0 + right 0 + padding inherit + + > span + display inline-block + height 11px + width 11px + margin-left 6px + border-radius 100% + vertical-align middle + + &:nth-child(1) + background #5BCC8B + + &:nth-child(2) + background #E6BB46 + + &:nth-child(3) + background #DF7065 + + > .mk-welcome-timeline + max-height 350px + overflow auto > footer font-size 12px diff --git a/src/client/app/init.ts b/src/client/app/init.ts index 58013ec5a8..043f26d0bc 100644 --- a/src/client/app/init.ts +++ b/src/client/app/init.ts @@ -67,14 +67,6 @@ const html = document.documentElement; html.setAttribute('lang', lang); //#endregion -//#region Set description meta tag -const head = document.getElementsByTagName('head')[0]; -const meta = document.createElement('meta'); -meta.setAttribute('name', 'description'); -meta.setAttribute('content', '%i18n:common.misskey%'); -head.appendChild(meta); -//#endregion - // iOSでプライベートモードだとlocalStorageが使えないので既存のメソッドを上書きする try { localStorage.setItem('kyoppie', 'yuppie'); diff --git a/src/client/assets/welcome-bg.dark.svg b/src/client/assets/welcome-bg.dark.svg new file mode 100644 index 0000000000..1866170327 --- /dev/null +++ b/src/client/assets/welcome-bg.dark.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="1440" height="900"><path d="M667,476L630,367L567,460Z" fill="#121931" stroke="#121931" stroke-width="1.51"/><path d="M630,367L576,311L567,460Z" fill="#121c31" stroke="#121c31" stroke-width="1.51"/><path d="M567,460L631,579L667,476Z" fill="#121731" stroke="#121731" stroke-width="1.51"/><path d="M567,460L556,584L631,579Z" fill="#131830" stroke="#131830" stroke-width="1.51"/><path d="M437,475L556,584L567,460Z" fill="#121a31" stroke="#121a31" stroke-width="1.51"/><path d="M667,476L773,349L630,367Z" fill="#121831" stroke="#121831" stroke-width="1.51"/><path d="M630,367L580,255L576,311Z" fill="#122031" stroke="#122031" stroke-width="1.51"/><path d="M813,438L773,349L667,476Z" fill="#121530" stroke="#121530" stroke-width="1.51"/><path d="M576,311L437,475L567,460Z" fill="#111d31" stroke="#111d31" stroke-width="1.51"/><path d="M642,193L580,255L630,367Z" fill="#112131" stroke="#112131" stroke-width="1.51"/><path d="M800,574L813,438L667,476Z" fill="#121330" stroke="#121330" stroke-width="1.51"/><path d="M400,299L437,475L576,311Z" fill="#122231" stroke="#122231" stroke-width="1.51"/><path d="M556,584L583,647L631,579Z" fill="#14162f" stroke="#14162f" stroke-width="1.51"/><path d="M631,579L800,574L667,476Z" fill="#121430" stroke="#121430" stroke-width="1.51"/><path d="M423,693L583,647L556,584Z" fill="#14192f" stroke="#14192f" stroke-width="1.51"/><path d="M653,680L800,574L631,579Z" fill="#13132f" stroke="#13132f" stroke-width="1.51"/><path d="M773,349L642,193L630,367Z" fill="#111d31" stroke="#111d31" stroke-width="1.51"/><path d="M813,438L874,423L773,349Z" fill="#131630" stroke="#131630" stroke-width="1.51"/><path d="M773,349L789,203L642,193Z" fill="#121f31" stroke="#121f31" stroke-width="1.51"/><path d="M906,568L874,423L813,438Z" fill="#13122f" stroke="#13122f" stroke-width="1.51"/><path d="M583,647L653,680L631,579Z" fill="#14152e" stroke="#14152e" stroke-width="1.51"/><path d="M449,219L400,299L576,311Z" fill="#112631" stroke="#112631" stroke-width="1.51"/><path d="M449,219L576,311L580,255Z" fill="#112431" stroke="#112431" stroke-width="1.51"/><path d="M437,475L411,599L556,584Z" fill="#131c30" stroke="#131c30" stroke-width="1.51"/><path d="M556,765L666,768L653,680Z" fill="#15142d" stroke="#15142d" stroke-width="1.51"/><path d="M327,557L411,599L437,475Z" fill="#131f30" stroke="#131f30" stroke-width="1.51"/><path d="M572,116L449,219L580,255Z" fill="#102731" stroke="#102731" stroke-width="1.51"/><path d="M920,229L789,203L773,349Z" fill="#131d30" stroke="#131d30" stroke-width="1.51"/><path d="M874,423L909,355L773,349Z" fill="#131730" stroke="#131730" stroke-width="1.51"/><path d="M1018,299L909,355L1040,413Z" fill="#14172e" stroke="#14172e" stroke-width="1.51"/><path d="M642,193L572,116L580,255Z" fill="#112631" stroke="#112631" stroke-width="1.51"/><path d="M802,140L639,121L642,193Z" fill="#112531" stroke="#112531" stroke-width="1.51"/><path d="M800,574L906,568L813,438Z" fill="#13122f" stroke="#13122f" stroke-width="1.51"/><path d="M860,653L906,568L800,574Z" fill="#14112e" stroke="#14112e" stroke-width="1.51"/><path d="M653,680L792,696L800,574Z" fill="#14112e" stroke="#14112e" stroke-width="1.51"/><path d="M639,121L572,116L642,193Z" fill="#102731" stroke="#102731" stroke-width="1.51"/><path d="M280,464L327,557L437,475Z" fill="#122131" stroke="#122131" stroke-width="1.51"/><path d="M792,696L860,653L800,574Z" fill="#15102d" stroke="#15102d" stroke-width="1.51"/><path d="M315,686L423,693L411,599Z" fill="#141d2f" stroke="#141d2f" stroke-width="1.51"/><path d="M411,599L423,693L556,584Z" fill="#141b2f" stroke="#141b2f" stroke-width="1.51"/><path d="M653,680L666,768L792,696Z" fill="#14112d" stroke="#14112d" stroke-width="1.51"/><path d="M400,299L298,362L437,475Z" fill="#112431" stroke="#112431" stroke-width="1.51"/><path d="M289,189L298,362L400,299Z" fill="#0f2a31" stroke="#0f2a31" stroke-width="1.51"/><path d="M556,765L653,680L583,647Z" fill="#15152e" stroke="#15152e" stroke-width="1.51"/><path d="M789,203L802,140L642,193Z" fill="#112231" stroke="#112231" stroke-width="1.51"/><path d="M920,229L802,140L789,203Z" fill="#132130" stroke="#132130" stroke-width="1.51"/><path d="M423,693L556,765L583,647Z" fill="#15182e" stroke="#15182e" stroke-width="1.51"/><path d="M298,362L280,464L437,475Z" fill="#112331" stroke="#112331" stroke-width="1.51"/><path d="M909,355L920,229L773,349Z" fill="#131a30" stroke="#131a30" stroke-width="1.51"/><path d="M1018,299L920,229L909,355Z" fill="#141a2f" stroke="#141a2f" stroke-width="1.51"/><path d="M675,877L748,809L666,768Z" fill="#17112d" stroke="#17112d" stroke-width="1.51"/><path d="M423,693L443,781L556,765Z" fill="#16192e" stroke="#16192e" stroke-width="1.51"/><path d="M336,786L443,781L423,693Z" fill="#161c2d" stroke="#161c2d" stroke-width="1.51"/><path d="M792,696L924,797L860,653Z" fill="#150e2c" stroke="#150e2c" stroke-width="1.51"/><path d="M666,768L748,809L792,696Z" fill="#150f2d" stroke="#150f2d" stroke-width="1.51"/><path d="M675,877L666,768L556,765Z" fill="#17132d" stroke="#17132d" stroke-width="1.51"/><path d="M327,557L315,686L411,599Z" fill="#141f2f" stroke="#141f2f" stroke-width="1.51"/><path d="M224,597L315,686L327,557Z" fill="#14222f" stroke="#14222f" stroke-width="1.51"/><path d="M566,23L421,77L572,116Z" fill="#132a2e" stroke="#132a2e" stroke-width="1.51"/><path d="M572,116L421,77L449,219Z" fill="#0e2d31" stroke="#0e2d31" stroke-width="1.51"/><path d="M449,219L289,189L400,299Z" fill="#0f2b31" stroke="#0f2b31" stroke-width="1.51"/><path d="M566,23L572,116L639,121Z" fill="#13282f" stroke="#13282f" stroke-width="1.51"/><path d="M644,-20L566,23L639,121Z" fill="#16272d" stroke="#16272d" stroke-width="1.51"/><path d="M328,133L289,189L449,219Z" fill="#0d2f31" stroke="#0d2f31" stroke-width="1.51"/><path d="M171,486L224,597L280,464Z" fill="#13232f" stroke="#13232f" stroke-width="1.51"/><path d="M1040,413L909,355L874,423Z" fill="#14152f" stroke="#14152f" stroke-width="1.51"/><path d="M920,229L902,89L802,140Z" fill="#132230" stroke="#132230" stroke-width="1.51"/><path d="M1020,585L906,568L1018,660Z" fill="#150f2c" stroke="#150f2c" stroke-width="1.51"/><path d="M1020,585L1040,413L906,568Z" fill="#14102d" stroke="#14102d" stroke-width="1.51"/><path d="M906,568L1040,413L874,423Z" fill="#13122f" stroke="#13122f" stroke-width="1.51"/><path d="M421,77L328,133L449,219Z" fill="#0d2f31" stroke="#0d2f31" stroke-width="1.51"/><path d="M1018,299L987,217L920,229Z" fill="#141d2f" stroke="#141d2f" stroke-width="1.51"/><path d="M755,-6L644,-20L639,121Z" fill="#16242d" stroke="#16242d" stroke-width="1.51"/><path d="M1018,660L906,568L860,653Z" fill="#15102c" stroke="#15102c" stroke-width="1.51"/><path d="M190,365L280,464L298,362Z" fill="#102731" stroke="#102731" stroke-width="1.51"/><path d="M280,464L224,597L327,557Z" fill="#122330" stroke="#122330" stroke-width="1.51"/><path d="M225,235L190,365L298,362Z" fill="#102b31" stroke="#102b31" stroke-width="1.51"/><path d="M1009,122L902,89L920,229Z" fill="#14222f" stroke="#14222f" stroke-width="1.51"/><path d="M289,189L225,235L298,362Z" fill="#0d2e31" stroke="#0d2e31" stroke-width="1.51"/><path d="M185,70L225,235L289,189Z" fill="#0c3330" stroke="#0c3330" stroke-width="1.51"/><path d="M527,877L675,877L556,765Z" fill="#19152d" stroke="#19152d" stroke-width="1.51"/><path d="M976,767L1018,660L860,653Z" fill="#160e2c" stroke="#160e2c" stroke-width="1.51"/><path d="M566,23L439,-17L421,77Z" fill="#152c2c" stroke="#152c2c" stroke-width="1.51"/><path d="M755,-6L639,121L802,140Z" fill="#14242f" stroke="#14242f" stroke-width="1.51"/><path d="M190,365L171,486L280,464Z" fill="#132430" stroke="#132430" stroke-width="1.51"/><path d="M902,89L755,-6L802,140Z" fill="#15232e" stroke="#15232e" stroke-width="1.51"/><path d="M924,797L792,696L748,809Z" fill="#160e2c" stroke="#160e2c" stroke-width="1.51"/><path d="M1020,585L1106,477L1040,413Z" fill="#14102d" stroke="#14102d" stroke-width="1.51"/><path d="M443,781L527,877L556,765Z" fill="#17182d" stroke="#17182d" stroke-width="1.51"/><path d="M427,924L527,877L443,781Z" fill="#1b192d" stroke="#1b192d" stroke-width="1.51"/><path d="M315,686L336,786L423,693Z" fill="#151e2e" stroke="#151e2e" stroke-width="1.51"/><path d="M201,784L336,786L315,686Z" fill="#16202d" stroke="#16202d" stroke-width="1.51"/><path d="M779,911L924,797L748,809Z" fill="#190e2c" stroke="#190e2c" stroke-width="1.51"/><path d="M421,77L296,-6L328,133Z" fill="#10312e" stroke="#10312e" stroke-width="1.51"/><path d="M328,133L185,70L289,189Z" fill="#093431" stroke="#093431" stroke-width="1.51"/><path d="M545,-110L439,-17L566,23Z" fill="#18292a" stroke="#18292a" stroke-width="1.51"/><path d="M1098,562L1106,477L1020,585Z" fill="#150f2d" stroke="#150f2d" stroke-width="1.51"/><path d="M1040,413L1149,365L1018,299Z" fill="#15162e" stroke="#15162e" stroke-width="1.51"/><path d="M1135,188L1009,122L987,217Z" fill="#14202e" stroke="#14202e" stroke-width="1.51"/><path d="M224,597L189,651L315,686Z" fill="#15222e" stroke="#15222e" stroke-width="1.51"/><path d="M122,584L189,651L224,597Z" fill="#16212d" stroke="#16212d" stroke-width="1.51"/><path d="M1095,646L1098,562L1020,585Z" fill="#160e2c" stroke="#160e2c" stroke-width="1.51"/><path d="M924,797L976,767L860,653Z" fill="#160d2b" stroke="#160d2b" stroke-width="1.51"/><path d="M1095,646L1020,585L1018,660Z" fill="#160e2b" stroke="#160e2b" stroke-width="1.51"/><path d="M902,89L855,-47L755,-6Z" fill="#18222b" stroke="#18222b" stroke-width="1.51"/><path d="M987,217L1009,122L920,229Z" fill="#14202f" stroke="#14202f" stroke-width="1.51"/><path d="M1135,188L987,217L1018,299Z" fill="#141c2e" stroke="#141c2e" stroke-width="1.51"/><path d="M675,877L779,911L748,809Z" fill="#1a102d" stroke="#1a102d" stroke-width="1.51"/><path d="M924,797L1032,900L976,767Z" fill="#190d2a" stroke="#190d2a" stroke-width="1.51"/><path d="M758,1032L779,911L675,877Z" fill="#1d102d" stroke="#1d102d" stroke-width="1.51"/><path d="M1153,782L1095,646L1018,660Z" fill="#170c2b" stroke="#170c2b" stroke-width="1.51"/><path d="M1262,481L1149,365L1106,477Z" fill="#15102d" stroke="#15102d" stroke-width="1.51"/><path d="M171,486L122,584L224,597Z" fill="#16222d" stroke="#16222d" stroke-width="1.51"/><path d="M70,425L122,584L171,486Z" fill="#17232c" stroke="#17232c" stroke-width="1.51"/><path d="M70,425L171,486L190,365Z" fill="#15242e" stroke="#15242e" stroke-width="1.51"/><path d="M527,877L566,1030L675,877Z" fill="#1d152d" stroke="#1d152d" stroke-width="1.51"/><path d="M336,786L350,882L443,781Z" fill="#181d2d" stroke="#181d2d" stroke-width="1.51"/><path d="M201,784L350,882L336,786Z" fill="#18202d" stroke="#18202d" stroke-width="1.51"/><path d="M201,784L315,686L189,651Z" fill="#15212d" stroke="#15212d" stroke-width="1.51"/><path d="M1106,477L1149,365L1040,413Z" fill="#14122d" stroke="#14122d" stroke-width="1.51"/><path d="M1262,481L1106,477L1098,562Z" fill="#150e2c" stroke="#150e2c" stroke-width="1.51"/><path d="M689,-114L545,-110L644,-20Z" fill="#1b2427" stroke="#1b2427" stroke-width="1.51"/><path d="M644,-20L545,-110L566,23Z" fill="#19272a" stroke="#19272a" stroke-width="1.51"/><path d="M1028,16L855,-47L902,89Z" fill="#19212a" stroke="#19212a" stroke-width="1.51"/><path d="M350,882L427,924L443,781Z" fill="#1b1c2d" stroke="#1b1c2d" stroke-width="1.51"/><path d="M439,-17L296,-6L421,77Z" fill="#142e2c" stroke="#142e2c" stroke-width="1.51"/><path d="M225,235L80,349L190,365Z" fill="#132a2e" stroke="#132a2e" stroke-width="1.51"/><path d="M689,-114L644,-20L755,-6Z" fill="#192229" stroke="#192229" stroke-width="1.51"/><path d="M439,-17L324,-108L296,-6Z" fill="#172e29" stroke="#172e29" stroke-width="1.51"/><path d="M753,-160L689,-114L755,-6Z" fill="#1c2127" stroke="#1c2127" stroke-width="1.51"/><path d="M90,203L80,349L225,235Z" fill="#132d2d" stroke="#132d2d" stroke-width="1.51"/><path d="M102,767L201,784L189,651Z" fill="#18202b" stroke="#18202b" stroke-width="1.51"/><path d="M80,349L70,425L190,365Z" fill="#16262d" stroke="#16262d" stroke-width="1.51"/><path d="M1009,122L1028,16L902,89Z" fill="#16212c" stroke="#16212c" stroke-width="1.51"/><path d="M1149,365L1135,188L1018,299Z" fill="#15192e" stroke="#15192e" stroke-width="1.51"/><path d="M296,-6L185,70L328,133Z" fill="#0f332e" stroke="#0f332e" stroke-width="1.51"/><path d="M779,911L893,937L924,797Z" fill="#1b0e2b" stroke="#1b0e2b" stroke-width="1.51"/><path d="M976,767L1153,782L1018,660Z" fill="#170c2a" stroke="#170c2a" stroke-width="1.51"/><path d="M758,1032L893,937L779,911Z" fill="#1f0f2c" stroke="#1f0f2c" stroke-width="1.51"/><path d="M1131,95L1028,16L1009,122Z" fill="#17212c" stroke="#17212c" stroke-width="1.51"/><path d="M855,-47L753,-160L755,-6Z" fill="#1b2128" stroke="#1b2128" stroke-width="1.51"/><path d="M123,103L90,203L225,235Z" fill="#11312e" stroke="#11312e" stroke-width="1.51"/><path d="M80,349L-14,363L70,425Z" fill="#18252b" stroke="#18252b" stroke-width="1.51"/><path d="M1028,16L881,-96L855,-47Z" fill="#1b2028" stroke="#1b2028" stroke-width="1.51"/><path d="M185,70L123,103L225,235Z" fill="#0e342e" stroke="#0e342e" stroke-width="1.51"/><path d="M118,-15L123,103L185,70Z" fill="#15322a" stroke="#15322a" stroke-width="1.51"/><path d="M296,-6L182,-12L185,70Z" fill="#13322a" stroke="#13322a" stroke-width="1.51"/><path d="M545,-110L463,-146L439,-17Z" fill="#1a2927" stroke="#1a2927" stroke-width="1.51"/><path d="M753,-160L463,-146L545,-110Z" fill="#1d2525" stroke="#1d2525" stroke-width="1.51"/><path d="M753,-160L545,-110L689,-114Z" fill="#1d2226" stroke="#1d2226" stroke-width="1.51"/><path d="M122,584L64,646L189,651Z" fill="#18212b" stroke="#18212b" stroke-width="1.51"/><path d="M-55,555L64,646L122,584Z" fill="#1a2029" stroke="#1a2029" stroke-width="1.51"/><path d="M465,1018L566,1030L527,877Z" fill="#20182d" stroke="#20182d" stroke-width="1.51"/><path d="M465,1018L527,877L427,924Z" fill="#1f1a2d" stroke="#1f1a2d" stroke-width="1.51"/><path d="M465,1018L427,924L298,1048Z" fill="#211c2d" stroke="#211c2d" stroke-width="1.51"/><path d="M881,-96L753,-160L855,-47Z" fill="#1c2026" stroke="#1c2026" stroke-width="1.51"/><path d="M1248,72L1131,95L1135,188Z" fill="#16212d" stroke="#16212d" stroke-width="1.51"/><path d="M1135,188L1131,95L1009,122Z" fill="#15222e" stroke="#15222e" stroke-width="1.51"/><path d="M298,1048L427,924L350,882Z" fill="#1f1e2d" stroke="#1f1e2d" stroke-width="1.51"/><path d="M463,-146L324,-108L439,-17Z" fill="#1a2c27" stroke="#1a2c27" stroke-width="1.51"/><path d="M696,1054L758,1032L675,877Z" fill="#20102d" stroke="#20102d" stroke-width="1.51"/><path d="M201,784L170,884L350,882Z" fill="#1b212d" stroke="#1b212d" stroke-width="1.51"/><path d="M64,646L102,767L189,651Z" fill="#18202a" stroke="#18202a" stroke-width="1.51"/><path d="M913,1005L1032,900L893,937Z" fill="#1f0d2b" stroke="#1f0d2b" stroke-width="1.51"/><path d="M893,937L1032,900L924,797Z" fill="#1c0d2b" stroke="#1c0d2b" stroke-width="1.51"/><path d="M207,-137L182,-12L296,-6Z" fill="#173127" stroke="#173127" stroke-width="1.51"/><path d="M566,1030L696,1054L675,877Z" fill="#20132d" stroke="#20132d" stroke-width="1.51"/><path d="M298,1048L696,1054L566,1030Z" fill="#23182d" stroke="#23182d" stroke-width="1.51"/><path d="M1089,882L1153,782L976,767Z" fill="#1a0b2a" stroke="#1a0b2a" stroke-width="1.51"/><path d="M1255,588L1262,481L1098,562Z" fill="#160d2c" stroke="#160d2c" stroke-width="1.51"/><path d="M70,425L-21,485L122,584Z" fill="#19222b" stroke="#19222b" stroke-width="1.51"/><path d="M-5,194L-14,363L80,349Z" fill="#18292a" stroke="#18292a" stroke-width="1.51"/><path d="M-5,194L80,349L90,203Z" fill="#162d2b" stroke="#162d2b" stroke-width="1.51"/><path d="M-5,194L90,203L123,103Z" fill="#13312b" stroke="#13312b" stroke-width="1.51"/><path d="M1255,588L1098,562L1095,646Z" fill="#170d2b" stroke="#170d2b" stroke-width="1.51"/><path d="M1149,365L1263,231L1135,188Z" fill="#161a2d" stroke="#161a2d" stroke-width="1.51"/><path d="M102,767L170,884L201,784Z" fill="#1b202a" stroke="#1b202a" stroke-width="1.51"/><path d="M758,1032L913,1005L893,937Z" fill="#200e2c" stroke="#200e2c" stroke-width="1.51"/><path d="M990,1060L913,1005L758,1032Z" fill="#220e2b" stroke="#220e2b" stroke-width="1.51"/><path d="M64,646L-24,765L102,767Z" fill="#1b1f27" stroke="#1b1f27" stroke-width="1.51"/><path d="M-14,363L-21,485L70,425Z" fill="#192329" stroke="#192329" stroke-width="1.51"/><path d="M1094,1029L1089,882L1032,900Z" fill="#1f0b2a" stroke="#1f0b2a" stroke-width="1.51"/><path d="M1032,900L1089,882L976,767Z" fill="#1b0c2a" stroke="#1b0c2a" stroke-width="1.51"/><path d="M1248,648L1255,588L1095,646Z" fill="#170c2a" stroke="#170c2a" stroke-width="1.51"/><path d="M1318,235L1271,354L1377,345Z" fill="#1b182d" stroke="#1b182d" stroke-width="1.51"/><path d="M1262,481L1271,354L1149,365Z" fill="#17122d" stroke="#17122d" stroke-width="1.51"/><path d="M1253,799L1248,648L1153,782Z" fill="#190a29" stroke="#190a29" stroke-width="1.51"/><path d="M1153,782L1248,648L1095,646Z" fill="#180b2a" stroke="#180b2a" stroke-width="1.51"/><path d="M1131,95L1110,-28L1028,16Z" fill="#192029" stroke="#192029" stroke-width="1.51"/><path d="M1028,16L971,-156L881,-96Z" fill="#1c1f26" stroke="#1c1f26" stroke-width="1.51"/><path d="M881,-96L971,-156L753,-160Z" fill="#1e1f24" stroke="#1e1f24" stroke-width="1.51"/><path d="M1248,72L1110,-28L1131,95Z" fill="#191f29" stroke="#191f29" stroke-width="1.51"/><path d="M1271,354L1263,231L1149,365Z" fill="#17172d" stroke="#17172d" stroke-width="1.51"/><path d="M-121,448L-55,555L-21,485Z" fill="#1c2027" stroke="#1c2027" stroke-width="1.51"/><path d="M-38,73L-5,194L123,103Z" fill="#153229" stroke="#153229" stroke-width="1.51"/><path d="M182,-12L118,-15L185,70Z" fill="#163228" stroke="#163228" stroke-width="1.51"/><path d="M207,-137L118,-15L182,-12Z" fill="#193125" stroke="#193125" stroke-width="1.51"/><path d="M1110,-28L971,-156L1028,16Z" fill="#1c1f26" stroke="#1c1f26" stroke-width="1.51"/><path d="M465,1018L298,1048L566,1030Z" fill="#231b2d" stroke="#231b2d" stroke-width="1.51"/><path d="M170,884L228,990L350,882Z" fill="#1e212d" stroke="#1e212d" stroke-width="1.51"/><path d="M93,915L228,990L170,884Z" fill="#20202a" stroke="#20202a" stroke-width="1.51"/><path d="M-21,485L-55,555L122,584Z" fill="#1a2129" stroke="#1a2129" stroke-width="1.51"/><path d="M102,767L93,915L170,884Z" fill="#1e2029" stroke="#1e2029" stroke-width="1.51"/><path d="M-121,448L-21,485L-14,363Z" fill="#1b2228" stroke="#1b2228" stroke-width="1.51"/><path d="M228,990L298,1048L350,882Z" fill="#21212d" stroke="#21212d" stroke-width="1.51"/><path d="M-55,555L-35,672L64,646Z" fill="#1b1f27" stroke="#1b1f27" stroke-width="1.51"/><path d="M324,-108L207,-137L296,-6Z" fill="#183127" stroke="#183127" stroke-width="1.51"/><path d="M463,-146L207,-137L324,-108Z" fill="#1a2e25" stroke="#1a2e25" stroke-width="1.51"/><path d="M73,-154L207,-137L463,-146Z" fill="#1a3024" stroke="#1a3024" stroke-width="1.51"/><path d="M-24,765L93,915L102,767Z" fill="#1d1f27" stroke="#1d1f27" stroke-width="1.51"/><path d="M228,990L72,1047L298,1048Z" fill="#25212b" stroke="#25212b" stroke-width="1.51"/><path d="M1110,-28L1136,-111L971,-156Z" fill="#1e1e24" stroke="#1e1e24" stroke-width="1.51"/><path d="M1263,231L1248,72L1135,188Z" fill="#171f2d" stroke="#171f2d" stroke-width="1.51"/><path d="M1263,231L1348,116L1248,72Z" fill="#1a212d" stroke="#1a212d" stroke-width="1.51"/><path d="M1271,354L1318,235L1263,231Z" fill="#19192d" stroke="#19192d" stroke-width="1.51"/><path d="M1377,345L1271,354L1386,431Z" fill="#1b142d" stroke="#1b142d" stroke-width="1.51"/><path d="M1355,543L1262,481L1255,588Z" fill="#190e2c" stroke="#190e2c" stroke-width="1.51"/><path d="M-132,680L-24,765L-35,672Z" fill="#1e1e25" stroke="#1e1e25" stroke-width="1.51"/><path d="M-35,672L-24,765L64,646Z" fill="#1c1e27" stroke="#1c1e27" stroke-width="1.51"/><path d="M913,1005L990,1060L1032,900Z" fill="#200d2a" stroke="#200d2a" stroke-width="1.51"/><path d="M1218,912L1253,799L1153,782Z" fill="#1c0a29" stroke="#1c0a29" stroke-width="1.51"/><path d="M696,1054L990,1060L758,1032Z" fill="#220f2c" stroke="#220f2c" stroke-width="1.51"/><path d="M-136,1054L990,1060L696,1054Z" fill="#24182d" stroke="#24182d" stroke-width="1.51"/><path d="M1218,912L1153,782L1089,882Z" fill="#1c0a29" stroke="#1c0a29" stroke-width="1.51"/><path d="M1248,648L1355,543L1255,588Z" fill="#190d2b" stroke="#190d2b" stroke-width="1.51"/><path d="M1367,710L1355,543L1248,648Z" fill="#1b0c2a" stroke="#1b0c2a" stroke-width="1.51"/><path d="M-55,555L-132,680L-35,672Z" fill="#1d1e25" stroke="#1d1e25" stroke-width="1.51"/><path d="M-131,315L-121,448L-14,363Z" fill="#1c2426" stroke="#1c2426" stroke-width="1.51"/><path d="M1246,-36L1136,-111L1110,-28Z" fill="#1d1e25" stroke="#1d1e25" stroke-width="1.51"/><path d="M118,-15L-38,73L123,103Z" fill="#183128" stroke="#183128" stroke-width="1.51"/><path d="M-5,194L-131,315L-14,363Z" fill="#1a2928" stroke="#1a2928" stroke-width="1.51"/><path d="M-39,7L-38,73L118,-15Z" fill="#1a3025" stroke="#1a3025" stroke-width="1.51"/><path d="M1324,-3L1246,-36L1248,72Z" fill="#1e1f28" stroke="#1e1f28" stroke-width="1.51"/><path d="M1386,431L1271,354L1262,481Z" fill="#19112d" stroke="#19112d" stroke-width="1.51"/><path d="M990,1060L1094,1029L1032,900Z" fill="#210c2a" stroke="#210c2a" stroke-width="1.51"/><path d="M-124,219L-131,315L-5,194Z" fill="#1a2b26" stroke="#1a2b26" stroke-width="1.51"/><path d="M1355,543L1386,431L1262,481Z" fill="#1b0f2c" stroke="#1b0f2c" stroke-width="1.51"/><path d="M1094,1029L1218,912L1089,882Z" fill="#1f0a29" stroke="#1f0a29" stroke-width="1.51"/><path d="M1253,799L1367,710L1248,648Z" fill="#1b0b29" stroke="#1b0b29" stroke-width="1.51"/><path d="M-38,73L-124,219L-5,194Z" fill="#183027" stroke="#183027" stroke-width="1.51"/><path d="M1248,72L1246,-36L1110,-28Z" fill="#1b1f27" stroke="#1b1f27" stroke-width="1.51"/><path d="M1348,116L1263,231L1318,235Z" fill="#1a1e2d" stroke="#1a1e2d" stroke-width="1.51"/><path d="M-38,73L-167,117L-124,219Z" fill="#193125" stroke="#193125" stroke-width="1.51"/><path d="M-7,-152L-39,7L118,-15Z" fill="#1d3021" stroke="#1d3021" stroke-width="1.51"/><path d="M1465,118L1348,116L1318,235Z" fill="#1d202d" stroke="#1d202d" stroke-width="1.51"/><path d="M-121,448L-165,529L-55,555Z" fill="#1d1f25" stroke="#1d1f25" stroke-width="1.51"/><path d="M-131,315L-165,529L-121,448Z" fill="#1d2125" stroke="#1d2125" stroke-width="1.51"/><path d="M-167,117L-165,529L-131,315Z" fill="#1d2724" stroke="#1d2724" stroke-width="1.51"/><path d="M1476,551L1473,419L1386,431Z" fill="#1e102d" stroke="#1e102d" stroke-width="1.51"/><path d="M1335,825L1367,710L1253,799Z" fill="#1d0a29" stroke="#1d0a29" stroke-width="1.51"/><path d="M-165,529L-132,680L-55,555Z" fill="#1e1f24" stroke="#1e1f24" stroke-width="1.51"/><path d="M-24,765L-15,943L93,915Z" fill="#211e26" stroke="#211e26" stroke-width="1.51"/><path d="M753,-160L73,-154L463,-146Z" fill="#1c2a24" stroke="#1c2a24" stroke-width="1.51"/><path d="M207,-137L73,-154L118,-15Z" fill="#1b3023" stroke="#1b3023" stroke-width="1.51"/><path d="M1218,912L1335,825L1253,799Z" fill="#1e0a29" stroke="#1e0a29" stroke-width="1.51"/><path d="M1344,904L1335,825L1218,912Z" fill="#200a29" stroke="#200a29" stroke-width="1.51"/><path d="M-175,829L-15,943L-24,765Z" fill="#211d23" stroke="#211d23" stroke-width="1.51"/><path d="M93,915L72,1047L228,990Z" fill="#242029" stroke="#242029" stroke-width="1.51"/><path d="M1094,1029L1223,992L1218,912Z" fill="#210a29" stroke="#210a29" stroke-width="1.51"/><path d="M1339,1016L1223,992L1094,1029Z" fill="#230a29" stroke="#230a29" stroke-width="1.51"/><path d="M1348,116L1324,-3L1248,72Z" fill="#1d202a" stroke="#1d202a" stroke-width="1.51"/><path d="M1246,-36L1241,-144L1136,-111Z" fill="#1f1d23" stroke="#1f1d23" stroke-width="1.51"/><path d="M-15,943L72,1047L93,915Z" fill="#241f27" stroke="#241f27" stroke-width="1.51"/><path d="M298,1048L-136,1054L696,1054Z" fill="#24212d" stroke="#24212d" stroke-width="1.51"/><path d="M1384,-153L1241,-144L1246,-36Z" fill="#211d23" stroke="#211d23" stroke-width="1.51"/><path d="M1136,-111L1241,-144L971,-156Z" fill="#1f1c22" stroke="#1f1c22" stroke-width="1.51"/><path d="M-124,219L-167,117L-131,315Z" fill="#1b2c25" stroke="#1b2c25" stroke-width="1.51"/><path d="M-117,3L-167,117L-38,73Z" fill="#1c3022" stroke="#1c3022" stroke-width="1.51"/><path d="M-117,3L-38,73L-39,7Z" fill="#1c3022" stroke="#1c3022" stroke-width="1.51"/><path d="M1501,228L1465,118L1318,235Z" fill="#1f1e2d" stroke="#1f1e2d" stroke-width="1.51"/><path d="M1348,116L1465,118L1324,-3Z" fill="#1f202b" stroke="#1f202b" stroke-width="1.51"/><path d="M1386,431L1476,362L1377,345Z" fill="#1d142d" stroke="#1d142d" stroke-width="1.51"/><path d="M1476,551L1386,431L1355,543Z" fill="#1d0e2c" stroke="#1d0e2c" stroke-width="1.51"/><path d="M1476,551L1355,543L1459,701Z" fill="#1e0d2b" stroke="#1e0d2b" stroke-width="1.51"/><path d="M-110,-95L-117,3L-39,7Z" fill="#1f2e1e" stroke="#1f2e1e" stroke-width="1.51"/><path d="M1473,419L1476,362L1386,431Z" fill="#1e132d" stroke="#1e132d" stroke-width="1.51"/><path d="M73,-154L-7,-152L118,-15Z" fill="#1e2f20" stroke="#1e2f20" stroke-width="1.51"/><path d="M1459,701L1355,543L1367,710Z" fill="#1d0c2a" stroke="#1d0c2a" stroke-width="1.51"/><path d="M1579,184L1501,228L1612,342Z" fill="#231c2d" stroke="#231c2d" stroke-width="1.51"/><path d="M1467,827L1459,701L1367,710Z" fill="#1f0a29" stroke="#1f0a29" stroke-width="1.51"/><path d="M1223,992L1344,904L1218,912Z" fill="#220a29" stroke="#220a29" stroke-width="1.51"/><path d="M-15,943L-43,1000L72,1047Z" fill="#261e25" stroke="#261e25" stroke-width="1.51"/><path d="M-145,939L-43,1000L-15,943Z" fill="#261e23" stroke="#261e23" stroke-width="1.51"/><path d="M1467,827L1367,710L1335,825Z" fill="#1f0a29" stroke="#1f0a29" stroke-width="1.51"/><path d="M-167,117L-175,829L-165,529Z" fill="#1e1f24" stroke="#1e1f24" stroke-width="1.51"/><path d="M-165,529L-175,829L-132,680Z" fill="#1f1d22" stroke="#1f1d22" stroke-width="1.51"/><path d="M-132,680L-175,829L-24,765Z" fill="#1e1c22" stroke="#1e1c22" stroke-width="1.51"/><path d="M1501,228L1318,235L1377,345Z" fill="#1d1a2d" stroke="#1d1a2d" stroke-width="1.51"/><path d="M1324,-3L1384,-153L1246,-36Z" fill="#211e25" stroke="#211e25" stroke-width="1.51"/><path d="M1476,362L1501,228L1377,345Z" fill="#1f182d" stroke="#1f182d" stroke-width="1.51"/><path d="M1567,465L1476,362L1473,419Z" fill="#20122d" stroke="#20122d" stroke-width="1.51"/><path d="M-7,-152L-110,-95L-39,7Z" fill="#1f2e1e" stroke="#1f2e1e" stroke-width="1.51"/><path d="M-117,3L-110,-95L-167,117Z" fill="#1e2f1f" stroke="#1e2f1f" stroke-width="1.51"/><path d="M-175,829L-145,939L-15,943Z" fill="#241d22" stroke="#241d22" stroke-width="1.51"/><path d="M1344,904L1467,827L1335,825Z" fill="#210a29" stroke="#210a29" stroke-width="1.51"/><path d="M1223,992L1339,1016L1344,904Z" fill="#240a29" stroke="#240a29" stroke-width="1.51"/><path d="M990,1060L1339,1016L1094,1029Z" fill="#220b29" stroke="#220b29" stroke-width="1.51"/><path d="M1484,941L1467,827L1344,904Z" fill="#240a29" stroke="#240a29" stroke-width="1.51"/><path d="M1582,529L1567,465L1476,551Z" fill="#210e2c" stroke="#210e2c" stroke-width="1.51"/><path d="M1476,551L1567,465L1473,419Z" fill="#200f2c" stroke="#200f2c" stroke-width="1.51"/><path d="M1582,529L1476,551L1577,710Z" fill="#220d2b" stroke="#220d2b" stroke-width="1.51"/><path d="M1481,-21L1324,-3L1465,118Z" fill="#222029" stroke="#222029" stroke-width="1.51"/><path d="M1481,-21L1384,-153L1324,-3Z" fill="#231e25" stroke="#231e25" stroke-width="1.51"/><path d="M1241,-144L1384,-153L971,-156Z" fill="#201c21" stroke="#201c21" stroke-width="1.51"/><path d="M971,-156L1384,-153L753,-160Z" fill="#1f1d22" stroke="#1f1d22" stroke-width="1.51"/><path d="M1577,710L1476,551L1459,701Z" fill="#210d2a" stroke="#210d2a" stroke-width="1.51"/><path d="M1501,228L1476,362L1612,342Z" fill="#21182d" stroke="#21182d" stroke-width="1.51"/><path d="M1579,184L1465,118L1501,228Z" fill="#211f2d" stroke="#211f2d" stroke-width="1.51"/><path d="M1568,-35L1481,-21L1465,118Z" fill="#252028" stroke="#252028" stroke-width="1.51"/><path d="M-175,829L-136,1054L-145,939Z" fill="#271d21" stroke="#271d21" stroke-width="1.51"/><path d="M-145,939L-136,1054L-43,1000Z" fill="#281d22" stroke="#281d22" stroke-width="1.51"/><path d="M-43,1000L-136,1054L72,1047Z" fill="#291f24" stroke="#291f24" stroke-width="1.51"/><path d="M72,1047L-136,1054L298,1048Z" fill="#272028" stroke="#272028" stroke-width="1.51"/><path d="M1612,342L1476,362L1567,465Z" fill="#21132d" stroke="#21132d" stroke-width="1.51"/><path d="M1582,529L1612,342L1567,465Z" fill="#22102d" stroke="#22102d" stroke-width="1.51"/><path d="M1582,529L1577,710L1612,342Z" fill="#220f2c" stroke="#220f2c" stroke-width="1.51"/><path d="M1565,807L1577,710L1459,701Z" fill="#210a29" stroke="#210a29" stroke-width="1.51"/><path d="M1565,807L1459,701L1467,827Z" fill="#210a29" stroke="#210a29" stroke-width="1.51"/><path d="M1456,1026L1484,941L1344,904Z" fill="#270a29" stroke="#270a29" stroke-width="1.51"/><path d="M1577,908L1565,807L1467,827Z" fill="#250a29" stroke="#250a29" stroke-width="1.51"/><path d="M1484,941L1577,908L1467,827Z" fill="#260a29" stroke="#260a29" stroke-width="1.51"/><path d="M1339,1016L1456,1026L1344,904Z" fill="#260a29" stroke="#260a29" stroke-width="1.51"/><path d="M990,1060L1456,1026L1339,1016Z" fill="#250a29" stroke="#250a29" stroke-width="1.51"/><path d="M1481,-21L1493,-148L1384,-153Z" fill="#261d23" stroke="#261d23" stroke-width="1.51"/><path d="M1568,-35L1493,-148L1481,-21Z" fill="#271e25" stroke="#271e25" stroke-width="1.51"/><path d="M1579,184L1618,111L1465,118Z" fill="#23222d" stroke="#23222d" stroke-width="1.51"/><path d="M1612,342L1618,111L1579,184Z" fill="#241e2d" stroke="#241e2d" stroke-width="1.51"/><path d="M1618,111L1568,-35L1465,118Z" fill="#25212a" stroke="#25212a" stroke-width="1.51"/><path d="M1568,1003L1577,908L1484,941Z" fill="#2a0a29" stroke="#2a0a29" stroke-width="1.51"/><path d="M1565,807L1577,908L1577,710Z" fill="#240a29" stroke="#240a29" stroke-width="1.51"/><path d="M1577,710L1577,908L1612,342Z" fill="#230d2a" stroke="#230d2a" stroke-width="1.51"/><path d="M1456,1026L1568,1003L1484,941Z" fill="#2a0a29" stroke="#2a0a29" stroke-width="1.51"/><path d="M1568,-35L1582,-127L1493,-148Z" fill="#281e23" stroke="#281e23" stroke-width="1.51"/><path d="M1618,111L1582,-127L1568,-35Z" fill="#281f26" stroke="#281f26" stroke-width="1.51"/></svg> \ No newline at end of file diff --git a/src/client/assets/welcome-bg.light.svg b/src/client/assets/welcome-bg.light.svg new file mode 100644 index 0000000000..ebccb648ea --- /dev/null +++ b/src/client/assets/welcome-bg.light.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="1440" height="900"><path d="M741,416L678,396L681,478Z" fill="#f4f4f3" stroke="#f4f4f3" stroke-width="1.51"/><path d="M681,478L777,499L741,416Z" fill="#f2f3f2" stroke="#f2f3f2" stroke-width="1.51"/><path d="M678,396L605,487L681,478Z" fill="#f3f3f2" stroke="#f3f3f2" stroke-width="1.51"/><path d="M681,478L683,560L777,499Z" fill="#edf1ee" stroke="#edf1ee" stroke-width="1.51"/><path d="M760,327L659,322L678,396Z" fill="#f1f1ef" stroke="#f1f1ef" stroke-width="1.51"/><path d="M678,396L571,389L605,487Z" fill="#f2f2f0" stroke="#f2f2f0" stroke-width="1.51"/><path d="M741,416L760,327L678,396Z" fill="#f3f2f1" stroke="#f3f2f1" stroke-width="1.51"/><path d="M854,398L760,327L741,416Z" fill="#eef0ec" stroke="#eef0ec" stroke-width="1.51"/><path d="M605,487L683,560L681,478Z" fill="#edf0ec" stroke="#edf0ec" stroke-width="1.51"/><path d="M659,322L571,389L678,396Z" fill="#f1f1ee" stroke="#f1f1ee" stroke-width="1.51"/><path d="M683,560L783,568L777,499Z" fill="#e7eee9" stroke="#e7eee9" stroke-width="1.51"/><path d="M777,499L854,398L741,416Z" fill="#eef2ef" stroke="#eef2ef" stroke-width="1.51"/><path d="M844,505L854,398L777,499Z" fill="#eaefeb" stroke="#eaefeb" stroke-width="1.51"/><path d="M783,568L844,505L777,499Z" fill="#e6ece7" stroke="#e6ece7" stroke-width="1.51"/><path d="M659,322L596,308L571,389Z" fill="#f0f0eb" stroke="#f0f0eb" stroke-width="1.51"/><path d="M597,246L596,308L659,322Z" fill="#efeee9" stroke="#efeee9" stroke-width="1.51"/><path d="M605,487L579,600L683,560Z" fill="#e7ede7" stroke="#e7ede7" stroke-width="1.51"/><path d="M571,389L512,495L605,487Z" fill="#f1f1ee" stroke="#f1f1ee" stroke-width="1.51"/><path d="M492,390L512,495L571,389Z" fill="#f0f0ec" stroke="#f0f0ec" stroke-width="1.51"/><path d="M760,327L745,238L659,322Z" fill="#f1f0ed" stroke="#f1f0ed" stroke-width="1.51"/><path d="M852,301L745,238L760,327Z" fill="#ebede7" stroke="#ebede7" stroke-width="1.51"/><path d="M512,495L579,600L605,487Z" fill="#e9ede7" stroke="#e9ede7" stroke-width="1.51"/><path d="M764,652L848,599L783,568Z" fill="#dce7de" stroke="#dce7de" stroke-width="1.51"/><path d="M854,398L852,301L760,327Z" fill="#eaeee8" stroke="#eaeee8" stroke-width="1.51"/><path d="M513,332L492,390L571,389Z" fill="#efeeea" stroke="#efeeea" stroke-width="1.51"/><path d="M596,308L513,332L571,389Z" fill="#efefe9" stroke="#efefe9" stroke-width="1.51"/><path d="M521,240L513,332L596,308Z" fill="#edede6" stroke="#edede6" stroke-width="1.51"/><path d="M655,216L597,246L659,322Z" fill="#eeeee8" stroke="#eeeee8" stroke-width="1.51"/><path d="M783,568L848,599L844,505Z" fill="#e0e9e1" stroke="#e0e9e1" stroke-width="1.51"/><path d="M844,505L926,479L854,398Z" fill="#e7ede8" stroke="#e7ede8" stroke-width="1.51"/><path d="M764,652L783,568L683,560Z" fill="#e2eae3" stroke="#e2eae3" stroke-width="1.51"/><path d="M745,238L655,216L659,322Z" fill="#efefea" stroke="#efefea" stroke-width="1.51"/><path d="M691,673L764,652L683,560Z" fill="#e0e9e1" stroke="#e0e9e1" stroke-width="1.51"/><path d="M930,580L926,479L844,505Z" fill="#dee8e0" stroke="#dee8e0" stroke-width="1.51"/><path d="M854,398L924,327L852,301Z" fill="#e5ebe3" stroke="#e5ebe3" stroke-width="1.51"/><path d="M926,479L932,405L854,398Z" fill="#e5ece6" stroke="#e5ece6" stroke-width="1.51"/><path d="M579,600L691,673L683,560Z" fill="#e1e9e1" stroke="#e1e9e1" stroke-width="1.51"/><path d="M852,301L854,250L745,238Z" fill="#e8ebe4" stroke="#e8ebe4" stroke-width="1.51"/><path d="M745,238L695,139L655,216Z" fill="#eeede7" stroke="#eeede7" stroke-width="1.51"/><path d="M932,252L854,250L852,301Z" fill="#e3e9df" stroke="#e3e9df" stroke-width="1.51"/><path d="M932,405L924,327L854,398Z" fill="#e4ebe3" stroke="#e4ebe3" stroke-width="1.51"/><path d="M512,495L484,563L579,600Z" fill="#e5ebe3" stroke="#e5ebe3" stroke-width="1.51"/><path d="M579,600L598,675L691,673Z" fill="#dce6dc" stroke="#dce6dc" stroke-width="1.51"/><path d="M424,483L484,563L512,495Z" fill="#e9ece5" stroke="#e9ece5" stroke-width="1.51"/><path d="M523,666L598,675L579,600Z" fill="#dbe6da" stroke="#dbe6da" stroke-width="1.51"/><path d="M597,246L521,240L596,308Z" fill="#edede6" stroke="#edede6" stroke-width="1.51"/><path d="M403,323L433,428L492,390Z" fill="#eeede7" stroke="#eeede7" stroke-width="1.51"/><path d="M509,138L521,240L597,246Z" fill="#ebeae2" stroke="#ebeae2" stroke-width="1.51"/><path d="M492,390L433,428L512,495Z" fill="#f0efec" stroke="#f0efec" stroke-width="1.51"/><path d="M403,323L492,390L513,332Z" fill="#edede7" stroke="#edede7" stroke-width="1.51"/><path d="M848,599L930,580L844,505Z" fill="#dce7dd" stroke="#dce7dd" stroke-width="1.51"/><path d="M926,479L1021,423L932,405Z" fill="#e1e9e2" stroke="#e1e9e2" stroke-width="1.51"/><path d="M914,673L930,580L848,599Z" fill="#d3e2d5" stroke="#d3e2d5" stroke-width="1.51"/><path d="M433,428L424,483L512,495Z" fill="#eeefe9" stroke="#eeefe9" stroke-width="1.51"/><path d="M439,658L523,666L484,563Z" fill="#dce5d9" stroke="#dce5d9" stroke-width="1.51"/><path d="M484,563L523,666L579,600Z" fill="#dee7dd" stroke="#dee7dd" stroke-width="1.51"/><path d="M764,652L859,684L848,599Z" fill="#d6e4d8" stroke="#d6e4d8" stroke-width="1.51"/><path d="M841,752L859,684L764,652Z" fill="#d0e0d3" stroke="#d0e0d3" stroke-width="1.51"/><path d="M771,770L764,652L691,673Z" fill="#d6e4d9" stroke="#d6e4d9" stroke-width="1.51"/><path d="M781,131L695,139L745,238Z" fill="#ecece5" stroke="#ecece5" stroke-width="1.51"/><path d="M924,327L932,252L852,301Z" fill="#e2e8df" stroke="#e2e8df" stroke-width="1.51"/><path d="M1000,247L932,252L924,327Z" fill="#dde6da" stroke="#dde6da" stroke-width="1.51"/><path d="M781,131L745,238L854,250Z" fill="#e8eae3" stroke="#e8eae3" stroke-width="1.51"/><path d="M655,216L610,125L597,246Z" fill="#ecece4" stroke="#ecece4" stroke-width="1.51"/><path d="M869,153L781,131L854,250Z" fill="#e4e8de" stroke="#e4e8de" stroke-width="1.51"/><path d="M521,240L403,323L513,332Z" fill="#ecebe4" stroke="#ecebe4" stroke-width="1.51"/><path d="M342,409L347,500L424,483Z" fill="#edede7" stroke="#edede7" stroke-width="1.51"/><path d="M930,580L1009,511L926,479Z" fill="#d9e6db" stroke="#d9e6db" stroke-width="1.51"/><path d="M932,405L1014,332L924,327Z" fill="#dfe8de" stroke="#dfe8de" stroke-width="1.51"/><path d="M1044,592L1009,511L930,580Z" fill="#d1e1d4" stroke="#d1e1d4" stroke-width="1.51"/><path d="M859,684L914,673L848,599Z" fill="#d1e1d4" stroke="#d1e1d4" stroke-width="1.51"/><path d="M1009,511L1021,423L926,479Z" fill="#dde7de" stroke="#dde7de" stroke-width="1.51"/><path d="M424,483L415,588L484,563Z" fill="#e5eae1" stroke="#e5eae1" stroke-width="1.51"/><path d="M347,500L415,588L424,483Z" fill="#e6eae1" stroke="#e6eae1" stroke-width="1.51"/><path d="M695,139L610,125L655,216Z" fill="#ecebe3" stroke="#ecebe3" stroke-width="1.51"/><path d="M521,240L403,213L403,323Z" fill="#eaeae1" stroke="#eaeae1" stroke-width="1.51"/><path d="M659,40L610,125L695,139Z" fill="#ebe7df" stroke="#ebe7df" stroke-width="1.51"/><path d="M598,675L697,764L691,673Z" fill="#d6e3d8" stroke="#d6e3d8" stroke-width="1.51"/><path d="M859,684L935,739L914,673Z" fill="#c9ddcd" stroke="#c9ddcd" stroke-width="1.51"/><path d="M523,666L582,742L598,675Z" fill="#d5e2d5" stroke="#d5e2d5" stroke-width="1.51"/><path d="M504,768L582,742L523,666Z" fill="#d1e0d1" stroke="#d1e0d1" stroke-width="1.51"/><path d="M582,742L697,764L598,675Z" fill="#d3e1d4" stroke="#d3e1d4" stroke-width="1.51"/><path d="M932,252L869,153L854,250Z" fill="#e1e7dd" stroke="#e1e7dd" stroke-width="1.51"/><path d="M1021,423L1014,332L932,405Z" fill="#dde7dd" stroke="#dde7dd" stroke-width="1.51"/><path d="M932,252L934,126L869,153Z" fill="#dee5d9" stroke="#dee5d9" stroke-width="1.51"/><path d="M697,764L771,770L691,673Z" fill="#d4e2d6" stroke="#d4e2d6" stroke-width="1.51"/><path d="M415,588L439,658L484,563Z" fill="#dee6da" stroke="#dee6da" stroke-width="1.51"/><path d="M771,770L841,752L764,652Z" fill="#cfe0d2" stroke="#cfe0d2" stroke-width="1.51"/><path d="M610,125L509,138L597,246Z" fill="#eaeae1" stroke="#eaeae1" stroke-width="1.51"/><path d="M1014,332L1000,247L924,327Z" fill="#dce6da" stroke="#dce6da" stroke-width="1.51"/><path d="M342,409L424,483L433,428Z" fill="#eeeee9" stroke="#eeeee9" stroke-width="1.51"/><path d="M415,588L317,676L439,658Z" fill="#d9e2d4" stroke="#d9e2d4" stroke-width="1.51"/><path d="M403,323L342,409L433,428Z" fill="#edece5" stroke="#edece5" stroke-width="1.51"/><path d="M318,300L342,409L403,323Z" fill="#ebebe2" stroke="#ebebe2" stroke-width="1.51"/><path d="M438,164L403,213L521,240Z" fill="#e9e9df" stroke="#e9e9df" stroke-width="1.51"/><path d="M1009,511L1102,487L1021,423Z" fill="#d7e5da" stroke="#d7e5da" stroke-width="1.51"/><path d="M1021,423L1106,419L1014,332Z" fill="#d9e4d9" stroke="#d9e4d9" stroke-width="1.51"/><path d="M1039,662L1044,592L930,580Z" fill="#cbddce" stroke="#cbddce" stroke-width="1.51"/><path d="M1039,662L930,580L914,673Z" fill="#ccdecf" stroke="#ccdecf" stroke-width="1.51"/><path d="M509,138L438,164L521,240Z" fill="#e9e9de" stroke="#e9e9de" stroke-width="1.51"/><path d="M841,752L935,739L859,684Z" fill="#c8dccc" stroke="#c8dccc" stroke-width="1.51"/><path d="M848,838L935,739L841,752Z" fill="#c3d9c8" stroke="#c3d9c8" stroke-width="1.51"/><path d="M439,658L504,768L523,666Z" fill="#d4e1d2" stroke="#d4e1d2" stroke-width="1.51"/><path d="M582,742L595,833L697,764Z" fill="#ceded0" stroke="#ceded0" stroke-width="1.51"/><path d="M697,764L752,857L771,770Z" fill="#cdded2" stroke="#cdded2" stroke-width="1.51"/><path d="M1000,247L934,126L932,252Z" fill="#dbe4d7" stroke="#dbe4d7" stroke-width="1.51"/><path d="M869,153L847,70L781,131Z" fill="#e4e5da" stroke="#e4e5da" stroke-width="1.51"/><path d="M754,40L659,40L695,139Z" fill="#ece5de" stroke="#ece5de" stroke-width="1.51"/><path d="M925,70L847,70L869,153Z" fill="#dfe1d5" stroke="#dfe1d5" stroke-width="1.51"/><path d="M610,125L596,39L509,138Z" fill="#e9e5dc" stroke="#e9e5dc" stroke-width="1.51"/><path d="M754,40L695,139L781,131Z" fill="#eae7df" stroke="#eae7df" stroke-width="1.51"/><path d="M509,138L481,39L438,164Z" fill="#e7e4d9" stroke="#e7e4d9" stroke-width="1.51"/><path d="M847,70L754,40L781,131Z" fill="#e6e3da" stroke="#e6e3da" stroke-width="1.51"/><path d="M439,658L431,757L504,768Z" fill="#d0dece" stroke="#d0dece" stroke-width="1.51"/><path d="M347,500L320,574L415,588Z" fill="#e2e8dd" stroke="#e2e8dd" stroke-width="1.51"/><path d="M252,484L320,574L347,500Z" fill="#e5e8de" stroke="#e5e8de" stroke-width="1.51"/><path d="M1044,592L1102,487L1009,511Z" fill="#d0e1d4" stroke="#d0e1d4" stroke-width="1.51"/><path d="M1014,332L1093,313L1000,247Z" fill="#d7e2d5" stroke="#d7e2d5" stroke-width="1.51"/><path d="M403,213L318,300L403,323Z" fill="#e9e9df" stroke="#e9e9df" stroke-width="1.51"/><path d="M342,409L252,484L347,500Z" fill="#ecece5" stroke="#ecece5" stroke-width="1.51"/><path d="M336,215L318,300L403,213Z" fill="#e8e8dd" stroke="#e8e8dd" stroke-width="1.51"/><path d="M1102,487L1106,419L1021,423Z" fill="#d8e5da" stroke="#d8e5da" stroke-width="1.51"/><path d="M1000,247L1035,167L934,126Z" fill="#d8e2d3" stroke="#d8e2d3" stroke-width="1.51"/><path d="M935,739L1039,662L914,673Z" fill="#c5dbc9" stroke="#c5dbc9" stroke-width="1.51"/><path d="M1044,592L1121,583L1102,487Z" fill="#cbdece" stroke="#cbdece" stroke-width="1.51"/><path d="M516,826L595,833L582,742Z" fill="#cbdcce" stroke="#cbdcce" stroke-width="1.51"/><path d="M771,770L848,838L841,752Z" fill="#c7dbcc" stroke="#c7dbcc" stroke-width="1.51"/><path d="M659,40L596,39L610,125Z" fill="#eae3db" stroke="#eae3db" stroke-width="1.51"/><path d="M661,-27L596,39L659,40Z" fill="#eadfd7" stroke="#eadfd7" stroke-width="1.51"/><path d="M1106,419L1093,313L1014,332Z" fill="#d6e3d6" stroke="#d6e3d6" stroke-width="1.51"/><path d="M504,768L516,826L582,742Z" fill="#ccddcd" stroke="#ccddcd" stroke-width="1.51"/><path d="M317,676L431,757L439,658Z" fill="#d2dfcf" stroke="#d2dfcf" stroke-width="1.51"/><path d="M595,833L691,858L697,764Z" fill="#cbddd1" stroke="#cbddd1" stroke-width="1.51"/><path d="M691,858L752,857L697,764Z" fill="#ccddd2" stroke="#ccddd2" stroke-width="1.51"/><path d="M353,127L403,213L438,164Z" fill="#e7e6db" stroke="#e7e6db" stroke-width="1.51"/><path d="M353,127L336,215L403,213Z" fill="#e6e6da" stroke="#e6e6da" stroke-width="1.51"/><path d="M752,857L848,838L771,770Z" fill="#c7dacd" stroke="#c7dacd" stroke-width="1.51"/><path d="M935,739L1021,771L1039,662Z" fill="#bfd7c3" stroke="#bfd7c3" stroke-width="1.51"/><path d="M934,126L925,70L869,153Z" fill="#dde1d5" stroke="#dde1d5" stroke-width="1.51"/><path d="M1121,236L1035,167L1000,247Z" fill="#d4e0d0" stroke="#d4e0d0" stroke-width="1.51"/><path d="M857,-32L751,-25L754,40Z" fill="#e6dcd3" stroke="#e6dcd3" stroke-width="1.51"/><path d="M1020,81L925,70L934,126Z" fill="#d9ddce" stroke="#d9ddce" stroke-width="1.51"/><path d="M426,848L516,826L504,768Z" fill="#c8d9ca" stroke="#c8d9ca" stroke-width="1.51"/><path d="M595,833L598,906L691,858Z" fill="#c7d9cd" stroke="#c7d9cd" stroke-width="1.51"/><path d="M1114,656L1121,583L1044,592Z" fill="#c4d9c8" stroke="#c4d9c8" stroke-width="1.51"/><path d="M1102,487L1185,403L1106,419Z" fill="#d3e2d6" stroke="#d3e2d6" stroke-width="1.51"/><path d="M239,415L342,409L232,341Z" fill="#ebeae1" stroke="#ebeae1" stroke-width="1.51"/><path d="M239,415L252,484L342,409Z" fill="#ecebe4" stroke="#ecebe4" stroke-width="1.51"/><path d="M320,574L317,676L415,588Z" fill="#dbe3d6" stroke="#dbe3d6" stroke-width="1.51"/><path d="M265,661L317,676L320,574Z" fill="#d8e1d2" stroke="#d8e1d2" stroke-width="1.51"/><path d="M481,907L598,906L516,826Z" fill="#c4d7ca" stroke="#c4d7ca" stroke-width="1.51"/><path d="M596,39L481,39L509,138Z" fill="#e8e2d8" stroke="#e8e2d8" stroke-width="1.51"/><path d="M232,341L342,409L318,300Z" fill="#eae9e1" stroke="#eae9e1" stroke-width="1.51"/><path d="M1039,662L1114,656L1044,592Z" fill="#c3d9c7" stroke="#c3d9c7" stroke-width="1.51"/><path d="M1003,828L1021,771L935,739Z" fill="#bad4c0" stroke="#bad4c0" stroke-width="1.51"/><path d="M754,40L751,-25L659,40Z" fill="#ebe1da" stroke="#ebe1da" stroke-width="1.51"/><path d="M596,39L496,-7L481,39Z" fill="#e8ddd4" stroke="#e8ddd4" stroke-width="1.51"/><path d="M857,-32L754,40L847,70Z" fill="#e4ddd3" stroke="#e4ddd3" stroke-width="1.51"/><path d="M425,40L353,127L438,164Z" fill="#e6e3d7" stroke="#e6e3d7" stroke-width="1.51"/><path d="M247,249L232,341L318,300Z" fill="#e8e6dc" stroke="#e8e6dc" stroke-width="1.51"/><path d="M751,-25L661,-27L659,40Z" fill="#ebded7" stroke="#ebded7" stroke-width="1.51"/><path d="M1093,313L1121,236L1000,247Z" fill="#d3e0d1" stroke="#d3e0d1" stroke-width="1.51"/><path d="M1035,167L1020,81L934,126Z" fill="#d6decf" stroke="#d6decf" stroke-width="1.51"/><path d="M1213,315L1121,236L1093,313Z" fill="#cedecd" stroke="#cedecd" stroke-width="1.51"/><path d="M1185,403L1093,313L1106,419Z" fill="#d2e1d3" stroke="#d2e1d3" stroke-width="1.51"/><path d="M1093,741L1114,656L1039,662Z" fill="#bcd5c1" stroke="#bcd5c1" stroke-width="1.51"/><path d="M247,249L318,300L336,215Z" fill="#e7e7dc" stroke="#e7e7dc" stroke-width="1.51"/><path d="M1114,139L1020,81L1035,167Z" fill="#d1dccb" stroke="#d1dccb" stroke-width="1.51"/><path d="M925,70L857,-32L847,70Z" fill="#dfdcd0" stroke="#dfdcd0" stroke-width="1.51"/><path d="M661,-27L577,-27L596,39Z" fill="#e9ddd4" stroke="#e9ddd4" stroke-width="1.51"/><path d="M426,848L504,768L431,757Z" fill="#cadaca" stroke="#cadaca" stroke-width="1.51"/><path d="M516,826L598,906L595,833Z" fill="#c6d9cc" stroke="#c6d9cc" stroke-width="1.51"/><path d="M691,858L757,921L752,857Z" fill="#c7dacf" stroke="#c7dacf" stroke-width="1.51"/><path d="M840,910L941,859L848,838Z" fill="#bcd4c5" stroke="#bcd4c5" stroke-width="1.51"/><path d="M496,-7L425,40L481,39Z" fill="#e7dcd2" stroke="#e7dcd2" stroke-width="1.51"/><path d="M481,39L425,40L438,164Z" fill="#e7e1d6" stroke="#e7e1d6" stroke-width="1.51"/><path d="M147,423L252,484L239,415Z" fill="#ece7e0" stroke="#ece7e0" stroke-width="1.51"/><path d="M164,575L241,587L252,484Z" fill="#e1e1d7" stroke="#e1e1d7" stroke-width="1.51"/><path d="M252,484L241,587L320,574Z" fill="#e1e5da" stroke="#e1e5da" stroke-width="1.51"/><path d="M265,661L319,736L317,676Z" fill="#d1ddcc" stroke="#d1ddcc" stroke-width="1.51"/><path d="M317,676L319,736L431,757Z" fill="#cfddcb" stroke="#cfddcb" stroke-width="1.51"/><path d="M1187,514L1102,487L1121,583Z" fill="#caddcd" stroke="#caddcd" stroke-width="1.51"/><path d="M1187,514L1185,403L1102,487Z" fill="#cfe0d3" stroke="#cfe0d3" stroke-width="1.51"/><path d="M848,838L941,859L935,739Z" fill="#bdd5c5" stroke="#bdd5c5" stroke-width="1.51"/><path d="M840,910L848,838L752,857Z" fill="#c1d7ca" stroke="#c1d7ca" stroke-width="1.51"/><path d="M577,-27L496,-7L596,39Z" fill="#e8dcd3" stroke="#e8dcd3" stroke-width="1.51"/><path d="M687,939L757,921L691,858Z" fill="#c5d9cf" stroke="#c5d9cf" stroke-width="1.51"/><path d="M241,587L265,661L320,574Z" fill="#dae2d3" stroke="#dae2d3" stroke-width="1.51"/><path d="M225,125L336,215L353,127Z" fill="#e5e4d7" stroke="#e5e4d7" stroke-width="1.51"/><path d="M225,125L247,249L336,215Z" fill="#e6e4d7" stroke="#e6e4d7" stroke-width="1.51"/><path d="M1184,577L1187,514L1121,583Z" fill="#c5dac9" stroke="#c5dac9" stroke-width="1.51"/><path d="M953,-21L857,-32L925,70Z" fill="#dcd8cb" stroke="#dcd8cb" stroke-width="1.51"/><path d="M751,-25L666,-95L661,-27Z" fill="#ebdad4" stroke="#ebdad4" stroke-width="1.51"/><path d="M661,-27L591,-101L577,-27Z" fill="#e9d9d0" stroke="#e9d9d0" stroke-width="1.51"/><path d="M757,921L840,910L752,857Z" fill="#c1d6cb" stroke="#c1d6cb" stroke-width="1.51"/><path d="M319,736L426,848L431,757Z" fill="#c9dac8" stroke="#c9dac8" stroke-width="1.51"/><path d="M1021,771L1093,741L1039,662Z" fill="#bad5bf" stroke="#bad5bf" stroke-width="1.51"/><path d="M941,859L1003,828L935,739Z" fill="#bad3c1" stroke="#bad3c1" stroke-width="1.51"/><path d="M1043,903L1003,828L941,859Z" fill="#b2cfbd" stroke="#b2cfbd" stroke-width="1.51"/><path d="M1110,818L1093,741L1021,771Z" fill="#b3d0b9" stroke="#b3d0b9" stroke-width="1.51"/><path d="M1114,656L1184,577L1121,583Z" fill="#c1d8c5" stroke="#c1d8c5" stroke-width="1.51"/><path d="M870,1015L917,930L840,910Z" fill="#b5cfc3" stroke="#b5cfc3" stroke-width="1.51"/><path d="M598,906L687,939L691,858Z" fill="#c5d8cd" stroke="#c5d8cd" stroke-width="1.51"/><path d="M683,991L687,939L598,906Z" fill="#c1d5cb" stroke="#c1d5cb" stroke-width="1.51"/><path d="M1184,688L1184,577L1114,656Z" fill="#bbd4c0" stroke="#bbd4c0" stroke-width="1.51"/><path d="M1016,-5L953,-21L925,70Z" fill="#d8d6c7" stroke="#d8d6c7" stroke-width="1.51"/><path d="M1121,236L1114,139L1035,167Z" fill="#d0ddcb" stroke="#d0ddcb" stroke-width="1.51"/><path d="M1190,163L1114,139L1121,236Z" fill="#ccdbc7" stroke="#ccdbc7" stroke-width="1.51"/><path d="M425,40L336,72L353,127Z" fill="#e5dfd3" stroke="#e5dfd3" stroke-width="1.51"/><path d="M343,-19L336,72L425,40Z" fill="#e5dbcf" stroke="#e5dbcf" stroke-width="1.51"/><path d="M426,848L481,907L516,826Z" fill="#c4d6c8" stroke="#c4d6c8" stroke-width="1.51"/><path d="M400,933L481,907L426,848Z" fill="#c1d4c6" stroke="#c1d4c6" stroke-width="1.51"/><path d="M1016,-5L925,70L1020,81Z" fill="#d6d8c9" stroke="#d6d8c9" stroke-width="1.51"/><path d="M1185,403L1213,315L1093,313Z" fill="#cedecf" stroke="#cedecf" stroke-width="1.51"/><path d="M1273,400L1213,315L1185,403Z" fill="#ccdccf" stroke="#ccdccf" stroke-width="1.51"/><path d="M1273,400L1185,403L1293,477Z" fill="#ccddd1" stroke="#ccddd1" stroke-width="1.51"/><path d="M577,-27L492,-108L496,-7Z" fill="#e7d7ce" stroke="#e7d7ce" stroke-width="1.51"/><path d="M496,-7L420,-42L425,40Z" fill="#e6dace" stroke="#e6dace" stroke-width="1.51"/><path d="M772,-110L666,-95L751,-25Z" fill="#ead8d2" stroke="#ead8d2" stroke-width="1.51"/><path d="M772,-110L751,-25L857,-32Z" fill="#e5d7ce" stroke="#e5d7ce" stroke-width="1.51"/><path d="M840,910L917,930L941,859Z" fill="#b7d1c2" stroke="#b7d1c2" stroke-width="1.51"/><path d="M1195,761L1184,688L1093,741Z" fill="#b1d0b7" stroke="#b1d0b7" stroke-width="1.51"/><path d="M754,1005L840,910L757,921Z" fill="#bdd4c9" stroke="#bdd4c9" stroke-width="1.51"/><path d="M1090,57L1016,-5L1020,81Z" fill="#d2d5c4" stroke="#d2d5c4" stroke-width="1.51"/><path d="M864,-125L772,-110L857,-32Z" fill="#e1d2c9" stroke="#e1d2c9" stroke-width="1.51"/><path d="M1114,139L1090,57L1020,81Z" fill="#cfd8c6" stroke="#cfd8c6" stroke-width="1.51"/><path d="M1184,73L1090,57L1114,139Z" fill="#cbd5c2" stroke="#cbd5c2" stroke-width="1.51"/><path d="M1293,477L1185,403L1187,514Z" fill="#ccded2" stroke="#ccded2" stroke-width="1.51"/><path d="M1093,741L1184,688L1114,656Z" fill="#b7d3bc" stroke="#b7d3bc" stroke-width="1.51"/><path d="M1110,818L1021,771L1003,828Z" fill="#b3d0bb" stroke="#b3d0bb" stroke-width="1.51"/><path d="M666,-95L591,-101L661,-27Z" fill="#e9d7cf" stroke="#e9d7cf" stroke-width="1.51"/><path d="M864,-125L857,-32L932,-133Z" fill="#ddcfc4" stroke="#ddcfc4" stroke-width="1.51"/><path d="M666,-95L772,-110L591,-101Z" fill="#e9d5ce" stroke="#e9d5ce" stroke-width="1.51"/><path d="M232,341L147,423L239,415Z" fill="#ebe6dd" stroke="#ebe6dd" stroke-width="1.51"/><path d="M241,587L157,669L265,661Z" fill="#d6ddcd" stroke="#d6ddcd" stroke-width="1.51"/><path d="M141,302L147,423L232,341Z" fill="#eae3d9" stroke="#eae3d9" stroke-width="1.51"/><path d="M165,251L232,341L247,249Z" fill="#e7e3d8" stroke="#e7e3d8" stroke-width="1.51"/><path d="M136,501L164,575L252,484Z" fill="#e4e1d7" stroke="#e4e1d7" stroke-width="1.51"/><path d="M265,661L243,762L319,736Z" fill="#cedac8" stroke="#cedac8" stroke-width="1.51"/><path d="M319,736L311,858L426,848Z" fill="#c6d7c6" stroke="#c6d7c6" stroke-width="1.51"/><path d="M492,-108L420,-42L496,-7Z" fill="#e6d6cb" stroke="#e6d6cb" stroke-width="1.51"/><path d="M1213,315L1208,214L1121,236Z" fill="#cbdbca" stroke="#cbdbca" stroke-width="1.51"/><path d="M687,939L754,1005L757,921Z" fill="#c0d6cd" stroke="#c0d6cd" stroke-width="1.51"/><path d="M606,1030L683,991L598,906Z" fill="#bed3c9" stroke="#bed3c9" stroke-width="1.51"/><path d="M1043,903L1110,818L1003,828Z" fill="#afcdb9" stroke="#afcdb9" stroke-width="1.51"/><path d="M170,746L243,762L265,661Z" fill="#cdd7c5" stroke="#cdd7c5" stroke-width="1.51"/><path d="M1208,214L1190,163L1121,236Z" fill="#cadac8" stroke="#cadac8" stroke-width="1.51"/><path d="M225,125L353,127L336,72Z" fill="#e4e1d3" stroke="#e4e1d3" stroke-width="1.51"/><path d="M225,125L165,251L247,249Z" fill="#e5e1d4" stroke="#e5e1d4" stroke-width="1.51"/><path d="M86,589L136,501L62,472Z" fill="#e3dcd2" stroke="#e3dcd2" stroke-width="1.51"/><path d="M147,423L136,501L252,484Z" fill="#eae4dd" stroke="#eae4dd" stroke-width="1.51"/><path d="M255,61L225,125L336,72Z" fill="#e4ddcf" stroke="#e4ddcf" stroke-width="1.51"/><path d="M683,991L754,1005L687,939Z" fill="#c0d5cc" stroke="#c0d5cc" stroke-width="1.51"/><path d="M516,1028L606,1030L598,906Z" fill="#bcd1c7" stroke="#bcd1c7" stroke-width="1.51"/><path d="M243,762L311,858L319,736Z" fill="#c7d7c4" stroke="#c7d7c4" stroke-width="1.51"/><path d="M1293,477L1187,514L1292,592Z" fill="#c3d8ca" stroke="#c3d8ca" stroke-width="1.51"/><path d="M1213,315L1302,245L1208,214Z" fill="#c7d9c9" stroke="#c7d9c9" stroke-width="1.51"/><path d="M165,251L141,302L232,341Z" fill="#e8e1d7" stroke="#e8e1d7" stroke-width="1.51"/><path d="M420,-42L343,-19L425,40Z" fill="#e5d8cd" stroke="#e5d8cd" stroke-width="1.51"/><path d="M412,-112L343,-19L420,-42Z" fill="#e4d4c8" stroke="#e4d4c8" stroke-width="1.51"/><path d="M1014,1027L1043,903L917,930Z" fill="#accaba" stroke="#accaba" stroke-width="1.51"/><path d="M917,930L1043,903L941,859Z" fill="#b2cebd" stroke="#b2cebd" stroke-width="1.51"/><path d="M311,858L400,933L426,848Z" fill="#c1d4c4" stroke="#c1d4c4" stroke-width="1.51"/><path d="M343,-19L255,61L336,72Z" fill="#e4dbcd" stroke="#e4dbcd" stroke-width="1.51"/><path d="M225,125L146,150L165,251Z" fill="#e5ded1" stroke="#e5ded1" stroke-width="1.51"/><path d="M591,-101L492,-108L577,-27Z" fill="#e7d5cc" stroke="#e7d5cc" stroke-width="1.51"/><path d="M772,-110L492,-108L591,-101Z" fill="#e8d4cc" stroke="#e8d4cc" stroke-width="1.51"/><path d="M932,-133L857,-32L953,-21Z" fill="#dbd1c5" stroke="#dbd1c5" stroke-width="1.51"/><path d="M772,-110L864,-125L492,-108Z" fill="#ead5ce" stroke="#ead5ce" stroke-width="1.51"/><path d="M243,762L256,859L311,858Z" fill="#c4d4c2" stroke="#c4d4c2" stroke-width="1.51"/><path d="M164,575L157,669L241,587Z" fill="#dadcce" stroke="#dadcce" stroke-width="1.51"/><path d="M86,589L157,669L164,575Z" fill="#d9d9cb" stroke="#d9d9cb" stroke-width="1.51"/><path d="M1200,836L1195,761L1110,818Z" fill="#aacab3" stroke="#aacab3" stroke-width="1.51"/><path d="M1110,818L1195,761L1093,741Z" fill="#afceb6" stroke="#afceb6" stroke-width="1.51"/><path d="M1292,592L1187,514L1184,577Z" fill="#c1d8c7" stroke="#c1d8c7" stroke-width="1.51"/><path d="M1292,592L1184,577L1287,654Z" fill="#b9d3c1" stroke="#b9d3c1" stroke-width="1.51"/><path d="M516,1028L598,906L481,907Z" fill="#bfd3c7" stroke="#bfd3c7" stroke-width="1.51"/><path d="M683,991L606,1030L754,1005Z" fill="#bcd2ca" stroke="#bcd2ca" stroke-width="1.51"/><path d="M754,1005L870,1015L840,910Z" fill="#b7d0c6" stroke="#b7d0c6" stroke-width="1.51"/><path d="M606,1030L870,1015L754,1005Z" fill="#bad2ca" stroke="#bad2ca" stroke-width="1.51"/><path d="M1022,-108L932,-133L953,-21Z" fill="#d7cdbf" stroke="#d7cdbf" stroke-width="1.51"/><path d="M1090,57L1087,-29L1016,-5Z" fill="#d0d1c0" stroke="#d0d1c0" stroke-width="1.51"/><path d="M1190,163L1184,73L1114,139Z" fill="#c9d7c3" stroke="#c9d7c3" stroke-width="1.51"/><path d="M1259,129L1184,73L1190,163Z" fill="#c6d4c2" stroke="#c6d4c2" stroke-width="1.51"/><path d="M1259,129L1190,163L1208,214Z" fill="#c6d7c5" stroke="#c6d7c5" stroke-width="1.51"/><path d="M1191,-40L1087,-29L1090,57Z" fill="#cbcdba" stroke="#cbcdba" stroke-width="1.51"/><path d="M1273,400L1301,336L1213,315Z" fill="#c9dacd" stroke="#c9dacd" stroke-width="1.51"/><path d="M1367,403L1301,336L1273,400Z" fill="#c7d9cd" stroke="#c7d9cd" stroke-width="1.51"/><path d="M1287,654L1184,577L1184,688Z" fill="#b8d3bf" stroke="#b8d3bf" stroke-width="1.51"/><path d="M1293,477L1367,403L1273,400Z" fill="#c8dbd0" stroke="#c8dbd0" stroke-width="1.51"/><path d="M178,821L256,859L243,762Z" fill="#c4d2bf" stroke="#c4d2bf" stroke-width="1.51"/><path d="M311,858L334,941L400,933Z" fill="#bed1c2" stroke="#bed1c2" stroke-width="1.51"/><path d="M157,669L170,746L265,661Z" fill="#d0d8c6" stroke="#d0d8c6" stroke-width="1.51"/><path d="M348,-127L412,-112L492,-108Z" fill="#e4cfc4" stroke="#e4cfc4" stroke-width="1.51"/><path d="M1022,-108L953,-21L1016,-5Z" fill="#d5cfc0" stroke="#d5cfc0" stroke-width="1.51"/><path d="M238,-42L163,72L255,61Z" fill="#e3d5c8" stroke="#e3d5c8" stroke-width="1.51"/><path d="M492,-108L412,-112L420,-42Z" fill="#e5d2c7" stroke="#e5d2c7" stroke-width="1.51"/><path d="M348,-127L492,-108L864,-125Z" fill="#e7d2c9" stroke="#e7d2c9" stroke-width="1.51"/><path d="M418,1011L481,907L400,933Z" fill="#bcd1c4" stroke="#bcd1c4" stroke-width="1.51"/><path d="M418,1011L516,1028L481,907Z" fill="#bad0c4" stroke="#bad0c4" stroke-width="1.51"/><path d="M260,932L334,941L311,858Z" fill="#bed1c1" stroke="#bed1c1" stroke-width="1.51"/><path d="M163,72L146,150L225,125Z" fill="#e4dacc" stroke="#e4dacc" stroke-width="1.51"/><path d="M63,247L75,313L141,302Z" fill="#e7dcd1" stroke="#e7dcd1" stroke-width="1.51"/><path d="M163,72L225,125L255,61Z" fill="#e3dacc" stroke="#e3dacc" stroke-width="1.51"/><path d="M1283,769L1287,654L1184,688Z" fill="#afcdb7" stroke="#afcdb7" stroke-width="1.51"/><path d="M1301,336L1302,245L1213,315Z" fill="#c7d9ca" stroke="#c7d9ca" stroke-width="1.51"/><path d="M1119,-104L1022,-108L1087,-29Z" fill="#cec9b7" stroke="#cec9b7" stroke-width="1.51"/><path d="M1087,-29L1022,-108L1016,-5Z" fill="#d1cdbd" stroke="#d1cdbd" stroke-width="1.51"/><path d="M136,501L86,589L164,575Z" fill="#e0dbd0" stroke="#e0dbd0" stroke-width="1.51"/><path d="M157,669L65,684L170,746Z" fill="#cfd3c1" stroke="#cfd3c1" stroke-width="1.51"/><path d="M62,472L136,501L147,423Z" fill="#eae1d9" stroke="#eae1d9" stroke-width="1.51"/><path d="M75,313L147,423L141,302Z" fill="#e9dfd6" stroke="#e9dfd6" stroke-width="1.51"/><path d="M1195,761L1283,769L1184,688Z" fill="#acccb5" stroke="#acccb5" stroke-width="1.51"/><path d="M1043,903L1124,911L1110,818Z" fill="#aac9b5" stroke="#aac9b5" stroke-width="1.51"/><path d="M1124,989L1124,911L1043,903Z" fill="#a5c6b3" stroke="#a5c6b3" stroke-width="1.51"/><path d="M63,247L141,302L165,251Z" fill="#e7ddd2" stroke="#e7ddd2" stroke-width="1.51"/><path d="M1191,-40L1119,-104L1087,-29Z" fill="#cac8b5" stroke="#cac8b5" stroke-width="1.51"/><path d="M1302,245L1259,129L1208,214Z" fill="#c5d7c5" stroke="#c5d7c5" stroke-width="1.51"/><path d="M60,406L62,472L147,423Z" fill="#ebe0d8" stroke="#ebe0d8" stroke-width="1.51"/><path d="M334,941L418,1011L400,933Z" fill="#bbcfc2" stroke="#bbcfc2" stroke-width="1.51"/><path d="M1124,911L1200,836L1110,818Z" fill="#a7c9b2" stroke="#a7c9b2" stroke-width="1.51"/><path d="M870,1015L950,1026L917,930Z" fill="#afccbe" stroke="#afccbe" stroke-width="1.51"/><path d="M606,1030L950,1026L870,1015Z" fill="#b5cec5" stroke="#b5cec5" stroke-width="1.51"/><path d="M75,313L60,406L147,423Z" fill="#e9ded6" stroke="#e9ded6" stroke-width="1.51"/><path d="M53,774L178,821L170,746Z" fill="#c7cebb" stroke="#c7cebb" stroke-width="1.51"/><path d="M170,746L178,821L243,762Z" fill="#c7d2bf" stroke="#c7d2bf" stroke-width="1.51"/><path d="M256,859L260,932L311,858Z" fill="#bfd1c0" stroke="#bfd1c0" stroke-width="1.51"/><path d="M334,941L312,1020L418,1011Z" fill="#b8cdc0" stroke="#b8cdc0" stroke-width="1.51"/><path d="M146,150L63,247L165,251Z" fill="#e5dccf" stroke="#e5dccf" stroke-width="1.51"/><path d="M238,-42L255,61L343,-19Z" fill="#e3d6c9" stroke="#e3d6c9" stroke-width="1.51"/><path d="M147,938L260,932L256,859Z" fill="#bdcdbc" stroke="#bdcdbc" stroke-width="1.51"/><path d="M412,-112L348,-127L343,-19Z" fill="#e3d1c5" stroke="#e3d1c5" stroke-width="1.51"/><path d="M932,-133L348,-127L864,-125Z" fill="#ead4cd" stroke="#ead4cd" stroke-width="1.51"/><path d="M-12,302L-6,427L60,406Z" fill="#e9d9d1" stroke="#e9d9d1" stroke-width="1.51"/><path d="M76,150L63,247L146,150Z" fill="#e4d9cc" stroke="#e4d9cc" stroke-width="1.51"/><path d="M249,-116L238,-42L343,-19Z" fill="#e2d1c4" stroke="#e2d1c4" stroke-width="1.51"/><path d="M1345,669L1350,584L1292,592Z" fill="#b5d0bf" stroke="#b5d0bf" stroke-width="1.51"/><path d="M1292,592L1350,584L1293,477Z" fill="#bdd5c6" stroke="#bdd5c6" stroke-width="1.51"/><path d="M1301,336L1367,325L1302,245Z" fill="#c4d7c9" stroke="#c4d7c9" stroke-width="1.51"/><path d="M1345,669L1292,592L1287,654Z" fill="#b3cfbd" stroke="#b3cfbd" stroke-width="1.51"/><path d="M1382,498L1367,403L1293,477Z" fill="#c6d9cf" stroke="#c6d9cf" stroke-width="1.51"/><path d="M1389,78L1261,67L1259,129Z" fill="#c1cebd" stroke="#c1cebd" stroke-width="1.51"/><path d="M950,1026L1014,1027L917,930Z" fill="#abc9bb" stroke="#abc9bb" stroke-width="1.51"/><path d="M1280,824L1195,761L1200,836Z" fill="#a7c8b1" stroke="#a7c8b1" stroke-width="1.51"/><path d="M606,1030L1014,1027L950,1026Z" fill="#b0ccc1" stroke="#b0ccc1" stroke-width="1.51"/><path d="M1280,824L1283,769L1195,761Z" fill="#a7c8b1" stroke="#a7c8b1" stroke-width="1.51"/><path d="M1187,933L1200,836L1124,911Z" fill="#a3c6b0" stroke="#a3c6b0" stroke-width="1.51"/><path d="M1259,129L1261,67L1184,73Z" fill="#c5d1be" stroke="#c5d1be" stroke-width="1.51"/><path d="M1354,168L1259,129L1302,245Z" fill="#c2d4c3" stroke="#c2d4c3" stroke-width="1.51"/><path d="M1367,403L1367,325L1301,336Z" fill="#c4d7cb" stroke="#c4d7cb" stroke-width="1.51"/><path d="M265,1033L312,1020L260,932Z" fill="#b6cbbd" stroke="#b6cbbd" stroke-width="1.51"/><path d="M86,589L65,684L157,669Z" fill="#d5d5c5" stroke="#d5d5c5" stroke-width="1.51"/><path d="M4,663L65,684L86,589Z" fill="#d5d2c2" stroke="#d5d2c2" stroke-width="1.51"/><path d="M-23,562L86,589L62,472Z" fill="#e1d7cd" stroke="#e1d7cd" stroke-width="1.51"/><path d="M1191,-40L1090,57L1184,73Z" fill="#c9cfbb" stroke="#c9cfbb" stroke-width="1.51"/><path d="M1022,-108L1119,-104L932,-133Z" fill="#d2c8b9" stroke="#d2c8b9" stroke-width="1.51"/><path d="M1261,67L1191,-40L1184,73Z" fill="#c6cdba" stroke="#c6cdba" stroke-width="1.51"/><path d="M1367,403L1456,317L1367,325Z" fill="#c1d5ca" stroke="#c1d5ca" stroke-width="1.51"/><path d="M1350,584L1382,498L1293,477Z" fill="#bfd5c9" stroke="#bfd5c9" stroke-width="1.51"/><path d="M1433,478L1382,498L1450,600Z" fill="#bad2c6" stroke="#bad2c6" stroke-width="1.51"/><path d="M1283,769L1345,669L1287,654Z" fill="#adcbb7" stroke="#adcbb7" stroke-width="1.51"/><path d="M163,72L76,150L146,150Z" fill="#e3d8ca" stroke="#e3d8ca" stroke-width="1.51"/><path d="M81,44L76,150L163,72Z" fill="#e3d4c6" stroke="#e3d4c6" stroke-width="1.51"/><path d="M1367,325L1367,247L1302,245Z" fill="#c2d5c7" stroke="#c2d5c7" stroke-width="1.51"/><path d="M1456,317L1367,247L1367,325Z" fill="#bfd3c7" stroke="#bfd3c7" stroke-width="1.51"/><path d="M1283,769L1382,751L1345,669Z" fill="#a7c8b3" stroke="#a7c8b3" stroke-width="1.51"/><path d="M1124,989L1187,933L1124,911Z" fill="#a0c4af" stroke="#a0c4af" stroke-width="1.51"/><path d="M1014,1027L1124,989L1043,903Z" fill="#a5c6b4" stroke="#a5c6b4" stroke-width="1.51"/><path d="M1299,904L1280,824L1200,836Z" fill="#a1c4af" stroke="#a1c4af" stroke-width="1.51"/><path d="M260,932L312,1020L334,941Z" fill="#b9cebf" stroke="#b9cebf" stroke-width="1.51"/><path d="M418,1011L312,1020L516,1028Z" fill="#b7cdc1" stroke="#b7cdc1" stroke-width="1.51"/><path d="M265,1033L260,932L177,999Z" fill="#b6c9ba" stroke="#b6c9ba" stroke-width="1.51"/><path d="M60,406L-6,427L62,472Z" fill="#eadcd5" stroke="#eadcd5" stroke-width="1.51"/><path d="M-12,302L60,406L75,313Z" fill="#e8dad1" stroke="#e8dad1" stroke-width="1.51"/><path d="M-12,302L75,313L63,247Z" fill="#e6d9ce" stroke="#e6d9ce" stroke-width="1.51"/><path d="M1367,247L1354,168L1302,245Z" fill="#c1d3c4" stroke="#c1d3c4" stroke-width="1.51"/><path d="M1261,67L1273,-26L1191,-40Z" fill="#c4c9b7" stroke="#c4c9b7" stroke-width="1.51"/><path d="M238,-42L175,-47L163,72Z" fill="#e2d0c3" stroke="#e2d0c3" stroke-width="1.51"/><path d="M348,-127L249,-116L343,-19Z" fill="#e2d0c3" stroke="#e2d0c3" stroke-width="1.51"/><path d="M249,-116L175,-47L238,-42Z" fill="#e1cdbf" stroke="#e1cdbf" stroke-width="1.51"/><path d="M-6,427L-23,477L62,472Z" fill="#eadbd4" stroke="#eadbd4" stroke-width="1.51"/><path d="M-94,493L-23,477L-6,427Z" fill="#e9d7d0" stroke="#e9d7d0" stroke-width="1.51"/><path d="M-18,229L-12,302L63,247Z" fill="#e5d6cb" stroke="#e5d6cb" stroke-width="1.51"/><path d="M-18,229L63,247L76,150Z" fill="#e4d6ca" stroke="#e4d6ca" stroke-width="1.51"/><path d="M65,684L53,774L170,746Z" fill="#cbcebc" stroke="#cbcebc" stroke-width="1.51"/><path d="M7,751L53,774L65,684Z" fill="#cacbb8" stroke="#cacbb8" stroke-width="1.51"/><path d="M-23,562L4,663L86,589Z" fill="#d9d2c5" stroke="#d9d2c5" stroke-width="1.51"/><path d="M175,-47L81,44L163,72Z" fill="#e2d0c2" stroke="#e2d0c2" stroke-width="1.51"/><path d="M-23,477L-23,562L62,472Z" fill="#e5d7ce" stroke="#e5d7ce" stroke-width="1.51"/><path d="M1382,498L1433,478L1367,403Z" fill="#c3d7ce" stroke="#c3d7ce" stroke-width="1.51"/><path d="M1367,247L1469,163L1354,168Z" fill="#bdd1c2" stroke="#bdd1c2" stroke-width="1.51"/><path d="M1450,600L1382,498L1350,584Z" fill="#b7d1c3" stroke="#b7d1c3" stroke-width="1.51"/><path d="M1450,600L1350,584L1345,669Z" fill="#b1cdbd" stroke="#b1cdbd" stroke-width="1.51"/><path d="M1362,-22L1273,-26L1261,67Z" fill="#c0c7b6" stroke="#c0c7b6" stroke-width="1.51"/><path d="M1191,-40L1204,-112L1119,-104Z" fill="#c7c4b1" stroke="#c7c4b1" stroke-width="1.51"/><path d="M312,1020L265,1033L516,1028Z" fill="#b5cbbf" stroke="#b5cbbf" stroke-width="1.51"/><path d="M516,1028L265,1033L606,1030Z" fill="#b7cdc2" stroke="#b7cdc2" stroke-width="1.51"/><path d="M606,1030L1286,1032L1014,1027Z" fill="#a8c7b9" stroke="#a8c7b9" stroke-width="1.51"/><path d="M147,938L256,859L178,821Z" fill="#c0cdbc" stroke="#c0cdbc" stroke-width="1.51"/><path d="M1259,-90L1204,-112L1191,-40Z" fill="#c5c3b0" stroke="#c5c3b0" stroke-width="1.51"/><path d="M1119,-104L1204,-112L932,-133Z" fill="#cdc5b4" stroke="#cdc5b4" stroke-width="1.51"/><path d="M53,774L86,858L178,821Z" fill="#c4cbb8" stroke="#c4cbb8" stroke-width="1.51"/><path d="M64,907L86,858L-13,828Z" fill="#c0c4b3" stroke="#c0c4b3" stroke-width="1.51"/><path d="M86,858L147,938L178,821Z" fill="#c0c9b8" stroke="#c0c9b8" stroke-width="1.51"/><path d="M-12,302L-87,319L-6,427Z" fill="#e8d5cd" stroke="#e8d5cd" stroke-width="1.51"/><path d="M-31,141L-18,229L76,150Z" fill="#e3d3c7" stroke="#e3d3c7" stroke-width="1.51"/><path d="M1014,1027L1181,1013L1124,989Z" fill="#9ec2b0" stroke="#9ec2b0" stroke-width="1.51"/><path d="M1124,989L1181,1013L1187,933Z" fill="#9dc1ad" stroke="#9dc1ad" stroke-width="1.51"/><path d="M1187,933L1299,904L1200,836Z" fill="#a0c3ae" stroke="#a0c3ae" stroke-width="1.51"/><path d="M1353,843L1283,769L1280,824Z" fill="#a2c4af" stroke="#a2c4af" stroke-width="1.51"/><path d="M1353,843L1382,751L1283,769Z" fill="#a2c5af" stroke="#a2c5af" stroke-width="1.51"/><path d="M1286,1032L1299,904L1187,933Z" fill="#99bfab" stroke="#99bfab" stroke-width="1.51"/><path d="M-13,828L7,751L-96,769Z" fill="#c6c4b1" stroke="#c6c4b1" stroke-width="1.51"/><path d="M4,663L7,751L65,684Z" fill="#cecdbb" stroke="#cecdbb" stroke-width="1.51"/><path d="M1362,-22L1259,-90L1273,-26Z" fill="#c1c3b1" stroke="#c1c3b1" stroke-width="1.51"/><path d="M1476,404L1456,317L1367,403Z" fill="#c0d4ca" stroke="#c0d4ca" stroke-width="1.51"/><path d="M1461,680L1450,600L1345,669Z" fill="#accab9" stroke="#accab9" stroke-width="1.51"/><path d="M1433,478L1476,404L1367,403Z" fill="#c2d6cd" stroke="#c2d6cd" stroke-width="1.51"/><path d="M1273,-26L1259,-90L1191,-40Z" fill="#c4c4b2" stroke="#c4c4b2" stroke-width="1.51"/><path d="M1389,78L1259,129L1354,168Z" fill="#bfd0bf" stroke="#bfd0bf" stroke-width="1.51"/><path d="M147,938L177,999L260,932Z" fill="#b9c8b9" stroke="#b9c8b9" stroke-width="1.51"/><path d="M71,1004L177,999L147,938Z" fill="#b7c3b4" stroke="#b7c3b4" stroke-width="1.51"/><path d="M64,907L147,938L86,858Z" fill="#bdc6b5" stroke="#bdc6b5" stroke-width="1.51"/><path d="M1299,904L1353,843L1280,824Z" fill="#9ec2ae" stroke="#9ec2ae" stroke-width="1.51"/><path d="M1382,751L1461,680L1345,669Z" fill="#a7c8b5" stroke="#a7c8b5" stroke-width="1.51"/><path d="M1469,163L1389,78L1354,168Z" fill="#bccfbe" stroke="#bccfbe" stroke-width="1.51"/><path d="M1532,489L1476,404L1433,478Z" fill="#bed4cc" stroke="#bed4cc" stroke-width="1.51"/><path d="M-10,82L-31,141L76,150Z" fill="#e2d1c3" stroke="#e2d1c3" stroke-width="1.51"/><path d="M-18,229L-87,319L-12,302Z" fill="#e6d4c9" stroke="#e6d4c9" stroke-width="1.51"/><path d="M-23,477L-94,493L-23,562Z" fill="#e3d4cb" stroke="#e3d4cb" stroke-width="1.51"/><path d="M-10,82L76,150L81,44Z" fill="#e2d0c2" stroke="#e2d0c2" stroke-width="1.51"/><path d="M-10,82L81,44L-6,-8Z" fill="#e1cabc" stroke="#e1cabc" stroke-width="1.51"/><path d="M1456,317L1469,252L1367,247Z" fill="#bdd2c5" stroke="#bdd2c5" stroke-width="1.51"/><path d="M1534,335L1469,252L1456,317Z" fill="#bbd0c5" stroke="#bbd0c5" stroke-width="1.51"/><path d="M-13,828L86,858L53,774Z" fill="#c3c7b5" stroke="#c3c7b5" stroke-width="1.51"/><path d="M58,-47L81,44L175,-47Z" fill="#e1cabd" stroke="#e1cabd" stroke-width="1.51"/><path d="M-93,222L-87,319L-18,229Z" fill="#e5d1c6" stroke="#e5d1c6" stroke-width="1.51"/><path d="M-23,562L-120,600L4,663Z" fill="#d8cec0" stroke="#d8cec0" stroke-width="1.51"/><path d="M249,-116L139,-128L175,-47Z" fill="#e1c8bb" stroke="#e1c8bb" stroke-width="1.51"/><path d="M348,-127L139,-128L249,-116Z" fill="#e1c9bc" stroke="#e1c9bc" stroke-width="1.51"/><path d="M932,-133L139,-128L348,-127Z" fill="#e5cfc5" stroke="#e5cfc5" stroke-width="1.51"/><path d="M-114,385L-94,493L-6,427Z" fill="#ead6ce" stroke="#ead6ce" stroke-width="1.51"/><path d="M7,751L-13,828L53,774Z" fill="#c6c7b4" stroke="#c6c7b4" stroke-width="1.51"/><path d="M1450,600L1532,489L1433,478Z" fill="#b7d0c5" stroke="#b7d0c5" stroke-width="1.51"/><path d="M1469,733L1461,680L1382,751Z" fill="#a3c5b1" stroke="#a3c5b1" stroke-width="1.51"/><path d="M94,-100L58,-47L175,-47Z" fill="#e1c6b9" stroke="#e1c6b9" stroke-width="1.51"/><path d="M1450,46L1362,-22L1389,78Z" fill="#bbc6b6" stroke="#bbc6b6" stroke-width="1.51"/><path d="M1389,78L1362,-22L1261,67Z" fill="#bfc9b8" stroke="#bfc9b8" stroke-width="1.51"/><path d="M139,-128L94,-100L175,-47Z" fill="#e0c5b8" stroke="#e0c5b8" stroke-width="1.51"/><path d="M-102,683L7,751L4,663Z" fill="#cec9b8" stroke="#cec9b8" stroke-width="1.51"/><path d="M-87,319L-114,385L-6,427Z" fill="#e8d4cc" stroke="#e8d4cc" stroke-width="1.51"/><path d="M-93,222L-114,385L-87,319Z" fill="#e6d1c7" stroke="#e6d1c7" stroke-width="1.51"/><path d="M1469,252L1469,163L1367,247Z" fill="#bcd0c2" stroke="#bcd0c2" stroke-width="1.51"/><path d="M1540,251L1469,163L1469,252Z" fill="#b8cec1" stroke="#b8cec1" stroke-width="1.51"/><path d="M-89,147L-31,141L-115,69Z" fill="#e1cbbe" stroke="#e1cbbe" stroke-width="1.51"/><path d="M-89,147L-93,222L-31,141Z" fill="#e2cec1" stroke="#e2cec1" stroke-width="1.51"/><path d="M-31,141L-93,222L-18,229Z" fill="#e3d1c4" stroke="#e3d1c4" stroke-width="1.51"/><path d="M1547,584L1532,489L1450,600Z" fill="#b1cdc1" stroke="#b1cdc1" stroke-width="1.51"/><path d="M1467,836L1469,733L1382,751Z" fill="#9ec2ae" stroke="#9ec2ae" stroke-width="1.51"/><path d="M1467,836L1382,751L1353,843Z" fill="#9dc1ad" stroke="#9dc1ad" stroke-width="1.51"/><path d="M1476,404L1534,335L1456,317Z" fill="#bcd1c7" stroke="#bcd1c7" stroke-width="1.51"/><path d="M1547,584L1450,600L1543,644Z" fill="#abc9bb" stroke="#abc9bb" stroke-width="1.51"/><path d="M58,-47L-6,-8L81,44Z" fill="#e1c7ba" stroke="#e1c7ba" stroke-width="1.51"/><path d="M0,-128L-6,-8L58,-47Z" fill="#e0c1b4" stroke="#e0c1b4" stroke-width="1.51"/><path d="M1299,904L1375,939L1353,843Z" fill="#99beac" stroke="#99beac" stroke-width="1.51"/><path d="M1181,1013L1286,1032L1187,933Z" fill="#98beab" stroke="#98beab" stroke-width="1.51"/><path d="M1014,1027L1286,1032L1181,1013Z" fill="#99beac" stroke="#99beac" stroke-width="1.51"/><path d="M265,1033L1286,1032L606,1030Z" fill="#bbd2cb" stroke="#bbd2cb" stroke-width="1.51"/><path d="M-94,493L-120,600L-23,562Z" fill="#dfcfc5" stroke="#dfcfc5" stroke-width="1.51"/><path d="M-114,385L-120,600L-94,493Z" fill="#e5d1c9" stroke="#e5d1c9" stroke-width="1.51"/><path d="M-120,600L-102,683L4,663Z" fill="#d4cabb" stroke="#d4cabb" stroke-width="1.51"/><path d="M1550,388L1534,335L1476,404Z" fill="#bbd1c8" stroke="#bbd1c8" stroke-width="1.51"/><path d="M-115,69L-31,141L-10,82Z" fill="#e1cabd" stroke="#e1cabd" stroke-width="1.51"/><path d="M-93,222L-115,69L-114,385Z" fill="#e3cdc2" stroke="#e3cdc2" stroke-width="1.51"/><path d="M1354,990L1375,939L1299,904Z" fill="#95bcaa" stroke="#95bcaa" stroke-width="1.51"/><path d="M1469,163L1450,46L1389,78Z" fill="#b9caba" stroke="#b9caba" stroke-width="1.51"/><path d="M1472,-5L1450,46L1521,65Z" fill="#b7c3b4" stroke="#b7c3b4" stroke-width="1.51"/><path d="M-19,934L64,907L-13,828Z" fill="#bec1b0" stroke="#bec1b0" stroke-width="1.51"/><path d="M-19,934L71,1004L64,907Z" fill="#b9bfb0" stroke="#b9bfb0" stroke-width="1.51"/><path d="M64,907L71,1004L147,938Z" fill="#b9c2b3" stroke="#b9c2b3" stroke-width="1.51"/><path d="M177,999L71,1004L265,1033Z" fill="#b5c4b6" stroke="#b5c4b6" stroke-width="1.51"/><path d="M1534,335L1540,251L1469,252Z" fill="#b8cec3" stroke="#b8cec3" stroke-width="1.51"/><path d="M1532,489L1550,388L1476,404Z" fill="#bcd3cb" stroke="#bcd3cb" stroke-width="1.51"/><path d="M1286,1032L1354,990L1299,904Z" fill="#94bcaa" stroke="#94bcaa" stroke-width="1.51"/><path d="M1543,644L1461,680L1532,755Z" fill="#a2c4b2" stroke="#a2c4b2" stroke-width="1.51"/><path d="M1543,644L1450,600L1461,680Z" fill="#a9c8b9" stroke="#a9c8b9" stroke-width="1.51"/><path d="M1532,489L1547,584L1550,388Z" fill="#b7d0c7" stroke="#b7d0c7" stroke-width="1.51"/><path d="M1467,836L1353,843L1457,919Z" fill="#97bdaa" stroke="#97bdaa" stroke-width="1.51"/><path d="M1550,388L1540,251L1534,335Z" fill="#b8cfc5" stroke="#b8cfc5" stroke-width="1.51"/><path d="M-102,683L-96,769L7,751Z" fill="#cac5b2" stroke="#cac5b2" stroke-width="1.51"/><path d="M-120,600L-96,769L-102,683Z" fill="#d0c6b5" stroke="#d0c6b5" stroke-width="1.51"/><path d="M1457,919L1353,843L1375,939Z" fill="#96bcab" stroke="#96bcab" stroke-width="1.51"/><path d="M1532,755L1461,680L1469,733Z" fill="#a0c3b0" stroke="#a0c3b0" stroke-width="1.51"/><path d="M1362,-22L1371,-117L1259,-90Z" fill="#bfbfae" stroke="#bfbfae" stroke-width="1.51"/><path d="M1259,-90L1371,-117L1204,-112Z" fill="#c1bead" stroke="#c1bead" stroke-width="1.51"/><path d="M1204,-112L1371,-117L932,-133Z" fill="#c7c1ae" stroke="#c7c1ae" stroke-width="1.51"/><path d="M1440,-114L1371,-117L1362,-22Z" fill="#bbbcac" stroke="#bbbcac" stroke-width="1.51"/><path d="M-88,822L-19,934L-13,828Z" fill="#c0bfae" stroke="#c0bfae" stroke-width="1.51"/><path d="M-96,769L-88,822L-13,828Z" fill="#c4c1ae" stroke="#c4c1ae" stroke-width="1.51"/><path d="M1521,65L1450,46L1469,163Z" fill="#b7c8b9" stroke="#b7c8b9" stroke-width="1.51"/><path d="M1450,46L1472,-5L1362,-22Z" fill="#bac2b3" stroke="#bac2b3" stroke-width="1.51"/><path d="M1467,836L1532,755L1469,733Z" fill="#9ac0ac" stroke="#9ac0ac" stroke-width="1.51"/><path d="M1530,858L1532,755L1467,836Z" fill="#96bdaa" stroke="#96bdaa" stroke-width="1.51"/><path d="M-85,-17L-115,69L-10,82Z" fill="#e0c5b8" stroke="#e0c5b8" stroke-width="1.51"/><path d="M-89,147L-115,69L-93,222Z" fill="#e1ccbf" stroke="#e1ccbf" stroke-width="1.51"/><path d="M-114,385L-115,69L-120,600Z" fill="#e7d0c8" stroke="#e7d0c8" stroke-width="1.51"/><path d="M-85,-17L-10,82L-6,-8Z" fill="#e0c4b8" stroke="#e0c4b8" stroke-width="1.51"/><path d="M1466,1010L1457,919L1375,939Z" fill="#8fb8a8" stroke="#8fb8a8" stroke-width="1.51"/><path d="M94,-100L0,-128L58,-47Z" fill="#dfc0b3" stroke="#dfc0b3" stroke-width="1.51"/><path d="M139,-128L0,-128L94,-100Z" fill="#dfbfb3" stroke="#dfbfb3" stroke-width="1.51"/><path d="M932,-133L0,-128L139,-128Z" fill="#e3cdc1" stroke="#e3cdc1" stroke-width="1.51"/><path d="M1556,125L1521,65L1469,163Z" fill="#b5c8ba" stroke="#b5c8ba" stroke-width="1.51"/><path d="M-80,-93L-85,-17L-6,-8Z" fill="#dfbeb1" stroke="#dfbeb1" stroke-width="1.51"/><path d="M1540,251L1556,125L1469,163Z" fill="#b6ccbe" stroke="#b6ccbe" stroke-width="1.51"/><path d="M1550,388L1556,125L1540,251Z" fill="#b6cdc2" stroke="#b6cdc2" stroke-width="1.51"/><path d="M1547,584L1556,125L1550,388Z" fill="#b9cfc7" stroke="#b9cfc7" stroke-width="1.51"/><path d="M-107,936L-24,996L-19,934Z" fill="#b8baab" stroke="#b8baab" stroke-width="1.51"/><path d="M-19,934L-24,996L71,1004Z" fill="#b7bcad" stroke="#b7bcad" stroke-width="1.51"/><path d="M71,1004L-106,993L265,1033Z" fill="#b4beb0" stroke="#b4beb0" stroke-width="1.51"/><path d="M1472,-5L1440,-114L1362,-22Z" fill="#babeae" stroke="#babeae" stroke-width="1.51"/><path d="M1536,-22L1440,-114L1472,-5Z" fill="#b7bcad" stroke="#b7bcad" stroke-width="1.51"/><path d="M1536,-22L1472,-5L1521,65Z" fill="#b5c0b1" stroke="#b5c0b1" stroke-width="1.51"/><path d="M1457,919L1530,858L1467,836Z" fill="#93bba9" stroke="#93bba9" stroke-width="1.51"/><path d="M1532,755L1530,858L1543,644Z" fill="#9abfac" stroke="#9abfac" stroke-width="1.51"/><path d="M1543,644L1531,1032L1547,584Z" fill="#99bfac" stroke="#99bfac" stroke-width="1.51"/><path d="M0,-128L-80,-93L-6,-8Z" fill="#dfbdb0" stroke="#dfbdb0" stroke-width="1.51"/><path d="M-85,-17L-80,-93L-115,69Z" fill="#dfbeb1" stroke="#dfbeb1" stroke-width="1.51"/><path d="M-88,822L-107,936L-19,934Z" fill="#bdbcab" stroke="#bdbcab" stroke-width="1.51"/><path d="M-96,769L-107,936L-88,822Z" fill="#c1bdab" stroke="#c1bdab" stroke-width="1.51"/><path d="M-120,600L-107,936L-96,769Z" fill="#c6c0ad" stroke="#c6c0ad" stroke-width="1.51"/><path d="M1556,125L1536,-22L1521,65Z" fill="#b3c2b4" stroke="#b3c2b4" stroke-width="1.51"/><path d="M1457,919L1530,924L1530,858Z" fill="#8fb8a8" stroke="#8fb8a8" stroke-width="1.51"/><path d="M1354,990L1466,1010L1375,939Z" fill="#8fb8a8" stroke="#8fb8a8" stroke-width="1.51"/><path d="M1286,1032L1466,1010L1354,990Z" fill="#8eb7a7" stroke="#8eb7a7" stroke-width="1.51"/><path d="M1466,1010L1530,924L1457,919Z" fill="#8cb6a7" stroke="#8cb6a7" stroke-width="1.51"/><path d="M1530,858L1530,924L1543,644Z" fill="#95bcaa" stroke="#95bcaa" stroke-width="1.51"/><path d="M-107,936L-106,993L-24,996Z" fill="#b7b7a8" stroke="#b7b7a8" stroke-width="1.51"/><path d="M-24,996L-106,993L71,1004Z" fill="#b5b9ab" stroke="#b5b9ab" stroke-width="1.51"/><path d="M-120,600L-106,993L-107,936Z" fill="#c1bcab" stroke="#c1bcab" stroke-width="1.51"/><path d="M1466,1010L1531,1032L1530,924Z" fill="#88b3a4" stroke="#88b3a4" stroke-width="1.51"/><path d="M1530,924L1531,1032L1543,644Z" fill="#91b9a8" stroke="#91b9a8" stroke-width="1.51"/><path d="M1286,1032L1531,1032L1466,1010Z" fill="#8ab4a5" stroke="#8ab4a5" stroke-width="1.51"/><path d="M265,1033L1531,1032L1286,1032Z" fill="#a3c4b4" stroke="#a3c4b4" stroke-width="1.51"/><path d="M1536,-22L1554,-129L1440,-114Z" fill="#b5b8a9" stroke="#b5b8a9" stroke-width="1.51"/><path d="M1440,-114L1554,-129L1371,-117Z" fill="#b7b7a8" stroke="#b7b7a8" stroke-width="1.51"/><path d="M1371,-117L1554,-129L932,-133Z" fill="#c1bdab" stroke="#c1bdab" stroke-width="1.51"/><path d="M1556,125L1554,-129L1536,-22Z" fill="#b3bdaf" stroke="#b3bdaf" stroke-width="1.51"/></svg> \ No newline at end of file diff --git a/src/client/assets/welcome-bg.svg b/src/client/assets/welcome-bg.svg deleted file mode 100644 index ba8cd8dc0a..0000000000 --- a/src/client/assets/welcome-bg.svg +++ /dev/null @@ -1,579 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="1920" - height="1080" - viewBox="0 0 507.99999 285.75001" - version="1.1" - id="svg8" - inkscape:version="0.92.1 r15371" - sodipodi:docname="welcome-bg.svg"> - <defs - id="defs2"> - <pattern - inkscape:collect="always" - xlink:href="#Checkerboard" - id="pattern7194" - patternTransform="scale(1.3152942)" /> - <linearGradient - id="linearGradient7169" - inkscape:collect="always"> - <stop - id="stop7165" - offset="0" - style="stop-color:#eaeaea;stop-opacity:1" /> - <stop - id="stop7167" - offset="1" - style="stop-color:#000000;stop-opacity:1" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient7044"> - <stop - style="stop-color:#000000;stop-opacity:1;" - offset="0" - id="stop7040" /> - <stop - style="stop-color:#ffffff;stop-opacity:1" - offset="1" - id="stop7042" /> - </linearGradient> - <pattern - inkscape:collect="always" - xlink:href="#Checkerboard" - id="pattern7010" - patternTransform="matrix(1.673813,0,0,1.673813,-177.6001,-146.38611)" /> - <pattern - inkscape:stockid="Checkerboard" - id="Checkerboard" - patternTransform="translate(0,0) scale(10,10)" - height="2" - width="2" - patternUnits="userSpaceOnUse" - inkscape:collect="always" - inkscape:isstock="true"> - <rect - id="rect6201" - height="1" - width="1" - y="0" - x="0" - style="fill:black;stroke:none" /> - <rect - id="rect6203" - height="1" - width="1" - y="1" - x="1" - style="fill:black;stroke:none" /> - </pattern> - <linearGradient - id="linearGradient5406" - osb:paint="solid"> - <stop - style="stop-color:#000000;stop-opacity:1;" - offset="0" - id="stop5404" /> - </linearGradient> - <pattern - patternUnits="userSpaceOnUse" - width="15.999999" - height="16.000025" - patternTransform="matrix(0.26458333,0,0,0.26458333,-16.933332,263.1333)" - id="pattern6465"> - <path - d="m 8.0000542,8.0000126 h 7.9998878 c 3e-5,0 5.7e-5,3.78e-5 5.7e-5,3.78e-5 V 15.99995 c 0,3.7e-5 -2.7e-5,7.5e-5 -5.7e-5,7.5e-5 H 8.0000542 c -3.03e-5,0 -5.67e-5,-3.8e-5 -5.67e-5,-7.5e-5 V 8.0000504 c 0,0 2.64e-5,-3.78e-5 5.67e-5,-3.78e-5 z M 5.6692913e-5,0 H 7.9999408 c 3.02e-5,0 5.67e-5,3.7795275e-5 5.67e-5,7.5590551e-5 V 7.999937 c 0,3.78e-5 -2.65e-5,7.56e-5 -5.67e-5,7.56e-5 H 5.6692913e-5 C 2.2677165e-5,8.0000126 0,7.9999748 0,7.999937 V 7.5590551e-5 C 0,3.7795276e-5 2.2677165e-5,0 5.6692913e-5,0 Z" - style="opacity:1;fill:#db1545;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:15.99999905;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect6445-2" - inkscape:connector-curvature="0" /> - </pattern> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient7044" - id="linearGradient6476" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(3.223659,0,0,2.5556636,-579.27357,808.39)" - x1="86.490868" - y1="-216.62756" - x2="176.77992" - y2="-216.62756" /> - <mask - maskUnits="userSpaceOnUse" - id="mask6472"> - <rect - transform="rotate(-90)" - y="-0.91986513" - x="-300.45657" - height="511.36566" - width="291.06116" - id="rect6474" - style="opacity:1;fill:url(#linearGradient6476);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.92238116;stroke-miterlimit:4;stroke-dasharray:none" /> - </mask> - <pattern - patternUnits="userSpaceOnUse" - width="2340.7208" - height="2340.7236" - patternTransform="matrix(0.26458333,0,0,0.26458333,-63.499801,-58.601683)" - id="pattern7142"> - <path - d="m 1170.3684,1170.3628 h 1170.3448 c 0,0 0.01,0 0.01,0 v 1170.3457 c 0,0 0,0.011 -0.01,0.011 H 1170.3684 c 0,0 -0.01,0 -0.01,-0.011 v -1170.344 c 0,0 0,0 0.01,0 z M 0.00869291,1.1338583e-5 H 1170.352 c 0,0 0.01,0.0052913414 0.01,0.01096063142 V 1170.3511 c 0,0 0,0.011 -0.01,0.011 H 0.00869291 C 0.00340157,1170.3625 0,1170.3549 0,1170.3511 V 0.01096063 C 0,0.00566929 0.00312945,0 0.00869291,0 Z" - style="opacity:1;fill:#763971;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2340.72119141;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path7135" - inkscape:connector-curvature="0" /> - </pattern> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient7169" - id="linearGradient7157" - x1="-3.631536" - y1="155.11069" - x2="511.52777" - y2="155.11069" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(2.184742,0,0,6.5696504,-17.948376,-1979.8074)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient7169" - id="linearGradient7200" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.57804632,0,0,1.73822,6.5011419,-523.82404)" - x1="-3.631536" - y1="155.11069" - x2="511.52777" - y2="155.11069" /> - <mask - maskUnits="userSpaceOnUse" - id="mask7196"> - <rect - transform="rotate(90)" - y="-512.56537" - x="4.4019437" - height="516.7157" - width="297.78595" - id="rect7198" - style="opacity:1;fill:url(#linearGradient7200);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.1217103;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - </mask> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#1e1d65" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.84705882" - inkscape:pageshadow="2" - inkscape:zoom="0.79170474" - inkscape:cx="1093.7227" - inkscape:cy="695.27372" - inkscape:document-units="mm" - inkscape:current-layer="layer5" - showgrid="true" - units="px" - inkscape:pagecheckerboard="false" - inkscape:window-width="1920" - inkscape:window-height="1017" - inkscape:window-x="-8" - inkscape:window-y="1072" - inkscape:window-maximized="1" - objecttolerance="1" - guidetolerance="10000" - gridtolerance="10000" - inkscape:snap-bbox="true" - inkscape:bbox-paths="true" - inkscape:bbox-nodes="true" - inkscape:snap-bbox-edge-midpoints="true" - inkscape:snap-bbox-midpoints="true" - showguides="false" - inkscape:lockguides="true"> - <inkscape:grid - type="xygrid" - id="grid6443" - spacingx="2.1166667" - spacingy="2.1166667" - empspacing="4" - color="#3f3fff" - opacity="0.1254902" - enabled="false" /> - <sodipodi:guide - position="-69.219003,3.872392" - orientation="1,0" - id="guide6508" - inkscape:locked="true" /> - </sodipodi:namedview> - <metadata - id="metadata5"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="レイヤー 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(0,-11.249983)" - style="display:inline" - sodipodi:insensitive="true"> - <rect - style="display:inline;opacity:0.2;fill:url(#pattern7194);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.11666656;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect7178" - width="568.07599" - height="367.82269" - x="-37.871731" - y="-52.665051" - mask="url(#mask7196)" /> - </g> - <g - inkscape:groupmode="layer" - id="layer2" - inkscape:label="レイヤー 2" - style="display:inline"> - <rect - transform="translate(0,-11.249983)" - style="opacity:0.5;fill:none;stroke:none;stroke-width:140.99996948" - width="596.8999" - height="596.90082" - x="-63.49987" - y="-58.600021" - id="rect6468" - mask="url(#mask6472)" /> - <path - transform="translate(0,-11.249983)" - sodipodi:type="star" - style="fill:#000000;fill-opacity:0.09661835;fill-rule:nonzero;stroke:none;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none" - id="path6921" - sodipodi:sides="4" - sodipodi:cx="117.63232" - sodipodi:cy="102.13793" - sodipodi:r1="5.7652407" - sodipodi:r2="2.8826203" - sodipodi:arg1="1.4464413" - sodipodi:arg2="2.2318395" - inkscape:flatsided="false" - inkscape:rounded="0" - inkscape:randomized="0" - d="m 118.34741,107.85865 -2.48485,-3.44532 -3.95096,-1.56031 3.44531,-2.48485 1.56032,-3.950959 2.48484,3.445318 3.95097,1.560311 -3.44532,2.48485 z" - inkscape:transform-center-x="1.481982e-006" - inkscape:transform-center-y="-1.1450451e-006" /> - <path - transform="translate(0,-11.249983)" - sodipodi:type="star" - style="fill:#000000;fill-opacity:0.09661835;fill-rule:nonzero;stroke:none;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none" - id="path6923" - sodipodi:sides="4" - sodipodi:cx="317.5" - sodipodi:cy="75.679596" - sodipodi:r1="3.949214" - sodipodi:r2="1.974607" - sodipodi:arg1="1.6614562" - sodipodi:arg2="2.4468544" - inkscape:flatsided="false" - inkscape:rounded="0" - inkscape:randomized="0" - d="m 317.14246,79.612591 -1.1594,-2.668882 -2.41606,-1.621658 2.66889,-1.15939 1.62165,-2.41606 1.1594,2.668882 2.41606,1.621658 -2.66889,1.15939 z" - inkscape:transform-center-x="4.0000001e-006" /> - <path - transform="translate(0,-11.249983)" - sodipodi:type="star" - style="fill:#000000;fill-opacity:0.09661835;fill-rule:nonzero;stroke:none;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none" - id="path6925" - sodipodi:sides="4" - sodipodi:cx="230.97409" - sodipodi:cy="57.802349" - sodipodi:r1="2.2613134" - sodipodi:r2="1.1306567" - sodipodi:arg1="1.2490458" - sodipodi:arg2="2.0344439" - inkscape:flatsided="false" - inkscape:rounded="0" - inkscape:randomized="0" - d="m 231.68918,59.947619 -1.22073,-1.13398 -1.63963,-0.2962 1.13398,-1.220735 0.2962,-1.639625 1.22074,1.13398 1.63962,0.2962 -1.13398,1.220735 z" - inkscape:transform-center-x="2.9099099e-006" /> - <path - transform="translate(0,-11.249983)" - sodipodi:type="star" - style="fill:#000000;fill-opacity:0.09661835;fill-rule:nonzero;stroke:none;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none" - id="path6927" - sodipodi:sides="4" - sodipodi:cx="260.65033" - sodipodi:cy="106.42847" - sodipodi:r1="1.59899" - sodipodi:r2="0.79949504" - sodipodi:arg1="2.0344439" - sodipodi:arg2="2.8198421" - inkscape:flatsided="false" - inkscape:rounded="0" - inkscape:randomized="0" - d="m 259.93524,107.85865 -0.0434,-1.17736 -0.67171,-0.96791 1.17736,-0.0434 0.96791,-0.67171 0.0434,1.17735 0.67171,0.96792 -1.17736,0.0434 z" - inkscape:transform-center-x="3.2837838e-006" - inkscape:transform-center-y="-1.1990991e-006" /> - <path - sodipodi:type="star" - style="fill:#000000;fill-opacity:0.09661835;fill-rule:nonzero;stroke:none;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none" - id="path6925-2" - sodipodi:sides="4" - sodipodi:cx="87.956078" - sodipodi:cy="127.16609" - sodipodi:r1="2.2613134" - sodipodi:r2="1.1306567" - sodipodi:arg1="1.2490458" - sodipodi:arg2="2.0344439" - inkscape:flatsided="false" - inkscape:rounded="0" - inkscape:randomized="0" - d="m 88.671168,129.31136 -1.220735,-1.13398 -1.639626,-0.2962 1.13398,-1.22073 0.296201,-1.63963 1.220735,1.13398 1.639625,0.2962 -1.13398,1.22074 z" - inkscape:transform-center-x="2.4830149e-006" - transform="matrix(0.91666666,0,0,1,7.1509006,-11.249983)" /> - <ellipse - style="opacity:0.68000034;fill:#6e76a3;fill-opacity:1;stroke:none;stroke-width:0.06383465" - id="path5313-3-7" - cx="178.44102" - cy="110.95996" - rx="21.691566" - ry="5.0825601" - transform="rotate(-1.570553,-410.38805,-5.6250559)" /> - <ellipse - style="opacity:0.68000034;fill:#6e76a3;fill-opacity:1;stroke:none;stroke-width:0.08063243" - id="path5313-3-7-5" - cx="200.1326" - cy="116.80371" - rx="27.399597" - ry="6.4200115" - transform="rotate(-1.570553,-410.38805,-5.6250559)" /> - <ellipse - style="opacity:0.68000034;fill:#6e76a3;fill-opacity:1;stroke:none;stroke-width:0.06734787" - id="path5313-3-7-2" - cx="-429.23041" - cy="90.631134" - rx="24.144913" - ry="5.0825605" - transform="matrix(-0.99537478,-0.09606802,-0.09606802,0.99537478,0,-11.249983)" /> - <ellipse - style="opacity:0.68000034;fill:#6e76a3;fill-opacity:1;stroke:none;stroke-width:0.08507013" - id="path5313-3-7-5-9" - cx="-405.08548" - cy="96.474884" - rx="30.498529" - ry="6.4200115" - transform="matrix(-0.99537478,-0.09606802,-0.09606802,0.99537478,0,-11.249983)" /> - <ellipse - style="opacity:0.68000034;fill:#6e76a3;fill-opacity:1;stroke:none;stroke-width:0.05208009" - id="path5313-3-7-2-9" - cx="-46.428764" - cy="163.90004" - rx="18.893074" - ry="3.884198" - transform="matrix(-0.99073724,0.13579293,0.14607844,0.98927301,0,-11.249983)" /> - <ellipse - style="opacity:0.68000034;fill:#6e76a3;fill-opacity:1;stroke:none;stroke-width:0.06578472" - id="path5313-3-7-5-9-1" - cx="-27.535677" - cy="168.36595" - rx="23.864695" - ry="4.9063048" - transform="matrix(-0.99073724,0.13579293,0.14607844,0.98927301,0,-11.249983)" /> - <path - transform="translate(0,-11.249983)" - sodipodi:type="star" - style="fill:#000000;fill-opacity:0.09661835;fill-rule:nonzero;stroke:none;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none" - id="path6923-9" - sodipodi:sides="4" - sodipodi:cx="459.82239" - sodipodi:cy="139.8455" - sodipodi:r1="3.949214" - sodipodi:r2="1.9746071" - sodipodi:arg1="1.6614562" - sodipodi:arg2="2.4468544" - inkscape:flatsided="false" - inkscape:rounded="0" - inkscape:randomized="0" - d="m 459.46484,143.7785 -1.15939,-2.66888 -2.41606,-1.62166 2.66889,-1.15939 1.62165,-2.41606 1.15939,2.66888 2.41606,1.62166 -2.66888,1.15939 z" - inkscape:transform-center-x="4.0000001e-006" /> - <circle - transform="translate(0,-11.249983)" - style="opacity:0.1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.81509405;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5229" - cx="192.18326" - cy="74.677902" - r="2.7216933" /> - <path - sodipodi:type="star" - style="fill:#ffffff;fill-opacity:0.09661835;fill-rule:nonzero;stroke:none;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none" - id="path6923-8" - sodipodi:sides="4" - sodipodi:cx="53.989292" - sodipodi:cy="88.908768" - sodipodi:r1="3.949214" - sodipodi:r2="1.9746071" - sodipodi:arg1="1.6614562" - sodipodi:arg2="2.4468544" - inkscape:flatsided="false" - inkscape:rounded="0" - inkscape:randomized="0" - d="m 53.631747,92.841763 -1.15939,-2.668883 -2.41606,-1.621657 2.668883,-1.159391 1.621657,-2.41606 1.15939,2.668883 2.416061,1.621658 -2.668883,1.15939 z" - inkscape:transform-center-x="2.0634674e-006" - transform="matrix(0.61390676,-0.48689202,0.48689202,0.61390676,-23.159158,48.648961)" - inkscape:transform-center-y="1.4320049e-006" /> - <path - sodipodi:type="star" - style="fill:#ffffff;fill-opacity:0.09661835;fill-rule:nonzero;stroke:none;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none" - id="path6923-8-3" - sodipodi:sides="4" - sodipodi:cx="53.989292" - sodipodi:cy="88.908768" - sodipodi:r1="3.949214" - sodipodi:r2="1.9746071" - sodipodi:arg1="1.6614562" - sodipodi:arg2="2.4468544" - inkscape:flatsided="false" - inkscape:rounded="0" - inkscape:randomized="0" - d="m 53.631747,92.841763 -1.15939,-2.668883 -2.41606,-1.621657 2.668883,-1.159391 1.621657,-2.41606 1.15939,2.668883 2.416061,1.621658 -2.668883,1.15939 z" - inkscape:transform-center-x="3.0260172e-006" - transform="matrix(0.58032639,0.43093706,-0.43093706,0.58032639,446.58431,23.35553)" - inkscape:transform-center-y="-1.3594204e-006" /> - <circle - transform="translate(0,-11.249983)" - style="opacity:0.1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.28035584;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5229-6" - cx="347.17841" - cy="36.709366" - r="0.9361406" /> - <circle - transform="translate(0,-11.249983)" - style="opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.28035584;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5229-6-5" - cx="116.0927" - cy="42.136036" - r="0.9361406" /> - <circle - transform="translate(0,-11.249983)" - style="opacity:0.15;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.55002564;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5229-0" - cx="456.28247" - cy="47.488548" - r="1.8365992" /> - </g> - <g - inkscape:groupmode="layer" - id="layer5" - inkscape:label="レイヤー 4" - style="display:none"> - <path - transform="translate(0,-11.249983)" - style="display:inline;fill:#ffff7c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none" - d="m 377.25876,69.781182 a 18.234796,18.234796 0 0 1 8.1747,15.19442 18.234796,18.234796 0 0 1 -18.23455,18.235058 18.234796,18.234796 0 0 1 -10.14098,-3.08921 20.380066,20.380066 0 0 0 17.64905,10.2402 20.380066,20.380066 0 0 0 20.38015,-20.380152 20.380066,20.380066 0 0 0 -17.82837,-20.200316 z" - id="path6914" - inkscape:connector-curvature="0" /> - </g> - <g - inkscape:groupmode="layer" - id="layer4" - inkscape:label="レイヤー 3" - style="display:none"> - <circle - style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.36438358;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5306" - cx="168.31279" - cy="2.1908164" - r="36.253109" /> - <path - style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.39123487px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 201.1259,19.428383 2.66976,2.617062 1.21734,-1.978474 -0.34264,5.194221 -4.15215,2.110811 1.0283,-1.928856 -2.76172,-2.210044 z" - id="path5168" - inkscape:connector-curvature="0" /> - <path - style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.89719725px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 196.25421,26.631949 6.0286,8.817373 -3.70059,3.384671 -1.84127,-4.638447 -2.48924,2.916491 -2.23471,-6.507119 z" - id="path5174" - inkscape:connector-curvature="0" /> - <path - style="display:inline;opacity:0.1;fill:#000500;fill-opacity:1;stroke:none;stroke-width:0.05121958px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 187.00695,34.050482 1.26268,2.214392 1.44195,-0.54357 1.31981,0.86123 0.21375,1.739039 -1.36828,1.61618 -1.80409,0.265403 -1.1589,-1.059687 -0.23516,-1.721875 1.11047,-0.916698 -0.43413,-0.680502 -0.4102,0.997264 0.74387,1.070883 -0.49255,1.027197 -1.26776,0.228606 -0.5501,-0.871237 0.15467,-0.82956 0.93559,-0.424446 0.58058,-1.450625 -0.75664,-1.131455 z" - id="path6985" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccccccccccccccccccc" /> - <path - style="display:inline;opacity:0.1;fill:#000016;fill-opacity:1;stroke:none;stroke-width:0.04695854px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 203.23593,14.367789 4.43345,3.766934 0.87976,-0.995725 0.46812,0.475437 -0.80488,0.995031 0.83731,0.705238 0.86731,-0.962102 0.50998,0.516259 -0.87206,0.921255 0.99505,0.941692 -0.44277,0.42746 -0.91483,-0.900095 -0.8367,0.879711 -0.43031,-0.474867 0.78065,-0.831436 -0.86665,-0.779727 -0.81136,0.912638 -0.55866,-0.483362 0.8179,-0.927279 -4.48211,-3.638676 z" - id="path6891-8" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccccccccccccccccccc" /> - <path - style="display:inline;opacity:0.05;fill:#000016;fill-opacity:1;stroke:none;stroke-width:0.58045781px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 204.43932,-5.3971152 6.34563,7.5781721 -3.73895,4.9604312 0.33681,4.6546149 -5.20345,5.793617 c 2.83273,-8.049795 3.31033,-11.8140092 3.09986,-18.9271334 z" - id="path5208" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccccc" /> - <path - style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.11183073px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 205.60259,0.56695919 1.24493,0.127049 0.0916,-0.59592195 0.28719,0.07174803 -0.065,0.56786179 0.62071,0.0788993 -0.0423,0.36840374 -0.62423,-0.048236 -0.0804,0.8381885 0.52004,0.075191 -0.0192,0.3709729 -0.5764,-0.058257 -0.10087,0.8125312 0.54747,0.039404 -0.04,0.4153104 -0.5593,-0.071919 -0.0636,0.6224815 -0.3736,0.00386 0.0816,-0.6437327 -1.20305,-0.1533942 0.0499,-0.3674909 1.2006,0.1064631 0.11092,-0.7647515 -1.19622,-0.1448386 0.027,-0.3701253 1.23042,0.1176518 0.12327,-0.8721654 -1.26199,-0.1134749 z" - id="path7229" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccccccccccccccccccccccccccc" /> - <path - style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.16325578px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 204.68821,9.1424652 1.78173,-0.049987 -1.44996,0.7563273 1.12166,0.7127945 -1.34099,0.0029 0.93885,1.309289 -1.59949,-0.942185 z" - id="path7212-4-6" - inkscape:connector-curvature="0" /> - <path - style="display:inline;opacity:0.05;fill:#000016;fill-opacity:1;stroke:none;stroke-width:0.71902335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 180.87434,36.932251 -8.12162,8.095249 -6.61262,-3.934427 -5.68596,1.043018 -7.6496,-6.371879 c 10.33078,4.527622 19.43137,4.062311 28.0698,1.168039 z" - id="path5208-6" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cccccc" /> - <path - style="display:inline;opacity:0.1;fill:#000016;fill-opacity:1;stroke:none;stroke-width:0.04569969px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 156.79314,37.138611 -0.83209,5.600235 1.27513,0.214749 -0.15211,0.631281 -1.23602,-0.153244 -0.15211,1.0545 1.24093,0.221743 -0.16427,0.686859 -1.20964,-0.246683 -0.26626,1.306416 -0.58089,-0.145968 0.27316,-1.218758 -1.15712,-0.238846 0.17092,-0.599741 1.08842,0.21735 0.19853,-1.117028 -1.17126,-0.200972 0.11204,-0.710141 1.18676,0.198837 0.70106,-5.574493 z" - id="path6891-8-9" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccccccccccccccccccc" /> - <path - style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.84177661px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 143.96364,29.933272 -4.59686,9.216397 3.65156,2.834687 1.22043,-4.692866 2.51661,2.524357 1.39851,-6.542721 z" - id="path5174-1" - inkscape:connector-curvature="0" /> - <path - style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.56489706px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 142.60658,28.70585 -2.96842,6.930652 -3.79379,-3.925042 4.56394,-5.124749 z" - id="path5285" - inkscape:connector-curvature="0" /> - <path - style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.35393918px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 137.9306,23.319484 -3.42616,1.224261 1.2143,1.906916 -4.40128,-2.508612 -0.0822,-4.53226 1.25123,1.720316 3.10894,-1.477793 z" - id="path5168-0" - inkscape:connector-curvature="0" /> - <path - style="display:inline;opacity:0.1;fill:#000500;fill-opacity:1;stroke:none;stroke-width:0.0498465px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 132.55595,11.444656 -2.31852,0.882408 0.30663,1.468015 -1.02588,1.140069 -1.70428,-0.05499 -1.34908,-1.557886 0.015,-1.774566 1.1926,-0.955614 1.69096,0.03182 0.7151,1.205156 0.71942,-0.315492 -0.89748,-0.543864 -1.14121,0.554849 -0.91394,-0.627513 -0.0299,-1.2533405 0.92017,-0.3984462 0.77453,0.2730438 0.26797,0.9632459 1.30792,0.775623 1.20137,-0.558052 z" - id="path6985-7" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccccccccccccccccccc" /> - <path - style="display:inline;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15882961px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 131.32384,2.4817954 -1.6313,-0.4305236 1.16551,1.0474206 -1.19547,0.453907 1.23564,0.290212 -1.16202,1.0740836 1.68796,-0.5749329 z" - id="path7212-4-6-8" - inkscape:connector-curvature="0" /> - <path - style="display:inline;opacity:0.05;fill:#000016;fill-opacity:1;stroke:none;stroke-width:0.55575538px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 137.04207,-21.420699 -7.13207,5.035868 1.31743,5.70794 -2.10914,4.1341529 2.26645,6.93249012 c 0.67636,-8.23493742 2.69888,-15.39599902 5.65733,-21.81045102 z" - id="path5208-4" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cccccc" /> - </g> -</svg> diff --git a/src/client/assets/welcome-fg.svg b/src/client/assets/welcome-fg.svg deleted file mode 100644 index 5c795c3027..0000000000 --- a/src/client/assets/welcome-fg.svg +++ /dev/null @@ -1,380 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="1920" - height="1080" - viewBox="0 0 507.99999 285.75001" - version="1.1" - id="svg8" - inkscape:version="0.92.1 r15371" - sodipodi:docname="welcome-fg.svg"> - <defs - id="defs2"> - <linearGradient - inkscape:collect="always" - id="linearGradient7044"> - <stop - style="stop-color:#000000;stop-opacity:1;" - offset="0" - id="stop7040" /> - <stop - style="stop-color:#ffffff;stop-opacity:1" - offset="1" - id="stop7042" /> - </linearGradient> - <pattern - inkscape:collect="always" - xlink:href="#Checkerboard" - id="pattern7010" - patternTransform="matrix(1.673813,0,0,1.673813,-177.6001,-146.38611)" /> - <pattern - inkscape:stockid="Checkerboard" - id="Checkerboard" - patternTransform="translate(0,0) scale(10,10)" - height="2" - width="2" - patternUnits="userSpaceOnUse" - inkscape:collect="always"> - <rect - id="rect6201" - height="1" - width="1" - y="0" - x="0" - style="fill:black;stroke:none" /> - <rect - id="rect6203" - height="1" - width="1" - y="1" - x="1" - style="fill:black;stroke:none" /> - </pattern> - <linearGradient - id="linearGradient5406" - osb:paint="solid"> - <stop - style="stop-color:#000000;stop-opacity:1;" - offset="0" - id="stop5404" /> - </linearGradient> - <pattern - patternUnits="userSpaceOnUse" - width="15.999999" - height="16.000025" - patternTransform="matrix(0.26458333,0,0,0.26458333,-16.933332,263.1333)" - id="pattern6465"> - <path - d="m 8.0000542,8.0000126 h 7.9998878 c 3e-5,0 5.7e-5,3.78e-5 5.7e-5,3.78e-5 V 15.99995 c 0,3.7e-5 -2.7e-5,7.5e-5 -5.7e-5,7.5e-5 H 8.0000542 c -3.03e-5,0 -5.67e-5,-3.8e-5 -5.67e-5,-7.5e-5 V 8.0000504 c 0,0 2.64e-5,-3.78e-5 5.67e-5,-3.78e-5 z M 5.6692913e-5,0 H 7.9999408 c 3.02e-5,0 5.67e-5,3.7795275e-5 5.67e-5,7.5590551e-5 V 7.999937 c 0,3.78e-5 -2.65e-5,7.56e-5 -5.67e-5,7.56e-5 H 5.6692913e-5 C 2.2677165e-5,8.0000126 0,7.9999748 0,7.999937 V 7.5590551e-5 C 0,3.7795276e-5 2.2677165e-5,0 5.6692913e-5,0 Z" - style="opacity:1;fill:#db1545;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:15.99999905;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect6445-2" - inkscape:connector-curvature="0" /> - </pattern> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient7044" - id="linearGradient6476" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(3.223659,0,0,2.5556636,-579.27357,808.39)" - x1="86.490868" - y1="-216.62756" - x2="176.77992" - y2="-216.62756" /> - <mask - maskUnits="userSpaceOnUse" - id="mask6472"> - <rect - transform="rotate(-90)" - y="-0.91986513" - x="-300.45657" - height="511.36566" - width="291.06116" - id="rect6474" - style="opacity:1;fill:url(#linearGradient6476);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.92238116;stroke-miterlimit:4;stroke-dasharray:none" /> - </mask> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#1e1d65" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.84705882" - inkscape:pageshadow="2" - inkscape:zoom="0.6363961" - inkscape:cx="720.54406" - inkscape:cy="371.58659" - inkscape:document-units="mm" - inkscape:current-layer="layer1" - showgrid="true" - units="px" - inkscape:pagecheckerboard="true" - inkscape:window-width="1920" - inkscape:window-height="1057" - inkscape:window-x="1912" - inkscape:window-y="1143" - inkscape:window-maximized="1" - objecttolerance="1" - guidetolerance="10000" - gridtolerance="10000" - inkscape:snap-bbox="true" - inkscape:bbox-paths="true" - inkscape:bbox-nodes="true" - inkscape:snap-bbox-edge-midpoints="true" - inkscape:snap-bbox-midpoints="true" - showguides="false"> - <inkscape:grid - type="xygrid" - id="grid6443" - spacingx="2.1166667" - spacingy="2.1166667" - empspacing="4" - color="#3f3fff" - opacity="0.1254902" - enabled="false" /> - <sodipodi:guide - position="-69.219003,3.872392" - orientation="1,0" - id="guide6508" - inkscape:locked="false" /> - </sodipodi:namedview> - <metadata - id="metadata5"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:groupmode="layer" - id="layer2" - inkscape:label="Back" - style="display:inline"> - <path - style="fill:#253276;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 500.58203,825.29688 -54.2207,18.9121 18.91406,56.74219 -45.39258,10.08594 -11.34765,-39.08789 -46.6543,12.60937 13.87109,34.04493 -55.48047,15.13086 -12.60937,-44.13086 -47.91406,13.86914 13.86914,44.13086 -32.78321,11.3496 17.65235,35.30469 278.66211,-63.04492 z m -11.0957,26.45312 0.44726,11.5918 -12.03711,2.67382 -3.5664,-9.80664 z m 4.90429,24.51953 0.89258,9.80859 -9.36328,2.67383 -4.45703,-9.36133 z m -201.5,32.09766 v 11.14453 l -8.4707,1.7832 -4.9043,-8.91601 z" - id="path4522" - inkscape:connector-curvature="0" - transform="scale(0.26458333)" /> - <path - transform="translate(0,-11.249983)" - style="fill:#253276;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 381.65643,238.28361 -47.37344,16.34717 116.09827,29.02457 -14.01186,-23.68672 -31.02626,-0.33362 z" - id="path4520" - inkscape:connector-curvature="0" /> - </g> - <g - inkscape:label="Ground" - inkscape:groupmode="layer" - id="layer1" - transform="translate(0,-11.249983)" - style="display:inline"> - <circle - style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:1.99730551" - id="path5392" - cx="253.06117" - cy="887.61829" - r="642.68146" /> - </g> - <g - inkscape:groupmode="layer" - id="layer3" - inkscape:label="Front"> - <path - style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:1.00157475;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 565.38867,666.80078 -115.20508,24.36914 70.24414,231.09766 121.20118,-18.97656 8.61523,-148.01368 -76.28906,21.625 z m -30.15234,38.82813 3.09765,47.0625 -11.44531,2.49414 -9.14062,-46.10743 z m -26.41211,5.20898 10.30664,46.03906 -9.47852,2.06641 -17.14257,-44.88672 z m 41.45508,65.93945 2.80078,44.04493 -12.50391,3.40234 L 532.1543,781.75 Z m -25.15039,6.90039 9.4414,42.18165 -9.54297,2.59765 -13.99804,-40.91015 z m 85.48242,50.83789 1,42.35938 -22.15235,4.89648 -4.53906,-41.66406 z m -54.21485,10.16797 4.54102,41.66211 -7.67188,1.89649 -8.07421,-40.73047 z m -16.66992,4.20899 9.05469,40.45703 -8.88477,2.19727 -12.02734,-39.66016 z" - id="path5398" - transform="scale(0.26458333)" - inkscape:connector-curvature="0" /> - <path - transform="translate(0,-11.249983)" - style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 329.51477,199.15082 -32.04286,18.26817 12.8142,1.28619 -6.02656,28.18505 32.94792,3.49531 0.51681,-27.76301 11.91226,1.00737 z m -14.10711,25.93826 6.27123,0.90288 -1.15019,5.4805 -6.00929,-0.898 z m 13.58524,2.09643 0.42171,5.50053 -6.35262,-0.44337 1.22618,-5.67857 z m -15.04127,5.73678 6.21844,0.90138 -1.87301,4.94347 -5.07899,-0.81761 z m 8.80707,1.53673 6.3403,1.10313 0.43128,4.98637 -7.83808,-1.19409 z" - id="path6874" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cccccccccccccccccccccccccccc" /> - <path - transform="translate(0,-11.249983)" - style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 366.28967,254.78298 7.49431,-30.40441 -7.41388,-2.66046 1.18763,-3.36104 7.21205,2.27141 1.38362,-5.73044 -7.20912,-2.66047 1.28561,-3.65794 7.01313,2.7643 2.17341,-7.01022 3.35519,1.48161 -2.1734,6.51147 6.70747,2.66046 -1.28564,3.16213 -6.31255,-2.46154 -1.68638,6.02735 6.80837,2.46447 -0.9887,3.84808 -6.90052,-2.47031 -6.71038,30.41026 z" - id="path6891" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccccccccccccccccccc" /> - <path - transform="translate(0,-11.249983)" - style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 74.047433,217.56203 -1.20251,0.65577 2.314585,6.84299 -4.564578,1.31517 13.625009,41.10395 21.186821,-5.50251 -7.183542,-43.56323 -22.044649,6.35259 z m 16.734379,10.06088 1.478463,10.23607 -8.339026,1.96939 -3.82509,-9.42992 z m 3.780131,14.55519 0.781863,9.82627 -7.001121,1.81797 -3.593063,-9.29297 z" - id="path6944" - inkscape:connector-curvature="0" /> - <path - transform="translate(0,-11.249983)" - style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.24600939px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 43.603475,280.06036 -10.564819,-28.58824 -6.574764,2.28618 -0.916385,-3.37337 6.23111,-2.47535 -2.011396,-5.37101 -6.431418,2.16468 -1.002197,-3.66725 6.348194,-1.96596 -2.123972,-6.85578 3.11982,-0.81419 1.86458,6.45975 6.080155,-1.86705 0.744318,3.27357 -5.700174,1.79072 1.953823,5.78639 6.048884,-2.08256 1.308957,3.64208 -6.116434,2.13257 11.116753,28.12778 z" - id="path6891-8" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccccccccccccccccccc" /> - <path - transform="translate(0,-11.249983)" - style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 411.98753,264.70523 3.91734,-12.57157 -7.13355,-3.53259 -1.396,-8.02014 5.81668,-6.93436 10.92618,-0.52461 7.35863,5.88054 0.0806,8.11138 -5.67524,6.95564 -7.37536,-0.96565 -1.04168,4.03744 5.21293,-1.96321 1.42492,-6.58308 5.61592,-1.7579 5.33002,3.98422 -1.35343,5.14755 -3.67857,2.33882 -4.89966,-2.03926 -7.52592,2.91667 -1.60892,6.84465 z" - id="path6985" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccccccccccccccccccc" /> - <path - transform="translate(0,-11.249983)" - style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.27861062px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 438.77767,272.41521 -0.009,-2.99656 1.24656,2.44908 1.28337,-1.87551 -0.0534,2.25473 2.30831,-1.55949 -1.70125,2.67579 z" - id="path7212" - inkscape:connector-curvature="0" /> - <path - transform="translate(0,-11.249983)" - style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.29395995px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 387.1467,259.13862 -0.3913,-3.17093 1.60741,2.46066 1.09423,-2.12083 0.23196,2.39229 2.19942,-1.8946 -1.42637,3.01207 z" - id="path7212-4" - inkscape:connector-curvature="0" /> - <path - transform="translate(0,-11.249983)" - style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 457.96894,278.42384 1.02302,-2.77836 -1.31183,-0.56021 0.33336,-0.616 1.26318,0.48291 0.54568,-1.37607 0.81934,0.31324 -0.47741,1.4022 1.87364,0.67714 0.47795,-1.14765 0.83893,0.26207 -0.47245,1.28672 1.80283,0.70884 0.41215,-1.23149 0.92825,0.33529 -0.49337,1.23952 1.38917,0.51162 -0.21081,0.85845 -1.42731,-0.56527 -1.05878,2.6669 -0.81279,-0.33034 0.94975,-2.68892 -1.68742,-0.7038 -1.03512,2.65627 -0.83236,-0.27915 0.99293,-2.75061 -1.92628,-0.79522 -1.00194,2.82543 z" - id="path7229" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccccccccccccccccccccccccccc" /> - <path - transform="translate(0,-11.249983)" - id="path7233" - style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.3185696px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 73.482785,265.42476 4.944364,-1.72314 -0.207904,-0.52164 -2.012479,0.86151 -0.0213,-0.63037 -0.837931,0.3339 0.324488,0.46118 -2.371778,0.68852 z m 0.497305,0.21764 4.223597,-1.35549 0.556753,4.37406 -2.879727,0.92419 z" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cccccccccccccc" /> - <path - transform="translate(0,-11.249983)" - style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 156.55184,206.61884 0.47605,-0.20403 1.0201,8.90891 -0.47605,0.20402 z" - id="path7236" - inkscape:connector-curvature="0" /> - <path - transform="translate(0,-11.249983)" - style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 160.97229,209.47512 0.20402,4.96451 0.47605,-0.068 0.068,-5.03251 z" - id="path7238" - inkscape:connector-curvature="0" /> - <path - transform="translate(0,-11.249983)" - style="fill:#172062;fill-opacity:1;stroke:none;stroke-width:0.34364724px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 23.838748,287.33572 -2.186787,-3.04882 3.027872,1.63785 -0.07842,-2.79635 1.585239,2.33549 1.177306,-3.18042 0.241718,3.90016 z" - id="path7212-4-6" - inkscape:connector-curvature="0" /> - <circle - transform="translate(0,-11.249983)" - style="opacity:0.5;fill:#ff0016;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.11666656;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4535" - cx="120.03474" - cy="193.66763" - r="2.5126758" /> - <circle - transform="translate(0,-11.249983)" - style="opacity:0.5;fill:#ff0016;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.11666656;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4535-2" - cx="97.333473" - cy="218.84901" - r="2.5126758" /> - <circle - transform="translate(0,-11.249983)" - style="opacity:0.5;fill:#ff0016;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.11666656;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4535-24" - cx="70.128021" - cy="226.19046" - r="2.5126758" /> - <circle - transform="translate(0,-11.249983)" - style="opacity:0.25;fill:#ff0016;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.41842699;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4535-25" - cx="118.05532" - cy="234.83446" - r="1.6838019" /> - <circle - transform="translate(0,-11.249983)" - style="opacity:0.5;fill:#ffbe16;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.3186785;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4535-9" - cx="110.59546" - cy="252.2408" - r="1.5653913" /> - <circle - transform="translate(0,-11.249983)" - style="opacity:0.5;fill:#ffbe16;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.3186785;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4535-9-7" - cx="122.43651" - cy="242.53113" - r="1.5653913" /> - <circle - transform="translate(0,-11.249983)" - style="opacity:0.5;fill:#ffbe16;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.3186785;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4535-9-2" - cx="64.415337" - cy="265.26596" - r="1.5653913" /> - <circle - transform="translate(0,-11.249983)" - style="opacity:0.1;fill:#ff0016;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.44323444;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4535-24-4" - cx="69.61615" - cy="226.18503" - r="7.648705" /> - <circle - transform="translate(0,-11.249983)" - style="opacity:0.1;fill:#ff0016;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.44323444;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4535-24-4-4" - cx="97.333473" - cy="218.84901" - r="7.648705" /> - <circle - transform="translate(0,-11.249983)" - style="opacity:0.1;fill:#ff0016;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.44323444;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4535-24-4-2" - cx="119.52941" - cy="193.50121" - r="7.648705" /> - <circle - transform="translate(0,-11.249983)" - style="opacity:0.02999998;fill:#ffbe16;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.13750315;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4535-9-2-6" - cx="64.415337" - cy="265.26596" - r="4.9115925" /> - <circle - transform="translate(0,-11.249983)" - style="opacity:0.02999998;fill:#ffbe16;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.13750315;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4535-9-2-6-7" - cx="110.59546" - cy="252.2408" - r="4.9115925" /> - <circle - transform="translate(0,-11.249983)" - style="opacity:0.02999998;fill:#ffbe16;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.13750315;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4535-9-2-6-3" - cx="122.43651" - cy="242.53113" - r="4.9115925" /> - <circle - transform="translate(0,-11.249983)" - style="opacity:0.05;fill:#ff0016;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.44323444;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path4535-24-4-4-8" - cx="117.52492" - cy="234.88242" - r="7.648705" /> - </g> -</svg> From abe14c1665286d2a7ef84fa05dc3d8162d074ec1 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 21:33:36 +0900 Subject: [PATCH 042/369] :art: --- src/client/app/desktop/views/pages/welcome.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index c406f9b0a4..03a60dd487 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -108,7 +108,7 @@ root(isDark) > article max-width 700px margin 42px auto 0 auto - padding 64px + padding 64px 82px background isDark ? #282C37 : #fff box-shadow 0 8px 32px rgba(#000, 0.15) From 3f9e5fffbe2418c906e567b4922fa3ac3571984c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 21:43:21 +0900 Subject: [PATCH 043/369] Fix bug --- src/server/api/endpoints/notes/local-timeline.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts index e7ebe5d960..64118e1f14 100644 --- a/src/server/api/endpoints/notes/local-timeline.ts +++ b/src/server/api/endpoints/notes/local-timeline.ts @@ -57,6 +57,9 @@ module.exports = async (params, user, app) => { $nin: mutedUserIds }, + // public only + visibility: 'public', + // local '_user.host': null } as any; From 5a76716b5a92723edeb510d6594477f97819530e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 21:43:33 +0900 Subject: [PATCH 044/369] home --- src/server/api/service/github.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/api/service/github.ts b/src/server/api/service/github.ts index cd9760a36d..da33648a16 100644 --- a/src/server/api/service/github.ts +++ b/src/server/api/service/github.ts @@ -25,7 +25,7 @@ const post = async text => { } } - createNote(bot, { text }); + createNote(bot, { text, visibility: 'home' }); }; // Init router From 0ca2c313ecc89595abc333e08185056095dd1d1f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 21:45:14 +0900 Subject: [PATCH 045/369] 2.21.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 328b72dfe3..6b3a21c2bc 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.20.1", - "clientVersion": "1.0.5871", + "version": "2.21.0", + "clientVersion": "1.0.5903", "codename": "nighthike", "main": "./built/index.js", "private": true, From 43eb8bd99b09532b76de30b257bf02f47525fe69 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 21:59:57 +0900 Subject: [PATCH 046/369] =?UTF-8?q?notes/local-timeline=20=E3=81=A8=20note?= =?UTF-8?q?s/global-timeline=20=E3=81=AE=E3=82=B5=E3=82=A4=E3=83=B3?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=82=92=E4=B8=8D=E8=A6=81=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/api/endpoints.ts | 2 -- .../api/endpoints/notes/global-timeline.ts | 32 +++++++++++-------- .../api/endpoints/notes/local-timeline.ts | 31 ++++++++++-------- 3 files changed, 36 insertions(+), 29 deletions(-) diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts index 908d9574a5..c1ac4777b6 100644 --- a/src/server/api/endpoints.ts +++ b/src/server/api/endpoints.ts @@ -515,7 +515,6 @@ const endpoints: Endpoint[] = [ }, { name: 'notes/local-timeline', - withCredential: true, limit: { duration: ms('10minutes'), max: 100 @@ -523,7 +522,6 @@ const endpoints: Endpoint[] = [ }, { name: 'notes/global-timeline', - withCredential: true, limit: { duration: ms('10minutes'), max: 100 diff --git a/src/server/api/endpoints/notes/global-timeline.ts b/src/server/api/endpoints/notes/global-timeline.ts index d22a1763de..7cf06c3af1 100644 --- a/src/server/api/endpoints/notes/global-timeline.ts +++ b/src/server/api/endpoints/notes/global-timeline.ts @@ -9,7 +9,7 @@ import { pack } from '../../../../models/note'; /** * Get timeline of global */ -module.exports = async (params, user, app) => { +module.exports = async (params, user) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) throw 'invalid limit param'; @@ -36,9 +36,9 @@ module.exports = async (params, user, app) => { } // ミュートしているユーザーを取得 - const mutedUserIds = (await Mute.find({ + const mutedUserIds = user ? (await Mute.find({ muterId: user._id - })).map(m => m.muteeId); + })).map(m => m.muteeId) : null; //#region Construct query const sort = { @@ -46,18 +46,24 @@ module.exports = async (params, user, app) => { }; const query = { - // mute - userId: { - $nin: mutedUserIds - }, - '_reply.userId': { - $nin: mutedUserIds - }, - '_renote.userId': { - $nin: mutedUserIds - } + // public only + visibility: 'public' } as any; + if (mutedUserIds && mutedUserIds.length > 0) { + query.userId = { + $nin: mutedUserIds + }; + + query['_reply.userId'] = { + $nin: mutedUserIds + }; + + query['_renote.userId'] = { + $nin: mutedUserIds + }; + } + if (sinceId) { sort._id = 1; query._id = { diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts index 64118e1f14..7d01de3d43 100644 --- a/src/server/api/endpoints/notes/local-timeline.ts +++ b/src/server/api/endpoints/notes/local-timeline.ts @@ -9,7 +9,7 @@ import { pack } from '../../../../models/note'; /** * Get timeline of local */ -module.exports = async (params, user, app) => { +module.exports = async (params, user) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) throw 'invalid limit param'; @@ -36,9 +36,9 @@ module.exports = async (params, user, app) => { } // ミュートしているユーザーを取得 - const mutedUserIds = (await Mute.find({ + const mutedUserIds = user ? (await Mute.find({ muterId: user._id - })).map(m => m.muteeId); + })).map(m => m.muteeId) : null; //#region Construct query const sort = { @@ -46,17 +46,6 @@ module.exports = async (params, user, app) => { }; const query = { - // mute - userId: { - $nin: mutedUserIds - }, - '_reply.userId': { - $nin: mutedUserIds - }, - '_renote.userId': { - $nin: mutedUserIds - }, - // public only visibility: 'public', @@ -64,6 +53,20 @@ module.exports = async (params, user, app) => { '_user.host': null } as any; + if (mutedUserIds && mutedUserIds.length > 0) { + query.userId = { + $nin: mutedUserIds + }; + + query['_reply.userId'] = { + $nin: mutedUserIds + }; + + query['_renote.userId'] = { + $nin: mutedUserIds + }; + } + if (sinceId) { sort._id = 1; query._id = { From 5d82443389d02b1645533cf4d8d12f1ae114179d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 28 May 2018 22:00:29 +0900 Subject: [PATCH 047/369] 2.21.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6b3a21c2bc..3b3da1810a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.21.0", + "version": "2.21.1", "clientVersion": "1.0.5903", "codename": "nighthike", "main": "./built/index.js", From bd1f3a2f0196214248e8a259f8aacfe3e8259c19 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 00:36:52 +0900 Subject: [PATCH 048/369] #1579 --- src/models/note.ts | 1 + src/server/api/endpoints/notes/replies.ts | 26 +++-------------------- src/services/note/create.ts | 18 ++++++++++++++++ 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/models/note.ts b/src/models/note.ts index 5d7bab3833..ad8c1565f0 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -77,6 +77,7 @@ export type INote = { host: string; inbox?: string; }; + _replyIds?: mongo.ObjectID[]; }; /** diff --git a/src/server/api/endpoints/notes/replies.ts b/src/server/api/endpoints/notes/replies.ts index 11d221d8f7..7261d3dbf6 100644 --- a/src/server/api/endpoints/notes/replies.ts +++ b/src/server/api/endpoints/notes/replies.ts @@ -1,15 +1,8 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Note, { pack } from '../../../../models/note'; /** - * Show a replies of a note - * - * @param {any} params - * @param {any} user - * @return {Promise<any>} + * GEt replies of a note */ module.exports = (params, user) => new Promise(async (res, rej) => { // Get 'noteId' parameter @@ -24,10 +17,6 @@ module.exports = (params, user) => new Promise(async (res, rej) => { const [offset = 0, offsetErr] = $.num.optional().min(0).get(params.offset); if (offsetErr) return rej('invalid offset param'); - // Get 'sort' parameter - const [sort = 'desc', sortError] = $.str.optional().or('desc asc').get(params.sort); - if (sortError) return rej('invalid sort param'); - // Lookup note const note = await Note.findOne({ _id: noteId @@ -37,17 +26,8 @@ module.exports = (params, user) => new Promise(async (res, rej) => { return rej('note not found'); } - // Issue query - const replies = await Note - .find({ replyId: note._id }, { - limit: limit, - skip: offset, - sort: { - _id: sort == 'asc' ? 1 : -1 - } - }); + const ids = note._replyIds.slice(offset, offset + limit); // Serialize - res(await Promise.all(replies.map(async note => - await pack(note, user)))); + res(await Promise.all(ids.map(id => pack(id, user)))); }); diff --git a/src/services/note/create.ts b/src/services/note/create.ts index b9ff1f679b..37d21fecad 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -172,6 +172,24 @@ export default async (user: IUser, data: { } }); + if (data.reply) { + Note.update({ _id: data.reply._id }, { + $push: { + _replyIds: note._id + } + }); + } + + const isQuote = data.renote && (data.text || data.poll || data.media); + + if (isQuote) { + Note.update({ _id: data.renote._id }, { + $push: { + _quoteIds: note._id + } + }); + } + // Serialize const noteObj = await pack(note); From 973b1e42ef41e842cecce2a11f6b8dd8b50f767b Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 00:38:07 +0900 Subject: [PATCH 049/369] typo --- src/server/api/endpoints/notes/replies.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/api/endpoints/notes/replies.ts b/src/server/api/endpoints/notes/replies.ts index 7261d3dbf6..f407f3bd56 100644 --- a/src/server/api/endpoints/notes/replies.ts +++ b/src/server/api/endpoints/notes/replies.ts @@ -2,7 +2,7 @@ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Note, { pack } from '../../../../models/note'; /** - * GEt replies of a note + * Get replies of a note */ module.exports = (params, user) => new Promise(async (res, rej) => { // Get 'noteId' parameter From ab16fb3a3fff96a4fa2bc1fc0e56a87c129a4625 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 01:22:39 +0900 Subject: [PATCH 050/369] #1634 --- .../app/common/scripts/streaming/home.ts | 24 +++++++++ .../components/ui.header.notifications.vue | 39 ++------------ .../app/mobile/views/components/ui.header.vue | 52 +++++-------------- .../app/mobile/views/components/ui.nav.vue | 52 +++++-------------- src/publishers/notify.ts | 8 +++ .../api/common/read-messaging-message.ts | 8 +++ src/server/api/common/read-notification.ts | 8 +++ src/server/api/endpoints.ts | 10 ---- .../api/endpoints/messaging/messages.ts | 7 --- .../endpoints/messaging/messages/create.ts | 7 +++ src/server/api/endpoints/messaging/unread.ts | 29 ----------- .../notifications/get_unread_count.ts | 28 ---------- .../notifications/mark_as_read_all.ts | 11 ++-- 13 files changed, 92 insertions(+), 191 deletions(-) delete mode 100644 src/server/api/endpoints/messaging/unread.ts delete mode 100644 src/server/api/endpoints/notifications/get_unread_count.ts diff --git a/src/client/app/common/scripts/streaming/home.ts b/src/client/app/common/scripts/streaming/home.ts index 2715b9e0e9..50bbb56896 100644 --- a/src/client/app/common/scripts/streaming/home.ts +++ b/src/client/app/common/scripts/streaming/home.ts @@ -28,6 +28,30 @@ export class HomeStream extends Stream { os.store.dispatch('mergeMe', i); }); + this.on('read_all_notifications', () => { + os.store.dispatch('mergeMe', { + hasUnreadNotification: false + }); + }); + + this.on('unread_notification', () => { + os.store.dispatch('mergeMe', { + hasUnreadNotification: true + }); + }); + + this.on('read_all_messaging_messages', () => { + os.store.dispatch('mergeMe', { + hasUnreadMessagingMessage: false + }); + }); + + this.on('unread_messaging_message', () => { + os.store.dispatch('mergeMe', { + hasUnreadMessagingMessage: true + }); + }); + this.on('clientSettingUpdated', x => { os.store.commit('settings/set', { key: x.key, diff --git a/src/client/app/desktop/views/components/ui.header.notifications.vue b/src/client/app/desktop/views/components/ui.header.notifications.vue index 9eaaa62c61..59a16df9ec 100644 --- a/src/client/app/desktop/views/components/ui.header.notifications.vue +++ b/src/client/app/desktop/views/components/ui.header.notifications.vue @@ -1,7 +1,7 @@ <template> <div class="notifications"> <button :data-active="isOpen" @click="toggle" title="%i18n:@title%"> - %fa:R bell%<template v-if="hasUnreadNotifications">%fa:circle%</template> + %fa:R bell%<template v-if="hasUnreadNotification">%fa:circle%</template> </button> <div class="pop" v-if="isOpen"> <mk-notifications/> @@ -16,44 +16,15 @@ import contains from '../../../common/scripts/contains'; export default Vue.extend({ data() { return { - isOpen: false, - hasUnreadNotifications: false, - connection: null, - connectionId: null + isOpen: false }; }, - mounted() { - if (this.$store.getters.isSignedIn) { - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); - - this.connection.on('read_all_notifications', this.onReadAllNotifications); - this.connection.on('unread_notification', this.onUnreadNotification); - - // Fetch count of unread notifications - (this as any).api('notifications/get_unread_count').then(res => { - if (res.count > 0) { - this.hasUnreadNotifications = true; - } - }); - } - }, - beforeDestroy() { - if (this.$store.getters.isSignedIn) { - this.connection.off('read_all_notifications', this.onReadAllNotifications); - this.connection.off('unread_notification', this.onUnreadNotification); - (this as any).os.stream.dispose(this.connectionId); + computed: { + hasUnreadNotification(): boolean { + return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification; } }, methods: { - onReadAllNotifications() { - this.hasUnreadNotifications = false; - }, - - onUnreadNotification() { - this.hasUnreadNotifications = true; - }, - toggle() { this.isOpen ? this.close() : this.open(); }, diff --git a/src/client/app/mobile/views/components/ui.header.vue b/src/client/app/mobile/views/components/ui.header.vue index 09aa18f769..c72b15fb8b 100644 --- a/src/client/app/mobile/views/components/ui.header.vue +++ b/src/client/app/mobile/views/components/ui.header.vue @@ -6,7 +6,7 @@ <p ref="welcomeback" v-if="$store.getters.isSignedIn">おかえりなさい、<b>{{ $store.state.i | userName }}</b>さん</p> <div class="content" ref="mainContainer"> <button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button> - <template v-if="hasUnreadNotifications || hasUnreadMessagingMessages || hasGameInvitations">%fa:circle%</template> + <template v-if="hasUnreadNotification || hasUnreadMessagingMessage || hasGameInvitation">%fa:circle%</template> <h1> <slot>Misskey</slot> </h1> @@ -25,13 +25,19 @@ export default Vue.extend({ props: ['func'], data() { return { - hasUnreadNotifications: false, - hasUnreadMessagingMessages: false, - hasGameInvitations: false, + hasGameInvitation: false, connection: null, connectionId: null }; }, + computed: { + hasUnreadNotification(): boolean { + return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification; + }, + hasUnreadMessagingMessage(): boolean { + return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadMessagingMessage; + } + }, mounted() { this.$store.commit('setUiHeaderHeight', 48); @@ -39,27 +45,9 @@ export default Vue.extend({ this.connection = (this as any).os.stream.getConnection(); this.connectionId = (this as any).os.stream.use(); - this.connection.on('read_all_notifications', this.onReadAllNotifications); - this.connection.on('unread_notification', this.onUnreadNotification); - this.connection.on('read_all_messaging_messages', this.onReadAllMessagingMessages); - this.connection.on('unread_messaging_message', this.onUnreadMessagingMessage); this.connection.on('othello_invited', this.onOthelloInvited); this.connection.on('othello_no_invites', this.onOthelloNoInvites); - // Fetch count of unread notifications - (this as any).api('notifications/get_unread_count').then(res => { - if (res.count > 0) { - this.hasUnreadNotifications = true; - } - }); - - // Fetch count of unread messaging messages - (this as any).api('messaging/unread').then(res => { - if (res.count > 0) { - this.hasUnreadMessagingMessages = true; - } - }); - const ago = (new Date().getTime() - new Date(this.$store.state.i.lastUsedAt).getTime()) / 1000; const isHisasiburi = ago >= 3600; this.$store.state.i.lastUsedAt = new Date(); @@ -110,33 +98,17 @@ export default Vue.extend({ }, beforeDestroy() { if (this.$store.getters.isSignedIn) { - this.connection.off('read_all_notifications', this.onReadAllNotifications); - this.connection.off('unread_notification', this.onUnreadNotification); - this.connection.off('read_all_messaging_messages', this.onReadAllMessagingMessages); - this.connection.off('unread_messaging_message', this.onUnreadMessagingMessage); this.connection.off('othello_invited', this.onOthelloInvited); this.connection.off('othello_no_invites', this.onOthelloNoInvites); (this as any).os.stream.dispose(this.connectionId); } }, methods: { - onReadAllNotifications() { - this.hasUnreadNotifications = false; - }, - onUnreadNotification() { - this.hasUnreadNotifications = true; - }, - onReadAllMessagingMessages() { - this.hasUnreadMessagingMessages = false; - }, - onUnreadMessagingMessage() { - this.hasUnreadMessagingMessages = true; - }, onOthelloInvited() { - this.hasGameInvitations = true; + this.hasGameInvitation = true; }, onOthelloNoInvites() { - this.hasGameInvitations = false; + this.hasGameInvitation = false; } } }); diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue index 5f0cc831cc..de8c21e795 100644 --- a/src/client/app/mobile/views/components/ui.nav.vue +++ b/src/client/app/mobile/views/components/ui.nav.vue @@ -16,7 +16,7 @@ <div class="links"> <ul> <li><router-link to="/" :data-active="$route.name == 'index'">%fa:home%%i18n:@home%%fa:angle-right%</router-link></li> - <li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotifications">%fa:circle%</template>%fa:angle-right%</router-link></li> + <li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotification">%fa:circle%</template>%fa:angle-right%</router-link></li> <li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessages">%fa:circle%</template>%fa:angle-right%</router-link></li> <li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%ゲーム<template v-if="hasGameInvitations">%fa:circle%</template>%fa:angle-right%</router-link></li> </ul> @@ -46,47 +46,31 @@ export default Vue.extend({ props: ['isOpen'], data() { return { - hasUnreadNotifications: false, - hasUnreadMessagingMessages: false, - hasGameInvitations: false, + hasGameInvitation: false, connection: null, connectionId: null, aboutUrl: `${docsUrl}/${lang}/about` }; }, + computed: { + hasUnreadNotification(): boolean { + return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification; + }, + hasUnreadMessagingMessage(): boolean { + return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadMessagingMessage; + } + }, mounted() { if (this.$store.getters.isSignedIn) { this.connection = (this as any).os.stream.getConnection(); this.connectionId = (this as any).os.stream.use(); - this.connection.on('read_all_notifications', this.onReadAllNotifications); - this.connection.on('unread_notification', this.onUnreadNotification); - this.connection.on('read_all_messaging_messages', this.onReadAllMessagingMessages); - this.connection.on('unread_messaging_message', this.onUnreadMessagingMessage); this.connection.on('othello_invited', this.onOthelloInvited); this.connection.on('othello_no_invites', this.onOthelloNoInvites); - - // Fetch count of unread notifications - (this as any).api('notifications/get_unread_count').then(res => { - if (res.count > 0) { - this.hasUnreadNotifications = true; - } - }); - - // Fetch count of unread messaging messages - (this as any).api('messaging/unread').then(res => { - if (res.count > 0) { - this.hasUnreadMessagingMessages = true; - } - }); } }, beforeDestroy() { if (this.$store.getters.isSignedIn) { - this.connection.off('read_all_notifications', this.onReadAllNotifications); - this.connection.off('unread_notification', this.onUnreadNotification); - this.connection.off('read_all_messaging_messages', this.onReadAllMessagingMessages); - this.connection.off('unread_messaging_message', this.onUnreadMessagingMessage); this.connection.off('othello_invited', this.onOthelloInvited); this.connection.off('othello_no_invites', this.onOthelloNoInvites); (this as any).os.stream.dispose(this.connectionId); @@ -98,23 +82,11 @@ export default Vue.extend({ if (query == null || query == '') return; this.$router.push('/search?q=' + encodeURIComponent(query)); }, - onReadAllNotifications() { - this.hasUnreadNotifications = false; - }, - onUnreadNotification() { - this.hasUnreadNotifications = true; - }, - onReadAllMessagingMessages() { - this.hasUnreadMessagingMessages = false; - }, - onUnreadMessagingMessage() { - this.hasUnreadMessagingMessages = true; - }, onOthelloInvited() { - this.hasGameInvitations = true; + this.hasGameInvitation = true; }, onOthelloNoInvites() { - this.hasGameInvitations = false; + this.hasGameInvitation = false; }, dark() { this.$store.commit('device/set', { diff --git a/src/publishers/notify.ts b/src/publishers/notify.ts index 2b89515d42..0e480ef010 100644 --- a/src/publishers/notify.ts +++ b/src/publishers/notify.ts @@ -3,6 +3,7 @@ import Notification from '../models/notification'; import Mute from '../models/mute'; import { pack } from '../models/notification'; import stream from './stream'; +import User from '../models/user'; export default ( notifiee: mongo.ObjectID, @@ -29,6 +30,13 @@ export default ( stream(notifiee, 'notification', await pack(notification)); + // Update flag + User.update({ _id: notifiee }, { + $set: { + hasUnreadNotification: true + } + }); + // 3秒経っても(今回作成した)通知が既読にならなかったら「未読の通知がありますよ」イベントを発行する setTimeout(async () => { const fresh = await Notification.findOne({ _id: notification._id }, { isRead: true }); diff --git a/src/server/api/common/read-messaging-message.ts b/src/server/api/common/read-messaging-message.ts index 28854e186e..fd5e9f242c 100644 --- a/src/server/api/common/read-messaging-message.ts +++ b/src/server/api/common/read-messaging-message.ts @@ -4,6 +4,7 @@ import { IMessagingMessage as IMessage } from '../../../models/messaging-message import publishUserStream from '../../../publishers/stream'; import { publishMessagingStream } from '../../../publishers/stream'; import { publishMessagingIndexStream } from '../../../publishers/stream'; +import User from '../../../models/user'; /** * Mark as read message(s) @@ -62,6 +63,13 @@ export default ( }); if (count == 0) { + // Update flag + User.update({ _id: userId }, { + $set: { + hasUnreadMessagingMessage: false + } + }); + // 全ての(いままで未読だった)自分宛てのメッセージを(これで)読みましたよというイベントを発行 publishUserStream(userId, 'read_all_messaging_messages'); } diff --git a/src/server/api/common/read-notification.ts b/src/server/api/common/read-notification.ts index cdb87a4114..6505c58c39 100644 --- a/src/server/api/common/read-notification.ts +++ b/src/server/api/common/read-notification.ts @@ -2,6 +2,7 @@ import * as mongo from 'mongodb'; import { default as Notification, INotification } from '../../../models/notification'; import publishUserStream from '../../../publishers/stream'; import Mute from '../../../models/mute'; +import User from '../../../models/user'; /** * Mark as read notification(s) @@ -57,6 +58,13 @@ export default ( }); if (count == 0) { + // Update flag + User.update({ _id: userId }, { + $set: { + hasUnreadNotification: false + } + }); + // 全ての(いままで未読だった)通知を(これで)読みましたよというイベントを発行 publishUserStream(userId, 'read_all_notifications'); } diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts index c1ac4777b6..b4ab65eb16 100644 --- a/src/server/api/endpoints.ts +++ b/src/server/api/endpoints.ts @@ -279,11 +279,6 @@ const endpoints: Endpoint[] = [ kind: 'account/read' }, - { - name: 'notifications/get_unread_count', - withCredential: true, - kind: 'notification-read' - }, { name: 'notifications/delete', withCredential: true, @@ -610,11 +605,6 @@ const endpoints: Endpoint[] = [ withCredential: true, kind: 'messaging-read' }, - { - name: 'messaging/unread', - withCredential: true, - kind: 'messaging-read' - }, { name: 'messaging/messages', withCredential: true, diff --git a/src/server/api/endpoints/messaging/messages.ts b/src/server/api/endpoints/messaging/messages.ts index 0338aba68a..9c3a48334b 100644 --- a/src/server/api/endpoints/messaging/messages.ts +++ b/src/server/api/endpoints/messaging/messages.ts @@ -1,6 +1,3 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Message from '../../../../models/messaging-message'; import User from '../../../../models/user'; @@ -9,10 +6,6 @@ import read from '../../common/read-messaging-message'; /** * Get messages - * - * @param {any} params - * @param {any} user - * @return {Promise<any>} */ module.exports = (params, user) => new Promise(async (res, rej) => { // Get 'userId' parameter diff --git a/src/server/api/endpoints/messaging/messages/create.ts b/src/server/api/endpoints/messaging/messages/create.ts index db471839e7..41238de1e1 100644 --- a/src/server/api/endpoints/messaging/messages/create.ts +++ b/src/server/api/endpoints/messaging/messages/create.ts @@ -91,6 +91,13 @@ module.exports = (params, user) => new Promise(async (res, rej) => { publishMessagingIndexStream(message.recipientId, 'message', messageObj); publishUserStream(message.recipientId, 'messaging_message', messageObj); + // Update flag + User.update({ _id: recipient._id }, { + $set: { + hasUnreadMessagingMessage: true + } + }); + // 3秒経っても(今回作成した)メッセージが既読にならなかったら「未読のメッセージがありますよ」イベントを発行する setTimeout(async () => { const freshMessage = await Message.findOne({ _id: message._id }, { isRead: true }); diff --git a/src/server/api/endpoints/messaging/unread.ts b/src/server/api/endpoints/messaging/unread.ts deleted file mode 100644 index 1d83af501d..0000000000 --- a/src/server/api/endpoints/messaging/unread.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Module dependencies - */ -import Message from '../../../../models/messaging-message'; -import Mute from '../../../../models/mute'; - -/** - * Get count of unread messages - */ -module.exports = (params, user) => new Promise(async (res, rej) => { - const mute = await Mute.find({ - muterId: user._id, - deletedAt: { $exists: false } - }); - const mutedUserIds = mute.map(m => m.muteeId); - - const count = await Message - .count({ - userId: { - $nin: mutedUserIds - }, - recipientId: user._id, - isRead: false - }); - - res({ - count: count - }); -}); diff --git a/src/server/api/endpoints/notifications/get_unread_count.ts b/src/server/api/endpoints/notifications/get_unread_count.ts deleted file mode 100644 index 9766366ff1..0000000000 --- a/src/server/api/endpoints/notifications/get_unread_count.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Module dependencies - */ -import Notification from '../../../../models/notification'; -import Mute from '../../../../models/mute'; - -/** - * Get count of unread notifications - */ -module.exports = (params, user) => new Promise(async (res, rej) => { - const mute = await Mute.find({ - muterId: user._id - }); - const mutedUserIds = mute.map(m => m.muteeId); - - const count = await Notification - .count({ - notifieeId: user._id, - notifierId: { - $nin: mutedUserIds - }, - isRead: false - }); - - res({ - count: count - }); -}); diff --git a/src/server/api/endpoints/notifications/mark_as_read_all.ts b/src/server/api/endpoints/notifications/mark_as_read_all.ts index dce3cb4663..7a48ca3e62 100644 --- a/src/server/api/endpoints/notifications/mark_as_read_all.ts +++ b/src/server/api/endpoints/notifications/mark_as_read_all.ts @@ -1,8 +1,6 @@ -/** - * Module dependencies - */ import Notification from '../../../../models/notification'; import event from '../../../../publishers/stream'; +import User from '../../../../models/user'; /** * Mark as read all notifications @@ -23,6 +21,13 @@ module.exports = (params, user) => new Promise(async (res, rej) => { // Response res(); + // Update flag + User.update({ _id: user._id }, { + $set: { + hasUnreadNotification: false + } + }); + // 全ての通知を読みましたよというイベントを発行 event(user._id, 'read_all_notifications'); }); From 016386b350e8bc97ec5ee9686567c2fb844066d2 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 01:25:54 +0900 Subject: [PATCH 051/369] :v: --- src/models/user.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/models/user.ts b/src/models/user.ts index 74ddcc77f9..11eafe05ea 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -84,6 +84,8 @@ export interface ILocalUser extends IUserBase { twoFactorTempSecret?: string; clientSettings: any; settings: any; + hasUnreadNotification: boolean; + hasUnreadMessagingMessage: boolean; } export interface IRemoteUser extends IUserBase { @@ -387,8 +389,9 @@ export const pack = ( if (!meId || !meId.equals(_user.id) || !opts.detail) { delete _user.avatarId; delete _user.bannerId; - delete _user.driveCapacity; + delete _user.hasUnreadMessagingMessage; + delete _user.hasUnreadNotification; } if (meId && !meId.equals(_user.id)) { From 8f79f862b90b4f8bbdfed8115ceb2c2764b6eb16 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 01:44:15 +0900 Subject: [PATCH 052/369] :pizza: --- locales/ja.yml | 12 +++-- .../desktop/views/components/post-form.vue | 12 ++++- .../app/desktop/views/widgets/post-form.vue | 13 +++++- .../app/mobile/views/components/post-form.vue | 46 ++++++++++++++++--- 4 files changed, 70 insertions(+), 13 deletions(-) diff --git a/locales/ja.yml b/locales/ja.yml index 44fa0ef538..c02422e81a 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -39,6 +39,13 @@ common: confused: "こまこまのこまり" pudding: "Pudding" + note-placeholders: + a: "今どうしてる?" + b: "何かありましたか?" + c: "言いたいことは?" + d: "ここに書いてください" + e: "あなたが書くのを待っています..." + delete: "削除" loading: "読み込み中" ok: "わかった" @@ -393,10 +400,9 @@ desktop/views/components/notifications.vue: empty: "ありません!" desktop/views/components/post-form.vue: - note-placeholder: "いまどうしてる?" reply-placeholder: "この投稿への返信..." quote-placeholder: "この投稿を引用..." - note: "投稿" + submit: "投稿" reply: "返信" renote: "Renote" posted: "投稿しました!" @@ -718,7 +724,6 @@ desktop/views/widgets/polls.vue: desktop/views/widgets/post-form.vue: title: "投稿" note: "投稿" - placeholder: "いまどうしてる?" desktop/views/widgets/profile.vue: update-banner: "クリックでバナー編集" @@ -819,7 +824,6 @@ mobile/views/components/post-form.vue: renote: "Renote" renote-placeholder: "この投稿を引用... (オプション)" reply-placeholder: "この投稿への返信..." - note-placeholder: "いまどうしてる?" cw-placeholder: "内容への注釈 (オプション)" location-alert: "お使いの端末は位置情報に対応していません" error: "エラー" diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index 8eec677b06..ad829065b0 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -86,11 +86,19 @@ export default Vue.extend({ }, placeholder(): string { + const x = [ + '%i18n:common.note-placeholders.a%', + '%i18n:common.note-placeholders.b%', + '%i18n:common.note-placeholders.c%', + '%i18n:common.note-placeholders.d%', + '%i18n:common.note-placeholders.e%' + ][Math.floor(Math.random() * 5)]; + return this.renote ? '%i18n:@quote-placeholder%' : this.reply ? '%i18n:@reply-placeholder%' - : '%i18n:@note-placeholder%'; + : x; }, submitText(): string { @@ -98,7 +106,7 @@ export default Vue.extend({ ? '%i18n:@renote%' : this.reply ? '%i18n:@reply%' - : '%i18n:@note%'; + : '%i18n:@submit%'; }, canPost(): boolean { diff --git a/src/client/app/desktop/views/widgets/post-form.vue b/src/client/app/desktop/views/widgets/post-form.vue index 69b21ad37a..fb4adf70b8 100644 --- a/src/client/app/desktop/views/widgets/post-form.vue +++ b/src/client/app/desktop/views/widgets/post-form.vue @@ -3,7 +3,7 @@ <template v-if="props.design == 0"> <p class="title">%fa:pencil-alt%%i18n:@title%</p> </template> - <textarea :disabled="posting" v-model="text" @keydown="onKeydown" placeholder="%i18n:@placeholder%"></textarea> + <textarea :disabled="posting" v-model="text" @keydown="onKeydown" :placeholder="placeholder"></textarea> <button @click="post" :disabled="posting">%i18n:@note%</button> </div> </template> @@ -22,6 +22,17 @@ export default define({ text: '' }; }, + computed: { + placeholder(): string { + return [ + '%i18n:common.note-placeholders.a%', + '%i18n:common.note-placeholders.b%', + '%i18n:common.note-placeholders.c%', + '%i18n:common.note-placeholders.d%', + '%i18n:common.note-placeholders.e%' + ][Math.floor(Math.random() * 5)]; + } + }, methods: { func() { if (this.props.design == 1) { diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index f5badb48cc..61f0462659 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -5,11 +5,7 @@ <div> <span class="text-count" :class="{ over: text.length > 1000 }">{{ 1000 - text.length }}</span> <span class="geo" v-if="geo">%fa:map-marker-alt%</span> - <button class="submit" :disabled="posting" @click="post"> - <template v-if="reply">%i18n:@reply%</template> - <template v-else-if="renote">%i18n:@renote%</template> - <template v-else>%i18n:@submit%</template> - </button> + <button class="submit" :disabled="posting" @click="post">{{ submitText }}</button> </div> </header> <div class="form"> @@ -20,7 +16,7 @@ <a @click="addVisibleUser">+%i18n:@add-visible-user%</a> </div> <input v-show="useCw" v-model="cw" placeholder="%i18n:@cw-placeholder%"> - <textarea v-model="text" ref="text" :disabled="posting" :placeholder="reply ? '%i18n:@reply-placeholder%' : renote ? '%i18n:@renote-placeholder%' : '%i18n:@note-placeholder%'"></textarea> + <textarea v-model="text" ref="text" :disabled="posting" :placeholder="placeholder"></textarea> <div class="attaches" v-show="files.length != 0"> <x-draggable class="files" :list="files" :options="{ animation: 150 }"> <div class="file" v-for="file in files" :key="file.id"> @@ -74,6 +70,44 @@ export default Vue.extend({ }; }, + computed: { + draftId(): string { + return this.renote + ? 'renote:' + this.renote.id + : this.reply + ? 'reply:' + this.reply.id + : 'note'; + }, + + placeholder(): string { + const x = [ + '%i18n:common.note-placeholders.a%', + '%i18n:common.note-placeholders.b%', + '%i18n:common.note-placeholders.c%', + '%i18n:common.note-placeholders.d%', + '%i18n:common.note-placeholders.e%' + ][Math.floor(Math.random() * 5)]; + + return this.renote + ? '%i18n:@quote-placeholder%' + : this.reply + ? '%i18n:@reply-placeholder%' + : x; + }, + + submitText(): string { + return this.renote + ? '%i18n:@renote%' + : this.reply + ? '%i18n:@reply%' + : '%i18n:@submit%'; + }, + + canPost(): boolean { + return !this.posting && (this.text.length != 0 || this.files.length != 0 || this.poll || this.renote); + } + }, + mounted() { if (this.reply && this.reply.user.host != null) { this.text = `@${this.reply.user.username}@${this.reply.user.host} `; From afc2efee1b70e2999d5069aa6fbd96cd4fc12377 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 01:50:01 +0900 Subject: [PATCH 053/369] :v: --- src/server/api/endpoints/notes.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/server/api/endpoints/notes.ts b/src/server/api/endpoints/notes.ts index 21946d1bd3..e6fe80ac8a 100644 --- a/src/server/api/endpoints/notes.ts +++ b/src/server/api/endpoints/notes.ts @@ -53,7 +53,9 @@ module.exports = (params) => new Promise(async (res, rej) => { const sort = { _id: -1 }; - const query = {} as any; + const query = { + visibility: 'public' + } as any; if (sinceId) { sort._id = 1; query._id = { From 2ddbca464131708961c5436a38cec5af1220c861 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 01:55:32 +0900 Subject: [PATCH 054/369] Fix bug --- src/client/app/auth/views/index.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/client/app/auth/views/index.vue b/src/client/app/auth/views/index.vue index e53bbd026f..8f4f5fd8c5 100644 --- a/src/client/app/auth/views/index.vue +++ b/src/client/app/auth/views/index.vue @@ -51,7 +51,7 @@ export default Vue.extend({ } }, mounted() { - if (!this.$root.$data.$store.getters.isSignedIn) return; + if (!this.$store.getters.isSignedIn) return; // Fetch session (this as any).api('auth/session/show', { @@ -72,6 +72,7 @@ export default Vue.extend({ } }).catch(error => { this.state = 'fetch-session-error'; + this.fetching = false; }); }, methods: { From e5431648fd1136df26388b496cf9ba9b3066c001 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 02:00:45 +0900 Subject: [PATCH 055/369] :v: --- locales/ja.yml | 7 ++++--- src/client/app/desktop/views/components/post-form.vue | 8 +++++--- src/client/app/desktop/views/widgets/post-form.vue | 8 +++++--- src/client/app/mobile/views/components/post-form.vue | 8 +++++--- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/locales/ja.yml b/locales/ja.yml index c02422e81a..677cb13298 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -42,9 +42,10 @@ common: note-placeholders: a: "今どうしてる?" b: "何かありましたか?" - c: "言いたいことは?" - d: "ここに書いてください" - e: "あなたが書くのを待っています..." + c: "何をお考えですか?" + d: "言いたいことは?" + e: "ここに書いてください" + f: "あなたが書くのを待っています..." delete: "削除" loading: "読み込み中" diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index ad829065b0..7b2adfe707 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -86,13 +86,15 @@ export default Vue.extend({ }, placeholder(): string { - const x = [ + const xs = [ '%i18n:common.note-placeholders.a%', '%i18n:common.note-placeholders.b%', '%i18n:common.note-placeholders.c%', '%i18n:common.note-placeholders.d%', - '%i18n:common.note-placeholders.e%' - ][Math.floor(Math.random() * 5)]; + '%i18n:common.note-placeholders.e%', + '%i18n:common.note-placeholders.f%' + ]; + const x = xs[Math.floor(Math.random() * xs.length)]; return this.renote ? '%i18n:@quote-placeholder%' diff --git a/src/client/app/desktop/views/widgets/post-form.vue b/src/client/app/desktop/views/widgets/post-form.vue index fb4adf70b8..3c4ade0e81 100644 --- a/src/client/app/desktop/views/widgets/post-form.vue +++ b/src/client/app/desktop/views/widgets/post-form.vue @@ -24,13 +24,15 @@ export default define({ }, computed: { placeholder(): string { - return [ + const xs = [ '%i18n:common.note-placeholders.a%', '%i18n:common.note-placeholders.b%', '%i18n:common.note-placeholders.c%', '%i18n:common.note-placeholders.d%', - '%i18n:common.note-placeholders.e%' - ][Math.floor(Math.random() * 5)]; + '%i18n:common.note-placeholders.e%', + '%i18n:common.note-placeholders.f%' + ]; + return xs[Math.floor(Math.random() * xs.length)]; } }, methods: { diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index 61f0462659..beacb1721b 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -80,13 +80,15 @@ export default Vue.extend({ }, placeholder(): string { - const x = [ + const xs = [ '%i18n:common.note-placeholders.a%', '%i18n:common.note-placeholders.b%', '%i18n:common.note-placeholders.c%', '%i18n:common.note-placeholders.d%', - '%i18n:common.note-placeholders.e%' - ][Math.floor(Math.random() * 5)]; + '%i18n:common.note-placeholders.e%', + '%i18n:common.note-placeholders.f%' + ]; + const x = xs[Math.floor(Math.random() * xs.length)]; return this.renote ? '%i18n:@quote-placeholder%' From 8c9977c136d98706615469a10e3fa34671736d72 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 02:20:40 +0900 Subject: [PATCH 056/369] :art: --- assets/mi.svg | 24 ++- .../app/desktop/assets/header-icon.dark.svg | 150 ++++++++++++++++++ .../app/desktop/assets/header-icon.light.svg | 150 ++++++++++++++++++ .../app/desktop/assets/header-logo-white.svg | 25 --- src/client/app/desktop/assets/header-logo.svg | 25 --- .../desktop/views/components/ui.header.vue | 4 +- .../app/desktop/views/pages/welcome.vue | 2 +- .../client/assets/title.dark.svg | 0 .../client/assets/title.light.svg | 0 9 files changed, 312 insertions(+), 68 deletions(-) create mode 100644 src/client/app/desktop/assets/header-icon.dark.svg create mode 100644 src/client/app/desktop/assets/header-icon.light.svg delete mode 100644 src/client/app/desktop/assets/header-logo-white.svg delete mode 100644 src/client/app/desktop/assets/header-logo.svg rename assets/title-dark.svg => src/client/assets/title.dark.svg (100%) rename assets/title.svg => src/client/assets/title.light.svg (100%) diff --git a/assets/mi.svg b/assets/mi.svg index d4f7cf7e9e..44e5c74d0c 100644 --- a/assets/mi.svg +++ b/assets/mi.svg @@ -69,7 +69,7 @@ inkscape:cx="232.39583" inkscape:cy="251.50613" inkscape:document-units="px" - inkscape:current-layer="layer1" + inkscape:current-layer="g4502" showgrid="true" units="px" inkscape:snap-bbox="true" @@ -79,7 +79,7 @@ inkscape:snap-center="true" inkscape:snap-page="true" inkscape:window-width="1920" - inkscape:window-height="1017" + inkscape:window-height="1027" inkscape:window-x="-8" inkscape:window-y="1072" inkscape:window-maximized="1" @@ -111,7 +111,7 @@ <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> + <dc:title /> </cc:Work> </rdf:RDF> </metadata> @@ -124,25 +124,19 @@ id="g4502" transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)"> <g - style="fill:#2fa1bb;fill-opacity:0.94117647" + style="fill:#000000;fill-opacity:1" transform="translate(-1.3333333e-6,-1.3439941e-6)" id="g5125"> <g transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)" id="text4489" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#2fa1bb;fill-opacity:0.94117647;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" aria-label="Mi"> <path - sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz" - inkscape:connector-curvature="0" - id="path5210" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#2fa1bb;fill-opacity:0.94117647;stroke-width:0.28950602px" - d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" /> - <path - inkscape:connector-curvature="0" - id="path5212" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#2fa1bb;fill-opacity:0.94117647;stroke-width:0.28950602px" - d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" /> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#000000;fill-opacity:1;stroke-width:1.09609616px" + d="M 62.474609 76.585938 C 54.999059 76.585938 47.878825 77.832365 41.115234 80.324219 C 29.011968 84.595952 19.044417 92.249798 11.212891 103.28516 C 3.7373405 113.96451 0 125.88934 0 139.06055 L 0 372.93945 C 0 390.02642 6.0510264 404.79858 18.154297 417.25781 C 30.613543 429.36108 45.387643 435.41406 62.474609 435.41406 C 79.917556 435.41406 94.689698 429.36108 106.79297 417.25781 C 119.25222 404.79858 125.48242 390.02642 125.48242 372.93945 L 125.48242 330.4082 C 125.61683 321.19698 135.10492 323.61391 139.90039 330.4082 C 148.8815 345.96215 167.92265 359.32062 190.0918 359.24414 C 212.26095 359.16778 230.67374 348.20715 240.28516 330.4082 C 243.92497 326.11557 254.18418 318.80145 255.23633 330.4082 L 255.23633 372.93945 C 255.23633 390.02642 261.28735 404.79858 273.39062 417.25781 C 285.84985 429.36108 300.62397 435.41406 317.71094 435.41406 C 335.15388 435.41406 349.92603 429.36108 362.0293 417.25781 C 374.48853 404.79858 380.71875 390.02642 380.71875 372.93945 L 380.71875 139.06055 C 380.71875 125.88934 376.80415 113.96451 368.97266 103.28516 C 361.49709 92.249798 351.70678 84.595952 339.60352 80.324219 C 332.48396 77.832365 325.3637 76.585938 318.24414 76.585938 C 299.02128 76.585938 282.82549 84.062587 269.6543 99.013672 C 262.53473 107.20121 258.79542 111.11761 258.43945 110.76172 C 258.43945 110.76172 207.67587 172.14495 206.25195 173.21289 C 204.82804 174.2808 200.11102 182.44531 190.0918 182.44531 C 180.07257 182.44531 175.89071 174.2808 174.4668 173.21289 C 173.04288 172.14495 122.2793 110.76172 122.2793 110.76172 C 121.21136 110.40575 117.29484 106.48923 110.53125 99.013672 C 97.716024 84.062587 81.697447 76.585938 62.474609 76.585938 z M 457.53516 76.585938 C 442.58406 76.585937 429.7692 81.926117 419.08984 92.605469 C 408.76646 102.92885 403.60547 115.56648 403.60547 130.51758 C 403.60547 145.46868 408.76646 158.28354 419.08984 168.96289 C 429.7692 179.28627 442.58406 184.44922 457.53516 184.44922 C 472.48625 184.44922 485.30112 179.28627 495.98047 168.96289 C 506.65982 158.28354 512 145.46868 512 130.51758 C 512 115.56648 506.65982 102.92885 495.98047 92.605469 C 485.30112 81.926117 472.48625 76.585938 457.53516 76.585938 z M 458.06836 195.12695 C 443.11726 195.12695 430.3024 200.46713 419.62305 211.14648 C 408.94369 221.82584 403.60547 234.6407 403.60547 249.5918 L 403.60547 381.48242 C 403.60547 396.43352 408.94369 409.24838 419.62305 419.92773 C 430.3024 430.25112 443.11726 435.41406 458.06836 435.41406 C 473.01946 435.41406 485.65709 430.25112 495.98047 419.92773 C 506.65982 409.24838 512 396.43352 512 381.48242 L 512 249.5918 C 512 234.6407 506.65982 221.82584 495.98047 211.14648 C 485.65709 200.46713 473.01946 195.12695 458.06836 195.12695 z " + transform="matrix(0.26412464,0,0,0.26412464,24.988264,136.28626)" + id="path5210" /> </g> </g> </g> diff --git a/src/client/app/desktop/assets/header-icon.dark.svg b/src/client/app/desktop/assets/header-icon.dark.svg new file mode 100644 index 0000000000..fa42856fa5 --- /dev/null +++ b/src/client/app/desktop/assets/header-icon.dark.svg @@ -0,0 +1,150 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="512" + height="512" + viewBox="0 0 135.46667 135.46667" + version="1.1" + id="svg8" + inkscape:version="0.92.1 r15371" + sodipodi:docname="header-icon.dark.svg" + inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\32.png" + inkscape:export-xdpi="6" + inkscape:export-ydpi="6"> + <defs + id="defs2"> + <inkscape:path-effect + effect="simplify" + id="path-effect5115" + is_visible="true" + steps="1" + threshold="0.000408163" + smooth_angles="360" + helper_size="0" + simplify_individual_paths="false" + simplify_just_coalesce="false" + simplifyindividualpaths="false" + simplifyJustCoalesce="false" /> + <inkscape:path-effect + effect="simplify" + id="path-effect5111" + is_visible="true" + steps="1" + threshold="0.000408163" + smooth_angles="360" + helper_size="0" + simplify_individual_paths="false" + simplify_just_coalesce="false" + simplifyindividualpaths="false" + simplifyJustCoalesce="false" /> + <inkscape:path-effect + effect="simplify" + id="path-effect5104" + is_visible="true" + steps="1" + threshold="0.000408163" + smooth_angles="360" + helper_size="0" + simplify_individual_paths="false" + simplify_just_coalesce="false" + simplifyindividualpaths="false" + simplifyJustCoalesce="false" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.4142136" + inkscape:cx="114.309" + inkscape:cy="251.50613" + inkscape:document-units="px" + inkscape:current-layer="g4502" + showgrid="true" + units="px" + inkscape:snap-bbox="true" + inkscape:bbox-nodes="true" + inkscape:snap-bbox-edge-midpoints="false" + inkscape:snap-smooth-nodes="true" + inkscape:snap-center="true" + inkscape:snap-page="true" + inkscape:window-width="1920" + inkscape:window-height="1027" + inkscape:window-x="-8" + inkscape:window-y="1072" + inkscape:window-maximized="1" + inkscape:snap-object-midpoints="true" + inkscape:snap-midpoints="true" + inkscape:object-paths="true" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + objecttolerance="1" + guidetolerance="1" + inkscape:snap-nodes="false" + inkscape:snap-others="false"> + <inkscape:grid + type="xygrid" + id="grid4504" + spacingx="4.2333334" + spacingy="4.2333334" + empcolor="#ff3fff" + empopacity="0.25098039" + empspacing="4" /> + </sodipodi:namedview> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="レイヤー 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-30.809093,-111.78601)"> + <g + id="g4502" + transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)"> + <g + style="fill:#ffffff;fill-opacity:1" + transform="translate(-1.3333333e-6,-1.3439941e-6)" + id="g5125"> + <g + transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)" + id="text4489" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + aria-label="Mi"> + <path + sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz" + inkscape:connector-curvature="0" + id="path5210" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#ffffff;fill-opacity:1;stroke-width:0.28950602px" + d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" /> + <path + inkscape:connector-curvature="0" + id="path5212" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#ffffff;fill-opacity:1;stroke-width:0.28950602px" + d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" /> + </g> + </g> + </g> + </g> +</svg> diff --git a/src/client/app/desktop/assets/header-icon.light.svg b/src/client/app/desktop/assets/header-icon.light.svg new file mode 100644 index 0000000000..61e2026243 --- /dev/null +++ b/src/client/app/desktop/assets/header-icon.light.svg @@ -0,0 +1,150 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="512" + height="512" + viewBox="0 0 135.46667 135.46667" + version="1.1" + id="svg8" + inkscape:version="0.92.1 r15371" + sodipodi:docname="header-icon.light.svg" + inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\32.png" + inkscape:export-xdpi="6" + inkscape:export-ydpi="6"> + <defs + id="defs2"> + <inkscape:path-effect + effect="simplify" + id="path-effect5115" + is_visible="true" + steps="1" + threshold="0.000408163" + smooth_angles="360" + helper_size="0" + simplify_individual_paths="false" + simplify_just_coalesce="false" + simplifyindividualpaths="false" + simplifyJustCoalesce="false" /> + <inkscape:path-effect + effect="simplify" + id="path-effect5111" + is_visible="true" + steps="1" + threshold="0.000408163" + smooth_angles="360" + helper_size="0" + simplify_individual_paths="false" + simplify_just_coalesce="false" + simplifyindividualpaths="false" + simplifyJustCoalesce="false" /> + <inkscape:path-effect + effect="simplify" + id="path-effect5104" + is_visible="true" + steps="1" + threshold="0.000408163" + smooth_angles="360" + helper_size="0" + simplify_individual_paths="false" + simplify_just_coalesce="false" + simplifyindividualpaths="false" + simplifyJustCoalesce="false" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.4142136" + inkscape:cx="114.309" + inkscape:cy="251.50613" + inkscape:document-units="px" + inkscape:current-layer="g4502" + showgrid="true" + units="px" + inkscape:snap-bbox="true" + inkscape:bbox-nodes="true" + inkscape:snap-bbox-edge-midpoints="false" + inkscape:snap-smooth-nodes="true" + inkscape:snap-center="true" + inkscape:snap-page="true" + inkscape:window-width="1920" + inkscape:window-height="1027" + inkscape:window-x="-8" + inkscape:window-y="1072" + inkscape:window-maximized="1" + inkscape:snap-object-midpoints="true" + inkscape:snap-midpoints="true" + inkscape:object-paths="true" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + objecttolerance="1" + guidetolerance="1" + inkscape:snap-nodes="false" + inkscape:snap-others="false"> + <inkscape:grid + type="xygrid" + id="grid4504" + spacingx="4.2333334" + spacingy="4.2333334" + empcolor="#ff3fff" + empopacity="0.25098039" + empspacing="4" /> + </sodipodi:namedview> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="レイヤー 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-30.809093,-111.78601)"> + <g + id="g4502" + transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)"> + <g + style="fill:#000000;fill-opacity:1" + transform="translate(-1.3333333e-6,-1.3439941e-6)" + id="g5125"> + <g + transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)" + id="text4489" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + aria-label="Mi"> + <path + sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz" + inkscape:connector-curvature="0" + id="path5210" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#000000;fill-opacity:1;stroke-width:0.28950602px" + d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" /> + <path + inkscape:connector-curvature="0" + id="path5212" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#000000;fill-opacity:1;stroke-width:0.28950602px" + d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" /> + </g> + </g> + </g> + </g> +</svg> diff --git a/src/client/app/desktop/assets/header-logo-white.svg b/src/client/app/desktop/assets/header-logo-white.svg deleted file mode 100644 index 8082edb30d..0000000000 --- a/src/client/app/desktop/assets/header-logo-white.svg +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg version="1.1" id="レイヤー_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" - y="0px" width="256px" height="256px" viewBox="0 0 256 256" enable-background="new 0 0 256 256" xml:space="preserve"> -<circle fill="#FFFFFF" cx="128" cy="153.6" r="19.201"/> -<circle fill="#FFFFFF" cx="51.2" cy="153.6" r="19.2"/> -<circle fill="#FFFFFF" cx="204.8" cy="153.6" r="19.2"/> -<polyline fill="none" stroke="#FFFFFF" stroke-width="16" stroke-linejoin="round" stroke-miterlimit="10" points="51.2,153.6 - 89.601,102.4 128,153.6 166.4,102.4 204.799,153.6 "/> -<circle fill="#FFFFFF" cx="89.6" cy="102.4" r="19.2"/> -<circle fill="#FFFFFF" cx="166.4" cy="102.4" r="19.199"/> -<g> -</g> -<g> -</g> -<g> -</g> -<g> -</g> -<g> -</g> -<g> -</g> -</svg> diff --git a/src/client/app/desktop/assets/header-logo.svg b/src/client/app/desktop/assets/header-logo.svg deleted file mode 100644 index 3a2207954a..0000000000 --- a/src/client/app/desktop/assets/header-logo.svg +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg version="1.1" id="レイヤー_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" - y="0px" width="256px" height="256px" viewBox="0 0 256 256" enable-background="new 0 0 256 256" xml:space="preserve"> -<circle cx="128" cy="153.6" r="19.201"/> -<circle cx="51.2" cy="153.6" r="19.2"/> -<circle cx="204.8" cy="153.6" r="19.2"/> -<polyline fill="none" stroke="#000000" stroke-width="16" stroke-linejoin="round" stroke-miterlimit="10" points="51.2,153.6 - 89.601,102.4 128,153.6 166.4,102.4 204.799,153.6 "/> -<circle cx="89.6" cy="102.4" r="19.2"/> -<circle cx="166.4" cy="102.4" r="19.199"/> -<g> -</g> -<g> -</g> -<g> -</g> -<g> -</g> -<g> -</g> -<g> -</g> -</svg> diff --git a/src/client/app/desktop/views/components/ui.header.vue b/src/client/app/desktop/views/components/ui.header.vue index 34464bf4b2..7045790054 100644 --- a/src/client/app/desktop/views/components/ui.header.vue +++ b/src/client/app/desktop/views/components/ui.header.vue @@ -150,8 +150,8 @@ root(isDark) display block width 100% height 48px - background-image url(/assets/desktop/header-logo.svg) - background-size 46px + background-image isDark ? url('/assets/desktop/header-icon.dark.svg') : url('/assets/desktop/header-icon.light.svg') + background-size 24px background-position center background-repeat no-repeat opacity 0.3 diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 03a60dd487..1bb791b68c 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -12,7 +12,7 @@ </article> </main> <main v-else class="index"> - <img :src="$store.state.device.darkmode ? 'assets/title-dark.svg' : 'assets/title.svg'" alt="Misskey"> + <img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="Misskey"> <p class="desc"><b>%i18n:common.misskey%</b> - <span @click="about = true">%i18n:@about%</span></p> <p class="account"> <button class="signup" @click="signup">%i18n:@signup-button%</button> diff --git a/assets/title-dark.svg b/src/client/assets/title.dark.svg similarity index 100% rename from assets/title-dark.svg rename to src/client/assets/title.dark.svg diff --git a/assets/title.svg b/src/client/assets/title.light.svg similarity index 100% rename from assets/title.svg rename to src/client/assets/title.light.svg From 9f1385b03a64594a2609af1013637ac003f4ae33 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 02:26:13 +0900 Subject: [PATCH 057/369] 2.22.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 3b3da1810a..37caf8b01c 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.21.1", - "clientVersion": "1.0.5903", + "version": "2.22.0", + "clientVersion": "1.0.5939", "codename": "nighthike", "main": "./built/index.js", "private": true, From 9d27fa7eaa8ce80233f333b24e093fc39ffb1d2a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 02:31:32 +0900 Subject: [PATCH 058/369] Fix bug --- .../views/components/ui.header.nav.vue | 27 +++++-------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/src/client/app/desktop/views/components/ui.header.nav.vue b/src/client/app/desktop/views/components/ui.header.nav.vue index 201b04b039..4780c57cb4 100644 --- a/src/client/app/desktop/views/components/ui.header.nav.vue +++ b/src/client/app/desktop/views/components/ui.header.nav.vue @@ -12,7 +12,7 @@ <a @click="messaging"> %fa:comments% <p>%i18n:@messaging%</p> - <template v-if="hasUnreadMessagingMessages">%fa:circle%</template> + <template v-if="hasUnreadMessagingMessage">%fa:circle%</template> </a> </li> <li class="game"> @@ -35,48 +35,33 @@ import MkGameWindow from './game-window.vue'; export default Vue.extend({ data() { return { - hasUnreadMessagingMessages: false, hasGameInvitations: false, connection: null, connectionId: null }; }, + computed: { + hasUnreadMessagingMessage(): boolean { + return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadMessagingMessage; + } + }, mounted() { if (this.$store.getters.isSignedIn) { this.connection = (this as any).os.stream.getConnection(); this.connectionId = (this as any).os.stream.use(); - this.connection.on('read_all_messaging_messages', this.onReadAllMessagingMessages); - this.connection.on('unread_messaging_message', this.onUnreadMessagingMessage); this.connection.on('othello_invited', this.onOthelloInvited); this.connection.on('othello_no_invites', this.onOthelloNoInvites); - - // Fetch count of unread messaging messages - (this as any).api('messaging/unread').then(res => { - if (res.count > 0) { - this.hasUnreadMessagingMessages = true; - } - }); } }, beforeDestroy() { if (this.$store.getters.isSignedIn) { - this.connection.off('read_all_messaging_messages', this.onReadAllMessagingMessages); - this.connection.off('unread_messaging_message', this.onUnreadMessagingMessage); this.connection.off('othello_invited', this.onOthelloInvited); this.connection.off('othello_no_invites', this.onOthelloNoInvites); (this as any).os.stream.dispose(this.connectionId); } }, methods: { - onUnreadMessagingMessage() { - this.hasUnreadMessagingMessages = true; - }, - - onReadAllMessagingMessages() { - this.hasUnreadMessagingMessages = false; - }, - onOthelloInvited() { this.hasGameInvitations = true; }, From 12b13e974c377d02bb8d41840fd43faba04074f1 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 02:36:57 +0900 Subject: [PATCH 059/369] :art: --- src/client/app/desktop/style.styl | 53 ++++++++++--------------------- 1 file changed, 16 insertions(+), 37 deletions(-) diff --git a/src/client/app/desktop/style.styl b/src/client/app/desktop/style.styl index ea48fbee3d..f2a60955fd 100644 --- a/src/client/app/desktop/style.styl +++ b/src/client/app/desktop/style.styl @@ -6,44 +6,27 @@ *::input-placeholder color #D8CBC5 -* - &:focus - outline none - - &::scrollbar - width 5px - background transparent - - &:horizontal - height 5px - - &::scrollbar-button - width 0 - height 0 - background rgba(0, 0, 0, 0.2) - - &::scrollbar-piece - background transparent - - &:start - background transparent - - &::scrollbar-thumb - background rgba(0, 0, 0, 0.2) - - &:hover - background rgba(0, 0, 0, 0.4) - - &:active - background $theme-color - - &::scrollbar-corner - background rgba(0, 0, 0, 0.2) +*:focus + outline none html height 100% background #f7f7f7 + &, * + &::-webkit-scrollbar + width 6px + height 6px + + &::-webkit-scrollbar-thumb + background rgba(0, 0, 0, 0.2) + + &:hover + background rgba(0, 0, 0, 0.4) + + &:active + background $theme-color + &[data-darkmode] background #191B22 @@ -51,10 +34,6 @@ html &::-webkit-scrollbar-track background-color #282C37 - &::-webkit-scrollbar - width 6px - height 6px - &::-webkit-scrollbar-thumb background-color #454954 From 281971f4a496429eedcc45997bcae61500dcef14 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 02:37:31 +0900 Subject: [PATCH 060/369] 2.22.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 37caf8b01c..0a8f61646c 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.22.0", - "clientVersion": "1.0.5939", + "version": "2.22.1", + "clientVersion": "1.0.5942", "codename": "nighthike", "main": "./built/index.js", "private": true, From a0a4ce4dd9d649839da7862e206f47d1c27de2c2 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 11:25:28 +0900 Subject: [PATCH 061/369] Fix bug --- src/server/api/endpoints/notes/replies.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/api/endpoints/notes/replies.ts b/src/server/api/endpoints/notes/replies.ts index f407f3bd56..608027f6b1 100644 --- a/src/server/api/endpoints/notes/replies.ts +++ b/src/server/api/endpoints/notes/replies.ts @@ -26,7 +26,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => { return rej('note not found'); } - const ids = note._replyIds.slice(offset, offset + limit); + const ids = (note._replyIds || []).slice(offset, offset + limit); // Serialize res(await Promise.all(ids.map(id => pack(id, user)))); From f557407589abe8049b931f7b7e6db26d441ae796 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 11:29:02 +0900 Subject: [PATCH 062/369] Fix bug --- src/client/app/mobile/views/components/note-detail.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index 8ab766e1dc..d4606c0313 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -172,7 +172,7 @@ export default Vue.extend({ }, methods: { - fetchContext() { + fetchConversation() { this.conversationFetching = true; // Fetch conversation From 3c2d72f6119a73f83057834ef6ff1ed69ac57c6b Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 11:32:55 +0900 Subject: [PATCH 063/369] Fix bug --- src/client/app/mobile/views/components/ui.nav.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue index de8c21e795..033372ffef 100644 --- a/src/client/app/mobile/views/components/ui.nav.vue +++ b/src/client/app/mobile/views/components/ui.nav.vue @@ -17,8 +17,8 @@ <ul> <li><router-link to="/" :data-active="$route.name == 'index'">%fa:home%%i18n:@home%%fa:angle-right%</router-link></li> <li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotification">%fa:circle%</template>%fa:angle-right%</router-link></li> - <li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessages">%fa:circle%</template>%fa:angle-right%</router-link></li> - <li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%ゲーム<template v-if="hasGameInvitations">%fa:circle%</template>%fa:angle-right%</router-link></li> + <li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessage">%fa:circle%</template>%fa:angle-right%</router-link></li> + <li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%ゲーム<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li> </ul> <ul> <li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:quidditch%%i18n:@widgets%%fa:angle-right%</router-link></li> From c351ba782081fe541dd7368e6e265d883115ecdf Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 11:36:45 +0900 Subject: [PATCH 064/369] Fix --- locales/ja.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/ja.yml b/locales/ja.yml index 677cb13298..d727b01185 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -823,7 +823,7 @@ mobile/views/components/post-form.vue: submit: "投稿" reply: "返信" renote: "Renote" - renote-placeholder: "この投稿を引用... (オプション)" + quote-placeholder: "この投稿を引用... (オプション)" reply-placeholder: "この投稿への返信..." cw-placeholder: "内容への注釈 (オプション)" location-alert: "お使いの端末は位置情報に対応していません" From 4c54d68fad8a821da39d6c33ba0b749382df3dca Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 11:38:24 +0900 Subject: [PATCH 065/369] Darken --- .../desktop/views/components/ui-notification.vue | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/client/app/desktop/views/components/ui-notification.vue b/src/client/app/desktop/views/components/ui-notification.vue index 9983f02c5e..68413914c0 100644 --- a/src/client/app/desktop/views/components/ui-notification.vue +++ b/src/client/app/desktop/views/components/ui-notification.vue @@ -36,7 +36,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -.mk-ui-notification +root(isDark) display block position fixed z-index 10000 @@ -46,10 +46,10 @@ export default Vue.extend({ margin 0 auto padding 128px 0 0 0 width 500px - color rgba(#000, 0.6) - background rgba(#fff, 0.9) + color rgba(isDark ? #fff : #000, 0.6) + background rgba(isDark ? #282C37 : #fff, 0.9) border-radius 0 0 8px 8px - box-shadow 0 2px 4px rgba(#000, 0.2) + box-shadow 0 2px 4px rgba(#000, isDark ? 0.4 : 0.2) transform translateY(-64px) opacity 0 @@ -58,4 +58,10 @@ export default Vue.extend({ line-height 64px text-align center +.mk-ui-notification[data-darkmode] + root(true) + +.mk-ui-notification:not([data-darkmode]) + root(false) + </style> From 11409b723e8aca66d3b32a08a3c295427ee735ab Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 11:45:01 +0900 Subject: [PATCH 066/369] :art: --- .../common/views/components/media-list.vue | 85 +++++++++++-------- 1 file changed, 48 insertions(+), 37 deletions(-) diff --git a/src/client/app/common/views/components/media-list.vue b/src/client/app/common/views/components/media-list.vue index ff9d5e1022..384f6cd27c 100644 --- a/src/client/app/common/views/components/media-list.vue +++ b/src/client/app/common/views/components/media-list.vue @@ -1,9 +1,11 @@ <template> -<div class="mk-media-list" :data-count="mediaList.length"> - <template v-for="media in mediaList"> - <mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')" :inline-playable="mediaList.length === 1"/> - <mk-media-image :image="media" :key="media.id" v-else :raw="raw"/> - </template> +<div class="mk-media-list"> + <div :data-count="mediaList.length"> + <template v-for="media in mediaList"> + <mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')" :inline-playable="mediaList.length === 1"/> + <mk-media-image :image="media" :key="media.id" v-else :raw="raw"/> + </template> + </div> </div> </template> @@ -24,41 +26,50 @@ export default Vue.extend({ <style lang="stylus" scoped> .mk-media-list - display grid - grid-gap 4px - height 256px + width 100% - @media (max-width 500px) - height 192px + &:before + content '' + display block + padding-top 56.25% // 16:9 + + > div + position absolute + top 0 + left 0 + right 0 + bottom 0 + display grid + grid-gap 4px + + &[data-count="1"] + grid-template-rows 1fr + &[data-count="2"] + grid-template-columns 1fr 1fr + grid-template-rows 1fr + &[data-count="3"] + grid-template-columns 1fr 0.5fr + grid-template-rows 1fr 1fr + :nth-child(1) + grid-row 1 / 3 + :nth-child(3) + grid-column 2 / 3 + grid-row 2/3 + &[data-count="4"] + grid-template-columns 1fr 1fr + grid-template-rows 1fr 1fr - &[data-count="1"] - grid-template-rows 1fr - &[data-count="2"] - grid-template-columns 1fr 1fr - grid-template-rows 1fr - &[data-count="3"] - grid-template-columns 1fr 0.5fr - grid-template-rows 1fr 1fr :nth-child(1) - grid-row 1 / 3 - :nth-child(3) + grid-column 1 / 2 + grid-row 1 / 2 + :nth-child(2) grid-column 2 / 3 - grid-row 2/3 - &[data-count="4"] - grid-template-columns 1fr 1fr - grid-template-rows 1fr 1fr - - :nth-child(1) - grid-column 1 / 2 - grid-row 1 / 2 - :nth-child(2) - grid-column 2 / 3 - grid-row 1 / 2 - :nth-child(3) - grid-column 1 / 2 - grid-row 2 / 3 - :nth-child(4) - grid-column 2 / 3 - grid-row 2 / 3 + grid-row 1 / 2 + :nth-child(3) + grid-column 1 / 2 + grid-row 2 / 3 + :nth-child(4) + grid-column 2 / 3 + grid-row 2 / 3 </style> From 72f2b92d4f3eacab36c099e82ac8a1b06160038f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 11:53:28 +0900 Subject: [PATCH 067/369] :v: --- src/client/app/common/views/components/media-list.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/common/views/components/media-list.vue b/src/client/app/common/views/components/media-list.vue index 384f6cd27c..6df2aa3226 100644 --- a/src/client/app/common/views/components/media-list.vue +++ b/src/client/app/common/views/components/media-list.vue @@ -37,8 +37,8 @@ export default Vue.extend({ position absolute top 0 left 0 - right 0 bottom 0 + right 0 display grid grid-gap 4px From b375bbc75cb8398ad79d1275c7b1d4d9b29a9d1c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 11:53:59 +0900 Subject: [PATCH 068/369] 2.22.2 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0a8f61646c..0dac414b2e 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.22.1", - "clientVersion": "1.0.5942", + "version": "2.22.2", + "clientVersion": "1.0.5963", "codename": "nighthike", "main": "./built/index.js", "private": true, From fb28b238cfa780b1c82ad23295b09898f24c1374 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 13:21:38 +0900 Subject: [PATCH 069/369] Add workaround for Safari bug --- .../app/common/views/components/media-list.vue | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/client/app/common/views/components/media-list.vue b/src/client/app/common/views/components/media-list.vue index 6df2aa3226..c6cb667165 100644 --- a/src/client/app/common/views/components/media-list.vue +++ b/src/client/app/common/views/components/media-list.vue @@ -1,6 +1,6 @@ <template> <div class="mk-media-list"> - <div :data-count="mediaList.length"> + <div :data-count="mediaList.length" ref="grid"> <template v-for="media in mediaList"> <mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')" :inline-playable="mediaList.length === 1"/> <mk-media-image :image="media" :key="media.id" v-else :raw="raw"/> @@ -20,6 +20,10 @@ export default Vue.extend({ raw: { default: false } + }, + mounted() { + // for Safari bug + this.$refs.grid.style.height = `${this.$refs.grid.clientHeight}px`; } }); </script> @@ -36,9 +40,9 @@ export default Vue.extend({ > div position absolute top 0 - left 0 - bottom 0 right 0 + bottom 0 + left 0 display grid grid-gap 4px @@ -54,7 +58,7 @@ export default Vue.extend({ grid-row 1 / 3 :nth-child(3) grid-column 2 / 3 - grid-row 2/3 + grid-row 2 / 3 &[data-count="4"] grid-template-columns 1fr 1fr grid-template-rows 1fr 1fr From 0e7c0fd52880e995cd2b67b29ec8ab3b7a973169 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 13:22:29 +0900 Subject: [PATCH 070/369] 2.22.3 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0dac414b2e..58f2cebfaf 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.22.2", - "clientVersion": "1.0.5963", + "version": "2.22.3", + "clientVersion": "1.0.5965", "codename": "nighthike", "main": "./built/index.js", "private": true, From 366b7ef9460fd01051d61bb2d93af440c620bf01 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 14:22:15 +0900 Subject: [PATCH 071/369] :art: --- src/client/app/desktop/views/components/note-detail.vue | 2 -- src/client/app/desktop/views/pages/favorites.vue | 5 ++++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index 63b2150110..a8accaf531 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -218,8 +218,6 @@ export default Vue.extend({ @import '~const.styl' root(isDark) - margin 0 auto - padding 0 overflow hidden text-align left background isDark ? #282C37 : #fff diff --git a/src/client/app/desktop/views/pages/favorites.vue b/src/client/app/desktop/views/pages/favorites.vue index 71d36cdf2b..8adb9412f2 100644 --- a/src/client/app/desktop/views/pages/favorites.vue +++ b/src/client/app/desktop/views/pages/favorites.vue @@ -2,7 +2,7 @@ <mk-ui> <main v-if="!fetching"> <template v-for="favorite in favorites"> - <mk-note-detail :note="favorite.note" :key="favorite.note.id"/> + <mk-note-detail class="post" :note="favorite.note" :key="favorite.note.id"/> </template> <a v-if="existMore" @click="more">%i18n:@more%</a> </main> @@ -70,4 +70,7 @@ main margin 0 auto padding 16px max-width 700px + + > .post + margin-bottom 16px </style> From da52f980c4e3cca48d0da47903cc8b6b5e12949e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 14:42:29 +0900 Subject: [PATCH 072/369] :v: --- locales/ja.yml | 8 ++ src/client/app/mobile/script.ts | 2 + .../mobile/views/components/note-detail.vue | 2 - .../app/mobile/views/components/ui.nav.vue | 7 +- .../app/mobile/views/pages/favorites.vue | 94 +++++++++++++++++++ 5 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 src/client/app/mobile/views/pages/favorites.vue diff --git a/locales/ja.yml b/locales/ja.yml index d727b01185..366a030c99 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -846,6 +846,10 @@ mobile/views/components/ui.nav.vue: messaging: "メッセージ" search: "検索" drive: "ドライブ" + favorites: "お気に入り" + widgets: "ウィジェット" + game: "ゲーム" + darkmode: "ダークモード" settings: "設定" about: "Misskeyについて" @@ -859,8 +863,12 @@ mobile/views/components/users-list.vue: known: "知り合い" load-more: "もっと" +mobile/views/pages/favorites.vue: + title: "お気に入り" + mobile/views/pages/drive.vue: drive: "ドライブ" + more: "もっと見る" mobile/views/pages/followers.vue: followers-of: "{}のフォロワー" diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts index 5418aac090..4c3d8fc3bd 100644 --- a/src/client/app/mobile/script.ts +++ b/src/client/app/mobile/script.ts @@ -36,6 +36,7 @@ import MkNote from './views/pages/note.vue'; import MkSearch from './views/pages/search.vue'; import MkFollowers from './views/pages/followers.vue'; import MkFollowing from './views/pages/following.vue'; +import MkFavorites from './views/pages/favorites.vue'; import MkSettings from './views/pages/settings.vue'; import MkOthello from './views/pages/othello.vue'; @@ -72,6 +73,7 @@ init((launch) => { { path: '/signup', name: 'signup', component: MkSignup }, { path: '/i/settings', name: 'settings', component: MkSettings }, { path: '/i/notifications', name: 'notifications', component: MkNotifications }, + { path: '/i/favorites', name: 'favorites', component: MkFavorites }, { path: '/i/widgets', name: 'widgets', component: MkWidgets }, { path: '/i/messaging', name: 'messaging', component: MkMessaging }, { path: '/i/messaging/:user', component: MkMessagingRoom }, diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index d4606c0313..211ca27f1c 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -216,8 +216,6 @@ export default Vue.extend({ root(isDark) overflow hidden - margin 0 auto - padding 0 width 100% text-align left background isDark ? #282C37 : #fff diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue index 033372ffef..dd1b9c8e25 100644 --- a/src/client/app/mobile/views/components/ui.nav.vue +++ b/src/client/app/mobile/views/components/ui.nav.vue @@ -18,18 +18,17 @@ <li><router-link to="/" :data-active="$route.name == 'index'">%fa:home%%i18n:@home%%fa:angle-right%</router-link></li> <li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotification">%fa:circle%</template>%fa:angle-right%</router-link></li> <li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessage">%fa:circle%</template>%fa:angle-right%</router-link></li> - <li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%ゲーム<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li> + <li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%%i18n:@game%<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li> </ul> <ul> <li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:quidditch%%i18n:@widgets%%fa:angle-right%</router-link></li> + <li><router-link to="/i/favorites" :data-active="$route.name == 'favorites'">%fa:star%%i18n:@favorites%%fa:angle-right%</router-link></li> <li><router-link to="/i/drive" :data-active="$route.name == 'drive'">%fa:cloud%%i18n:@drive%%fa:angle-right%</router-link></li> </ul> <ul> <li><a @click="search">%fa:search%%i18n:@search%%fa:angle-right%</a></li> - </ul> - <ul> <li><router-link to="/i/settings" :data-active="$route.name == 'settings'">%fa:cog%%i18n:@settings%%fa:angle-right%</router-link></li> - <li @click="dark"><p><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template><span>ダークモード</span></p></li> + <li @click="dark"><p><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template><span>%i18n:@darkmode%</span></p></li> </ul> </div> <a :href="aboutUrl"><p class="about">%i18n:@about%</p></a> diff --git a/src/client/app/mobile/views/pages/favorites.vue b/src/client/app/mobile/views/pages/favorites.vue new file mode 100644 index 0000000000..c4edd9d970 --- /dev/null +++ b/src/client/app/mobile/views/pages/favorites.vue @@ -0,0 +1,94 @@ +<template> +<mk-ui> + <span slot="header">%fa:star%%i18n:@title%</span> + + <main> + <template v-for="favorite in favorites"> + <mk-note-detail class="post" :note="favorite.note" :key="favorite.note.id"/> + </template> + <a v-if="existMore" @click="more">%i18n:@more%</a> + </main> +</mk-ui> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import Progress from '../../../common/scripts/loading'; + +export default Vue.extend({ + data() { + return { + fetching: true, + favorites: [], + existMore: false, + moreFetching: false + }; + }, + created() { + this.fetch(); + }, + mounted() { + document.title = 'Misskey | %i18n:@notifications%'; + }, + methods: { + fetch() { + Progress.start(); + this.fetching = true; + + (this as any).api('i/favorites', { + limit: 11 + }).then(favorites => { + if (favorites.length == 11) { + this.existMore = true; + favorites.pop(); + } + + this.favorites = favorites; + this.fetching = false; + + Progress.done(); + }); + }, + more() { + this.moreFetching = true; + (this as any).api('i/favorites', { + limit: 11, + maxId: this.favorites[this.favorites.length - 1].id + }).then(favorites => { + if (favorites.length == 11) { + this.existMore = true; + favorites.pop(); + } else { + this.existMore = false; + } + + this.favorites = this.favorites.concat(favorites); + this.moreFetching = false; + }); + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +main + width 100% + max-width 680px + margin 0 auto + padding 8px + + > .post + margin-bottom 8px + + @media (min-width 500px) + padding 16px + + > .post + margin-bottom 16px + + @media (min-width 600px) + padding 32px + +</style> From 4ecc8c799d7d2765c2593ab6d3f08b93ad3d0b14 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 15:21:03 +0900 Subject: [PATCH 073/369] :art: --- .../desktop/views/components/note-preview.vue | 40 ++++++++---- .../views/components/notes.note.sub.vue | 12 ++-- .../desktop/views/components/notes.note.vue | 12 ++-- .../mobile/views/components/note-preview.vue | 64 +++++++++++++------ .../app/mobile/views/components/note.sub.vue | 36 ++++++----- .../app/mobile/views/components/note.vue | 30 ++++----- 6 files changed, 112 insertions(+), 82 deletions(-) diff --git a/src/client/app/desktop/views/components/note-preview.vue b/src/client/app/desktop/views/components/note-preview.vue index 26c8a7d25c..1d9ee2cd0a 100644 --- a/src/client/app/desktop/views/components/note-preview.vue +++ b/src/client/app/desktop/views/components/note-preview.vue @@ -5,9 +5,18 @@ <header> <router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link> <span class="username"><mk-acct :user="note.user"/></span> - <router-link class="time" :to="note | notePage"> - <mk-time :time="note.createdAt"/> - </router-link> + <div class="info"> + <span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span> + <router-link class="created-at" :to="note | notePage"> + <mk-time :time="note.createdAt"/> + </router-link> + <span class="visibility" v-if="note.visibility != 'public'"> + <template v-if="note.visibility == 'home'">%fa:home%</template> + <template v-if="note.visibility == 'followers'">%fa:unlock%</template> + <template v-if="note.visibility == 'specified'">%fa:envelope%</template> + <template v-if="note.visibility == 'private'">%fa:lock%</template> + </span> + </div> </header> <div class="body"> <mk-sub-note-content class="text" :note="note"/> @@ -32,24 +41,20 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) + display flex font-size 0.9em - &:after - content "" - display block - clear both - > .avatar + flex-shrink 0 display block - float left margin 0 12px 0 0 width 48px height 48px border-radius 8px > .main - float left - width calc(100% - 60px) + flex 1 + min-width 0 > header display flex @@ -75,9 +80,18 @@ root(isDark) text-overflow ellipsis color isDark ? #606984 : #d1d8da - > .time + > .info margin-left auto - color isDark ? #606984 : #b2b8bb + font-size 0.9em + + > * + color isDark ? #606984 : #b2b8bb + + > .mobile + margin-right 6px + + > .visibility + margin-left 6px > .body diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue index ca8aaeede0..4938b7984e 100644 --- a/src/client/app/desktop/views/components/notes.note.sub.vue +++ b/src/client/app/desktop/views/components/notes.note.sub.vue @@ -44,27 +44,23 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) + display flex margin 0 padding 16px 32px font-size 0.9em background isDark ? #21242d : #fcfcfc - &:after - content "" - display block - clear both - > .avatar + flex-shrink 0 display block - float left margin 0 12px 0 0 width 48px height 48px border-radius 8px > .main - float left - width calc(100% - 60px) + flex 1 + min-width 0 > header display flex diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 271332ba0b..5f4b0532a8 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -387,20 +387,16 @@ root(isDark) padding-top 8px > article + display flex padding 28px 32px 18px 32px - &:after - content "" - display block - clear both - &:hover > .main > footer > button color isDark ? #707b97 : #888 > .avatar + flex-shrink 0 display block - float left margin 0 16px 10px 0 width 58px height 58px @@ -410,8 +406,8 @@ root(isDark) //top 74px > .main - float left - width calc(100% - 74px) + flex 1 + min-width 0 > header display flex diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue index c3e57d3381..77ca99e978 100644 --- a/src/client/app/mobile/views/components/note-preview.vue +++ b/src/client/app/mobile/views/components/note-preview.vue @@ -9,9 +9,18 @@ <span class="is-bot" v-if="note.user.isBot">%i18n:@bot%</span> <span class="is-cat" v-if="note.user.isCat">%i18n:@cat%</span> <span class="username"><mk-acct :user="note.user"/></span> - <router-link class="time" :to="note | notePage"> - <mk-time :time="note.createdAt"/> - </router-link> + <div class="info"> + <span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span> + <router-link class="created-at" :to="note | notePage"> + <mk-time :time="note.createdAt"/> + </router-link> + <span class="visibility" v-if="note.visibility != 'public'"> + <template v-if="note.visibility == 'home'">%fa:home%</template> + <template v-if="note.visibility == 'followers'">%fa:unlock%</template> + <template v-if="note.visibility == 'specified'">%fa:envelope%</template> + <template v-if="note.visibility == 'private'">%fa:lock%</template> + </span> + </div> </header> <div class="body"> <mk-sub-note-content class="text" :note="note"/> @@ -30,14 +39,16 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) + display flex margin 0 padding 0 - font-size 0.9em + font-size 10px - &:after - content "" - display block - clear both + @media (min-width 350px) + font-size 12px + + @media (min-width 500px) + font-size 14px &.smart > .main @@ -47,24 +58,26 @@ root(isDark) align-items center > .avatar + flex-shrink 0 display block - float left - margin 0 12px 0 0 - width 48px - height 48px + margin 0 10px 0 0 + width 40px + height 40px border-radius 8px - @media (max-width 500px) + @media (min-width 350px) margin 0 10px 0 0 width 44px height 44px - > .main - float left - width calc(100% - 60px) + @media (min-width 500px) + margin 0 12px 0 0 + width 48px + height 48px - @media (max-width 500px) - width calc(100% - 54px) + > .main + flex 1 + min-width 0 > header display flex @@ -97,7 +110,7 @@ root(isDark) align-self center margin 0 0.5em 0 0 padding 1px 6px - font-size 10px + font-size 0.8em color isDark ? #758188 : #aaa border solid 1px isDark ? #57616f : #ddd border-radius 3px @@ -112,9 +125,18 @@ root(isDark) text-overflow ellipsis color isDark ? #606984 : #d1d8da - > .time + > .info margin-left auto - color isDark ? #606984 : #b2b8bb + font-size 0.9em + + > * + color isDark ? #606984 : #b2b8bb + + > .mobile + margin-right 6px + + > .visibility + margin-left 6px > .body diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue index 9b9dd9e667..a0084e6c29 100644 --- a/src/client/app/mobile/views/components/note.sub.vue +++ b/src/client/app/mobile/views/components/note.sub.vue @@ -39,10 +39,17 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) + display flex padding 16px - font-size 0.9em + font-size 10px background isDark ? #21242d : #fcfcfc + @media (min-width 350px) + font-size 12px + + @media (min-width 500px) + font-size 14px + @media (min-width 600px) padding 24px 32px @@ -53,30 +60,27 @@ root(isDark) > header align-items center - &:after - content "" - display block - clear both - > .avatar + flex-shrink 0 display block - float left - margin 0 10px 0 0 - width 42px - height 42px + margin 0 8px 0 0 + width 38px + height 38px border-radius 8px + @media (min-width 350px) + margin-right 10px + width 42px + height 42px + @media (min-width 500px) margin-right 14px width 50px height 50px > .main - float left - width calc(100% - 52px) - - @media (min-width 500px) - width calc(100% - 64px) + flex 1 + min-width 0 > header display flex @@ -112,7 +116,7 @@ root(isDark) align-self center margin 0 0.5em 0 0 padding 1px 5px - font-size 10px + font-size 0.8em color isDark ? #758188 : #aaa border solid 1px isDark ? #57616f : #ddd border-radius 3px diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index c3994197c4..34326e12f3 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -269,8 +269,6 @@ root(isDark) &.smart > article > .main - width 100% - > header align-items center margin-bottom 4px @@ -328,27 +326,28 @@ root(isDark) padding-top 8px > article + display flex padding 16px 16px 9px @media (min-width 600px) padding 32px 32px 22px - &:after - content "" - display block - clear both - > .avatar + flex-shrink 0 display block - float left margin 0 10px 8px 0 - width 48px - height 48px + width 42px + height 42px border-radius 6px //position -webkit-sticky //position sticky //top 62px + @media (min-width 350px) + width 48px + height 48px + border-radius 6px + @media (min-width 500px) margin-right 16px width 58px @@ -356,11 +355,8 @@ root(isDark) border-radius 8px > .main - float left - width calc(100% - 58px) - - @media (min-width 500px) - width calc(100% - 74px) + flex 1 + min-width 0 > header display flex @@ -393,7 +389,7 @@ root(isDark) align-self center margin 0 0.5em 0 0 padding 1px 6px - font-size 12px + font-size 0.8em color isDark ? #758188 : #aaa border solid 1px isDark ? #57616f : #ddd border-radius 3px @@ -422,6 +418,8 @@ root(isDark) margin-left 6px > .body + @media (min-width 700px) + font-size 1.1em > .cw cursor default From a426f4c7bdad92a2153c5e228003ee3a2170d43d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 15:38:48 +0900 Subject: [PATCH 074/369] nanka iroiro --- locales/ja.yml | 4 - .../common/views/components/media-list.vue | 2 +- .../views/components/note-detail.sub.vue | 124 ------------------ .../desktop/views/components/note-detail.vue | 2 +- .../views/components/notes.note.sub.vue | 2 - .../views/components/note-detail.sub.vue | 101 -------------- .../mobile/views/components/note-detail.vue | 2 +- .../app/mobile/views/components/note.sub.vue | 15 ++- 8 files changed, 14 insertions(+), 238 deletions(-) delete mode 100644 src/client/app/desktop/views/components/note-detail.sub.vue delete mode 100644 src/client/app/mobile/views/components/note-detail.sub.vue diff --git a/locales/ja.yml b/locales/ja.yml index 366a030c99..b1df6dd859 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -379,10 +379,6 @@ desktop/views/components/note-detail.vue: renote: "Renote" add-reaction: "リアクション" -desktop/views/components/note-detail.sub.vue: - private: "この投稿は非公開です" - deleted: "この投稿は削除されました" - desktop/views/components/notes.note.vue: reposted-by: "{}がRenote" reply: "返信" diff --git a/src/client/app/common/views/components/media-list.vue b/src/client/app/common/views/components/media-list.vue index c6cb667165..2f8a1943ad 100644 --- a/src/client/app/common/views/components/media-list.vue +++ b/src/client/app/common/views/components/media-list.vue @@ -23,7 +23,7 @@ export default Vue.extend({ }, mounted() { // for Safari bug - this.$refs.grid.style.height = `${this.$refs.grid.clientHeight}px`; + this.$refs.grid.style.height = this.$refs.grid.clientHeight ? `${this.$refs.grid.clientHeight}px` : '128px'; } }); </script> diff --git a/src/client/app/desktop/views/components/note-detail.sub.vue b/src/client/app/desktop/views/components/note-detail.sub.vue deleted file mode 100644 index 00e54ff1a6..0000000000 --- a/src/client/app/desktop/views/components/note-detail.sub.vue +++ /dev/null @@ -1,124 +0,0 @@ -<template> -<div class="sub" :title="title"> - <mk-avatar class="avatar" :user="note.user"/> - <div class="main"> - <header> - <div class="left"> - <router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link> - <span class="username"><mk-acct :user="note.user"/></span> - </div> - <div class="right"> - <router-link class="time" :to="note | notePage"> - <mk-time :time="note.createdAt"/> - </router-link> - </div> - </header> - <div class="body"> - <div class="text"> - <span v-if="note.isHidden" style="opacity: 0.5">%i18n:@private%</span> - <span v-if="note.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span> - <mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/> - </div> - <div class="media" v-if="note.mediaIds.length > 0"> - <mk-media-list :media-list="note.media"/> - </div> - </div> - </div> -</div> -</template> - -<script lang="ts"> -import Vue from 'vue'; -import dateStringify from '../../../common/scripts/date-stringify'; - -export default Vue.extend({ - props: ['note'], - computed: { - title(): string { - return dateStringify(this.note.createdAt); - } - } -}); -</script> - -<style lang="stylus" scoped> -root(isDark) - margin 0 - padding 20px 32px - background isDark ? #21242d : #fdfdfd - - &:after - content "" - display block - clear both - - &:hover - > .main > footer > button - color #888 - - > .avatar - display block - float left - margin 0 16px 0 0 - width 44px - height 44px - border-radius 4px - - > .main - float left - width calc(100% - 60px) - - > header - margin-bottom 4px - white-space nowrap - - &:after - content "" - display block - clear both - - > .left - float left - - > .name - display inline - margin 0 - padding 0 - color isDark ? #fff : #777 - font-size 1em - font-weight 700 - text-align left - text-decoration none - - &:hover - text-decoration underline - - > .username - text-align left - margin 0 0 0 8px - color isDark ? #606984 : #ccc - - > .right - float right - - > .time - font-size 0.9em - color isDark ? #606984 : #c0c0c0 - - > .body - > .text - cursor default - display block - margin 0 - padding 0 - overflow-wrap break-word - font-size 1em - color isDark ? #959ba7 : #717171 - -.sub[data-darkmode] - root(true) - -.sub:not([data-darkmode]) - root(false) - -</style> diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index a8accaf531..2f28d223dd 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -89,7 +89,7 @@ import MkPostFormWindow from './post-form-window.vue'; import MkRenoteFormWindow from './renote-form-window.vue'; import MkNoteMenu from '../../../common/views/components/note-menu.vue'; import MkReactionPicker from '../../../common/views/components/reaction-picker.vue'; -import XSub from './note-detail.sub.vue'; +import XSub from './notes.note.sub.vue'; export default Vue.extend({ components: { diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue index 4938b7984e..827112ecd8 100644 --- a/src/client/app/desktop/views/components/notes.note.sub.vue +++ b/src/client/app/desktop/views/components/notes.note.sub.vue @@ -115,8 +115,6 @@ root(isDark) margin-left 6px > .body - max-height 128px - overflow hidden > .text cursor default diff --git a/src/client/app/mobile/views/components/note-detail.sub.vue b/src/client/app/mobile/views/components/note-detail.sub.vue deleted file mode 100644 index 3ad5af1719..0000000000 --- a/src/client/app/mobile/views/components/note-detail.sub.vue +++ /dev/null @@ -1,101 +0,0 @@ -<template> -<div class="root sub"> - <mk-avatar class="avatar" :user="note.user"/> - <div class="main"> - <header> - <router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link> - <span class="username"><mk-acct :user="note.user"/></span> - <router-link class="time" :to="note | notePage"> - <mk-time :time="note.createdAt"/> - </router-link> - </header> - <div class="body"> - <mk-sub-note-content class="text" :note="note"/> - </div> - </div> -</div> -</template> - -<script lang="ts"> -import Vue from 'vue'; - -export default Vue.extend({ - props: ['note'] -}); -</script> - -<style lang="stylus" scoped> -root(isDark) - padding 8px - font-size 0.9em - background isDark ? #21242d : #fdfdfd - - @media (min-width 500px) - padding 12px - - @media (min-width 600px) - padding 24px 32px - - &:after - content "" - display block - clear both - - > .avatar - display block - float left - margin 0 12px 0 0 - width 48px - height 48px - border-radius 8px - - > .main - float left - width calc(100% - 60px) - - > header - display flex - align-items baseline - margin-bottom 4px - white-space nowrap - - > .name - display block - margin 0 .5em 0 0 - padding 0 - overflow hidden - color isDark ? #fff : #607073 - font-size 1em - font-weight 700 - text-align left - text-decoration none - text-overflow ellipsis - - &:hover - text-decoration underline - - > .username - text-align left - margin 0 .5em 0 0 - color isDark ? #606984 : #d1d8da - - > .time - margin-left auto - color isDark ? #606984 : #b2b8bb - - > .body - - > .text - cursor default - margin 0 - padding 0 - font-size 1.1em - color isDark ? #959ba7 : #717171 - -.root.sub[data-darkmode] - root(true) - -.root.sub:not([data-darkmode]) - root(false) - -</style> diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index 211ca27f1c..bdbb8876df 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -87,7 +87,7 @@ import parse from '../../../../../text/parse'; import MkNoteMenu from '../../../common/views/components/note-menu.vue'; import MkReactionPicker from '../../../common/views/components/reaction-picker.vue'; -import XSub from './note-detail.sub.vue'; +import XSub from './note.sub.vue'; export default Vue.extend({ components: { diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue index a0084e6c29..f487b7647e 100644 --- a/src/client/app/mobile/views/components/note.sub.vue +++ b/src/client/app/mobile/views/components/note.sub.vue @@ -33,7 +33,17 @@ import Vue from 'vue'; export default Vue.extend({ - props: ['note'] + props: { + note: { + type: Object, + required: true + }, + // TODO + truncate: { + type: Boolean, + default: true + } + } }); </script> @@ -144,11 +154,8 @@ root(isDark) margin-left 6px > .body - max-height 128px - overflow hidden > .text - cursor default margin 0 padding 0 color isDark ? #959ba7 : #717171 From 69f07cb015bfa9d0463ab4aa9fbab961ac60d6eb Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 15:41:49 +0900 Subject: [PATCH 075/369] Fix bug --- src/client/app/desktop/views/components/sub-note-content.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/components/sub-note-content.vue b/src/client/app/desktop/views/components/sub-note-content.vue index ec41329c4a..45ce6a6f8f 100644 --- a/src/client/app/desktop/views/components/sub-note-content.vue +++ b/src/client/app/desktop/views/components/sub-note-content.vue @@ -5,7 +5,7 @@ <span v-if="note.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span> <a class="reply" v-if="note.replyId">%fa:reply%</a> <mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/> - <a class="rp" v-if="note.renoteId" :href="`/note:${note.renoteId}`">RP: ...</a> + <a class="rp" v-if="note.renoteId" :href="`/notes/${note.renoteId}`">RP: ...</a> </div> <details v-if="note.media.length > 0"> <summary>({{ '%i18n:@media-count%'.replace('{}', note.media.length) }})</summary> From 47a6188097ba69ca4306e6a517daab7f7fff51c3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 15:43:24 +0900 Subject: [PATCH 076/369] 2.23.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 58f2cebfaf..71225193bc 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.22.3", - "clientVersion": "1.0.5965", + "version": "2.23.0", + "clientVersion": "1.0.5993", "codename": "nighthike", "main": "./built/index.js", "private": true, From 2b9acc239e0dc176f78ed532eabbc3864761bf47 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 17:10:59 +0900 Subject: [PATCH 077/369] Fix bug --- src/client/app/auth/views/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/auth/views/index.vue b/src/client/app/auth/views/index.vue index 8f4f5fd8c5..826bcd125d 100644 --- a/src/client/app/auth/views/index.vue +++ b/src/client/app/auth/views/index.vue @@ -62,7 +62,7 @@ export default Vue.extend({ // 既に連携していた場合 if (this.session.app.isAuthorized) { - this.$root.$data.os.api('auth/accept', { + (this as any).api('auth/accept', { token: this.session.token }).then(() => { this.accepted(); From 2127bf32c223c23a571a585da853132f9a7801c8 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 17:11:48 +0900 Subject: [PATCH 078/369] 2.23.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 71225193bc..8705f0f293 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.23.0", - "clientVersion": "1.0.5993", + "version": "2.23.1", + "clientVersion": "1.0.5995", "codename": "nighthike", "main": "./built/index.js", "private": true, From 72e8660ae38e7728c7637321171d4f0d5290fe4e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 19:03:03 +0900 Subject: [PATCH 079/369] :art: --- src/client/app/mobile/views/components/ui.nav.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue index dd1b9c8e25..7e22ac4f84 100644 --- a/src/client/app/mobile/views/components/ui.nav.vue +++ b/src/client/app/mobile/views/components/ui.nav.vue @@ -180,6 +180,8 @@ root(isDark) > [data-fa]:first-child margin-right 0.5em + width 20px + text-align center > [data-fa].circle margin-left 6px From 70c0b1d8c043e04f21e4a82a399bf5041a47fe18 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 19:13:49 +0900 Subject: [PATCH 080/369] :art: --- src/client/app/desktop/views/pages/welcome.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 1bb791b68c..cecd7e3a90 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -80,6 +80,8 @@ export default Vue.extend({ <style lang="stylus" scoped> @import '~const.styl' +@import url(https://fonts.googleapis.com/earlyaccess/notosansjp.css); + root(isDark) display flex flex-direction column @@ -103,6 +105,7 @@ root(isDark) text-align center &.about + font-family 'Noto Sans JP' color isDark ? #fff : #627574 > article @@ -114,7 +117,7 @@ root(isDark) > h1 margin 0 - font-variant small-caps + font-weight 900 > p margin 20px 0 From 125765faa629144b2f701f9fb926b090275e6546 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 21:46:02 +0900 Subject: [PATCH 081/369] Fix bug --- src/client/app/boot.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/app/boot.js b/src/client/app/boot.js index 7b884c8a54..08c3fdeaee 100644 --- a/src/client/app/boot.js +++ b/src/client/app/boot.js @@ -32,9 +32,9 @@ //#region Detect app name let app = null; - if (url.pathname == '/docs') app = 'docs'; - if (url.pathname == '/dev') app = 'dev'; - if (url.pathname == '/auth') app = 'auth'; + if (url.pathname == '/docs' || url.pathname.startsWith('/docs/')) app = 'docs'; + if (url.pathname == '/dev' || url.pathname.startsWith('/dev/')) app = 'dev'; + if (url.pathname == '/auth' || url.pathname.startsWith('/auth/')) app = 'auth'; //#endregion //#region Detect the user language From d05aee19f2a8261de7a07314ce17da8968f3f579 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 21:46:30 +0900 Subject: [PATCH 082/369] 2.23.2 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 8705f0f293..16d8127414 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.23.1", - "clientVersion": "1.0.5995", + "version": "2.23.2", + "clientVersion": "1.0.5999", "codename": "nighthike", "main": "./built/index.js", "private": true, From 95d0d0047a1710b7b9b0dd988aad8bf7d55d348e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 22:43:03 +0900 Subject: [PATCH 083/369] =?UTF-8?q?=E6=99=82=E8=A8=88=E3=82=92SVG=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../desktop/views/components/analog-clock.vue | 165 ++++++++++-------- 1 file changed, 88 insertions(+), 77 deletions(-) diff --git a/src/client/app/desktop/views/components/analog-clock.vue b/src/client/app/desktop/views/components/analog-clock.vue index 81eec81598..7b5caf9f27 100644 --- a/src/client/app/desktop/views/components/analog-clock.vue +++ b/src/client/app/desktop/views/components/analog-clock.vue @@ -1,24 +1,103 @@ <template> -<canvas class="mk-analog-clock" ref="canvas" width="256" height="256"></canvas> +<svg class="mk-analog-clock" viewBox="0 0 10 10" preserveAspectRatio="none"> + <line v-for="angle, i in graduations" + :x1="5 + (Math.sin(angle) * (5 - graduationsPadding))" + :y1="5 - (Math.cos(angle) * (5 - graduationsPadding))" + :x2="5 + (Math.sin(angle) * ((5 - graduationsPadding) - (i % 5 == 0 ? longGraduationLength : shortGraduationLength)))" + :y2="5 - (Math.cos(angle) * ((5 - graduationsPadding) - (i % 5 == 0 ? longGraduationLength : shortGraduationLength)))" + :stroke="i % 5 == 0 ? longGraduationColor : shortGraduationColor" + stroke-width="0.05"/> + + <line + x1="5" + y1="5" + :x2="5 + (Math.sin(sAngle) * ((sHandLengthRatio * 5) - handsPadding))" + :y2="5 - (Math.cos(sAngle) * ((sHandLengthRatio * 5) - handsPadding))" + :stroke="sHandColor" + stroke-width="0.05"/> + <line + x1="5" + y1="5" + :x2="5 + (Math.sin(mAngle) * ((mHandLengthRatio * 5) - handsPadding))" + :y2="5 - (Math.cos(mAngle) * ((mHandLengthRatio * 5) - handsPadding))" + :stroke="mHandColor" + stroke-width="0.1"/> + <line + x1="5" + y1="5" + :x2="5 + (Math.sin(hAngle) * ((hHandLengthRatio * 5) - handsPadding))" + :y2="5 - (Math.cos(hAngle) * ((hHandLengthRatio * 5) - handsPadding))" + :stroke="hHandColor" + stroke-width="0.1"/> +</svg> </template> <script lang="ts"> import Vue from 'vue'; import { themeColor } from '../../../config'; -const Vec2 = function(this: any, x, y) { - this.x = x; - this.y = y; -}; - export default Vue.extend({ data() { return { - clock: null + now: new Date(), + clock: null, + + graduationsPadding: 0.5, + longGraduationLength: 0.3, + shortGraduationLength: 0.15, + handsPadding: 1, + hHandLengthRatio: 0.75, + mHandLengthRatio: 1, + sHandLengthRatio: 1, }; }, + computed: { + longGraduationColor(): string { + return 'rgba(255, 255, 255, 0.3)'; + }, + shortGraduationColor(): string { + return 'rgba(255, 255, 255, 0.2)'; + }, + sHandColor(): string { + return 'rgba(255, 255, 255, 0.5)'; + }, + mHandColor(): string { + return '#fff'; + }, + hHandColor(): string { + return themeColor; + }, + + s(): number { + return this.now.getSeconds(); + }, + m(): number { + return this.now.getMinutes(); + }, + h(): number { + return this.now.getHours(); + }, + hAngle(): number { + return Math.PI * (this.h % 12 + this.m / 60) / 6; + }, + mAngle(): number { + return Math.PI * (this.m + this.s / 60) / 30; + }, + sAngle(): number { + return Math.PI * this.s / 30; + }, + + graduations(): any { + const angles = []; + for (let i = 0; i < 60; i++) { + const angle = Math.PI * i / 30; + angles.push(angle); + } + + return angles; + } + }, mounted() { - this.tick(); this.clock = setInterval(this.tick, 1000); }, beforeDestroy() { @@ -26,75 +105,7 @@ export default Vue.extend({ }, methods: { tick() { - const canv = this.$refs.canvas as any; - - const now = new Date(); - const s = now.getSeconds(); - const m = now.getMinutes(); - const h = now.getHours(); - - const ctx = canv.getContext('2d'); - const canvW = canv.width; - const canvH = canv.height; - ctx.clearRect(0, 0, canvW, canvH); - - { // 背景 - const center = Math.min((canvW / 2), (canvH / 2)); - const lineStart = center * 0.90; - const shortLineEnd = center * 0.87; - const longLineEnd = center * 0.84; - for (let i = 0; i < 60; i++) { - const angle = Math.PI * i / 30; - const uv = new Vec2(Math.sin(angle), -Math.cos(angle)); - ctx.beginPath(); - ctx.lineWidth = 1; - ctx.moveTo((canvW / 2) + uv.x * lineStart, (canvH / 2) + uv.y * lineStart); - if (i % 5 == 0) { - ctx.strokeStyle = 'rgba(255, 255, 255, 0.2)'; - ctx.lineTo((canvW / 2) + uv.x * longLineEnd, (canvH / 2) + uv.y * longLineEnd); - } else { - ctx.strokeStyle = 'rgba(255, 255, 255, 0.1)'; - ctx.lineTo((canvW / 2) + uv.x * shortLineEnd, (canvH / 2) + uv.y * shortLineEnd); - } - ctx.stroke(); - } - } - - { // 分 - const angle = Math.PI * (m + s / 60) / 30; - const length = Math.min(canvW, canvH) / 2.6; - const uv = new Vec2(Math.sin(angle), -Math.cos(angle)); - ctx.beginPath(); - ctx.strokeStyle = '#ffffff'; - ctx.lineWidth = 2; - ctx.moveTo(canvW / 2 - uv.x * length / 5, canvH / 2 - uv.y * length / 5); - ctx.lineTo(canvW / 2 + uv.x * length, canvH / 2 + uv.y * length); - ctx.stroke(); - } - - { // 時 - const angle = Math.PI * (h % 12 + m / 60) / 6; - const length = Math.min(canvW, canvH) / 4; - const uv = new Vec2(Math.sin(angle), -Math.cos(angle)); - ctx.beginPath(); - ctx.strokeStyle = themeColor; - ctx.lineWidth = 2; - ctx.moveTo(canvW / 2 - uv.x * length / 5, canvH / 2 - uv.y * length / 5); - ctx.lineTo(canvW / 2 + uv.x * length, canvH / 2 + uv.y * length); - ctx.stroke(); - } - - { // 秒 - const angle = Math.PI * s / 30; - const length = Math.min(canvW, canvH) / 2.6; - const uv = new Vec2(Math.sin(angle), -Math.cos(angle)); - ctx.beginPath(); - ctx.strokeStyle = 'rgba(255, 255, 255, 0.5)'; - ctx.lineWidth = 1; - ctx.moveTo(canvW / 2 - uv.x * length / 5, canvH / 2 - uv.y * length / 5); - ctx.lineTo(canvW / 2 + uv.x * length, canvH / 2 + uv.y * length); - ctx.stroke(); - } + this.now = new Date(); } } }); From 3d231c34561448d2fa96897bf789b22a1150d423 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 22:56:05 +0900 Subject: [PATCH 084/369] Fix --- .../app/desktop/views/components/analog-clock.vue | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/client/app/desktop/views/components/analog-clock.vue b/src/client/app/desktop/views/components/analog-clock.vue index 7b5caf9f27..365a8cdaf5 100644 --- a/src/client/app/desktop/views/components/analog-clock.vue +++ b/src/client/app/desktop/views/components/analog-clock.vue @@ -9,22 +9,22 @@ stroke-width="0.05"/> <line - x1="5" - y1="5" + :x1="5 - (Math.sin(sAngle) * (sHandLengthRatio * handsTailLength))" + :y1="5 + (Math.cos(sAngle) * (sHandLengthRatio * handsTailLength))" :x2="5 + (Math.sin(sAngle) * ((sHandLengthRatio * 5) - handsPadding))" :y2="5 - (Math.cos(sAngle) * ((sHandLengthRatio * 5) - handsPadding))" :stroke="sHandColor" stroke-width="0.05"/> <line - x1="5" - y1="5" + :x1="5 - (Math.sin(mAngle) * (mHandLengthRatio * handsTailLength))" + :y1="5 + (Math.cos(mAngle) * (mHandLengthRatio * handsTailLength))" :x2="5 + (Math.sin(mAngle) * ((mHandLengthRatio * 5) - handsPadding))" :y2="5 - (Math.cos(mAngle) * ((mHandLengthRatio * 5) - handsPadding))" :stroke="mHandColor" stroke-width="0.1"/> <line - x1="5" - y1="5" + :x1="5 - (Math.sin(hAngle) * (hHandLengthRatio * handsTailLength))" + :y1="5 + (Math.cos(hAngle) * (hHandLengthRatio * handsTailLength))" :x2="5 + (Math.sin(hAngle) * ((hHandLengthRatio * 5) - handsPadding))" :y2="5 - (Math.cos(hAngle) * ((hHandLengthRatio * 5) - handsPadding))" :stroke="hHandColor" @@ -46,9 +46,10 @@ export default Vue.extend({ longGraduationLength: 0.3, shortGraduationLength: 0.15, handsPadding: 1, + handsTailLength: 0.7, hHandLengthRatio: 0.75, mHandLengthRatio: 1, - sHandLengthRatio: 1, + sHandLengthRatio: 1 }; }, computed: { From ae9bfd69b030cef7e90befeb748f7897ef89bcbd Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 23:13:39 +0900 Subject: [PATCH 085/369] Add analog clock widget --- locales/ja.yml | 1 + .../views/components/analog-clock.vue | 18 +++++--- .../app/common/views/components/index.ts | 2 + .../app/common/views/widgets/analog-clock.vue | 41 +++++++++++++++++++ src/client/app/common/views/widgets/index.ts | 2 + .../app/desktop/views/components/home.vue | 1 + .../app/desktop/views/components/index.ts | 2 - .../views/components/ui.header.clock.vue | 2 +- src/client/app/mobile/views/pages/widgets.vue | 1 + 9 files changed, 61 insertions(+), 9 deletions(-) rename src/client/app/{desktop => common}/views/components/analog-clock.vue (90%) create mode 100644 src/client/app/common/views/widgets/analog-clock.vue diff --git a/locales/ja.yml b/locales/ja.yml index b1df6dd859..78353fb993 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -54,6 +54,7 @@ common: my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" widgets: + analog-clock: "アナログ時計" profile: "プロフィール" calendar: "カレンダー" timemachine: "カレンダー(タイムマシン)" diff --git a/src/client/app/desktop/views/components/analog-clock.vue b/src/client/app/common/views/components/analog-clock.vue similarity index 90% rename from src/client/app/desktop/views/components/analog-clock.vue rename to src/client/app/common/views/components/analog-clock.vue index 365a8cdaf5..e25a1fcadf 100644 --- a/src/client/app/desktop/views/components/analog-clock.vue +++ b/src/client/app/common/views/components/analog-clock.vue @@ -37,6 +37,12 @@ import Vue from 'vue'; import { themeColor } from '../../../config'; export default Vue.extend({ + props: { + dark: { + type: Boolean, + default: false + } + }, data() { return { now: new Date(), @@ -54,16 +60,17 @@ export default Vue.extend({ }, computed: { longGraduationColor(): string { - return 'rgba(255, 255, 255, 0.3)'; + return this.dark ? 'rgba(255, 255, 255, 0.3)' : 'rgba(0, 0, 0, 0.3)'; }, shortGraduationColor(): string { - return 'rgba(255, 255, 255, 0.2)'; + return this.dark ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.2)'; }, + sHandColor(): string { - return 'rgba(255, 255, 255, 0.5)'; + return this.dark ? 'rgba(255, 255, 255, 0.5)' : 'rgba(0, 0, 0, 0.3)'; }, mHandColor(): string { - return '#fff'; + return this.dark ? '#fff' : '#777'; }, hHandColor(): string { return themeColor; @@ -78,6 +85,7 @@ export default Vue.extend({ h(): number { return this.now.getHours(); }, + hAngle(): number { return Math.PI * (this.h % 12 + this.m / 60) / 6; }, @@ -115,6 +123,4 @@ export default Vue.extend({ <style lang="stylus" scoped> .mk-analog-clock display block - width 256px - height 256px </style> diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts index c1a7bc61d7..df74f5ddfb 100644 --- a/src/client/app/common/views/components/index.ts +++ b/src/client/app/common/views/components/index.ts @@ -1,5 +1,6 @@ import Vue from 'vue'; +import analogClock from './analog-clock.vue'; import signin from './signin.vue'; import signup from './signup.vue'; import forkit from './forkit.vue'; @@ -27,6 +28,7 @@ import Switch from './switch.vue'; import Othello from './othello.vue'; import welcomeTimeline from './welcome-timeline.vue'; +Vue.component('mk-analog-clock', analogClock); Vue.component('mk-signin', signin); Vue.component('mk-signup', signup); Vue.component('mk-forkit', forkit); diff --git a/src/client/app/common/views/widgets/analog-clock.vue b/src/client/app/common/views/widgets/analog-clock.vue new file mode 100644 index 0000000000..b1177d4ddf --- /dev/null +++ b/src/client/app/common/views/widgets/analog-clock.vue @@ -0,0 +1,41 @@ +<template> +<div class="mkw-analog-clock"> + <mk-widget-container :naked="props.naked" :show-header="false"> + <div class="mkw-analog-clock--body"> + <mk-analog-clock :dark="$store.state.device.darkmode"/> + </div> + </mk-widget-container> +</div> +</template> + +<script lang="ts"> +import define from '../../../common/define-widget'; +export default define({ + name: 'analog-clock', + props: () => ({ + naked: false + }) +}).extend({ + methods: { + func() { + this.props.naked = !this.props.naked; + this.save(); + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +root(isDark) + .mkw-analog-clock--body + padding 8px + +.mkw-analog-clock[data-darkmode] + root(true) + +.mkw-analog-clock:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/common/views/widgets/index.ts b/src/client/app/common/views/widgets/index.ts index 7ef4e02092..a4cabc43ba 100644 --- a/src/client/app/common/views/widgets/index.ts +++ b/src/client/app/common/views/widgets/index.ts @@ -1,5 +1,6 @@ import Vue from 'vue'; +import wAnalogClock from './analog-clock.vue'; import wVersion from './version.vue'; import wRss from './rss.vue'; import wServer from './server.vue'; @@ -12,6 +13,7 @@ import wTips from './tips.vue'; import wDonation from './donation.vue'; import wNav from './nav.vue'; +Vue.component('mkw-analog-clock', wAnalogClock); Vue.component('mkw-nav', wNav); Vue.component('mkw-calendar', wCalendar); Vue.component('mkw-photo-stream', wPhotoStream); diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index f51fed7454..9f6cf9614a 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -7,6 +7,7 @@ <p>%i18n:@add-widget%</p> <select v-model="widgetAdderSelected"> <option value="profile">%i18n:common.widgets.profile%</option> + <option value="analog-clock">%i18n:common.widgets.analog-clock%</option> <option value="calendar">%i18n:common.widgets.calendar%</option> <option value="timemachine">%i18n:common.widgets.timemachine%</option> <option value="activity">%i18n:common.widgets.activity%</option> diff --git a/src/client/app/desktop/views/components/index.ts b/src/client/app/desktop/views/components/index.ts index f58d0706df..7b7a38afa2 100644 --- a/src/client/app/desktop/views/components/index.ts +++ b/src/client/app/desktop/views/components/index.ts @@ -9,7 +9,6 @@ import subNoteContent from './sub-note-content.vue'; import window from './window.vue'; import noteFormWindow from './post-form-window.vue'; import renoteFormWindow from './renote-form-window.vue'; -import analogClock from './analog-clock.vue'; import ellipsisIcon from './ellipsis-icon.vue'; import mediaImage from './media-image.vue'; import mediaImageDialog from './media-image-dialog.vue'; @@ -40,7 +39,6 @@ Vue.component('mk-sub-note-content', subNoteContent); Vue.component('mk-window', window); Vue.component('mk-post-form-window', noteFormWindow); Vue.component('mk-renote-form-window', renoteFormWindow); -Vue.component('mk-analog-clock', analogClock); Vue.component('mk-ellipsis-icon', ellipsisIcon); Vue.component('mk-media-image', mediaImage); Vue.component('mk-media-image-dialog', mediaImageDialog); diff --git a/src/client/app/desktop/views/components/ui.header.clock.vue b/src/client/app/desktop/views/components/ui.header.clock.vue index cd23a67506..1c3f12f2f2 100644 --- a/src/client/app/desktop/views/components/ui.header.clock.vue +++ b/src/client/app/desktop/views/components/ui.header.clock.vue @@ -8,7 +8,7 @@ </time> </div> <div class="content"> - <mk-analog-clock/> + <mk-analog-clock :dark="true"/> </div> </div> </template> diff --git a/src/client/app/mobile/views/pages/widgets.vue b/src/client/app/mobile/views/pages/widgets.vue index 9d047fa635..a0893770e8 100644 --- a/src/client/app/mobile/views/pages/widgets.vue +++ b/src/client/app/mobile/views/pages/widgets.vue @@ -9,6 +9,7 @@ <header> <select v-model="widgetAdderSelected"> <option value="profile">%i18n:common.widgets.profile%</option> + <option value="analog-clock">%i18n:common.widgets.analog-clock%</option> <option value="calendar">%i18n:common.widgets.calendar%</option> <option value="activity">%i18n:common.widgets.activity%</option> <option value="rss">%i18n:common.widgets.rss%</option> From 161b9602f41b4d4287ad98f0333688930f92a81f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 23:56:44 +0900 Subject: [PATCH 086/369] Fix bug --- src/client/app/auth/script.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client/app/auth/script.ts b/src/client/app/auth/script.ts index 20f59bf033..fd985c46ad 100644 --- a/src/client/app/auth/script.ts +++ b/src/client/app/auth/script.ts @@ -20,6 +20,7 @@ init(launch => { // Init router const router = new VueRouter({ mode: 'history', + base: '/auth/', routes: [ { path: '/:token', component: Index }, ] From 854814c226932cc8f8dbaa953845d4002619a349 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 29 May 2018 23:57:25 +0900 Subject: [PATCH 087/369] 2.24.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 16d8127414..b67ddf586d 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.23.2", - "clientVersion": "1.0.5999", + "version": "2.24.0", + "clientVersion": "1.0.6017", "codename": "nighthike", "main": "./built/index.js", "private": true, From ef75f12abe84de70d31b8227fac5ce6c22bd5b28 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 30 May 2018 00:15:32 +0900 Subject: [PATCH 088/369] Fix bug --- src/client/app/desktop/views/components/drive.file.vue | 2 +- src/client/app/desktop/views/components/drive.folder.vue | 2 +- src/client/app/desktop/views/components/drive.vue | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/app/desktop/views/components/drive.file.vue b/src/client/app/desktop/views/components/drive.file.vue index fe8f57bc5f..62a189d849 100644 --- a/src/client/app/desktop/views/components/drive.file.vue +++ b/src/client/app/desktop/views/components/drive.file.vue @@ -62,7 +62,7 @@ export default Vue.extend({ onContextmenu(e) { this.isContextmenuShowing = true; - contextmenu(e, [{ + contextmenu((this as any).os)(e, [{ type: 'item', text: '%i18n:@contextmenu.rename%', icon: '%fa:i-cursor%', diff --git a/src/client/app/desktop/views/components/drive.folder.vue b/src/client/app/desktop/views/components/drive.folder.vue index 16f474f4e0..06f2b3f80c 100644 --- a/src/client/app/desktop/views/components/drive.folder.vue +++ b/src/client/app/desktop/views/components/drive.folder.vue @@ -52,7 +52,7 @@ export default Vue.extend({ onContextmenu(e) { this.isContextmenuShowing = true; - contextmenu(e, [{ + contextmenu((this as any).os)(e, [{ type: 'item', text: '%i18n:@contextmenu.move-to-this-folder%', icon: '%fa:arrow-right%', diff --git a/src/client/app/desktop/views/components/drive.vue b/src/client/app/desktop/views/components/drive.vue index cae40f306c..9a738070f1 100644 --- a/src/client/app/desktop/views/components/drive.vue +++ b/src/client/app/desktop/views/components/drive.vue @@ -136,7 +136,7 @@ export default Vue.extend({ }, methods: { onContextmenu(e) { - contextmenu(e, [{ + contextmenu((this as any).os)(e, [{ type: 'item', text: '%i18n:@contextmenu.create-folder%', icon: '%fa:R folder%', From 248acaee75df8e4513dc504804e7bb9b5b117550 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 30 May 2018 00:16:03 +0900 Subject: [PATCH 089/369] 2.24.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b67ddf586d..ee438d6c0b 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.24.0", - "clientVersion": "1.0.6017", + "version": "2.24.1", + "clientVersion": "1.0.6019", "codename": "nighthike", "main": "./built/index.js", "private": true, From fa56a44d8538a4ef3561796485bb9a6e84598e79 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 30 May 2018 04:07:23 +0900 Subject: [PATCH 090/369] :art: --- .../common/views/components/analog-clock.vue | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/client/app/common/views/components/analog-clock.vue b/src/client/app/common/views/components/analog-clock.vue index e25a1fcadf..53fb2a8dad 100644 --- a/src/client/app/common/views/components/analog-clock.vue +++ b/src/client/app/common/views/components/analog-clock.vue @@ -1,12 +1,10 @@ <template> <svg class="mk-analog-clock" viewBox="0 0 10 10" preserveAspectRatio="none"> - <line v-for="angle, i in graduations" - :x1="5 + (Math.sin(angle) * (5 - graduationsPadding))" - :y1="5 - (Math.cos(angle) * (5 - graduationsPadding))" - :x2="5 + (Math.sin(angle) * ((5 - graduationsPadding) - (i % 5 == 0 ? longGraduationLength : shortGraduationLength)))" - :y2="5 - (Math.cos(angle) * ((5 - graduationsPadding) - (i % 5 == 0 ? longGraduationLength : shortGraduationLength)))" - :stroke="i % 5 == 0 ? longGraduationColor : shortGraduationColor" - stroke-width="0.05"/> + <circle v-for="angle, i in graduations" + :cx="5 + (Math.sin(angle) * (5 - graduationsPadding))" + :cy="5 - (Math.cos(angle) * (5 - graduationsPadding))" + :r="i % 5 == 0 ? 0.125 : 0.05" + :fill="i % 5 == 0 ? majorGraduationColor : minorGraduationColor"/> <line :x1="5 - (Math.sin(sAngle) * (sHandLengthRatio * handsTailLength))" @@ -43,14 +41,13 @@ export default Vue.extend({ default: false } }, + data() { return { now: new Date(), clock: null, graduationsPadding: 0.5, - longGraduationLength: 0.3, - shortGraduationLength: 0.15, handsPadding: 1, handsTailLength: 0.7, hHandLengthRatio: 0.75, @@ -58,11 +55,12 @@ export default Vue.extend({ sHandLengthRatio: 1 }; }, + computed: { - longGraduationColor(): string { + majorGraduationColor(): string { return this.dark ? 'rgba(255, 255, 255, 0.3)' : 'rgba(0, 0, 0, 0.3)'; }, - shortGraduationColor(): string { + minorGraduationColor(): string { return this.dark ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.2)'; }, @@ -106,12 +104,15 @@ export default Vue.extend({ return angles; } }, + mounted() { this.clock = setInterval(this.tick, 1000); }, + beforeDestroy() { clearInterval(this.clock); }, + methods: { tick() { this.now = new Date(); From 9069a99a15ec7c5481079aeea728a3ad18eddd36 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 30 May 2018 04:45:27 +0900 Subject: [PATCH 091/369] wip --- locales/ja.yml | 7 +- src/client/app/mobile/script.ts | 4 ++ .../app/mobile/views/components/ui.nav.vue | 12 ++-- .../app/mobile/views/pages/user-list.vue | 63 +++++++++++++++++ .../app/mobile/views/pages/user-lists.vue | 68 +++++++++++++++++++ 5 files changed, 149 insertions(+), 5 deletions(-) create mode 100644 src/client/app/mobile/views/pages/user-list.vue create mode 100644 src/client/app/mobile/views/pages/user-lists.vue diff --git a/locales/ja.yml b/locales/ja.yml index 78353fb993..f72058e123 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -838,12 +838,13 @@ mobile/views/components/timeline.vue: load-more: "もっと" mobile/views/components/ui.nav.vue: - home: "ホーム" + timeline: "タイムライン" notifications: "通知" messaging: "メッセージ" search: "検索" drive: "ドライブ" favorites: "お気に入り" + user-lists: "リスト" widgets: "ウィジェット" game: "ゲーム" darkmode: "ダークモード" @@ -863,6 +864,10 @@ mobile/views/components/users-list.vue: mobile/views/pages/favorites.vue: title: "お気に入り" +mobile/views/pages/user-lists.vue: + title: "リスト" + enter-list-name: "リスト名を入力してください" + mobile/views/pages/drive.vue: drive: "ドライブ" more: "もっと見る" diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts index 4c3d8fc3bd..607ff63711 100644 --- a/src/client/app/mobile/script.ts +++ b/src/client/app/mobile/script.ts @@ -37,6 +37,8 @@ import MkSearch from './views/pages/search.vue'; import MkFollowers from './views/pages/followers.vue'; import MkFollowing from './views/pages/following.vue'; import MkFavorites from './views/pages/favorites.vue'; +import MkUserLists from './views/pages/user-lists.vue'; +import MkUserList from './views/pages/user-list.vue'; import MkSettings from './views/pages/settings.vue'; import MkOthello from './views/pages/othello.vue'; @@ -74,6 +76,8 @@ init((launch) => { { path: '/i/settings', name: 'settings', component: MkSettings }, { path: '/i/notifications', name: 'notifications', component: MkNotifications }, { path: '/i/favorites', name: 'favorites', component: MkFavorites }, + { path: '/i/lists', name: 'user-lists', component: MkUserLists }, + { path: '/i/lists/:list', name: 'user-list', component: MkUserList }, { path: '/i/widgets', name: 'widgets', component: MkWidgets }, { path: '/i/messaging', name: 'messaging', component: MkMessaging }, { path: '/i/messaging/:user', component: MkMessagingRoom }, diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue index 7e22ac4f84..11a8f7ab97 100644 --- a/src/client/app/mobile/views/components/ui.nav.vue +++ b/src/client/app/mobile/views/components/ui.nav.vue @@ -15,14 +15,15 @@ </router-link> <div class="links"> <ul> - <li><router-link to="/" :data-active="$route.name == 'index'">%fa:home%%i18n:@home%%fa:angle-right%</router-link></li> + <li><router-link to="/" :data-active="$route.name == 'index'">%fa:home%%i18n:@timeline%%fa:angle-right%</router-link></li> <li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotification">%fa:circle%</template>%fa:angle-right%</router-link></li> <li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessage">%fa:circle%</template>%fa:angle-right%</router-link></li> <li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%%i18n:@game%<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li> </ul> <ul> - <li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:quidditch%%i18n:@widgets%%fa:angle-right%</router-link></li> + <li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:R calendar-alt%%i18n:@widgets%%fa:angle-right%</router-link></li> <li><router-link to="/i/favorites" :data-active="$route.name == 'favorites'">%fa:star%%i18n:@favorites%%fa:angle-right%</router-link></li> + <li><router-link to="/i/lists" :data-active="$route.name == 'user-lists'">%fa:list%%i18n:@user-lists%%fa:angle-right%</router-link></li> <li><router-link to="/i/drive" :data-active="$route.name == 'drive'">%fa:cloud%%i18n:@drive%%fa:angle-right%</router-link></li> </ul> <ul> @@ -157,7 +158,10 @@ root(isDark) &:first-child margin-top 0 - li + &:last-child + margin-bottom 0 + + > li display block font-size 1em line-height 1em @@ -199,7 +203,7 @@ root(isDark) opacity 0.5 .about - margin 0 + margin 0 0 8px 0 padding 1em 0 text-align center font-size 0.8em diff --git a/src/client/app/mobile/views/pages/user-list.vue b/src/client/app/mobile/views/pages/user-list.vue new file mode 100644 index 0000000000..7440dbcb64 --- /dev/null +++ b/src/client/app/mobile/views/pages/user-list.vue @@ -0,0 +1,63 @@ +<template> +<mk-ui> + <span slot="header" v-if="!fetching">%fa:list%{{ list.title }}</span> + + <main v-if="!fetching"> + <ul> + <li v-for="user in list.users" :key="user.id"><router-link :to="user | userPage">{{ user | userName }}</router-link></li> + </ul> + </main> +</mk-ui> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import Progress from '../../../common/scripts/loading'; + +export default Vue.extend({ + data() { + return { + fetching: true, + list: null + }; + }, + watch: { + $route: 'fetch' + }, + created() { + this.fetch(); + }, + methods: { + fetch() { + Progress.start(); + this.fetching = true; + + (this as any).api('users/lists/show', { + listId: this.$route.params.list + }).then(list => { + this.list = list; + this.fetching = false; + + Progress.done(); + }); + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +main + width 100% + max-width 680px + margin 0 auto + padding 8px + + @media (min-width 500px) + padding 16px + + @media (min-width 600px) + padding 32px + +</style> diff --git a/src/client/app/mobile/views/pages/user-lists.vue b/src/client/app/mobile/views/pages/user-lists.vue new file mode 100644 index 0000000000..288295677e --- /dev/null +++ b/src/client/app/mobile/views/pages/user-lists.vue @@ -0,0 +1,68 @@ +<template> +<mk-ui> + <span slot="header">%fa:list%%i18n:@title%</span> + <template slot="func"><button @click="fn">%fa:plus%</button></template> + + <main> + <ul> + <li v-for="list in lists" :key="list.id"><router-link :to="`/i/lists/${list.id}`">{{ list.title }}</router-link></li> + </ul> + </main> +</mk-ui> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import Progress from '../../../common/scripts/loading'; + +export default Vue.extend({ + data() { + return { + fetching: true, + lists: [] + }; + }, + mounted() { + document.title = 'Misskey | %i18n:@title%'; + + Progress.start(); + + (this as any).api('users/lists/list').then(lists => { + this.fetching = false; + this.lists = lists; + + Progress.done(); + }); + }, + methods: { + fn() { + (this as any).apis.input({ + title: '%i18n:@enter-list-name%', + }).then(async title => { + const list = await (this as any).api('users/lists/create', { + title + }); + + this.$router.push('/i/lists/' + list.id); + }); + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +main + width 100% + max-width 680px + margin 0 auto + padding 8px + + @media (min-width 500px) + padding 16px + + @media (min-width 600px) + padding 32px + +</style> From 5d2caa456d671d5f2847f659104e2abf7292a5f2 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 30 May 2018 04:46:50 +0900 Subject: [PATCH 092/369] :art: --- src/client/app/common/views/widgets/memo.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client/app/common/views/widgets/memo.vue b/src/client/app/common/views/widgets/memo.vue index 3f599c82a0..30f0d3b009 100644 --- a/src/client/app/common/views/widgets/memo.vue +++ b/src/client/app/common/views/widgets/memo.vue @@ -73,6 +73,7 @@ root(isDark) background isDark ? #282c37 : #fff border none border-bottom solid 1px isDark ? #1c2023 : #eee + border-radius 0 > button display block From dd943923179b464eee0a6ac28ad0938aab11d60a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 30 May 2018 05:02:56 +0900 Subject: [PATCH 093/369] 2.24.2 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ee438d6c0b..5acb4bb715 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.24.1", - "clientVersion": "1.0.6019", + "version": "2.24.2", + "clientVersion": "1.0.6035", "codename": "nighthike", "main": "./built/index.js", "private": true, From ea223bab511733ff10b14b879996438b7c529716 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 30 May 2018 18:13:20 +0900 Subject: [PATCH 094/369] Fix bug --- src/client/app/mobile/views/pages/user-list.vue | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/client/app/mobile/views/pages/user-list.vue b/src/client/app/mobile/views/pages/user-list.vue index 7440dbcb64..1c6a829cd5 100644 --- a/src/client/app/mobile/views/pages/user-list.vue +++ b/src/client/app/mobile/views/pages/user-list.vue @@ -4,7 +4,7 @@ <main v-if="!fetching"> <ul> - <li v-for="user in list.users" :key="user.id"><router-link :to="user | userPage">{{ user | userName }}</router-link></li> + <li v-for="user in users" :key="user.id"><router-link :to="user | userPage">{{ user | userName }}</router-link></li> </ul> </main> </mk-ui> @@ -18,7 +18,8 @@ export default Vue.extend({ data() { return { fetching: true, - list: null + list: null, + users: null }; }, watch: { @@ -39,6 +40,12 @@ export default Vue.extend({ this.fetching = false; Progress.done(); + + (this as any).api('users/show', { + userIds: this.list.userIds + }).then(users => { + this.users = users; + }); }); } } From 5fb2f7749d758571b1f7fab0ca3eb88f5c3da255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Miko=C5=82ajczak?= <me@m4sk.in> Date: Wed, 30 May 2018 12:13:51 +0000 Subject: [PATCH 095/369] fix typo --- locales/ja.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/ja.yml b/locales/ja.yml index f72058e123..400b79ab69 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -551,7 +551,7 @@ desktop/views/components/settings.api.vue: token: "Token:" enter-password: "パスワードを入力してください" -desktop/views/components/settings.app.vue: +desktop/views/components/settings.apps.vue: no-apps: "連携しているアプリケーションはありません" desktop/views/components/settings.mute.vue: From 7dd7de8ff66868543e2faf86fbb7ad2a00240352 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Wed, 30 May 2018 23:05:24 +0900 Subject: [PATCH 096/369] Update endpoints.ts --- src/server/api/endpoints.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts index b4ab65eb16..196f3adebc 100644 --- a/src/server/api/endpoints.ts +++ b/src/server/api/endpoints.ts @@ -555,7 +555,7 @@ const endpoints: Endpoint[] = [ withCredential: true, limit: { duration: ms('1hour'), - max: 100 + max: 300 }, kind: 'reaction-write' }, From c23bbf81f10d9772d9313e4a9f4a8839f381c409 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 30 May 2018 23:08:26 +0900 Subject: [PATCH 097/369] 2.24.3 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5acb4bb715..f28a0645af 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.24.2", - "clientVersion": "1.0.6035", + "version": "2.24.3", + "clientVersion": "1.0.6055", "codename": "nighthike", "main": "./built/index.js", "private": true, From 111dbdcd7f269c8ff9e266fedd9d18b60faea88a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 31 May 2018 16:38:05 +0900 Subject: [PATCH 098/369] Fix --- .../views/components/post-form-window.vue | 64 +++++++++++-------- 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/src/client/app/desktop/views/components/post-form-window.vue b/src/client/app/desktop/views/components/post-form-window.vue index c55d6f1a1e..51a416e281 100644 --- a/src/client/app/desktop/views/components/post-form-window.vue +++ b/src/client/app/desktop/views/components/post-form-window.vue @@ -1,21 +1,23 @@ <template> -<mk-window ref="window" is-modal @closed="$destroy"> - <span slot="header"> - <span :class="$style.icon" v-if="geo">%fa:map-marker-alt%</span> +<mk-window class="mk-post-form-window" ref="window" is-modal @closed="$destroy"> + <span slot="header" class="mk-post-form-window--header"> + <span class="icon" v-if="geo">%fa:map-marker-alt%</span> <span v-if="!reply">%i18n:@note%</span> <span v-if="reply">%i18n:@reply%</span> - <span :class="$style.count" v-if="media.length != 0">{{ '%i18n:@attaches%'.replace('{}', media.length) }}</span> - <span :class="$style.count" v-if="uploadings.length != 0">{{ '%i18n:@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span> + <span class="count" v-if="media.length != 0">{{ '%i18n:@attaches%'.replace('{}', media.length) }}</span> + <span class="count" v-if="uploadings.length != 0">{{ '%i18n:@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span> </span> - <mk-note-preview v-if="reply" :class="$style.notePreview" :note="reply"/> - <mk-post-form ref="form" - :reply="reply" - @posted="onPosted" - @change-uploadings="onChangeUploadings" - @change-attached-media="onChangeMedia" - @geo-attached="onGeoAttached" - @geo-dettached="onGeoDettached"/> + <div class="mk-post-form-window--body"> + <mk-note-preview v-if="reply" class="notePreview" :note="reply"/> + <mk-post-form ref="form" + :reply="reply" + @posted="onPosted" + @change-uploadings="onChangeUploadings" + @change-attached-media="onChangeMedia" + @geo-attached="onGeoAttached" + @geo-dettached="onGeoDettached"/> + </div> </mk-window> </template> @@ -56,21 +58,33 @@ export default Vue.extend({ }); </script> -<style lang="stylus" module> -.icon - margin-right 8px +<style lang="stylus" scoped> +root(isDark) + .mk-post-form-window--header + .icon + margin-right 8px -.count - margin-left 8px - opacity 0.8 + .count + margin-left 8px + opacity 0.8 - &:before - content '(' + &:before + content '(' - &:after - content ')' + &:after + content ')' -.notePreview - margin 16px 22px 0 22px + .mk-post-form-window--body + .notePreview + if isDark + margin 16px 22px 0 22px + else + margin 16px 22px + +.mk-post-form-window[data-darkmode] + root(true) + +.mk-post-form-window:not([data-darkmode]) + root(false) </style> From d32d95918ca512db21baf88696d2afc73219eab3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 31 May 2018 16:44:11 +0900 Subject: [PATCH 099/369] :art: --- src/client/app/desktop/views/components/home.vue | 14 ++++++++++---- src/client/app/desktop/views/components/ui.vue | 10 ++++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index 9f6cf9614a..636ed871c7 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -63,9 +63,8 @@ <component v-for="widget in widgets[place]" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" @chosen="warp"/> </div> <div class="main"> - <mk-post-form v-if="$store.state.settings.showPostFormOnTopOfTl"/> - <mk-timeline ref="tl" @loaded="onTlLoaded" v-if="mode == 'timeline'"/> - <mk-mentions @loaded="onTlLoaded" v-if="mode == 'mentions'"/> + <mk-post-form class="form" v-if="$store.state.settings.showPostFormOnTopOfTl"/> + <mk-timeline class="tl" cref="tl" @loaded="onTlLoaded" v-if="mode == 'timeline'"/> </div> </template> </div> @@ -299,11 +298,18 @@ root(isDark) width calc(100% - 275px * 2) order 2 - .mk-post-form + > .form margin-bottom 16px border solid 1px rgba(#000, 0.075) border-radius 4px + @media (max-width 700px) + padding 0 + + > .tl + border none + border-radius 0 + > *:not(.main) width 275px padding 16px 0 16px 0 diff --git a/src/client/app/desktop/views/components/ui.vue b/src/client/app/desktop/views/components/ui.vue index b6dd22c1f8..32cc71e4b0 100644 --- a/src/client/app/desktop/views/components/ui.vue +++ b/src/client/app/desktop/views/components/ui.vue @@ -1,6 +1,6 @@ <template> -<div> - <x-header/> +<div class="mk-ui"> + <x-header class="header"/> <div class="content"> <slot></slot> </div> @@ -35,3 +35,9 @@ export default Vue.extend({ }); </script> +<style lang="stylus" scoped> +.mk-ui + > .header + @media (max-width 1000px) + display none +</style> From 9599a3123987b94def83c5d70e7dd4ddcc6bf649 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 31 May 2018 18:08:47 +0900 Subject: [PATCH 100/369] wip --- src/models/follow-requests.ts | 50 +++++++++++++++++++++++++++++++++++ src/models/user.ts | 21 +++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 src/models/follow-requests.ts diff --git a/src/models/follow-requests.ts b/src/models/follow-requests.ts new file mode 100644 index 0000000000..0de4b8e3af --- /dev/null +++ b/src/models/follow-requests.ts @@ -0,0 +1,50 @@ +import * as mongo from 'mongodb'; +import db from '../db/mongodb'; + +const FollowRequest = db.get<IFollowRequest>('followRequests'); +FollowRequest.createIndex(['followerId', 'followeeId'], { unique: true }); +export default FollowRequest; + +export type IFollowRequest = { + _id: mongo.ObjectID; + createdAt: Date; + followeeId: mongo.ObjectID; + followerId: mongo.ObjectID; + + // 非正規化 + _followee: { + host: string; + inbox?: string; + }, + _follower: { + host: string; + inbox?: string; + } +}; + +/** + * FollowRequestを物理削除します + */ +export async function deleteFollowRequest(followRequest: string | mongo.ObjectID | IFollowRequest) { + let f: IFollowRequest; + + // Populate + if (mongo.ObjectID.prototype.isPrototypeOf(followRequest)) { + f = await FollowRequest.findOne({ + _id: followRequest + }); + } else if (typeof followRequest === 'string') { + f = await FollowRequest.findOne({ + _id: new mongo.ObjectID(followRequest) + }); + } else { + f = followRequest as IFollowRequest; + } + + if (f == null) return; + + // このFollowingを削除 + await FollowRequest.remove({ + _id: f._id + }); +} diff --git a/src/models/user.ts b/src/models/user.ts index 11eafe05ea..8dfd783a9f 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -22,6 +22,7 @@ import FollowedLog, { deleteFollowedLog } from './followed-log'; import SwSubscription, { deleteSwSubscription } from './sw-subscription'; import Notification, { deleteNotification } from './notification'; import UserList, { deleteUserList } from './user-list'; +import FollowRequest, { deleteFollowRequest } from './follow-requests'; const User = db.get<IUser>('users'); @@ -50,7 +51,17 @@ type IUserBase = { data: any; description: string; pinnedNoteId: mongo.ObjectID; + + /** + * 凍結されているか否か + */ isSuspended: boolean; + + /** + * 鍵アカウントか否か + */ + isLocked: boolean; + host: string; }; @@ -240,6 +251,16 @@ export async function deleteUser(user: string | mongo.ObjectID | IUser) { await Following.find({ followeeId: u._id }) ).map(x => deleteFollowing(x))); + // このユーザーのFollowRequestをすべて削除 + await Promise.all(( + await FollowRequest.find({ followerId: u._id }) + ).map(x => deleteFollowRequest(x))); + + // このユーザーへのFollowRequestをすべて削除 + await Promise.all(( + await FollowRequest.find({ followeeId: u._id }) + ).map(x => deleteFollowRequest(x))); + // このユーザーのFollowingLogをすべて削除 await Promise.all(( await FollowingLog.find({ userId: u._id }) From 51929fb60786dbb1af0471e40e834adfe1c37b21 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 31 May 2018 18:11:28 +0900 Subject: [PATCH 101/369] typo --- src/models/{follow-requests.ts => follow-request.ts} | 0 src/models/user.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/models/{follow-requests.ts => follow-request.ts} (100%) diff --git a/src/models/follow-requests.ts b/src/models/follow-request.ts similarity index 100% rename from src/models/follow-requests.ts rename to src/models/follow-request.ts diff --git a/src/models/user.ts b/src/models/user.ts index 8dfd783a9f..aa051517f1 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -22,7 +22,7 @@ import FollowedLog, { deleteFollowedLog } from './followed-log'; import SwSubscription, { deleteSwSubscription } from './sw-subscription'; import Notification, { deleteNotification } from './notification'; import UserList, { deleteUserList } from './user-list'; -import FollowRequest, { deleteFollowRequest } from './follow-requests'; +import FollowRequest, { deleteFollowRequest } from './follow-request'; const User = db.get<IUser>('users'); From bd758a156ef81b628900930731042ee5b0ffb44f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 31 May 2018 18:34:15 +0900 Subject: [PATCH 102/369] wip --- src/remote/activitypub/models/person.ts | 1 + src/remote/activitypub/renderer/person.ts | 4 +++- src/remote/activitypub/type.ts | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts index 33280f3d89..b720c445c6 100644 --- a/src/remote/activitypub/models/person.ts +++ b/src/remote/activitypub/models/person.ts @@ -93,6 +93,7 @@ export async function createPerson(value: any, resolver?: Resolver): Promise<IUs notesCount, name: person.name, driveCapacity: 1024 * 1024 * 8, // 8MiB + isLocked: person.manuallyApprovesFollowers, username: person.preferredUsername, usernameLower: person.preferredUsername.toLowerCase(), host, diff --git a/src/remote/activitypub/renderer/person.ts b/src/remote/activitypub/renderer/person.ts index 424305f8d3..b2ac885f46 100644 --- a/src/remote/activitypub/renderer/person.ts +++ b/src/remote/activitypub/renderer/person.ts @@ -1,8 +1,9 @@ import renderImage from './image'; import renderKey from './key'; import config from '../../../config'; +import { ILocalUser } from '../../../models/user'; -export default user => { +export default (user: ILocalUser) => { const id = `${config.url}/users/${user._id}`; return { @@ -17,6 +18,7 @@ export default user => { summary: user.description, icon: user.avatarId && renderImage({ _id: user.avatarId }), image: user.bannerId && renderImage({ _id: user.bannerId }), + manuallyApprovesFollowers: user.isLocked, publicKey: renderKey(user) }; }; diff --git a/src/remote/activitypub/type.ts b/src/remote/activitypub/type.ts index ca38ec2227..77e6bc3045 100644 --- a/src/remote/activitypub/type.ts +++ b/src/remote/activitypub/type.ts @@ -45,6 +45,7 @@ export interface IPerson extends IObject { type: 'Person'; name: string; preferredUsername: string; + manuallyApprovesFollowers: boolean; inbox: string; publicKey: any; followers: any; From 51255bb4467d7f797686639d785edf0eede846ec Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 31 May 2018 22:56:02 +0900 Subject: [PATCH 103/369] wip --- .../activitypub/kernel/accept/follow.ts | 27 ++++ src/remote/activitypub/kernel/accept/index.ts | 35 +++++ src/remote/activitypub/renderer/follow.ts | 8 +- src/server/api/endpoints/i/update.ts | 47 +++--- src/services/following/create.ts | 141 +++++++++++------- src/services/following/delete.ts | 2 +- .../user/accept-all-follow-requests.ts | 18 +++ src/services/user/accept-follow-request.ts | 64 ++++++++ 8 files changed, 259 insertions(+), 83 deletions(-) create mode 100644 src/remote/activitypub/kernel/accept/follow.ts create mode 100644 src/remote/activitypub/kernel/accept/index.ts create mode 100644 src/services/user/accept-all-follow-requests.ts create mode 100644 src/services/user/accept-follow-request.ts diff --git a/src/remote/activitypub/kernel/accept/follow.ts b/src/remote/activitypub/kernel/accept/follow.ts new file mode 100644 index 0000000000..9d425419ab --- /dev/null +++ b/src/remote/activitypub/kernel/accept/follow.ts @@ -0,0 +1,27 @@ +import * as mongo from 'mongodb'; +import User, { IRemoteUser } from '../../../../models/user'; +import config from '../../../../config'; +import accept from '../../../../services/user/accept-follow-request'; +import { IFollow } from '../../type'; + +export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => { + const id = typeof activity.object == 'string' ? activity.object : activity.object.id; + + if (!id.startsWith(config.url + '/')) { + return null; + } + + const follower = await User.findOne({ + _id: new mongo.ObjectID(id.split('/').pop()) + }); + + if (follower === null) { + throw new Error('follower not found'); + } + + if (follower.host != null) { + throw new Error('フォローリクエストしたユーザーはローカルユーザーではありません'); + } + + await accept(actor, follower); +}; diff --git a/src/remote/activitypub/kernel/accept/index.ts b/src/remote/activitypub/kernel/accept/index.ts new file mode 100644 index 0000000000..b647df022e --- /dev/null +++ b/src/remote/activitypub/kernel/accept/index.ts @@ -0,0 +1,35 @@ +import * as debug from 'debug'; + +import Resolver from '../../resolver'; +import { IRemoteUser } from '../../../../models/user'; +import acceptFollow from './follow'; +import { IAccept } from '../../type'; + +const log = debug('misskey:activitypub'); + +export default async (actor: IRemoteUser, activity: IAccept): Promise<void> => { + const uri = activity.id || activity; + + log(`Accept: ${uri}`); + + const resolver = new Resolver(); + + let object; + + try { + object = await resolver.resolve(activity.object); + } catch (e) { + log(`Resolution failed: ${e}`); + throw e; + } + + switch (object.type) { + case 'Follow': + acceptFollow(resolver, actor, activity, object); + break; + + default: + console.warn(`Unknown accept type: ${object.type}`); + break; + } +}; diff --git a/src/remote/activitypub/renderer/follow.ts b/src/remote/activitypub/renderer/follow.ts index bf8eeff06b..522422bcff 100644 --- a/src/remote/activitypub/renderer/follow.ts +++ b/src/remote/activitypub/renderer/follow.ts @@ -1,8 +1,8 @@ import config from '../../../config'; -import { IRemoteUser, ILocalUser } from '../../../models/user'; +import { IUser, isLocalUser } from '../../../models/user'; -export default (follower: ILocalUser, followee: IRemoteUser) => ({ +export default (follower: IUser, followee: IUser) => ({ type: 'Follow', - actor: `${config.url}/users/${follower._id}`, - object: followee.uri + actor: isLocalUser(follower) ? `${config.url}/users/${follower._id}` : follower.uri, + object: isLocalUser(followee) ? `${config.url}/users/${followee._id}` : followee.uri }); diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 6e0c5b8515..5ca54d013c 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -12,50 +12,57 @@ import DriveFile from '../../../../models/drive-file'; module.exports = async (params, user, app) => new Promise(async (res, rej) => { const isSecure = user != null && app == null; + const updates = {} as any; + // Get 'name' parameter const [name, nameErr] = $.str.optional().nullable().pipe(isValidName).get(params.name); if (nameErr) return rej('invalid name param'); - if (name) user.name = name; + if (name) updates.name = name; // Get 'description' parameter const [description, descriptionErr] = $.str.optional().nullable().pipe(isValidDescription).get(params.description); if (descriptionErr) return rej('invalid description param'); - if (description !== undefined) user.description = description; + if (description !== undefined) updates.description = description; // Get 'location' parameter const [location, locationErr] = $.str.optional().nullable().pipe(isValidLocation).get(params.location); if (locationErr) return rej('invalid location param'); - if (location !== undefined) user.profile.location = location; + if (location !== undefined) updates.profile.location = location; // Get 'birthday' parameter const [birthday, birthdayErr] = $.str.optional().nullable().pipe(isValidBirthday).get(params.birthday); if (birthdayErr) return rej('invalid birthday param'); - if (birthday !== undefined) user.profile.birthday = birthday; + if (birthday !== undefined) updates.profile.birthday = birthday; // Get 'avatarId' parameter const [avatarId, avatarIdErr] = $.type(ID).optional().get(params.avatarId); if (avatarIdErr) return rej('invalid avatarId param'); - if (avatarId) user.avatarId = avatarId; + if (avatarId) updates.avatarId = avatarId; // Get 'bannerId' parameter const [bannerId, bannerIdErr] = $.type(ID).optional().get(params.bannerId); if (bannerIdErr) return rej('invalid bannerId param'); - if (bannerId) user.bannerId = bannerId; + if (bannerId) updates.bannerId = bannerId; + + // Get 'isLocked' parameter + const [isLocked, isLockedErr] = $.bool.optional().get(params.isLocked); + if (isLockedErr) return rej('invalid isLocked param'); + if (isLocked != null) updates.isLocked = isLocked; // Get 'isBot' parameter const [isBot, isBotErr] = $.bool.optional().get(params.isBot); if (isBotErr) return rej('invalid isBot param'); - if (isBot != null) user.isBot = isBot; + if (isBot != null) updates.isBot = isBot; // Get 'isCat' parameter const [isCat, isCatErr] = $.bool.optional().get(params.isCat); if (isCatErr) return rej('invalid isCat param'); - if (isCat != null) user.isCat = isCat; + if (isCat != null) updates.isCat = isCat; // Get 'autoWatch' parameter const [autoWatch, autoWatchErr] = $.bool.optional().get(params.autoWatch); if (autoWatchErr) return rej('invalid autoWatch param'); - if (autoWatch != null) user.settings.autoWatch = autoWatch; + if (autoWatch != null) updates.settings.autoWatch = autoWatch; if (avatarId) { const avatar = await DriveFile.findOne({ @@ -63,7 +70,7 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { }); if (avatar != null && avatar.metadata.properties.avgColor) { - user.avatarColor = avatar.metadata.properties.avgColor; + updates.avatarColor = avatar.metadata.properties.avgColor; } } @@ -73,23 +80,12 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { }); if (banner != null && banner.metadata.properties.avgColor) { - user.bannerColor = banner.metadata.properties.avgColor; + updates.bannerColor = banner.metadata.properties.avgColor; } } await User.update(user._id, { - $set: { - name: user.name, - description: user.description, - avatarId: user.avatarId, - avatarColor: user.avatarColor, - bannerId: user.bannerId, - bannerColor: user.bannerColor, - profile: user.profile, - isBot: user.isBot, - isCat: user.isCat, - settings: user.settings - } + $set: updates }); // Serialize @@ -103,4 +99,9 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { // Publish i updated event event(user._id, 'i_updated', iObj); + + // 鍵垢を解除したとき、溜まっていたフォローリクエストがあるならすべて承認 + if (user.isLocked && isLocked === false) { + acceptAllFollowRequests(user); + } }); diff --git a/src/services/following/create.ts b/src/services/following/create.ts index 3424c55dae..03a8f399e8 100644 --- a/src/services/following/create.ts +++ b/src/services/following/create.ts @@ -8,72 +8,103 @@ import pack from '../../remote/activitypub/renderer'; import renderFollow from '../../remote/activitypub/renderer/follow'; import renderAccept from '../../remote/activitypub/renderer/accept'; import { deliver } from '../../queue'; +import FollowRequest from '../../models/follow-request'; -export default async function(follower: IUser, followee: IUser, activity?) { - const following = await Following.insert({ - createdAt: new Date(), - followerId: follower._id, - followeeId: followee._id, - stalk: true, +export default async function(follower: IUser, followee: IUser) { + if (followee.isLocked) { + await FollowRequest.insert({ + createdAt: new Date(), + followerId: follower._id, + followeeId: followee._id, - // 非正規化 - _follower: { - host: follower.host, - inbox: isRemoteUser(follower) ? follower.inbox : undefined - }, - _followee: { - host: followee.host, - inbox: isRemoteUser(followee) ? followee.inbox : undefined + // 非正規化 + _follower: { + host: follower.host, + inbox: isRemoteUser(follower) ? follower.inbox : undefined + }, + _followee: { + host: followee.host, + inbox: isRemoteUser(followee) ? followee.inbox : undefined + } + }); + + // Publish reciveRequest event + if (isLocalUser(followee)) { + packUser(follower, followee).then(packed => event(followee._id, 'reciveRequest', packed)), + + // 通知を作成 + notify(followee._id, follower._id, 'reciveRequest'); } - }); - //#region Increment following count - User.update({ _id: follower._id }, { - $inc: { - followingCount: 1 + if (isLocalUser(follower) && isRemoteUser(followee)) { + const content = pack(renderFollow(follower, followee)); + deliver(follower, content, followee.inbox); } - }); + } else { + const following = await Following.insert({ + createdAt: new Date(), + followerId: follower._id, + followeeId: followee._id, - FollowingLog.insert({ - createdAt: following.createdAt, - userId: follower._id, - count: follower.followingCount + 1 - }); - //#endregion + // 非正規化 + _follower: { + host: follower.host, + inbox: isRemoteUser(follower) ? follower.inbox : undefined + }, + _followee: { + host: followee.host, + inbox: isRemoteUser(followee) ? followee.inbox : undefined + } + }); - //#region Increment followers count - User.update({ _id: followee._id }, { - $inc: { - followersCount: 1 + //#region Increment following count + User.update({ _id: follower._id }, { + $inc: { + followingCount: 1 + } + }); + + FollowingLog.insert({ + createdAt: following.createdAt, + userId: follower._id, + count: follower.followingCount + 1 + }); + //#endregion + + //#region Increment followers count + User.update({ _id: followee._id }, { + $inc: { + followersCount: 1 + } + }); + FollowedLog.insert({ + createdAt: following.createdAt, + userId: followee._id, + count: followee.followersCount + 1 + }); + //#endregion + + // Publish follow event + if (isLocalUser(follower)) { + packUser(followee, follower).then(packed => event(follower._id, 'follow', packed)); } - }); - FollowedLog.insert({ - createdAt: following.createdAt, - userId: followee._id, - count: followee.followersCount + 1 - }); - //#endregion - // Publish follow event - if (isLocalUser(follower)) { - packUser(followee, follower).then(packed => event(follower._id, 'follow', packed)); - } + // Publish followed event + if (isLocalUser(followee)) { + packUser(follower, followee).then(packed => event(followee._id, 'followed', packed)), - // Publish followed event - if (isLocalUser(followee)) { - packUser(follower, followee).then(packed => event(followee._id, 'followed', packed)), + // 通知を作成 + notify(followee._id, follower._id, 'follow'); + } - // 通知を作成 - notify(followee._id, follower._id, 'follow'); - } + if (isLocalUser(follower) && isRemoteUser(followee)) { + const content = pack(renderFollow(follower, followee)); + deliver(follower, content, followee.inbox); + } - if (isLocalUser(follower) && isRemoteUser(followee)) { - const content = pack(renderFollow(follower, followee)); - deliver(follower, content, followee.inbox); - } - - if (isRemoteUser(follower) && isLocalUser(followee)) { - const content = pack(renderAccept(activity)); - deliver(followee, content, follower.inbox); + if (isRemoteUser(follower) && isLocalUser(followee)) { + const content = pack(renderAccept(renderFollow(follower, followee))); + deliver(followee, content, follower.inbox); + } } } diff --git a/src/services/following/delete.ts b/src/services/following/delete.ts index c0c99fbed5..4fc5d42476 100644 --- a/src/services/following/delete.ts +++ b/src/services/following/delete.ts @@ -8,7 +8,7 @@ import renderFollow from '../../remote/activitypub/renderer/follow'; import renderUndo from '../../remote/activitypub/renderer/undo'; import { deliver } from '../../queue'; -export default async function(follower: IUser, followee: IUser, activity?) { +export default async function(follower: IUser, followee: IUser) { const following = await Following.findOne({ followerId: follower._id, followeeId: followee._id diff --git a/src/services/user/accept-all-follow-requests.ts b/src/services/user/accept-all-follow-requests.ts new file mode 100644 index 0000000000..fbb221e772 --- /dev/null +++ b/src/services/user/accept-all-follow-requests.ts @@ -0,0 +1,18 @@ +import User, { IUser } from "../../models/user"; +import FollowRequest from "../../models/follow-request"; +import accept from './accept-follow-request'; + +/** + * 指定したユーザー宛てのフォローリクエストをすべて承認 + * @param user ユーザー + */ +export default async function(user: IUser) { + const requests = await FollowRequest.find({ + followeeId: user._id + }); + + requests.forEach(async request => { + const follower = await User.findOne({ _id: request.followerId }); + accept(user, follower); + }); +} diff --git a/src/services/user/accept-follow-request.ts b/src/services/user/accept-follow-request.ts new file mode 100644 index 0000000000..8b5c82c84e --- /dev/null +++ b/src/services/user/accept-follow-request.ts @@ -0,0 +1,64 @@ +import User, { IUser, isRemoteUser, ILocalUser } from "../../models/user"; +import FollowRequest from "../../models/follow-request"; +import pack from '../../remote/activitypub/renderer'; +import renderFollow from '../../remote/activitypub/renderer/follow'; +import renderAccept from '../../remote/activitypub/renderer/accept'; +import { deliver } from '../../queue'; +import Following from "../../models/following"; +import FollowingLog from "../../models/following-log"; +import FollowedLog from "../../models/followed-log"; + +export default async function(followee: IUser, follower: IUser) { + const following = await Following.insert({ + createdAt: new Date(), + followerId: follower._id, + followeeId: followee._id, + + // 非正規化 + _follower: { + host: follower.host, + inbox: isRemoteUser(follower) ? follower.inbox : undefined + }, + _followee: { + host: followee.host, + inbox: isRemoteUser(followee) ? followee.inbox : undefined + } + }); + + if (isRemoteUser(follower)) { + const content = pack(renderAccept(renderFollow(follower, followee))); + deliver(followee as ILocalUser, content, follower.inbox); + } + + FollowRequest.remove({ + followeeId: followee._id, + followerId: follower._id + }); + + //#region Increment following count + User.update({ _id: follower._id }, { + $inc: { + followingCount: 1 + } + }); + + FollowingLog.insert({ + createdAt: following.createdAt, + userId: follower._id, + count: follower.followingCount + 1 + }); + //#endregion + + //#region Increment followers count + User.update({ _id: followee._id }, { + $inc: { + followersCount: 1 + } + }); + FollowedLog.insert({ + createdAt: following.createdAt, + userId: followee._id, + count: followee.followersCount + 1 + }); + //#endregion +} From 35115607bc7eb1ff974c7f7c4d9f14bc8377ee6e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 1 Jun 2018 00:42:37 +0900 Subject: [PATCH 104/369] wip --- src/models/user.ts | 13 ++++++- src/remote/activitypub/kernel/accept/index.ts | 2 +- src/remote/activitypub/kernel/index.ts | 8 ++++- .../activitypub/kernel/reject/follow.ts | 27 ++++++++++++++ src/remote/activitypub/kernel/reject/index.ts | 35 +++++++++++++++++++ src/remote/activitypub/renderer/reject.ts | 4 +++ src/remote/activitypub/type.ts | 5 +++ .../api/endpoints/users/recommendation.ts | 1 + src/services/user/reject-follow-request.ts | 18 ++++++++++ 9 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 src/remote/activitypub/kernel/reject/follow.ts create mode 100644 src/remote/activitypub/kernel/reject/index.ts create mode 100644 src/remote/activitypub/renderer/reject.ts create mode 100644 src/services/user/reject-follow-request.ts diff --git a/src/models/user.ts b/src/models/user.ts index aa051517f1..4186241a59 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -416,7 +416,7 @@ export const pack = ( } if (meId && !meId.equals(_user.id)) { - const [following1, following2, mute] = await Promise.all([ + const [following1, following2, followReq1, followReq2, mute] = await Promise.all([ Following.findOne({ followerId: meId, followeeId: _user.id @@ -425,6 +425,14 @@ export const pack = ( followerId: _user.id, followeeId: meId }), + _user.isLocked ? FollowRequest.findOne({ + followerId: meId, + followeeId: _user.id + }) : Promise.resolve(null), + FollowRequest.findOne({ + followerId: _user.id, + followeeId: meId + }), Mute.findOne({ muterId: meId, muteeId: _user.id @@ -435,6 +443,9 @@ export const pack = ( _user.isFollowing = following1 !== null; _user.isStalking = following1 && following1.stalk; + _user.hasPendingFollowRequestFromYou = followReq1 !== null; + _user.hasPendingFollowRequestToYou = followReq2 !== null; + // Whether the user is followed _user.isFollowed = following2 !== null; diff --git a/src/remote/activitypub/kernel/accept/index.ts b/src/remote/activitypub/kernel/accept/index.ts index b647df022e..2f9d646d14 100644 --- a/src/remote/activitypub/kernel/accept/index.ts +++ b/src/remote/activitypub/kernel/accept/index.ts @@ -25,7 +25,7 @@ export default async (actor: IRemoteUser, activity: IAccept): Promise<void> => { switch (object.type) { case 'Follow': - acceptFollow(resolver, actor, activity, object); + acceptFollow(actor, object); break; default: diff --git a/src/remote/activitypub/kernel/index.ts b/src/remote/activitypub/kernel/index.ts index 15ea9494ae..752a9bd2e2 100644 --- a/src/remote/activitypub/kernel/index.ts +++ b/src/remote/activitypub/kernel/index.ts @@ -6,6 +6,8 @@ import follow from './follow'; import undo from './undo'; import like from './like'; import announce from './announce'; +import accept from './accept'; +import reject from './reject'; const self = async (actor: IRemoteUser, activity: Object): Promise<void> => { switch (activity.type) { @@ -22,7 +24,11 @@ const self = async (actor: IRemoteUser, activity: Object): Promise<void> => { break; case 'Accept': - // noop + await accept(actor, activity); + break; + + case 'Reject': + await reject(actor, activity); break; case 'Announce': diff --git a/src/remote/activitypub/kernel/reject/follow.ts b/src/remote/activitypub/kernel/reject/follow.ts new file mode 100644 index 0000000000..862f3def3b --- /dev/null +++ b/src/remote/activitypub/kernel/reject/follow.ts @@ -0,0 +1,27 @@ +import * as mongo from 'mongodb'; +import User, { IRemoteUser } from '../../../../models/user'; +import config from '../../../../config'; +import reject from '../../../../services/user/reject-follow-request'; +import { IFollow } from '../../type'; + +export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => { + const id = typeof activity.object == 'string' ? activity.object : activity.object.id; + + if (!id.startsWith(config.url + '/')) { + return null; + } + + const follower = await User.findOne({ + _id: new mongo.ObjectID(id.split('/').pop()) + }); + + if (follower === null) { + throw new Error('follower not found'); + } + + if (follower.host != null) { + throw new Error('フォローリクエストしたユーザーはローカルユーザーではありません'); + } + + await reject(actor, follower); +}; diff --git a/src/remote/activitypub/kernel/reject/index.ts b/src/remote/activitypub/kernel/reject/index.ts new file mode 100644 index 0000000000..a82c3fd61e --- /dev/null +++ b/src/remote/activitypub/kernel/reject/index.ts @@ -0,0 +1,35 @@ +import * as debug from 'debug'; + +import Resolver from '../../resolver'; +import { IRemoteUser } from '../../../../models/user'; +import rejectFollow from './follow'; +import { IReject } from '../../type'; + +const log = debug('misskey:activitypub'); + +export default async (actor: IRemoteUser, activity: IReject): Promise<void> => { + const uri = activity.id || activity; + + log(`Reject: ${uri}`); + + const resolver = new Resolver(); + + let object; + + try { + object = await resolver.resolve(activity.object); + } catch (e) { + log(`Resolution failed: ${e}`); + throw e; + } + + switch (object.type) { + case 'Follow': + rejectFollow(actor, object); + break; + + default: + console.warn(`Unknown reject type: ${object.type}`); + break; + } +}; diff --git a/src/remote/activitypub/renderer/reject.ts b/src/remote/activitypub/renderer/reject.ts new file mode 100644 index 0000000000..29c998a6b4 --- /dev/null +++ b/src/remote/activitypub/renderer/reject.ts @@ -0,0 +1,4 @@ +export default object => ({ + type: 'Reject', + object +}); diff --git a/src/remote/activitypub/type.ts b/src/remote/activitypub/type.ts index 77e6bc3045..13e1969b4e 100644 --- a/src/remote/activitypub/type.ts +++ b/src/remote/activitypub/type.ts @@ -83,6 +83,10 @@ export interface IAccept extends IActivity { type: 'Accept'; } +export interface IReject extends IActivity { + type: 'Reject'; +} + export interface ILike extends IActivity { type: 'Like'; _misskey_reaction: string; @@ -100,5 +104,6 @@ export type Object = IUndo | IFollow | IAccept | + IReject | ILike | IAnnounce; diff --git a/src/server/api/endpoints/users/recommendation.ts b/src/server/api/endpoints/users/recommendation.ts index 620ae17ca2..23821a552f 100644 --- a/src/server/api/endpoints/users/recommendation.ts +++ b/src/server/api/endpoints/users/recommendation.ts @@ -36,6 +36,7 @@ module.exports = (params, me) => new Promise(async (res, rej) => { _id: { $nin: followingIds.concat(mutedUserIds) }, + isLocked: false, $or: [{ lastUsedAt: { $gte: new Date(Date.now() - ms('7days')) diff --git a/src/services/user/reject-follow-request.ts b/src/services/user/reject-follow-request.ts new file mode 100644 index 0000000000..32965a1556 --- /dev/null +++ b/src/services/user/reject-follow-request.ts @@ -0,0 +1,18 @@ +import User, { IUser, isRemoteUser, ILocalUser } from "../../models/user"; +import FollowRequest from "../../models/follow-request"; +import pack from '../../remote/activitypub/renderer'; +import renderFollow from '../../remote/activitypub/renderer/follow'; +import renderReject from '../../remote/activitypub/renderer/reject'; +import { deliver } from '../../queue'; + +export default async function(followee: IUser, follower: IUser) { + if (isRemoteUser(follower)) { + const content = pack(renderReject(renderFollow(follower, followee))); + deliver(followee as ILocalUser, content, follower.inbox); + } + + FollowRequest.remove({ + followeeId: followee._id, + followerId: follower._id + }); +} From bae44b47086d8a0f0c8f96254b9453a29490a508 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 1 Jun 2018 01:12:02 +0900 Subject: [PATCH 105/369] wip --- src/models/user.ts | 5 +++++ src/server/api/endpoints/i/update.ts | 1 + src/services/following/create.ts | 6 ++++++ src/services/user/accept-all-follow-requests.ts | 6 ++++++ src/services/user/reject-follow-request.ts | 8 +++++++- 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/models/user.ts b/src/models/user.ts index 4186241a59..0e06512dae 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -62,6 +62,11 @@ type IUserBase = { */ isLocked: boolean; + /** + * このアカウントに届いているフォローリクエストの数 + */ + pendingReceivedFollowRequestsCount: number; + host: string; }; diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 5ca54d013c..103cd3ac36 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -5,6 +5,7 @@ import $ from 'cafy'; import ID from '../../../../cafy-id'; import User, { isValidName, isValidDescription, isValidLocation, isValidBirthday, pack } from '../../../../models/user'; import event from '../../../../publishers/stream'; import DriveFile from '../../../../models/drive-file'; +import acceptAllFollowRequests from '../../../../services/user/accept-all-follow-requests'; /** * Update myself diff --git a/src/services/following/create.ts b/src/services/following/create.ts index 03a8f399e8..39cecfddfb 100644 --- a/src/services/following/create.ts +++ b/src/services/following/create.ts @@ -28,6 +28,12 @@ export default async function(follower: IUser, followee: IUser) { } }); + User.update({ _id: followee._id }, { + $inc: { + pendingReceivedFollowRequestsCount: 1 + } + }); + // Publish reciveRequest event if (isLocalUser(followee)) { packUser(follower, followee).then(packed => event(followee._id, 'reciveRequest', packed)), diff --git a/src/services/user/accept-all-follow-requests.ts b/src/services/user/accept-all-follow-requests.ts index fbb221e772..397a0d7ec2 100644 --- a/src/services/user/accept-all-follow-requests.ts +++ b/src/services/user/accept-all-follow-requests.ts @@ -15,4 +15,10 @@ export default async function(user: IUser) { const follower = await User.findOne({ _id: request.followerId }); accept(user, follower); }); + + User.update({ _id: user._id }, { + $set: { + pendingReceivedFollowRequestsCount: 0 + } + }); } diff --git a/src/services/user/reject-follow-request.ts b/src/services/user/reject-follow-request.ts index 32965a1556..c6388f53e1 100644 --- a/src/services/user/reject-follow-request.ts +++ b/src/services/user/reject-follow-request.ts @@ -11,8 +11,14 @@ export default async function(followee: IUser, follower: IUser) { deliver(followee as ILocalUser, content, follower.inbox); } - FollowRequest.remove({ + await FollowRequest.remove({ followeeId: followee._id, followerId: follower._id }); + + User.update({ _id: followee._id }, { + $inc: { + pendingReceivedFollowRequestsCount: -1 + } + }); } From 0be790fa31d28f7efc0d0b5b847c5c93a60f0dbd Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 1 Jun 2018 21:55:27 +0900 Subject: [PATCH 106/369] wip --- .../views/components/notifications.vue | 21 +++++++++++ .../views/components/notification-preview.vue | 35 ++++++++++++------- .../mobile/views/components/notification.vue | 15 ++++++++ src/server/api/endpoints.ts | 10 ++++++ .../api/endpoints/following/request/accept.ts | 26 ++++++++++++++ .../api/endpoints/following/request/reject.ts | 26 ++++++++++++++ 6 files changed, 120 insertions(+), 13 deletions(-) create mode 100644 src/server/api/endpoints/following/request/accept.ts create mode 100644 src/server/api/endpoints/following/request/reject.ts diff --git a/src/client/app/desktop/views/components/notifications.vue b/src/client/app/desktop/views/components/notifications.vue index 5564dad623..aff21b14d8 100644 --- a/src/client/app/desktop/views/components/notifications.vue +++ b/src/client/app/desktop/views/components/notifications.vue @@ -5,6 +5,7 @@ <template v-for="(notification, i) in _notifications"> <div class="notification" :class="notification.type" :key="notification.id"> <mk-time :time="notification.createdAt"/> + <template v-if="notification.type == 'reaction'"> <mk-avatar class="avatar" :user="notification.user"/> <div class="text"> @@ -17,6 +18,7 @@ </router-link> </div> </template> + <template v-if="notification.type == 'renote'"> <mk-avatar class="avatar" :user="notification.note.user"/> <div class="text"> @@ -28,6 +30,7 @@ </router-link> </div> </template> + <template v-if="notification.type == 'quote'"> <mk-avatar class="avatar" :user="notification.note.user"/> <div class="text"> @@ -37,6 +40,7 @@ <router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link> </div> </template> + <template v-if="notification.type == 'follow'"> <mk-avatar class="avatar" :user="notification.user"/> <div class="text"> @@ -45,6 +49,16 @@ </p> </div> </template> + + <template v-if="notification.type == 'followRequest'"> + <mk-avatar class="avatar" :user="notification.user"/> + <div class="text"> + <p>%fa:user-clock% + <router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link> + </p> + </div> + </template> + <template v-if="notification.type == 'reply'"> <mk-avatar class="avatar" :user="notification.note.user"/> <div class="text"> @@ -54,6 +68,7 @@ <router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link> </div> </template> + <template v-if="notification.type == 'mention'"> <mk-avatar class="avatar" :user="notification.note.user"/> <div class="text"> @@ -63,6 +78,7 @@ <a class="note-preview" :href="notification.note | notePage">{{ getNoteSummary(notification.note) }}</a> </div> </template> + <template v-if="notification.type == 'poll_vote'"> <mk-avatar class="avatar" :user="notification.user"/> <div class="text"> @@ -73,6 +89,7 @@ </div> </template> </div> + <p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'"> <span>%fa:angle-up%{{ notification._datetext }}</span> <span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span> @@ -251,6 +268,10 @@ root(isDark) .text p i color #53c7ce + &.followRequest + .text p i + color #888 + &.reply, &.mention .text p i color #555 diff --git a/src/client/app/mobile/views/components/notification-preview.vue b/src/client/app/mobile/views/components/notification-preview.vue index d39b2fbf9f..b1f6fd1495 100644 --- a/src/client/app/mobile/views/components/notification-preview.vue +++ b/src/client/app/mobile/views/components/notification-preview.vue @@ -1,7 +1,7 @@ <template> <div class="mk-notification-preview" :class="notification.type"> <template v-if="notification.type == 'reaction'"> - <img class="avatar" :src="`${notification.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/> + <mk-avatar class="avatar" :user="notification.user"/> <div class="text"> <p><mk-reaction-icon :reaction="notification.reaction"/>{{ notification.user | userName }}</p> <p class="note-ref">%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%</p> @@ -9,7 +9,7 @@ </template> <template v-if="notification.type == 'renote'"> - <img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/> + <mk-avatar class="avatar" :user="notification.note.user"/> <div class="text"> <p>%fa:retweet%{{ notification.note.user | userName }}</p> <p class="note-ref">%fa:quote-left%{{ getNoteSummary(notification.note.renote) }}%fa:quote-right%</p> @@ -17,7 +17,7 @@ </template> <template v-if="notification.type == 'quote'"> - <img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/> + <mk-avatar class="avatar" :user="notification.note.user"/> <div class="text"> <p>%fa:quote-left%{{ notification.note.user | userName }}</p> <p class="note-preview">{{ getNoteSummary(notification.note) }}</p> @@ -25,14 +25,21 @@ </template> <template v-if="notification.type == 'follow'"> - <img class="avatar" :src="`${notification.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/> + <mk-avatar class="avatar" :user="notification.user"/> <div class="text"> <p>%fa:user-plus%{{ notification.user | userName }}</p> </div> </template> + <template v-if="notification.type == 'followRequest'"> + <mk-avatar class="avatar" :user="notification.user"/> + <div class="text"> + <p>%fa:user-clock%{{ notification.user | userName }}</p> + </div> + </template> + <template v-if="notification.type == 'reply'"> - <img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/> + <mk-avatar class="avatar" :user="notification.note.user"/> <div class="text"> <p>%fa:reply%{{ notification.note.user | userName }}</p> <p class="note-preview">{{ getNoteSummary(notification.note) }}</p> @@ -40,7 +47,7 @@ </template> <template v-if="notification.type == 'mention'"> - <img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/> + <mk-avatar class="avatar" :user="notification.note.user"/> <div class="text"> <p>%fa:at%{{ notification.note.user | userName }}</p> <p class="note-preview">{{ getNoteSummary(notification.note) }}</p> @@ -48,7 +55,7 @@ </template> <template v-if="notification.type == 'poll_vote'"> - <img class="avatar" :src="`${notification.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/> + <mk-avatar class="avatar" :user="notification.user"/> <div class="text"> <p>%fa:chart-pie%{{ notification.user | userName }}</p> <p class="note-ref">%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%</p> @@ -83,16 +90,14 @@ export default Vue.extend({ display block clear both - img + > .avatar display block float left - min-width 36px - min-height 36px - max-width 36px - max-height 36px + width 36px + height 36px border-radius 6px - .text + > .text float right width calc(100% - 36px) padding-left 8px @@ -120,6 +125,10 @@ export default Vue.extend({ .text p i color #53c7ce + &.followRequest + .text p i + color #888 + &.reply, &.mention .text p i color #fff diff --git a/src/client/app/mobile/views/components/notification.vue b/src/client/app/mobile/views/components/notification.vue index c1b37563ce..da69fc79cc 100644 --- a/src/client/app/mobile/views/components/notification.vue +++ b/src/client/app/mobile/views/components/notification.vue @@ -40,6 +40,17 @@ </div> </div> + <div class="notification followRequest" v-if="notification.type == 'followRequest'"> + <mk-avatar class="avatar" :user="notification.user"/> + <div> + <header> + %fa:user-clock% + <router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link> + <mk-time :time="notification.createdAt"/> + </header> + </div> + </div> + <div class="notification poll_vote" v-if="notification.type == 'poll_vote'"> <mk-avatar class="avatar" :user="notification.user"/> <div> @@ -156,6 +167,10 @@ root(isDark) > div > header i color #53c7ce + &.followRequest + > div > header i + color #888 + .mk-notification[data-darkmode] root(true) diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts index 196f3adebc..bd8f30b38f 100644 --- a/src/server/api/endpoints.ts +++ b/src/server/api/endpoints.ts @@ -448,6 +448,16 @@ const endpoints: Endpoint[] = [ }, kind: 'following-write' }, + { + name: 'following/request/accept', + withCredential: true, + kind: 'following-write' + }, + { + name: 'following/request/reject', + withCredential: true, + kind: 'following-write' + }, { name: 'following/stalk', withCredential: true, diff --git a/src/server/api/endpoints/following/request/accept.ts b/src/server/api/endpoints/following/request/accept.ts new file mode 100644 index 0000000000..bf0aff4b77 --- /dev/null +++ b/src/server/api/endpoints/following/request/accept.ts @@ -0,0 +1,26 @@ +import $ from 'cafy'; import ID from '../../../../../cafy-id'; +import acceptFollowRequest from '../../../../../services/user/accept-follow-request'; +import User from '../../../../../models/user'; + +/** + * Accept a follow request + */ +module.exports = (params, user) => new Promise(async (res, rej) => { + // Get 'followerId' parameter + const [followerId, followerIdErr] = $.type(ID).get(params.followerId); + if (followerIdErr) return rej('invalid followerId param'); + + // Fetch follower + const follower = await User.findOne({ + _id: followerId + }); + + if (follower === null) { + return rej('follower not found'); + } + + await acceptFollowRequest(user, follower); + + // Send response + res(); +}); diff --git a/src/server/api/endpoints/following/request/reject.ts b/src/server/api/endpoints/following/request/reject.ts new file mode 100644 index 0000000000..5a995e1962 --- /dev/null +++ b/src/server/api/endpoints/following/request/reject.ts @@ -0,0 +1,26 @@ +import $ from 'cafy'; import ID from '../../../../../cafy-id'; +import rejectFollowRequest from '../../../../../services/user/reject-follow-request'; +import User from '../../../../../models/user'; + +/** + * Reject a follow request + */ +module.exports = (params, user) => new Promise(async (res, rej) => { + // Get 'followerId' parameter + const [followerId, followerIdErr] = $.type(ID).get(params.followerId); + if (followerIdErr) return rej('invalid followerId param'); + + // Fetch follower + const follower = await User.findOne({ + _id: followerId + }); + + if (follower === null) { + return rej('follower not found'); + } + + await rejectFollowRequest(user, follower); + + // Send response + res(); +}); From 924119651ad5b1d812d7744eb16649b4bd94d8f0 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 1 Jun 2018 23:37:19 +0900 Subject: [PATCH 107/369] Merge branch 'master' into locked-account --- locales/en.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locales/en.yml b/locales/en.yml index 089070b5b8..b223f677dc 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -5,7 +5,7 @@ meta: common: misskey: "A planet of fediverse" about-title: "A ⭐ of fediverse." - about: "Thanks for finding Misskey. Misskey is a <b>decentralized microblogging social media platform</b>. Because it exists within Fediverse (a universe which organizes various social media platforms), you can reciprocally link with other social media platforms. Why don't you get away from the hustle and bustle of the city for a while, and dive into a new Internet?" + about: "Thanks for finding Misskey. Misskey is a <b>decentralized microblogging platform</b> born on Earth. Since it exists within Fediverse (a universe where various social media platforms are organized) it is mutually linked with other social media platforms. Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?" time: unknown: "unknown" future: "future" @@ -438,11 +438,11 @@ desktop/views/components/settings.vue: do-update: "Check for update" update-settings: "Advanced settings" prevent-update: "Postpone updates (not recommended)" - prevent-update-desc: "You may reflect updates even if you select this setting. This setting is valid only this device." + prevent-update-desc: "Even if you turn this setting on updates may apply. This setting is valid only for this device." no-updates: "No updates available" no-updates-desc: "Your Misskey is up to date." update-available: "New version is available!" - update-available-desc: "To reload the page and updates are applied." + update-available-desc: "The updates will apply if you reload the page again." advanced-settings: "Advanced" debug-mode: "Enable the debug mode" debug-mode-desc: "This setting is stored in the browser." @@ -477,7 +477,7 @@ desktop/views/components/settings.api.vue: token: "Token:" enter-password: "Please enter the password" desktop/views/components/settings.apps.vue: - no-apps: "No authorized apps" + no-apps: "No linked applications" desktop/views/components/settings.mute.vue: no-users: "No muted users" desktop/views/components/settings.password.vue: From 484d17f53f26ff3e8961d86f03ef94f62f8f62ed Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 2 Jun 2018 00:15:17 +0900 Subject: [PATCH 108/369] wip --- .../mobile/views/components/follow-button.vue | 49 ++++++++++++------- src/client/app/mobile/views/pages/user.vue | 1 - .../activitypub/kernel/accept/follow.ts | 2 +- src/remote/activitypub/kernel/follow.ts | 2 +- .../activitypub/kernel/reject/follow.ts | 2 +- src/remote/activitypub/kernel/undo/follow.ts | 2 +- src/server/activitypub.ts | 19 +++++-- src/server/api/endpoints.ts | 4 +- .../following/{request => requests}/accept.ts | 2 +- .../following/{request => requests}/reject.ts | 2 +- src/server/api/endpoints/i/update.ts | 2 +- .../requests/accept-all.ts} | 6 +-- .../requests/accept.ts} | 18 +++---- .../requests/reject.ts} | 12 ++--- 14 files changed, 73 insertions(+), 50 deletions(-) rename src/server/api/endpoints/following/{request => requests}/accept.ts (87%) rename src/server/api/endpoints/following/{request => requests}/reject.ts (87%) rename src/services/{user/accept-all-follow-requests.ts => following/requests/accept-all.ts} (75%) rename src/services/{user/accept-follow-request.ts => following/requests/accept.ts} (68%) rename src/services/{user/reject-follow-request.ts => following/requests/reject.ts} (52%) diff --git a/src/client/app/mobile/views/components/follow-button.vue b/src/client/app/mobile/views/components/follow-button.vue index a6b5cf0556..9c363d7164 100644 --- a/src/client/app/mobile/views/components/follow-button.vue +++ b/src/client/app/mobile/views/components/follow-button.vue @@ -1,13 +1,16 @@ <template> <button class="mk-follow-button" - :class="{ wait: wait, follow: !user.isFollowing, unfollow: user.isFollowing }" + :class="{ wait: wait, following: user.isFollowing, unfollow: user.isFollowing }" @click="onClick" :disabled="wait" > - <template v-if="!wait && user.isFollowing">%fa:minus%</template> - <template v-if="!wait && !user.isFollowing">%fa:plus%</template> - <template v-if="wait">%fa:spinner .pulse .fw%</template> - {{ user.isFollowing ? '%i18n:@unfollow%' : '%i18n:@follow%' }} + <template v-if="!wait"> + <template v-if="user.hasPendingFollowRequestFromYou">%fa:hourglass-half% %i18n:@request-pending%</template> + <template v-else-if="user.isFollowing">%fa:minus% %i18n:@unfollow%</template> + <template v-else-if="!user.isFollowing && user.isLocked">%fa:plus% %i18n:@follow-request%</template> + <template v-else-if="!user.isFollowing && !user.isLocked">%fa:plus% %i18n:@follow%</template> + </template> + <template v-else>%fa:spinner .pulse .fw%</template> </button> </template> @@ -66,15 +69,27 @@ export default Vue.extend({ this.wait = false; }); } else { - (this as any).api('following/create', { - userId: this.user.id - }).then(() => { - this.user.isFollowing = true; - }).catch(err => { - console.error(err); - }).then(() => { - this.wait = false; - }); + if (this.user.isLocked && this.user.hasPendingFollowRequestFromYou) { + (this as any).api('following/requests/cancel', { + userId: this.user.id + }).then(() => { + this.user.hasPendingFollowRequestFromYou = false; + }).catch(err => { + console.error(err); + }).then(() => { + this.wait = false; + }); + } else { + (this as any).api('following/create', { + userId: this.user.id + }).then(() => { + this.user.isFollowing = true; + }).catch(err => { + console.error(err); + }).then(() => { + this.wait = false; + }); + } } } } @@ -90,11 +105,11 @@ export default Vue.extend({ cursor pointer padding 0 16px margin 0 - height inherit - font-size 16px + line-height 36px + font-size 14px outline none border solid 1px $theme-color - border-radius 4px + border-radius 36px * pointer-events none diff --git a/src/client/app/mobile/views/pages/user.vue b/src/client/app/mobile/views/pages/user.vue index b3b820650c..3d37015906 100644 --- a/src/client/app/mobile/views/pages/user.vue +++ b/src/client/app/mobile/views/pages/user.vue @@ -184,7 +184,6 @@ root(isDark) > .mk-follow-button float right - height 40px > .title margin 8px 0 diff --git a/src/remote/activitypub/kernel/accept/follow.ts b/src/remote/activitypub/kernel/accept/follow.ts index 9d425419ab..0f414ba321 100644 --- a/src/remote/activitypub/kernel/accept/follow.ts +++ b/src/remote/activitypub/kernel/accept/follow.ts @@ -1,7 +1,7 @@ import * as mongo from 'mongodb'; import User, { IRemoteUser } from '../../../../models/user'; import config from '../../../../config'; -import accept from '../../../../services/user/accept-follow-request'; +import accept from '../../../../services/following/requests/accept'; import { IFollow } from '../../type'; export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => { diff --git a/src/remote/activitypub/kernel/follow.ts b/src/remote/activitypub/kernel/follow.ts index 7e31eb32ea..464f8582b7 100644 --- a/src/remote/activitypub/kernel/follow.ts +++ b/src/remote/activitypub/kernel/follow.ts @@ -23,5 +23,5 @@ export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => { throw new Error('フォローしようとしているユーザーはローカルユーザーではありません'); } - await follow(actor, followee, activity); + await follow(actor, followee); }; diff --git a/src/remote/activitypub/kernel/reject/follow.ts b/src/remote/activitypub/kernel/reject/follow.ts index 862f3def3b..c139865d0e 100644 --- a/src/remote/activitypub/kernel/reject/follow.ts +++ b/src/remote/activitypub/kernel/reject/follow.ts @@ -1,7 +1,7 @@ import * as mongo from 'mongodb'; import User, { IRemoteUser } from '../../../../models/user'; import config from '../../../../config'; -import reject from '../../../../services/user/reject-follow-request'; +import reject from '../../../../services/following/requests/reject'; import { IFollow } from '../../type'; export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => { diff --git a/src/remote/activitypub/kernel/undo/follow.ts b/src/remote/activitypub/kernel/undo/follow.ts index c0b10c1898..763d5723c4 100644 --- a/src/remote/activitypub/kernel/undo/follow.ts +++ b/src/remote/activitypub/kernel/undo/follow.ts @@ -23,5 +23,5 @@ export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => { throw new Error('フォロー解除しようとしているユーザーはローカルユーザーではありません'); } - await unfollow(actor, followee, activity); + await unfollow(actor, followee); }; diff --git a/src/server/activitypub.ts b/src/server/activitypub.ts index 3c07a3e2f2..c846e28c07 100644 --- a/src/server/activitypub.ts +++ b/src/server/activitypub.ts @@ -7,7 +7,7 @@ const httpSignature = require('http-signature'); import { createHttp } from '../queue'; import pack from '../remote/activitypub/renderer'; import Note from '../models/note'; -import User, { isLocalUser } from '../models/user'; +import User, { isLocalUser, ILocalUser } from '../models/user'; import renderNote from '../remote/activitypub/renderer/note'; import renderKey from '../remote/activitypub/renderer/key'; import renderPerson from '../remote/activitypub/renderer/person'; @@ -69,7 +69,10 @@ router.get('/notes/:note', async (ctx, next) => { router.get('/users/:user/outbox', async ctx => { const userId = new mongo.ObjectID(ctx.params.user); - const user = await User.findOne({ _id: userId }); + const user = await User.findOne({ + _id: userId, + host: null + }); if (user === null) { ctx.status = 404; @@ -91,7 +94,10 @@ router.get('/users/:user/outbox', async ctx => { router.get('/users/:user/publickey', async ctx => { const userId = new mongo.ObjectID(ctx.params.user); - const user = await User.findOne({ _id: userId }); + const user = await User.findOne({ + _id: userId, + host: null + }); if (user === null) { ctx.status = 404; @@ -109,14 +115,17 @@ router.get('/users/:user/publickey', async ctx => { router.get('/users/:user', async ctx => { const userId = new mongo.ObjectID(ctx.params.user); - const user = await User.findOne({ _id: userId }); + const user = await User.findOne({ + _id: userId, + host: null + }); if (user === null) { ctx.status = 404; return; } - ctx.body = pack(renderPerson(user)); + ctx.body = pack(renderPerson(user as ILocalUser)); }); // follow form diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts index bd8f30b38f..ad51a249bf 100644 --- a/src/server/api/endpoints.ts +++ b/src/server/api/endpoints.ts @@ -449,12 +449,12 @@ const endpoints: Endpoint[] = [ kind: 'following-write' }, { - name: 'following/request/accept', + name: 'following/requests/accept', withCredential: true, kind: 'following-write' }, { - name: 'following/request/reject', + name: 'following/requests/reject', withCredential: true, kind: 'following-write' }, diff --git a/src/server/api/endpoints/following/request/accept.ts b/src/server/api/endpoints/following/requests/accept.ts similarity index 87% rename from src/server/api/endpoints/following/request/accept.ts rename to src/server/api/endpoints/following/requests/accept.ts index bf0aff4b77..f8df3b7850 100644 --- a/src/server/api/endpoints/following/request/accept.ts +++ b/src/server/api/endpoints/following/requests/accept.ts @@ -1,5 +1,5 @@ import $ from 'cafy'; import ID from '../../../../../cafy-id'; -import acceptFollowRequest from '../../../../../services/user/accept-follow-request'; +import acceptFollowRequest from '../../../../../services/following/requests/accept'; import User from '../../../../../models/user'; /** diff --git a/src/server/api/endpoints/following/request/reject.ts b/src/server/api/endpoints/following/requests/reject.ts similarity index 87% rename from src/server/api/endpoints/following/request/reject.ts rename to src/server/api/endpoints/following/requests/reject.ts index 5a995e1962..4900127a57 100644 --- a/src/server/api/endpoints/following/request/reject.ts +++ b/src/server/api/endpoints/following/requests/reject.ts @@ -1,5 +1,5 @@ import $ from 'cafy'; import ID from '../../../../../cafy-id'; -import rejectFollowRequest from '../../../../../services/user/reject-follow-request'; +import rejectFollowRequest from '../../../../../services/following/requests/reject'; import User from '../../../../../models/user'; /** diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 103cd3ac36..8ee3c84861 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -5,7 +5,7 @@ import $ from 'cafy'; import ID from '../../../../cafy-id'; import User, { isValidName, isValidDescription, isValidLocation, isValidBirthday, pack } from '../../../../models/user'; import event from '../../../../publishers/stream'; import DriveFile from '../../../../models/drive-file'; -import acceptAllFollowRequests from '../../../../services/user/accept-all-follow-requests'; +import acceptAllFollowRequests from '../../../../services/following/requests/accept-all'; /** * Update myself diff --git a/src/services/user/accept-all-follow-requests.ts b/src/services/following/requests/accept-all.ts similarity index 75% rename from src/services/user/accept-all-follow-requests.ts rename to src/services/following/requests/accept-all.ts index 397a0d7ec2..9708d9e658 100644 --- a/src/services/user/accept-all-follow-requests.ts +++ b/src/services/following/requests/accept-all.ts @@ -1,6 +1,6 @@ -import User, { IUser } from "../../models/user"; -import FollowRequest from "../../models/follow-request"; -import accept from './accept-follow-request'; +import User, { IUser } from "../../../models/user"; +import FollowRequest from "../../../models/follow-request"; +import accept from './accept'; /** * 指定したユーザー宛てのフォローリクエストをすべて承認 diff --git a/src/services/user/accept-follow-request.ts b/src/services/following/requests/accept.ts similarity index 68% rename from src/services/user/accept-follow-request.ts rename to src/services/following/requests/accept.ts index 8b5c82c84e..2dff9b01fe 100644 --- a/src/services/user/accept-follow-request.ts +++ b/src/services/following/requests/accept.ts @@ -1,12 +1,12 @@ -import User, { IUser, isRemoteUser, ILocalUser } from "../../models/user"; -import FollowRequest from "../../models/follow-request"; -import pack from '../../remote/activitypub/renderer'; -import renderFollow from '../../remote/activitypub/renderer/follow'; -import renderAccept from '../../remote/activitypub/renderer/accept'; -import { deliver } from '../../queue'; -import Following from "../../models/following"; -import FollowingLog from "../../models/following-log"; -import FollowedLog from "../../models/followed-log"; +import User, { IUser, isRemoteUser, ILocalUser } from "../../../models/user"; +import FollowRequest from "../../../models/follow-request"; +import pack from '../../../remote/activitypub/renderer'; +import renderFollow from '../../../remote/activitypub/renderer/follow'; +import renderAccept from '../../../remote/activitypub/renderer/accept'; +import { deliver } from '../../../queue'; +import Following from "../../../models/following"; +import FollowingLog from "../../../models/following-log"; +import FollowedLog from "../../../models/followed-log"; export default async function(followee: IUser, follower: IUser) { const following = await Following.insert({ diff --git a/src/services/user/reject-follow-request.ts b/src/services/following/requests/reject.ts similarity index 52% rename from src/services/user/reject-follow-request.ts rename to src/services/following/requests/reject.ts index c6388f53e1..acd419d0ee 100644 --- a/src/services/user/reject-follow-request.ts +++ b/src/services/following/requests/reject.ts @@ -1,9 +1,9 @@ -import User, { IUser, isRemoteUser, ILocalUser } from "../../models/user"; -import FollowRequest from "../../models/follow-request"; -import pack from '../../remote/activitypub/renderer'; -import renderFollow from '../../remote/activitypub/renderer/follow'; -import renderReject from '../../remote/activitypub/renderer/reject'; -import { deliver } from '../../queue'; +import User, { IUser, isRemoteUser, ILocalUser } from "../../../models/user"; +import FollowRequest from "../../../models/follow-request"; +import pack from '../../../remote/activitypub/renderer'; +import renderFollow from '../../../remote/activitypub/renderer/follow'; +import renderReject from '../../../remote/activitypub/renderer/reject'; +import { deliver } from '../../../queue'; export default async function(followee: IUser, follower: IUser) { if (isRemoteUser(follower)) { From f14571dc42532c269e606f810ec2af03a3baeba5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 2 Jun 2018 00:38:31 +0900 Subject: [PATCH 109/369] wip --- src/remote/activitypub/kernel/undo/follow.ts | 13 +++++- src/services/following/create.ts | 37 +--------------- src/services/following/requests/cancel.ts | 24 ++++++++++ src/services/following/requests/create.ts | 46 ++++++++++++++++++++ 4 files changed, 84 insertions(+), 36 deletions(-) create mode 100644 src/services/following/requests/cancel.ts create mode 100644 src/services/following/requests/create.ts diff --git a/src/remote/activitypub/kernel/undo/follow.ts b/src/remote/activitypub/kernel/undo/follow.ts index 763d5723c4..7377984616 100644 --- a/src/remote/activitypub/kernel/undo/follow.ts +++ b/src/remote/activitypub/kernel/undo/follow.ts @@ -2,7 +2,9 @@ import * as mongo from 'mongodb'; import User, { IRemoteUser } from '../../../../models/user'; import config from '../../../../config'; import unfollow from '../../../../services/following/delete'; +import cancelRequest from '../../../../services/following/requests/cancel'; import { IFollow } from '../../type'; +import FollowRequest from '../../../../models/follow-request'; export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => { const id = typeof activity.object == 'string' ? activity.object : activity.object.id; @@ -23,5 +25,14 @@ export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => { throw new Error('フォロー解除しようとしているユーザーはローカルユーザーではありません'); } - await unfollow(actor, followee); + const req = await FollowRequest.findOne({ + followerId: actor._id, + followeeId: followee._id + }); + + if (req) { + await cancelRequest(actor, followee); + } else { + await unfollow(actor, followee); + } }; diff --git a/src/services/following/create.ts b/src/services/following/create.ts index 39cecfddfb..03db72c332 100644 --- a/src/services/following/create.ts +++ b/src/services/following/create.ts @@ -8,44 +8,11 @@ import pack from '../../remote/activitypub/renderer'; import renderFollow from '../../remote/activitypub/renderer/follow'; import renderAccept from '../../remote/activitypub/renderer/accept'; import { deliver } from '../../queue'; -import FollowRequest from '../../models/follow-request'; +import createFollowRequest from './requests/create'; export default async function(follower: IUser, followee: IUser) { if (followee.isLocked) { - await FollowRequest.insert({ - createdAt: new Date(), - followerId: follower._id, - followeeId: followee._id, - - // 非正規化 - _follower: { - host: follower.host, - inbox: isRemoteUser(follower) ? follower.inbox : undefined - }, - _followee: { - host: followee.host, - inbox: isRemoteUser(followee) ? followee.inbox : undefined - } - }); - - User.update({ _id: followee._id }, { - $inc: { - pendingReceivedFollowRequestsCount: 1 - } - }); - - // Publish reciveRequest event - if (isLocalUser(followee)) { - packUser(follower, followee).then(packed => event(followee._id, 'reciveRequest', packed)), - - // 通知を作成 - notify(followee._id, follower._id, 'reciveRequest'); - } - - if (isLocalUser(follower) && isRemoteUser(followee)) { - const content = pack(renderFollow(follower, followee)); - deliver(follower, content, followee.inbox); - } + await createFollowRequest(follower, followee); } else { const following = await Following.insert({ createdAt: new Date(), diff --git a/src/services/following/requests/cancel.ts b/src/services/following/requests/cancel.ts new file mode 100644 index 0000000000..840f70264c --- /dev/null +++ b/src/services/following/requests/cancel.ts @@ -0,0 +1,24 @@ +import User, { IUser, isRemoteUser, ILocalUser } from "../../../models/user"; +import FollowRequest from "../../../models/follow-request"; +import pack from '../../../remote/activitypub/renderer'; +import renderFollow from '../../../remote/activitypub/renderer/follow'; +import renderUndo from '../../../remote/activitypub/renderer/undo'; +import { deliver } from '../../../queue'; + +export default async function(followee: IUser, follower: IUser) { + if (isRemoteUser(followee)) { + const content = pack(renderUndo(renderFollow(follower, followee))); + deliver(follower as ILocalUser, content, followee.inbox); + } + + await FollowRequest.remove({ + followeeId: followee._id, + followerId: follower._id + }); + + User.update({ _id: followee._id }, { + $inc: { + pendingReceivedFollowRequestsCount: -1 + } + }); +} diff --git a/src/services/following/requests/create.ts b/src/services/following/requests/create.ts new file mode 100644 index 0000000000..1285c21ea8 --- /dev/null +++ b/src/services/following/requests/create.ts @@ -0,0 +1,46 @@ +import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../../models/user'; +import event from '../../../publishers/stream'; +import notify from '../../../publishers/notify'; +import pack from '../../../remote/activitypub/renderer'; +import renderFollow from '../../../remote/activitypub/renderer/follow'; +import { deliver } from '../../../queue'; +import FollowRequest from '../../../models/follow-request'; + +export default async function(follower: IUser, followee: IUser) { + if (!followee.isLocked) throw '対象のアカウントは鍵アカウントではありません'; + + await FollowRequest.insert({ + createdAt: new Date(), + followerId: follower._id, + followeeId: followee._id, + + // 非正規化 + _follower: { + host: follower.host, + inbox: isRemoteUser(follower) ? follower.inbox : undefined + }, + _followee: { + host: followee.host, + inbox: isRemoteUser(followee) ? followee.inbox : undefined + } + }); + + User.update({ _id: followee._id }, { + $inc: { + pendingReceivedFollowRequestsCount: 1 + } + }); + + // Publish reciveRequest event + if (isLocalUser(followee)) { + packUser(follower, followee).then(packed => event(followee._id, 'reciveRequest', packed)), + + // 通知を作成 + notify(followee._id, follower._id, 'reciveRequest'); + } + + if (isLocalUser(follower) && isRemoteUser(followee)) { + const content = pack(renderFollow(follower, followee)); + deliver(follower, content, followee.inbox); + } +} From a26c19cbd2f3e9efbe9155895cd01e803e8c7b59 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 2 Jun 2018 00:51:20 +0900 Subject: [PATCH 110/369] wip --- .../views/components/settings.profile.vue | 11 +++++- src/models/follow-request.ts | 37 +++++++++++++++++++ src/server/api/endpoints.ts | 10 +++++ .../endpoints/following/requests/cancel.ts | 26 +++++++++++++ .../api/endpoints/following/requests/list.ts | 14 +++++++ 5 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 src/server/api/endpoints/following/requests/cancel.ts create mode 100644 src/server/api/endpoints/following/requests/list.ts diff --git a/src/client/app/desktop/views/components/settings.profile.vue b/src/client/app/desktop/views/components/settings.profile.vue index 9932cbf7db..0b3a25f389 100644 --- a/src/client/app/desktop/views/components/settings.profile.vue +++ b/src/client/app/desktop/views/components/settings.profile.vue @@ -23,7 +23,11 @@ </label> <button class="ui primary" @click="save">%i18n:@save%</button> <section> - <h2>その他</h2> + <h2>%i18n:@locked-account%</h2> + <mk-switch v-model="$store.state.i.isLocked" @change="onChangeIsLocked" text="%i18n:@is-locked%"/> + </section> + <section> + <h2>%i18n:@other%</h2> <mk-switch v-model="$store.state.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/> <mk-switch v-model="$store.state.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/> </section> @@ -62,6 +66,11 @@ export default Vue.extend({ (this as any).apis.notify('プロフィールを更新しました'); }); }, + onChangeIsLocked() { + (this as any).api('i/update', { + isLocked: this.$store.state.i.isLocked + }); + }, onChangeIsBot() { (this as any).api('i/update', { isBot: this.$store.state.i.isBot diff --git a/src/models/follow-request.ts b/src/models/follow-request.ts index 0de4b8e3af..0cdb8b4f47 100644 --- a/src/models/follow-request.ts +++ b/src/models/follow-request.ts @@ -1,5 +1,7 @@ import * as mongo from 'mongodb'; +import * as deepcopy from 'deepcopy'; import db from '../db/mongodb'; +import { pack as packUser } from './user'; const FollowRequest = db.get<IFollowRequest>('followRequests'); FollowRequest.createIndex(['followerId', 'followeeId'], { unique: true }); @@ -48,3 +50,38 @@ export async function deleteFollowRequest(followRequest: string | mongo.ObjectID _id: f._id }); } + +/** + * Pack a request for API response + */ +export const pack = ( + request: any, + me?: any +) => new Promise<any>(async (resolve, reject) => { + let _request: any; + + // Populate the request if 'request' is ID + if (mongo.ObjectID.prototype.isPrototypeOf(request)) { + _request = await FollowRequest.findOne({ + _id: request + }); + } else if (typeof request === 'string') { + _request = await FollowRequest.findOne({ + _id: new mongo.ObjectID(request) + }); + } else { + _request = deepcopy(request); + } + + // Rename _id to id + _request.id = _request._id; + delete _request._id; + + // Populate follower + _request.followerId = await packUser(_request.followerId, me); + + // Populate followee + _request.followeeId = await packUser(_request.followeeId, me); + + resolve(_request); +}); diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts index ad51a249bf..e9392d236b 100644 --- a/src/server/api/endpoints.ts +++ b/src/server/api/endpoints.ts @@ -458,6 +458,16 @@ const endpoints: Endpoint[] = [ withCredential: true, kind: 'following-write' }, + { + name: 'following/requests/cancel', + withCredential: true, + kind: 'following-write' + }, + { + name: 'following/requests/list', + withCredential: true, + kind: 'following-read' + }, { name: 'following/stalk', withCredential: true, diff --git a/src/server/api/endpoints/following/requests/cancel.ts b/src/server/api/endpoints/following/requests/cancel.ts new file mode 100644 index 0000000000..417422e06b --- /dev/null +++ b/src/server/api/endpoints/following/requests/cancel.ts @@ -0,0 +1,26 @@ +import $ from 'cafy'; import ID from '../../../../../cafy-id'; +import cancelFollowRequest from '../../../../../services/following/requests/cancel'; +import User from '../../../../../models/user'; + +/** + * Cancel a follow request + */ +module.exports = (params, user) => new Promise(async (res, rej) => { + // Get 'followerId' parameter + const [followerId, followerIdErr] = $.type(ID).get(params.followerId); + if (followerIdErr) return rej('invalid followerId param'); + + // Fetch follower + const follower = await User.findOne({ + _id: followerId + }); + + if (follower === null) { + return rej('follower not found'); + } + + await cancelFollowRequest(user, follower); + + // Send response + res(); +}); diff --git a/src/server/api/endpoints/following/requests/list.ts b/src/server/api/endpoints/following/requests/list.ts new file mode 100644 index 0000000000..e8364335d1 --- /dev/null +++ b/src/server/api/endpoints/following/requests/list.ts @@ -0,0 +1,14 @@ +//import $ from 'cafy'; import ID from '../../../../../cafy-id'; +import FollowRequest, { pack } from '../../../../../models/follow-request'; + +/** + * Get all pending received follow requests + */ +module.exports = (params, user) => new Promise(async (res, rej) => { + const reqs = await FollowRequest.find({ + followeeId: user._id + }); + + // Send response + res(await Promise.all(reqs.map(req => pack(req)))); +}); From 2752319e50dd77dd4a22b974a5a8933a377b8b50 Mon Sep 17 00:00:00 2001 From: Angristan <Angristan@users.noreply.github.com> Date: Fri, 1 Jun 2018 20:24:30 +0200 Subject: [PATCH 111/369] Update build docs Fix #1474 --- docs/setup.en.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/setup.en.md b/docs/setup.en.md index 8dde4d00d6..d5c54334b6 100644 --- a/docs/setup.en.md +++ b/docs/setup.en.md @@ -47,12 +47,12 @@ You need to generate config file via `npm run config` command. *5.* Build Misskey ---------------------------------------------------------------- -We need to use `node-gyp` to build the `crypto` module. -1. `npm install -g node-gyp` -2. `node-gyp configure` -3. `node-gyp build` -4. `npm run build` +If you're on Debian, you will need to install the `build-essential` package. + +Then build misskey: + +`npm run build` *6.* That is it. ---------------------------------------------------------------- From 8d78ee08c111b09479484c53e63fb32a1721b848 Mon Sep 17 00:00:00 2001 From: Angristan <Angristan@users.noreply.github.com> Date: Fri, 1 Jun 2018 20:52:47 +0200 Subject: [PATCH 112/369] Cover multiple cases --- docs/setup.en.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/setup.en.md b/docs/setup.en.md index d5c54334b6..28e025521b 100644 --- a/docs/setup.en.md +++ b/docs/setup.en.md @@ -48,12 +48,19 @@ You need to generate config file via `npm run config` command. *5.* Build Misskey ---------------------------------------------------------------- -If you're on Debian, you will need to install the `build-essential` package. - -Then build misskey: +Build misskey with the following: `npm run build` +If you're on Debian, you will need to install the `build-essential` package. + +If you're still encountering errors about some modules, use node-gyp: + +1. `npm install -g node-gyp` +2. `node-gyp configure` +3. `node-gyp build` +4. `npm run build` + *6.* That is it. ---------------------------------------------------------------- Well done! Now, you have an environment that run to Misskey. From 56fa24e40166f59482d25ebc04a8335a60b072ff Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 2 Jun 2018 12:58:56 +0900 Subject: [PATCH 113/369] wip --- .../views/components/notifications.vue | 4 +- .../mobile/views/components/follow-button.vue | 84 +++++++++---------- .../views/components/notification-preview.vue | 4 +- .../mobile/views/components/notification.vue | 4 +- src/server/api/endpoints/following/create.ts | 4 +- src/server/api/endpoints/following/delete.ts | 4 +- .../endpoints/following/requests/accept.ts | 6 +- .../endpoints/following/requests/cancel.ts | 22 ++--- .../endpoints/following/requests/reject.ts | 6 +- src/services/following/requests/create.ts | 4 +- 10 files changed, 67 insertions(+), 75 deletions(-) diff --git a/src/client/app/desktop/views/components/notifications.vue b/src/client/app/desktop/views/components/notifications.vue index aff21b14d8..368655095f 100644 --- a/src/client/app/desktop/views/components/notifications.vue +++ b/src/client/app/desktop/views/components/notifications.vue @@ -50,7 +50,7 @@ </div> </template> - <template v-if="notification.type == 'followRequest'"> + <template v-if="notification.type == 'reciveFollowRequest'"> <mk-avatar class="avatar" :user="notification.user"/> <div class="text"> <p>%fa:user-clock% @@ -268,7 +268,7 @@ root(isDark) .text p i color #53c7ce - &.followRequest + &.reciveFollowRequest .text p i color #888 diff --git a/src/client/app/mobile/views/components/follow-button.vue b/src/client/app/mobile/views/components/follow-button.vue index 9c363d7164..a247db95f6 100644 --- a/src/client/app/mobile/views/components/follow-button.vue +++ b/src/client/app/mobile/views/components/follow-button.vue @@ -1,14 +1,14 @@ <template> <button class="mk-follow-button" - :class="{ wait: wait, following: user.isFollowing, unfollow: user.isFollowing }" + :class="{ wait: wait, following: u.isFollowing }" @click="onClick" :disabled="wait" > <template v-if="!wait"> - <template v-if="user.hasPendingFollowRequestFromYou">%fa:hourglass-half% %i18n:@request-pending%</template> - <template v-else-if="user.isFollowing">%fa:minus% %i18n:@unfollow%</template> - <template v-else-if="!user.isFollowing && user.isLocked">%fa:plus% %i18n:@follow-request%</template> - <template v-else-if="!user.isFollowing && !user.isLocked">%fa:plus% %i18n:@follow%</template> + <template v-if="u.hasPendingFollowRequestFromYou">%fa:hourglass-half% %i18n:@request-pending%</template> + <template v-else-if="u.isFollowing">%fa:minus% %i18n:@unfollow%</template> + <template v-else-if="!u.isFollowing && u.isLocked">%fa:plus% %i18n:@follow-request%</template> + <template v-else-if="!u.isFollowing && !u.isLocked">%fa:plus% %i18n:@follow%</template> </template> <template v-else>%fa:spinner .pulse .fw%</template> </button> @@ -25,6 +25,7 @@ export default Vue.extend({ }, data() { return { + u: this.user, wait: false, connection: null, connectionId: null @@ -45,51 +46,44 @@ export default Vue.extend({ methods: { onFollow(user) { - if (user.id == this.user.id) { - this.user.isFollowing = user.isFollowing; + if (user.id == this.u.id) { + this.u.isFollowing = user.isFollowing; } }, onUnfollow(user) { - if (user.id == this.user.id) { - this.user.isFollowing = user.isFollowing; + if (user.id == this.u.id) { + this.u.isFollowing = user.isFollowing; } }, - onClick() { + async onClick() { this.wait = true; - if (this.user.isFollowing) { - (this as any).api('following/delete', { - userId: this.user.id - }).then(() => { - this.user.isFollowing = false; - }).catch(err => { - console.error(err); - }).then(() => { - this.wait = false; - }); - } else { - if (this.user.isLocked && this.user.hasPendingFollowRequestFromYou) { - (this as any).api('following/requests/cancel', { - userId: this.user.id - }).then(() => { - this.user.hasPendingFollowRequestFromYou = false; - }).catch(err => { - console.error(err); - }).then(() => { - this.wait = false; + + try { + if (this.u.isFollowing) { + this.u = await (this as any).api('following/delete', { + userId: this.u.id }); } else { - (this as any).api('following/create', { - userId: this.user.id - }).then(() => { - this.user.isFollowing = true; - }).catch(err => { - console.error(err); - }).then(() => { - this.wait = false; - }); + if (this.u.isLocked && this.u.hasPendingFollowRequestFromYou) { + this.u = await (this as any).api('following/requests/cancel', { + userId: this.u.id + }); + } else if (this.u.isLocked) { + this.u = await (this as any).api('following/create', { + userId: this.u.id + }); + } else { + this.u = await (this as any).api('following/create', { + userId: this.user.id + }); + } } + } catch (e) { + console.error(e); + } finally { + this.wait = false; } } } @@ -107,6 +101,8 @@ export default Vue.extend({ margin 0 line-height 36px font-size 14px + color $theme-color + background transparent outline none border solid 1px $theme-color border-radius 36px @@ -114,9 +110,9 @@ export default Vue.extend({ * pointer-events none - &.follow - color $theme-color - background transparent + &.following + color $theme-color-foreground + background $theme-color &:hover background rgba($theme-color, 0.1) @@ -124,10 +120,6 @@ export default Vue.extend({ &:active background rgba($theme-color, 0.2) - &.unfollow - color $theme-color-foreground - background $theme-color - &.wait cursor wait !important opacity 0.7 diff --git a/src/client/app/mobile/views/components/notification-preview.vue b/src/client/app/mobile/views/components/notification-preview.vue index b1f6fd1495..6046f77242 100644 --- a/src/client/app/mobile/views/components/notification-preview.vue +++ b/src/client/app/mobile/views/components/notification-preview.vue @@ -31,7 +31,7 @@ </div> </template> - <template v-if="notification.type == 'followRequest'"> + <template v-if="notification.type == 'reciveFollowRequest'"> <mk-avatar class="avatar" :user="notification.user"/> <div class="text"> <p>%fa:user-clock%{{ notification.user | userName }}</p> @@ -125,7 +125,7 @@ export default Vue.extend({ .text p i color #53c7ce - &.followRequest + &.reciveFollowRequest .text p i color #888 diff --git a/src/client/app/mobile/views/components/notification.vue b/src/client/app/mobile/views/components/notification.vue index da69fc79cc..8109bef38e 100644 --- a/src/client/app/mobile/views/components/notification.vue +++ b/src/client/app/mobile/views/components/notification.vue @@ -40,7 +40,7 @@ </div> </div> - <div class="notification followRequest" v-if="notification.type == 'followRequest'"> + <div class="notification followRequest" v-if="notification.type == 'reciveFollowRequest'"> <mk-avatar class="avatar" :user="notification.user"/> <div> <header> @@ -167,7 +167,7 @@ root(isDark) > div > header i color #53c7ce - &.followRequest + &.reciveFollowRequest > div > header i color #888 diff --git a/src/server/api/endpoints/following/create.ts b/src/server/api/endpoints/following/create.ts index 766a8c03d0..48205232e6 100644 --- a/src/server/api/endpoints/following/create.ts +++ b/src/server/api/endpoints/following/create.ts @@ -2,7 +2,7 @@ * Module dependencies */ import $ from 'cafy'; import ID from '../../../../cafy-id'; -import User from '../../../../models/user'; +import User, { pack } from '../../../../models/user'; import Following from '../../../../models/following'; import create from '../../../../services/following/create'; @@ -49,5 +49,5 @@ module.exports = (params, user) => new Promise(async (res, rej) => { create(follower, followee); // Send response - res(); + res(await pack(followee, user)); }); diff --git a/src/server/api/endpoints/following/delete.ts b/src/server/api/endpoints/following/delete.ts index 396b19a6f6..f4030c247a 100644 --- a/src/server/api/endpoints/following/delete.ts +++ b/src/server/api/endpoints/following/delete.ts @@ -2,7 +2,7 @@ * Module dependencies */ import $ from 'cafy'; import ID from '../../../../cafy-id'; -import User from '../../../../models/user'; +import User, { pack } from '../../../../models/user'; import Following from '../../../../models/following'; import deleteFollowing from '../../../../services/following/delete'; @@ -49,5 +49,5 @@ module.exports = (params, user) => new Promise(async (res, rej) => { deleteFollowing(follower, followee); // Send response - res(); + res(await pack(followee, user)); }); diff --git a/src/server/api/endpoints/following/requests/accept.ts b/src/server/api/endpoints/following/requests/accept.ts index f8df3b7850..705d3b161a 100644 --- a/src/server/api/endpoints/following/requests/accept.ts +++ b/src/server/api/endpoints/following/requests/accept.ts @@ -6,9 +6,9 @@ import User from '../../../../../models/user'; * Accept a follow request */ module.exports = (params, user) => new Promise(async (res, rej) => { - // Get 'followerId' parameter - const [followerId, followerIdErr] = $.type(ID).get(params.followerId); - if (followerIdErr) return rej('invalid followerId param'); + // Get 'userId' parameter + const [followerId, followerIdErr] = $.type(ID).get(params.userId); + if (followerIdErr) return rej('invalid userId param'); // Fetch follower const follower = await User.findOne({ diff --git a/src/server/api/endpoints/following/requests/cancel.ts b/src/server/api/endpoints/following/requests/cancel.ts index 417422e06b..388a54890b 100644 --- a/src/server/api/endpoints/following/requests/cancel.ts +++ b/src/server/api/endpoints/following/requests/cancel.ts @@ -1,26 +1,26 @@ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import cancelFollowRequest from '../../../../../services/following/requests/cancel'; -import User from '../../../../../models/user'; +import User, { pack } from '../../../../../models/user'; /** * Cancel a follow request */ module.exports = (params, user) => new Promise(async (res, rej) => { - // Get 'followerId' parameter - const [followerId, followerIdErr] = $.type(ID).get(params.followerId); - if (followerIdErr) return rej('invalid followerId param'); + // Get 'userId' parameter + const [followeeId, followeeIdErr] = $.type(ID).get(params.userId); + if (followeeIdErr) return rej('invalid userId param'); - // Fetch follower - const follower = await User.findOne({ - _id: followerId + // Fetch followee + const followee = await User.findOne({ + _id: followeeId }); - if (follower === null) { - return rej('follower not found'); + if (followee === null) { + return rej('followee not found'); } - await cancelFollowRequest(user, follower); + await cancelFollowRequest(followee, user); // Send response - res(); + res(await pack(followee._id, user)); }); diff --git a/src/server/api/endpoints/following/requests/reject.ts b/src/server/api/endpoints/following/requests/reject.ts index 4900127a57..1cfb562b55 100644 --- a/src/server/api/endpoints/following/requests/reject.ts +++ b/src/server/api/endpoints/following/requests/reject.ts @@ -6,9 +6,9 @@ import User from '../../../../../models/user'; * Reject a follow request */ module.exports = (params, user) => new Promise(async (res, rej) => { - // Get 'followerId' parameter - const [followerId, followerIdErr] = $.type(ID).get(params.followerId); - if (followerIdErr) return rej('invalid followerId param'); + // Get 'userId' parameter + const [followerId, followerIdErr] = $.type(ID).get(params.userId); + if (followerIdErr) return rej('invalid userId param'); // Fetch follower const follower = await User.findOne({ diff --git a/src/services/following/requests/create.ts b/src/services/following/requests/create.ts index 1285c21ea8..b69eb5acb0 100644 --- a/src/services/following/requests/create.ts +++ b/src/services/following/requests/create.ts @@ -33,10 +33,10 @@ export default async function(follower: IUser, followee: IUser) { // Publish reciveRequest event if (isLocalUser(followee)) { - packUser(follower, followee).then(packed => event(followee._id, 'reciveRequest', packed)), + packUser(follower, followee).then(packed => event(followee._id, 'reciveFollowRequest', packed)), // 通知を作成 - notify(followee._id, follower._id, 'reciveRequest'); + notify(followee._id, follower._id, 'reciveFollowRequest'); } if (isLocalUser(follower) && isRemoteUser(followee)) { From 0128831649cb3f434b837c6cf3f19f5cdc65c978 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 2 Jun 2018 13:11:28 +0900 Subject: [PATCH 114/369] wip --- .../views/components/follow-button.vue | 76 +++++++++---------- .../mobile/views/components/follow-button.vue | 22 ++++-- 2 files changed, 52 insertions(+), 46 deletions(-) diff --git a/src/client/app/desktop/views/components/follow-button.vue b/src/client/app/desktop/views/components/follow-button.vue index dae7604957..c7549c374e 100644 --- a/src/client/app/desktop/views/components/follow-button.vue +++ b/src/client/app/desktop/views/components/follow-button.vue @@ -1,19 +1,16 @@ <template> <button class="mk-follow-button" - :class="{ wait, follow: !user.isFollowing, unfollow: user.isFollowing, big: size == 'big' }" + :class="{ wait, active: u.isFollowing || u.hasPendingFollowRequestFromYou, big: size == 'big' }" @click="onClick" :disabled="wait" - :title="user.isFollowing ? '%i18n:@unfollow%' : '%i18n:@follow%'" > - <template v-if="!wait && user.isFollowing"> - <template v-if="size == 'compact'">%fa:minus%</template> - <template v-if="size == 'big'">%fa:minus%%i18n:@unfollow%</template> + <template v-if="!wait"> + <template v-if="u.hasPendingFollowRequestFromYou">%fa:hourglass-half%<template v-if="size == 'big'"> %i18n:@request-pending%</template></template> + <template v-else-if="u.isFollowing">%fa:minus%<template v-if="size == 'big'"> %i18n:@unfollow%</template></template> + <template v-else-if="!u.isFollowing && u.isLocked">%fa:plus%<template v-if="size == 'big'"> %i18n:@follow-request%</template></template> + <template v-else-if="!u.isFollowing && !u.isLocked">%fa:plus%<template v-if="size == 'big'"> %i18n:@follow%</template></template> </template> - <template v-if="!wait && !user.isFollowing"> - <template v-if="size == 'compact'">%fa:plus%</template> - <template v-if="size == 'big'">%fa:plus%%i18n:@follow%</template> - </template> - <template v-if="wait">%fa:spinner .pulse .fw%</template> + <template v-else>%fa:spinner .pulse .fw%</template> </button> </template> @@ -34,6 +31,7 @@ export default Vue.extend({ data() { return { + u: this.user, wait: false, connection: null, connectionId: null @@ -56,39 +54,44 @@ export default Vue.extend({ methods: { onFollow(user) { - if (user.id == this.user.id) { + if (user.id == this.u.id) { this.user.isFollowing = user.isFollowing; } }, onUnfollow(user) { - if (user.id == this.user.id) { + if (user.id == this.u.id) { this.user.isFollowing = user.isFollowing; } }, - onClick() { + async onClick() { this.wait = true; - if (this.user.isFollowing) { - (this as any).api('following/delete', { - userId: this.user.id - }).then(() => { - this.user.isFollowing = false; - }).catch(err => { - console.error(err); - }).then(() => { - this.wait = false; - }); - } else { - (this as any).api('following/create', { - userId: this.user.id - }).then(() => { - this.user.isFollowing = true; - }).catch(err => { - console.error(err); - }).then(() => { - this.wait = false; - }); + + try { + if (this.u.isFollowing) { + this.u = await (this as any).api('following/delete', { + userId: this.u.id + }); + } else { + if (this.u.isLocked && this.u.hasPendingFollowRequestFromYou) { + this.u = await (this as any).api('following/requests/cancel', { + userId: this.u.id + }); + } else if (this.u.isLocked) { + this.u = await (this as any).api('following/create', { + userId: this.u.id + }); + } else { + this.u = await (this as any).api('following/create', { + userId: this.user.id + }); + } + } + } catch (e) { + console.error(e); + } finally { + this.wait = false; } } } @@ -124,7 +127,7 @@ root(isDark) border 2px solid rgba($theme-color, 0.3) border-radius 8px - &.follow + &:not(.active) color isDark ? #fff : #888 background isDark ? linear-gradient(to bottom, #313543 0%, #282c37 100%) : linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%) border solid 1px isDark ? #1c2023 : #e2e2e2 @@ -137,7 +140,7 @@ root(isDark) background isDark ? #22262f : #ececec border-color isDark ? #151a1d : #dcdcdc - &.unfollow + &.active color $theme-color-foreground background linear-gradient(to bottom, lighten($theme-color, 25%) 0%, lighten($theme-color, 10%) 100%) border solid 1px lighten($theme-color, 15%) @@ -162,9 +165,6 @@ root(isDark) height 38px line-height 38px - i - margin-right 8px - .mk-follow-button[data-darkmode] root(true) diff --git a/src/client/app/mobile/views/components/follow-button.vue b/src/client/app/mobile/views/components/follow-button.vue index a247db95f6..d8441a20b9 100644 --- a/src/client/app/mobile/views/components/follow-button.vue +++ b/src/client/app/mobile/views/components/follow-button.vue @@ -1,6 +1,6 @@ <template> <button class="mk-follow-button" - :class="{ wait: wait, following: u.isFollowing }" + :class="{ wait: wait, active: u.isFollowing || u.hasPendingFollowRequestFromYou }" @click="onClick" :disabled="wait" > @@ -99,6 +99,7 @@ export default Vue.extend({ cursor pointer padding 0 16px margin 0 + min-width 150px line-height 36px font-size 14px color $theme-color @@ -107,24 +108,29 @@ export default Vue.extend({ border solid 1px $theme-color border-radius 36px - * - pointer-events none + &:hover + background rgba($theme-color, 0.1) - &.following + &:active + background rgba($theme-color, 0.2) + + &.active color $theme-color-foreground background $theme-color &:hover - background rgba($theme-color, 0.1) + background lighten($theme-color, 10%) + border-color lighten($theme-color, 10%) &:active - background rgba($theme-color, 0.2) + background darken($theme-color, 10%) + border-color darken($theme-color, 10%) &.wait cursor wait !important opacity 0.7 - > [data-fa] - margin-right 4px + * + pointer-events none </style> From 68404967915deb73b3deca217dba5df420eeaa20 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 2 Jun 2018 13:14:54 +0900 Subject: [PATCH 115/369] wip --- locales/ja.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/locales/ja.yml b/locales/ja.yml index 400b79ab69..fad0c89113 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -331,8 +331,10 @@ desktop/views/components/drive.vue: url-upload: "URLからアップロード" desktop/views/components/follow-button.vue: - unfollow: "フォロー解除" - follow: "フォローする" + unfollow: "フォロー中" + follow: "フォロー" + request-pending: "フォロー許可待ち" + follow-request: "フォロー申請" desktop/views/components/followers-window.vue: followers: "{} のフォロワー" @@ -771,8 +773,10 @@ mobile/views/components/drive.file-detail.vue: exif: "EXIF" mobile/views/components/follow-button.vue: + unfollow: "フォロー中" follow: "フォロー" - unfollow: "フォロー解除" + request-pending: "フォロー許可待ち" + follow-request: "フォロー申請" mobile/views/components/friends-maker.vue: title: "気になるユーザーをフォロー" From 5ca8a0d88642f6d64b2a23891e02e07edabe112e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 2 Jun 2018 13:34:53 +0900 Subject: [PATCH 116/369] wip --- locales/ja.yml | 7 +++ .../components/follow-requests-window.vue | 54 +++++++++++++++++++ .../views/components/ui.header.account.vue | 17 ++++++ .../views/components/user-lists-window.vue | 2 +- src/models/follow-request.ts | 4 +- 5 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 src/client/app/desktop/views/components/follow-requests-window.vue diff --git a/locales/ja.yml b/locales/ja.yml index fad0c89113..75ff13afef 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -598,6 +598,7 @@ desktop/views/components/ui.header.account.vue: drive: "ドライブ" favorites: "お気に入り" lists: "リスト" + follow-requests: "フォロー申請" customize: "カスタマイズ" settings: "設定" signout: "サインアウト" @@ -617,7 +618,13 @@ desktop/views/components/ui.header.post.vue: desktop/views/components/ui.header.search.vue: placeholder: "検索" +desktop/views/components/follow-requests-window.vue: + title: "フォロー申請" + accept: "許可" + reject: "拒否" + desktop/views/components/user-lists-window.vue: + title: "リスト" create-list: "リストを作成" desktop/views/components/user-preview.vue: diff --git a/src/client/app/desktop/views/components/follow-requests-window.vue b/src/client/app/desktop/views/components/follow-requests-window.vue new file mode 100644 index 0000000000..c864f1f9cd --- /dev/null +++ b/src/client/app/desktop/views/components/follow-requests-window.vue @@ -0,0 +1,54 @@ +<template> +<mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy"> + <span slot="header">%fa:envelope R% %i18n:@title%</span> + + <div data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4" :data-darkmode="$store.state.device.darkmode"> + <router-link v-for="req in requests" :key="req.id" :to="req.followee | userPage">{{ req.followee | userName }}</router-link> + </div> +</mk-window> +</template> + +<script lang="ts"> +import Vue from 'vue'; +export default Vue.extend({ + data() { + return { + fetching: true, + requests: [] + }; + }, + mounted() { + (this as any).api('following/requests/list').then(requests => { + this.fetching = false; + this.requests = requests; + }); + }, + methods: { + close() { + (this as any).$refs.window.close(); + } + } +}); +</script> + +<style lang="stylus" scoped> + +root(isDark) + padding 16px + + > button + margin-bottom 16px + + > a + display block + padding 16px + border solid 1px isDark ? #1c2023 : #eee + border-radius 4px + +[data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4"][data-darkmode] + root(true) + +[data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4"]:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/desktop/views/components/ui.header.account.vue b/src/client/app/desktop/views/components/ui.header.account.vue index 8d26691f84..d110d700a0 100644 --- a/src/client/app/desktop/views/components/ui.header.account.vue +++ b/src/client/app/desktop/views/components/ui.header.account.vue @@ -19,6 +19,9 @@ <li @click="list"> <p>%fa:list%<span>%i18n:@lists%</span>%fa:angle-right%</p> </li> + <li @click="followRequests" v-if="$store.state.i.isLocked"> + <p>%fa:envelope R%<span>%i18n:@follow-requests%<i v-if="$store.state.i.pendingReceivedFollowRequestsCount">{{ $store.state.i.pendingReceivedFollowRequestsCount }}</i></span>%fa:angle-right%</p> + </li> </ul> <ul> <li> @@ -46,6 +49,7 @@ <script lang="ts"> import Vue from 'vue'; import MkUserListsWindow from './user-lists-window.vue'; +import MkFollowRequestsWindow from './follow-requests-window.vue'; import MkSettingsWindow from './settings-window.vue'; import MkDriveWindow from './drive-window.vue'; import contains from '../../../common/scripts/contains'; @@ -91,6 +95,10 @@ export default Vue.extend({ this.$router.push(`i/lists/${ list.id }`); }); }, + followRequests() { + this.close(); + (this as any).os.new(MkFollowRequestsWindow); + }, settings() { this.close(); (this as any).os.new(MkSettingsWindow); @@ -225,6 +233,15 @@ root(isDark) > span:first-child padding-left 22px + > span:nth-child(2) + > i + margin-left 4px + padding 2px 8px + font-size 90% + background $theme-color + color $theme-color-foreground + border-radius 8px + > [data-fa]:first-child margin-right 6px width 16px diff --git a/src/client/app/desktop/views/components/user-lists-window.vue b/src/client/app/desktop/views/components/user-lists-window.vue index 454c725d20..109d1695d8 100644 --- a/src/client/app/desktop/views/components/user-lists-window.vue +++ b/src/client/app/desktop/views/components/user-lists-window.vue @@ -1,6 +1,6 @@ <template> <mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy"> - <span slot="header">%fa:list% リスト</span> + <span slot="header">%fa:list% %i18n:@title%</span> <div data-id="6e4caea3-d8f9-4ab7-96de-ab67fe8d5c82" :data-darkmode="$store.state.device.darkmode"> <button class="ui" @click="add">%i18n:@create-list%</button> diff --git a/src/models/follow-request.ts b/src/models/follow-request.ts index 0cdb8b4f47..eea5d1c535 100644 --- a/src/models/follow-request.ts +++ b/src/models/follow-request.ts @@ -78,10 +78,10 @@ export const pack = ( delete _request._id; // Populate follower - _request.followerId = await packUser(_request.followerId, me); + _request.follower = await packUser(_request.followerId, me); // Populate followee - _request.followeeId = await packUser(_request.followeeId, me); + _request.followee = await packUser(_request.followeeId, me); resolve(_request); }); From a6a4bb6599b186565afe58a76c78048f658fa358 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 2 Jun 2018 13:36:29 +0900 Subject: [PATCH 117/369] wip --- src/models/notification.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/models/notification.ts b/src/models/notification.ts index c4cf1e4efd..a17a892541 100644 --- a/src/models/notification.ts +++ b/src/models/notification.ts @@ -111,6 +111,7 @@ export const pack = (notification: any) => new Promise<any>(async (resolve, reje switch (_notification.type) { case 'follow': + case 'reciveFollowRequest': // nope break; case 'mention': From 9e8cfd76c849a236d3e1b5f8ae9b05aa9364ef99 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 2 Jun 2018 13:40:28 +0900 Subject: [PATCH 118/369] wip --- src/client/app/common/scripts/streaming/home.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/client/app/common/scripts/streaming/home.ts b/src/client/app/common/scripts/streaming/home.ts index 50bbb56896..c5189ddc7a 100644 --- a/src/client/app/common/scripts/streaming/home.ts +++ b/src/client/app/common/scripts/streaming/home.ts @@ -28,6 +28,12 @@ export class HomeStream extends Stream { os.store.dispatch('mergeMe', i); }); + this.on('reciveFollowRequest', () => { + os.store.dispatch('mergeMe', { + pendingReceivedFollowRequestsCount: (os.store.state.i.pendingReceivedFollowRequestsCount || 0) + 1 + }); + }); + this.on('read_all_notifications', () => { os.store.dispatch('mergeMe', { hasUnreadNotification: false From 8dfd892b71be7e594b6f192d8ceee71ab02d3f3f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 2 Jun 2018 15:51:43 +0900 Subject: [PATCH 119/369] wip --- .../components/follow-requests-window.vue | 24 ++++++++++++++++--- .../views/components/ui.header.account.vue | 1 + 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/client/app/desktop/views/components/follow-requests-window.vue b/src/client/app/desktop/views/components/follow-requests-window.vue index c864f1f9cd..fd37c0a6aa 100644 --- a/src/client/app/desktop/views/components/follow-requests-window.vue +++ b/src/client/app/desktop/views/components/follow-requests-window.vue @@ -3,7 +3,12 @@ <span slot="header">%fa:envelope R% %i18n:@title%</span> <div data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4" :data-darkmode="$store.state.device.darkmode"> - <router-link v-for="req in requests" :key="req.id" :to="req.followee | userPage">{{ req.followee | userName }}</router-link> + <div v-for="req in requests"> + <router-link :key="req.id" :to="req.follower | userPage">{{ req.follower | userName }}</router-link> + <span> + <a @click="accept(req.follower)">%i18n:@accept%</a>|<a @click="reject(req.follower)">%i18n:@reject%</a> + </span> + </div> </div> </mk-window> </template> @@ -24,6 +29,16 @@ export default Vue.extend({ }); }, methods: { + accept(user) { + (this as any).api('following/requests/accept', { userId: user.id }).then(() => { + this.requests = this.requests.filter(r => r.follower.id != user.id); + }); + }, + reject(user) { + (this as any).api('following/requests/reject', { userId: user.id }).then(() => { + this.requests = this.requests.filter(r => r.follower.id != user.id); + }); + }, close() { (this as any).$refs.window.close(); } @@ -39,12 +54,15 @@ root(isDark) > button margin-bottom 16px - > a - display block + > div + display flex padding 16px border solid 1px isDark ? #1c2023 : #eee border-radius 4px + > span + margin 0 0 0 auto + [data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4"][data-darkmode] root(true) diff --git a/src/client/app/desktop/views/components/ui.header.account.vue b/src/client/app/desktop/views/components/ui.header.account.vue index d110d700a0..8c2da6596a 100644 --- a/src/client/app/desktop/views/components/ui.header.account.vue +++ b/src/client/app/desktop/views/components/ui.header.account.vue @@ -238,6 +238,7 @@ root(isDark) margin-left 4px padding 2px 8px font-size 90% + font-style normal background $theme-color color $theme-color-foreground border-radius 8px From 4feff8835cfa80529c14fcbb7a138eeb0a951650 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 2 Jun 2018 16:01:32 +0900 Subject: [PATCH 120/369] wip --- src/client/app/common/scripts/streaming/home.ts | 8 +------- src/server/api/endpoints/i/update.ts | 2 +- src/server/api/service/twitter.ts | 4 ++-- src/services/following/requests/accept.ts | 14 ++++++++++---- src/services/following/requests/cancel.ts | 9 +++++++-- src/services/following/requests/create.ts | 8 ++++++-- 6 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/client/app/common/scripts/streaming/home.ts b/src/client/app/common/scripts/streaming/home.ts index c5189ddc7a..f07d0289f6 100644 --- a/src/client/app/common/scripts/streaming/home.ts +++ b/src/client/app/common/scripts/streaming/home.ts @@ -20,7 +20,7 @@ export class HomeStream extends Stream { }, 1000 * 60); // 自分の情報が更新されたとき - this.on('i_updated', i => { + this.on('meUpdated', i => { if (os.debug) { console.log('I updated:', i); } @@ -28,12 +28,6 @@ export class HomeStream extends Stream { os.store.dispatch('mergeMe', i); }); - this.on('reciveFollowRequest', () => { - os.store.dispatch('mergeMe', { - pendingReceivedFollowRequestsCount: (os.store.state.i.pendingReceivedFollowRequestsCount || 0) + 1 - }); - }); - this.on('read_all_notifications', () => { os.store.dispatch('mergeMe', { hasUnreadNotification: false diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 8ee3c84861..5aff6da103 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -99,7 +99,7 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { res(iObj); // Publish i updated event - event(user._id, 'i_updated', iObj); + event(user._id, 'meUpdated', iObj); // 鍵垢を解除したとき、溜まっていたフォローリクエストがあるならすべて承認 if (user.isLocked && isLocked === false) { diff --git a/src/server/api/service/twitter.ts b/src/server/api/service/twitter.ts index 284ae7ee22..8c35509cce 100644 --- a/src/server/api/service/twitter.ts +++ b/src/server/api/service/twitter.ts @@ -49,7 +49,7 @@ router.get('/disconnect/twitter', async ctx => { ctx.body = `Twitterの連携を解除しました :v:`; // Publish i updated event - event(user._id, 'i_updated', await pack(user, user, { + event(user._id, 'meUpdated', await pack(user, user, { detail: true, includeSecrets: true })); @@ -174,7 +174,7 @@ if (config.twitter == null) { ctx.body = `Twitter: @${result.screenName} を、Misskey: @${user.username} に接続しました!`; // Publish i updated event - event(user._id, 'i_updated', await pack(user, user, { + event(user._id, 'meUpdated', await pack(user, user, { detail: true, includeSecrets: true })); diff --git a/src/services/following/requests/accept.ts b/src/services/following/requests/accept.ts index 2dff9b01fe..1b89cdb981 100644 --- a/src/services/following/requests/accept.ts +++ b/src/services/following/requests/accept.ts @@ -1,4 +1,4 @@ -import User, { IUser, isRemoteUser, ILocalUser } from "../../../models/user"; +import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from "../../../models/user"; import FollowRequest from "../../../models/follow-request"; import pack from '../../../remote/activitypub/renderer'; import renderFollow from '../../../remote/activitypub/renderer/follow'; @@ -7,6 +7,7 @@ import { deliver } from '../../../queue'; import Following from "../../../models/following"; import FollowingLog from "../../../models/following-log"; import FollowedLog from "../../../models/followed-log"; +import event from '../../../publishers/stream'; export default async function(followee: IUser, follower: IUser) { const following = await Following.insert({ @@ -30,13 +31,13 @@ export default async function(followee: IUser, follower: IUser) { deliver(followee as ILocalUser, content, follower.inbox); } - FollowRequest.remove({ + await FollowRequest.remove({ followeeId: followee._id, followerId: follower._id }); //#region Increment following count - User.update({ _id: follower._id }, { + await User.update({ _id: follower._id }, { $inc: { followingCount: 1 } @@ -50,15 +51,20 @@ export default async function(followee: IUser, follower: IUser) { //#endregion //#region Increment followers count - User.update({ _id: followee._id }, { + await User.update({ _id: followee._id }, { $inc: { followersCount: 1 } }); + FollowedLog.insert({ createdAt: following.createdAt, userId: followee._id, count: followee.followersCount + 1 }); //#endregion + + packUser(followee, followee, { + detail: true + }).then(packed => event(followee._id, 'meUpdated', packed)); } diff --git a/src/services/following/requests/cancel.ts b/src/services/following/requests/cancel.ts index 840f70264c..50c95de0eb 100644 --- a/src/services/following/requests/cancel.ts +++ b/src/services/following/requests/cancel.ts @@ -1,9 +1,10 @@ -import User, { IUser, isRemoteUser, ILocalUser } from "../../../models/user"; +import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from "../../../models/user"; import FollowRequest from "../../../models/follow-request"; import pack from '../../../remote/activitypub/renderer'; import renderFollow from '../../../remote/activitypub/renderer/follow'; import renderUndo from '../../../remote/activitypub/renderer/undo'; import { deliver } from '../../../queue'; +import event from '../../../publishers/stream'; export default async function(followee: IUser, follower: IUser) { if (isRemoteUser(followee)) { @@ -16,9 +17,13 @@ export default async function(followee: IUser, follower: IUser) { followerId: follower._id }); - User.update({ _id: followee._id }, { + await User.update({ _id: followee._id }, { $inc: { pendingReceivedFollowRequestsCount: -1 } }); + + packUser(followee, followee, { + detail: true + }).then(packed => event(followee._id, 'meUpdated', packed)); } diff --git a/src/services/following/requests/create.ts b/src/services/following/requests/create.ts index b69eb5acb0..836d85090d 100644 --- a/src/services/following/requests/create.ts +++ b/src/services/following/requests/create.ts @@ -25,7 +25,7 @@ export default async function(follower: IUser, followee: IUser) { } }); - User.update({ _id: followee._id }, { + await User.update({ _id: followee._id }, { $inc: { pendingReceivedFollowRequestsCount: 1 } @@ -33,7 +33,11 @@ export default async function(follower: IUser, followee: IUser) { // Publish reciveRequest event if (isLocalUser(followee)) { - packUser(follower, followee).then(packed => event(followee._id, 'reciveFollowRequest', packed)), + packUser(follower, followee).then(packed => event(followee._id, 'reciveFollowRequest', packed)); + + packUser(followee, followee, { + detail: true + }).then(packed => event(followee._id, 'meUpdated', packed)); // 通知を作成 notify(followee._id, follower._id, 'reciveFollowRequest'); From 897f7a031d624d8ca37b8efcab573d002c80dbe8 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 2 Jun 2018 16:13:32 +0900 Subject: [PATCH 121/369] wip --- locales/ja.yml | 10 ++- .../views/components/notifications.vue | 4 +- ...ue => received-follow-requests-window.vue} | 0 .../views/components/ui.header.account.vue | 2 +- src/client/app/mobile/script.ts | 2 + .../views/components/notification-preview.vue | 4 +- .../mobile/views/components/notification.vue | 4 +- .../app/mobile/views/components/ui.nav.vue | 1 + .../views/pages/received-follow-requests.vue | 78 +++++++++++++++++++ src/models/notification.ts | 2 +- src/services/following/requests/create.ts | 6 +- 11 files changed, 100 insertions(+), 13 deletions(-) rename src/client/app/desktop/views/components/{follow-requests-window.vue => received-follow-requests-window.vue} (100%) create mode 100644 src/client/app/mobile/views/pages/received-follow-requests.vue diff --git a/locales/ja.yml b/locales/ja.yml index 75ff13afef..959865ce0d 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -618,9 +618,9 @@ desktop/views/components/ui.header.post.vue: desktop/views/components/ui.header.search.vue: placeholder: "検索" -desktop/views/components/follow-requests-window.vue: +desktop/views/components/received-follow-requests-window.vue: title: "フォロー申請" - accept: "許可" + accept: "承認" reject: "拒否" desktop/views/components/user-lists-window.vue: @@ -852,6 +852,7 @@ mobile/views/components/ui.nav.vue: timeline: "タイムライン" notifications: "通知" messaging: "メッセージ" + follow-requests: "フォロー申請" search: "検索" drive: "ドライブ" favorites: "お気に入り" @@ -900,6 +901,11 @@ mobile/views/pages/messaging.vue: mobile/views/pages/messaging-room.vue: messaging: "メッセージ" +mobile/views/pages/received-follow-requests.vue: + title: "フォロー申請" + accept: "承認" + reject: "拒否" + mobile/views/pages/note.vue: title: "投稿" prev: "前の投稿" diff --git a/src/client/app/desktop/views/components/notifications.vue b/src/client/app/desktop/views/components/notifications.vue index 368655095f..f2247a782c 100644 --- a/src/client/app/desktop/views/components/notifications.vue +++ b/src/client/app/desktop/views/components/notifications.vue @@ -50,7 +50,7 @@ </div> </template> - <template v-if="notification.type == 'reciveFollowRequest'"> + <template v-if="notification.type == 'receiveFollowRequest'"> <mk-avatar class="avatar" :user="notification.user"/> <div class="text"> <p>%fa:user-clock% @@ -268,7 +268,7 @@ root(isDark) .text p i color #53c7ce - &.reciveFollowRequest + &.receiveFollowRequest .text p i color #888 diff --git a/src/client/app/desktop/views/components/follow-requests-window.vue b/src/client/app/desktop/views/components/received-follow-requests-window.vue similarity index 100% rename from src/client/app/desktop/views/components/follow-requests-window.vue rename to src/client/app/desktop/views/components/received-follow-requests-window.vue diff --git a/src/client/app/desktop/views/components/ui.header.account.vue b/src/client/app/desktop/views/components/ui.header.account.vue index 8c2da6596a..4e0fc1cf1a 100644 --- a/src/client/app/desktop/views/components/ui.header.account.vue +++ b/src/client/app/desktop/views/components/ui.header.account.vue @@ -49,7 +49,7 @@ <script lang="ts"> import Vue from 'vue'; import MkUserListsWindow from './user-lists-window.vue'; -import MkFollowRequestsWindow from './follow-requests-window.vue'; +import MkFollowRequestsWindow from './received-follow-requests-window.vue'; import MkSettingsWindow from './settings-window.vue'; import MkDriveWindow from './drive-window.vue'; import contains from '../../../common/scripts/contains'; diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts index 607ff63711..300615ec58 100644 --- a/src/client/app/mobile/script.ts +++ b/src/client/app/mobile/script.ts @@ -32,6 +32,7 @@ import MkNotifications from './views/pages/notifications.vue'; import MkWidgets from './views/pages/widgets.vue'; import MkMessaging from './views/pages/messaging.vue'; import MkMessagingRoom from './views/pages/messaging-room.vue'; +import MkReceivedFollowRequests from './views/pages/received-follow-requests.vue'; import MkNote from './views/pages/note.vue'; import MkSearch from './views/pages/search.vue'; import MkFollowers from './views/pages/followers.vue'; @@ -78,6 +79,7 @@ init((launch) => { { path: '/i/favorites', name: 'favorites', component: MkFavorites }, { path: '/i/lists', name: 'user-lists', component: MkUserLists }, { path: '/i/lists/:list', name: 'user-list', component: MkUserList }, + { path: '/i/received-follow-requests', name: 'received-follow-requests', component: MkReceivedFollowRequests }, { path: '/i/widgets', name: 'widgets', component: MkWidgets }, { path: '/i/messaging', name: 'messaging', component: MkMessaging }, { path: '/i/messaging/:user', component: MkMessagingRoom }, diff --git a/src/client/app/mobile/views/components/notification-preview.vue b/src/client/app/mobile/views/components/notification-preview.vue index 6046f77242..5e2306932b 100644 --- a/src/client/app/mobile/views/components/notification-preview.vue +++ b/src/client/app/mobile/views/components/notification-preview.vue @@ -31,7 +31,7 @@ </div> </template> - <template v-if="notification.type == 'reciveFollowRequest'"> + <template v-if="notification.type == 'receiveFollowRequest'"> <mk-avatar class="avatar" :user="notification.user"/> <div class="text"> <p>%fa:user-clock%{{ notification.user | userName }}</p> @@ -125,7 +125,7 @@ export default Vue.extend({ .text p i color #53c7ce - &.reciveFollowRequest + &.receiveFollowRequest .text p i color #888 diff --git a/src/client/app/mobile/views/components/notification.vue b/src/client/app/mobile/views/components/notification.vue index 8109bef38e..9228950209 100644 --- a/src/client/app/mobile/views/components/notification.vue +++ b/src/client/app/mobile/views/components/notification.vue @@ -40,7 +40,7 @@ </div> </div> - <div class="notification followRequest" v-if="notification.type == 'reciveFollowRequest'"> + <div class="notification followRequest" v-if="notification.type == 'receiveFollowRequest'"> <mk-avatar class="avatar" :user="notification.user"/> <div> <header> @@ -167,7 +167,7 @@ root(isDark) > div > header i color #53c7ce - &.reciveFollowRequest + &.receiveFollowRequest > div > header i color #888 diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue index 11a8f7ab97..80f60e4232 100644 --- a/src/client/app/mobile/views/components/ui.nav.vue +++ b/src/client/app/mobile/views/components/ui.nav.vue @@ -18,6 +18,7 @@ <li><router-link to="/" :data-active="$route.name == 'index'">%fa:home%%i18n:@timeline%%fa:angle-right%</router-link></li> <li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotification">%fa:circle%</template>%fa:angle-right%</router-link></li> <li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessage">%fa:circle%</template>%fa:angle-right%</router-link></li> + <li v-if="$store.getters.isSignedIn && $store.state.i.isLocked"><router-link to="/i/received-follow-requests" :data-active="$route.name == 'received-follow-requests'">%fa:R envelope%%i18n:@follow-requests%<template v-if="$store.getters.isSignedIn && $store.state.i.pendingReceivedFollowRequestsCount">%fa:circle%</template>%fa:angle-right%</router-link></li> <li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%%i18n:@game%<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li> </ul> <ul> diff --git a/src/client/app/mobile/views/pages/received-follow-requests.vue b/src/client/app/mobile/views/pages/received-follow-requests.vue new file mode 100644 index 0000000000..bf26a84ff9 --- /dev/null +++ b/src/client/app/mobile/views/pages/received-follow-requests.vue @@ -0,0 +1,78 @@ +<template> +<mk-ui> + <span slot="header">%fa:envelope R%%i18n:@title%</span> + + <main> + <div v-for="req in requests"> + <router-link :key="req.id" :to="req.follower | userPage">{{ req.follower | userName }}</router-link> + <span> + <a @click="accept(req.follower)">%i18n:@accept%</a>|<a @click="reject(req.follower)">%i18n:@reject%</a> + </span> + </div> + </main> +</mk-ui> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import Progress from '../../../common/scripts/loading'; + +export default Vue.extend({ + data() { + return { + fetching: true, + requests: [] + }; + }, + mounted() { + document.title = 'Misskey | %i18n:@title%'; + + Progress.start(); + + (this as any).api('following/requests/list').then(requests => { + this.fetching = false; + this.requests = requests; + + Progress.done(); + }); + }, + methods: { + accept(user) { + (this as any).api('following/requests/accept', { userId: user.id }).then(() => { + this.requests = this.requests.filter(r => r.follower.id != user.id); + }); + }, + reject(user) { + (this as any).api('following/requests/reject', { userId: user.id }).then(() => { + this.requests = this.requests.filter(r => r.follower.id != user.id); + }); + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +main + width 100% + max-width 680px + margin 0 auto + padding 8px + + @media (min-width 500px) + padding 16px + + @media (min-width 600px) + padding 32px + + > div + display flex + padding 16px + border solid 1px isDark ? #1c2023 : #eee + border-radius 4px + + > span + margin 0 0 0 auto + +</style> diff --git a/src/models/notification.ts b/src/models/notification.ts index a17a892541..875c6952b5 100644 --- a/src/models/notification.ts +++ b/src/models/notification.ts @@ -111,7 +111,7 @@ export const pack = (notification: any) => new Promise<any>(async (resolve, reje switch (_notification.type) { case 'follow': - case 'reciveFollowRequest': + case 'receiveFollowRequest': // nope break; case 'mention': diff --git a/src/services/following/requests/create.ts b/src/services/following/requests/create.ts index 836d85090d..fea82b57d8 100644 --- a/src/services/following/requests/create.ts +++ b/src/services/following/requests/create.ts @@ -31,16 +31,16 @@ export default async function(follower: IUser, followee: IUser) { } }); - // Publish reciveRequest event + // Publish receiveRequest event if (isLocalUser(followee)) { - packUser(follower, followee).then(packed => event(followee._id, 'reciveFollowRequest', packed)); + packUser(follower, followee).then(packed => event(followee._id, 'receiveFollowRequest', packed)); packUser(followee, followee, { detail: true }).then(packed => event(followee._id, 'meUpdated', packed)); // 通知を作成 - notify(followee._id, follower._id, 'reciveFollowRequest'); + notify(followee._id, follower._id, 'receiveFollowRequest'); } if (isLocalUser(follower) && isRemoteUser(followee)) { From 60a7f7f1463135939440dce7f5fd03467d3e2183 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 2 Jun 2018 16:27:24 +0900 Subject: [PATCH 122/369] wip --- src/server/api/endpoints/i/update.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 5aff6da103..b94f073d2c 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -28,22 +28,22 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { // Get 'location' parameter const [location, locationErr] = $.str.optional().nullable().pipe(isValidLocation).get(params.location); if (locationErr) return rej('invalid location param'); - if (location !== undefined) updates.profile.location = location; + if (location !== undefined) updates['profile.location'] = location; // Get 'birthday' parameter const [birthday, birthdayErr] = $.str.optional().nullable().pipe(isValidBirthday).get(params.birthday); if (birthdayErr) return rej('invalid birthday param'); - if (birthday !== undefined) updates.profile.birthday = birthday; + if (birthday !== undefined) updates['profile.birthday'] = birthday; // Get 'avatarId' parameter - const [avatarId, avatarIdErr] = $.type(ID).optional().get(params.avatarId); + const [avatarId, avatarIdErr] = $.type(ID).optional().nullable().get(params.avatarId); if (avatarIdErr) return rej('invalid avatarId param'); - if (avatarId) updates.avatarId = avatarId; + if (avatarId !== undefined) updates.avatarId = avatarId; // Get 'bannerId' parameter - const [bannerId, bannerIdErr] = $.type(ID).optional().get(params.bannerId); + const [bannerId, bannerIdErr] = $.type(ID).optional().nullable().get(params.bannerId); if (bannerIdErr) return rej('invalid bannerId param'); - if (bannerId) updates.bannerId = bannerId; + if (bannerId !== undefined) updates.bannerId = bannerId; // Get 'isLocked' parameter const [isLocked, isLockedErr] = $.bool.optional().get(params.isLocked); @@ -63,7 +63,7 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { // Get 'autoWatch' parameter const [autoWatch, autoWatchErr] = $.bool.optional().get(params.autoWatch); if (autoWatchErr) return rej('invalid autoWatch param'); - if (autoWatch != null) updates.settings.autoWatch = autoWatch; + if (autoWatch != null) updates['settings.autoWatch'] = autoWatch; if (avatarId) { const avatar = await DriveFile.findOne({ @@ -90,7 +90,7 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { }); // Serialize - const iObj = await pack(user, user, { + const iObj = await pack(user._id, user, { detail: true, includeSecrets: isSecure }); @@ -98,7 +98,7 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { // Send response res(iObj); - // Publish i updated event + // Publish meUpdated event event(user._id, 'meUpdated', iObj); // 鍵垢を解除したとき、溜まっていたフォローリクエストがあるならすべて承認 From 534e43f72d5f261dfd4bb250f671de7651a919c2 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 2 Jun 2018 19:19:58 +0900 Subject: [PATCH 123/369] Fix bug --- .../mobile/views/components/notification.vue | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/client/app/mobile/views/components/notification.vue b/src/client/app/mobile/views/components/notification.vue index 9228950209..bbcae05f10 100644 --- a/src/client/app/mobile/views/components/notification.vue +++ b/src/client/app/mobile/views/components/notification.vue @@ -66,15 +66,15 @@ </div> <template v-if="notification.type == 'quote'"> - <mk-note :note="notification.note"/> + <mk-note :note="notification.note" @update:note="onNoteUpdated"/> </template> <template v-if="notification.type == 'reply'"> - <mk-note :note="notification.note"/> + <mk-note :note="notification.note" @update:note="onNoteUpdated"/> </template> <template v-if="notification.type == 'mention'"> - <mk-note :note="notification.note"/> + <mk-note :note="notification.note" @update:note="onNoteUpdated"/> </template> </div> </template> @@ -89,6 +89,17 @@ export default Vue.extend({ return { getNoteSummary }; + }, + methods: { + onNoteUpdated(note) { + switch (this.notification.type) { + case 'quote': + case 'reply': + case 'mention': + Vue.set(this.notification, 'note', note); + break; + } + } } }); </script> From 0aa9201770351fca74f84b57202cc90cbb95b847 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 2 Jun 2018 19:23:17 +0900 Subject: [PATCH 124/369] 2.25.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index f28a0645af..3dd2648643 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.24.3", - "clientVersion": "1.0.6055", + "version": "2.25.0", + "clientVersion": "1.0.6111", "codename": "nighthike", "main": "./built/index.js", "private": true, From 255c07d1ab3996a52dab4e32a16861f11f923267 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 3 Jun 2018 04:51:58 +0900 Subject: [PATCH 125/369] 2.25.1 --- package.json | 4 ++-- src/client/app/auth/views/index.vue | 3 ++- src/client/app/desktop/views/components/notes.note.vue | 6 +++--- src/client/app/mobile/views/components/note.vue | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 3dd2648643..ad1398525f 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.25.0", - "clientVersion": "1.0.6111", + "version": "2.25.1", + "clientVersion": "1.0.6112", "codename": "nighthike", "main": "./built/index.js", "private": true, diff --git a/src/client/app/auth/views/index.vue b/src/client/app/auth/views/index.vue index 826bcd125d..b9c7cf7c2b 100644 --- a/src/client/app/auth/views/index.vue +++ b/src/client/app/auth/views/index.vue @@ -3,6 +3,7 @@ <main v-if="$store.getters.isSignedIn"> <p class="fetching" v-if="fetching">読み込み中<mk-ellipsis/></p> <x-form + class="form" ref="form" v-if="state == 'waiting'" :session="session" @@ -102,7 +103,7 @@ export default Vue.extend({ padding 32px color #555 - > div + > div:not(.form) padding 64px > h1 diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 5f4b0532a8..ca67373c23 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -463,7 +463,7 @@ root(isDark) > .app margin-right 8px padding-right 8px - border-right solid 1px #eaeaea + border-right solid 1px isDark ? #1c2023 : #eaeaea > .visibility margin-left 8px @@ -552,7 +552,7 @@ root(isDark) padding 2px 8px 2px 16px font-size 90% color #8d969e - background #edf0f3 + background isDark ? #313543 : #edf0f3 border-radius 4px &:before @@ -565,7 +565,7 @@ root(isDark) width 8px height 8px margin auto 0 - background #fff + background isDark ? #282c37 : #fff border-radius 100% &:hover diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 34326e12f3..37d86fe235 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -502,7 +502,7 @@ root(isDark) padding 2px 8px 2px 16px font-size 90% color #8d969e - background #edf0f3 + background isDark ? #313543 : #edf0f3 border-radius 4px &:before @@ -515,7 +515,7 @@ root(isDark) width 8px height 8px margin auto 0 - background #fff + background isDark ? #282c37 : #fff border-radius 100% > .media From 70ac07d60e14046c89f7dd7d7d9c80d3b9fddd27 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 3 Jun 2018 07:34:34 +0900 Subject: [PATCH 126/369] :art: --- src/client/app/auth/assets/icon.svg | 1 + src/client/app/auth/assets/logo.svg | 7 ------- src/client/app/auth/views/index.vue | 8 ++++---- 3 files changed, 5 insertions(+), 11 deletions(-) create mode 100644 src/client/app/auth/assets/icon.svg delete mode 100644 src/client/app/auth/assets/logo.svg diff --git a/src/client/app/auth/assets/icon.svg b/src/client/app/auth/assets/icon.svg new file mode 100644 index 0000000000..36f5d3e404 --- /dev/null +++ b/src/client/app/auth/assets/icon.svg @@ -0,0 +1 @@ +<?xml version="1.0" standalone="no"?><!-- Generator: Gravit.io --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="isolation:isolate" viewBox="0 0 512 512" width="512" height="512"><defs><clipPath id="_clipPath_P6eAE2OaBltOJ3gHGVajfqsOnfv4xIns"><rect width="512" height="512"/></clipPath></defs><g clip-path="url(#_clipPath_P6eAE2OaBltOJ3gHGVajfqsOnfv4xIns)"><clipPath id="_clipPath_P6q7MZAUp3XpQhVgs2GuAbegX9v4gkom"><rect x="0" y="0" width="512" height="512" transform="matrix(1,0,0,1,0,0)" fill="rgb(255,255,255)"/></clipPath><g clip-path="url(#_clipPath_P6q7MZAUp3XpQhVgs2GuAbegX9v4gkom)"><g id="Group"><g id="g4502"><g id="g5125"><g id="text4489"><path d=" M 190.093 359.243 C 167.923 359.32 148.881 345.963 139.9 330.409 C 135.104 323.615 125.617 321.198 125.482 330.409 L 125.482 372.939 C 125.482 390.026 119.253 404.799 106.794 417.258 C 94.69 429.362 79.917 435.413 62.474 435.413 C 45.387 435.413 30.614 429.362 18.155 417.258 C 6.052 404.799 0 390.026 0 372.939 L 0 139.061 C 0 125.89 3.738 113.965 11.213 103.285 C 19.045 92.25 29.012 84.596 41.116 80.325 C 47.879 77.833 54.999 76.587 62.474 76.587 C 81.697 76.587 97.716 84.062 110.531 99.013 C 117.295 106.489 121.211 110.405 122.279 110.761 C 122.279 110.761 173.043 172.145 174.467 173.213 C 175.891 174.281 180.073 182.446 190.093 182.446 C 200.112 182.446 204.829 174.281 206.253 173.213 C 207.676 172.145 258.44 110.761 258.44 110.761 C 258.796 111.117 262.534 107.201 269.654 99.013 C 282.825 84.062 299.022 76.587 318.245 76.587 C 325.364 76.587 332.484 77.833 339.603 80.325 C 351.707 84.596 361.496 92.25 368.972 103.285 C 376.803 113.965 380.719 125.89 380.719 139.061 L 380.719 372.939 C 380.719 390.026 374.489 404.799 362.03 417.258 C 349.927 429.362 335.154 435.413 317.711 435.413 C 300.624 435.413 285.851 429.362 273.391 417.258 C 261.288 404.799 255.237 390.026 255.237 372.939 L 255.237 330.409 C 254.184 318.802 243.925 326.116 240.285 330.409 C 230.674 348.208 212.262 359.167 190.093 359.243 Z M 457.535 184.448 Q 435.109 184.448 419.09 168.963 Q 403.605 152.944 403.605 130.518 Q 403.605 108.091 419.09 92.606 Q 435.109 76.587 457.535 76.587 Q 479.962 76.587 495.981 92.606 Q 512 108.091 512 130.518 Q 512 152.944 495.981 168.963 Q 479.962 184.448 457.535 184.448 Z M 458.069 195.128 Q 480.496 195.128 495.981 211.147 Q 512 227.166 512 249.592 L 512 381.482 Q 512 403.909 495.981 419.928 Q 480.496 435.413 458.069 435.413 Q 435.643 435.413 419.624 419.928 Q 403.605 403.909 403.605 381.482 L 403.605 249.592 Q 403.605 227.166 419.624 211.147 Q 435.643 195.128 458.069 195.128 Z " fill-rule="evenodd" fill="rgb(157,157,157)"/></g></g></g></g></g></g></svg> \ No newline at end of file diff --git a/src/client/app/auth/assets/logo.svg b/src/client/app/auth/assets/logo.svg deleted file mode 100644 index 19b8a2737e..0000000000 --- a/src/client/app/auth/assets/logo.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" - y="0px" width="1024px" height="512px" viewBox="0 256 1024 512" enable-background="new 0 256 1024 512" xml:space="preserve"> -<polyline opacity="0.5" fill="none" stroke="#000000" stroke-width="34" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points=" - 896.5,608.5 800.5,416.5 704.5,608.5 608.5,416.5 512.5,608.5 416.5,416.5 320.5,608.5 224.5,416.5 128.5,608.5 "/> -</svg> diff --git a/src/client/app/auth/views/index.vue b/src/client/app/auth/views/index.vue index b9c7cf7c2b..6d0ba3cda3 100644 --- a/src/client/app/auth/views/index.vue +++ b/src/client/app/auth/views/index.vue @@ -27,7 +27,7 @@ <h1>サインインしてください</h1> <mk-signin/> </main> - <footer><img src="/assets/auth/logo.svg" alt="Misskey"/></footer> + <footer><img src="/assets/auth/icon.svg" alt="Misskey"/></footer> </div> </template> @@ -144,8 +144,8 @@ export default Vue.extend({ > footer > img display block - width 64px - height 64px - margin 0 auto + width 32px + height 32px + margin 16px auto </style> From 5e967e24ff05ff83075c086a5e25d10ea299a3e0 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 3 Jun 2018 19:39:02 +0900 Subject: [PATCH 127/369] :v: --- locales/ja.yml | 4 ++-- src/client/app/desktop/views/components/follow-button.vue | 2 +- src/client/app/mobile/views/components/follow-button.vue | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/locales/ja.yml b/locales/ja.yml index 959865ce0d..a62b341f69 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -331,7 +331,7 @@ desktop/views/components/drive.vue: url-upload: "URLからアップロード" desktop/views/components/follow-button.vue: - unfollow: "フォロー中" + following: "フォロー中" follow: "フォロー" request-pending: "フォロー許可待ち" follow-request: "フォロー申請" @@ -780,7 +780,7 @@ mobile/views/components/drive.file-detail.vue: exif: "EXIF" mobile/views/components/follow-button.vue: - unfollow: "フォロー中" + following: "フォロー中" follow: "フォロー" request-pending: "フォロー許可待ち" follow-request: "フォロー申請" diff --git a/src/client/app/desktop/views/components/follow-button.vue b/src/client/app/desktop/views/components/follow-button.vue index c7549c374e..62742a8f39 100644 --- a/src/client/app/desktop/views/components/follow-button.vue +++ b/src/client/app/desktop/views/components/follow-button.vue @@ -6,7 +6,7 @@ > <template v-if="!wait"> <template v-if="u.hasPendingFollowRequestFromYou">%fa:hourglass-half%<template v-if="size == 'big'"> %i18n:@request-pending%</template></template> - <template v-else-if="u.isFollowing">%fa:minus%<template v-if="size == 'big'"> %i18n:@unfollow%</template></template> + <template v-else-if="u.isFollowing">%fa:minus%<template v-if="size == 'big'"> %i18n:@following%</template></template> <template v-else-if="!u.isFollowing && u.isLocked">%fa:plus%<template v-if="size == 'big'"> %i18n:@follow-request%</template></template> <template v-else-if="!u.isFollowing && !u.isLocked">%fa:plus%<template v-if="size == 'big'"> %i18n:@follow%</template></template> </template> diff --git a/src/client/app/mobile/views/components/follow-button.vue b/src/client/app/mobile/views/components/follow-button.vue index d8441a20b9..b6a52fe1ed 100644 --- a/src/client/app/mobile/views/components/follow-button.vue +++ b/src/client/app/mobile/views/components/follow-button.vue @@ -6,7 +6,7 @@ > <template v-if="!wait"> <template v-if="u.hasPendingFollowRequestFromYou">%fa:hourglass-half% %i18n:@request-pending%</template> - <template v-else-if="u.isFollowing">%fa:minus% %i18n:@unfollow%</template> + <template v-else-if="u.isFollowing">%fa:minus% %i18n:@following%</template> <template v-else-if="!u.isFollowing && u.isLocked">%fa:plus% %i18n:@follow-request%</template> <template v-else-if="!u.isFollowing && !u.isLocked">%fa:plus% %i18n:@follow%</template> </template> @@ -102,6 +102,7 @@ export default Vue.extend({ min-width 150px line-height 36px font-size 14px + font-weight bold color $theme-color background transparent outline none From 761ae807dbc99ebf7b7bee9bad194217c5986c9b Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 3 Jun 2018 19:53:57 +0900 Subject: [PATCH 128/369] Fix bug --- src/server/api/endpoints/following/create.ts | 2 +- src/server/api/endpoints/following/delete.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/api/endpoints/following/create.ts b/src/server/api/endpoints/following/create.ts index 48205232e6..b9610658d1 100644 --- a/src/server/api/endpoints/following/create.ts +++ b/src/server/api/endpoints/following/create.ts @@ -49,5 +49,5 @@ module.exports = (params, user) => new Promise(async (res, rej) => { create(follower, followee); // Send response - res(await pack(followee, user)); + res(await pack(followee._id, user)); }); diff --git a/src/server/api/endpoints/following/delete.ts b/src/server/api/endpoints/following/delete.ts index f4030c247a..4fcdaf5a82 100644 --- a/src/server/api/endpoints/following/delete.ts +++ b/src/server/api/endpoints/following/delete.ts @@ -49,5 +49,5 @@ module.exports = (params, user) => new Promise(async (res, rej) => { deleteFollowing(follower, followee); // Send response - res(await pack(followee, user)); + res(await pack(followee._id, user)); }); From f87981eeee10c9ec4d31080a0edc620bb30f3ddd Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 4 Jun 2018 19:59:07 +0900 Subject: [PATCH 129/369] 2.25.2 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ad1398525f..2e59e17f4d 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.25.1", - "clientVersion": "1.0.6112", + "version": "2.25.2", + "clientVersion": "1.0.6116", "codename": "nighthike", "main": "./built/index.js", "private": true, From a408b19bbeae2899c878626b5d5ba8393c8258ce Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Tue, 5 Jun 2018 15:09:21 +0900 Subject: [PATCH 130/369] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 842c3e8a34..380795c7d1 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ ultimately sophisticated new type of mini-blog based SNS. * User lists * Private messages * Mute -* Real time contents +* Streaming * ActivityPub compatible and more! You can see it with your own eyes at [misskey.xyz](https://misskey.xyz). From 9ce0f96de3ba32e25893f6d248f35badaa522479 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 5 Jun 2018 21:36:21 +0900 Subject: [PATCH 131/369] wip --- locales/ja.yml | 1 + src/client/app/desktop/script.ts | 2 + .../views/components/ui.header.nav.vue | 6 + .../app/desktop/views/components/ui.vue | 9 + .../desktop/views/pages/deck/deck.column.vue | 59 ++ .../views/pages/deck/deck.note.sub.vue | 153 +++++ .../desktop/views/pages/deck/deck.note.vue | 539 ++++++++++++++++++ .../desktop/views/pages/deck/deck.notes.vue | 248 ++++++++ .../app/desktop/views/pages/deck/deck.tl.vue | 143 +++++ .../app/desktop/views/pages/deck/deck.vue | 42 ++ 10 files changed, 1202 insertions(+) create mode 100644 src/client/app/desktop/views/pages/deck/deck.column.vue create mode 100644 src/client/app/desktop/views/pages/deck/deck.note.sub.vue create mode 100644 src/client/app/desktop/views/pages/deck/deck.note.vue create mode 100644 src/client/app/desktop/views/pages/deck/deck.notes.vue create mode 100644 src/client/app/desktop/views/pages/deck/deck.tl.vue create mode 100644 src/client/app/desktop/views/pages/deck/deck.vue diff --git a/locales/ja.yml b/locales/ja.yml index a62b341f69..026c2308c3 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -606,6 +606,7 @@ desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.nav.vue: home: "ホーム" + deck: "デッキ" messaging: "メッセージ" game: "ゲーム" diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts index 8fb6096afa..61f1f5b870 100644 --- a/src/client/app/desktop/script.ts +++ b/src/client/app/desktop/script.ts @@ -23,6 +23,7 @@ import updateAvatar from './api/update-avatar'; import updateBanner from './api/update-banner'; import MkIndex from './views/pages/index.vue'; +import MkDeck from './views/pages/deck/deck.vue'; import MkUser from './views/pages/user/user.vue'; import MkFavorites from './views/pages/favorites.vue'; import MkSelectDrive from './views/pages/selectdrive.vue'; @@ -50,6 +51,7 @@ init(async (launch) => { mode: 'history', routes: [ { path: '/', name: 'index', component: MkIndex }, + { path: '/deck', name: 'deck', component: MkDeck }, { path: '/i/customize-home', component: MkHomeCustomize }, { path: '/i/favorites', component: MkFavorites }, { path: '/i/messaging/:user', component: MkMessagingRoom }, diff --git a/src/client/app/desktop/views/components/ui.header.nav.vue b/src/client/app/desktop/views/components/ui.header.nav.vue index 4780c57cb4..8e792b3df5 100644 --- a/src/client/app/desktop/views/components/ui.header.nav.vue +++ b/src/client/app/desktop/views/components/ui.header.nav.vue @@ -8,6 +8,12 @@ <p>%i18n:@home%</p> </router-link> </li> + <li class="deck" :class="{ active: $route.name == 'deck' }"> + <router-link to="/deck"> + %fa:columns% + <p>%i18n:@deck%</p> + </router-link> + </li> <li class="messaging"> <a @click="messaging"> %fa:comments% diff --git a/src/client/app/desktop/views/components/ui.vue b/src/client/app/desktop/views/components/ui.vue index 32cc71e4b0..ad6fc69dfa 100644 --- a/src/client/app/desktop/views/components/ui.vue +++ b/src/client/app/desktop/views/components/ui.vue @@ -37,7 +37,16 @@ export default Vue.extend({ <style lang="stylus" scoped> .mk-ui + display flex + flex-direction column + flex 1 + > .header @media (max-width 1000px) display none + + > .content + display flex + flex-direction column + flex 1 </style> diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue new file mode 100644 index 0000000000..4e06798293 --- /dev/null +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -0,0 +1,59 @@ +<template> +<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs"> + <header> + <slot name="header">Timeline</slot> + </header> + <div ref="body"> + <x-tl ref="tl"/> + </div> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import XTl from './deck.tl.vue'; + +export default Vue.extend({ + components: { + XTl + }, + mounted() { + this.$nextTick(() => { + this.$refs.tl.mount(this.$refs.body); + }); + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +root(isDark) + flex 1 + max-width 330px + height 100% + margin-right 16px + background isDark ? #282C37 : #fff + border-radius 6px + box-shadow 0 2px 16px rgba(#000, 0.1) + overflow hidden + + > header + z-index 1 + line-height 48px + padding 0 16px + color isDark ? #e3e5e8 : #888 + background isDark ? #313543 : #fff + box-shadow 0 1px rgba(#000, 0.15) + + > div + height calc(100% - 48px) + overflow auto + +.dnpfarvgbnfmyzbdquhhzyxcmstpdqzs[data-darkmode] + root(true) + +.dnpfarvgbnfmyzbdquhhzyxcmstpdqzs:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/desktop/views/pages/deck/deck.note.sub.vue b/src/client/app/desktop/views/pages/deck/deck.note.sub.vue new file mode 100644 index 0000000000..b458b74186 --- /dev/null +++ b/src/client/app/desktop/views/pages/deck/deck.note.sub.vue @@ -0,0 +1,153 @@ +<template> +<div class="fnlfosztlhtptnongximhlbykxblytcq"> + <mk-avatar class="avatar" :user="note.user"/> + <div class="main"> + <header> + <router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link> + <span class="is-admin" v-if="note.user.isAdmin">%i18n:@admin%</span> + <span class="is-bot" v-if="note.user.isBot">%i18n:@bot%</span> + <span class="is-cat" v-if="note.user.isCat">%i18n:@cat%</span> + <span class="username"><mk-acct :user="note.user"/></span> + <div class="info"> + <span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span> + <router-link class="created-at" :to="note | notePage"> + <mk-time :time="note.createdAt"/> + </router-link> + <span class="visibility" v-if="note.visibility != 'public'"> + <template v-if="note.visibility == 'home'">%fa:home%</template> + <template v-if="note.visibility == 'followers'">%fa:unlock%</template> + <template v-if="note.visibility == 'specified'">%fa:envelope%</template> + <template v-if="note.visibility == 'private'">%fa:lock%</template> + </span> + </div> + </header> + <div class="body"> + <mk-sub-note-content class="text" :note="note"/> + </div> + </div> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; + +export default Vue.extend({ + props: { + note: { + type: Object, + required: true + }, + // TODO + truncate: { + type: Boolean, + default: true + } + } +}); +</script> + +<style lang="stylus" scoped> +root(isDark) + display flex + padding 16px + font-size 10px + background isDark ? #21242d : #fcfcfc + + &.smart + > .main + width 100% + + > header + align-items center + + > .avatar + flex-shrink 0 + display block + margin 0 8px 0 0 + width 38px + height 38px + border-radius 8px + + > .main + flex 1 + min-width 0 + + > header + display flex + align-items baseline + margin-bottom 2px + white-space nowrap + + > .avatar + flex-shrink 0 + margin-right 8px + width 18px + height 18px + border-radius 100% + + > .name + display block + margin 0 0.5em 0 0 + padding 0 + overflow hidden + color isDark ? #fff : #607073 + font-size 1em + font-weight 700 + text-align left + text-decoration none + text-overflow ellipsis + + &:hover + text-decoration underline + + > .is-admin + > .is-bot + > .is-cat + align-self center + margin 0 0.5em 0 0 + padding 1px 5px + font-size 0.8em + color isDark ? #758188 : #aaa + border solid 1px isDark ? #57616f : #ddd + border-radius 3px + + &.is-admin + border-color isDark ? #d42c41 : #f56a7b + color isDark ? #d42c41 : #f56a7b + + > .username + text-align left + margin 0 + color isDark ? #606984 : #d1d8da + + > .info + margin-left auto + font-size 0.9em + + > * + color isDark ? #606984 : #b2b8bb + + > .mobile + margin-right 6px + + > .visibility + margin-left 6px + + > .body + + > .text + margin 0 + padding 0 + color isDark ? #959ba7 : #717171 + + pre + max-height 120px + font-size 80% + +.fnlfosztlhtptnongximhlbykxblytcq[data-darkmode] + root(true) + +.fnlfosztlhtptnongximhlbykxblytcq:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue new file mode 100644 index 0000000000..8582a37b91 --- /dev/null +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -0,0 +1,539 @@ +<template> +<div class="zyjjkidcqjnlegkqebitfviomuqmseqk" :class="{ renote: isRenote }"> + <div class="reply-to" v-if="p.reply && (!$store.getters.isSignedIn || $store.state.settings.showReplyTarget)"> + <x-sub :note="p.reply"/> + </div> + <div class="renote" v-if="isRenote"> + <mk-avatar class="avatar" :user="note.user"/> + %fa:retweet% + <span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span> + <router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link> + <span>{{ '%i18n:@reposted-by%'.substr('%i18n:@reposted-by%'.indexOf('}') + 1) }}</span> + <mk-time :time="note.createdAt"/> + </div> + <article> + <mk-avatar class="avatar" :user="p.user"/> + <div class="main"> + <header> + <router-link class="name" :to="p.user | userPage">{{ p.user | userName }}</router-link> + <span class="is-admin" v-if="p.user.isAdmin">admin</span> + <span class="is-bot" v-if="p.user.isBot">bot</span> + <span class="is-cat" v-if="p.user.isCat">cat</span> + <span class="username"><mk-acct :user="p.user"/></span> + <div class="info"> + <span class="mobile" v-if="p.viaMobile">%fa:mobile-alt%</span> + <router-link class="created-at" :to="p | notePage"> + <mk-time :time="p.createdAt"/> + </router-link> + <span class="visibility" v-if="p.visibility != 'public'"> + <template v-if="p.visibility == 'home'">%fa:home%</template> + <template v-if="p.visibility == 'followers'">%fa:unlock%</template> + <template v-if="p.visibility == 'specified'">%fa:envelope%</template> + <template v-if="p.visibility == 'private'">%fa:lock%</template> + </span> + </div> + </header> + <div class="body"> + <p v-if="p.cw != null" class="cw"> + <span class="text" v-if="p.cw != ''">{{ p.cw }}</span> + <span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@less%' : '%i18n:@more%' }}</span> + </p> + <div class="content" v-show="p.cw == null || showContent"> + <div class="text"> + <span v-if="p.isHidden" style="opacity: 0.5">(%i18n:@private%)</span> + <span v-if="p.deletedAt" style="opacity: 0.5">(%i18n:@deleted%)</span> + <a class="reply" v-if="p.reply">%fa:reply%</a> + <mk-note-html v-if="p.text && !canHideText(p)" :text="p.text" :i="$store.state.i"/> + <a class="rp" v-if="p.renote != null">RP:</a> + </div> + <div class="media" v-if="p.media.length > 0"> + <mk-media-list :media-list="p.media"/> + </div> + <mk-poll v-if="p.poll" :note="p" ref="pollViewer"/> + <div class="tags" v-if="p.tags && p.tags.length > 0"> + <router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link> + </div> + <a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> + <div class="renote" v-if="p.renote"> + <mk-note-preview :note="p.renote"/> + </div> + </div> + <span class="app" v-if="p.app">via <b>{{ p.app.name }}</b></span> + </div> + <footer> + <mk-reactions-viewer :note="p" ref="reactionsViewer"/> + <button @click="reply"> + <template v-if="p.reply">%fa:reply-all%</template> + <template v-else>%fa:reply%</template> + </button> + <button @click="renote" title="Renote">%fa:retweet%</button> + <button :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton">%fa:plus%</button> + <button class="menu" @click="menu" ref="menuButton">%fa:ellipsis-h%</button> + </footer> + </div> + </article> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import parse from '../../../../../../text/parse'; +import canHideText from '../../../../common/scripts/can-hide-text'; + +import MkNoteMenu from '../../../../common/views/components/note-menu.vue'; +import MkReactionPicker from '../../../../common/views/components/reaction-picker.vue'; +import XSub from './deck.note.sub.vue'; + +export default Vue.extend({ + components: { + XSub + }, + + props: ['note'], + + data() { + return { + showContent: false, + connection: null, + connectionId: null + }; + }, + + computed: { + isRenote(): boolean { + return (this.note.renote && + this.note.text == null && + this.note.mediaIds.length == 0 && + this.note.poll == null); + }, + + p(): any { + return this.isRenote ? this.note.renote : this.note; + }, + + reactionsCount(): number { + return this.p.reactionCounts + ? Object.keys(this.p.reactionCounts) + .map(key => this.p.reactionCounts[key]) + .reduce((a, b) => a + b) + : 0; + }, + + urls(): string[] { + if (this.p.text) { + const ast = parse(this.p.text); + return ast + .filter(t => (t.type == 'url' || t.type == 'link') && !t.silent) + .map(t => t.url); + } else { + return null; + } + } + }, + + created() { + if (this.$store.getters.isSignedIn) { + this.connection = (this as any).os.stream.getConnection(); + this.connectionId = (this as any).os.stream.use(); + } + }, + + mounted() { + this.capture(true); + + if (this.$store.getters.isSignedIn) { + this.connection.on('_connected_', this.onStreamConnected); + } + + // Draw map + if (this.p.geo) { + const shouldShowMap = this.$store.getters.isSignedIn ? this.$store.state.settings.showMaps : true; + if (shouldShowMap) { + (this as any).os.getGoogleMaps().then(maps => { + const uluru = new maps.LatLng(this.p.geo.coordinates[1], this.p.geo.coordinates[0]); + const map = new maps.Map(this.$refs.map, { + center: uluru, + zoom: 15 + }); + new maps.Marker({ + position: uluru, + map: map + }); + }); + } + } + }, + + beforeDestroy() { + this.decapture(true); + + if (this.$store.getters.isSignedIn) { + this.connection.off('_connected_', this.onStreamConnected); + (this as any).os.stream.dispose(this.connectionId); + } + }, + + methods: { + canHideText, + + capture(withHandler = false) { + if (this.$store.getters.isSignedIn) { + this.connection.send({ + type: 'capture', + id: this.p.id + }); + if (withHandler) this.connection.on('note-updated', this.onStreamNoteUpdated); + } + }, + + decapture(withHandler = false) { + if (this.$store.getters.isSignedIn) { + this.connection.send({ + type: 'decapture', + id: this.p.id + }); + if (withHandler) this.connection.off('note-updated', this.onStreamNoteUpdated); + } + }, + + onStreamConnected() { + this.capture(); + }, + + onStreamNoteUpdated(data) { + const note = data.note; + if (note.id == this.note.id) { + this.$emit('update:note', note); + } else if (note.id == this.note.renoteId) { + this.note.renote = note; + } + }, + + reply() { + (this as any).apis.post({ + reply: this.p + }); + }, + + renote() { + (this as any).apis.post({ + renote: this.p + }); + }, + + react() { + (this as any).os.new(MkReactionPicker, { + source: this.$refs.reactButton, + note: this.p, + compact: true + }); + }, + + menu() { + (this as any).os.new(MkNoteMenu, { + source: this.$refs.menuButton, + note: this.p, + compact: true + }); + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +root(isDark) + font-size 12px + border-bottom solid 1px isDark ? #1c2023 : #eaeaea + + &:last-of-type + border-bottom none + + &.smart + > article + > .main + > header + align-items center + margin-bottom 4px + + > .renote + display flex + align-items center + padding 8px 16px + line-height 28px + white-space pre + color #9dbb00 + background isDark ? linear-gradient(to bottom, #314027 0%, #282c37 100%) : linear-gradient(to bottom, #edfde2 0%, #fff 100%) + + .avatar + flex-shrink 0 + display inline-block + width 20px + height 20px + margin 0 8px 0 0 + border-radius 6px + + [data-fa] + margin-right 4px + + > span + flex-shrink 0 + + &:last-of-type + margin-right 8px + + .name + overflow hidden + flex-shrink 1 + text-overflow ellipsis + white-space nowrap + font-weight bold + + > .mk-time + display block + margin-left auto + flex-shrink 0 + font-size 0.9em + + & + article + padding-top 8px + + > article + display flex + padding 16px 16px 9px + + > .avatar + flex-shrink 0 + display block + margin 0 10px 8px 0 + width 42px + height 42px + border-radius 6px + //position -webkit-sticky + //position sticky + //top 62px + + > .main + flex 1 + min-width 0 + + > header + display flex + align-items baseline + white-space nowrap + + > .avatar + flex-shrink 0 + margin-right 8px + width 20px + height 20px + border-radius 100% + + > .name + display block + margin 0 0.5em 0 0 + padding 0 + overflow hidden + color isDark ? #fff : #627079 + font-weight bold + text-decoration none + text-overflow ellipsis + + > .is-admin + > .is-bot + > .is-cat + align-self center + margin 0 0.5em 0 0 + padding 1px 6px + font-size 0.8em + color isDark ? #758188 : #aaa + border solid 1px isDark ? #57616f : #ddd + border-radius 3px + + &.is-admin + border-color isDark ? #d42c41 : #f56a7b + color isDark ? #d42c41 : #f56a7b + + > .username + margin 0 0.5em 0 0 + overflow hidden + text-overflow ellipsis + color isDark ? #606984 : #ccc + + > .info + margin-left auto + font-size 0.9em + + > * + color isDark ? #606984 : #c0c0c0 + + > .mobile + margin-right 6px + + > .visibility + margin-left 6px + + > .body + + > .cw + cursor default + display block + margin 0 + padding 0 + overflow-wrap break-word + color isDark ? #fff : #717171 + + > .text + margin-right 8px + + > .toggle + display inline-block + padding 4px 8px + font-size 0.7em + color isDark ? #393f4f : #fff + background isDark ? #687390 : #b1b9c1 + border-radius 2px + cursor pointer + user-select none + + &:hover + background isDark ? #707b97 : #bbc4ce + + > .content + + > .text + display block + margin 0 + padding 0 + overflow-wrap break-word + color isDark ? #fff : #717171 + + >>> .title + display block + margin-bottom 4px + padding 4px + font-size 90% + text-align center + background isDark ? #2f3944 : #eef1f3 + border-radius 4px + + >>> .code + margin 8px 0 + + >>> .quote + margin 8px + padding 6px 12px + color isDark ? #6f808e : #aaa + border-left solid 3px isDark ? #637182 : #eee + + > .reply + margin-right 8px + color isDark ? #99abbf : #717171 + + > .rp + margin-left 4px + font-style oblique + color #a0bf46 + + [data-is-me]:after + content "you" + padding 0 4px + margin-left 4px + font-size 80% + color $theme-color-foreground + background $theme-color + border-radius 4px + + .mk-url-preview + margin-top 8px + + > .tags + margin 4px 0 0 0 + + > * + display inline-block + margin 0 8px 0 0 + padding 2px 8px 2px 16px + font-size 90% + color #8d969e + background isDark ? #313543 : #edf0f3 + border-radius 4px + + &:before + content "" + display block + position absolute + top 0 + bottom 0 + left 4px + width 8px + height 8px + margin auto 0 + background isDark ? #282c37 : #fff + border-radius 100% + + > .media + > img + display block + max-width 100% + + > .location + margin 4px 0 + font-size 12px + color #ccc + + > .map + width 100% + height 200px + + &:empty + display none + + > .mk-poll + font-size 80% + + > .renote + margin 8px 0 + + > .mk-note-preview + padding 16px + border dashed 1px isDark ? #4e945e : #c0dac6 + border-radius 8px + + > .app + font-size 12px + color #ccc + + > footer + > button + margin 0 + padding 8px + background transparent + border none + box-shadow none + font-size 1em + color isDark ? #606984 : #ddd + cursor pointer + + &:not(:last-child) + margin-right 28px + + &:hover + color isDark ? #9198af : #666 + + > .count + display inline + margin 0 0 0 8px + color #999 + + &.reacted + color $theme-color + +.zyjjkidcqjnlegkqebitfviomuqmseqk[data-darkmode] + root(true) + +.zyjjkidcqjnlegkqebitfviomuqmseqk:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue new file mode 100644 index 0000000000..ff871b049d --- /dev/null +++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue @@ -0,0 +1,248 @@ +<template> +<div class="eamppglmnmimdhrlzhplwpvyeaqmmhxu"> + <div class="newer-indicator" v-show="queue.length > 0"></div> + + <slot name="empty" v-if="notes.length == 0 && !fetching && requestInitPromise == null"></slot> + + <div v-if="!fetching && requestInitPromise != null"> + <p>%i18n:@error%</p> + <button @click="resolveInitPromise">%i18n:@retry%</button> + </div> + + <transition-group name="mk-notes" class="transition"> + <template v-for="(note, i) in _notes"> + <x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)"/> + <p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date"> + <span>%fa:angle-up%{{ note._datetext }}</span> + <span>%fa:angle-down%{{ _notes[i + 1]._datetext }}</span> + </p> + </template> + </transition-group> + + <footer v-if="more"> + <button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }"> + <template v-if="!moreFetching">%i18n:@load-more%</template> + <template v-if="moreFetching">%fa:spinner .pulse .fw%</template> + </button> + </footer> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import { url } from '../../../config'; +import getNoteSummary from '../../../../../renderers/get-note-summary'; + +import XNote from './deck.note.vue'; + +const displayLimit = 30; + +export default Vue.extend({ + components: { + XNote + }, + + props: { + more: { + type: Function, + required: false + } + }, + + data() { + return { + rootEl: null, + requestInitPromise: null as () => Promise<any[]>, + notes: [], + queue: [], + unreadCount: 0, + fetching: true, + moreFetching: false + }; + }, + + computed: { + _notes(): any[] { + return (this.notes as any).map(note => { + const date = new Date(note.createdAt).getDate(); + const month = new Date(note.createdAt).getMonth() + 1; + note._date = date; + note._datetext = `${month}月 ${date}日`; + return note; + }); + } + }, + + beforeDestroy() { + this.root.removeEventListener('scroll', this.onScroll); + }, + + methods: { + mount(root) { + this.rootEl = root; + this.rootEl.addEventListener('scroll', this.onScroll); + }, + + isScrollTop() { + if (this.rootEl == null) return true; + return this.rootEl.scrollTop <= 8; + }, + + focus() { + (this.$el as any).children[0].focus(); + }, + + onNoteUpdated(i, note) { + Vue.set((this as any).notes, i, note); + }, + + init(promiseGenerator: () => Promise<any[]>) { + this.requestInitPromise = promiseGenerator; + this.resolveInitPromise(); + }, + + resolveInitPromise() { + this.queue = []; + this.notes = []; + this.fetching = true; + + const promise = this.requestInitPromise(); + + promise.then(notes => { + this.notes = notes; + this.requestInitPromise = null; + this.fetching = false; + }, e => { + this.fetching = false; + }); + }, + + prepend(note, silent = false) { + //#region 弾く + const isMyNote = note.userId == this.$store.state.i.id; + const isPureRenote = note.renoteId != null && note.text == null && note.mediaIds.length == 0 && note.poll == null; + + if (this.$store.state.settings.showMyRenotes === false) { + if (isMyNote && isPureRenote) { + return; + } + } + + if (this.$store.state.settings.showRenotedMyNotes === false) { + if (isPureRenote && (note.renote.userId == this.$store.state.i.id)) { + return; + } + } + //#endregion + + if (this.isScrollTop()) { + // Prepend the note + this.notes.unshift(note); + + // オーバーフローしたら古い投稿は捨てる + if (this.notes.length >= displayLimit) { + this.notes = this.notes.slice(0, displayLimit); + } + } else { + this.queue.push(note); + } + }, + + append(note) { + this.notes.push(note); + }, + + tail() { + return this.notes[this.notes.length - 1]; + }, + + releaseQueue() { + this.queue.forEach(n => this.prepend(n, true)); + this.queue = []; + }, + + async loadMore() { + if (this.more == null) return; + if (this.moreFetching) return; + + this.moreFetching = true; + await this.more(); + this.moreFetching = false; + }, + + onScroll() { + if (this.isScrollTop()) { + this.releaseQueue(); + } + + if (this.rootEl && this.$store.state.settings.fetchOnScroll !== false) { + const current = this.rootEl.scrollTop + this.rootEl.clientHeight; + if (current > this.rootEl.scrollHeight - 8) this.loadMore(); + } + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +root(isDark) + .transition + .mk-notes-enter + .mk-notes-leave-to + opacity 0 + transform translateY(-30px) + + > * + transition transform .3s ease, opacity .3s ease + + > .date + display block + margin 0 + line-height 32px + font-size 14px + text-align center + color isDark ? #666b79 : #aaa + background isDark ? #242731 : #fdfdfd + border-bottom solid 1px isDark ? #1c2023 : #eaeaea + + span + margin 0 16px + + [data-fa] + margin-right 8px + + > .newer-indicator + position -webkit-sticky + position sticky + z-index 100 + height 3px + background $theme-color + + > footer + > button + display block + margin 0 + padding 16px + width 100% + text-align center + color #ccc + background isDark ? #282C37 : #fff + border-top solid 1px isDark ? #1c2023 : #eaeaea + border-bottom-left-radius 6px + border-bottom-right-radius 6px + + &:hover + background isDark ? #2e3440 : #f5f5f5 + + &:active + background isDark ? #21242b : #eee + +.eamppglmnmimdhrlzhplwpvyeaqmmhxu[data-darkmode] + root(true) + +.eamppglmnmimdhrlzhplwpvyeaqmmhxu:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/desktop/views/pages/deck/deck.tl.vue b/src/client/app/desktop/views/pages/deck/deck.tl.vue new file mode 100644 index 0000000000..ce9a77703f --- /dev/null +++ b/src/client/app/desktop/views/pages/deck/deck.tl.vue @@ -0,0 +1,143 @@ +<template> + <x-notes ref="timeline" :more="existMore ? more : null"/> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import XNotes from './deck.notes.vue'; + +const fetchLimit = 10; + +export default Vue.extend({ + components: { + XNotes + }, + + props: { + root: { + type: Object, + required: false + }, + src: { + type: String, + required: false, + default: 'home' + } + }, + + data() { + return { + fetching: true, + moreFetching: false, + existMore: false, + connection: null, + connectionId: null, + unreadCount: 0, + date: null + }; + }, + + computed: { + stream(): any { + return this.src == 'home' + ? (this as any).os.stream + : this.src == 'local' + ? (this as any).os.streams.localTimelineStream + : (this as any).os.streams.globalTimelineStream; + }, + + endpoint(): string { + return this.src == 'home' + ? 'notes/timeline' + : this.src == 'local' + ? 'notes/local-timeline' + : 'notes/global-timeline'; + } + }, + + mounted() { + this.connection = this.stream.getConnection(); + this.connectionId = this.stream.use(); + + this.connection.on('note', this.onNote); + if (this.src == 'home') { + this.connection.on('follow', this.onChangeFollowing); + this.connection.on('unfollow', this.onChangeFollowing); + } + + this.fetch(); + }, + + beforeDestroy() { + this.connection.off('note', this.onNote); + if (this.src == 'home') { + this.connection.off('follow', this.onChangeFollowing); + this.connection.off('unfollow', this.onChangeFollowing); + } + this.stream.dispose(this.connectionId); + }, + + methods: { + mount(root) { + this.$refs.timeline.mount(root); + }, + + fetch() { + this.fetching = true; + + (this.$refs.timeline as any).init(() => new Promise((res, rej) => { + (this as any).api(this.endpoint, { + limit: fetchLimit + 1, + untilDate: this.date ? this.date.getTime() : undefined, + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes + }).then(notes => { + if (notes.length == fetchLimit + 1) { + notes.pop(); + this.existMore = true; + } + res(notes); + this.fetching = false; + this.$emit('loaded'); + }, rej); + })); + }, + + more() { + this.moreFetching = true; + + const promise = (this as any).api(this.endpoint, { + limit: fetchLimit + 1, + untilId: (this.$refs.timeline as any).tail().id, + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes + }); + + promise.then(notes => { + if (notes.length == fetchLimit + 1) { + notes.pop(); + } else { + this.existMore = false; + } + notes.forEach(n => (this.$refs.timeline as any).append(n)); + this.moreFetching = false; + }); + + return promise; + }, + + onNote(note) { + // Prepend a note + (this.$refs.timeline as any).prepend(note); + }, + + onChangeFollowing() { + this.fetch(); + }, + + focus() { + (this.$refs.timeline as any).focus(); + } + } +}); +</script> diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue new file mode 100644 index 0000000000..afb65d2335 --- /dev/null +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -0,0 +1,42 @@ +<template> +<mk-ui :class="$style.root"> + <div class="qlvquzbjribqcaozciifydkngcwtyzje"> + <x-column src="home"/> + <x-column src="home"/> + <x-column src="home"/> + <x-column src="home"/> + </div> +</mk-ui> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import XColumn from './deck.column.vue'; + +export default Vue.extend({ + components: { + XColumn + } +}); +</script> + +<style lang="stylus" module> +.root + height 100vh +</style> + +<style lang="stylus" scoped> +@import '~const.styl' + +root(isDark) + display flex + flex 1 + padding 16px + +.qlvquzbjribqcaozciifydkngcwtyzje[data-darkmode] + root(true) + +.qlvquzbjribqcaozciifydkngcwtyzje:not([data-darkmode]) + root(false) + +</style> From e28d1c756971cdfda5364c80f6af7a69dbf5ffc1 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 5 Jun 2018 21:44:02 +0900 Subject: [PATCH 132/369] wip --- src/client/app/desktop/views/pages/deck/deck.column.vue | 3 ++- src/client/app/desktop/views/pages/deck/deck.vue | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 4e06798293..e0fc394f33 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -30,7 +30,7 @@ export default Vue.extend({ root(isDark) flex 1 - max-width 330px + min-width 330px height 100% margin-right 16px background isDark ? #282C37 : #fff @@ -49,6 +49,7 @@ root(isDark) > div height calc(100% - 48px) overflow auto + overflow-x hidden .dnpfarvgbnfmyzbdquhhzyxcmstpdqzs[data-darkmode] root(true) diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index afb65d2335..0c32b7d665 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -31,7 +31,8 @@ export default Vue.extend({ root(isDark) display flex flex 1 - padding 16px + padding 16px 0 16px 16px + overflow auto .qlvquzbjribqcaozciifydkngcwtyzje[data-darkmode] root(true) From dfa2c951d67a64f4e72a0ebca7ff81e40fc25976 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 5 Jun 2018 22:54:03 +0900 Subject: [PATCH 133/369] wip --- .../views/components/ui.header.nav.vue | 2 +- .../desktop/views/pages/deck/deck.column.vue | 25 +++++++++++--- .../desktop/views/pages/deck/deck.notes.vue | 16 +++++---- .../views/pages/deck/deck.tl-column.vue | 33 +++++++++++++++++++ .../app/desktop/views/pages/deck/deck.tl.vue | 4 --- .../app/desktop/views/pages/deck/deck.vue | 11 +++---- src/services/note/create.ts | 4 ++- 7 files changed, 72 insertions(+), 23 deletions(-) create mode 100644 src/client/app/desktop/views/pages/deck/deck.tl-column.vue diff --git a/src/client/app/desktop/views/components/ui.header.nav.vue b/src/client/app/desktop/views/components/ui.header.nav.vue index 8e792b3df5..fe2637cec3 100644 --- a/src/client/app/desktop/views/components/ui.header.nav.vue +++ b/src/client/app/desktop/views/components/ui.header.nav.vue @@ -11,7 +11,7 @@ <li class="deck" :class="{ active: $route.name == 'deck' }"> <router-link to="/deck"> %fa:columns% - <p>%i18n:@deck%</p> + <p>%i18n:@deck% <small>(beta)</small></p> </router-link> </li> <li class="messaging"> diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index e0fc394f33..8d0b3c0fdb 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -1,10 +1,10 @@ <template> <div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs"> <header> - <slot name="header">Timeline</slot> + <slot name="header"></slot> </header> <div ref="body"> - <x-tl ref="tl"/> + <slot></slot> </div> </div> </template> @@ -17,9 +17,23 @@ export default Vue.extend({ components: { XTl }, + provide() { + return { + getColumn() { + return this; + }, + getScrollContainer() { + return this.$refs.body; + } + }; + }, mounted() { this.$nextTick(() => { - this.$refs.tl.mount(this.$refs.body); + this.$emit('mounted'); + + setInterval(() => { + this.$emit('mounted'); + }, 100); }); } }); @@ -31,6 +45,7 @@ export default Vue.extend({ root(isDark) flex 1 min-width 330px + max-width 330px height 100% margin-right 16px background isDark ? #282C37 : #fff @@ -40,14 +55,14 @@ root(isDark) > header z-index 1 - line-height 48px + line-height 42px padding 0 16px color isDark ? #e3e5e8 : #888 background isDark ? #313543 : #fff box-shadow 0 1px rgba(#000, 0.15) > div - height calc(100% - 48px) + height calc(100% - 42px) overflow auto overflow-x hidden diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue index ff871b049d..48be4e585c 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notes.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue @@ -73,16 +73,20 @@ export default Vue.extend({ } }, + inject: ['getColumn', 'getScrollContainer'], + + created() { + this.getColumn().$once('mounted', () => { + this.rootEl = this.getScrollContainer(); + this.rootEl.addEventListener('scroll', this.onScroll); + }) + }, + beforeDestroy() { - this.root.removeEventListener('scroll', this.onScroll); + this.rootEl.removeEventListener('scroll', this.onScroll); }, methods: { - mount(root) { - this.rootEl = root; - this.rootEl.addEventListener('scroll', this.onScroll); - }, - isScrollTop() { if (this.rootEl == null) return true; return this.rootEl.scrollTop <= 8; diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue new file mode 100644 index 0000000000..674f04077f --- /dev/null +++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue @@ -0,0 +1,33 @@ +<template> +<div> + <x-column> + <span slot="header"> + <template v-if="src == 'home'">%fa:home% %i18n:@home%</template> + <template v-if="src == 'local'">%fa:R comments% %i18n:@local%</template> + <template v-if="src == 'global'">%fa:globe% %i18n:@global%</template> + <template v-if="src == 'list'">%fa:list% {{ list.title }}</template> + </span> + <x-tl :src="src"/> + </x-column> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import XColumn from './deck.column.vue'; +import XTl from './deck.tl.vue'; + +export default Vue.extend({ + components: { + XColumn, + XTl + }, + + props: { + src: { + type: String, + required: false + } + }, +}); +</script> diff --git a/src/client/app/desktop/views/pages/deck/deck.tl.vue b/src/client/app/desktop/views/pages/deck/deck.tl.vue index ce9a77703f..0a788b32ed 100644 --- a/src/client/app/desktop/views/pages/deck/deck.tl.vue +++ b/src/client/app/desktop/views/pages/deck/deck.tl.vue @@ -14,10 +14,6 @@ export default Vue.extend({ }, props: { - root: { - type: Object, - required: false - }, src: { type: String, required: false, diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index 0c32b7d665..dfd480029c 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -1,21 +1,20 @@ <template> <mk-ui :class="$style.root"> <div class="qlvquzbjribqcaozciifydkngcwtyzje"> - <x-column src="home"/> - <x-column src="home"/> - <x-column src="home"/> - <x-column src="home"/> + <x-tl-column src="home"/> + <x-tl-column src="local"/> + <x-tl-column src="global"/> </div> </mk-ui> </template> <script lang="ts"> import Vue from 'vue'; -import XColumn from './deck.column.vue'; +import XTlColumn from './deck.tl-column.vue'; export default Vue.extend({ components: { - XColumn + XTlColumn } }); </script> diff --git a/src/services/note/create.ts b/src/services/note/create.ts index 37d21fecad..f820182a42 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -221,7 +221,9 @@ export default async (user: IUser, data: { } // Publish note to global timeline stream - publishGlobalTimelineStream(noteObj); + if (note.visibility == 'public' && note.replyId == null) { + publishGlobalTimelineStream(noteObj); + } if (note.visibility == 'specified') { data.visibleUsers.forEach(async u => { From 334dabc1de705d35cb65fb9c8d5b17cd697d502e Mon Sep 17 00:00:00 2001 From: momf <m0fqn090310@gmail.com> Date: Tue, 5 Jun 2018 23:00:03 +0900 Subject: [PATCH 134/369] fix: validate post's text on mobile client. --- src/client/app/mobile/views/components/post-form.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index beacb1721b..2c7feb3f8e 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -5,7 +5,7 @@ <div> <span class="text-count" :class="{ over: text.length > 1000 }">{{ 1000 - text.length }}</span> <span class="geo" v-if="geo">%fa:map-marker-alt%</span> - <button class="submit" :disabled="posting" @click="post">{{ submitText }}</button> + <button class="submit" :disabled="!canPost" @click="post">{{ submitText }}</button> </div> </header> <div class="form"> From 2e919b788f449b34872bd3e530b2f4f637365c00 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 5 Jun 2018 23:19:04 +0900 Subject: [PATCH 135/369] wip --- .../pages/deck/deck.notifications-column.vue | 22 ++ .../views/pages/deck/deck.notifications.vue | 335 ++++++++++++++++++ .../app/desktop/views/pages/deck/deck.vue | 5 +- 3 files changed, 361 insertions(+), 1 deletion(-) create mode 100644 src/client/app/desktop/views/pages/deck/deck.notifications-column.vue create mode 100644 src/client/app/desktop/views/pages/deck/deck.notifications.vue diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue new file mode 100644 index 0000000000..0566989642 --- /dev/null +++ b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue @@ -0,0 +1,22 @@ +<template> +<div> + <x-column> + <span slot="header">%fa:bell R% %i18n:@notifications%</span> + + <x-notifications/> + </x-column> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import XColumn from './deck.column.vue'; +import XNotifications from './deck.notifications.vue'; + +export default Vue.extend({ + components: { + XColumn, + XNotifications + } +}); +</script> diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications.vue b/src/client/app/desktop/views/pages/deck/deck.notifications.vue new file mode 100644 index 0000000000..7a9646b587 --- /dev/null +++ b/src/client/app/desktop/views/pages/deck/deck.notifications.vue @@ -0,0 +1,335 @@ +<template> +<div class="oxynyeqmfvracxnglgulyqfgqxnxmehl"> + <div class="notifications" v-if="notifications.length != 0"> + <transition-group name="mk-notifications" class="transition"> + <template v-for="(notification, i) in _notifications"> + <div class="notification" :class="notification.type" :key="notification.id"> + <mk-time :time="notification.createdAt"/> + + <template v-if="notification.type == 'reaction'"> + <mk-avatar class="avatar" :user="notification.user"/> + <div class="text"> + <p> + <mk-reaction-icon :reaction="notification.reaction"/> + <router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link> + </p> + <router-link class="note-ref" :to="notification.note | notePage"> + %fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right% + </router-link> + </div> + </template> + + <template v-if="notification.type == 'renote'"> + <mk-avatar class="avatar" :user="notification.note.user"/> + <div class="text"> + <p>%fa:retweet% + <router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link> + </p> + <router-link class="note-ref" :to="notification.note | notePage"> + %fa:quote-left%{{ getNoteSummary(notification.note.renote) }}%fa:quote-right% + </router-link> + </div> + </template> + + <template v-if="notification.type == 'quote'"> + <mk-avatar class="avatar" :user="notification.note.user"/> + <div class="text"> + <p>%fa:quote-left% + <router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link> + </p> + <router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link> + </div> + </template> + + <template v-if="notification.type == 'follow'"> + <mk-avatar class="avatar" :user="notification.user"/> + <div class="text"> + <p>%fa:user-plus% + <router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link> + </p> + </div> + </template> + + <template v-if="notification.type == 'receiveFollowRequest'"> + <mk-avatar class="avatar" :user="notification.user"/> + <div class="text"> + <p>%fa:user-clock% + <router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link> + </p> + </div> + </template> + + <template v-if="notification.type == 'reply'"> + <mk-avatar class="avatar" :user="notification.note.user"/> + <div class="text"> + <p>%fa:reply% + <router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link> + </p> + <router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link> + </div> + </template> + + <template v-if="notification.type == 'mention'"> + <mk-avatar class="avatar" :user="notification.note.user"/> + <div class="text"> + <p>%fa:at% + <router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link> + </p> + <a class="note-preview" :href="notification.note | notePage">{{ getNoteSummary(notification.note) }}</a> + </div> + </template> + + <template v-if="notification.type == 'poll_vote'"> + <mk-avatar class="avatar" :user="notification.user"/> + <div class="text"> + <p>%fa:chart-pie%<a :href="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</a></p> + <router-link class="note-ref" :to="notification.note | notePage"> + %fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right% + </router-link> + </div> + </template> + </div> + + <p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'"> + <span>%fa:angle-up%{{ notification._datetext }}</span> + <span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span> + </p> + </template> + </transition-group> + </div> + <button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications"> + <template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }} + </button> + <p class="empty" v-if="notifications.length == 0 && !fetching">%i18n:@empty%</p> + <p class="loading" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import getNoteSummary from '../../../../../../renderers/get-note-summary'; + +export default Vue.extend({ + data() { + return { + fetching: true, + fetchingMoreNotifications: false, + notifications: [], + moreNotifications: false, + connection: null, + connectionId: null, + getNoteSummary + }; + }, + computed: { + _notifications(): any[] { + return (this.notifications as any).map(notification => { + const date = new Date(notification.createdAt).getDate(); + const month = new Date(notification.createdAt).getMonth() + 1; + notification._date = date; + notification._datetext = `${month}月 ${date}日`; + return notification; + }); + } + }, + mounted() { + this.connection = (this as any).os.stream.getConnection(); + this.connectionId = (this as any).os.stream.use(); + + this.connection.on('notification', this.onNotification); + + const max = 10; + + (this as any).api('i/notifications', { + limit: max + 1 + }).then(notifications => { + if (notifications.length == max + 1) { + this.moreNotifications = true; + notifications.pop(); + } + + this.notifications = notifications; + this.fetching = false; + }); + }, + beforeDestroy() { + this.connection.off('notification', this.onNotification); + (this as any).os.stream.dispose(this.connectionId); + }, + methods: { + fetchMoreNotifications() { + this.fetchingMoreNotifications = true; + + const max = 30; + + (this as any).api('i/notifications', { + limit: max + 1, + untilId: this.notifications[this.notifications.length - 1].id + }).then(notifications => { + if (notifications.length == max + 1) { + this.moreNotifications = true; + notifications.pop(); + } else { + this.moreNotifications = false; + } + this.notifications = this.notifications.concat(notifications); + this.fetchingMoreNotifications = false; + }); + }, + onNotification(notification) { + // TODO: ユーザーが画面を見てないと思われるとき(ブラウザやタブがアクティブじゃないなど)は送信しない + this.connection.send({ + type: 'read_notification', + id: notification.id + }); + + this.notifications.unshift(notification); + } + } +}); +</script> + +<style lang="stylus" scoped> +root(isDark) + .transition + .mk-notifications-enter + .mk-notifications-leave-to + opacity 0 + transform translateY(-30px) + + > * + transition transform .3s ease, opacity .3s ease + + > .notifications + > * + > .notification + margin 0 + padding 16px + overflow-wrap break-word + font-size 0.9em + border-bottom solid 1px isDark ? #1c2023 : rgba(#000, 0.05) + + &:last-child + border-bottom none + + > .mk-time + display inline + position absolute + top 16px + right 12px + vertical-align top + color isDark ? #606984 : rgba(#000, 0.6) + font-size small + + &:after + content "" + display block + clear both + + > .avatar + display block + float left + position -webkit-sticky + position sticky + top 16px + width 36px + height 36px + border-radius 6px + + > .text + float right + width calc(100% - 36px) + padding-left 8px + + p + margin 0 + + i, .mk-reaction-icon + margin-right 4px + + .note-preview + color isDark ? #c2cad4 : rgba(#000, 0.7) + + .note-ref + color isDark ? #c2cad4 : rgba(#000, 0.7) + + [data-fa] + font-size 1em + font-weight normal + font-style normal + display inline-block + margin-right 3px + + &.renote, &.quote + .text p i + color #77B255 + + &.follow + .text p i + color #53c7ce + + &.receiveFollowRequest + .text p i + color #888 + + &.reply, &.mention + .text p i + color #555 + + > .date + display block + margin 0 + line-height 32px + text-align center + font-size 0.8em + color isDark ? #666b79 : #aaa + background isDark ? #242731 : #fdfdfd + border-bottom solid 1px isDark ? #1c2023 : rgba(#000, 0.05) + + span + margin 0 16px + + [data-fa] + margin-right 8px + + > .more + display block + width 100% + padding 16px + color #555 + border-top solid 1px rgba(#000, 0.05) + + &:hover + background rgba(#000, 0.025) + + &:active + background rgba(#000, 0.05) + + &.fetching + cursor wait + + > [data-fa] + margin-right 4px + + > .empty + margin 0 + padding 16px + text-align center + color #aaa + + > .loading + margin 0 + padding 16px + text-align center + color #aaa + + > [data-fa] + margin-right 4px + +.oxynyeqmfvracxnglgulyqfgqxnxmehl[data-darkmode] + root(true) + +.oxynyeqmfvracxnglgulyqfgqxnxmehl:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index dfd480029c..fb5e55086c 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -2,6 +2,7 @@ <mk-ui :class="$style.root"> <div class="qlvquzbjribqcaozciifydkngcwtyzje"> <x-tl-column src="home"/> + <x-notifications-column/> <x-tl-column src="local"/> <x-tl-column src="global"/> </div> @@ -11,10 +12,12 @@ <script lang="ts"> import Vue from 'vue'; import XTlColumn from './deck.tl-column.vue'; +import XNotificationsColumn from './deck.notifications-column.vue'; export default Vue.extend({ components: { - XTlColumn + XTlColumn, + XNotificationsColumn } }); </script> From 64519a9fd4546d1b2c98b68917fbe5ed00a8d8c9 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 5 Jun 2018 23:22:37 +0900 Subject: [PATCH 136/369] 2.26.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2e59e17f4d..474b942135 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.25.2", - "clientVersion": "1.0.6116", + "version": "2.26.0", + "clientVersion": "1.0.6140", "codename": "nighthike", "main": "./built/index.js", "private": true, From 062fbd7d271c0ee787a355c9d1a4d7ffc038759a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 6 Jun 2018 01:54:24 +0900 Subject: [PATCH 137/369] wip --- .../desktop/views/pages/deck/deck.column.vue | 55 ++++++++++++------- .../desktop/views/pages/deck/deck.notes.vue | 35 +++++------- 2 files changed, 49 insertions(+), 41 deletions(-) diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 8d0b3c0fdb..eb1c47c46c 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -1,6 +1,6 @@ <template> <div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs"> - <header> + <header :class="{ indicate }"> <slot name="header"></slot> </header> <div ref="body"> @@ -11,30 +11,44 @@ <script lang="ts"> import Vue from 'vue'; -import XTl from './deck.tl.vue'; export default Vue.extend({ - components: { - XTl - }, - provide() { + data() { return { - getColumn() { - return this; - }, - getScrollContainer() { - return this.$refs.body; - } + indicate: false }; }, - mounted() { - this.$nextTick(() => { - this.$emit('mounted'); - setInterval(() => { - this.$emit('mounted'); - }, 100); - }); + provide() { + return { + column: this, + isScrollTop: this.isScrollTop, + indicate: v => this.indicate = v + }; + }, + + mounted() { + this.$refs.body.addEventListener('scroll', this.onScroll); + }, + beforeDestroy() { + this.$refs.body.removeEventListener('scroll', this.onScroll); + }, + + methods: { + isScrollTop() { + return this.$refs.body.scrollTop == 0; + }, + + onScroll() { + if (this.isScrollTop()) { + this.$emit('top'); + } + + if (this.$store.state.settings.fetchOnScroll !== false) { + const current = this.$refs.body.scrollTop + this.$refs.body.clientHeight; + if (current > this.$refs.body.scrollHeight - 1) this.$emit('bottom'); + } + } } }); </script> @@ -61,6 +75,9 @@ root(isDark) background isDark ? #313543 : #fff box-shadow 0 1px rgba(#000, 0.15) + &.indicate + box-shadow 0 3px 0 0 $theme-color + > div height calc(100% - 42px) overflow auto diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue index 48be4e585c..e05b31c32e 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notes.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue @@ -1,7 +1,5 @@ <template> <div class="eamppglmnmimdhrlzhplwpvyeaqmmhxu"> - <div class="newer-indicator" v-show="queue.length > 0"></div> - <slot name="empty" v-if="notes.length == 0 && !fetching && requestInitPromise == null"></slot> <div v-if="!fetching && requestInitPromise != null"> @@ -42,6 +40,8 @@ export default Vue.extend({ XNote }, + inject: ['column', 'isScrollTop', 'indicate'], + props: { more: { type: Function, @@ -73,25 +73,17 @@ export default Vue.extend({ } }, - inject: ['getColumn', 'getScrollContainer'], - created() { - this.getColumn().$once('mounted', () => { - this.rootEl = this.getScrollContainer(); - this.rootEl.addEventListener('scroll', this.onScroll); - }) + this.column.$on('top', this.onTop); + this.column.$on('bottom', this.onBottom); }, beforeDestroy() { - this.rootEl.removeEventListener('scroll', this.onScroll); + this.column.$off('top', this.onTop); + this.column.$off('bottom', this.onBottom); }, methods: { - isScrollTop() { - if (this.rootEl == null) return true; - return this.rootEl.scrollTop <= 8; - }, - focus() { (this.$el as any).children[0].focus(); }, @@ -149,6 +141,7 @@ export default Vue.extend({ } } else { this.queue.push(note); + this.indicate(true); } }, @@ -163,6 +156,7 @@ export default Vue.extend({ releaseQueue() { this.queue.forEach(n => this.prepend(n, true)); this.queue = []; + this.indicate(false); }, async loadMore() { @@ -174,15 +168,12 @@ export default Vue.extend({ this.moreFetching = false; }, - onScroll() { - if (this.isScrollTop()) { - this.releaseQueue(); - } + onTop() { + this.releaseQueue(); + }, - if (this.rootEl && this.$store.state.settings.fetchOnScroll !== false) { - const current = this.rootEl.scrollTop + this.rootEl.clientHeight; - if (current > this.rootEl.scrollHeight - 8) this.loadMore(); - } + onBottom() { + this.loadMore(); } } }); From f88fb9bc1dc4aeb7d50729124db5814064fda607 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 6 Jun 2018 01:54:36 +0900 Subject: [PATCH 138/369] wip --- src/client/app/desktop/views/pages/deck/deck.notes.vue | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue index e05b31c32e..e37505b551 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notes.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue @@ -208,13 +208,6 @@ root(isDark) [data-fa] margin-right 8px - > .newer-indicator - position -webkit-sticky - position sticky - z-index 100 - height 3px - background $theme-color - > footer > button display block From f9180811680aa66706d722384cba4d82d7a2e52c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 6 Jun 2018 02:48:26 +0900 Subject: [PATCH 139/369] wip --- .../app/desktop/views/components/home.vue | 52 +++++++++++++++++++ src/client/app/store.ts | 15 ++++++ src/server/api/private/signup.ts | 48 ----------------- 3 files changed, 67 insertions(+), 48 deletions(-) diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index 636ed871c7..d3ba84a4b3 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -76,6 +76,50 @@ import Vue from 'vue'; import * as XDraggable from 'vuedraggable'; import * as uuid from 'uuid'; +const defaultDesktopHomeWidgets = { + left: [ + 'profile', + 'calendar', + 'activity', + 'rss', + 'trends', + 'photo-stream', + 'version' + ], + right: [ + 'broadcast', + 'notifications', + 'users', + 'polls', + 'server', + 'donation', + 'nav', + 'tips' + ] +}; + +//#region Construct home data +const _defaultDesktopHomeWidgets = []; + +defaultDesktopHomeWidgets.left.forEach(widget => { + _defaultDesktopHomeWidgets.push({ + name: widget, + id: uuid(), + place: 'left', + data: {} + }); +}); + +defaultDesktopHomeWidgets.right.forEach(widget => { + _defaultDesktopHomeWidgets.push({ + name: widget, + id: uuid(), + place: 'right', + data: {} + }); +}); +//#endregion + export default Vue.extend({ components: { XDraggable @@ -119,6 +163,14 @@ export default Vue.extend({ } }, + created() { + if (this.$store.state.i.clientSettings == null || this.$store.state.i.clientSettings.home == null) { + this.api('i/update_home', { + home: _defaultDesktopHomeWidgets + }); + } + }, + mounted() { this.connection = (this as any).os.stream.getConnection(); this.connectionId = (this as any).os.stream.use(); diff --git a/src/client/app/store.ts b/src/client/app/store.ts index 905ec0501c..00cae3b857 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -7,6 +7,20 @@ import { hostname } from './config'; const defaultSettings = { home: [], mobileHome: [], + deck: { + columns: [/*{ + type: 'widgets', + widgets: [] + }, */{ + type: 'home' + }, { + type: 'notifications' + }, { + type: 'local' + }, { + type: 'global' + }] + }, fetchOnScroll: true, showMaps: true, showPostFormOnTopOfTl: false, @@ -156,6 +170,7 @@ export default (os: MiOS) => new Vuex.Store({ actions: { merge(ctx, settings) { + if (settings == null) return; Object.entries(settings).forEach(([key, value]) => { ctx.commit('set', { key, value }); }); diff --git a/src/server/api/private/signup.ts b/src/server/api/private/signup.ts index cf51dec4d2..14d4b8a3fc 100644 --- a/src/server/api/private/signup.ts +++ b/src/server/api/private/signup.ts @@ -1,4 +1,3 @@ -import * as uuid from 'uuid'; import * as Koa from 'koa'; import * as bcrypt from 'bcryptjs'; import { generate as generateKeypair } from '../../../crypto_key'; @@ -11,28 +10,6 @@ recaptcha.init({ secret_key: config.recaptcha.secret_key }); -const home = { - left: [ - 'profile', - 'calendar', - 'activity', - 'rss', - 'trends', - 'photo-stream', - 'version' - ], - right: [ - 'broadcast', - 'notifications', - 'users', - 'polls', - 'server', - 'donation', - 'nav', - 'tips' - ] -}; - export default async (ctx: Koa.Context) => { // Verify recaptcha // ただしテスト時はこの機構は障害となるため無効にする @@ -82,28 +59,6 @@ export default async (ctx: Koa.Context) => { // Generate secret const secret = generateUserToken(); - //#region Construct home data - const homeData = []; - - home.left.forEach(widget => { - homeData.push({ - name: widget, - id: uuid(), - place: 'left', - data: {} - }); - }); - - home.right.forEach(widget => { - homeData.push({ - name: widget, - id: uuid(), - place: 'right', - data: {} - }); - }); - //#endregion - // Create account const account: IUser = await User.insert({ avatarId: null, @@ -135,9 +90,6 @@ export default async (ctx: Koa.Context) => { }, settings: { autoWatch: true - }, - clientSettings: { - home: homeData } }); From d8cd24fab0bd454bd543200e71a17601afbb9f87 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 6 Jun 2018 03:03:56 +0900 Subject: [PATCH 140/369] wip --- src/client/app/common/scripts/streaming/home.ts | 2 -- src/client/app/desktop/views/components/home.vue | 6 ++++-- src/client/app/store.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/client/app/common/scripts/streaming/home.ts b/src/client/app/common/scripts/streaming/home.ts index f07d0289f6..a27c55a60d 100644 --- a/src/client/app/common/scripts/streaming/home.ts +++ b/src/client/app/common/scripts/streaming/home.ts @@ -1,5 +1,3 @@ -import * as merge from 'object-assign-deep'; - import Stream from './stream'; import StreamManager from './stream-manager'; import MiOS from '../../../mios'; diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index d3ba84a4b3..c30ca68210 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -147,7 +147,7 @@ export default Vue.extend({ computed: { home(): any[] { - return this.$store.state.settings.home; + return this.$store.state.settings.home || []; }, left(): any[] { return this.home.filter(w => w.place == 'left'); @@ -164,9 +164,11 @@ export default Vue.extend({ }, created() { - if (this.$store.state.i.clientSettings == null || this.$store.state.i.clientSettings.home == null) { + if (this.$store.state.settings.home == null) { this.api('i/update_home', { home: _defaultDesktopHomeWidgets + }).then(() => { + this.$store.commit('settings/setHome', _defaultDesktopHomeWidgets); }); } }, diff --git a/src/client/app/store.ts b/src/client/app/store.ts index 00cae3b857..135fbe51f5 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -5,7 +5,7 @@ import MiOS from './mios'; import { hostname } from './config'; const defaultSettings = { - home: [], + home: null, mobileHome: [], deck: { columns: [/*{ From 8ca58de2ba1e6867e1ca83062269ed8fbd350c25 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 6 Jun 2018 03:12:06 +0900 Subject: [PATCH 141/369] wip --- .../app/desktop/views/pages/deck/deck.vue | 44 +++++++++++++++++-- src/client/app/store.ts | 15 +------ 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index fb5e55086c..079260972f 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -1,10 +1,12 @@ <template> <mk-ui :class="$style.root"> <div class="qlvquzbjribqcaozciifydkngcwtyzje"> - <x-tl-column src="home"/> - <x-notifications-column/> - <x-tl-column src="local"/> - <x-tl-column src="global"/> + <template v-for="column in columns"> + <x-notifications-column v-if="column.type == 'notifications'" :key="column.id"/> + <x-tl-column v-if="column.type == 'home'" :key="column.id" src="home"/> + <x-tl-column v-if="column.type == 'local'" :key="column.id" src="local"/> + <x-tl-column v-if="column.type == 'global'" :key="column.id" src="global"/> + </template> </div> </mk-ui> </template> @@ -13,11 +15,45 @@ import Vue from 'vue'; import XTlColumn from './deck.tl-column.vue'; import XNotificationsColumn from './deck.notifications-column.vue'; +import * as uuid from 'uuid'; export default Vue.extend({ components: { XTlColumn, XNotificationsColumn + }, + computed: { + columns() { + if (this.$store.state.settings.deck == null) return []; + return this.$store.state.settings.deck.columns; + } + }, + created() { + if (this.$store.state.settings.deck == null) { + const deck = { + columns: [/*{ + type: 'widgets', + widgets: [] + }, */{ + id: uuid(), + type: 'home' + }, { + id: uuid(), + type: 'notifications' + }, { + id: uuid(), + type: 'local' + }, { + id: uuid(), + type: 'global' + }] + }; + + this.$store.dispatch('settings/set', { + key: 'deck', + value: deck + }); + } } }); </script> diff --git a/src/client/app/store.ts b/src/client/app/store.ts index 135fbe51f5..7795c9477a 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -7,20 +7,7 @@ import { hostname } from './config'; const defaultSettings = { home: null, mobileHome: [], - deck: { - columns: [/*{ - type: 'widgets', - widgets: [] - }, */{ - type: 'home' - }, { - type: 'notifications' - }, { - type: 'local' - }, { - type: 'global' - }] - }, + deck: null, fetchOnScroll: true, showMaps: true, showPostFormOnTopOfTl: false, From 0d8c83f27cc03efe2f332f84928f14309e646632 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 6 Jun 2018 04:00:48 +0900 Subject: [PATCH 142/369] wip --- src/client/app/desktop/api/post.ts | 2 +- .../received-follow-requests-window.vue | 6 ++--- .../views/components/user-lists-window.vue | 6 ++--- .../desktop/views/pages/deck/deck.column.vue | 1 - .../desktop/views/pages/deck/deck.note.vue | 26 ------------------- .../app/desktop/views/pages/deck/deck.vue | 19 +++++++++++++- 6 files changed, 25 insertions(+), 35 deletions(-) diff --git a/src/client/app/desktop/api/post.ts b/src/client/app/desktop/api/post.ts index af71829c7b..cfc78e50fa 100644 --- a/src/client/app/desktop/api/post.ts +++ b/src/client/app/desktop/api/post.ts @@ -6,7 +6,7 @@ export default (os: OS) => opts => { const o = opts || {}; if (o.renote) { const vm = os.new(RenoteFormWindow, { - renote: o.renote + note: o.renote }); document.body.appendChild(vm.$el); } else { diff --git a/src/client/app/desktop/views/components/received-follow-requests-window.vue b/src/client/app/desktop/views/components/received-follow-requests-window.vue index fd37c0a6aa..26b7ec2590 100644 --- a/src/client/app/desktop/views/components/received-follow-requests-window.vue +++ b/src/client/app/desktop/views/components/received-follow-requests-window.vue @@ -2,7 +2,7 @@ <mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy"> <span slot="header">%fa:envelope R% %i18n:@title%</span> - <div data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4" :data-darkmode="$store.state.device.darkmode"> + <div class="slpqaxdoxhvglersgjukmvizkqbmbokc" :data-darkmode="$store.state.device.darkmode"> <div v-for="req in requests"> <router-link :key="req.id" :to="req.follower | userPage">{{ req.follower | userName }}</router-link> <span> @@ -63,10 +63,10 @@ root(isDark) > span margin 0 0 0 auto -[data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4"][data-darkmode] +.slpqaxdoxhvglersgjukmvizkqbmbokc[data-darkmode] root(true) -[data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4"]:not([data-darkmode]) +.slpqaxdoxhvglersgjukmvizkqbmbokc:not([data-darkmode]) root(false) </style> diff --git a/src/client/app/desktop/views/components/user-lists-window.vue b/src/client/app/desktop/views/components/user-lists-window.vue index 109d1695d8..47648c287d 100644 --- a/src/client/app/desktop/views/components/user-lists-window.vue +++ b/src/client/app/desktop/views/components/user-lists-window.vue @@ -2,7 +2,7 @@ <mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy"> <span slot="header">%fa:list% %i18n:@title%</span> - <div data-id="6e4caea3-d8f9-4ab7-96de-ab67fe8d5c82" :data-darkmode="$store.state.device.darkmode"> + <div class="xkxvokkjlptzyewouewmceqcxhpgzprp" :data-darkmode="$store.state.device.darkmode"> <button class="ui" @click="add">%i18n:@create-list%</button> <a v-for="list in lists" :key="list.id" @click="choice(list)">{{ list.title }}</a> </div> @@ -60,10 +60,10 @@ root(isDark) border solid 1px isDark ? #1c2023 : #eee border-radius 4px -[data-id="6e4caea3-d8f9-4ab7-96de-ab67fe8d5c82"][data-darkmode] +.xkxvokkjlptzyewouewmceqcxhpgzprp[data-darkmode] root(true) -[data-id="6e4caea3-d8f9-4ab7-96de-ab67fe8d5c82"]:not([data-darkmode]) +.xkxvokkjlptzyewouewmceqcxhpgzprp:not([data-darkmode]) root(false) </style> diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index eb1c47c46c..bae28f3a64 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -61,7 +61,6 @@ root(isDark) min-width 330px max-width 330px height 100% - margin-right 16px background isDark ? #282C37 : #fff border-radius 6px box-shadow 0 2px 16px rgba(#000, 0.1) diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index 8582a37b91..27d1cb8d47 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -111,14 +111,6 @@ export default Vue.extend({ return this.isRenote ? this.note.renote : this.note; }, - reactionsCount(): number { - return this.p.reactionCounts - ? Object.keys(this.p.reactionCounts) - .map(key => this.p.reactionCounts[key]) - .reduce((a, b) => a + b) - : 0; - }, - urls(): string[] { if (this.p.text) { const ast = parse(this.p.text); @@ -144,24 +136,6 @@ export default Vue.extend({ if (this.$store.getters.isSignedIn) { this.connection.on('_connected_', this.onStreamConnected); } - - // Draw map - if (this.p.geo) { - const shouldShowMap = this.$store.getters.isSignedIn ? this.$store.state.settings.showMaps : true; - if (shouldShowMap) { - (this as any).os.getGoogleMaps().then(maps => { - const uluru = new maps.LatLng(this.p.geo.coordinates[1], this.p.geo.coordinates[0]); - const map = new maps.Map(this.$refs.map, { - center: uluru, - zoom: 15 - }); - new maps.Marker({ - position: uluru, - map: map - }); - }); - } - } }, beforeDestroy() { diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index 079260972f..a31eb44dd0 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -1,12 +1,13 @@ <template> <mk-ui :class="$style.root"> - <div class="qlvquzbjribqcaozciifydkngcwtyzje"> + <div class="qlvquzbjribqcaozciifydkngcwtyzje" :data-darkmode="$store.state.device.darkmode"> <template v-for="column in columns"> <x-notifications-column v-if="column.type == 'notifications'" :key="column.id"/> <x-tl-column v-if="column.type == 'home'" :key="column.id" src="home"/> <x-tl-column v-if="column.type == 'local'" :key="column.id" src="local"/> <x-tl-column v-if="column.type == 'global'" :key="column.id" src="global"/> </template> + <button>%fa:plus%</button> </div> </mk-ui> </template> @@ -72,6 +73,22 @@ root(isDark) padding 16px 0 16px 16px overflow auto + > div + margin-right 16px + + &:last-of-type + margin-right 0 + + > button + padding 0 16px + color isDark ? #93a0a5 : #888 + + &:hover + color isDark ? #b8c5ca : #777 + + &:active + color isDark ? #fff : #555 + .qlvquzbjribqcaozciifydkngcwtyzje[data-darkmode] root(true) From 69b5de3346377ef2b7e5786e078d870717277084 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 6 Jun 2018 05:18:08 +0900 Subject: [PATCH 143/369] wip --- .../app/common/views/components/index.ts | 2 + .../app/common/views/components/menu.vue | 153 +++++++++++++++++ .../app/common/views/components/note-menu.vue | 162 ++++-------------- .../desktop/views/pages/deck/deck.column.vue | 56 +++++- .../desktop/views/pages/deck/deck.list-tl.vue | 103 +++++++++++ .../pages/deck/deck.notifications-column.vue | 9 +- .../views/pages/deck/deck.tl-column.vue | 26 +-- .../app/desktop/views/pages/deck/deck.tl.vue | 9 +- .../app/desktop/views/pages/deck/deck.vue | 68 +++++++- src/client/app/mios.ts | 6 +- src/client/app/store.ts | 74 ++++++++ 11 files changed, 505 insertions(+), 163 deletions(-) create mode 100644 src/client/app/common/views/components/menu.vue create mode 100644 src/client/app/desktop/views/pages/deck/deck.list-tl.vue diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts index df74f5ddfb..f30e3f953b 100644 --- a/src/client/app/common/views/components/index.ts +++ b/src/client/app/common/views/components/index.ts @@ -1,6 +1,7 @@ import Vue from 'vue'; import analogClock from './analog-clock.vue'; +import menu from './menu.vue'; import signin from './signin.vue'; import signup from './signup.vue'; import forkit from './forkit.vue'; @@ -29,6 +30,7 @@ import Othello from './othello.vue'; import welcomeTimeline from './welcome-timeline.vue'; Vue.component('mk-analog-clock', analogClock); +Vue.component('mk-menu', menu); Vue.component('mk-signin', signin); Vue.component('mk-signup', signup); Vue.component('mk-forkit', forkit); diff --git a/src/client/app/common/views/components/menu.vue b/src/client/app/common/views/components/menu.vue new file mode 100644 index 0000000000..e5df8345b9 --- /dev/null +++ b/src/client/app/common/views/components/menu.vue @@ -0,0 +1,153 @@ +<template> +<div class="mk-menu"> + <div class="backdrop" ref="backdrop" @click="close"></div> + <div class="popover" :class="{ compact }" ref="popover"> + <button v-for="item in items" @click="clicked(item.onClick)" v-html="item.content"></button> + </div> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import * as anime from 'animejs'; + +export default Vue.extend({ + props: ['source', 'compact', 'items'], + mounted() { + this.$nextTick(() => { + const popover = this.$refs.popover as any; + + const rect = this.source.getBoundingClientRect(); + const width = popover.offsetWidth; + const height = popover.offsetHeight; + + if (this.compact) { + const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2); + const y = rect.top + window.pageYOffset + (this.source.offsetHeight / 2); + popover.style.left = (x - (width / 2)) + 'px'; + popover.style.top = (y - (height / 2)) + 'px'; + } else { + const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2); + const y = rect.top + window.pageYOffset + this.source.offsetHeight; + popover.style.left = (x - (width / 2)) + 'px'; + popover.style.top = y + 'px'; + } + + anime({ + targets: this.$refs.backdrop, + opacity: 1, + duration: 100, + easing: 'linear' + }); + + anime({ + targets: this.$refs.popover, + opacity: 1, + scale: [0.5, 1], + duration: 500 + }); + }); + }, + methods: { + clicked(fn) { + fn(); + this.close(); + }, + close() { + (this.$refs.backdrop as any).style.pointerEvents = 'none'; + anime({ + targets: this.$refs.backdrop, + opacity: 0, + duration: 200, + easing: 'linear' + }); + + (this.$refs.popover as any).style.pointerEvents = 'none'; + anime({ + targets: this.$refs.popover, + opacity: 0, + scale: 0.5, + duration: 200, + easing: 'easeInBack', + complete: () => { + this.$emit('closed'); + this.$destroy(); + } + }); + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +$border-color = rgba(27, 31, 35, 0.15) + +.mk-menu + position initial + + > .backdrop + position fixed + top 0 + left 0 + z-index 10000 + width 100% + height 100% + background rgba(#000, 0.1) + opacity 0 + + > .popover + position absolute + z-index 10001 + padding 8px 0 + background #fff + border 1px solid $border-color + border-radius 4px + box-shadow 0 3px 12px rgba(27, 31, 35, 0.15) + transform scale(0.5) + opacity 0 + + $balloon-size = 16px + + &:not(.compact) + margin-top $balloon-size + transform-origin center -($balloon-size) + + &:before + content "" + display block + position absolute + top -($balloon-size * 2) + left s('calc(50% - %s)', $balloon-size) + border-top solid $balloon-size transparent + border-left solid $balloon-size transparent + border-right solid $balloon-size transparent + border-bottom solid $balloon-size $border-color + + &:after + content "" + display block + position absolute + top -($balloon-size * 2) + 1.5px + left s('calc(50% - %s)', $balloon-size) + border-top solid $balloon-size transparent + border-left solid $balloon-size transparent + border-right solid $balloon-size transparent + border-bottom solid $balloon-size #fff + + > button + display block + padding 8px 16px + width 100% + + &:hover + color $theme-color-foreground + background $theme-color + text-decoration none + + &:active + color $theme-color-foreground + background darken($theme-color, 10%) + +</style> diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue index a400610a2b..951a9ed1d9 100644 --- a/src/client/app/common/views/components/note-menu.vue +++ b/src/client/app/common/views/components/note-menu.vue @@ -1,55 +1,41 @@ <template> -<div class="mk-note-menu"> - <div class="backdrop" ref="backdrop" @click="close"></div> - <div class="popover" :class="{ compact }" ref="popover"> - <button @click="favorite">%i18n:@favorite%</button> - <button v-if="note.userId == $store.state.i.id" @click="pin">%i18n:@pin%</button> - <button v-if="note.userId == $store.state.i.id" @click="del">%i18n:@delete%</button> - <a v-if="note.uri" :href="note.uri" target="_blank">%i18n:@remote%</a> - </div> +<div class="mk-note-menu" style="position:initial"> + <mk-menu ref="menu" :source="source" :compact="compact" :items="items" @closed="$destroy"/> </div> </template> <script lang="ts"> import Vue from 'vue'; -import * as anime from 'animejs'; export default Vue.extend({ props: ['note', 'source', 'compact'], - mounted() { - this.$nextTick(() => { - const popover = this.$refs.popover as any; - - const rect = this.source.getBoundingClientRect(); - const width = popover.offsetWidth; - const height = popover.offsetHeight; - - if (this.compact) { - const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2); - const y = rect.top + window.pageYOffset + (this.source.offsetHeight / 2); - popover.style.left = (x - (width / 2)) + 'px'; - popover.style.top = (y - (height / 2)) + 'px'; - } else { - const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2); - const y = rect.top + window.pageYOffset + this.source.offsetHeight; - popover.style.left = (x - (width / 2)) + 'px'; - popover.style.top = y + 'px'; + computed: { + items() { + const items = []; + items.push({ + content: '%i18n:@favorite%', + onClick: this.favorite + }); + if (this.note.userId == this.$store.state.i.id) { + items.push({ + content: '%i18n:@pin%', + onClick: this.pin + }); + items.push({ + content: '%i18n:@delete%', + onClick: this.del + }); } - - anime({ - targets: this.$refs.backdrop, - opacity: 1, - duration: 100, - easing: 'linear' - }); - - anime({ - targets: this.$refs.popover, - opacity: 1, - scale: [0.5, 1], - duration: 500 - }); - }); + if (this.note.uri) { + items.push({ + content: '%i18n:@remote%', + onClick: () => { + window.open(this.note.uri, '_blank'); + } + }); + } + return items; + } }, methods: { pin() { @@ -78,98 +64,8 @@ export default Vue.extend({ }, close() { - (this.$refs.backdrop as any).style.pointerEvents = 'none'; - anime({ - targets: this.$refs.backdrop, - opacity: 0, - duration: 200, - easing: 'linear' - }); - - (this.$refs.popover as any).style.pointerEvents = 'none'; - anime({ - targets: this.$refs.popover, - opacity: 0, - scale: 0.5, - duration: 200, - easing: 'easeInBack', - complete: () => this.$destroy() - }); + this.$refs.menu.close(); } } }); </script> - -<style lang="stylus" scoped> -@import '~const.styl' - -$border-color = rgba(27, 31, 35, 0.15) - -.mk-note-menu - position initial - - > .backdrop - position fixed - top 0 - left 0 - z-index 10000 - width 100% - height 100% - background rgba(#000, 0.1) - opacity 0 - - > .popover - position absolute - z-index 10001 - padding 8px 0 - background #fff - border 1px solid $border-color - border-radius 4px - box-shadow 0 3px 12px rgba(27, 31, 35, 0.15) - transform scale(0.5) - opacity 0 - - $balloon-size = 16px - - &:not(.compact) - margin-top $balloon-size - transform-origin center -($balloon-size) - - &:before - content "" - display block - position absolute - top -($balloon-size * 2) - left s('calc(50% - %s)', $balloon-size) - border-top solid $balloon-size transparent - border-left solid $balloon-size transparent - border-right solid $balloon-size transparent - border-bottom solid $balloon-size $border-color - - &:after - content "" - display block - position absolute - top -($balloon-size * 2) + 1.5px - left s('calc(50% - %s)', $balloon-size) - border-top solid $balloon-size transparent - border-left solid $balloon-size transparent - border-right solid $balloon-size transparent - border-bottom solid $balloon-size #fff - - > button - > a - display block - padding 8px 16px - width 100% - - &:hover - color $theme-color-foreground - background $theme-color - text-decoration none - - &:active - color $theme-color-foreground - background darken($theme-color, 10%) - -</style> diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index bae28f3a64..2e95086f4e 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -2,6 +2,7 @@ <div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs"> <header :class="{ indicate }"> <slot name="header"></slot> + <button ref="menu" @click="menu">%fa:caret-down%</button> </header> <div ref="body"> <slot></slot> @@ -11,8 +12,16 @@ <script lang="ts"> import Vue from 'vue'; +import Menu from '../../../../common/views/components/menu.vue'; export default Vue.extend({ + props: { + id: { + type: String, + required: false + } + }, + data() { return { indicate: false @@ -48,6 +57,29 @@ export default Vue.extend({ const current = this.$refs.body.scrollTop + this.$refs.body.clientHeight; if (current > this.$refs.body.scrollHeight - 1) this.$emit('bottom'); } + }, + + menu() { + this.os.new(Menu, { + source: this.$refs.menu, + compact: false, + items: [{ + content: '%fa:arrow-left% %i18n:@swap-left%', + onClick: () => { + this.$store.dispatch('settings/swapLeftDeckColumn', this.id); + } + }, { + content: '%fa:arrow-right% %i18n:@swap-right%', + onClick: () => { + this.$store.dispatch('settings/swapRightDeckColumn', this.id); + } + }, { + content: '%fa:trash-alt R% %i18n:@remove%', + onClick: () => { + this.$store.dispatch('settings/removeDeckColumn', this.id); + } + }] + }); } } }); @@ -57,6 +89,8 @@ export default Vue.extend({ @import '~const.styl' root(isDark) + $header-height = 42px + flex 1 min-width 330px max-width 330px @@ -68,7 +102,7 @@ root(isDark) > header z-index 1 - line-height 42px + line-height $header-height padding 0 16px color isDark ? #e3e5e8 : #888 background isDark ? #313543 : #fff @@ -77,8 +111,26 @@ root(isDark) &.indicate box-shadow 0 3px 0 0 $theme-color + > span + [data-fa] + margin-right 8px + + > button + position absolute + top 0 + right 0 + width $header-height + line-height $header-height + color isDark ? #9baec8 : #ccc + + &:hover + color isDark ? #b2c1d5 : #aaa + + &:active + color isDark ? #b2c1d5 : #999 + > div - height calc(100% - 42px) + height calc(100% - $header-height) overflow auto overflow-x hidden diff --git a/src/client/app/desktop/views/pages/deck/deck.list-tl.vue b/src/client/app/desktop/views/pages/deck/deck.list-tl.vue new file mode 100644 index 0000000000..7b5e76ffec --- /dev/null +++ b/src/client/app/desktop/views/pages/deck/deck.list-tl.vue @@ -0,0 +1,103 @@ +<template> + <x-notes ref="timeline" :more="existMore ? more : null"/> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import XNotes from './deck.notes.vue'; +import { UserListStream } from '../../../../common/scripts/streaming/user-list'; + +const fetchLimit = 10; + +export default Vue.extend({ + components: { + XNotes + }, + + props: { + list: { + type: Object, + required: true + } + }, + + data() { + return { + fetching: true, + moreFetching: false, + existMore: false, + connection: null + }; + }, + + mounted() { + if (this.connection) this.connection.close(); + this.connection = new UserListStream((this as any).os, this.$store.state.i, this.list.id); + this.connection.on('note', this.onNote); + this.connection.on('userAdded', this.onUserAdded); + this.connection.on('userRemoved', this.onUserRemoved); + + this.fetch(); + }, + + beforeDestroy() { + this.connection.close(); + }, + + methods: { + fetch() { + this.fetching = true; + + (this.$refs.timeline as any).init(() => new Promise((res, rej) => { + (this as any).api('notes/user-list-timeline', { + listId: this.list.id, + limit: fetchLimit + 1, + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes + }).then(notes => { + if (notes.length == fetchLimit + 1) { + notes.pop(); + this.existMore = true; + } + res(notes); + this.fetching = false; + this.$emit('loaded'); + }, rej); + })); + }, + more() { + this.moreFetching = true; + + const promise = (this as any).api('notes/user-list-timeline', { + listId: this.list.id, + limit: fetchLimit + 1, + untilId: (this.$refs.timeline as any).tail().id, + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes + }); + + promise.then(notes => { + if (notes.length == fetchLimit + 1) { + notes.pop(); + } else { + this.existMore = false; + } + notes.forEach(n => (this.$refs.timeline as any).append(n)); + this.moreFetching = false; + }); + + return promise; + }, + onNote(note) { + // Prepend a note + (this.$refs.timeline as any).prepend(note); + }, + onUserAdded() { + this.fetch(); + }, + onUserRemoved() { + this.fetch(); + } + } +}); +</script> diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue index 0566989642..bfc2af1935 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue @@ -1,6 +1,6 @@ <template> <div> - <x-column> + <x-column :id="id"> <span slot="header">%fa:bell R% %i18n:@notifications%</span> <x-notifications/> @@ -17,6 +17,13 @@ export default Vue.extend({ components: { XColumn, XNotifications + }, + + props: { + id: { + type: String, + required: true + } } }); </script> diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue index 674f04077f..2781377762 100644 --- a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue @@ -1,13 +1,15 @@ <template> <div> - <x-column> + <x-column :id="column.id"> <span slot="header"> - <template v-if="src == 'home'">%fa:home% %i18n:@home%</template> - <template v-if="src == 'local'">%fa:R comments% %i18n:@local%</template> - <template v-if="src == 'global'">%fa:globe% %i18n:@global%</template> - <template v-if="src == 'list'">%fa:list% {{ list.title }}</template> + <template v-if="column.type == 'home'">%fa:home%%i18n:@home%</template> + <template v-if="column.type == 'local'">%fa:R comments%%i18n:@local%</template> + <template v-if="column.type == 'global'">%fa:globe%%i18n:@global%</template> + <template v-if="column.type == 'list'">%fa:list%{{ column.list.title }}</template> </span> - <x-tl :src="src"/> + + <x-list-tl v-if="column.type == 'list'" :list="column.list"/> + <x-tl v-else :src="column.type"/> </x-column> </div> </template> @@ -16,18 +18,20 @@ import Vue from 'vue'; import XColumn from './deck.column.vue'; import XTl from './deck.tl.vue'; +import XListTl from './deck.list-tl.vue'; export default Vue.extend({ components: { XColumn, - XTl + XTl, + XListTl }, props: { - src: { - type: String, - required: false + column: { + type: Object, + required: true } - }, + } }); </script> diff --git a/src/client/app/desktop/views/pages/deck/deck.tl.vue b/src/client/app/desktop/views/pages/deck/deck.tl.vue index 0a788b32ed..8e9d783875 100644 --- a/src/client/app/desktop/views/pages/deck/deck.tl.vue +++ b/src/client/app/desktop/views/pages/deck/deck.tl.vue @@ -27,9 +27,7 @@ export default Vue.extend({ moreFetching: false, existMore: false, connection: null, - connectionId: null, - unreadCount: 0, - date: null + connectionId: null }; }, @@ -74,17 +72,12 @@ export default Vue.extend({ }, methods: { - mount(root) { - this.$refs.timeline.mount(root); - }, - fetch() { this.fetching = true; (this.$refs.timeline as any).init(() => new Promise((res, rej) => { (this as any).api(this.endpoint, { limit: fetchLimit + 1, - untilDate: this.date ? this.date.getTime() : undefined, includeMyRenotes: this.$store.state.settings.showMyRenotes, includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes }).then(notes => { diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index a31eb44dd0..ebec4f096c 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -2,12 +2,13 @@ <mk-ui :class="$style.root"> <div class="qlvquzbjribqcaozciifydkngcwtyzje" :data-darkmode="$store.state.device.darkmode"> <template v-for="column in columns"> - <x-notifications-column v-if="column.type == 'notifications'" :key="column.id"/> - <x-tl-column v-if="column.type == 'home'" :key="column.id" src="home"/> - <x-tl-column v-if="column.type == 'local'" :key="column.id" src="local"/> - <x-tl-column v-if="column.type == 'global'" :key="column.id" src="global"/> + <x-notifications-column v-if="column.type == 'notifications'" :key="column.id" :id="column.id"/> + <x-tl-column v-if="column.type == 'home'" :key="column.id" :column="column"/> + <x-tl-column v-if="column.type == 'local'" :key="column.id" :column="column"/> + <x-tl-column v-if="column.type == 'global'" :key="column.id" :column="column"/> + <x-tl-column v-if="column.type == 'list'" :key="column.id" :column="column"/> </template> - <button>%fa:plus%</button> + <button ref="add" @click="add">%fa:plus%</button> </div> </mk-ui> </template> @@ -16,6 +17,8 @@ import Vue from 'vue'; import XTlColumn from './deck.tl-column.vue'; import XNotificationsColumn from './deck.notifications-column.vue'; +import Menu from '../../../../common/views/components/menu.vue'; +import MkUserListsWindow from '../../components/user-lists-window.vue'; import * as uuid from 'uuid'; export default Vue.extend({ @@ -55,6 +58,61 @@ export default Vue.extend({ value: deck }); } + }, + + methods: { + add() { + this.os.new(Menu, { + source: this.$refs.add, + compact: true, + items: [{ + content: '%i18n:@home%', + onClick: () => { + this.$store.dispatch('settings/addDeckColumn', { + id: uuid(), + type: 'home' + }); + } + }, { + content: '%i18n:@local%', + onClick: () => { + this.$store.dispatch('settings/addDeckColumn', { + id: uuid(), + type: 'local' + }); + } + }, { + content: '%i18n:@global%', + onClick: () => { + this.$store.dispatch('settings/addDeckColumn', { + id: uuid(), + type: 'global' + }); + } + }, { + content: '%i18n:@list%', + onClick: () => { + const w = (this as any).os.new(MkUserListsWindow); + w.$once('choosen', list => { + this.$store.dispatch('settings/addDeckColumn', { + id: uuid(), + type: 'list', + list: list + }); + w.close(); + }); + } + }, { + content: '%i18n:@notifications%', + onClick: () => { + this.$store.dispatch('settings/addDeckColumn', { + id: uuid(), + type: 'notifications' + }); + } + }] + }); + } } }); </script> diff --git a/src/client/app/mios.ts b/src/client/app/mios.ts index a8da5ddb55..c644e22087 100644 --- a/src/client/app/mios.ts +++ b/src/client/app/mios.ts @@ -73,12 +73,12 @@ export default class MiOS extends EventEmitter { public app: Vue; public new(vm, props) { - const w = new vm({ + const x = new vm({ parent: this.app, propsData: props }).$mount(); - document.body.appendChild(w.$el); - return w; + document.body.appendChild(x.$el); + return x; } /** diff --git a/src/client/app/store.ts b/src/client/app/store.ts index 7795c9477a..17faeb97e5 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -152,6 +152,44 @@ export default (os: MiOS) => new Vuex.Store({ removeMobileHomeWidget(state, widget) { state.mobileHome = state.mobileHome.filter(w => w.id != widget.id); + }, + + addDeckColumn(state, column) { + if (state.deck.columns == null) state.deck.columns = []; + state.deck.columns.push(column); + }, + + removeDeckColumn(state, id) { + if (state.deck.columns == null) return; + state.deck.columns = state.deck.columns.filter(c => c.id != id); + }, + + swapLeftDeckColumn(state, id) { + if (state.deck.columns == null) return; + state.deck.columns.some((c, i) => { + if (c.id == id) { + const left = state.deck.columns[i - 1]; + if (left) { + state.deck.columns[i - 1] = state.deck.columns[i]; + state.deck.columns[i] = left; + } + return true; + } + }); + }, + + swapRightDeckColumn(state, id) { + if (state.deck.columns == null) return; + state.deck.columns.some((c, i) => { + if (c.id == id) { + const right = state.deck.columns[i + 1]; + if (right) { + state.deck.columns[i + 1] = state.deck.columns[i]; + state.deck.columns[i] = right; + } + return true; + } + }); } }, @@ -174,6 +212,42 @@ export default (os: MiOS) => new Vuex.Store({ } }, + addDeckColumn(ctx, column) { + ctx.commit('addDeckColumn', column); + + os.api('i/update_client_setting', { + name: 'deck', + value: ctx.state.deck + }); + }, + + removeDeckColumn(ctx, id) { + ctx.commit('removeDeckColumn', id); + + os.api('i/update_client_setting', { + name: 'deck', + value: ctx.state.deck + }); + }, + + swapLeftDeckColumn(ctx, id) { + ctx.commit('swapLeftDeckColumn', id); + + os.api('i/update_client_setting', { + name: 'deck', + value: ctx.state.deck + }); + }, + + swapRightDeckColumn(ctx, id) { + ctx.commit('swapRightDeckColumn', id); + + os.api('i/update_client_setting', { + name: 'deck', + value: ctx.state.deck + }); + }, + addHomeWidget(ctx, widget) { ctx.commit('addHomeWidget', widget); From 781fffee4273370f316520385c24e112858de9a6 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 6 Jun 2018 05:18:46 +0900 Subject: [PATCH 144/369] 2.26.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 474b942135..983c2c8304 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.26.0", - "clientVersion": "1.0.6140", + "version": "2.26.1", + "clientVersion": "1.0.6148", "codename": "nighthike", "main": "./built/index.js", "private": true, From 380a369ecaa1501bc73c4cf46c8ae1435714021a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 6 Jun 2018 05:29:31 +0900 Subject: [PATCH 145/369] oops --- src/client/app/desktop/views/pages/deck/deck.column.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 2e95086f4e..3dc2da1c77 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -130,7 +130,7 @@ root(isDark) color isDark ? #b2c1d5 : #999 > div - height calc(100% - $header-height) + height "calc(100% - %s)" % $header-height overflow auto overflow-x hidden From e8edda01a98c57bbb4a7fb71a5a2ece9f9e970ac Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 6 Jun 2018 05:29:45 +0900 Subject: [PATCH 146/369] 2.26.2 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 983c2c8304..9c2bfb16e6 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.26.1", - "clientVersion": "1.0.6148", + "version": "2.26.2", + "clientVersion": "1.0.6150", "codename": "nighthike", "main": "./built/index.js", "private": true, From ed8fa59639da195804ccfad129225c3d82fbf10f Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Wed, 6 Jun 2018 05:39:05 +0900 Subject: [PATCH 147/369] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 380795c7d1..a6eade4bc2 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ ultimately sophisticated new type of mini-blog based SNS. ---------------------------------------------------------------- * Reactions * User lists +* Cusromizable column view (known as MisskeyDeck) * Private messages * Mute * Streaming From fac686830584b572710f39f6b29cef71dc015e29 Mon Sep 17 00:00:00 2001 From: momf <m0fqn090310@gmail.com> Date: Wed, 6 Jun 2018 09:46:33 +0900 Subject: [PATCH 148/369] fix: validate post's text with Ctrl+Enter on PC. --- src/client/app/desktop/views/components/post-form.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index 7b2adfe707..ac9b7bcede 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -209,7 +209,7 @@ export default Vue.extend({ }, onKeydown(e) { - if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey)) this.post(); + if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey) && canPost) this.post(); }, onPaste(e) { From b0f989dbacbdbdd091b0d220496d22f47c795576 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 6 Jun 2018 19:22:45 +0900 Subject: [PATCH 149/369] =?UTF-8?q?Deck=E3=81=AB=E3=82=A6=E3=82=A3?= =?UTF-8?q?=E3=82=B8=E3=82=A7=E3=83=83=E3=83=88=E3=82=92=E7=BD=AE=E3=81=91?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/app/common/define-widget.ts | 21 +-- .../app/common/scripts/streaming/home.ts | 25 ++- .../app/common/views/components/menu.vue | 10 +- .../app/common/views/widgets/broadcast.vue | 2 +- .../app/common/views/widgets/calendar.vue | 4 +- .../app/common/views/widgets/donation.vue | 2 +- src/client/app/common/views/widgets/rss.vue | 2 +- .../app/common/views/widgets/slideshow.vue | 2 +- .../app/desktop/views/components/home.vue | 4 +- .../views/components/widget-container.vue | 2 +- .../desktop/views/pages/deck/deck.column.vue | 74 ++++++--- .../pages/deck/deck.notifications-column.vue | 2 +- .../app/desktop/views/pages/deck/deck.vue | 14 +- .../views/pages/deck/deck.widgets-column.vue | 152 ++++++++++++++++++ src/client/app/mobile/views/pages/widgets.vue | 4 +- src/client/app/store.ts | 89 ++++++---- src/server/api/endpoints.ts | 5 + src/server/api/endpoints/i/update_home.ts | 51 +----- .../api/endpoints/i/update_mobile_home.ts | 52 +----- src/server/api/endpoints/i/update_widget.ts | 79 +++++++++ 20 files changed, 417 insertions(+), 179 deletions(-) create mode 100644 src/client/app/desktop/views/pages/deck/deck.widgets-column.vue create mode 100644 src/server/api/endpoints/i/update_widget.ts diff --git a/src/client/app/common/define-widget.ts b/src/client/app/common/define-widget.ts index 0b2bc36566..2fae28be72 100644 --- a/src/client/app/common/define-widget.ts +++ b/src/client/app/common/define-widget.ts @@ -9,9 +9,9 @@ export default function<T extends object>(data: { widget: { type: Object }, - isMobile: { - type: Boolean, - default: false + platform: { + type: String, + required: true }, isCustomizeMode: { type: Boolean, @@ -66,17 +66,10 @@ export default function<T extends object>(data: { this.bakeProps(); - if (this.isMobile) { - (this as any).api('i/update_mobile_home', { - id: this.id, - data: this.props - }); - } else { - (this as any).api('i/update_home', { - id: this.id, - data: this.props - }); - } + (this as any).api('i/update_widget', { + id: this.id, + data: this.props + }); } } }); diff --git a/src/client/app/common/scripts/streaming/home.ts b/src/client/app/common/scripts/streaming/home.ts index a27c55a60d..dd18c70d70 100644 --- a/src/client/app/common/scripts/streaming/home.ts +++ b/src/client/app/common/scripts/streaming/home.ts @@ -58,25 +58,18 @@ export class HomeStream extends Stream { }); this.on('home_updated', x => { - if (x.home) { - os.store.commit('settings/setHome', x.home); - } else { - os.store.commit('settings/setHomeWidget', { - id: x.id, - data: x.data - }); - } + os.store.commit('settings/setHome', x); }); this.on('mobile_home_updated', x => { - if (x.home) { - os.store.commit('settings/setMobileHome', x.home); - } else { - os.store.commit('settings/setMobileHomeWidget', { - id: x.id, - data: x.data - }); - } + os.store.commit('settings/setMobileHome', x); + }); + + this.on('widgetUpdated', x => { + os.store.commit('settings/setWidget', { + id: x.id, + data: x.data + }); }); // トークンが再生成されたとき diff --git a/src/client/app/common/views/components/menu.vue b/src/client/app/common/views/components/menu.vue index e5df8345b9..73c8403ad3 100644 --- a/src/client/app/common/views/components/menu.vue +++ b/src/client/app/common/views/components/menu.vue @@ -2,7 +2,10 @@ <div class="mk-menu"> <div class="backdrop" ref="backdrop" @click="close"></div> <div class="popover" :class="{ compact }" ref="popover"> - <button v-for="item in items" @click="clicked(item.onClick)" v-html="item.content"></button> + <template v-for="item in items"> + <div v-if="item == null"></div> + <button v-else @click="clicked(item.onClick)" v-html="item.content"></button> + </template> </div> </div> </template> @@ -150,4 +153,9 @@ $border-color = rgba(27, 31, 35, 0.15) color $theme-color-foreground background darken($theme-color, 10%) + > div + margin 8px 0 + height 1px + background #eee + </style> diff --git a/src/client/app/common/views/widgets/broadcast.vue b/src/client/app/common/views/widgets/broadcast.vue index f337cec853..69b2a54fe9 100644 --- a/src/client/app/common/views/widgets/broadcast.vue +++ b/src/client/app/common/views/widgets/broadcast.vue @@ -2,7 +2,7 @@ <div class="mkw-broadcast" :data-found="broadcasts.length != 0" :data-melt="props.design == 1" - :data-mobile="isMobile" + :data-mobile="platform == 'mobile'" > <div class="icon"> <svg height="32" version="1.1" viewBox="0 0 32 32" width="32"> diff --git a/src/client/app/common/views/widgets/calendar.vue b/src/client/app/common/views/widgets/calendar.vue index 0e9714960a..333b56f629 100644 --- a/src/client/app/common/views/widgets/calendar.vue +++ b/src/client/app/common/views/widgets/calendar.vue @@ -1,5 +1,5 @@ <template> -<div class="mkw-calendar" :data-special="special" :data-mobile="isMobile"> +<div class="mkw-calendar" :data-special="special" :data-mobile="platform == 'mobile'"> <mk-widget-container :naked="props.design == 1" :show-header="false"> <div class="mkw-calendar--body"> <div class="calendar" :data-is-holiday="isHoliday"> @@ -67,7 +67,7 @@ export default define({ }, methods: { func() { - if (this.isMobile) return; + if (this.platform == 'mobile') return; if (this.props.design == 2) { this.props.design = 0; } else { diff --git a/src/client/app/common/views/widgets/donation.vue b/src/client/app/common/views/widgets/donation.vue index 75f5db808a..470576d5e6 100644 --- a/src/client/app/common/views/widgets/donation.vue +++ b/src/client/app/common/views/widgets/donation.vue @@ -1,5 +1,5 @@ <template> -<div class="mkw-donation" :data-mobile="isMobile"> +<div class="mkw-donation" :data-mobile="platform == 'mobile'"> <article> <h1>%fa:heart%%i18n:@title%</h1> <p> diff --git a/src/client/app/common/views/widgets/rss.vue b/src/client/app/common/views/widgets/rss.vue index 7ac453e450..a777388cdb 100644 --- a/src/client/app/common/views/widgets/rss.vue +++ b/src/client/app/common/views/widgets/rss.vue @@ -4,7 +4,7 @@ <template slot="header">%fa:rss-square%RSS</template> <button slot="func" title="設定" @click="setting">%fa:cog%</button> - <div class="mkw-rss--body" :data-mobile="isMobile"> + <div class="mkw-rss--body" :data-mobile="platform == 'mobile'"> <p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> <div class="feed" v-else> <a v-for="item in items" :href="item.link" target="_blank">{{ item.title }}</a> diff --git a/src/client/app/common/views/widgets/slideshow.vue b/src/client/app/common/views/widgets/slideshow.vue index 459b24a32f..e1c28f5115 100644 --- a/src/client/app/common/views/widgets/slideshow.vue +++ b/src/client/app/common/views/widgets/slideshow.vue @@ -1,5 +1,5 @@ <template> -<div class="mkw-slideshow" :data-mobile="isMobile"> +<div class="mkw-slideshow" :data-mobile="platform == 'mobile'"> <div @click="choose"> <p v-if="props.folder === undefined"> <template v-if="isCustomizeMode">フォルダを指定するには、カスタマイズモードを終了してください</template> diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index c30ca68210..826753c169 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -47,7 +47,7 @@ :key="place" > <div v-for="widget in widgets[place]" class="customize-container" :key="widget.id" @contextmenu.stop.prevent="onWidgetContextmenu(widget.id)"> - <component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true"/> + <component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="desktop"/> </div> </x-draggable> <div class="main"> @@ -60,7 +60,7 @@ </template> <template v-else> <div v-for="place in ['left', 'right']" :class="place"> - <component v-for="widget in widgets[place]" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" @chosen="warp"/> + <component v-for="widget in widgets[place]" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" @chosen="warp" platform="desktop"/> </div> <div class="main"> <mk-post-form class="form" v-if="$store.state.settings.showPostFormOnTopOfTl"/> diff --git a/src/client/app/desktop/views/components/widget-container.vue b/src/client/app/desktop/views/components/widget-container.vue index 488e9cb249..7cfcd68eba 100644 --- a/src/client/app/desktop/views/components/widget-container.vue +++ b/src/client/app/desktop/views/components/widget-container.vue @@ -36,7 +36,7 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) background isDark ? #282C37 : #fff - border solid 1px rgba(#000, 0.075) + border solid 1px rgba(#000, isDark ? 0.2 : 0.075) border-radius 6px overflow hidden diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 3dc2da1c77..e9f013734a 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -1,8 +1,8 @@ <template> -<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs"> +<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow }"> <header :class="{ indicate }"> <slot name="header"></slot> - <button ref="menu" @click="menu">%fa:caret-down%</button> + <button ref="menu" @click="showMenu">%fa:caret-down%</button> </header> <div ref="body"> <slot></slot> @@ -19,6 +19,20 @@ export default Vue.extend({ id: { type: String, required: false + }, + menu: { + type: Array, + required: false + }, + naked: { + type: Boolean, + required: false, + default: false + }, + narrow: { + type: Boolean, + required: false, + default: false } }, @@ -59,26 +73,33 @@ export default Vue.extend({ } }, - menu() { + showMenu() { + const items = [{ + content: '%fa:arrow-left% %i18n:@swap-left%', + onClick: () => { + this.$store.dispatch('settings/swapLeftDeckColumn', this.id); + } + }, { + content: '%fa:arrow-right% %i18n:@swap-right%', + onClick: () => { + this.$store.dispatch('settings/swapRightDeckColumn', this.id); + } + }, { + content: '%fa:trash-alt R% %i18n:@remove%', + onClick: () => { + this.$store.dispatch('settings/removeDeckColumn', this.id); + } + }]; + + if (this.menu) { + items.unshift(null); + this.menu.reverse().forEach(i => items.unshift(i)); + } + this.os.new(Menu, { source: this.$refs.menu, compact: false, - items: [{ - content: '%fa:arrow-left% %i18n:@swap-left%', - onClick: () => { - this.$store.dispatch('settings/swapLeftDeckColumn', this.id); - } - }, { - content: '%fa:arrow-right% %i18n:@swap-right%', - onClick: () => { - this.$store.dispatch('settings/swapRightDeckColumn', this.id); - } - }, { - content: '%fa:trash-alt R% %i18n:@remove%', - onClick: () => { - this.$store.dispatch('settings/removeDeckColumn', this.id); - } - }] + items }); } } @@ -100,6 +121,21 @@ root(isDark) box-shadow 0 2px 16px rgba(#000, 0.1) overflow hidden + &.narrow + min-width 285px + max-width 285px + + &.naked + background rgba(#000, isDark ? 0.25 : 0.1) + + > header + background transparent + box-shadow none + + if !isDark + > button + color #bbb + > header z-index 1 line-height $header-height diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue index bfc2af1935..b92614314c 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue @@ -1,7 +1,7 @@ <template> <div> <x-column :id="id"> - <span slot="header">%fa:bell R% %i18n:@notifications%</span> + <span slot="header">%fa:bell R%%i18n:@notifications%</span> <x-notifications/> </x-column> diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index ebec4f096c..4935d9a5bd 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -2,6 +2,7 @@ <mk-ui :class="$style.root"> <div class="qlvquzbjribqcaozciifydkngcwtyzje" :data-darkmode="$store.state.device.darkmode"> <template v-for="column in columns"> + <x-widgets-column v-if="column.type == 'widgets'" :key="column.id" :column="column"/> <x-notifications-column v-if="column.type == 'notifications'" :key="column.id" :id="column.id"/> <x-tl-column v-if="column.type == 'home'" :key="column.id" :column="column"/> <x-tl-column v-if="column.type == 'local'" :key="column.id" :column="column"/> @@ -17,6 +18,7 @@ import Vue from 'vue'; import XTlColumn from './deck.tl-column.vue'; import XNotificationsColumn from './deck.notifications-column.vue'; +import XWidgetsColumn from './deck.widgets-column.vue'; import Menu from '../../../../common/views/components/menu.vue'; import MkUserListsWindow from '../../components/user-lists-window.vue'; import * as uuid from 'uuid'; @@ -24,7 +26,8 @@ import * as uuid from 'uuid'; export default Vue.extend({ components: { XTlColumn, - XNotificationsColumn + XNotificationsColumn, + XWidgetsColumn }, computed: { columns() { @@ -110,6 +113,15 @@ export default Vue.extend({ type: 'notifications' }); } + }, { + content: '%i18n:@widgets%', + onClick: () => { + this.$store.dispatch('settings/addDeckColumn', { + id: uuid(), + type: 'widgets', + widgets: [] + }); + } }] }); } diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue new file mode 100644 index 0000000000..0b2cc305f4 --- /dev/null +++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue @@ -0,0 +1,152 @@ +<template> +<div class="wtdtxvecapixsepjtcupubtsmometobz"> + <x-column :id="column.id" :menu="menu" :naked="true" :narrow="true"> + <span slot="header">%fa:calculator%%i18n:@widgets%</span> + + <div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq"> + <template v-if="edit"> + <header> + <select v-model="widgetAdderSelected"> + <option value="profile">%i18n:common.widgets.profile%</option> + <option value="analog-clock">%i18n:common.widgets.analog-clock%</option> + <option value="calendar">%i18n:common.widgets.calendar%</option> + <option value="timemachine">%i18n:common.widgets.timemachine%</option> + <option value="activity">%i18n:common.widgets.activity%</option> + <option value="rss">%i18n:common.widgets.rss%</option> + <option value="trends">%i18n:common.widgets.trends%</option> + <option value="photo-stream">%i18n:common.widgets.photo-stream%</option> + <option value="slideshow">%i18n:common.widgets.slideshow%</option> + <option value="version">%i18n:common.widgets.version%</option> + <option value="broadcast">%i18n:common.widgets.broadcast%</option> + <option value="notifications">%i18n:common.widgets.notifications%</option> + <option value="users">%i18n:common.widgets.users%</option> + <option value="polls">%i18n:common.widgets.polls%</option> + <option value="post-form">%i18n:common.widgets.post-form%</option> + <option value="messaging">%i18n:common.widgets.messaging%</option> + <option value="memo">%i18n:common.widgets.memo%</option> + <option value="server">%i18n:common.widgets.server%</option> + <option value="donation">%i18n:common.widgets.donation%</option> + <option value="nav">%i18n:common.widgets.nav%</option> + <option value="tips">%i18n:common.widgets.tips%</option> + </select> + <button @click="addWidget">追加</button> + </header> + <x-draggable + :list="column.widgets" + :options="{ handle: '.handle', animation: 150 }" + @sort="onWidgetSort" + > + <div v-for="widget in column.widgets" class="customize-container" :key="widget.id"> + <header> + <span class="handle">%fa:bars%</span>{{ widget.name }}<button class="remove" @click="removeWidget(widget)">%fa:times%</button> + </header> + <div @click="widgetFunc(widget.id)"> + <component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="deck"/> + </div> + </div> + </x-draggable> + </template> + <template v-else> + <component class="widget" v-for="widget in column.widgets" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" platform="deck"/> + </template> + </div> + </x-column> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import XColumn from './deck.column.vue'; +import * as XDraggable from 'vuedraggable'; +import * as uuid from 'uuid'; + +export default Vue.extend({ + components: { + XColumn, + XDraggable + }, + + props: { + column: { + type: Object, + required: true + } + }, + + data() { + return { + edit: false, + menu: null, + widgetAdderSelected: null + } + }, + + created() { + this.menu = [{ + content: '%fa:cog% %i18n:@edit%', + onClick: () => { + this.edit = !this.edit; + } + }]; + }, + + methods: { + widgetFunc(id) { + const w = this.$refs[id][0]; + if (w.func) w.func(); + }, + + onWidgetSort() { + this.saveWidgets(); + }, + + addWidget() { + this.$store.dispatch('settings/addDeckWidget', { + id: this.column.id, + widget: { + name: this.widgetAdderSelected, + id: uuid(), + data: {} + } + }); + }, + + removeWidget(widget) { + this.$store.dispatch('settings/removeDeckWidget', { + id: this.column.id, + widget + }); + }, + + saveWidgets() { + this.$store.dispatch('settings/saveDeck'); + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +root(isDark) + .gqpwvtwtprsbmnssnbicggtwqhmylhnq + .widget, .customize-container + margin 8px + + &:first-of-type + margin-top 0 + + .customize-container + background #fff + + > header + color isDark ? #fff : #000 + +.wtdtxvecapixsepjtcupubtsmometobz[data-darkmode] + root(true) + +.wtdtxvecapixsepjtcupubtsmometobz:not([data-darkmode]) + root(false) + +</style> + diff --git a/src/client/app/mobile/views/pages/widgets.vue b/src/client/app/mobile/views/pages/widgets.vue index a0893770e8..eab0ca6a38 100644 --- a/src/client/app/mobile/views/pages/widgets.vue +++ b/src/client/app/mobile/views/pages/widgets.vue @@ -35,13 +35,13 @@ <span class="handle">%fa:bars%</span>{{ widget.name }}<button class="remove" @click="removeWidget(widget)">%fa:times%</button> </header> <div @click="widgetFunc(widget.id)"> - <component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" :is-mobile="true"/> + <component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="mobile"/> </div> </div> </x-draggable> </template> <template v-else> - <component class="widget" v-for="widget in widgets" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" :is-mobile="true"/> + <component class="widget" v-for="widget in widgets" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" platform="mobile"/> </template> </main> </mk-ui> diff --git a/src/client/app/store.ts b/src/client/app/store.ts index 17faeb97e5..5582ff6c57 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -124,13 +124,6 @@ export default (os: MiOS) => new Vuex.Store({ state.home = data; }, - setHomeWidget(state, x) { - const w = state.home.find(w => w.id == x.id); - if (w) { - w.data = x.data; - } - }, - addHomeWidget(state, widget) { state.home.unshift(widget); }, @@ -139,11 +132,36 @@ export default (os: MiOS) => new Vuex.Store({ state.mobileHome = data; }, - setMobileHomeWidget(state, x) { - const w = state.mobileHome.find(w => w.id == x.id); - if (w) { - w.data = x.data; + setWidget(state, x) { + let w; + + //#region Decktop home + if (state.home) { + w = state.home.find(w => w.id == x.id); + if (w) { + w.data = x.data; + } } + //#endregion + + //#region Mobile home + if (state.mobileHome) { + w = state.mobileHome.find(w => w.id == x.id); + if (w) { + w.data = x.data; + } + } + //#endregion + + //#region Deck + if (state.deck && state.deck.columns) { + state.deck.columns.filter(c => c.type == 'widgets').forEach(c => { + c.widgets.forEach(w => { + if (w.id == x.id) w.data = x.data; + }); + }); + } + //#endregion }, addMobileHomeWidget(state, widget) { @@ -190,6 +208,20 @@ export default (os: MiOS) => new Vuex.Store({ return true; } }); + }, + + addDeckWidget(state, x) { + if (state.deck.columns == null) return; + const column = state.deck.columns.find(c => c.id == x.id); + if (column == null) return; + column.widgets.unshift(x.widget); + }, + + removeDeckWidget(state, x) { + if (state.deck.columns == null) return; + const column = state.deck.columns.find(c => c.id == x.id); + if (column == null) return; + column.widgets = column.widgets.filter(w => w.id != x.widget.id); } }, @@ -212,40 +244,41 @@ export default (os: MiOS) => new Vuex.Store({ } }, - addDeckColumn(ctx, column) { - ctx.commit('addDeckColumn', column); - + saveDeck(ctx) { os.api('i/update_client_setting', { name: 'deck', value: ctx.state.deck }); }, + addDeckColumn(ctx, column) { + ctx.commit('addDeckColumn', column); + ctx.dispatch('saveDeck'); + }, + removeDeckColumn(ctx, id) { ctx.commit('removeDeckColumn', id); - - os.api('i/update_client_setting', { - name: 'deck', - value: ctx.state.deck - }); + ctx.dispatch('saveDeck'); }, swapLeftDeckColumn(ctx, id) { ctx.commit('swapLeftDeckColumn', id); - - os.api('i/update_client_setting', { - name: 'deck', - value: ctx.state.deck - }); + ctx.dispatch('saveDeck'); }, swapRightDeckColumn(ctx, id) { ctx.commit('swapRightDeckColumn', id); + ctx.dispatch('saveDeck'); + }, - os.api('i/update_client_setting', { - name: 'deck', - value: ctx.state.deck - }); + addDeckWidget(ctx, x) { + ctx.commit('addDeckWidget', x); + ctx.dispatch('saveDeck'); + }, + + removeDeckWidget(ctx, x) { + ctx.commit('removeDeckWidget', x); + ctx.dispatch('saveDeck'); }, addHomeWidget(ctx, widget) { diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts index e9392d236b..94e649d29b 100644 --- a/src/server/api/endpoints.ts +++ b/src/server/api/endpoints.ts @@ -189,6 +189,11 @@ const endpoints: Endpoint[] = [ withCredential: true, secure: true }, + { + name: 'i/update_widget', + withCredential: true, + secure: true + }, { name: 'i/change_password', withCredential: true, diff --git a/src/server/api/endpoints/i/update_home.ts b/src/server/api/endpoints/i/update_home.ts index 8ce551957e..48f6dbbb7a 100644 --- a/src/server/api/endpoints/i/update_home.ts +++ b/src/server/api/endpoints/i/update_home.ts @@ -1,6 +1,3 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import User from '../../../../models/user'; import event from '../../../../publishers/stream'; @@ -13,50 +10,16 @@ module.exports = async (params, user) => new Promise(async (res, rej) => { .have('id', $.str) .have('place', $.str) .have('data', $.obj)) - .optional() .get(params.home); if (homeErr) return rej('invalid home param'); - // Get 'id' parameter - const [id, idErr] = $.str.optional().get(params.id); - if (idErr) return rej('invalid id param'); + await User.update(user._id, { + $set: { + 'clientSettings.home': home + } + }); - // Get 'data' parameter - const [data, dataErr] = $.obj.optional().get(params.data); - if (dataErr) return rej('invalid data param'); + res(); - if (home) { - await User.update(user._id, { - $set: { - 'clientSettings.home': home - } - }); - - res(); - - event(user._id, 'home_updated', { - home - }); - } else { - if (id == null && data == null) return rej('you need to set id and data params if home param unset'); - - const _home = user.clientSettings.home; - const widget = _home.find(w => w.id == id); - - if (widget == null) return rej('widget not found'); - - widget.data = data; - - await User.update(user._id, { - $set: { - 'clientSettings.home': _home - } - }); - - res(); - - event(user._id, 'home_updated', { - id, data - }); - } + event(user._id, 'home_updated', home); }); diff --git a/src/server/api/endpoints/i/update_mobile_home.ts b/src/server/api/endpoints/i/update_mobile_home.ts index d79a77072b..d285a0a72d 100644 --- a/src/server/api/endpoints/i/update_mobile_home.ts +++ b/src/server/api/endpoints/i/update_mobile_home.ts @@ -1,6 +1,3 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import User from '../../../../models/user'; import event from '../../../../publishers/stream'; @@ -12,49 +9,16 @@ module.exports = async (params, user) => new Promise(async (res, rej) => { .have('name', $.str) .have('id', $.str) .have('data', $.obj)) - .optional().get(params.home); + .get(params.home); if (homeErr) return rej('invalid home param'); - // Get 'id' parameter - const [id, idErr] = $.str.optional().get(params.id); - if (idErr) return rej('invalid id param'); + await User.update(user._id, { + $set: { + 'clientSettings.mobileHome': home + } + }); - // Get 'data' parameter - const [data, dataErr] = $.obj.optional().get(params.data); - if (dataErr) return rej('invalid data param'); + res(); - if (home) { - await User.update(user._id, { - $set: { - 'clientSettings.mobileHome': home - } - }); - - res(); - - event(user._id, 'mobile_home_updated', { - home - }); - } else { - if (id == null && data == null) return rej('you need to set id and data params if home param unset'); - - const _home = user.clientSettings.mobileHome || []; - const widget = _home.find(w => w.id == id); - - if (widget == null) return rej('widget not found'); - - widget.data = data; - - await User.update(user._id, { - $set: { - 'clientSettings.mobileHome': _home - } - }); - - res(); - - event(user._id, 'mobile_home_updated', { - id, data - }); - } + event(user._id, 'mobile_home_updated', home); }); diff --git a/src/server/api/endpoints/i/update_widget.ts b/src/server/api/endpoints/i/update_widget.ts new file mode 100644 index 0000000000..b37761bde1 --- /dev/null +++ b/src/server/api/endpoints/i/update_widget.ts @@ -0,0 +1,79 @@ +import $ from 'cafy'; +import User from '../../../../models/user'; +import event from '../../../../publishers/stream'; + +module.exports = async (params, user) => new Promise(async (res, rej) => { + // Get 'id' parameter + const [id, idErr] = $.str.get(params.id); + if (idErr) return rej('invalid id param'); + + // Get 'data' parameter + const [data, dataErr] = $.obj.get(params.data); + if (dataErr) return rej('invalid data param'); + + if (id == null && data == null) return rej('you need to set id and data params if home param unset'); + + let widget; + + //#region Desktop home + if (widget == null && user.clientSettings.home) { + const desktopHome = user.clientSettings.home; + widget = desktopHome.find(w => w.id == id); + if (widget) { + widget.data = data; + + await User.update(user._id, { + $set: { + 'clientSettings.home': desktopHome + } + }); + } + } + //#endregion + + //#region Mobile home + if (widget == null && user.clientSettings.mobileHome) { + const mobileHome = user.clientSettings.mobileHome; + widget = mobileHome.find(w => w.id == id); + if (widget) { + widget.data = data; + + await User.update(user._id, { + $set: { + 'clientSettings.mobileHome': mobileHome + } + }); + } + } + //#endregion + + //#region Deck + if (widget == null && user.clientSettings.deck && user.clientSettings.deck.columns) { + const deck = user.clientSettings.deck; + deck.columns.filter(c => c.type == 'widgets').forEach(c => { + c.widgets.forEach(w => { + if (w.id == id) widget = w; + }); + }); + if (widget) { + widget.data = data; + + await User.update(user._id, { + $set: { + 'clientSettings.deck': deck + } + }); + } + } + //#endregion + + if (widget) { + event(user._id, 'widgetUpdated', { + id, data + }); + + res(); + } else { + rej('widget not found'); + } +}); From dc58c9bd2f3d91252719a931efadaa043878d349 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 6 Jun 2018 19:24:34 +0900 Subject: [PATCH 150/369] 2.27.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9c2bfb16e6..7a063e1ea4 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.26.2", - "clientVersion": "1.0.6150", + "version": "2.27.0", + "clientVersion": "1.0.6156", "codename": "nighthike", "main": "./built/index.js", "private": true, From 1201794befc3aa52091f9a388a581219333d317d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 6 Jun 2018 19:34:25 +0900 Subject: [PATCH 151/369] Revert "fix: validate post's text with Ctrl+Enter on PC." This reverts commit fac686830584b572710f39f6b29cef71dc015e29. --- src/client/app/desktop/views/components/post-form.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index ac9b7bcede..7b2adfe707 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -209,7 +209,7 @@ export default Vue.extend({ }, onKeydown(e) { - if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey) && canPost) this.post(); + if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey)) this.post(); }, onPaste(e) { From c1b320710bc543e6aabf3c67545554a8ae5b5d73 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 6 Jun 2018 19:37:15 +0900 Subject: [PATCH 152/369] 2.27.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 7a063e1ea4..25aa109552 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.27.0", - "clientVersion": "1.0.6156", + "version": "2.27.1", + "clientVersion": "1.0.6158", "codename": "nighthike", "main": "./built/index.js", "private": true, From ebb98d975b23523313af3765115f2f6775474096 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 7 Jun 2018 00:53:31 +0900 Subject: [PATCH 153/369] :v: --- src/client/app/desktop/style.styl | 5 ----- src/client/app/desktop/views/pages/deck/deck.vue | 1 + src/client/app/desktop/views/pages/welcome.vue | 4 +--- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/client/app/desktop/style.styl b/src/client/app/desktop/style.styl index f2a60955fd..3cd36482e4 100644 --- a/src/client/app/desktop/style.styl +++ b/src/client/app/desktop/style.styl @@ -42,8 +42,3 @@ html &:active background-color $theme-color - -body - display flex - flex-direction column - min-height 100% diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index 4935d9a5bd..ef54dd7fbd 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -140,6 +140,7 @@ export default Vue.extend({ root(isDark) display flex flex 1 + justify-content center padding 16px 0 16px 16px overflow auto diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index cecd7e3a90..688d3e21cb 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -83,9 +83,7 @@ export default Vue.extend({ @import url(https://fonts.googleapis.com/earlyaccess/notosansjp.css); root(isDark) - display flex - flex-direction column - flex 1 + min-height 100vh background-image isDark ? url('/assets/welcome-bg.dark.svg') : url('/assets/welcome-bg.light.svg') background-size cover background-position center From b85597b15d49c45a9ba26a64d758a765dd6c2709 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 7 Jun 2018 01:00:38 +0900 Subject: [PATCH 154/369] Fix glitch --- src/client/app/desktop/views/pages/deck/deck.vue | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index ef54dd7fbd..b876dec103 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -29,12 +29,14 @@ export default Vue.extend({ XNotificationsColumn, XWidgetsColumn }, + computed: { columns() { if (this.$store.state.settings.deck == null) return []; return this.$store.state.settings.deck.columns; } }, + created() { if (this.$store.state.settings.deck == null) { const deck = { @@ -63,6 +65,14 @@ export default Vue.extend({ } }, + mounted() { + document.documentElement.style.overflow = 'hidden'; + }, + + beforeDestroy() { + document.documentElement.style.overflow = 'auto'; + }, + methods: { add() { this.os.new(Menu, { From 9ad7a804960e09f16bb5e00c491f14c61ef7e22a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 7 Jun 2018 01:17:29 +0900 Subject: [PATCH 155/369] i18n --- locales/ja.yml | 12 ++++++++++++ .../app/desktop/views/pages/deck/deck.column.vue | 6 +++--- .../pages/deck/deck.notifications-column.vue | 2 +- .../desktop/views/pages/deck/deck.tl-column.vue | 6 +++--- src/client/app/desktop/views/pages/deck/deck.vue | 16 ++++++++-------- .../views/pages/deck/deck.widgets-column.vue | 4 ++-- 6 files changed, 29 insertions(+), 17 deletions(-) diff --git a/locales/ja.yml b/locales/ja.yml index 026c2308c3..8e04d0988f 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -76,6 +76,18 @@ common: nav: "ナビゲーション" tips: "ヒント" + deck: + widgets: "ウィジェット" + home: "ホーム" + local: "ローカル" + global: "グローバル" + notifications: "通知" + list: "リスト" + swap-left: "左に移動" + swap-right: "右に移動" + remove: "カラムを削除" + add-column: "カラムを追加" + common/views/components/connect-failed.vue: title: "サーバーに接続できません" description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。" diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index e9f013734a..4dee0db91c 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -75,17 +75,17 @@ export default Vue.extend({ showMenu() { const items = [{ - content: '%fa:arrow-left% %i18n:@swap-left%', + content: '%fa:arrow-left% %i18n:common.deck.swap-left%', onClick: () => { this.$store.dispatch('settings/swapLeftDeckColumn', this.id); } }, { - content: '%fa:arrow-right% %i18n:@swap-right%', + content: '%fa:arrow-right% %i18n:common.deck.swap-right%', onClick: () => { this.$store.dispatch('settings/swapRightDeckColumn', this.id); } }, { - content: '%fa:trash-alt R% %i18n:@remove%', + content: '%fa:trash-alt R% %i18n:common.deck.remove%', onClick: () => { this.$store.dispatch('settings/removeDeckColumn', this.id); } diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue index b92614314c..f57c52d2e1 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue @@ -1,7 +1,7 @@ <template> <div> <x-column :id="id"> - <span slot="header">%fa:bell R%%i18n:@notifications%</span> + <span slot="header">%fa:bell R%%i18n:common.deck.notifications%</span> <x-notifications/> </x-column> diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue index 2781377762..54bc6bfc22 100644 --- a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue @@ -2,9 +2,9 @@ <div> <x-column :id="column.id"> <span slot="header"> - <template v-if="column.type == 'home'">%fa:home%%i18n:@home%</template> - <template v-if="column.type == 'local'">%fa:R comments%%i18n:@local%</template> - <template v-if="column.type == 'global'">%fa:globe%%i18n:@global%</template> + <template v-if="column.type == 'home'">%fa:home%%i18n:common.deck.home%</template> + <template v-if="column.type == 'local'">%fa:R comments%%i18n:common.deck.local%</template> + <template v-if="column.type == 'global'">%fa:globe%%i18n:common.deck.global%</template> <template v-if="column.type == 'list'">%fa:list%{{ column.list.title }}</template> </span> diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index b876dec103..d6cbf7396d 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -9,7 +9,7 @@ <x-tl-column v-if="column.type == 'global'" :key="column.id" :column="column"/> <x-tl-column v-if="column.type == 'list'" :key="column.id" :column="column"/> </template> - <button ref="add" @click="add">%fa:plus%</button> + <button ref="add" @click="add" title="%i18n:common.deck.add-column%">%fa:plus%</button> </div> </mk-ui> </template> @@ -79,7 +79,7 @@ export default Vue.extend({ source: this.$refs.add, compact: true, items: [{ - content: '%i18n:@home%', + content: '%i18n:common.deck.home%', onClick: () => { this.$store.dispatch('settings/addDeckColumn', { id: uuid(), @@ -87,7 +87,7 @@ export default Vue.extend({ }); } }, { - content: '%i18n:@local%', + content: '%i18n:common.deck.local%', onClick: () => { this.$store.dispatch('settings/addDeckColumn', { id: uuid(), @@ -95,7 +95,7 @@ export default Vue.extend({ }); } }, { - content: '%i18n:@global%', + content: '%i18n:common.deck.global%', onClick: () => { this.$store.dispatch('settings/addDeckColumn', { id: uuid(), @@ -103,7 +103,7 @@ export default Vue.extend({ }); } }, { - content: '%i18n:@list%', + content: '%i18n:common.deck.list%', onClick: () => { const w = (this as any).os.new(MkUserListsWindow); w.$once('choosen', list => { @@ -116,7 +116,7 @@ export default Vue.extend({ }); } }, { - content: '%i18n:@notifications%', + content: '%i18n:common.deck.notifications%', onClick: () => { this.$store.dispatch('settings/addDeckColumn', { id: uuid(), @@ -124,7 +124,7 @@ export default Vue.extend({ }); } }, { - content: '%i18n:@widgets%', + content: '%i18n:common.deck.widgets%', onClick: () => { this.$store.dispatch('settings/addDeckColumn', { id: uuid(), @@ -155,7 +155,7 @@ root(isDark) overflow auto > div - margin-right 16px + margin-right 8px &:last-of-type margin-right 0 diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue index 0b2cc305f4..34073160c1 100644 --- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue @@ -1,7 +1,7 @@ <template> <div class="wtdtxvecapixsepjtcupubtsmometobz"> <x-column :id="column.id" :menu="menu" :naked="true" :narrow="true"> - <span slot="header">%fa:calculator%%i18n:@widgets%</span> + <span slot="header">%fa:calculator%%i18n:common.deck.widgets%</span> <div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq"> <template v-if="edit"> @@ -29,7 +29,7 @@ <option value="nav">%i18n:common.widgets.nav%</option> <option value="tips">%i18n:common.widgets.tips%</option> </select> - <button @click="addWidget">追加</button> + <button @click="addWidget">%i18n:@add%</button> </header> <x-draggable :list="column.widgets" From 388cb7db3a7ce8d6489b3d59875c41b2b140e32c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 7 Jun 2018 01:41:05 +0900 Subject: [PATCH 156/369] :v: --- .../views/components/notifications.vue | 2 +- .../views/pages/deck/deck.notification.vue | 179 +++++++++++++++ .../views/pages/deck/deck.notifications.vue | 216 +++--------------- 3 files changed, 210 insertions(+), 187 deletions(-) create mode 100644 src/client/app/desktop/views/pages/deck/deck.notification.vue diff --git a/src/client/app/desktop/views/components/notifications.vue b/src/client/app/desktop/views/components/notifications.vue index f2247a782c..ada97d5c86 100644 --- a/src/client/app/desktop/views/components/notifications.vue +++ b/src/client/app/desktop/views/components/notifications.vue @@ -206,7 +206,7 @@ root(isDark) margin 0 padding 16px overflow-wrap break-word - font-size 0.9em + font-size 12px border-bottom solid 1px isDark ? #1c2023 : rgba(#000, 0.05) &:last-child diff --git a/src/client/app/desktop/views/pages/deck/deck.notification.vue b/src/client/app/desktop/views/pages/deck/deck.notification.vue new file mode 100644 index 0000000000..a145a94f8a --- /dev/null +++ b/src/client/app/desktop/views/pages/deck/deck.notification.vue @@ -0,0 +1,179 @@ +<template> +<div class="dsfykdcjpuwfvpefwufddclpjhzktmpw"> + <div class="notification reaction" v-if="notification.type == 'reaction'"> + <mk-avatar class="avatar" :user="notification.user"/> + <div> + <header> + <mk-reaction-icon :reaction="notification.reaction"/> + <router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link> + <mk-time :time="notification.createdAt"/> + </header> + <router-link class="note-ref" :to="notification.note | notePage"> + %fa:quote-left%{{ getNoteSummary(notification.note) }} + %fa:quote-right% + </router-link> + </div> + </div> + + <div class="notification renote" v-if="notification.type == 'renote'"> + <mk-avatar class="avatar" :user="notification.user"/> + <div> + <header> + %fa:retweet% + <router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link> + <mk-time :time="notification.createdAt"/> + </header> + <router-link class="note-ref" :to="notification.note | notePage"> + %fa:quote-left%{{ getNoteSummary(notification.note.renote) }}%fa:quote-right% + </router-link> + </div> + </div> + + <div class="notification follow" v-if="notification.type == 'follow'"> + <mk-avatar class="avatar" :user="notification.user"/> + <div> + <header> + %fa:user-plus% + <router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link> + <mk-time :time="notification.createdAt"/> + </header> + </div> + </div> + + <div class="notification followRequest" v-if="notification.type == 'receiveFollowRequest'"> + <mk-avatar class="avatar" :user="notification.user"/> + <div> + <header> + %fa:user-clock% + <router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link> + <mk-time :time="notification.createdAt"/> + </header> + </div> + </div> + + <div class="notification poll_vote" v-if="notification.type == 'poll_vote'"> + <mk-avatar class="avatar" :user="notification.user"/> + <div> + <header> + %fa:chart-pie% + <router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link> + <mk-time :time="notification.createdAt"/> + </header> + <router-link class="note-ref" :to="notification.note | notePage"> + %fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right% + </router-link> + </div> + </div> + + <template v-if="notification.type == 'quote'"> + <x-note :note="notification.note" @update:note="onNoteUpdated"/> + </template> + + <template v-if="notification.type == 'reply'"> + <x-note :note="notification.note" @update:note="onNoteUpdated"/> + </template> + + <template v-if="notification.type == 'mention'"> + <x-note :note="notification.note" @update:note="onNoteUpdated"/> + </template> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import getNoteSummary from '../../../../../../renderers/get-note-summary'; +import XNote from './deck.note.vue'; + +export default Vue.extend({ + components: { + XNote + }, + props: ['notification'], + data() { + return { + getNoteSummary + }; + }, + methods: { + onNoteUpdated(note) { + switch (this.notification.type) { + case 'quote': + case 'reply': + case 'mention': + Vue.set(this.notification, 'note', note); + break; + } + } + } +}); +</script> + +<style lang="stylus" scoped> +root(isDark) + > .notification + padding 16px + font-size 12px + overflow-wrap break-word + + &:after + content "" + display block + clear both + + > .avatar + display block + float left + width 36px + height 36px + border-radius 6px + + > div + float right + width calc(100% - 36px) + padding-left 8px + + > header + display flex + align-items baseline + white-space nowrap + + i, .mk-reaction-icon + margin-right 4px + + > .mk-time + margin-left auto + color isDark ? #606984 : #c0c0c0 + font-size 0.9em + + > .note-preview + color isDark ? #fff : #717171 + + > .note-ref + color isDark ? #fff : #717171 + + [data-fa] + font-size 1em + font-weight normal + font-style normal + display inline-block + margin-right 3px + + &.renote + > div > header i + color #77B255 + + &.follow + > div > header i + color #53c7ce + + &.receiveFollowRequest + > div > header i + color #888 + +.dsfykdcjpuwfvpefwufddclpjhzktmpw[data-darkmode] + root(true) + +.dsfykdcjpuwfvpefwufddclpjhzktmpw:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications.vue b/src/client/app/desktop/views/pages/deck/deck.notifications.vue index 7a9646b587..31a3673dd3 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notifications.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notifications.vue @@ -1,102 +1,14 @@ <template> <div class="oxynyeqmfvracxnglgulyqfgqxnxmehl"> - <div class="notifications" v-if="notifications.length != 0"> - <transition-group name="mk-notifications" class="transition"> - <template v-for="(notification, i) in _notifications"> - <div class="notification" :class="notification.type" :key="notification.id"> - <mk-time :time="notification.createdAt"/> - - <template v-if="notification.type == 'reaction'"> - <mk-avatar class="avatar" :user="notification.user"/> - <div class="text"> - <p> - <mk-reaction-icon :reaction="notification.reaction"/> - <router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link> - </p> - <router-link class="note-ref" :to="notification.note | notePage"> - %fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right% - </router-link> - </div> - </template> - - <template v-if="notification.type == 'renote'"> - <mk-avatar class="avatar" :user="notification.note.user"/> - <div class="text"> - <p>%fa:retweet% - <router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link> - </p> - <router-link class="note-ref" :to="notification.note | notePage"> - %fa:quote-left%{{ getNoteSummary(notification.note.renote) }}%fa:quote-right% - </router-link> - </div> - </template> - - <template v-if="notification.type == 'quote'"> - <mk-avatar class="avatar" :user="notification.note.user"/> - <div class="text"> - <p>%fa:quote-left% - <router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link> - </p> - <router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link> - </div> - </template> - - <template v-if="notification.type == 'follow'"> - <mk-avatar class="avatar" :user="notification.user"/> - <div class="text"> - <p>%fa:user-plus% - <router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link> - </p> - </div> - </template> - - <template v-if="notification.type == 'receiveFollowRequest'"> - <mk-avatar class="avatar" :user="notification.user"/> - <div class="text"> - <p>%fa:user-clock% - <router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link> - </p> - </div> - </template> - - <template v-if="notification.type == 'reply'"> - <mk-avatar class="avatar" :user="notification.note.user"/> - <div class="text"> - <p>%fa:reply% - <router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link> - </p> - <router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link> - </div> - </template> - - <template v-if="notification.type == 'mention'"> - <mk-avatar class="avatar" :user="notification.note.user"/> - <div class="text"> - <p>%fa:at% - <router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link> - </p> - <a class="note-preview" :href="notification.note | notePage">{{ getNoteSummary(notification.note) }}</a> - </div> - </template> - - <template v-if="notification.type == 'poll_vote'"> - <mk-avatar class="avatar" :user="notification.user"/> - <div class="text"> - <p>%fa:chart-pie%<a :href="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</a></p> - <router-link class="note-ref" :to="notification.note | notePage"> - %fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right% - </router-link> - </div> - </template> - </div> - - <p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'"> - <span>%fa:angle-up%{{ notification._datetext }}</span> - <span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span> - </p> - </template> - </transition-group> - </div> + <transition-group name="mk-notifications" class="transition notifications"> + <template v-for="(notification, i) in _notifications"> + <x-notification class="notification" :notification="notification" :key="notification.id"/> + <p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'"> + <span>%fa:angle-up%{{ notification._datetext }}</span> + <span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span> + </p> + </template> + </transition-group> <button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications"> <template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }} </button> @@ -107,9 +19,12 @@ <script lang="ts"> import Vue from 'vue'; -import getNoteSummary from '../../../../../../renderers/get-note-summary'; +import XNotification from './deck.notification.vue'; export default Vue.extend({ + components: { + XNotification + }, data() { return { fetching: true, @@ -117,8 +32,7 @@ export default Vue.extend({ notifications: [], moreNotifications: false, connection: null, - connectionId: null, - getNoteSummary + connectionId: null }; }, computed: { @@ -191,6 +105,7 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) + .transition .mk-notifications-enter .mk-notifications-leave-to @@ -201,96 +116,25 @@ root(isDark) transition transform .3s ease, opacity .3s ease > .notifications - > * - > .notification - margin 0 - padding 16px - overflow-wrap break-word - font-size 0.9em - border-bottom solid 1px isDark ? #1c2023 : rgba(#000, 0.05) - &:last-child - border-bottom none + > .notification:not(:last-child) + border-bottom solid 1px isDark ? #1c2023 : #eaeaea - > .mk-time - display inline - position absolute - top 16px - right 12px - vertical-align top - color isDark ? #606984 : rgba(#000, 0.6) - font-size small + > .date + display block + margin 0 + line-height 32px + text-align center + font-size 0.8em + color isDark ? #666b79 : #aaa + background isDark ? #242731 : #fdfdfd + border-bottom solid 1px isDark ? #1c2023 : #eaeaea - &:after - content "" - display block - clear both + span + margin 0 16px - > .avatar - display block - float left - position -webkit-sticky - position sticky - top 16px - width 36px - height 36px - border-radius 6px - - > .text - float right - width calc(100% - 36px) - padding-left 8px - - p - margin 0 - - i, .mk-reaction-icon - margin-right 4px - - .note-preview - color isDark ? #c2cad4 : rgba(#000, 0.7) - - .note-ref - color isDark ? #c2cad4 : rgba(#000, 0.7) - - [data-fa] - font-size 1em - font-weight normal - font-style normal - display inline-block - margin-right 3px - - &.renote, &.quote - .text p i - color #77B255 - - &.follow - .text p i - color #53c7ce - - &.receiveFollowRequest - .text p i - color #888 - - &.reply, &.mention - .text p i - color #555 - - > .date - display block - margin 0 - line-height 32px - text-align center - font-size 0.8em - color isDark ? #666b79 : #aaa - background isDark ? #242731 : #fdfdfd - border-bottom solid 1px isDark ? #1c2023 : rgba(#000, 0.05) - - span - margin 0 16px - - [data-fa] - margin-right 8px + i + margin-right 8px > .more display block From 8678e30cc8da8a91c3dcdad11a3696defa77f13f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 7 Jun 2018 01:45:04 +0900 Subject: [PATCH 157/369] 2.27.2 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 25aa109552..63c9f5e24c 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.27.1", - "clientVersion": "1.0.6158", + "version": "2.27.2", + "clientVersion": "1.0.6185", "codename": "nighthike", "main": "./built/index.js", "private": true, From 999ce8e36640b6ee2f2b483915c2ae4a13816f8a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 7 Jun 2018 01:52:03 +0900 Subject: [PATCH 158/369] Improve scroll performance --- src/client/app/desktop/views/components/notes.vue | 2 +- src/client/app/desktop/views/pages/deck/deck.column.vue | 2 +- src/client/app/desktop/views/pages/search.vue | 2 +- src/client/app/desktop/views/pages/user/user.header.vue | 2 +- src/client/app/mobile/views/components/notes.vue | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/client/app/desktop/views/components/notes.vue b/src/client/app/desktop/views/components/notes.vue index 5a147f31e2..69f3739f79 100644 --- a/src/client/app/desktop/views/components/notes.vue +++ b/src/client/app/desktop/views/components/notes.vue @@ -74,7 +74,7 @@ export default Vue.extend({ mounted() { document.addEventListener('visibilitychange', this.onVisibilitychange, false); - window.addEventListener('scroll', this.onScroll); + window.addEventListener('scroll', this.onScroll, { passive: true }); }, beforeDestroy() { diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 4dee0db91c..458732fa73 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -51,7 +51,7 @@ export default Vue.extend({ }, mounted() { - this.$refs.body.addEventListener('scroll', this.onScroll); + this.$refs.body.addEventListener('scroll', this.onScroll, { passive: true }); }, beforeDestroy() { this.$refs.body.removeEventListener('scroll', this.onScroll); diff --git a/src/client/app/desktop/views/pages/search.vue b/src/client/app/desktop/views/pages/search.vue index 67e1e3bfe0..e79ac1c739 100644 --- a/src/client/app/desktop/views/pages/search.vue +++ b/src/client/app/desktop/views/pages/search.vue @@ -46,7 +46,7 @@ export default Vue.extend({ }, mounted() { document.addEventListener('keydown', this.onDocumentKeydown); - window.addEventListener('scroll', this.onScroll); + window.addEventListener('scroll', this.onScroll, { passive: true }); this.fetch(); }, diff --git a/src/client/app/desktop/views/pages/user/user.header.vue b/src/client/app/desktop/views/pages/user/user.header.vue index 44910bc7f0..d52c6b762c 100644 --- a/src/client/app/desktop/views/pages/user/user.header.vue +++ b/src/client/app/desktop/views/pages/user/user.header.vue @@ -37,7 +37,7 @@ export default Vue.extend({ mounted() { if (this.user.bannerUrl) { window.addEventListener('load', this.onScroll); - window.addEventListener('scroll', this.onScroll); + window.addEventListener('scroll', this.onScroll, { passive: true }); window.addEventListener('resize', this.onScroll); } }, diff --git a/src/client/app/mobile/views/components/notes.vue b/src/client/app/mobile/views/components/notes.vue index 09cee966a3..7aaf0424c7 100644 --- a/src/client/app/mobile/views/components/notes.vue +++ b/src/client/app/mobile/views/components/notes.vue @@ -81,7 +81,7 @@ export default Vue.extend({ mounted() { document.addEventListener('visibilitychange', this.onVisibilitychange, false); - window.addEventListener('scroll', this.onScroll); + window.addEventListener('scroll', this.onScroll, { passive: true }); }, beforeDestroy() { From 39099909bf54f03a3c98bf26036557cc05f033e2 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 7 Jun 2018 02:06:32 +0900 Subject: [PATCH 159/369] Fix firefox --- src/client/app/desktop/views/components/ui.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client/app/desktop/views/components/ui.vue b/src/client/app/desktop/views/components/ui.vue index ad6fc69dfa..34769b52bb 100644 --- a/src/client/app/desktop/views/components/ui.vue +++ b/src/client/app/desktop/views/components/ui.vue @@ -49,4 +49,5 @@ export default Vue.extend({ display flex flex-direction column flex 1 + overflow hidden </style> From 0ac5fdab49df5430df52404b7035f4f2e00a1a11 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 7 Jun 2018 02:07:00 +0900 Subject: [PATCH 160/369] 2.27.3 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 63c9f5e24c..6d4c9f750e 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.27.2", - "clientVersion": "1.0.6185", + "version": "2.27.3", + "clientVersion": "1.0.6188", "codename": "nighthike", "main": "./built/index.js", "private": true, From 0534a0a41e32dd53d476efd597e9a134a3352b5e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 7 Jun 2018 04:31:49 +0900 Subject: [PATCH 161/369] :v: --- cli/suspend.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/cli/suspend.js b/cli/suspend.js index 0f22bba477..077685d507 100644 --- a/cli/suspend.js +++ b/cli/suspend.js @@ -3,16 +3,21 @@ const User = require('../built/models/user').default; const args = process.argv.slice(2); -const userId = new mongo.ObjectID(args[0]); +const user = args[0]; -console.log(`Suspending ${userId}...`); +const q = user.startsWith('@') ? { + username: user.split('@')[1], + host: user.split('@')[2] +} : { _id: new mongo.ObjectID(user) }; -User.update({ _id: userId }, { +console.log(`Suspending ${user}...`); + +User.update(q, { $set: { isSuspended: true } }).then(() => { - console.log(`Suspended ${userId}`); + console.log(`Suspended ${user}`); }, e => { console.error(e); }); From 2053a041e5167480dfa7c688632bf4b88339f66a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 7 Jun 2018 04:33:39 +0900 Subject: [PATCH 162/369] Fix --- cli/suspend.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/suspend.js b/cli/suspend.js index 077685d507..877b37dbca 100644 --- a/cli/suspend.js +++ b/cli/suspend.js @@ -7,7 +7,7 @@ const user = args[0]; const q = user.startsWith('@') ? { username: user.split('@')[1], - host: user.split('@')[2] + host: user.split('@')[2] || null } : { _id: new mongo.ObjectID(user) }; console.log(`Suspending ${user}...`); From 14d12c21f2ee7f7162b3583e94c13b8a6e7f1e43 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 7 Jun 2018 05:14:37 +0900 Subject: [PATCH 163/369] nanka iroiro --- .../app/desktop/views/components/settings.vue | 10 ++++++++++ src/client/app/desktop/views/components/ui.vue | 14 +++++++++++++- .../app/desktop/views/pages/deck/deck.column.vue | 1 + src/client/app/desktop/views/pages/deck/deck.vue | 8 +++++++- src/models/user.ts | 5 +++++ src/server/api/endpoints/i/update.ts | 15 +++++++++++++++ 6 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index 1bfff8cc83..e0d578c33b 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -40,6 +40,7 @@ <button class="ui button" @click="customizeHome" style="margin-bottom: 16px">%i18n:@customize%</button> </div> <div class="div"> + <button class="ui" @click="updateWallpaper">%i18n:@choose-wallpaper%</button> <mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/> <mk-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/> <mk-switch v-model="$store.state.settings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/> @@ -293,6 +294,15 @@ export default Vue.extend({ this.$router.push('/i/customize-home'); this.$emit('done'); }, + updateWallpaper() { + (this as any).apis.chooseDriveFile({ + multiple: false + }).then(file => { + (this as any).api('i/update', { + wallpaperId: file.id + }); + }); + }, onChangeFetchOnScroll(v) { this.$store.dispatch('settings/set', { key: 'fetchOnScroll', diff --git a/src/client/app/desktop/views/components/ui.vue b/src/client/app/desktop/views/components/ui.vue index 34769b52bb..351deafded 100644 --- a/src/client/app/desktop/views/components/ui.vue +++ b/src/client/app/desktop/views/components/ui.vue @@ -1,5 +1,5 @@ <template> -<div class="mk-ui"> +<div class="mk-ui" :style="style"> <x-header class="header"/> <div class="content"> <slot></slot> @@ -16,6 +16,15 @@ export default Vue.extend({ components: { XHeader }, + computed: { + style(): any { + if (!this.$store.getters.isSignedIn || this.$store.state.i.wallpaperUrl == null) return {}; + return { + backgroundColor: this.$store.state.i.wallpaperColor && this.$store.state.i.wallpaperColor.length == 3 ? `rgb(${ this.$store.state.i.wallpaperColor.join(',') })` : null, + backgroundImage: `url(${ this.$store.state.i.wallpaperUrl })` + }; + } + }, mounted() { document.addEventListener('keydown', this.onKeydown); }, @@ -40,6 +49,9 @@ export default Vue.extend({ display flex flex-direction column flex 1 + background-size cover + background-position center + background-attachment fixed > .header @media (max-width 1000px) diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 458732fa73..f71503d5c1 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -140,6 +140,7 @@ root(isDark) z-index 1 line-height $header-height padding 0 16px + font-size 14px color isDark ? #e3e5e8 : #888 background isDark ? #313543 : #fff box-shadow 0 1px rgba(#000, 0.15) diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index d6cbf7396d..369874ec67 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -150,7 +150,6 @@ export default Vue.extend({ root(isDark) display flex flex 1 - justify-content center padding 16px 0 16px 16px overflow auto @@ -160,6 +159,13 @@ root(isDark) &:last-of-type margin-right 0 + > * + &:first-child + margin-left auto + + &:last-child + margin-right auto + > button padding 0 16px color isDark ? #93a0a5 : #888 diff --git a/src/models/user.ts b/src/models/user.ts index 0e06512dae..2d4d7dc184 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -48,6 +48,7 @@ type IUserBase = { usernameLower: string; avatarId: mongo.ObjectID; bannerId: mongo.ObjectID; + wallpaperId: mongo.ObjectID; data: any; description: string; pinnedNoteId: mongo.ObjectID; @@ -412,6 +413,10 @@ export const pack = ( ? `${config.drive_url}/${_user.bannerId}` : null; + _user.wallpaperUrl = _user.wallpaperId != null + ? `${config.drive_url}/${_user.wallpaperId}` + : null; + if (!meId || !meId.equals(_user.id) || !opts.detail) { delete _user.avatarId; delete _user.bannerId; diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index b94f073d2c..1a1da997c9 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -45,6 +45,11 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { if (bannerIdErr) return rej('invalid bannerId param'); if (bannerId !== undefined) updates.bannerId = bannerId; + // Get 'wallpaperId' parameter + const [wallpaperId, wallpaperIdErr] = $.type(ID).optional().nullable().get(params.wallpaperId); + if (wallpaperIdErr) return rej('invalid wallpaperId param'); + if (wallpaperId !== undefined) updates.wallpaperId = wallpaperId; + // Get 'isLocked' parameter const [isLocked, isLockedErr] = $.bool.optional().get(params.isLocked); if (isLockedErr) return rej('invalid isLocked param'); @@ -85,6 +90,16 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => { } } + if (wallpaperId) { + const wallpaper = await DriveFile.findOne({ + _id: wallpaperId + }); + + if (wallpaper != null && wallpaper.metadata.properties.avgColor) { + updates.wallpaperColor = wallpaper.metadata.properties.avgColor; + } + } + await User.update(user._id, { $set: updates }); From 818bc96aabbee330ed27fc0fe180cbd43d8c8af8 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 7 Jun 2018 05:15:05 +0900 Subject: [PATCH 164/369] 2.28.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 6d4c9f750e..6cf0fc42bf 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.27.3", - "clientVersion": "1.0.6188", + "version": "2.28.0", + "clientVersion": "1.0.6192", "codename": "nighthike", "main": "./built/index.js", "private": true, From be9f836b21c3d7dc1b315fa305caf17f04c139c4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 7 Jun 2018 06:13:57 +0900 Subject: [PATCH 165/369] =?UTF-8?q?=E3=82=84=E3=81=A3=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja.yml | 1 + .../desktop/views/pages/deck/deck.column.vue | 17 ++++++- .../desktop/views/pages/deck/deck.list-tl.vue | 15 ++++++ .../pages/deck/deck.notifications-column.vue | 17 +++++-- .../views/pages/deck/deck.tl-column.vue | 50 ++++++++++++++++--- .../app/desktop/views/pages/deck/deck.tl.vue | 15 ++++++ .../app/desktop/views/pages/deck/deck.vue | 2 +- .../views/pages/deck/deck.widgets-column.vue | 11 +++- src/client/app/store.ts | 11 ++++ .../api/endpoints/notes/global-timeline.ts | 8 +++ .../api/endpoints/notes/local-timeline.ts | 8 +++ src/server/api/endpoints/notes/timeline.ts | 10 ++++ .../api/endpoints/notes/user-list-timeline.ts | 10 ++++ 13 files changed, 159 insertions(+), 16 deletions(-) diff --git a/locales/ja.yml b/locales/ja.yml index 8e04d0988f..320da8e777 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -87,6 +87,7 @@ common: swap-right: "右に移動" remove: "カラムを削除" add-column: "カラムを追加" + rename: "名前を変更" common/views/components/connect-failed.vue: title: "サーバーに接続できません" diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index f71503d5c1..10005fa9b0 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -20,6 +20,10 @@ export default Vue.extend({ type: String, required: false }, + name: { + type: String, + required: false + }, menu: { type: Array, required: false @@ -75,6 +79,17 @@ export default Vue.extend({ showMenu() { const items = [{ + content: '%fa:pencil-alt% %i18n:common.deck.rename%', + onClick: () => { + (this as any).apis.input({ + title: '%i18n:common.deck.rename%', + default: this.name, + allowEmpty: false + }).then(name => { + this.$store.dispatch('settings/renameDeckColumn', { id: this.id, name }); + }); + } + }, null, { content: '%fa:arrow-left% %i18n:common.deck.swap-left%', onClick: () => { this.$store.dispatch('settings/swapLeftDeckColumn', this.id); @@ -84,7 +99,7 @@ export default Vue.extend({ onClick: () => { this.$store.dispatch('settings/swapRightDeckColumn', this.id); } - }, { + }, null, { content: '%fa:trash-alt R% %i18n:common.deck.remove%', onClick: () => { this.$store.dispatch('settings/removeDeckColumn', this.id); diff --git a/src/client/app/desktop/views/pages/deck/deck.list-tl.vue b/src/client/app/desktop/views/pages/deck/deck.list-tl.vue index 7b5e76ffec..ee4e89747b 100644 --- a/src/client/app/desktop/views/pages/deck/deck.list-tl.vue +++ b/src/client/app/desktop/views/pages/deck/deck.list-tl.vue @@ -18,6 +18,11 @@ export default Vue.extend({ list: { type: Object, required: true + }, + mediaOnly: { + type: Boolean, + required: false, + default: false } }, @@ -30,6 +35,12 @@ export default Vue.extend({ }; }, + watch: { + mediaOnly() { + this.fetch(); + } + }, + mounted() { if (this.connection) this.connection.close(); this.connection = new UserListStream((this as any).os, this.$store.state.i, this.list.id); @@ -52,6 +63,7 @@ export default Vue.extend({ (this as any).api('notes/user-list-timeline', { listId: this.list.id, limit: fetchLimit + 1, + mediaOnly: this.mediaOnly, includeMyRenotes: this.$store.state.settings.showMyRenotes, includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes }).then(notes => { @@ -72,6 +84,7 @@ export default Vue.extend({ listId: this.list.id, limit: fetchLimit + 1, untilId: (this.$refs.timeline as any).tail().id, + mediaOnly: this.mediaOnly, includeMyRenotes: this.$store.state.settings.showMyRenotes, includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes }); @@ -89,6 +102,8 @@ export default Vue.extend({ return promise; }, onNote(note) { + if (this.mediaOnly && note.media.length == 0) return; + // Prepend a note (this.$refs.timeline as any).prepend(note); }, diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue index f57c52d2e1..e01f91c24d 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue @@ -1,7 +1,7 @@ <template> <div> - <x-column :id="id"> - <span slot="header">%fa:bell R%%i18n:common.deck.notifications%</span> + <x-column :id="column.id" :name="name"> + <span slot="header">%fa:bell R%{{ name }}</span> <x-notifications/> </x-column> @@ -20,10 +20,17 @@ export default Vue.extend({ }, props: { - id: { - type: String, + column: { + type: Object, required: true } - } + }, + + computed: { + name(): string { + if (this.column.name) return this.column.name; + return '%i18n:common.deck.notifications%'; + } + }, }); </script> diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue index 54bc6bfc22..1a5075396b 100644 --- a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue @@ -1,15 +1,20 @@ <template> <div> - <x-column :id="column.id"> + <x-column :id="column.id" :menu="menu" :name="name"> <span slot="header"> - <template v-if="column.type == 'home'">%fa:home%%i18n:common.deck.home%</template> - <template v-if="column.type == 'local'">%fa:R comments%%i18n:common.deck.local%</template> - <template v-if="column.type == 'global'">%fa:globe%%i18n:common.deck.global%</template> - <template v-if="column.type == 'list'">%fa:list%{{ column.list.title }}</template> + <template v-if="column.type == 'home'">%fa:home%</template> + <template v-if="column.type == 'local'">%fa:R comments%</template> + <template v-if="column.type == 'global'">%fa:globe%</template> + <template v-if="column.type == 'list'">%fa:list%</template> + <span>{{ name }}</span> </span> - <x-list-tl v-if="column.type == 'list'" :list="column.list"/> - <x-tl v-else :src="column.type"/> + <div class="editor" v-if="edit"> + <mk-switch v-model="column.isMediaOnly" @change="onChangeSettings" text="%i18n:@is-media-only%"/> + <mk-switch v-model="column.isMediaView" @change="onChangeSettings" text="%i18n:@is-media-view%"/> + </div> + <x-list-tl v-if="column.type == 'list'" :list="column.list" :media-only="column.isMediaOnly"/> + <x-tl v-else :src="column.type" :media-only="column.isMediaOnly"/> </x-column> </div> </template> @@ -32,6 +37,37 @@ export default Vue.extend({ type: Object, required: true } + }, + + data() { + return { + edit: false, + menu: [{ + content: '%fa:cog% %i18n:@edit%', + onClick: () => { + this.edit = !this.edit; + } + }] + } + }, + + computed: { + name(): string { + if (this.column.name) return this.column.name; + + switch (this.column.type) { + case 'home': return '%i18n:common.deck.home%'; + case 'local': return '%i18n:common.deck.local%'; + case 'global': return '%i18n:common.deck.global%'; + case 'list': return this.column.list.title; + } + } + }, + + methods: { + onChangeSettings(v) { + this.$store.dispatch('settings/saveDeck'); + } } }); </script> diff --git a/src/client/app/desktop/views/pages/deck/deck.tl.vue b/src/client/app/desktop/views/pages/deck/deck.tl.vue index 8e9d783875..47aa8c6413 100644 --- a/src/client/app/desktop/views/pages/deck/deck.tl.vue +++ b/src/client/app/desktop/views/pages/deck/deck.tl.vue @@ -18,6 +18,11 @@ export default Vue.extend({ type: String, required: false, default: 'home' + }, + mediaOnly: { + type: Boolean, + required: false, + default: false } }, @@ -31,6 +36,12 @@ export default Vue.extend({ }; }, + watch: { + mediaOnly() { + this.fetch(); + } + }, + computed: { stream(): any { return this.src == 'home' @@ -78,6 +89,7 @@ export default Vue.extend({ (this.$refs.timeline as any).init(() => new Promise((res, rej) => { (this as any).api(this.endpoint, { limit: fetchLimit + 1, + mediaOnly: this.mediaOnly, includeMyRenotes: this.$store.state.settings.showMyRenotes, includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes }).then(notes => { @@ -97,6 +109,7 @@ export default Vue.extend({ const promise = (this as any).api(this.endpoint, { limit: fetchLimit + 1, + mediaOnly: this.mediaOnly, untilId: (this.$refs.timeline as any).tail().id, includeMyRenotes: this.$store.state.settings.showMyRenotes, includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes @@ -116,6 +129,8 @@ export default Vue.extend({ }, onNote(note) { + if (this.mediaOnly && note.media.length == 0) return; + // Prepend a note (this.$refs.timeline as any).prepend(note); }, diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index 369874ec67..57ec214c3a 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -3,7 +3,7 @@ <div class="qlvquzbjribqcaozciifydkngcwtyzje" :data-darkmode="$store.state.device.darkmode"> <template v-for="column in columns"> <x-widgets-column v-if="column.type == 'widgets'" :key="column.id" :column="column"/> - <x-notifications-column v-if="column.type == 'notifications'" :key="column.id" :id="column.id"/> + <x-notifications-column v-if="column.type == 'notifications'" :key="column.id" :column="column"/> <x-tl-column v-if="column.type == 'home'" :key="column.id" :column="column"/> <x-tl-column v-if="column.type == 'local'" :key="column.id" :column="column"/> <x-tl-column v-if="column.type == 'global'" :key="column.id" :column="column"/> diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue index 34073160c1..6bcebd07cc 100644 --- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue @@ -1,7 +1,7 @@ <template> <div class="wtdtxvecapixsepjtcupubtsmometobz"> - <x-column :id="column.id" :menu="menu" :naked="true" :narrow="true"> - <span slot="header">%fa:calculator%%i18n:common.deck.widgets%</span> + <x-column :id="column.id" :menu="menu" :naked="true" :narrow="true" :name="name"> + <span slot="header">%fa:calculator%{{ name }}</span> <div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq"> <template v-if="edit"> @@ -81,6 +81,13 @@ export default Vue.extend({ } }, + computed: { + name(): string { + if (this.column.name) return this.column.name; + return '%i18n:common.deck.widgets%'; + } + }, + created() { this.menu = [{ content: '%fa:cog% %i18n:@edit%', diff --git a/src/client/app/store.ts b/src/client/app/store.ts index 5582ff6c57..d51a3abad1 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -222,6 +222,12 @@ export default (os: MiOS) => new Vuex.Store({ const column = state.deck.columns.find(c => c.id == x.id); if (column == null) return; column.widgets = column.widgets.filter(w => w.id != x.widget.id); + }, + + renameDeckColumn(state, x) { + const column = state.deck.columns.find(c => c.id == x.id); + if (column == null) return; + column.name = x.name; } }, @@ -281,6 +287,11 @@ export default (os: MiOS) => new Vuex.Store({ ctx.dispatch('saveDeck'); }, + renameDeckColumn(ctx, x) { + ctx.commit('renameDeckColumn', x); + ctx.dispatch('saveDeck'); + }, + addHomeWidget(ctx, widget) { ctx.commit('addHomeWidget', widget); diff --git a/src/server/api/endpoints/notes/global-timeline.ts b/src/server/api/endpoints/notes/global-timeline.ts index 7cf06c3af1..2d4f2b6368 100644 --- a/src/server/api/endpoints/notes/global-timeline.ts +++ b/src/server/api/endpoints/notes/global-timeline.ts @@ -35,6 +35,10 @@ module.exports = async (params, user) => { throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified'; } + // Get 'mediaOnly' parameter + const [mediaOnly, mediaOnlyErr] = $.bool.optional().get(params.mediaOnly); + if (mediaOnlyErr) throw 'invalid mediaOnly param'; + // ミュートしているユーザーを取得 const mutedUserIds = user ? (await Mute.find({ muterId: user._id @@ -64,6 +68,10 @@ module.exports = async (params, user) => { }; } + if (mediaOnly) { + query.mediaIds = { $exists: true, $ne: [] }; + } + if (sinceId) { sort._id = 1; query._id = { diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts index 7d01de3d43..734cc9af0a 100644 --- a/src/server/api/endpoints/notes/local-timeline.ts +++ b/src/server/api/endpoints/notes/local-timeline.ts @@ -35,6 +35,10 @@ module.exports = async (params, user) => { throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified'; } + // Get 'mediaOnly' parameter + const [mediaOnly, mediaOnlyErr] = $.bool.optional().get(params.mediaOnly); + if (mediaOnlyErr) throw 'invalid mediaOnly param'; + // ミュートしているユーザーを取得 const mutedUserIds = user ? (await Mute.find({ muterId: user._id @@ -67,6 +71,10 @@ module.exports = async (params, user) => { }; } + if (mediaOnly) { + query.mediaIds = { $exists: true, $ne: [] }; + } + if (sinceId) { sort._id = 1; query._id = { diff --git a/src/server/api/endpoints/notes/timeline.ts b/src/server/api/endpoints/notes/timeline.ts index 9f32555649..f1d741d5ee 100644 --- a/src/server/api/endpoints/notes/timeline.ts +++ b/src/server/api/endpoints/notes/timeline.ts @@ -44,6 +44,10 @@ module.exports = async (params, user, app) => { const [includeRenotedMyNotes = true, includeRenotedMyNotesErr] = $.bool.optional().get(params.includeRenotedMyNotes); if (includeRenotedMyNotesErr) throw 'invalid includeRenotedMyNotes param'; + // Get 'mediaOnly' parameter + const [mediaOnly, mediaOnlyErr] = $.bool.optional().get(params.mediaOnly); + if (mediaOnlyErr) throw 'invalid mediaOnly param'; + const [followings, mutedUserIds] = await Promise.all([ // フォローを取得 // Fetch following @@ -137,6 +141,12 @@ module.exports = async (params, user, app) => { }); } + if (mediaOnly) { + query.$and.push({ + mediaIds: { $exists: true, $ne: [] } + }); + } + if (sinceId) { sort._id = 1; query._id = { diff --git a/src/server/api/endpoints/notes/user-list-timeline.ts b/src/server/api/endpoints/notes/user-list-timeline.ts index 9f8397d679..a74a5141f9 100644 --- a/src/server/api/endpoints/notes/user-list-timeline.ts +++ b/src/server/api/endpoints/notes/user-list-timeline.ts @@ -44,6 +44,10 @@ module.exports = async (params, user, app) => { const [includeRenotedMyNotes = true, includeRenotedMyNotesErr] = $.bool.optional().get(params.includeRenotedMyNotes); if (includeRenotedMyNotesErr) throw 'invalid includeRenotedMyNotes param'; + // Get 'mediaOnly' parameter + const [mediaOnly, mediaOnlyErr] = $.bool.optional().get(params.mediaOnly); + if (mediaOnlyErr) throw 'invalid mediaOnly param'; + // Get 'listId' parameter const [listId, listIdErr] = $.type(ID).get(params.listId); if (listIdErr) throw 'invalid listId param'; @@ -146,6 +150,12 @@ module.exports = async (params, user, app) => { }); } + if (mediaOnly) { + query.$and.push({ + mediaIds: { $exists: true, $ne: [] } + }); + } + if (sinceId) { sort._id = 1; query._id = { From ab04f2fce06494af8c5ebc062139556b04b11f2c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 7 Jun 2018 06:15:57 +0900 Subject: [PATCH 166/369] :v: --- src/client/app/desktop/views/components/settings.vue | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index e0d578c33b..c660c2869a 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -41,6 +41,7 @@ </div> <div class="div"> <button class="ui" @click="updateWallpaper">%i18n:@choose-wallpaper%</button> + <button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button> <mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/> <mk-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/> <mk-switch v-model="$store.state.settings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/> @@ -303,6 +304,11 @@ export default Vue.extend({ }); }); }, + deleteWallpaper() { + (this as any).api('i/update', { + wallpaperId: null + }); + }, onChangeFetchOnScroll(v) { this.$store.dispatch('settings/set', { key: 'fetchOnScroll', From 86b0dfdd3392cefed4a395603fc937efc18ed6ff Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 7 Jun 2018 06:16:11 +0900 Subject: [PATCH 167/369] 2.29.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 6cf0fc42bf..90bb274b22 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.28.0", - "clientVersion": "1.0.6192", + "version": "2.29.0", + "clientVersion": "1.0.6195", "codename": "nighthike", "main": "./built/index.js", "private": true, From d3b51bf94a7fa132c966d30ff902be2829c2b933 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 7 Jun 2018 08:29:46 +0900 Subject: [PATCH 168/369] :v: --- src/client/app/common/views/components/time.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/common/views/components/time.vue b/src/client/app/common/views/components/time.vue index 6e0d2b0dcb..58ed115620 100644 --- a/src/client/app/common/views/components/time.vue +++ b/src/client/app/common/views/components/time.vue @@ -59,7 +59,7 @@ export default Vue.extend({ created() { if (this.mode == 'relative' || this.mode == 'detail') { this.tick(); - this.tickId = setInterval(this.tick, 1000); + this.tickId = setInterval(this.tick, 5000); } }, destroyed() { From 0e8a592b26b74e921e1ac708572571c842746aaa Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 7 Jun 2018 08:41:58 +0900 Subject: [PATCH 169/369] :v: --- src/client/app/desktop/views/pages/deck/deck.column.vue | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 10005fa9b0..4e37c3cbdb 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -127,9 +127,7 @@ export default Vue.extend({ root(isDark) $header-height = 42px - flex 1 - min-width 330px - max-width 330px + width 330px height 100% background isDark ? #282C37 : #fff border-radius 6px @@ -137,8 +135,7 @@ root(isDark) overflow hidden &.narrow - min-width 285px - max-width 285px + width 285px &.naked background rgba(#000, isDark ? 0.25 : 0.1) From 44ef60c8a29f05147a64b3325217606828707098 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 7 Jun 2018 08:48:22 +0900 Subject: [PATCH 170/369] 2.29.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 90bb274b22..d7986e059a 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.29.0", - "clientVersion": "1.0.6195", + "version": "2.29.1", + "clientVersion": "1.0.6218", "codename": "nighthike", "main": "./built/index.js", "private": true, From 79d592b4318d0a9d69a3469db8a0ef8b35c3af90 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 04:21:06 +0900 Subject: [PATCH 171/369] =?UTF-8?q?MisskeyDeck:=20=E3=82=AB=E3=83=A9?= =?UTF-8?q?=E3=83=A0=E3=82=92=E3=82=B9=E3=82=BF=E3=83=83=E3=82=AF=E3=81=A7?= =?UTF-8?q?=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja.yml | 2 + .../app/common/views/components/menu.vue | 33 +++++- .../views/pages/deck/deck.column-core.vue | 48 ++++++++ .../desktop/views/pages/deck/deck.column.vue | 61 +++++++--- .../pages/deck/deck.notifications-column.vue | 17 +-- .../views/pages/deck/deck.tl-column.vue | 39 +++---- .../app/desktop/views/pages/deck/deck.vue | 58 +++++++--- .../views/pages/deck/deck.widgets-column.vue | 107 ++++++++---------- src/client/app/store.ts | 53 ++++++--- 9 files changed, 275 insertions(+), 143 deletions(-) create mode 100644 src/client/app/desktop/views/pages/deck/deck.column-core.vue diff --git a/locales/ja.yml b/locales/ja.yml index 320da8e777..3161040ec8 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -88,6 +88,8 @@ common: remove: "カラムを削除" add-column: "カラムを追加" rename: "名前を変更" + stack-left: "左に重ねる" + pop-right: "右に出す" common/views/components/connect-failed.vue: title: "サーバーに接続できません" diff --git a/src/client/app/common/views/components/menu.vue b/src/client/app/common/views/components/menu.vue index 73c8403ad3..8874e4c49b 100644 --- a/src/client/app/common/views/components/menu.vue +++ b/src/client/app/common/views/components/menu.vue @@ -1,7 +1,7 @@ <template> <div class="mk-menu"> <div class="backdrop" ref="backdrop" @click="close"></div> - <div class="popover" :class="{ compact }" ref="popover"> + <div class="popover" :class="{ hukidasi }" ref="popover"> <template v-for="item in items"> <div v-if="item == null"></div> <button v-else @click="clicked(item.onClick)" v-html="item.content"></button> @@ -16,6 +16,11 @@ import * as anime from 'animejs'; export default Vue.extend({ props: ['source', 'compact', 'items'], + data() { + return { + hukidasi: !this.compact + }; + }, mounted() { this.$nextTick(() => { const popover = this.$refs.popover as any; @@ -24,18 +29,34 @@ export default Vue.extend({ const width = popover.offsetWidth; const height = popover.offsetHeight; + let left; + let top; + if (this.compact) { const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2); const y = rect.top + window.pageYOffset + (this.source.offsetHeight / 2); - popover.style.left = (x - (width / 2)) + 'px'; - popover.style.top = (y - (height / 2)) + 'px'; + left = (x - (width / 2)); + top = (y - (height / 2)); } else { const x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2); const y = rect.top + window.pageYOffset + this.source.offsetHeight; - popover.style.left = (x - (width / 2)) + 'px'; - popover.style.top = y + 'px'; + left = (x - (width / 2)); + top = y; } + if (left + width > window.innerWidth) { + left = window.innerWidth - width; + this.hukidasi = false; + } + + if (top + height > window.innerHeight) { + top = window.innerHeight - height; + this.hukidasi = false; + } + + popover.style.left = left + 'px'; + popover.style.top = top + 'px'; + anime({ targets: this.$refs.backdrop, opacity: 1, @@ -113,7 +134,7 @@ $border-color = rgba(27, 31, 35, 0.15) $balloon-size = 16px - &:not(.compact) + &.hukidasi margin-top $balloon-size transform-origin center -($balloon-size) diff --git a/src/client/app/desktop/views/pages/deck/deck.column-core.vue b/src/client/app/desktop/views/pages/deck/deck.column-core.vue new file mode 100644 index 0000000000..836ce3ac9e --- /dev/null +++ b/src/client/app/desktop/views/pages/deck/deck.column-core.vue @@ -0,0 +1,48 @@ +<template> +<x-widgets-column v-if="column.type == 'widgets'"/> +<x-notifications-column v-else-if="column.type == 'notifications'"/> +<x-tl-column v-else-if="column.type == 'home'"/> +<x-tl-column v-else-if="column.type == 'local'"/> +<x-tl-column v-else-if="column.type == 'global'"/> +<x-tl-column v-else-if="column.type == 'list'"/> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import XTlColumn from './deck.tl-column.vue'; +import XNotificationsColumn from './deck.notifications-column.vue'; +import XWidgetsColumn from './deck.widgets-column.vue'; + +export default Vue.extend({ + components: { + XTlColumn, + XNotificationsColumn, + XWidgetsColumn + }, + + props: { + column: { + type: Object, + required: true + }, + isStacked: { + type: Boolean, + required: false, + default: false + }, + isActive: { + type: Boolean, + required: false, + default: true + } + }, + + provide() { + return { + column: this.column, + isStacked: this.isStacked, + isActive: this.isActive + }; + } +}); +</script> diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 4e37c3cbdb..172880df6e 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -1,10 +1,10 @@ <template> -<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow }"> - <header :class="{ indicate }"> +<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, isActive, isStacked }"> + <header :class="{ indicate }" @click="toggleActive"> <slot name="header"></slot> - <button ref="menu" @click="showMenu">%fa:caret-down%</button> + <button ref="menu" @click.stop="showMenu">%fa:caret-down%</button> </header> - <div ref="body"> + <div ref="body" v-show="isActive"> <slot></slot> </div> </div> @@ -16,17 +16,14 @@ import Menu from '../../../../common/views/components/menu.vue'; export default Vue.extend({ props: { - id: { - type: String, - required: false - }, name: { type: String, required: false }, menu: { type: Array, - required: false + required: false, + default: null }, naked: { type: Boolean, @@ -40,9 +37,17 @@ export default Vue.extend({ } }, + inject: { + column: { from: 'column' }, + _isActive: { from: 'isActive' }, + isStacked: { from: 'isStacked' }, + getColumnVm: { from: 'getColumnVm' } + }, + data() { return { - indicate: false + indicate: false, + isActive: this._isActive }; }, @@ -62,6 +67,13 @@ export default Vue.extend({ }, methods: { + toggleActive() { + if (!this.isStacked) return; + const vms = this.$store.state.settings.deck.layout.find(ids => ids.indexOf(this.column.id) != -1).map(id => this.getColumnVm(id)); + if (this.isActive && vms.filter(vm => vm.$el.classList.contains('isActive')).length == 1) return; + this.isActive = !this.isActive; + }, + isScrollTop() { return this.$refs.body.scrollTop == 0; }, @@ -86,23 +98,33 @@ export default Vue.extend({ default: this.name, allowEmpty: false }).then(name => { - this.$store.dispatch('settings/renameDeckColumn', { id: this.id, name }); + this.$store.dispatch('settings/renameDeckColumn', { id: this.column.id, name }); }); } }, null, { content: '%fa:arrow-left% %i18n:common.deck.swap-left%', onClick: () => { - this.$store.dispatch('settings/swapLeftDeckColumn', this.id); + this.$store.dispatch('settings/swapLeftDeckColumn', this.column.id); } }, { content: '%fa:arrow-right% %i18n:common.deck.swap-right%', onClick: () => { - this.$store.dispatch('settings/swapRightDeckColumn', this.id); + this.$store.dispatch('settings/swapRightDeckColumn', this.column.id); + } + }, null, { + content: '%fa:window-restore R% %i18n:common.deck.stack-left%', + onClick: () => { + this.$store.dispatch('settings/stackLeftDeckColumn', this.column.id); + } + }, { + content: '%fa:window-restore R% %i18n:common.deck.pop-right%', + onClick: () => { + this.$store.dispatch('settings/popRightDeckColumn', this.column.id); } }, null, { content: '%fa:trash-alt R% %i18n:common.deck.remove%', onClick: () => { - this.$store.dispatch('settings/removeDeckColumn', this.id); + this.$store.dispatch('settings/removeDeckColumn', this.column.id); } }]; @@ -128,14 +150,20 @@ root(isDark) $header-height = 42px width 330px + min-width 330px height 100% background isDark ? #282C37 : #fff border-radius 6px box-shadow 0 2px 16px rgba(#000, 0.1) overflow hidden - &.narrow + &:not(.isActive) + flex-basis $header-height + min-height $header-height + + &:not(.isStacked).narrow width 285px + min-width 285px &.naked background rgba(#000, isDark ? 0.25 : 0.1) @@ -157,6 +185,9 @@ root(isDark) background isDark ? #313543 : #fff box-shadow 0 1px rgba(#000, 0.15) + &, * + user-select none + &.indicate box-shadow 0 3px 0 0 $theme-color diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue index e01f91c24d..87f16211fc 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue @@ -1,11 +1,9 @@ <template> -<div> - <x-column :id="column.id" :name="name"> - <span slot="header">%fa:bell R%{{ name }}</span> +<x-column :name="name"> + <span slot="header">%fa:bell R%{{ name }}</span> - <x-notifications/> - </x-column> -</div> + <x-notifications/> +</x-column> </template> <script lang="ts"> @@ -19,12 +17,7 @@ export default Vue.extend({ XNotifications }, - props: { - column: { - type: Object, - required: true - } - }, + inject: ['column'], computed: { name(): string { diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue index 1a5075396b..46d56bb055 100644 --- a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue @@ -1,22 +1,20 @@ <template> -<div> - <x-column :id="column.id" :menu="menu" :name="name"> - <span slot="header"> - <template v-if="column.type == 'home'">%fa:home%</template> - <template v-if="column.type == 'local'">%fa:R comments%</template> - <template v-if="column.type == 'global'">%fa:globe%</template> - <template v-if="column.type == 'list'">%fa:list%</template> - <span>{{ name }}</span> - </span> +<x-column :menu="menu" :name="name"> + <span slot="header"> + <template v-if="column.type == 'home'">%fa:home%</template> + <template v-if="column.type == 'local'">%fa:R comments%</template> + <template v-if="column.type == 'global'">%fa:globe%</template> + <template v-if="column.type == 'list'">%fa:list%</template> + <span>{{ name }}</span> + </span> - <div class="editor" v-if="edit"> - <mk-switch v-model="column.isMediaOnly" @change="onChangeSettings" text="%i18n:@is-media-only%"/> - <mk-switch v-model="column.isMediaView" @change="onChangeSettings" text="%i18n:@is-media-view%"/> - </div> - <x-list-tl v-if="column.type == 'list'" :list="column.list" :media-only="column.isMediaOnly"/> - <x-tl v-else :src="column.type" :media-only="column.isMediaOnly"/> - </x-column> -</div> + <div class="editor" v-if="edit"> + <mk-switch v-model="column.isMediaOnly" @change="onChangeSettings" text="%i18n:@is-media-only%"/> + <mk-switch v-model="column.isMediaView" @change="onChangeSettings" text="%i18n:@is-media-view%"/> + </div> + <x-list-tl v-if="column.type == 'list'" :list="column.list" :media-only="column.isMediaOnly"/> + <x-tl v-else :src="column.type" :media-only="column.isMediaOnly"/> +</x-column> </template> <script lang="ts"> @@ -32,12 +30,7 @@ export default Vue.extend({ XListTl }, - props: { - column: { - type: Object, - required: true - } - }, + inject: ['column'], data() { return { diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index 57ec214c3a..fa2d90ed0e 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -1,13 +1,13 @@ <template> <mk-ui :class="$style.root"> <div class="qlvquzbjribqcaozciifydkngcwtyzje" :data-darkmode="$store.state.device.darkmode"> - <template v-for="column in columns"> - <x-widgets-column v-if="column.type == 'widgets'" :key="column.id" :column="column"/> - <x-notifications-column v-if="column.type == 'notifications'" :key="column.id" :column="column"/> - <x-tl-column v-if="column.type == 'home'" :key="column.id" :column="column"/> - <x-tl-column v-if="column.type == 'local'" :key="column.id" :column="column"/> - <x-tl-column v-if="column.type == 'global'" :key="column.id" :column="column"/> - <x-tl-column v-if="column.type == 'list'" :key="column.id" :column="column"/> + <template v-for="ids in layout"> + <div v-if="ids.length > 1" class="folder"> + <template v-for="id, i in ids"> + <x-column-core :ref="id" :key="id" :column="columns.find(c => c.id == id)" :is-stacked="true" :is-active="i == 0"/> + </template> + </div> + <x-column-core v-else :ref="ids[0]" :key="ids[0]" :column="columns.find(c => c.id == ids[0])"/> </template> <button ref="add" @click="add" title="%i18n:common.deck.add-column%">%fa:plus%</button> </div> @@ -16,27 +16,34 @@ <script lang="ts"> import Vue from 'vue'; -import XTlColumn from './deck.tl-column.vue'; -import XNotificationsColumn from './deck.notifications-column.vue'; -import XWidgetsColumn from './deck.widgets-column.vue'; +import XColumnCore from './deck.column-core.vue'; import Menu from '../../../../common/views/components/menu.vue'; import MkUserListsWindow from '../../components/user-lists-window.vue'; import * as uuid from 'uuid'; export default Vue.extend({ components: { - XTlColumn, - XNotificationsColumn, - XWidgetsColumn + XColumnCore }, computed: { - columns() { + columns(): any[] { if (this.$store.state.settings.deck == null) return []; return this.$store.state.settings.deck.columns; + }, + layout(): any[] { + if (this.$store.state.settings.deck == null) return []; + if (this.$store.state.settings.deck.layout == null) return this.$store.state.settings.deck.columns.map(c => [c.id]); + return this.$store.state.settings.deck.layout; } }, + provide() { + return { + getColumnVm: this.getColumnVm + }; + }, + created() { if (this.$store.state.settings.deck == null) { const deck = { @@ -58,11 +65,23 @@ export default Vue.extend({ }] }; + deck.layout = deck.columns.map(c => [c.id]); + this.$store.dispatch('settings/set', { key: 'deck', value: deck }); } + + // 互換性のため + if (this.$store.state.settings.deck != null && this.$store.state.settings.deck.layout == null) { + this.$store.dispatch('settings/set', { + key: 'deck', + value: Object.assign({}, this.$store.state.settings.deck, { + layout: this.$store.state.settings.deck.columns.map(c => [c.id]) + }) + }); + } }, mounted() { @@ -74,6 +93,10 @@ export default Vue.extend({ }, methods: { + getColumnVm(id) { + return this.$refs[id][0]; + }, + add() { this.os.new(Menu, { source: this.$refs.add, @@ -159,6 +182,13 @@ root(isDark) &:last-of-type margin-right 0 + &.folder + display flex + flex-direction column + + > *:not(:last-child) + margin-bottom 8px + > * &:first-child margin-left auto diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue index 6bcebd07cc..1f8fd8a9bf 100644 --- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue @@ -1,57 +1,55 @@ <template> -<div class="wtdtxvecapixsepjtcupubtsmometobz"> - <x-column :id="column.id" :menu="menu" :naked="true" :narrow="true" :name="name"> - <span slot="header">%fa:calculator%{{ name }}</span> +<x-column :menu="menu" :naked="true" :narrow="true" :name="name" class="wtdtxvecapixsepjtcupubtsmometobz"> + <span slot="header">%fa:calculator%{{ name }}</span> - <div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq"> - <template v-if="edit"> - <header> - <select v-model="widgetAdderSelected"> - <option value="profile">%i18n:common.widgets.profile%</option> - <option value="analog-clock">%i18n:common.widgets.analog-clock%</option> - <option value="calendar">%i18n:common.widgets.calendar%</option> - <option value="timemachine">%i18n:common.widgets.timemachine%</option> - <option value="activity">%i18n:common.widgets.activity%</option> - <option value="rss">%i18n:common.widgets.rss%</option> - <option value="trends">%i18n:common.widgets.trends%</option> - <option value="photo-stream">%i18n:common.widgets.photo-stream%</option> - <option value="slideshow">%i18n:common.widgets.slideshow%</option> - <option value="version">%i18n:common.widgets.version%</option> - <option value="broadcast">%i18n:common.widgets.broadcast%</option> - <option value="notifications">%i18n:common.widgets.notifications%</option> - <option value="users">%i18n:common.widgets.users%</option> - <option value="polls">%i18n:common.widgets.polls%</option> - <option value="post-form">%i18n:common.widgets.post-form%</option> - <option value="messaging">%i18n:common.widgets.messaging%</option> - <option value="memo">%i18n:common.widgets.memo%</option> - <option value="server">%i18n:common.widgets.server%</option> - <option value="donation">%i18n:common.widgets.donation%</option> - <option value="nav">%i18n:common.widgets.nav%</option> - <option value="tips">%i18n:common.widgets.tips%</option> - </select> - <button @click="addWidget">%i18n:@add%</button> - </header> - <x-draggable - :list="column.widgets" - :options="{ handle: '.handle', animation: 150 }" - @sort="onWidgetSort" - > - <div v-for="widget in column.widgets" class="customize-container" :key="widget.id"> - <header> - <span class="handle">%fa:bars%</span>{{ widget.name }}<button class="remove" @click="removeWidget(widget)">%fa:times%</button> - </header> - <div @click="widgetFunc(widget.id)"> - <component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="deck"/> - </div> + <div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq"> + <template v-if="edit"> + <header> + <select v-model="widgetAdderSelected"> + <option value="profile">%i18n:common.widgets.profile%</option> + <option value="analog-clock">%i18n:common.widgets.analog-clock%</option> + <option value="calendar">%i18n:common.widgets.calendar%</option> + <option value="timemachine">%i18n:common.widgets.timemachine%</option> + <option value="activity">%i18n:common.widgets.activity%</option> + <option value="rss">%i18n:common.widgets.rss%</option> + <option value="trends">%i18n:common.widgets.trends%</option> + <option value="photo-stream">%i18n:common.widgets.photo-stream%</option> + <option value="slideshow">%i18n:common.widgets.slideshow%</option> + <option value="version">%i18n:common.widgets.version%</option> + <option value="broadcast">%i18n:common.widgets.broadcast%</option> + <option value="notifications">%i18n:common.widgets.notifications%</option> + <option value="users">%i18n:common.widgets.users%</option> + <option value="polls">%i18n:common.widgets.polls%</option> + <option value="post-form">%i18n:common.widgets.post-form%</option> + <option value="messaging">%i18n:common.widgets.messaging%</option> + <option value="memo">%i18n:common.widgets.memo%</option> + <option value="server">%i18n:common.widgets.server%</option> + <option value="donation">%i18n:common.widgets.donation%</option> + <option value="nav">%i18n:common.widgets.nav%</option> + <option value="tips">%i18n:common.widgets.tips%</option> + </select> + <button @click="addWidget">%i18n:@add%</button> + </header> + <x-draggable + :list="column.widgets" + :options="{ handle: '.handle', animation: 150 }" + @sort="onWidgetSort" + > + <div v-for="widget in column.widgets" class="customize-container" :key="widget.id"> + <header> + <span class="handle">%fa:bars%</span>{{ widget.name }}<button class="remove" @click="removeWidget(widget)">%fa:times%</button> + </header> + <div @click="widgetFunc(widget.id)"> + <component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="deck"/> </div> - </x-draggable> - </template> - <template v-else> - <component class="widget" v-for="widget in column.widgets" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" platform="deck"/> - </template> - </div> - </x-column> -</div> + </div> + </x-draggable> + </template> + <template v-else> + <component class="widget" v-for="widget in column.widgets" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" platform="deck"/> + </template> + </div> +</x-column> </template> <script lang="ts"> @@ -66,12 +64,7 @@ export default Vue.extend({ XDraggable }, - props: { - column: { - type: Object, - required: true - } - }, + inject: ['column'], data() { return { diff --git a/src/client/app/store.ts b/src/client/app/store.ts index d51a3abad1..e78d941d8c 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -173,23 +173,22 @@ export default (os: MiOS) => new Vuex.Store({ }, addDeckColumn(state, column) { - if (state.deck.columns == null) state.deck.columns = []; state.deck.columns.push(column); + state.deck.layout.push([column.id]); }, removeDeckColumn(state, id) { - if (state.deck.columns == null) return; state.deck.columns = state.deck.columns.filter(c => c.id != id); + state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id)); }, swapLeftDeckColumn(state, id) { - if (state.deck.columns == null) return; - state.deck.columns.some((c, i) => { - if (c.id == id) { - const left = state.deck.columns[i - 1]; + state.deck.layout.some((ids, i) => { + if (ids.indexOf(id) != -1) { + const left = state.deck.layout[i - 1]; if (left) { - state.deck.columns[i - 1] = state.deck.columns[i]; - state.deck.columns[i] = left; + state.deck.layout[i - 1] = state.deck.layout[i]; + state.deck.layout[i] = left; } return true; } @@ -197,28 +196,40 @@ export default (os: MiOS) => new Vuex.Store({ }, swapRightDeckColumn(state, id) { - if (state.deck.columns == null) return; - state.deck.columns.some((c, i) => { - if (c.id == id) { - const right = state.deck.columns[i + 1]; + state.deck.layout.some((ids, i) => { + if (ids.indexOf(id) != -1) { + const right = state.deck.layout[i + 1]; if (right) { - state.deck.columns[i + 1] = state.deck.columns[i]; - state.deck.columns[i] = right; + state.deck.layout[i + 1] = state.deck.layout[i]; + state.deck.layout[i] = right; } return true; } }); }, + stackLeftDeckColumn(state, id) { + const i = state.deck.layout.findIndex(ids => ids.indexOf(id) != -1); + state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id)); + const left = state.deck.layout[i - 1]; + if (left) state.deck.layout[i - 1].push(id); + state.deck.layout = state.deck.layout.filter(ids => ids.length > 0); + }, + + popRightDeckColumn(state, id) { + const i = state.deck.layout.findIndex(ids => ids.indexOf(id) != -1); + state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id)); + state.deck.layout.splice(i + 1, 0, [id]); + state.deck.layout = state.deck.layout.filter(ids => ids.length > 0); + }, + addDeckWidget(state, x) { - if (state.deck.columns == null) return; const column = state.deck.columns.find(c => c.id == x.id); if (column == null) return; column.widgets.unshift(x.widget); }, removeDeckWidget(state, x) { - if (state.deck.columns == null) return; const column = state.deck.columns.find(c => c.id == x.id); if (column == null) return; column.widgets = column.widgets.filter(w => w.id != x.widget.id); @@ -277,6 +288,16 @@ export default (os: MiOS) => new Vuex.Store({ ctx.dispatch('saveDeck'); }, + stackLeftDeckColumn(ctx, id) { + ctx.commit('stackLeftDeckColumn', id); + ctx.dispatch('saveDeck'); + }, + + popRightDeckColumn(ctx, id) { + ctx.commit('popRightDeckColumn', id); + ctx.dispatch('saveDeck'); + }, + addDeckWidget(ctx, x) { ctx.commit('addDeckWidget', x); ctx.dispatch('saveDeck'); From caabdc68f313fb775167b62c941b81463a7a541f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 04:34:15 +0900 Subject: [PATCH 172/369] =?UTF-8?q?MisskeyDeck:=20=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=81=97=E3=81=9F=E3=82=AB=E3=83=A9=E3=83=A0?= =?UTF-8?q?=E3=82=92=E4=B8=8A=E4=B8=8B=E7=A7=BB=E5=8B=95=E3=81=A7=E3=81=8D?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja.yml | 2 + .../app/common/views/components/menu.vue | 4 +- .../desktop/views/pages/deck/deck.column.vue | 16 ++++++-- src/client/app/store.ts | 38 +++++++++++++++++++ 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/locales/ja.yml b/locales/ja.yml index 3161040ec8..120ccc7998 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -85,6 +85,8 @@ common: list: "リスト" swap-left: "左に移動" swap-right: "右に移動" + swap-up: "上に移動" + swap-down: "下に移動" remove: "カラムを削除" add-column: "カラムを追加" rename: "名前を変更" diff --git a/src/client/app/common/views/components/menu.vue b/src/client/app/common/views/components/menu.vue index 8874e4c49b..f1e23df007 100644 --- a/src/client/app/common/views/components/menu.vue +++ b/src/client/app/common/views/components/menu.vue @@ -3,8 +3,8 @@ <div class="backdrop" ref="backdrop" @click="close"></div> <div class="popover" :class="{ hukidasi }" ref="popover"> <template v-for="item in items"> - <div v-if="item == null"></div> - <button v-else @click="clicked(item.onClick)" v-html="item.content"></button> + <div v-if="item === null"></div> + <button v-if="item" @click="clicked(item.onClick)" v-html="item.content"></button> </template> </div> </div> diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 172880df6e..897181dd37 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -111,17 +111,27 @@ export default Vue.extend({ onClick: () => { this.$store.dispatch('settings/swapRightDeckColumn', this.column.id); } - }, null, { + }, this.isStacked ? { + content: '%fa:arrow-up% %i18n:common.deck.swap-up%', + onClick: () => { + this.$store.dispatch('settings/swapUpDeckColumn', this.column.id); + } + } : undefined, this.isStacked ? { + content: '%fa:arrow-down% %i18n:common.deck.swap-down%', + onClick: () => { + this.$store.dispatch('settings/swapDownDeckColumn', this.column.id); + } + } : undefined, null, { content: '%fa:window-restore R% %i18n:common.deck.stack-left%', onClick: () => { this.$store.dispatch('settings/stackLeftDeckColumn', this.column.id); } - }, { + }, this.isStacked ? { content: '%fa:window-restore R% %i18n:common.deck.pop-right%', onClick: () => { this.$store.dispatch('settings/popRightDeckColumn', this.column.id); } - }, null, { + } : undefined, null, { content: '%fa:trash-alt R% %i18n:common.deck.remove%', onClick: () => { this.$store.dispatch('settings/removeDeckColumn', this.column.id); diff --git a/src/client/app/store.ts b/src/client/app/store.ts index e78d941d8c..e6c3863d7f 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -208,6 +208,34 @@ export default (os: MiOS) => new Vuex.Store({ }); }, + swapUpDeckColumn(state, id) { + const ids = state.deck.layout.find(ids => ids.indexOf(id) != -1); + ids.some((x, i) => { + if (x == id) { + const up = ids[i - 1]; + if (up) { + ids[i - 1] = id; + ids[i] = up; + } + return true; + } + }); + }, + + swapDownDeckColumn(state, id) { + const ids = state.deck.layout.find(ids => ids.indexOf(id) != -1); + ids.some((x, i) => { + if (x == id) { + const down = ids[i + 1]; + if (down) { + ids[i + 1] = id; + ids[i] = down; + } + return true; + } + }); + }, + stackLeftDeckColumn(state, id) { const i = state.deck.layout.findIndex(ids => ids.indexOf(id) != -1); state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id)); @@ -288,6 +316,16 @@ export default (os: MiOS) => new Vuex.Store({ ctx.dispatch('saveDeck'); }, + swapUpDeckColumn(ctx, id) { + ctx.commit('swapUpDeckColumn', id); + ctx.dispatch('saveDeck'); + }, + + swapDownDeckColumn(ctx, id) { + ctx.commit('swapDownDeckColumn', id); + ctx.dispatch('saveDeck'); + }, + stackLeftDeckColumn(ctx, id) { ctx.commit('stackLeftDeckColumn', id); ctx.dispatch('saveDeck'); From 07bbd9506a838cf101047b65ab6d0dce5742f9c6 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 04:46:31 +0900 Subject: [PATCH 173/369] :art: --- src/client/app/desktop/views/pages/deck/deck.column.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 897181dd37..b7e46a29e1 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -127,7 +127,7 @@ export default Vue.extend({ this.$store.dispatch('settings/stackLeftDeckColumn', this.column.id); } }, this.isStacked ? { - content: '%fa:window-restore R% %i18n:common.deck.pop-right%', + content: '%fa:window-maximize R% %i18n:common.deck.pop-right%', onClick: () => { this.$store.dispatch('settings/popRightDeckColumn', this.column.id); } From b0a8d7abe9478bd514cd642027fabe01ed63f301 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 05:04:21 +0900 Subject: [PATCH 174/369] :v: --- .../desktop/views/pages/deck/deck.column.vue | 21 +++++++++++++++---- .../desktop/views/pages/deck/deck.notes.vue | 13 ++++++------ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index b7e46a29e1..8996228a8a 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -1,7 +1,8 @@ <template> <div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, isActive, isStacked }"> - <header :class="{ indicate }" @click="toggleActive"> + <header :class="{ indicate: count > 0 }" @click="toggleActive"> <slot name="header"></slot> + <span class="count" v-if="count > 0">({{ count }})</span> <button ref="menu" @click.stop="showMenu">%fa:caret-down%</button> </header> <div ref="body" v-show="isActive"> @@ -46,16 +47,24 @@ export default Vue.extend({ data() { return { - indicate: false, + count: 0, isActive: this._isActive }; }, + watch: { + isActive(v) { + if (v && this.isScrollTop()) { + this.$emit('top'); + } + } + }, + provide() { return { column: this, isScrollTop: this.isScrollTop, - indicate: v => this.indicate = v + count: v => this.count = v }; }, @@ -75,7 +84,7 @@ export default Vue.extend({ }, isScrollTop() { - return this.$refs.body.scrollTop == 0; + return this.isActive && this.$refs.body.scrollTop == 0; }, onScroll() { @@ -205,6 +214,10 @@ root(isDark) [data-fa] margin-right 8px + > .count + margin-left 4px + opacity 0.5 + > button position absolute top 0 diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue index e37505b551..1ccacea908 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notes.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue @@ -28,8 +28,6 @@ <script lang="ts"> import Vue from 'vue'; -import { url } from '../../../config'; -import getNoteSummary from '../../../../../renderers/get-note-summary'; import XNote from './deck.note.vue'; @@ -40,7 +38,7 @@ export default Vue.extend({ XNote }, - inject: ['column', 'isScrollTop', 'indicate'], + inject: ['column', 'isScrollTop', 'count'], props: { more: { @@ -55,7 +53,6 @@ export default Vue.extend({ requestInitPromise: null as () => Promise<any[]>, notes: [], queue: [], - unreadCount: 0, fetching: true, moreFetching: false }; @@ -73,6 +70,12 @@ export default Vue.extend({ } }, + watch: { + queue(q) { + this.count(q.length); + } + }, + created() { this.column.$on('top', this.onTop); this.column.$on('bottom', this.onBottom); @@ -141,7 +144,6 @@ export default Vue.extend({ } } else { this.queue.push(note); - this.indicate(true); } }, @@ -156,7 +158,6 @@ export default Vue.extend({ releaseQueue() { this.queue.forEach(n => this.prepend(n, true)); this.queue = []; - this.indicate(false); }, async loadMore() { From 602284d38c264a2260196be6567ab86fea090a31 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 05:04:56 +0900 Subject: [PATCH 175/369] 2.30.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d7986e059a..3b49b395ad 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.29.1", - "clientVersion": "1.0.6218", + "version": "2.30.0", + "clientVersion": "1.0.6253", "codename": "nighthike", "main": "./built/index.js", "private": true, From af9c5c6ab7e272427346474a401f426a9c209a31 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 05:07:19 +0900 Subject: [PATCH 176/369] typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a6eade4bc2..e52c9f1df0 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ ultimately sophisticated new type of mini-blog based SNS. ---------------------------------------------------------------- * Reactions * User lists -* Cusromizable column view (known as MisskeyDeck) +* Customizable column view (known as MisskeyDeck) * Private messages * Mute * Streaming From af501f5eeb91027f1ae60f55498673f462585b74 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 05:48:27 +0900 Subject: [PATCH 177/369] Fix bug --- .../views/pages/deck/deck.column-core.vue | 20 ++++-------- .../desktop/views/pages/deck/deck.column.vue | 31 ++++++++++++------- .../pages/deck/deck.notifications-column.vue | 17 ++++++++-- .../views/pages/deck/deck.tl-column.vue | 17 ++++++++-- .../views/pages/deck/deck.widgets-column.vue | 17 ++++++++-- 5 files changed, 71 insertions(+), 31 deletions(-) diff --git a/src/client/app/desktop/views/pages/deck/deck.column-core.vue b/src/client/app/desktop/views/pages/deck/deck.column-core.vue index 836ce3ac9e..8046480ec6 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column-core.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column-core.vue @@ -1,10 +1,10 @@ <template> -<x-widgets-column v-if="column.type == 'widgets'"/> -<x-notifications-column v-else-if="column.type == 'notifications'"/> -<x-tl-column v-else-if="column.type == 'home'"/> -<x-tl-column v-else-if="column.type == 'local'"/> -<x-tl-column v-else-if="column.type == 'global'"/> -<x-tl-column v-else-if="column.type == 'list'"/> +<x-widgets-column v-if="column.type == 'widgets'" :column="column" :is-stacked="isStacked" :is-active="isActive"/> +<x-notifications-column v-else-if="column.type == 'notifications'" :column="column" :is-stacked="isStacked" :is-active="isActive"/> +<x-tl-column v-else-if="column.type == 'home'" :column="column" :is-stacked="isStacked" :is-active="isActive"/> +<x-tl-column v-else-if="column.type == 'local'" :column="column" :is-stacked="isStacked" :is-active="isActive"/> +<x-tl-column v-else-if="column.type == 'global'" :column="column" :is-stacked="isStacked" :is-active="isActive"/> +<x-tl-column v-else-if="column.type == 'list'" :column="column" :is-stacked="isStacked" :is-active="isActive"/> </template> <script lang="ts"> @@ -35,14 +35,6 @@ export default Vue.extend({ required: false, default: true } - }, - - provide() { - return { - column: this.column, - isStacked: this.isStacked, - isActive: this.isActive - }; } }); </script> diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 8996228a8a..976a424a62 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -1,11 +1,11 @@ <template> -<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, isActive, isStacked }"> +<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, active, isStacked }"> <header :class="{ indicate: count > 0 }" @click="toggleActive"> <slot name="header"></slot> <span class="count" v-if="count > 0">({{ count }})</span> <button ref="menu" @click.stop="showMenu">%fa:caret-down%</button> </header> - <div ref="body" v-show="isActive"> + <div ref="body" v-show="active"> <slot></slot> </div> </div> @@ -17,6 +17,18 @@ import Menu from '../../../../common/views/components/menu.vue'; export default Vue.extend({ props: { + column: { + type: Object, + required: true + }, + isStacked: { + type: Boolean, + required: true + }, + isActive: { + type: Boolean, + required: true + }, name: { type: String, required: false @@ -39,21 +51,18 @@ export default Vue.extend({ }, inject: { - column: { from: 'column' }, - _isActive: { from: 'isActive' }, - isStacked: { from: 'isStacked' }, getColumnVm: { from: 'getColumnVm' } }, data() { return { count: 0, - isActive: this._isActive + active: this.isActive }; }, watch: { - isActive(v) { + active(v) { if (v && this.isScrollTop()) { this.$emit('top'); } @@ -79,12 +88,12 @@ export default Vue.extend({ toggleActive() { if (!this.isStacked) return; const vms = this.$store.state.settings.deck.layout.find(ids => ids.indexOf(this.column.id) != -1).map(id => this.getColumnVm(id)); - if (this.isActive && vms.filter(vm => vm.$el.classList.contains('isActive')).length == 1) return; - this.isActive = !this.isActive; + if (this.active && vms.filter(vm => vm.$el.classList.contains('active')).length == 1) return; + this.active = !this.active; }, isScrollTop() { - return this.isActive && this.$refs.body.scrollTop == 0; + return this.active && this.$refs.body.scrollTop == 0; }, onScroll() { @@ -176,7 +185,7 @@ root(isDark) box-shadow 0 2px 16px rgba(#000, 0.1) overflow hidden - &:not(.isActive) + &:not(.active) flex-basis $header-height min-height $header-height diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue index 87f16211fc..1e3500e48e 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue @@ -1,5 +1,5 @@ <template> -<x-column :name="name"> +<x-column :name="name" :column="column" :is-stacked="isStacked" :is-active="isActive"> <span slot="header">%fa:bell R%{{ name }}</span> <x-notifications/> @@ -17,7 +17,20 @@ export default Vue.extend({ XNotifications }, - inject: ['column'], + props: { + column: { + type: Object, + required: true + }, + isStacked: { + type: Boolean, + required: true + }, + isActive: { + type: Boolean, + required: true + } + }, computed: { name(): string { diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue index 46d56bb055..333e776b70 100644 --- a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue @@ -1,5 +1,5 @@ <template> -<x-column :menu="menu" :name="name"> +<x-column :menu="menu" :name="name" :column="column" :is-stacked="isStacked" :is-active="isActive"> <span slot="header"> <template v-if="column.type == 'home'">%fa:home%</template> <template v-if="column.type == 'local'">%fa:R comments%</template> @@ -30,7 +30,20 @@ export default Vue.extend({ XListTl }, - inject: ['column'], + props: { + column: { + type: Object, + required: true + }, + isStacked: { + type: Boolean, + required: true + }, + isActive: { + type: Boolean, + required: true + } + }, data() { return { diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue index 1f8fd8a9bf..68724677b4 100644 --- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue @@ -1,5 +1,5 @@ <template> -<x-column :menu="menu" :naked="true" :narrow="true" :name="name" class="wtdtxvecapixsepjtcupubtsmometobz"> +<x-column :menu="menu" :naked="true" :narrow="true" :name="name" :column="column" :is-stacked="isStacked" :is-active="isActive" class="wtdtxvecapixsepjtcupubtsmometobz"> <span slot="header">%fa:calculator%{{ name }}</span> <div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq"> @@ -64,7 +64,20 @@ export default Vue.extend({ XDraggable }, - inject: ['column'], + props: { + column: { + type: Object, + required: true + }, + isStacked: { + type: Boolean, + required: true + }, + isActive: { + type: Boolean, + required: true + } + }, data() { return { From 0967f23b6e69302697aac406472e2e15276b5dc3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 05:49:19 +0900 Subject: [PATCH 178/369] 2.30.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 3b49b395ad..553ba4bb26 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.30.0", - "clientVersion": "1.0.6253", + "version": "2.30.1", + "clientVersion": "1.0.6259", "codename": "nighthike", "main": "./built/index.js", "private": true, From 1366c785f9a22c7e9a322e4dc40eff8cd49dea2b Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 05:54:42 +0900 Subject: [PATCH 179/369] Update README.md --- README.md | 34 +++++----------------------------- 1 file changed, 5 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index e52c9f1df0..8fe1246e50 100644 --- a/README.md +++ b/README.md @@ -46,18 +46,9 @@ If you want to... [![Backers][backers-image]][support-url] [![Sponsors][sponsors-image]][support-url] -:mortar_board: Notable contributors ----------------------------------------------------------------- -| ![syuilo][syuilo-icon] | ![Morisawa Aya][ayamorisawa-icon] | ![otofune][otofune-icon] | ![akihikodaki][akihikodaki-icon] | ![tamaina][tamaina-icon] | ![rinsuki][rinsuki-icon] | -|:-:|:-:|:-:|:-:|:-:|:-:| -| [syuilo][syuilo-link]<br>Owner | [Aya Morisawa][ayamorisawa-link]<br>Collaborator | [otofune][otofune-link]<br>Collaborator | [akihikodaki][akihikodaki-link] | [tamaina][tamaina-link] | [rinsuki][rinsuki-link] | - -[List of all contributors](https://github.com/syuilo/misskey/graphs/contributors) - -### :earth_americas: Translators -| ![][mirro-san-icon] | ![][Conan-kun-icon] | ![][m4sk1n-icon] | -|:-:|:-:|:-:| -| [Mirro][mirro-san-link]<br>English, French | [Asriel][Conan-kun-link]<br>English, French | [Marcin Mikołajczak][m4sk1n-link]<br>Polish | +| ![][ooo-icon] | +|:-:| +| [ooo][ooo-link] | :four_leaf_clover: Copyright ---------------------------------------------------------------- @@ -85,23 +76,8 @@ Misskey is an open-source software licensed under [GNU AGPLv3](LICENSE). [sponsors-image]: https://opencollective.com/misskey/sponsors.svg [support-url]: https://opencollective.com/misskey#support -<!-- Contributors Info --> [syuilo-link]: https://syuilo.com [syuilo-icon]: https://avatars2.githubusercontent.com/u/4439005?v=3&s=70 -[ayamorisawa-link]: https://github.com/ayamorisawa -[ayamorisawa-icon]: https://avatars0.githubusercontent.com/u/10798641?v=3&s=70 -[otofune-link]: https://github.com/otofune -[otofune-icon]: https://avatars0.githubusercontent.com/u/15062473?v=3&s=70 -[akihikodaki-link]: https://github.com/akihikodaki -[akihikodaki-icon]: https://avatars2.githubusercontent.com/u/17036990?s=70&v=4 -[rinsuki-link]: https://github.com/rinsuki -[rinsuki-icon]: https://avatars0.githubusercontent.com/u/6533808?s=70&v=4 -[tamaina-link]: https://github.com/tamaina -[tamaina-icon]: https://avatars1.githubusercontent.com/u/7973572?s=70&v=4 -[mirro-san-link]: https://github.com/mirro-san -[mirro-san-icon]: https://avatars1.githubusercontent.com/u/17948612?s=70&v=4 -[Conan-kun-link]: https://github.com/Conan-kun -[Conan-kun-icon]: https://avatars3.githubusercontent.com/u/30003708?s=70&v=4 -[m4sk1n-link]: https://github.com/m4sk1n -[m4sk1n-icon]: https://avatars3.githubusercontent.com/u/21127288?s=70&v=4 +[ooo-link]: https://www.patreon.com/user/creators?u=11601413 +[ooo-icon]: https://c10.patreonusercontent.com/3/eyJ2IjoiMSIsInciOjIwMH0%3D/patreon-media/user/11601413/20cb15f209924302b399b99d3c98b850?token-time=2145916800&token-hash=IO31nK6VZCMWBWU2VAk2c824BX2QZ4DNPKyHHZXS0iw%3D From 3d40a7df003fa0922d1362a0e2d601846a9b850d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 07:43:12 +0900 Subject: [PATCH 180/369] :v: --- .../views/pages/deck/deck.column-core.vue | 17 ++++++----------- .../desktop/views/pages/deck/deck.column.vue | 6 +----- .../pages/deck/deck.notifications-column.vue | 6 +----- .../desktop/views/pages/deck/deck.tl-column.vue | 6 +----- .../app/desktop/views/pages/deck/deck.vue | 2 +- .../views/pages/deck/deck.widgets-column.vue | 6 +----- 6 files changed, 11 insertions(+), 32 deletions(-) diff --git a/src/client/app/desktop/views/pages/deck/deck.column-core.vue b/src/client/app/desktop/views/pages/deck/deck.column-core.vue index 8046480ec6..28e7f13650 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column-core.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column-core.vue @@ -1,10 +1,10 @@ <template> -<x-widgets-column v-if="column.type == 'widgets'" :column="column" :is-stacked="isStacked" :is-active="isActive"/> -<x-notifications-column v-else-if="column.type == 'notifications'" :column="column" :is-stacked="isStacked" :is-active="isActive"/> -<x-tl-column v-else-if="column.type == 'home'" :column="column" :is-stacked="isStacked" :is-active="isActive"/> -<x-tl-column v-else-if="column.type == 'local'" :column="column" :is-stacked="isStacked" :is-active="isActive"/> -<x-tl-column v-else-if="column.type == 'global'" :column="column" :is-stacked="isStacked" :is-active="isActive"/> -<x-tl-column v-else-if="column.type == 'list'" :column="column" :is-stacked="isStacked" :is-active="isActive"/> +<x-widgets-column v-if="column.type == 'widgets'" :column="column" :is-stacked="isStacked"/> +<x-notifications-column v-else-if="column.type == 'notifications'" :column="column" :is-stacked="isStacked"/> +<x-tl-column v-else-if="column.type == 'home'" :column="column" :is-stacked="isStacked"/> +<x-tl-column v-else-if="column.type == 'local'" :column="column" :is-stacked="isStacked"/> +<x-tl-column v-else-if="column.type == 'global'" :column="column" :is-stacked="isStacked"/> +<x-tl-column v-else-if="column.type == 'list'" :column="column" :is-stacked="isStacked"/> </template> <script lang="ts"> @@ -29,11 +29,6 @@ export default Vue.extend({ type: Boolean, required: false, default: false - }, - isActive: { - type: Boolean, - required: false, - default: true } } }); diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 976a424a62..bfd7924b03 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -25,10 +25,6 @@ export default Vue.extend({ type: Boolean, required: true }, - isActive: { - type: Boolean, - required: true - }, name: { type: String, required: false @@ -57,7 +53,7 @@ export default Vue.extend({ data() { return { count: 0, - active: this.isActive + active: true }; }, diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue index 1e3500e48e..220e938a46 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notifications-column.vue @@ -1,5 +1,5 @@ <template> -<x-column :name="name" :column="column" :is-stacked="isStacked" :is-active="isActive"> +<x-column :name="name" :column="column" :is-stacked="isStacked"> <span slot="header">%fa:bell R%{{ name }}</span> <x-notifications/> @@ -25,10 +25,6 @@ export default Vue.extend({ isStacked: { type: Boolean, required: true - }, - isActive: { - type: Boolean, - required: true } }, diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue index 333e776b70..30add843eb 100644 --- a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue @@ -1,5 +1,5 @@ <template> -<x-column :menu="menu" :name="name" :column="column" :is-stacked="isStacked" :is-active="isActive"> +<x-column :menu="menu" :name="name" :column="column" :is-stacked="isStacked"> <span slot="header"> <template v-if="column.type == 'home'">%fa:home%</template> <template v-if="column.type == 'local'">%fa:R comments%</template> @@ -38,10 +38,6 @@ export default Vue.extend({ isStacked: { type: Boolean, required: true - }, - isActive: { - type: Boolean, - required: true } }, diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index fa2d90ed0e..460a99036d 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -4,7 +4,7 @@ <template v-for="ids in layout"> <div v-if="ids.length > 1" class="folder"> <template v-for="id, i in ids"> - <x-column-core :ref="id" :key="id" :column="columns.find(c => c.id == id)" :is-stacked="true" :is-active="i == 0"/> + <x-column-core :ref="id" :key="id" :column="columns.find(c => c.id == id)" :is-stacked="true"/> </template> </div> <x-column-core v-else :ref="ids[0]" :key="ids[0]" :column="columns.find(c => c.id == ids[0])"/> diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue index 68724677b4..2b35e5b25e 100644 --- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue @@ -1,5 +1,5 @@ <template> -<x-column :menu="menu" :naked="true" :narrow="true" :name="name" :column="column" :is-stacked="isStacked" :is-active="isActive" class="wtdtxvecapixsepjtcupubtsmometobz"> +<x-column :menu="menu" :naked="true" :narrow="true" :name="name" :column="column" :is-stacked="isStacked" class="wtdtxvecapixsepjtcupubtsmometobz"> <span slot="header">%fa:calculator%{{ name }}</span> <div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq"> @@ -72,10 +72,6 @@ export default Vue.extend({ isStacked: { type: Boolean, required: true - }, - isActive: { - type: Boolean, - required: true } }, From f2ccb684ebd574dfc04bf3d7b0fbccf698e9de4a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 08:05:25 +0900 Subject: [PATCH 181/369] :art: --- src/client/app/desktop/views/pages/deck/deck.column.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index bfd7924b03..3e26d8630f 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -208,6 +208,7 @@ root(isDark) color isDark ? #e3e5e8 : #888 background isDark ? #313543 : #fff box-shadow 0 1px rgba(#000, 0.15) + cursor pointer &, * user-select none @@ -229,6 +230,7 @@ root(isDark) right 0 width $header-height line-height $header-height + font-size 16px color isDark ? #9baec8 : #ccc &:hover From fa171f237d5fcdcdc4296b99dde37486b47efa00 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 08:06:19 +0900 Subject: [PATCH 182/369] 2.30.2 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 553ba4bb26..b693617d94 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.30.1", - "clientVersion": "1.0.6259", + "version": "2.30.2", + "clientVersion": "1.0.6274", "codename": "nighthike", "main": "./built/index.js", "private": true, From b05feb5bf76922d1777ec2f6c97159069d2e3df1 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 08:38:32 +0900 Subject: [PATCH 183/369] =?UTF-8?q?MisskeyDeck:=20=E3=83=89=E3=83=A9?= =?UTF-8?q?=E3=83=83=E3=82=B0=E3=81=A7=E3=82=AB=E3=83=A9=E3=83=A0=E3=82=92?= =?UTF-8?q?=E5=85=A5=E3=82=8C=E6=9B=BF=E3=81=88=E3=82=89=E3=82=8C=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../desktop/views/pages/deck/deck.column.vue | 67 ++++++++++++++++++- src/client/app/store.ts | 16 +++++ 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 3e26d8630f..7c97e45062 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -1,6 +1,15 @@ <template> -<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, active, isStacked }"> - <header :class="{ indicate: count > 0 }" @click="toggleActive"> +<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, active, isStacked, draghover, dragging }"> + <header :class="{ indicate: count > 0 }" + draggable="true" + @click="toggleActive" + @dragstart="onDragstart" + @dragend="onDragend" + @dragover.prevent.stop="onDragover" + @dragenter.prevent="onDragenter" + @dragleave="onDragleave" + @drop.prevent.stop="onDrop" + > <slot name="header"></slot> <span class="count" v-if="count > 0">({{ count }})</span> <button ref="menu" @click.stop="showMenu">%fa:caret-down%</button> @@ -53,7 +62,9 @@ export default Vue.extend({ data() { return { count: 0, - active: true + active: true, + dragging: false, + draghover: false }; }, @@ -162,6 +173,49 @@ export default Vue.extend({ compact: false, items }); + }, + + onDragstart(e) { + e.dataTransfer.effectAllowed = 'move'; + e.dataTransfer.setData('mk-deck-column', this.column.id); + this.dragging = true; + }, + + onDragend(e) { + this.dragging = false; + }, + + onDragover(e) { + // 自分自身がドラッグされている場合 + if (this.dragging) { + // 自分自身にはドロップさせない + e.dataTransfer.dropEffect = 'none'; + return; + } + + const isDeckColumn = e.dataTransfer.types[0] == 'mk-deck-column'; + + e.dataTransfer.dropEffect = isDeckColumn ? 'move' : 'none'; + }, + + onDragenter() { + if (!this.dragging) this.draghover = true; + }, + + onDragleave() { + this.draghover = false; + }, + + onDrop(e) { + this.draghover = false; + + const id = e.dataTransfer.getData('mk-deck-column'); + if (id != null && id != '') { + this.$store.dispatch('settings/swapDeckColumn', { + a: this.column.id, + b: id + }); + } } } }); @@ -181,6 +235,10 @@ root(isDark) box-shadow 0 2px 16px rgba(#000, 0.1) overflow hidden + &.draghover + &.dragging + box-shadow 0 0 0 2px rgba($theme-color, 0.7) + &:not(.active) flex-basis $header-height min-height $header-height @@ -213,6 +271,9 @@ root(isDark) &, * user-select none + *:not(button) + pointer-events none + &.indicate box-shadow 0 3px 0 0 $theme-color diff --git a/src/client/app/store.ts b/src/client/app/store.ts index e6c3863d7f..0dbdf9bd5e 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -182,6 +182,17 @@ export default (os: MiOS) => new Vuex.Store({ state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id)); }, + swapDeckColumn(state, x) { + const a = x.a; + const b = x.b; + const aX = state.deck.layout.findIndex(ids => ids.indexOf(a) != -1); + const aY = state.deck.layout[aX].findIndex(id => id == a); + const bX = state.deck.layout.findIndex(ids => ids.indexOf(b) != -1); + const bY = state.deck.layout[bX].findIndex(id => id == b); + state.deck.layout[aX][aY] = b; + state.deck.layout[bX][bY] = a; + }, + swapLeftDeckColumn(state, id) { state.deck.layout.some((ids, i) => { if (ids.indexOf(id) != -1) { @@ -306,6 +317,11 @@ export default (os: MiOS) => new Vuex.Store({ ctx.dispatch('saveDeck'); }, + swapDeckColumn(ctx, id) { + ctx.commit('swapDeckColumn', id); + ctx.dispatch('saveDeck'); + }, + swapLeftDeckColumn(ctx, id) { ctx.commit('swapLeftDeckColumn', id); ctx.dispatch('saveDeck'); From 3ffd6ff5a2e764d930a465d65838ebe46519ce62 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 08:39:04 +0900 Subject: [PATCH 184/369] 2.31.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b693617d94..342b9d0479 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.30.2", - "clientVersion": "1.0.6274", + "version": "2.31.0", + "clientVersion": "1.0.6276", "codename": "nighthike", "main": "./built/index.js", "private": true, From bb4fe5174f6ea6acf50c7411aac840f64de6e31d Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 09:08:09 +0900 Subject: [PATCH 185/369] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 8fe1246e50..5749cb365b 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ ultimately sophisticated new type of mini-blog based SNS. <a href="https://www.patreon.com/syuilo"><img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" alt="Become a Patron!" width="160" /></a> + + :sparkles: Features ---------------------------------------------------------------- * Reactions From 00e0d6ce2c71e92540180368176dbb909d30986f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 11:17:22 +0900 Subject: [PATCH 186/369] Improve usability --- .../desktop/views/pages/deck/deck.column.vue | 39 +++++++++++++++---- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 7c97e45062..dd207360a2 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -1,14 +1,15 @@ <template> -<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, active, isStacked, draghover, dragging }"> +<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, active, isStacked, draghover, dragging, dropready }" + @dragover.prevent.stop="onDragover" + @dragenter.prevent="onDragenter" + @dragleave="onDragleave" + @drop.prevent.stop="onDrop" +> <header :class="{ indicate: count > 0 }" draggable="true" @click="toggleActive" @dragstart="onDragstart" @dragend="onDragend" - @dragover.prevent.stop="onDragover" - @dragenter.prevent="onDragenter" - @dragleave="onDragleave" - @drop.prevent.stop="onDrop" > <slot name="header"></slot> <span class="count" v-if="count > 0">({{ count }})</span> @@ -64,7 +65,8 @@ export default Vue.extend({ count: 0, active: true, dragging: false, - draghover: false + draghover: false, + dropready: false }; }, @@ -73,6 +75,9 @@ export default Vue.extend({ if (v && this.isScrollTop()) { this.$emit('top'); } + }, + dragging(v) { + this.$root.$emit(v ? 'deck.column.dragStart' : 'deck.column.dragEnd'); } }, @@ -86,12 +91,25 @@ export default Vue.extend({ mounted() { this.$refs.body.addEventListener('scroll', this.onScroll, { passive: true }); + this.$root.$on('deck.column.dragStart', this.onOtherDragStart); + this.$root.$on('deck.column.dragEnd', this.onOtherDragEnd); }, + beforeDestroy() { this.$refs.body.removeEventListener('scroll', this.onScroll); + this.$root.$off('deck.column.dragStart', this.onOtherDragStart); + this.$root.$off('deck.column.dragEnd', this.onOtherDragEnd); }, methods: { + onOtherDragStart() { + this.dropready = true; + }, + + onOtherDragEnd() { + this.dropready = false; + }, + toggleActive() { if (!this.isStacked) return; const vms = this.$store.state.settings.deck.layout.find(ids => ids.indexOf(this.column.id) != -1).map(id => this.getColumnVm(id)); @@ -208,6 +226,7 @@ export default Vue.extend({ onDrop(e) { this.draghover = false; + this.$root.$emit('deck.column.dragEnd'); const id = e.dataTransfer.getData('mk-deck-column'); if (id != null && id != '') { @@ -236,8 +255,14 @@ root(isDark) overflow hidden &.draghover + box-shadow 0 0 0 2px rgba($theme-color, 0.8) + &.dragging - box-shadow 0 0 0 2px rgba($theme-color, 0.7) + box-shadow 0 0 0 2px rgba($theme-color, 0.4) + + &.dropready + * + pointer-events none &:not(.active) flex-basis $header-height From ebeb7f85782fb35be210cf48497d5d7ee991e368 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 11:46:45 +0900 Subject: [PATCH 187/369] :v: --- .../app/common/views/components/menu.vue | 2 +- .../app/common/views/components/note-menu.vue | 16 +++--- .../views/components/context-menu.menu.vue | 22 ++++---- .../desktop/views/components/context-menu.vue | 22 ++++++-- .../desktop/views/components/drive.file.vue | 20 +++---- .../desktop/views/components/drive.folder.vue | 16 +++--- .../app/desktop/views/components/drive.vue | 6 +-- .../desktop/views/pages/deck/deck.column.vue | 54 ++++++++++++------- .../views/pages/deck/deck.tl-column.vue | 5 +- .../app/desktop/views/pages/deck/deck.vue | 30 ++++++----- .../views/pages/deck/deck.widgets-column.vue | 5 +- 11 files changed, 117 insertions(+), 81 deletions(-) diff --git a/src/client/app/common/views/components/menu.vue b/src/client/app/common/views/components/menu.vue index f1e23df007..cf3a09e672 100644 --- a/src/client/app/common/views/components/menu.vue +++ b/src/client/app/common/views/components/menu.vue @@ -4,7 +4,7 @@ <div class="popover" :class="{ hukidasi }" ref="popover"> <template v-for="item in items"> <div v-if="item === null"></div> - <button v-if="item" @click="clicked(item.onClick)" v-html="item.content"></button> + <button v-if="item" @click="clicked(item.action)" v-html="item.icon ? item.icon + ' ' + item.text : item.text"></button> </template> </div> </div> diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue index 951a9ed1d9..4a8aae9e49 100644 --- a/src/client/app/common/views/components/note-menu.vue +++ b/src/client/app/common/views/components/note-menu.vue @@ -13,23 +13,23 @@ export default Vue.extend({ items() { const items = []; items.push({ - content: '%i18n:@favorite%', - onClick: this.favorite + text: '%i18n:@favorite%', + action: this.favorite }); if (this.note.userId == this.$store.state.i.id) { items.push({ - content: '%i18n:@pin%', - onClick: this.pin + text: '%i18n:@pin%', + action: this.pin }); items.push({ - content: '%i18n:@delete%', - onClick: this.del + text: '%i18n:@delete%', + action: this.del }); } if (this.note.uri) { items.push({ - content: '%i18n:@remote%', - onClick: () => { + text: '%i18n:@remote%', + action: () => { window.open(this.note.uri, '_blank'); } }); diff --git a/src/client/app/desktop/views/components/context-menu.menu.vue b/src/client/app/desktop/views/components/context-menu.menu.vue index 843604a059..e7deec675e 100644 --- a/src/client/app/desktop/views/components/context-menu.menu.vue +++ b/src/client/app/desktop/views/components/context-menu.menu.vue @@ -1,15 +1,17 @@ <template> <ul class="menu"> - <li v-for="(item, i) in menu" :class="item.type"> - <template v-if="item.type == 'item'"> - <p @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</p> - </template> - <template v-if="item.type == 'link'"> - <a :href="item.href" :target="item.target" @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</a> - </template> - <template v-else-if="item.type == 'nest'"> - <p><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}...<span class="caret">%fa:caret-right%</span></p> - <me-nu :menu="item.menu" @x="click"/> + <li v-for="(item, i) in menu" :class="item ? item.type : item === null ? 'divider' : null"> + <template v-if="item"> + <template v-if="item.type == null || item.type == 'item'"> + <p @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</p> + </template> + <template v-else-if="item.type == 'link'"> + <a :href="item.href" :target="item.target" @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</a> + </template> + <template v-else-if="item.type == 'nest'"> + <p><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}...<span class="caret">%fa:caret-right%</span></p> + <me-nu :menu="item.menu" @x="click"/> + </template> </template> </li> </ul> diff --git a/src/client/app/desktop/views/components/context-menu.vue b/src/client/app/desktop/views/components/context-menu.vue index 60a33f9c93..a9a083ec0a 100644 --- a/src/client/app/desktop/views/components/context-menu.vue +++ b/src/client/app/desktop/views/components/context-menu.vue @@ -1,5 +1,5 @@ <template> -<div class="context-menu" :style="{ left: `${x}px`, top: `${y}px` }" @contextmenu.prevent="() => {}"> +<div class="context-menu" @contextmenu.prevent="() => {}"> <x-menu :menu="menu" @x="click"/> </div> </template> @@ -17,6 +17,23 @@ export default Vue.extend({ props: ['x', 'y', 'menu'], mounted() { this.$nextTick(() => { + const width = this.$el.offsetWidth; + const height = this.$el.offsetHeight; + + let x = this.x; + let y = this.y; + + if (x + width > window.innerWidth) { + x = window.innerWidth - width; + } + + if (y + height > window.innerHeight) { + y = window.innerHeight - height; + } + + this.$el.style.left = x + 'px'; + this.$el.style.top = y + 'px'; + Array.from(document.querySelectorAll('body *')).forEach(el => { el.addEventListener('mousedown', this.onMousedown); }); @@ -38,7 +55,7 @@ export default Vue.extend({ return false; }, click(item) { - if (item.onClick) item.onClick(); + if (item.action) item.action(); this.close(); }, close() { @@ -59,7 +76,6 @@ root(isDark) $item-height = 38px $padding = 10px - display none position fixed top 0 left 0 diff --git a/src/client/app/desktop/views/components/drive.file.vue b/src/client/app/desktop/views/components/drive.file.vue index 62a189d849..a4531e221f 100644 --- a/src/client/app/desktop/views/components/drive.file.vue +++ b/src/client/app/desktop/views/components/drive.file.vue @@ -66,37 +66,33 @@ export default Vue.extend({ type: 'item', text: '%i18n:@contextmenu.rename%', icon: '%fa:i-cursor%', - onClick: this.rename + action: this.rename }, { type: 'item', text: '%i18n:@contextmenu.copy-url%', icon: '%fa:link%', - onClick: this.copyUrl + action: this.copyUrl }, { type: 'link', href: `${this.file.url}?download`, text: '%i18n:@contextmenu.download%', icon: '%fa:download%', - }, { - type: 'divider', - }, { + }, null, { type: 'item', text: '%i18n:common.delete%', icon: '%fa:R trash-alt%', - onClick: this.deleteFile - }, { - type: 'divider', - }, { + action: this.deleteFile + }, null, { type: 'nest', text: '%i18n:@contextmenu.else-files%', menu: [{ type: 'item', text: '%i18n:@contextmenu.set-as-avatar%', - onClick: this.setAsAvatar + action: this.setAsAvatar }, { type: 'item', text: '%i18n:@contextmenu.set-as-banner%', - onClick: this.setAsBanner + action: this.setAsBanner }] }, { type: 'nest', @@ -104,7 +100,7 @@ export default Vue.extend({ menu: [{ type: 'item', text: '%i18n:@contextmenu.add-app%...', - onClick: this.addApp + action: this.addApp }] }], { closed: () => { diff --git a/src/client/app/desktop/views/components/drive.folder.vue b/src/client/app/desktop/views/components/drive.folder.vue index 06f2b3f80c..fc0f353f47 100644 --- a/src/client/app/desktop/views/components/drive.folder.vue +++ b/src/client/app/desktop/views/components/drive.folder.vue @@ -56,26 +56,22 @@ export default Vue.extend({ type: 'item', text: '%i18n:@contextmenu.move-to-this-folder%', icon: '%fa:arrow-right%', - onClick: this.go + action: this.go }, { type: 'item', text: '%i18n:@contextmenu.show-in-new-window%', icon: '%fa:R window-restore%', - onClick: this.newWindow - }, { - type: 'divider', - }, { + action: this.newWindow + }, null, { type: 'item', text: '%i18n:@contextmenu.rename%', icon: '%fa:i-cursor%', - onClick: this.rename - }, { - type: 'divider', - }, { + action: this.rename + }, null, { type: 'item', text: '%i18n:common.delete%', icon: '%fa:R trash-alt%', - onClick: this.deleteFolder + action: this.deleteFolder }], { closed: () => { this.isContextmenuShowing = false; diff --git a/src/client/app/desktop/views/components/drive.vue b/src/client/app/desktop/views/components/drive.vue index 9a738070f1..b69c884089 100644 --- a/src/client/app/desktop/views/components/drive.vue +++ b/src/client/app/desktop/views/components/drive.vue @@ -140,17 +140,17 @@ export default Vue.extend({ type: 'item', text: '%i18n:@contextmenu.create-folder%', icon: '%fa:R folder%', - onClick: this.createFolder + action: this.createFolder }, { type: 'item', text: '%i18n:@contextmenu.upload%', icon: '%fa:upload%', - onClick: this.selectLocalFile + action: this.selectLocalFile }, { type: 'item', text: '%i18n:@contextmenu.url-upload%', icon: '%fa:cloud-upload-alt%', - onClick: this.urlUpload + action: this.urlUpload }]); }, diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index dd207360a2..d59d430da6 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -10,6 +10,7 @@ @click="toggleActive" @dragstart="onDragstart" @dragend="onDragend" + @contextmenu.prevent.stop="onContextmenu" > <slot name="header"></slot> <span class="count" v-if="count > 0">({{ count }})</span> @@ -24,6 +25,7 @@ <script lang="ts"> import Vue from 'vue'; import Menu from '../../../../common/views/components/menu.vue'; +import contextmenu from '../../../api/contextmenu'; export default Vue.extend({ props: { @@ -132,10 +134,11 @@ export default Vue.extend({ } }, - showMenu() { + getMenu() { const items = [{ - content: '%fa:pencil-alt% %i18n:common.deck.rename%', - onClick: () => { + icon: '%fa:pencil-alt%', + text: '%i18n:common.deck.rename%', + action: () => { (this as any).apis.input({ title: '%i18n:common.deck.rename%', default: this.name, @@ -145,38 +148,45 @@ export default Vue.extend({ }); } }, null, { - content: '%fa:arrow-left% %i18n:common.deck.swap-left%', - onClick: () => { + icon: '%fa:arrow-left%', + text: '%i18n:common.deck.swap-left%', + action: () => { this.$store.dispatch('settings/swapLeftDeckColumn', this.column.id); } }, { - content: '%fa:arrow-right% %i18n:common.deck.swap-right%', - onClick: () => { + icon: '%fa:arrow-right%', + text: '%i18n:common.deck.swap-right%', + action: () => { this.$store.dispatch('settings/swapRightDeckColumn', this.column.id); } }, this.isStacked ? { - content: '%fa:arrow-up% %i18n:common.deck.swap-up%', - onClick: () => { + icon: '%fa:arrow-up%', + text: '%i18n:common.deck.swap-up%', + action: () => { this.$store.dispatch('settings/swapUpDeckColumn', this.column.id); } } : undefined, this.isStacked ? { - content: '%fa:arrow-down% %i18n:common.deck.swap-down%', - onClick: () => { + icon: '%fa:arrow-down%', + text: '%i18n:common.deck.swap-down%', + action: () => { this.$store.dispatch('settings/swapDownDeckColumn', this.column.id); } } : undefined, null, { - content: '%fa:window-restore R% %i18n:common.deck.stack-left%', - onClick: () => { + icon: '%fa:window-restore R%', + text: '%i18n:common.deck.stack-left%', + action: () => { this.$store.dispatch('settings/stackLeftDeckColumn', this.column.id); } }, this.isStacked ? { - content: '%fa:window-maximize R% %i18n:common.deck.pop-right%', - onClick: () => { + icon: '%fa:window-maximize R%', + text: '%i18n:common.deck.pop-right%', + action: () => { this.$store.dispatch('settings/popRightDeckColumn', this.column.id); } } : undefined, null, { - content: '%fa:trash-alt R% %i18n:common.deck.remove%', - onClick: () => { + icon: '%fa:trash-alt R%', + text: '%i18n:common.deck.remove%', + action: () => { this.$store.dispatch('settings/removeDeckColumn', this.column.id); } }]; @@ -186,10 +196,18 @@ export default Vue.extend({ this.menu.reverse().forEach(i => items.unshift(i)); } + return items; + }, + + onContextmenu(e) { + contextmenu((this as any).os)(e, this.getMenu()); + }, + + showMenu() { this.os.new(Menu, { source: this.$refs.menu, compact: false, - items + items: this.getMenu() }); }, diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue index 30add843eb..a8e0177baa 100644 --- a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue @@ -45,8 +45,9 @@ export default Vue.extend({ return { edit: false, menu: [{ - content: '%fa:cog% %i18n:@edit%', - onClick: () => { + icon: '%fa:cog%', + text: '%i18n:@edit%', + action: () => { this.edit = !this.edit; } }] diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index 460a99036d..da4acb8cca 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -102,32 +102,36 @@ export default Vue.extend({ source: this.$refs.add, compact: true, items: [{ - content: '%i18n:common.deck.home%', - onClick: () => { + icon: '%fa:home%', + text: '%i18n:common.deck.home%', + action: () => { this.$store.dispatch('settings/addDeckColumn', { id: uuid(), type: 'home' }); } }, { - content: '%i18n:common.deck.local%', - onClick: () => { + icon: '%fa:comments R%', + text: '%i18n:common.deck.local%', + action: () => { this.$store.dispatch('settings/addDeckColumn', { id: uuid(), type: 'local' }); } }, { - content: '%i18n:common.deck.global%', - onClick: () => { + icon: '%fa:globe%', + text: '%i18n:common.deck.global%', + action: () => { this.$store.dispatch('settings/addDeckColumn', { id: uuid(), type: 'global' }); } }, { - content: '%i18n:common.deck.list%', - onClick: () => { + icon: '%fa:list%', + text: '%i18n:common.deck.list%', + action: () => { const w = (this as any).os.new(MkUserListsWindow); w.$once('choosen', list => { this.$store.dispatch('settings/addDeckColumn', { @@ -139,16 +143,18 @@ export default Vue.extend({ }); } }, { - content: '%i18n:common.deck.notifications%', - onClick: () => { + icon: '%fa:bell R%', + text: '%i18n:common.deck.notifications%', + action: () => { this.$store.dispatch('settings/addDeckColumn', { id: uuid(), type: 'notifications' }); } }, { - content: '%i18n:common.deck.widgets%', - onClick: () => { + icon: '%fa:calculator%', + text: '%i18n:common.deck.widgets%', + action: () => { this.$store.dispatch('settings/addDeckColumn', { id: uuid(), type: 'widgets', diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue index 2b35e5b25e..098a580405 100644 --- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue @@ -92,8 +92,9 @@ export default Vue.extend({ created() { this.menu = [{ - content: '%fa:cog% %i18n:@edit%', - onClick: () => { + icon: '%fa:cog%', + text: '%i18n:@edit%', + action: () => { this.edit = !this.edit; } }]; From 16e446c121f3186cf583ff21567d67f4cb104b99 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 11:47:33 +0900 Subject: [PATCH 188/369] 2.32.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 342b9d0479..d9dfc3a552 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.31.0", - "clientVersion": "1.0.6276", + "version": "2.32.0", + "clientVersion": "1.0.6285", "codename": "nighthike", "main": "./built/index.js", "private": true, From 34f44de59c9ba74ed88be440d099435403fe5c4f Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 13:14:30 +0900 Subject: [PATCH 189/369] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5749cb365b..580c639726 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ > Lead Maintainer: [syuilo][syuilo-link] **[Misskey](https://misskey.xyz)** is a completely open source, -ultimately sophisticated new type of mini-blog based SNS. +ultimately sophisticated professional microblogging software. <a href="https://www.patreon.com/syuilo"><img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" alt="Become a Patron!" width="160" /></a> From 9a6246fd4e7f4f5a3c6f9453162c858e3bc25031 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 20:34:44 +0900 Subject: [PATCH 190/369] New: Zen mode --- src/client/app/desktop/views/components/ui.vue | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/components/ui.vue b/src/client/app/desktop/views/components/ui.vue index 351deafded..d410c3d980 100644 --- a/src/client/app/desktop/views/components/ui.vue +++ b/src/client/app/desktop/views/components/ui.vue @@ -1,6 +1,6 @@ <template> <div class="mk-ui" :style="style"> - <x-header class="header"/> + <x-header class="header" v-show="!zenMode"/> <div class="content"> <slot></slot> </div> @@ -16,6 +16,11 @@ export default Vue.extend({ components: { XHeader }, + data() { + return { + zenMode: false + }; + }, computed: { style(): any { if (!this.$store.getters.isSignedIn || this.$store.state.i.wallpaperUrl == null) return {}; @@ -39,6 +44,11 @@ export default Vue.extend({ e.preventDefault(); (this as any).apis.post(); } + + if (e.which == 90) { // z + e.preventDefault(); + this.zenMode = !this.zenMode; + } } } }); From 724e812972cdaf55b0c2e8d3ebbb31637c405f57 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 20:57:02 +0900 Subject: [PATCH 191/369] Refactor --- .../app/common/views/components/index.ts | 2 + .../common/views/components/note-header.vue | 112 ++++++++++++++++++ .../desktop/views/components/note-preview.vue | 54 +-------- .../views/components/notes.note.sub.vue | 71 +---------- .../desktop/views/components/notes.note.vue | 79 +----------- .../views/pages/deck/deck.note.sub.vue | 80 +------------ .../desktop/views/pages/deck/deck.note.vue | 76 +----------- .../mobile/views/components/note-preview.vue | 79 +----------- .../app/mobile/views/components/note.sub.vue | 81 +------------ .../app/mobile/views/components/note.vue | 78 +----------- 10 files changed, 128 insertions(+), 584 deletions(-) create mode 100644 src/client/app/common/views/components/note-header.vue diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts index f30e3f953b..803854468e 100644 --- a/src/client/app/common/views/components/index.ts +++ b/src/client/app/common/views/components/index.ts @@ -2,6 +2,7 @@ import Vue from 'vue'; import analogClock from './analog-clock.vue'; import menu from './menu.vue'; +import noteHeader from './note-header.vue'; import signin from './signin.vue'; import signup from './signup.vue'; import forkit from './forkit.vue'; @@ -31,6 +32,7 @@ import welcomeTimeline from './welcome-timeline.vue'; Vue.component('mk-analog-clock', analogClock); Vue.component('mk-menu', menu); +Vue.component('mk-note-header', noteHeader); Vue.component('mk-signin', signin); Vue.component('mk-signup', signup); Vue.component('mk-forkit', forkit); diff --git a/src/client/app/common/views/components/note-header.vue b/src/client/app/common/views/components/note-header.vue new file mode 100644 index 0000000000..611a14f73d --- /dev/null +++ b/src/client/app/common/views/components/note-header.vue @@ -0,0 +1,112 @@ +<template> +<header class="bvonvjxbwzaiskogyhbwgyxvcgserpmu"> + <mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/> + <router-link class="name" :to="note.user | userPage" v-user-preview="note.user.id">{{ note.user | userName }}</router-link> + <span class="is-admin" v-if="note.user.isAdmin">admin</span> + <span class="is-bot" v-if="note.user.isBot">bot</span> + <span class="is-cat" v-if="note.user.isCat">cat</span> + <span class="username"><mk-acct :user="note.user"/></span> + <div class="info"> + <span class="app" v-if="note.app">via <b>{{ note.app.name }}</b></span> + <span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span> + <router-link class="created-at" :to="note | notePage"> + <mk-time :time="note.createdAt"/> + </router-link> + <span class="visibility" v-if="note.visibility != 'public'"> + <template v-if="note.visibility == 'home'">%fa:home%</template> + <template v-if="note.visibility == 'followers'">%fa:unlock%</template> + <template v-if="note.visibility == 'specified'">%fa:envelope%</template> + <template v-if="note.visibility == 'private'">%fa:lock%</template> + </span> + </div> +</header> +</template> + +<script lang="ts"> +import Vue from 'vue'; + +export default Vue.extend({ + props: { + note: { + type: Object, + required: true + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +root(isDark) + display flex + align-items baseline + white-space nowrap + + > .avatar + flex-shrink 0 + margin-right 8px + width 20px + height 20px + border-radius 100% + + > .name + display block + margin 0 .5em 0 0 + padding 0 + overflow hidden + color isDark ? #fff : #627079 + font-size 1em + font-weight bold + text-decoration none + text-overflow ellipsis + + &:hover + text-decoration underline + + > .is-admin + > .is-bot + > .is-cat + align-self center + margin 0 .5em 0 0 + padding 1px 6px + font-size 12px + color isDark ? #758188 : #aaa + border solid 1px isDark ? #57616f : #ddd + border-radius 3px + + &.is-admin + border-color isDark ? #d42c41 : #f56a7b + color isDark ? #d42c41 : #f56a7b + + > .username + margin 0 .5em 0 0 + overflow hidden + text-overflow ellipsis + color isDark ? #606984 : #ccc + + > .info + margin-left auto + font-size 0.9em + + > * + color isDark ? #606984 : #c0c0c0 + + > .mobile + margin-right 8px + + > .app + margin-right 8px + padding-right 8px + border-right solid 1px isDark ? #1c2023 : #eaeaea + + > .visibility + margin-left 8px + +.bvonvjxbwzaiskogyhbwgyxvcgserpmu[data-darkmode] + root(true) + +.bvonvjxbwzaiskogyhbwgyxvcgserpmu:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/desktop/views/components/note-preview.vue b/src/client/app/desktop/views/components/note-preview.vue index 1d9ee2cd0a..fed3b37f40 100644 --- a/src/client/app/desktop/views/components/note-preview.vue +++ b/src/client/app/desktop/views/components/note-preview.vue @@ -2,22 +2,7 @@ <div class="mk-note-preview" :title="title"> <mk-avatar class="avatar" :user="note.user"/> <div class="main"> - <header> - <router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link> - <span class="username"><mk-acct :user="note.user"/></span> - <div class="info"> - <span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span> - <router-link class="created-at" :to="note | notePage"> - <mk-time :time="note.createdAt"/> - </router-link> - <span class="visibility" v-if="note.visibility != 'public'"> - <template v-if="note.visibility == 'home'">%fa:home%</template> - <template v-if="note.visibility == 'followers'">%fa:unlock%</template> - <template v-if="note.visibility == 'specified'">%fa:envelope%</template> - <template v-if="note.visibility == 'private'">%fa:lock%</template> - </span> - </div> - </header> + <mk-note-header class="header" :note="note"/> <div class="body"> <mk-sub-note-content class="text" :note="note"/> </div> @@ -56,43 +41,6 @@ root(isDark) flex 1 min-width 0 - > header - display flex - align-items baseline - white-space nowrap - - > .name - margin 0 .5em 0 0 - padding 0 - overflow hidden - color isDark ? #fff : #607073 - font-size 1em - font-weight bold - text-decoration none - text-overflow ellipsis - - &:hover - text-decoration underline - - > .username - margin 0 .5em 0 0 - overflow hidden - text-overflow ellipsis - color isDark ? #606984 : #d1d8da - - > .info - margin-left auto - font-size 0.9em - - > * - color isDark ? #606984 : #b2b8bb - - > .mobile - margin-right 6px - - > .visibility - margin-left 6px - > .body > .text diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue index 827112ecd8..a8186fb7e4 100644 --- a/src/client/app/desktop/views/components/notes.note.sub.vue +++ b/src/client/app/desktop/views/components/notes.note.sub.vue @@ -2,25 +2,7 @@ <div class="sub" :title="title"> <mk-avatar class="avatar" :user="note.user"/> <div class="main"> - <header> - <router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link> - <span class="is-admin" v-if="note.user.isAdmin">admin</span> - <span class="is-bot" v-if="note.user.isBot">bot</span> - <span class="is-cat" v-if="note.user.isCat">cat</span> - <span class="username"><mk-acct :user="note.user"/></span> - <div class="info"> - <span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span> - <router-link class="created-at" :to="note | notePage"> - <mk-time :time="note.createdAt"/> - </router-link> - <span class="visibility" v-if="note.visibility != 'public'"> - <template v-if="note.visibility == 'home'">%fa:home%</template> - <template v-if="note.visibility == 'followers'">%fa:unlock%</template> - <template v-if="note.visibility == 'specified'">%fa:envelope%</template> - <template v-if="note.visibility == 'private'">%fa:lock%</template> - </span> - </div> - </header> + <mk-note-header class="header" :note="note"/> <div class="body"> <mk-sub-note-content class="text" :note="note"/> </div> @@ -62,57 +44,8 @@ root(isDark) flex 1 min-width 0 - > header - display flex - align-items baseline + > .header margin-bottom 2px - white-space nowrap - - > .name - display block - margin 0 .5em 0 0 - padding 0 - overflow hidden - color isDark ? #fff : #607073 - font-size 1em - font-weight bold - text-decoration none - text-overflow ellipsis - - &:hover - text-decoration underline - - > .is-admin - > .is-bot - > .is-cat - align-self center - margin 0 0.5em 0 0 - padding 1px 5px - font-size 10px - color isDark ? #758188 : #aaa - border solid 1px isDark ? #57616f : #ddd - border-radius 3px - - &.is-admin - border-color isDark ? #d42c41 : #f56a7b - color isDark ? #d42c41 : #f56a7b - - > .username - margin 0 .5em 0 0 - color isDark ? #606984 : #d1d8da - - > .info - margin-left auto - font-size 0.9em - - > * - color isDark ? #606984 : #b2b8bb - - > .mobile - margin-right 6px - - > .visibility - margin-left 6px > .body diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index ca67373c23..2f185e335a 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -14,26 +14,7 @@ <article> <mk-avatar class="avatar" :user="p.user"/> <div class="main"> - <header> - <router-link class="name" :to="p.user | userPage" v-user-preview="p.user.id">{{ p.user | userName }}</router-link> - <span class="is-admin" v-if="p.user.isAdmin">admin</span> - <span class="is-bot" v-if="p.user.isBot">bot</span> - <span class="is-cat" v-if="p.user.isCat">cat</span> - <span class="username"><mk-acct :user="p.user"/></span> - <div class="info"> - <span class="app" v-if="p.app">via <b>{{ p.app.name }}</b></span> - <span class="mobile" v-if="p.viaMobile">%fa:mobile-alt%</span> - <router-link class="created-at" :to="p | notePage"> - <mk-time :time="p.createdAt"/> - </router-link> - <span class="visibility" v-if="p.visibility != 'public'"> - <template v-if="p.visibility == 'home'">%fa:home%</template> - <template v-if="p.visibility == 'followers'">%fa:unlock%</template> - <template v-if="p.visibility == 'specified'">%fa:envelope%</template> - <template v-if="p.visibility == 'private'">%fa:lock%</template> - </span> - </div> - </header> + <mk-note-header class="header" :note="p"/> <div class="body"> <p v-if="p.cw != null" class="cw"> <span class="text" v-if="p.cw != ''">{{ p.cw }}</span> @@ -409,64 +390,8 @@ root(isDark) flex 1 min-width 0 - > header - display flex - align-items baseline + > .header margin-bottom 4px - white-space nowrap - - > .name - display block - margin 0 .5em 0 0 - padding 0 - overflow hidden - color isDark ? #fff : #627079 - font-size 1em - font-weight bold - text-decoration none - text-overflow ellipsis - - &:hover - text-decoration underline - - > .is-admin - > .is-bot - > .is-cat - align-self center - margin 0 .5em 0 0 - padding 1px 6px - font-size 12px - color isDark ? #758188 : #aaa - border solid 1px isDark ? #57616f : #ddd - border-radius 3px - - &.is-admin - border-color isDark ? #d42c41 : #f56a7b - color isDark ? #d42c41 : #f56a7b - - > .username - margin 0 .5em 0 0 - overflow hidden - text-overflow ellipsis - color isDark ? #606984 : #ccc - - > .info - margin-left auto - font-size 0.9em - - > * - color isDark ? #606984 : #c0c0c0 - - > .mobile - margin-right 8px - - > .app - margin-right 8px - padding-right 8px - border-right solid 1px isDark ? #1c2023 : #eaeaea - - > .visibility - margin-left 8px > .body diff --git a/src/client/app/desktop/views/pages/deck/deck.note.sub.vue b/src/client/app/desktop/views/pages/deck/deck.note.sub.vue index b458b74186..6fc70b6af5 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.sub.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.sub.vue @@ -2,25 +2,7 @@ <div class="fnlfosztlhtptnongximhlbykxblytcq"> <mk-avatar class="avatar" :user="note.user"/> <div class="main"> - <header> - <router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link> - <span class="is-admin" v-if="note.user.isAdmin">%i18n:@admin%</span> - <span class="is-bot" v-if="note.user.isBot">%i18n:@bot%</span> - <span class="is-cat" v-if="note.user.isCat">%i18n:@cat%</span> - <span class="username"><mk-acct :user="note.user"/></span> - <div class="info"> - <span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span> - <router-link class="created-at" :to="note | notePage"> - <mk-time :time="note.createdAt"/> - </router-link> - <span class="visibility" v-if="note.visibility != 'public'"> - <template v-if="note.visibility == 'home'">%fa:home%</template> - <template v-if="note.visibility == 'followers'">%fa:unlock%</template> - <template v-if="note.visibility == 'specified'">%fa:envelope%</template> - <template v-if="note.visibility == 'private'">%fa:lock%</template> - </span> - </div> - </header> + <mk-note-header class="header" :note="note"/> <div class="body"> <mk-sub-note-content class="text" :note="note"/> </div> @@ -72,66 +54,8 @@ root(isDark) flex 1 min-width 0 - > header - display flex - align-items baseline + > .header margin-bottom 2px - white-space nowrap - - > .avatar - flex-shrink 0 - margin-right 8px - width 18px - height 18px - border-radius 100% - - > .name - display block - margin 0 0.5em 0 0 - padding 0 - overflow hidden - color isDark ? #fff : #607073 - font-size 1em - font-weight 700 - text-align left - text-decoration none - text-overflow ellipsis - - &:hover - text-decoration underline - - > .is-admin - > .is-bot - > .is-cat - align-self center - margin 0 0.5em 0 0 - padding 1px 5px - font-size 0.8em - color isDark ? #758188 : #aaa - border solid 1px isDark ? #57616f : #ddd - border-radius 3px - - &.is-admin - border-color isDark ? #d42c41 : #f56a7b - color isDark ? #d42c41 : #f56a7b - - > .username - text-align left - margin 0 - color isDark ? #606984 : #d1d8da - - > .info - margin-left auto - font-size 0.9em - - > * - color isDark ? #606984 : #b2b8bb - - > .mobile - margin-right 6px - - > .visibility - margin-left 6px > .body diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index 27d1cb8d47..2dab8289ed 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -14,25 +14,7 @@ <article> <mk-avatar class="avatar" :user="p.user"/> <div class="main"> - <header> - <router-link class="name" :to="p.user | userPage">{{ p.user | userName }}</router-link> - <span class="is-admin" v-if="p.user.isAdmin">admin</span> - <span class="is-bot" v-if="p.user.isBot">bot</span> - <span class="is-cat" v-if="p.user.isCat">cat</span> - <span class="username"><mk-acct :user="p.user"/></span> - <div class="info"> - <span class="mobile" v-if="p.viaMobile">%fa:mobile-alt%</span> - <router-link class="created-at" :to="p | notePage"> - <mk-time :time="p.createdAt"/> - </router-link> - <span class="visibility" v-if="p.visibility != 'public'"> - <template v-if="p.visibility == 'home'">%fa:home%</template> - <template v-if="p.visibility == 'followers'">%fa:unlock%</template> - <template v-if="p.visibility == 'specified'">%fa:envelope%</template> - <template v-if="p.visibility == 'private'">%fa:lock%</template> - </span> - </div> - </header> + <mk-note-header class="header" :note="p"/> <div class="body"> <p v-if="p.cw != null" class="cw"> <span class="text" v-if="p.cw != ''">{{ p.cw }}</span> @@ -292,62 +274,6 @@ root(isDark) flex 1 min-width 0 - > header - display flex - align-items baseline - white-space nowrap - - > .avatar - flex-shrink 0 - margin-right 8px - width 20px - height 20px - border-radius 100% - - > .name - display block - margin 0 0.5em 0 0 - padding 0 - overflow hidden - color isDark ? #fff : #627079 - font-weight bold - text-decoration none - text-overflow ellipsis - - > .is-admin - > .is-bot - > .is-cat - align-self center - margin 0 0.5em 0 0 - padding 1px 6px - font-size 0.8em - color isDark ? #758188 : #aaa - border solid 1px isDark ? #57616f : #ddd - border-radius 3px - - &.is-admin - border-color isDark ? #d42c41 : #f56a7b - color isDark ? #d42c41 : #f56a7b - - > .username - margin 0 0.5em 0 0 - overflow hidden - text-overflow ellipsis - color isDark ? #606984 : #ccc - - > .info - margin-left auto - font-size 0.9em - - > * - color isDark ? #606984 : #c0c0c0 - - > .mobile - margin-right 6px - - > .visibility - margin-left 6px - > .body > .cw diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue index 77ca99e978..388ac5c090 100644 --- a/src/client/app/mobile/views/components/note-preview.vue +++ b/src/client/app/mobile/views/components/note-preview.vue @@ -2,26 +2,7 @@ <div class="mk-note-preview" :class="{ smart: $store.state.device.postStyle == 'smart' }"> <mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle != 'smart'"/> <div class="main"> - <header> - <mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/> - <router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link> - <span class="is-admin" v-if="note.user.isAdmin">%i18n:@admin%</span> - <span class="is-bot" v-if="note.user.isBot">%i18n:@bot%</span> - <span class="is-cat" v-if="note.user.isCat">%i18n:@cat%</span> - <span class="username"><mk-acct :user="note.user"/></span> - <div class="info"> - <span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span> - <router-link class="created-at" :to="note | notePage"> - <mk-time :time="note.createdAt"/> - </router-link> - <span class="visibility" v-if="note.visibility != 'public'"> - <template v-if="note.visibility == 'home'">%fa:home%</template> - <template v-if="note.visibility == 'followers'">%fa:unlock%</template> - <template v-if="note.visibility == 'specified'">%fa:envelope%</template> - <template v-if="note.visibility == 'private'">%fa:lock%</template> - </span> - </div> - </header> + <mk-note-header class="header" :note="note"/> <div class="body"> <mk-sub-note-content class="text" :note="note"/> </div> @@ -79,64 +60,8 @@ root(isDark) flex 1 min-width 0 - > header - display flex - align-items baseline + > .header margin-bottom 2px - white-space nowrap - - > .avatar - flex-shrink 0 - margin-right 8px - width 18px - height 18px - border-radius 100% - - > .name - display block - margin 0 .5em 0 0 - padding 0 - overflow hidden - color isDark ? #fff : #607073 - font-size 1em - font-weight 700 - text-align left - text-decoration none - text-overflow ellipsis - - > .is-admin - > .is-bot - > .is-cat - align-self center - margin 0 0.5em 0 0 - padding 1px 6px - font-size 0.8em - color isDark ? #758188 : #aaa - border solid 1px isDark ? #57616f : #ddd - border-radius 3px - - &.is-admin - border-color isDark ? #d42c41 : #f56a7b - color isDark ? #d42c41 : #f56a7b - - > .username - margin 0 .5em 0 0 - overflow hidden - text-overflow ellipsis - color isDark ? #606984 : #d1d8da - - > .info - margin-left auto - font-size 0.9em - - > * - color isDark ? #606984 : #b2b8bb - - > .mobile - margin-right 6px - - > .visibility - margin-left 6px > .body diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue index f487b7647e..f757b2e522 100644 --- a/src/client/app/mobile/views/components/note.sub.vue +++ b/src/client/app/mobile/views/components/note.sub.vue @@ -2,26 +2,7 @@ <div class="sub" :class="{ smart: $store.state.device.postStyle == 'smart' }"> <mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle != 'smart'"/> <div class="main"> - <header> - <mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/> - <router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link> - <span class="is-admin" v-if="note.user.isAdmin">%i18n:@admin%</span> - <span class="is-bot" v-if="note.user.isBot">%i18n:@bot%</span> - <span class="is-cat" v-if="note.user.isCat">%i18n:@cat%</span> - <span class="username"><mk-acct :user="note.user"/></span> - <div class="info"> - <span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span> - <router-link class="created-at" :to="note | notePage"> - <mk-time :time="note.createdAt"/> - </router-link> - <span class="visibility" v-if="note.visibility != 'public'"> - <template v-if="note.visibility == 'home'">%fa:home%</template> - <template v-if="note.visibility == 'followers'">%fa:unlock%</template> - <template v-if="note.visibility == 'specified'">%fa:envelope%</template> - <template v-if="note.visibility == 'private'">%fa:lock%</template> - </span> - </div> - </header> + <mk-note-header class="header" :note="note"/> <div class="body"> <mk-sub-note-content class="text" :note="note"/> </div> @@ -92,66 +73,8 @@ root(isDark) flex 1 min-width 0 - > header - display flex - align-items baseline + > .header margin-bottom 2px - white-space nowrap - - > .avatar - flex-shrink 0 - margin-right 8px - width 18px - height 18px - border-radius 100% - - > .name - display block - margin 0 0.5em 0 0 - padding 0 - overflow hidden - color isDark ? #fff : #607073 - font-size 1em - font-weight 700 - text-align left - text-decoration none - text-overflow ellipsis - - &:hover - text-decoration underline - - > .is-admin - > .is-bot - > .is-cat - align-self center - margin 0 0.5em 0 0 - padding 1px 5px - font-size 0.8em - color isDark ? #758188 : #aaa - border solid 1px isDark ? #57616f : #ddd - border-radius 3px - - &.is-admin - border-color isDark ? #d42c41 : #f56a7b - color isDark ? #d42c41 : #f56a7b - - > .username - text-align left - margin 0 - color isDark ? #606984 : #d1d8da - - > .info - margin-left auto - font-size 0.9em - - > * - color isDark ? #606984 : #b2b8bb - - > .mobile - margin-right 6px - - > .visibility - margin-left 6px > .body diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 37d86fe235..127f62868e 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -14,26 +14,7 @@ <article> <mk-avatar class="avatar" :user="p.user" v-if="$store.state.device.postStyle != 'smart'"/> <div class="main"> - <header> - <mk-avatar class="avatar" :user="p.user" v-if="$store.state.device.postStyle == 'smart'"/> - <router-link class="name" :to="p.user | userPage">{{ p.user | userName }}</router-link> - <span class="is-admin" v-if="p.user.isAdmin">admin</span> - <span class="is-bot" v-if="p.user.isBot">bot</span> - <span class="is-cat" v-if="p.user.isCat">cat</span> - <span class="username"><mk-acct :user="p.user"/></span> - <div class="info"> - <span class="mobile" v-if="p.viaMobile">%fa:mobile-alt%</span> - <router-link class="created-at" :to="p | notePage"> - <mk-time :time="p.createdAt"/> - </router-link> - <span class="visibility" v-if="p.visibility != 'public'"> - <template v-if="p.visibility == 'home'">%fa:home%</template> - <template v-if="p.visibility == 'followers'">%fa:unlock%</template> - <template v-if="p.visibility == 'specified'">%fa:envelope%</template> - <template v-if="p.visibility == 'private'">%fa:lock%</template> - </span> - </div> - </header> + <mk-note-header class="header" :note="p"/> <div class="body"> <p v-if="p.cw != null" class="cw"> <span class="text" v-if="p.cw != ''">{{ p.cw }}</span> @@ -358,65 +339,10 @@ root(isDark) flex 1 min-width 0 - > header - display flex - align-items baseline - white-space nowrap - + > .header @media (min-width 500px) margin-bottom 2px - > .avatar - flex-shrink 0 - margin-right 8px - width 20px - height 20px - border-radius 100% - - > .name - display block - margin 0 0.5em 0 0 - padding 0 - overflow hidden - color isDark ? #fff : #627079 - font-weight bold - text-decoration none - text-overflow ellipsis - - > .is-admin - > .is-bot - > .is-cat - align-self center - margin 0 0.5em 0 0 - padding 1px 6px - font-size 0.8em - color isDark ? #758188 : #aaa - border solid 1px isDark ? #57616f : #ddd - border-radius 3px - - &.is-admin - border-color isDark ? #d42c41 : #f56a7b - color isDark ? #d42c41 : #f56a7b - - > .username - margin 0 0.5em 0 0 - overflow hidden - text-overflow ellipsis - color isDark ? #606984 : #ccc - - > .info - margin-left auto - font-size 0.9em - - > * - color isDark ? #606984 : #c0c0c0 - - > .mobile - margin-right 6px - - > .visibility - margin-left 6px - > .body @media (min-width 700px) font-size 1.1em From 2f3d744e19950b987305c57662f8f77f2a12f5f6 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 21:17:48 +0900 Subject: [PATCH 192/369] :art: --- src/client/app/common/views/components/note-header.vue | 7 ++++++- src/client/app/desktop/views/components/note-preview.vue | 2 +- src/client/app/desktop/views/pages/deck/deck.note.sub.vue | 2 +- src/client/app/desktop/views/pages/deck/deck.note.vue | 2 +- src/client/app/mobile/views/components/note-preview.vue | 2 +- src/client/app/mobile/views/components/note.sub.vue | 2 +- src/client/app/mobile/views/components/note.vue | 2 +- 7 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/client/app/common/views/components/note-header.vue b/src/client/app/common/views/components/note-header.vue index 611a14f73d..1f92a1d375 100644 --- a/src/client/app/common/views/components/note-header.vue +++ b/src/client/app/common/views/components/note-header.vue @@ -7,7 +7,7 @@ <span class="is-cat" v-if="note.user.isCat">cat</span> <span class="username"><mk-acct :user="note.user"/></span> <div class="info"> - <span class="app" v-if="note.app">via <b>{{ note.app.name }}</b></span> + <span class="app" v-if="note.app && !mini">via <b>{{ note.app.name }}</b></span> <span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span> <router-link class="created-at" :to="note | notePage"> <mk-time :time="note.createdAt"/> @@ -30,6 +30,11 @@ export default Vue.extend({ note: { type: Object, required: true + }, + mini: { + type: Boolean, + required: false, + default: false } } }); diff --git a/src/client/app/desktop/views/components/note-preview.vue b/src/client/app/desktop/views/components/note-preview.vue index fed3b37f40..2599439f09 100644 --- a/src/client/app/desktop/views/components/note-preview.vue +++ b/src/client/app/desktop/views/components/note-preview.vue @@ -2,7 +2,7 @@ <div class="mk-note-preview" :title="title"> <mk-avatar class="avatar" :user="note.user"/> <div class="main"> - <mk-note-header class="header" :note="note"/> + <mk-note-header class="header" :note="note" :mini="true"/> <div class="body"> <mk-sub-note-content class="text" :note="note"/> </div> diff --git a/src/client/app/desktop/views/pages/deck/deck.note.sub.vue b/src/client/app/desktop/views/pages/deck/deck.note.sub.vue index 6fc70b6af5..3ba9ae914e 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.sub.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.sub.vue @@ -2,7 +2,7 @@ <div class="fnlfosztlhtptnongximhlbykxblytcq"> <mk-avatar class="avatar" :user="note.user"/> <div class="main"> - <mk-note-header class="header" :note="note"/> + <mk-note-header class="header" :note="note" :mini="true"/> <div class="body"> <mk-sub-note-content class="text" :note="note"/> </div> diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index 2dab8289ed..8c0c679c72 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -14,7 +14,7 @@ <article> <mk-avatar class="avatar" :user="p.user"/> <div class="main"> - <mk-note-header class="header" :note="p"/> + <mk-note-header class="header" :note="p" :mini="true"/> <div class="body"> <p v-if="p.cw != null" class="cw"> <span class="text" v-if="p.cw != ''">{{ p.cw }}</span> diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue index 388ac5c090..5d56d2d326 100644 --- a/src/client/app/mobile/views/components/note-preview.vue +++ b/src/client/app/mobile/views/components/note-preview.vue @@ -2,7 +2,7 @@ <div class="mk-note-preview" :class="{ smart: $store.state.device.postStyle == 'smart' }"> <mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle != 'smart'"/> <div class="main"> - <mk-note-header class="header" :note="note"/> + <mk-note-header class="header" :note="note" :mini="true"/> <div class="body"> <mk-sub-note-content class="text" :note="note"/> </div> diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue index f757b2e522..a68aec40a1 100644 --- a/src/client/app/mobile/views/components/note.sub.vue +++ b/src/client/app/mobile/views/components/note.sub.vue @@ -2,7 +2,7 @@ <div class="sub" :class="{ smart: $store.state.device.postStyle == 'smart' }"> <mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle != 'smart'"/> <div class="main"> - <mk-note-header class="header" :note="note"/> + <mk-note-header class="header" :note="note" :mini="true"/> <div class="body"> <mk-sub-note-content class="text" :note="note"/> </div> diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 127f62868e..62cee0abfc 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -14,7 +14,7 @@ <article> <mk-avatar class="avatar" :user="p.user" v-if="$store.state.device.postStyle != 'smart'"/> <div class="main"> - <mk-note-header class="header" :note="p"/> + <mk-note-header class="header" :note="p" :mini="true"/> <div class="body"> <p v-if="p.cw != null" class="cw"> <span class="text" v-if="p.cw != ''">{{ p.cw }}</span> From 19300ca65cb4cc827a9a9b0f341c601a2780c5e9 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 21:22:13 +0900 Subject: [PATCH 193/369] Add new cli tool --- cli/update-remote-user.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 cli/update-remote-user.js diff --git a/cli/update-remote-user.js b/cli/update-remote-user.js new file mode 100644 index 0000000000..b50cddddbe --- /dev/null +++ b/cli/update-remote-user.js @@ -0,0 +1,12 @@ +const updatePerson = require('../built/remote/activitypub/models/person').updatePerson; + +const args = process.argv.slice(2); +const user = args[0]; + +console.log(`Updating ${user}...`); + +updatePerson(user).then(() => { + console.log(`Updated ${user}`); +}, e => { + console.error(e); +}); From 6152fd20bf01ec97758a807f747ebf5939903f47 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 21:37:20 +0900 Subject: [PATCH 194/369] Improve deck --- .../desktop/views/pages/deck/deck.notes.vue | 2 +- .../views/pages/deck/deck.notifications.vue | 52 ++++++++++++++++++- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue index 1ccacea908..1f1ca6ad5e 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notes.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue @@ -31,7 +31,7 @@ import Vue from 'vue'; import XNote from './deck.note.vue'; -const displayLimit = 30; +const displayLimit = 20; export default Vue.extend({ components: { diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications.vue b/src/client/app/desktop/views/pages/deck/deck.notifications.vue index 31a3673dd3..afe2cd1cbd 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notifications.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notifications.vue @@ -21,20 +21,27 @@ import Vue from 'vue'; import XNotification from './deck.notification.vue'; +const displayLimit = 20; + export default Vue.extend({ components: { XNotification }, + + inject: ['column', 'isScrollTop', 'count'], + data() { return { fetching: true, fetchingMoreNotifications: false, notifications: [], + queue: [], moreNotifications: false, connection: null, connectionId: null }; }, + computed: { _notifications(): any[] { return (this.notifications as any).map(notification => { @@ -46,12 +53,22 @@ export default Vue.extend({ }); } }, + + watch: { + queue(q) { + this.count(q.length); + } + }, + mounted() { this.connection = (this as any).os.stream.getConnection(); this.connectionId = (this as any).os.stream.use(); this.connection.on('notification', this.onNotification); + this.column.$on('top', this.onTop); + this.column.$on('bottom', this.onBottom); + const max = 10; (this as any).api('i/notifications', { @@ -66,10 +83,15 @@ export default Vue.extend({ this.fetching = false; }); }, + beforeDestroy() { this.connection.off('notification', this.onNotification); (this as any).os.stream.dispose(this.connectionId); + + this.column.$off('top', this.onTop); + this.column.$off('bottom', this.onBottom); }, + methods: { fetchMoreNotifications() { this.fetchingMoreNotifications = true; @@ -90,6 +112,7 @@ export default Vue.extend({ this.fetchingMoreNotifications = false; }); }, + onNotification(notification) { // TODO: ユーザーが画面を見てないと思われるとき(ブラウザやタブがアクティブじゃないなど)は送信しない this.connection.send({ @@ -97,7 +120,34 @@ export default Vue.extend({ id: notification.id }); - this.notifications.unshift(notification); + this.prepend(notification); + }, + + prepend(notification) { + if (this.isScrollTop()) { + // Prepend the notification + this.notifications.unshift(notification); + + // オーバーフローしたら古い通知は捨てる + if (this.notifications.length >= displayLimit) { + this.notifications = this.notifications.slice(0, displayLimit); + } + } else { + this.queue.push(notification); + } + }, + + releaseQueue() { + this.queue.forEach(n => this.prepend(n)); + this.queue = []; + }, + + onTop() { + this.releaseQueue(); + }, + + onBottom() { + this.fetchMoreNotifications(); } } }); From 581d1617d8cc36c0b58cc2bbc1ab1fd4c20cec10 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 21:39:24 +0900 Subject: [PATCH 195/369] 2.33.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d9dfc3a552..b311beb62d 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.32.0", - "clientVersion": "1.0.6285", + "version": "2.33.0", + "clientVersion": "1.0.6292", "codename": "nighthike", "main": "./built/index.js", "private": true, From 5747732156f6619afa8400924b8438d08bc5c82c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 21:50:31 +0900 Subject: [PATCH 196/369] Fix --- src/client/app/common/views/components/note-header.vue | 2 +- src/client/app/desktop/views/pages/deck/deck.note.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/app/common/views/components/note-header.vue b/src/client/app/common/views/components/note-header.vue index 1f92a1d375..6e64a6a6d3 100644 --- a/src/client/app/common/views/components/note-header.vue +++ b/src/client/app/common/views/components/note-header.vue @@ -75,7 +75,7 @@ root(isDark) align-self center margin 0 .5em 0 0 padding 1px 6px - font-size 12px + font-size 80% color isDark ? #758188 : #aaa border solid 1px isDark ? #57616f : #ddd border-radius 3px diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index 8c0c679c72..795bd10fcc 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -216,7 +216,7 @@ root(isDark) > .renote display flex align-items center - padding 8px 16px + padding 8px 16px 0 16px line-height 28px white-space pre color #9dbb00 From cc6fa135ac6dc3b885c1d60f0a35afca02f1d31e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 21:50:41 +0900 Subject: [PATCH 197/369] 2.33.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b311beb62d..36fab4684a 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.33.0", - "clientVersion": "1.0.6292", + "version": "2.33.1", + "clientVersion": "1.0.6294", "codename": "nighthike", "main": "./built/index.js", "private": true, From 02e6b732e9ccf7c40c43d68b7bb514692ceafb4f Mon Sep 17 00:00:00 2001 From: momf <m0fqn090310@gmail.com> Date: Fri, 8 Jun 2018 22:00:18 +0900 Subject: [PATCH 198/369] fix: when text is null, bug can pass validation. fixed. (maybe?) --- src/server/api/endpoints/notes/create.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/api/endpoints/notes/create.ts b/src/server/api/endpoints/notes/create.ts index 182359f637..89e72a184e 100644 --- a/src/server/api/endpoints/notes/create.ts +++ b/src/server/api/endpoints/notes/create.ts @@ -140,7 +140,7 @@ module.exports = (params, user: ILocalUser, app: IApp) => new Promise(async (res } // テキストが無いかつ添付ファイルが無いかつRenoteも無いかつ投票も無かったらエラー - if (text === undefined && files === null && renote === null && poll === undefined) { + if ((text === undefined or text === null) && files === null && renote === null && poll === undefined) { return rej('text, mediaIds, renoteId or poll is required'); } From 22a1dc0566abe0c8589f41a55b0740fb81a37aa0 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 22:03:14 +0900 Subject: [PATCH 199/369] Better log --- src/services/drive/add-file.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts index 35a7a42d80..ace1a6d623 100644 --- a/src/services/drive/add-file.ts +++ b/src/services/drive/add-file.ts @@ -164,8 +164,8 @@ export default async function( 'metadata.deletedAt': { $exists: false } }); - if (much !== null) { - log('file with same hash is found'); + if (much) { + log(`file with same hash is found: ${much._id}`); return much; } } From fe159a13a96fb1b22fb270cfd84d93337dd39ee7 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 8 Jun 2018 22:03:24 +0900 Subject: [PATCH 200/369] 2.33.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 36fab4684a..36c9d8e5f3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.33.1", + "version": "2.33.2", "clientVersion": "1.0.6294", "codename": "nighthike", "main": "./built/index.js", From 33495b5cb327df1d02b728854bf93b3dc3188b9c Mon Sep 17 00:00:00 2001 From: momf <m0fqn090310@gmail.com> Date: Fri, 8 Jun 2018 22:04:07 +0900 Subject: [PATCH 201/369] fix: "or" operator. --- src/server/api/endpoints/notes/create.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/api/endpoints/notes/create.ts b/src/server/api/endpoints/notes/create.ts index 89e72a184e..446764e1d6 100644 --- a/src/server/api/endpoints/notes/create.ts +++ b/src/server/api/endpoints/notes/create.ts @@ -140,7 +140,7 @@ module.exports = (params, user: ILocalUser, app: IApp) => new Promise(async (res } // テキストが無いかつ添付ファイルが無いかつRenoteも無いかつ投票も無かったらエラー - if ((text === undefined or text === null) && files === null && renote === null && poll === undefined) { + if ((text === undefined || text === null) && files === null && renote === null && poll === undefined) { return rej('text, mediaIds, renoteId or poll is required'); } From 6eff8fde74e01fa3527585ec1fbd3629d51bc97a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 01:45:25 +0900 Subject: [PATCH 202/369] =?UTF-8?q?=E3=82=B5=E3=83=BC=E3=83=90=E3=83=BC?= =?UTF-8?q?=E3=81=AE=E7=B5=B1=E8=A8=88=E6=83=85=E5=A0=B1=E3=82=92=E3=83=A1?= =?UTF-8?q?=E3=83=A2=E3=83=AA=E3=81=AB=E8=A8=98=E6=86=B6=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E3=81=99=E3=82=8B=E3=81=AA=E3=81=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- .../views/widgets/server.cpu-memory.vue | 9 +++++++++ src/index.ts | 4 ++-- src/{utils/stats.ts => server-stats.ts} | 13 ++++++++++-- src/server/api/stream/server.ts | 20 +++++++++++++++++-- 5 files changed, 41 insertions(+), 7 deletions(-) rename src/{utils/stats.ts => server-stats.ts} (70%) diff --git a/package.json b/package.json index 36c9d8e5f3..b0ad03aa6e 100644 --- a/package.json +++ b/package.json @@ -218,6 +218,6 @@ "webpack-cli": "2.1.4", "websocket": "1.0.26", "ws": "5.2.0", - "xev": "2.0.0" + "xev": "2.0.1" } } diff --git a/src/client/app/common/views/widgets/server.cpu-memory.vue b/src/client/app/common/views/widgets/server.cpu-memory.vue index fbd36b255a..6bf998c249 100644 --- a/src/client/app/common/views/widgets/server.cpu-memory.vue +++ b/src/client/app/common/views/widgets/server.cpu-memory.vue @@ -76,9 +76,15 @@ export default Vue.extend({ }, mounted() { this.connection.on('stats', this.onStats); + this.connection.on('statsLog', this.onStatsLog); + this.connection.send({ + type: 'requestLog', + id: Math.random().toString() + }); }, beforeDestroy() { this.connection.off('stats', this.onStats); + this.connection.off('statsLog', this.onStatsLog); }, methods: { onStats(stats) { @@ -94,6 +100,9 @@ export default Vue.extend({ this.cpuP = (stats.cpu_usage * 100).toFixed(0); this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0); + }, + onStatsLog(statsLog) { + statsLog.forEach(stats => this.onStats(stats)); } } }); diff --git a/src/index.ts b/src/index.ts index bcd6561691..42a4f484e6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,7 +17,7 @@ import ProgressBar from './utils/cli/progressbar'; import EnvironmentInfo from './utils/environmentInfo'; import MachineInfo from './utils/machineInfo'; import DependencyInfo from './utils/dependencyInfo'; -import stats from './utils/stats'; +import serverStats from './server-stats'; import loadConfig from './config/load'; import { Config } from './config/types'; @@ -49,7 +49,7 @@ function main() { masterMain(opt); ev.mount(); - stats(); + serverStats(); } else { workerMain(opt); } diff --git a/src/utils/stats.ts b/src/server-stats.ts similarity index 70% rename from src/utils/stats.ts rename to src/server-stats.ts index cfb710f5e1..85aa85b682 100644 --- a/src/utils/stats.ts +++ b/src/server-stats.ts @@ -9,10 +9,16 @@ const ev = new Xev(); * Report stats regularly */ export default function() { + const log = []; + + ev.on('requestServerStatsLog', id => { + ev.emit('serverStatsLog:' + id, log); + }); + setInterval(() => { osUtils.cpuUsage(cpuUsage => { const disk = diskusage.checkSync(os.platform() == 'win32' ? 'c:' : '/'); - ev.emit('stats', { + const stats = { cpu_usage: cpuUsage, mem: { total: os.totalmem(), @@ -21,7 +27,10 @@ export default function() { disk, os_uptime: os.uptime(), process_uptime: process.uptime() - }); + }; + ev.emit('serverStats', stats); + log.push(stats); + if (log.length > 50) log.shift(); }); }, 1000); } diff --git a/src/server/api/stream/server.ts b/src/server/api/stream/server.ts index 4ca2ad1b10..342170a21e 100644 --- a/src/server/api/stream/server.ts +++ b/src/server/api/stream/server.ts @@ -11,9 +11,25 @@ export default function(request: websocket.request, connection: websocket.connec })); }; - ev.addListener('stats', onStats); + connection.on('message', async data => { + const msg = JSON.parse(data.utf8Data); + + switch (msg.type) { + case 'requestLog': + ev.once('serverStatsLog:' + msg.id, statsLog => { + connection.send(JSON.stringify({ + type: 'statsLog', + body: statsLog + })); + }); + ev.emit('requestServerStatsLog', msg.id); + break; + } + }); + + ev.addListener('serverStats', onStats); connection.on('close', () => { - ev.removeListener('stats', onStats); + ev.removeListener('serverStats', onStats); }); } From c78945436e39121f46e083eac7a6572ca2efe2d2 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 04:14:26 +0900 Subject: [PATCH 203/369] #1686 --- locales/ja.yml | 5 + package.json | 2 +- .../streaming/{server.ts => notes-stats.ts} | 10 +- .../common/scripts/streaming/server-stats.ts | 30 +++ src/client/app/common/views/widgets/index.ts | 2 + .../common/views/widgets/posts-monitor.vue | 182 ++++++++++++++++++ .../app/common/views/widgets/server.vue | 6 +- .../app/desktop/views/components/home.vue | 1 + .../views/pages/deck/deck.widgets-column.vue | 1 + src/client/app/mios.ts | 12 +- src/client/app/mobile/views/pages/widgets.vue | 1 + src/db/mongodb.ts | 5 +- src/index.ts | 2 + src/models/note.ts | 3 + src/notes-stats-child.ts | 20 ++ src/notes-stats.ts | 20 ++ src/server-stats.ts | 2 +- src/server/api/stream/notes-stats.ts | 35 ++++ .../api/stream/{server.ts => server-stats.ts} | 0 src/server/api/streaming.ts | 12 +- 20 files changed, 333 insertions(+), 18 deletions(-) rename src/client/app/common/scripts/streaming/{server.ts => notes-stats.ts} (57%) create mode 100644 src/client/app/common/scripts/streaming/server-stats.ts create mode 100644 src/client/app/common/views/widgets/posts-monitor.vue create mode 100644 src/notes-stats-child.ts create mode 100644 src/notes-stats.ts create mode 100644 src/server/api/stream/notes-stats.ts rename src/server/api/stream/{server.ts => server-stats.ts} (100%) diff --git a/locales/ja.yml b/locales/ja.yml index 120ccc7998..212ba90b69 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -63,6 +63,7 @@ common: memo: "メモ" trends: "トレンド" photo-stream: "フォトストリーム" + posts-monitor: "投稿チャート" slideshow: "スライドショー" version: "バージョン" broadcast: "ブロードキャスト" @@ -249,6 +250,10 @@ common/views/widgets/photo-stream.vue: title: "フォトストリーム" no-photos: "写真はありません" +common/views/widgets/posts-monitor.vue: + title: "投稿チャート" + toggle: "表示を切り替え" + common/views/widgets/server.vue: title: "サーバー情報" toggle: "表示を切り替え" diff --git a/package.json b/package.json index b0ad03aa6e..a18f37e0a2 100644 --- a/package.json +++ b/package.json @@ -152,7 +152,7 @@ "mkdirp": "0.5.1", "mocha": "5.2.0", "moji": "0.5.1", - "mongodb": "3.0.8", + "mongodb": "3.0.10", "monk": "6.0.6", "ms": "2.1.1", "nan": "2.10.0", diff --git a/src/client/app/common/scripts/streaming/server.ts b/src/client/app/common/scripts/streaming/notes-stats.ts similarity index 57% rename from src/client/app/common/scripts/streaming/server.ts rename to src/client/app/common/scripts/streaming/notes-stats.ts index 2ea4239288..9e3e78a709 100644 --- a/src/client/app/common/scripts/streaming/server.ts +++ b/src/client/app/common/scripts/streaming/notes-stats.ts @@ -3,15 +3,15 @@ import StreamManager from './stream-manager'; import MiOS from '../../../mios'; /** - * Server stream connection + * Notes stats stream connection */ -export class ServerStream extends Stream { +export class NotesStatsStream extends Stream { constructor(os: MiOS) { - super(os, 'server'); + super(os, 'notes-stats'); } } -export class ServerStreamManager extends StreamManager<ServerStream> { +export class NotesStatsStreamManager extends StreamManager<NotesStatsStream> { private os: MiOS; constructor(os: MiOS) { @@ -22,7 +22,7 @@ export class ServerStreamManager extends StreamManager<ServerStream> { public getConnection() { if (this.connection == null) { - this.connection = new ServerStream(this.os); + this.connection = new NotesStatsStream(this.os); } return this.connection; diff --git a/src/client/app/common/scripts/streaming/server-stats.ts b/src/client/app/common/scripts/streaming/server-stats.ts new file mode 100644 index 0000000000..9983dfcaf0 --- /dev/null +++ b/src/client/app/common/scripts/streaming/server-stats.ts @@ -0,0 +1,30 @@ +import Stream from './stream'; +import StreamManager from './stream-manager'; +import MiOS from '../../../mios'; + +/** + * Server stats stream connection + */ +export class ServerStatsStream extends Stream { + constructor(os: MiOS) { + super(os, 'server-stats'); + } +} + +export class ServerStatsStreamManager extends StreamManager<ServerStatsStream> { + private os: MiOS; + + constructor(os: MiOS) { + super(); + + this.os = os; + } + + public getConnection() { + if (this.connection == null) { + this.connection = new ServerStatsStream(this.os); + } + + return this.connection; + } +} diff --git a/src/client/app/common/views/widgets/index.ts b/src/client/app/common/views/widgets/index.ts index a4cabc43ba..0190393ba7 100644 --- a/src/client/app/common/views/widgets/index.ts +++ b/src/client/app/common/views/widgets/index.ts @@ -4,6 +4,7 @@ import wAnalogClock from './analog-clock.vue'; import wVersion from './version.vue'; import wRss from './rss.vue'; import wServer from './server.vue'; +import wPostsMonitor from './posts-monitor.vue'; import wMemo from './memo.vue'; import wBroadcast from './broadcast.vue'; import wCalendar from './calendar.vue'; @@ -22,6 +23,7 @@ Vue.component('mkw-tips', wTips); Vue.component('mkw-donation', wDonation); Vue.component('mkw-broadcast', wBroadcast); Vue.component('mkw-server', wServer); +Vue.component('mkw-posts-monitor', wPostsMonitor); Vue.component('mkw-memo', wMemo); Vue.component('mkw-rss', wRss); Vue.component('mkw-version', wVersion); diff --git a/src/client/app/common/views/widgets/posts-monitor.vue b/src/client/app/common/views/widgets/posts-monitor.vue new file mode 100644 index 0000000000..bdf811bad0 --- /dev/null +++ b/src/client/app/common/views/widgets/posts-monitor.vue @@ -0,0 +1,182 @@ +<template> +<div class="mkw-posts-monitor"> + <mk-widget-container :show-header="props.design == 0" :naked="props.design == 2"> + <template slot="header">%fa:chart-line%%i18n:@title%</template> + <button slot="func" @click="toggle" title="%i18n:@toggle%">%fa:sort%</button> + + <div class="qpdmibaztplkylerhdbllwcokyrfxeyj" :class="{ dual: props.view == 0 }" :data-darkmode="$store.state.device.darkmode"> + <svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" v-show="props.view != 2"> + <defs> + <linearGradient :id="fediGradientId" x1="0" x2="0" y1="1" y2="0"> + <stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop> + <stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop> + </linearGradient> + <mask :id="fediMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY"> + <polyline + :points="fediPolylinePoints" + fill="none" + stroke="#fff" + stroke-width="1"/> + </mask> + </defs> + <rect + x="-1" y="-1" + :width="viewBoxX + 2" :height="viewBoxY + 2" + :style="`stroke: none; fill: url(#${ fediGradientId }); mask: url(#${ fediMaskId })`"/> + <text x="1" y="5">Fedi</text> + </svg> + <svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" v-show="props.view != 1"> + <defs> + <linearGradient :id="localGradientId" x1="0" x2="0" y1="1" y2="0"> + <stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop> + <stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop> + </linearGradient> + <mask :id="localMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY"> + <polyline + :points="localPolylinePoints" + fill="none" + stroke="#fff" + stroke-width="1"/> + </mask> + </defs> + <rect + x="-1" y="-1" + :width="viewBoxX + 2" :height="viewBoxY + 2" + :style="`stroke: none; fill: url(#${ localGradientId }); mask: url(#${ localMaskId })`"/> + <text x="1" y="5">Local</text> + </svg> + </div> + </mk-widget-container> +</div> +</template> + +<script lang="ts"> +import define from '../../../common/define-widget'; +import * as uuid from 'uuid'; + +export default define({ + name: 'server', + props: () => ({ + design: 0, + view: 0 + }) +}).extend({ + data() { + return { + connection: null, + connectionId: null, + viewBoxY: 30, + stats: [], + fediGradientId: uuid(), + fediMaskId: uuid(), + localGradientId: uuid(), + localMaskId: uuid(), + fediPolylinePoints: '', + localPolylinePoints: '', + fediPolygonPoints: '', + localPolygonPoints: '' + }; + }, + computed: { + viewBoxX(): number { + return this.props.view == 0 ? 50 : 100; + } + }, + watch: { + viewBoxX() { + this.draw(); + } + }, + mounted() { + this.connection = (this as any).os.streams.notesStatsStream.getConnection(); + this.connectionId = (this as any).os.streams.notesStatsStream.use(); + + this.connection.on('stats', this.onStats); + this.connection.on('statsLog', this.onStatsLog); + this.connection.send({ + type: 'requestLog', + id: Math.random().toString() + }); + }, + beforeDestroy() { + this.connection.off('stats', this.onStats); + this.connection.off('statsLog', this.onStatsLog); + (this as any).os.streams.notesStatsStream.dispose(this.connectionId); + }, + methods: { + toggle() { + if (this.props.view == 2) { + this.props.view = 0; + } else { + this.props.view++; + } + this.save(); + }, + func() { + if (this.props.design == 2) { + this.props.design = 0; + } else { + this.props.design++; + } + this.save(); + }, + draw() { + const stats = this.props.view == 0 ? this.stats.slice(0, 50) : this.stats; + const fediPeak = Math.max.apply(null, this.stats.map(x => x.all)) || 1; + const localPeak = Math.max.apply(null, this.stats.map(x => x.local)) || 1; + + this.fediPolylinePoints = this.stats.map((s, i) => `${this.viewBoxX - ((this.stats.length - 1) - i)},${(1 - (s.all / fediPeak)) * this.viewBoxY}`).join(' '); + this.localPolylinePoints = this.stats.map((s, i) => `${this.viewBoxX - ((this.stats.length - 1) - i)},${(1 - (s.local / localPeak)) * this.viewBoxY}`).join(' '); + + this.fediPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${ this.viewBoxY } ${ this.fediPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`; + this.localPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${ this.viewBoxY } ${ this.localPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`; + }, + onStats(stats) { + this.stats.push(stats); + if (this.stats.length > 100) this.stats.shift(); + this.draw(); + }, + onStatsLog(statsLog) { + statsLog.forEach(stats => this.onStats(stats)); + } + } +}); +</script> + +<style lang="stylus" scoped> +root(isDark) + &.dual + > svg + width 50% + float left + + &:first-child + padding-right 5px + + &:last-child + padding-left 5px + + > svg + display block + padding 10px + width 100% + + > text + font-size 5px + fill isDark ? rgba(#fff, 0.55) : rgba(#000, 0.55) + + > tspan + opacity 0.5 + + &:after + content "" + display block + clear both + +.qpdmibaztplkylerhdbllwcokyrfxeyj[data-darkmode] + root(true) + +.qpdmibaztplkylerhdbllwcokyrfxeyj:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/common/views/widgets/server.vue b/src/client/app/common/views/widgets/server.vue index 2fdd60499b..d796a3ae05 100644 --- a/src/client/app/common/views/widgets/server.vue +++ b/src/client/app/common/views/widgets/server.vue @@ -55,11 +55,11 @@ export default define({ this.fetching = false; }); - this.connection = (this as any).os.streams.serverStream.getConnection(); - this.connectionId = (this as any).os.streams.serverStream.use(); + this.connection = (this as any).os.streams.serverStatsStream.getConnection(); + this.connectionId = (this as any).os.streams.serverStatsStream.use(); }, beforeDestroy() { - (this as any).os.streams.serverStream.dispose(this.connectionId); + (this as any).os.streams.serverStatsStream.dispose(this.connectionId); }, methods: { toggle() { diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index 826753c169..cac1fd935b 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -23,6 +23,7 @@ <option value="post-form">%i18n:common.widgets.post-form%</option> <option value="messaging">%i18n:common.widgets.messaging%</option> <option value="memo">%i18n:common.widgets.memo%</option> + <option value="posts-monitor">%i18n:common.widgets.posts-monitor%</option> <option value="server">%i18n:common.widgets.server%</option> <option value="donation">%i18n:common.widgets.donation%</option> <option value="nav">%i18n:common.widgets.nav%</option> diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue index 098a580405..2a3a2472dc 100644 --- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue @@ -23,6 +23,7 @@ <option value="post-form">%i18n:common.widgets.post-form%</option> <option value="messaging">%i18n:common.widgets.messaging%</option> <option value="memo">%i18n:common.widgets.memo%</option> + <option value="posts-monitor">%i18n:common.widgets.posts-monitor%</option> <option value="server">%i18n:common.widgets.server%</option> <option value="donation">%i18n:common.widgets.donation%</option> <option value="nav">%i18n:common.widgets.nav%</option> diff --git a/src/client/app/mios.ts b/src/client/app/mios.ts index c644e22087..ba3f967a23 100644 --- a/src/client/app/mios.ts +++ b/src/client/app/mios.ts @@ -8,7 +8,8 @@ import Progress from './common/scripts/loading'; import Connection from './common/scripts/streaming/stream'; import { HomeStreamManager } from './common/scripts/streaming/home'; import { DriveStreamManager } from './common/scripts/streaming/drive'; -import { ServerStreamManager } from './common/scripts/streaming/server'; +import { ServerStatsStreamManager } from './common/scripts/streaming/server-stats'; +import { NotesStatsStreamManager } from './common/scripts/streaming/notes-stats'; import { MessagingIndexStreamManager } from './common/scripts/streaming/messaging-index'; import { OthelloStreamManager } from './common/scripts/streaming/othello'; @@ -104,14 +105,16 @@ export default class MiOS extends EventEmitter { localTimelineStream: LocalTimelineStreamManager; globalTimelineStream: GlobalTimelineStreamManager; driveStream: DriveStreamManager; - serverStream: ServerStreamManager; + serverStatsStream: ServerStatsStreamManager; + notesStatsStream: NotesStatsStreamManager; messagingIndexStream: MessagingIndexStreamManager; othelloStream: OthelloStreamManager; } = { localTimelineStream: null, globalTimelineStream: null, driveStream: null, - serverStream: null, + serverStatsStream: null, + notesStatsStream: null, messagingIndexStream: null, othelloStream: null }; @@ -218,7 +221,8 @@ export default class MiOS extends EventEmitter { this.store = initStore(this); //#region Init stream managers - this.streams.serverStream = new ServerStreamManager(this); + this.streams.serverStatsStream = new ServerStatsStreamManager(this); + this.streams.notesStatsStream = new NotesStatsStreamManager(this); this.once('signedin', () => { // Init home stream manager diff --git a/src/client/app/mobile/views/pages/widgets.vue b/src/client/app/mobile/views/pages/widgets.vue index eab0ca6a38..ea8580b4d0 100644 --- a/src/client/app/mobile/views/pages/widgets.vue +++ b/src/client/app/mobile/views/pages/widgets.vue @@ -15,6 +15,7 @@ <option value="rss">%i18n:common.widgets.rss%</option> <option value="photo-stream">%i18n:common.widgets.photo-stream%</option> <option value="slideshow">%i18n:common.widgets.slideshow%</option> + <option value="posts-monitor">%i18n:common.widgets.posts-monitor%</option> <option value="version">%i18n:common.widgets.version%</option> <option value="server">%i18n:common.widgets.server%</option> <option value="memo">%i18n:common.widgets.memo%</option> diff --git a/src/db/mongodb.ts b/src/db/mongodb.ts index 05bb72bfde..0f6d27ca15 100644 --- a/src/db/mongodb.ts +++ b/src/db/mongodb.ts @@ -12,7 +12,10 @@ const uri = u && p */ import mongo from 'monk'; -const db = mongo(uri); +const db = mongo(uri, { + poolSize: 16, + keepAlive: 1 +}); export default db; diff --git a/src/index.ts b/src/index.ts index 42a4f484e6..4a98b7564c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -18,6 +18,7 @@ import EnvironmentInfo from './utils/environmentInfo'; import MachineInfo from './utils/machineInfo'; import DependencyInfo from './utils/dependencyInfo'; import serverStats from './server-stats'; +import notesStats from './notes-stats'; import loadConfig from './config/load'; import { Config } from './config/types'; @@ -50,6 +51,7 @@ function main() { ev.mount(); serverStats(); + notesStats(); } else { workerMain(opt); } diff --git a/src/models/note.ts b/src/models/note.ts index ad8c1565f0..d4681b7b70 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -16,6 +16,9 @@ import Following from './following'; const Note = db.get<INote>('notes'); Note.createIndex('uri', { sparse: true, unique: true }); Note.createIndex('userId'); +Note.createIndex({ + createdAt: -1 +}); export default Note; export function isValidText(text: string): boolean { diff --git a/src/notes-stats-child.ts b/src/notes-stats-child.ts new file mode 100644 index 0000000000..0e0f14eaf1 --- /dev/null +++ b/src/notes-stats-child.ts @@ -0,0 +1,20 @@ +import Note from './models/note'; + +setInterval(async () => { + const [all, local] = await Promise.all([Note.count({ + createdAt: { + $gte: new Date(Date.now() - 3000) + } + }), Note.count({ + createdAt: { + $gte: new Date(Date.now() - 3000) + }, + '_user.host': null + })]); + + const stats = { + all, local + }; + + process.send(stats); +}, 3000); diff --git a/src/notes-stats.ts b/src/notes-stats.ts new file mode 100644 index 0000000000..3094c34af0 --- /dev/null +++ b/src/notes-stats.ts @@ -0,0 +1,20 @@ +import * as childProcess from 'child_process'; +import Xev from 'xev'; + +const ev = new Xev(); + +export default function() { + const log = []; + + const p = childProcess.fork(__dirname + '/notes-stats-child.js'); + + p.on('message', stats => { + ev.emit('notesStats', stats); + log.push(stats); + if (log.length > 100) log.shift(); + }); + + ev.on('requestNotesStatsLog', id => { + ev.emit('notesStatsLog:' + id, log); + }); +} diff --git a/src/server-stats.ts b/src/server-stats.ts index 85aa85b682..7b0d4a8576 100644 --- a/src/server-stats.ts +++ b/src/server-stats.ts @@ -6,7 +6,7 @@ import Xev from 'xev'; const ev = new Xev(); /** - * Report stats regularly + * Report server stats regularly */ export default function() { const log = []; diff --git a/src/server/api/stream/notes-stats.ts b/src/server/api/stream/notes-stats.ts new file mode 100644 index 0000000000..739b325848 --- /dev/null +++ b/src/server/api/stream/notes-stats.ts @@ -0,0 +1,35 @@ +import * as websocket from 'websocket'; +import Xev from 'xev'; + +const ev = new Xev(); + +export default function(request: websocket.request, connection: websocket.connection): void { + const onStats = stats => { + connection.send(JSON.stringify({ + type: 'stats', + body: stats + })); + }; + + connection.on('message', async data => { + const msg = JSON.parse(data.utf8Data); + + switch (msg.type) { + case 'requestLog': + ev.once('notesStatsLog:' + msg.id, statsLog => { + connection.send(JSON.stringify({ + type: 'statsLog', + body: statsLog + })); + }); + ev.emit('requestNotesStatsLog', msg.id); + break; + } + }); + + ev.addListener('notesStats', onStats); + + connection.on('close', () => { + ev.removeListener('notesStats', onStats); + }); +} diff --git a/src/server/api/stream/server.ts b/src/server/api/stream/server-stats.ts similarity index 100% rename from src/server/api/stream/server.ts rename to src/server/api/stream/server-stats.ts diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts index 6825b6336a..2d4cfc108f 100644 --- a/src/server/api/streaming.ts +++ b/src/server/api/streaming.ts @@ -12,7 +12,8 @@ import messagingStream from './stream/messaging'; import messagingIndexStream from './stream/messaging-index'; import othelloGameStream from './stream/othello-game'; import othelloStream from './stream/othello'; -import serverStream from './stream/server'; +import serverStatsStream from './stream/server-stats'; +import notesStatsStream from './stream/notes-stats'; import requestsStream from './stream/requests'; import { ParsedUrlQuery } from 'querystring'; import authenticate from './authenticate'; @@ -28,8 +29,13 @@ module.exports = (server: http.Server) => { ws.on('request', async (request) => { const connection = request.accept(); - if (request.resourceURL.pathname === '/server') { - serverStream(request, connection); + if (request.resourceURL.pathname === '/server-stats') { + serverStatsStream(request, connection); + return; + } + + if (request.resourceURL.pathname === '/notes-stats') { + notesStatsStream(request, connection); return; } From 6e8a1086d8f76aec3f245ac177d2d606e2d3104c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 04:15:18 +0900 Subject: [PATCH 204/369] 2.34.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a18f37e0a2..35160efe42 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.33.2", - "clientVersion": "1.0.6294", + "version": "2.34.0", + "clientVersion": "1.0.6302", "codename": "nighthike", "main": "./built/index.js", "private": true, From 0ce9c057e132bf3cf42c5c51b90c4702d0cf7d84 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 06:04:41 +0900 Subject: [PATCH 205/369] Fix chart rendering --- .../app/common/views/widgets/posts-monitor.vue | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/client/app/common/views/widgets/posts-monitor.vue b/src/client/app/common/views/widgets/posts-monitor.vue index bdf811bad0..ee1d6f91fe 100644 --- a/src/client/app/common/views/widgets/posts-monitor.vue +++ b/src/client/app/common/views/widgets/posts-monitor.vue @@ -121,15 +121,15 @@ export default define({ this.save(); }, draw() { - const stats = this.props.view == 0 ? this.stats.slice(0, 50) : this.stats; - const fediPeak = Math.max.apply(null, this.stats.map(x => x.all)) || 1; - const localPeak = Math.max.apply(null, this.stats.map(x => x.local)) || 1; + const stats = this.props.view == 0 ? this.stats.slice(50, 100) : this.stats; + const fediPeak = Math.max.apply(null, stats.map(x => x.all)) || 1; + const localPeak = Math.max.apply(null, stats.map(x => x.local)) || 1; - this.fediPolylinePoints = this.stats.map((s, i) => `${this.viewBoxX - ((this.stats.length - 1) - i)},${(1 - (s.all / fediPeak)) * this.viewBoxY}`).join(' '); - this.localPolylinePoints = this.stats.map((s, i) => `${this.viewBoxX - ((this.stats.length - 1) - i)},${(1 - (s.local / localPeak)) * this.viewBoxY}`).join(' '); + this.fediPolylinePoints = stats.map((s, i) => `${this.viewBoxX - ((stats.length - 1) - i)},${(1 - (s.all / fediPeak)) * this.viewBoxY}`).join(' '); + this.localPolylinePoints = stats.map((s, i) => `${this.viewBoxX - ((stats.length - 1) - i)},${(1 - (s.local / localPeak)) * this.viewBoxY}`).join(' '); - this.fediPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${ this.viewBoxY } ${ this.fediPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`; - this.localPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${ this.viewBoxY } ${ this.localPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`; + this.fediPolygonPoints = `${this.viewBoxX - (stats.length - 1)},${ this.viewBoxY } ${ this.fediPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`; + this.localPolygonPoints = `${this.viewBoxX - (stats.length - 1)},${ this.viewBoxY } ${ this.localPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`; }, onStats(stats) { this.stats.push(stats); From e0a6d9740cb3139d725e86aaae15402877da70ca Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 06:21:13 +0900 Subject: [PATCH 206/369] :v: --- src/client/app/common/views/widgets/posts-monitor.vue | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/client/app/common/views/widgets/posts-monitor.vue b/src/client/app/common/views/widgets/posts-monitor.vue index ee1d6f91fe..3f60f1da63 100644 --- a/src/client/app/common/views/widgets/posts-monitor.vue +++ b/src/client/app/common/views/widgets/posts-monitor.vue @@ -12,6 +12,10 @@ <stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop> </linearGradient> <mask :id="fediMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY"> + <polygon + :points="fediPolygonPoints" + fill="#fff" + fill-opacity="0.5"/> <polyline :points="fediPolylinePoints" fill="none" @@ -32,6 +36,10 @@ <stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop> </linearGradient> <mask :id="localMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY"> + <polygon + :points="localPolygonPoints" + fill="#fff" + fill-opacity="0.5"/> <polyline :points="localPolylinePoints" fill="none" @@ -121,7 +129,7 @@ export default define({ this.save(); }, draw() { - const stats = this.props.view == 0 ? this.stats.slice(50, 100) : this.stats; + const stats = this.props.view == 0 ? this.stats.slice(-50) : this.stats; const fediPeak = Math.max.apply(null, stats.map(x => x.all)) || 1; const localPeak = Math.max.apply(null, stats.map(x => x.local)) || 1; From bdec56a543ad3166ca9a8a2a3bd75327e4b12054 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 06:25:41 +0900 Subject: [PATCH 207/369] :v: --- src/client/app/desktop/views/pages/deck/deck.notifications.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications.vue b/src/client/app/desktop/views/pages/deck/deck.notifications.vue index afe2cd1cbd..f54ad1a3cd 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notifications.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notifications.vue @@ -96,7 +96,7 @@ export default Vue.extend({ fetchMoreNotifications() { this.fetchingMoreNotifications = true; - const max = 30; + const max = 20; (this as any).api('i/notifications', { limit: max + 1, From d193cbf2b750f87e2e84a7cd197a6b2f55d4a250 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 06:27:12 +0900 Subject: [PATCH 208/369] :v: --- .../common/views/widgets/posts-monitor.vue | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/client/app/common/views/widgets/posts-monitor.vue b/src/client/app/common/views/widgets/posts-monitor.vue index 3f60f1da63..1f07342fe0 100644 --- a/src/client/app/common/views/widgets/posts-monitor.vue +++ b/src/client/app/common/views/widgets/posts-monitor.vue @@ -6,30 +6,6 @@ <div class="qpdmibaztplkylerhdbllwcokyrfxeyj" :class="{ dual: props.view == 0 }" :data-darkmode="$store.state.device.darkmode"> <svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" v-show="props.view != 2"> - <defs> - <linearGradient :id="fediGradientId" x1="0" x2="0" y1="1" y2="0"> - <stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop> - <stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop> - </linearGradient> - <mask :id="fediMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY"> - <polygon - :points="fediPolygonPoints" - fill="#fff" - fill-opacity="0.5"/> - <polyline - :points="fediPolylinePoints" - fill="none" - stroke="#fff" - stroke-width="1"/> - </mask> - </defs> - <rect - x="-1" y="-1" - :width="viewBoxX + 2" :height="viewBoxY + 2" - :style="`stroke: none; fill: url(#${ fediGradientId }); mask: url(#${ fediMaskId })`"/> - <text x="1" y="5">Fedi</text> - </svg> - <svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" v-show="props.view != 1"> <defs> <linearGradient :id="localGradientId" x1="0" x2="0" y1="1" y2="0"> <stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop> @@ -53,6 +29,30 @@ :style="`stroke: none; fill: url(#${ localGradientId }); mask: url(#${ localMaskId })`"/> <text x="1" y="5">Local</text> </svg> + <svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" v-show="props.view != 1"> + <defs> + <linearGradient :id="fediGradientId" x1="0" x2="0" y1="1" y2="0"> + <stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop> + <stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop> + </linearGradient> + <mask :id="fediMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY"> + <polygon + :points="fediPolygonPoints" + fill="#fff" + fill-opacity="0.5"/> + <polyline + :points="fediPolylinePoints" + fill="none" + stroke="#fff" + stroke-width="1"/> + </mask> + </defs> + <rect + x="-1" y="-1" + :width="viewBoxX + 2" :height="viewBoxY + 2" + :style="`stroke: none; fill: url(#${ fediGradientId }); mask: url(#${ fediMaskId })`"/> + <text x="1" y="5">Fedi</text> + </svg> </div> </mk-widget-container> </div> From 52db63bca2b1db993e2fa2b41658cc17145062dc Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 06:28:22 +0900 Subject: [PATCH 209/369] 2.34.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 35160efe42..a8ce314e99 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.34.0", - "clientVersion": "1.0.6302", + "version": "2.34.1", + "clientVersion": "1.0.6318", "codename": "nighthike", "main": "./built/index.js", "private": true, From 944000c05c175a065c783319ecc65fa84088ad8a Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 06:52:33 +0900 Subject: [PATCH 210/369] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 580c639726..f8738421cf 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ ultimately sophisticated professional microblogging software. * Reactions * User lists * Customizable column view (known as MisskeyDeck) + * and widgets! * Private messages * Mute * Streaming From f34f8d304c0fa286b3972e7dfac064e74a00d4ae Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 08:38:30 +0900 Subject: [PATCH 211/369] Improve performance --- src/client/app/common/views/components/time.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/common/views/components/time.vue b/src/client/app/common/views/components/time.vue index 58ed115620..aebfb33897 100644 --- a/src/client/app/common/views/components/time.vue +++ b/src/client/app/common/views/components/time.vue @@ -59,7 +59,7 @@ export default Vue.extend({ created() { if (this.mode == 'relative' || this.mode == 'detail') { this.tick(); - this.tickId = setInterval(this.tick, 5000); + this.tickId = setInterval(this.tick, 10000); } }, destroyed() { From e166ad678014585c12c779bc2d72e82a366362e6 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 10:06:27 +0900 Subject: [PATCH 212/369] Better init screen --- src/client/app/base.pug | 8 ++++---- src/client/app/init.css | 40 ++++++++++++++-------------------------- 2 files changed, 18 insertions(+), 30 deletions(-) diff --git a/src/client/app/base.pug b/src/client/app/base.pug index a77a8a9595..11b150bc67 100644 --- a/src/client/app/base.pug +++ b/src/client/app/base.pug @@ -42,7 +42,7 @@ html | JavaScriptを有効にしてください br | Please turn on your JavaScript - div#ini: p - span . - span . - span . + div#ini. + <svg viewBox="0 0 50 50"> + <path fill=#{themeColor} d="M25.251,6.461c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615V6.461z" /> + </svg> diff --git a/src/client/app/init.css b/src/client/app/init.css index fa59195f71..6ee25d64e2 100644 --- a/src/client/app/init.css +++ b/src/client/app/init.css @@ -32,42 +32,30 @@ body > noscript { left: 0; width: 100%; height: 100%; - text-align: center; background: #fff; cursor: wait; } - #ini > p { - display: block; - user-select: none; - margin: 32px; - font-size: 4em; - color: #555; + #ini > svg { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; + width: 64px; + height: 64px; + animation: ini 0.6s infinite linear; } - #ini > p > span { - animation: ini 1.4s infinite ease-in-out both; - } - #ini > p > span:nth-child(1) { - animation-delay: 0s; - } - #ini > p > span:nth-child(2) { - animation-delay: 0.16s; - } - #ini > p > span:nth-child(3) { - animation-delay: 0.32s; - } html[data-darkmode] #ini { background: #191b22; } - html[data-darkmode] #ini > p { - color: #fff; - } @keyframes ini { - 0%, 80%, 100% { - opacity: 1; + from { + transform: rotate(0deg); } - 40% { - opacity: 0; + to { + transform: rotate(360deg); } } From 763676a18c894b9499aeecb91747681d3b856062 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 10:12:03 +0900 Subject: [PATCH 213/369] :v: --- src/notes-stats-child.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/notes-stats-child.ts b/src/notes-stats-child.ts index 0e0f14eaf1..5f85a2a3cc 100644 --- a/src/notes-stats-child.ts +++ b/src/notes-stats-child.ts @@ -1,13 +1,15 @@ import Note from './models/note'; +const interval = 5000; + setInterval(async () => { const [all, local] = await Promise.all([Note.count({ createdAt: { - $gte: new Date(Date.now() - 3000) + $gte: new Date(Date.now() - interval) } }), Note.count({ createdAt: { - $gte: new Date(Date.now() - 3000) + $gte: new Date(Date.now() - interval) }, '_user.host': null })]); @@ -17,4 +19,4 @@ setInterval(async () => { }; process.send(stats); -}, 3000); +}, interval); From 30d5b8d65b1e85941304f00eb9621e037ebda147 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 10:15:45 +0900 Subject: [PATCH 214/369] :art: --- src/client/app/desktop/views/components/notifications.vue | 2 +- src/client/app/desktop/views/pages/deck/deck.note.vue | 2 +- src/client/app/desktop/views/pages/deck/deck.notification.vue | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/app/desktop/views/components/notifications.vue b/src/client/app/desktop/views/components/notifications.vue index ada97d5c86..e479ffadbf 100644 --- a/src/client/app/desktop/views/components/notifications.vue +++ b/src/client/app/desktop/views/components/notifications.vue @@ -206,7 +206,7 @@ root(isDark) margin 0 padding 16px overflow-wrap break-word - font-size 12px + font-size 13px border-bottom solid 1px isDark ? #1c2023 : rgba(#000, 0.05) &:last-child diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index 795bd10fcc..d94b092412 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -200,7 +200,7 @@ export default Vue.extend({ @import '~const.styl' root(isDark) - font-size 12px + font-size 13px border-bottom solid 1px isDark ? #1c2023 : #eaeaea &:last-of-type diff --git a/src/client/app/desktop/views/pages/deck/deck.notification.vue b/src/client/app/desktop/views/pages/deck/deck.notification.vue index a145a94f8a..a379adc69e 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notification.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notification.vue @@ -112,7 +112,7 @@ export default Vue.extend({ root(isDark) > .notification padding 16px - font-size 12px + font-size 13px overflow-wrap break-word &:after From 773b2aa3d17d00552fe4c1ff37f924f0d297e051 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 10:16:29 +0900 Subject: [PATCH 215/369] 2.34.2 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a8ce314e99..701e61db5b 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.34.1", - "clientVersion": "1.0.6318", + "version": "2.34.2", + "clientVersion": "1.0.6325", "codename": "nighthike", "main": "./built/index.js", "private": true, From ccb9ed3489512c028c7c5cae7387a49441f6a666 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 11:29:50 +0900 Subject: [PATCH 216/369] :art: --- .../common/views/widgets/posts-monitor.vue | 39 ++++++++++++++----- .../views/widgets/server.cpu-memory.vue | 37 ++++++++++++++---- 2 files changed, 59 insertions(+), 17 deletions(-) diff --git a/src/client/app/common/views/widgets/posts-monitor.vue b/src/client/app/common/views/widgets/posts-monitor.vue index 1f07342fe0..801307be54 100644 --- a/src/client/app/common/views/widgets/posts-monitor.vue +++ b/src/client/app/common/views/widgets/posts-monitor.vue @@ -5,7 +5,7 @@ <button slot="func" @click="toggle" title="%i18n:@toggle%">%fa:sort%</button> <div class="qpdmibaztplkylerhdbllwcokyrfxeyj" :class="{ dual: props.view == 0 }" :data-darkmode="$store.state.device.darkmode"> - <svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" v-show="props.view != 2"> + <svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" v-show="props.view != 2"> <defs> <linearGradient :id="localGradientId" x1="0" x2="0" y1="1" y2="0"> <stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop> @@ -21,15 +21,20 @@ fill="none" stroke="#fff" stroke-width="1"/> + <circle + :cx="localHeadX" + :cy="localHeadY" + r="1.5" + fill="#fff"/> </mask> </defs> <rect - x="-1" y="-1" - :width="viewBoxX + 2" :height="viewBoxY + 2" + x="-2" y="-2" + :width="viewBoxX + 4" :height="viewBoxY + 4" :style="`stroke: none; fill: url(#${ localGradientId }); mask: url(#${ localMaskId })`"/> <text x="1" y="5">Local</text> </svg> - <svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" v-show="props.view != 1"> + <svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" v-show="props.view != 1"> <defs> <linearGradient :id="fediGradientId" x1="0" x2="0" y1="1" y2="0"> <stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop> @@ -45,11 +50,16 @@ fill="none" stroke="#fff" stroke-width="1"/> + <circle + :cx="fediHeadX" + :cy="fediHeadY" + r="1.5" + fill="#fff"/> </mask> </defs> <rect - x="-1" y="-1" - :width="viewBoxX + 2" :height="viewBoxY + 2" + x="-2" y="-2" + :width="viewBoxX + 4" :height="viewBoxY + 4" :style="`stroke: none; fill: url(#${ fediGradientId }); mask: url(#${ fediMaskId })`"/> <text x="1" y="5">Fedi</text> </svg> @@ -82,7 +92,11 @@ export default define({ fediPolylinePoints: '', localPolylinePoints: '', fediPolygonPoints: '', - localPolygonPoints: '' + localPolygonPoints: '', + fediHeadX: null, + fediHeadY: null, + localHeadX: null, + localHeadY: null }; }, computed: { @@ -133,11 +147,18 @@ export default define({ const fediPeak = Math.max.apply(null, stats.map(x => x.all)) || 1; const localPeak = Math.max.apply(null, stats.map(x => x.local)) || 1; - this.fediPolylinePoints = stats.map((s, i) => `${this.viewBoxX - ((stats.length - 1) - i)},${(1 - (s.all / fediPeak)) * this.viewBoxY}`).join(' '); - this.localPolylinePoints = stats.map((s, i) => `${this.viewBoxX - ((stats.length - 1) - i)},${(1 - (s.local / localPeak)) * this.viewBoxY}`).join(' '); + const fediPolylinePoints = stats.map((s, i) => [this.viewBoxX - ((stats.length - 1) - i), (1 - (s.all / fediPeak)) * this.viewBoxY]); + const localPolylinePoints = stats.map((s, i) => [this.viewBoxX - ((stats.length - 1) - i), (1 - (s.local / localPeak)) * this.viewBoxY]); + this.fediPolylinePoints = fediPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' '); + this.localPolylinePoints = localPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' '); this.fediPolygonPoints = `${this.viewBoxX - (stats.length - 1)},${ this.viewBoxY } ${ this.fediPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`; this.localPolygonPoints = `${this.viewBoxX - (stats.length - 1)},${ this.viewBoxY } ${ this.localPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`; + + this.fediHeadX = fediPolylinePoints[fediPolylinePoints.length - 1][0]; + this.fediHeadY = fediPolylinePoints[fediPolylinePoints.length - 1][1]; + this.localHeadX = localPolylinePoints[localPolylinePoints.length - 1][0]; + this.localHeadY = localPolylinePoints[localPolylinePoints.length - 1][1]; }, onStats(stats) { this.stats.push(stats); diff --git a/src/client/app/common/views/widgets/server.cpu-memory.vue b/src/client/app/common/views/widgets/server.cpu-memory.vue index 6bf998c249..da6b9f799f 100644 --- a/src/client/app/common/views/widgets/server.cpu-memory.vue +++ b/src/client/app/common/views/widgets/server.cpu-memory.vue @@ -1,6 +1,6 @@ <template> <div class="cpu-memory"> - <svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none"> + <svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`"> <defs> <linearGradient :id="cpuGradientId" x1="0" x2="0" y1="1" y2="0"> <stop offset="0%" stop-color="hsl(180, 80%, 70%)"></stop> @@ -16,15 +16,20 @@ fill="none" stroke="#fff" stroke-width="1"/> + <circle + :cx="cpuHeadX" + :cy="cpuHeadY" + r="1.5" + fill="#fff"/> </mask> </defs> <rect - x="-1" y="-1" - :width="viewBoxX + 2" :height="viewBoxY + 2" + x="-2" y="-2" + :width="viewBoxX + 4" :height="viewBoxY + 4" :style="`stroke: none; fill: url(#${ cpuGradientId }); mask: url(#${ cpuMaskId })`"/> <text x="1" y="5">CPU <tspan>{{ cpuP }}%</tspan></text> </svg> - <svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none"> + <svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`"> <defs> <linearGradient :id="memGradientId" x1="0" x2="0" y1="1" y2="0"> <stop offset="0%" stop-color="hsl(180, 80%, 70%)"></stop> @@ -40,11 +45,16 @@ fill="none" stroke="#fff" stroke-width="1"/> + <circle + :cx="memHeadX" + :cy="memHeadY" + r="1.5" + fill="#fff"/> </mask> </defs> <rect - x="-1" y="-1" - :width="viewBoxX + 2" :height="viewBoxY + 2" + x="-2" y="-2" + :width="viewBoxX + 4" :height="viewBoxY + 4" :style="`stroke: none; fill: url(#${ memGradientId }); mask: url(#${ memMaskId })`"/> <text x="1" y="5">MEM <tspan>{{ memP }}%</tspan></text> </svg> @@ -70,6 +80,10 @@ export default Vue.extend({ memPolylinePoints: '', cpuPolygonPoints: '', memPolygonPoints: '', + cpuHeadX: null, + cpuHeadY: null, + memHeadX: null, + memHeadY: null, cpuP: '', memP: '' }; @@ -92,12 +106,19 @@ export default Vue.extend({ this.stats.push(stats); if (this.stats.length > 50) this.stats.shift(); - this.cpuPolylinePoints = this.stats.map((s, i) => `${this.viewBoxX - ((this.stats.length - 1) - i)},${(1 - s.cpu_usage) * this.viewBoxY}`).join(' '); - this.memPolylinePoints = this.stats.map((s, i) => `${this.viewBoxX - ((this.stats.length - 1) - i)},${(1 - (s.mem.used / s.mem.total)) * this.viewBoxY}`).join(' '); + const cpuPolylinePoints = this.stats.map((s, i) => [this.viewBoxX - ((this.stats.length - 1) - i), (1 - s.cpu_usage) * this.viewBoxY]); + const memPolylinePoints = this.stats.map((s, i) => [this.viewBoxX - ((this.stats.length - 1) - i), (1 - (s.mem.used / s.mem.total)) * this.viewBoxY]); + this.cpuPolylinePoints = cpuPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' '); + this.memPolylinePoints = memPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' '); this.cpuPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${ this.viewBoxY } ${ this.cpuPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`; this.memPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${ this.viewBoxY } ${ this.memPolylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`; + this.cpuHeadX = cpuPolylinePoints[cpuPolylinePoints.length - 1][0]; + this.cpuHeadY = cpuPolylinePoints[cpuPolylinePoints.length - 1][1]; + this.memHeadX = memPolylinePoints[memPolylinePoints.length - 1][0]; + this.memHeadY = memPolylinePoints[memPolylinePoints.length - 1][1]; + this.cpuP = (stats.cpu_usage * 100).toFixed(0); this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0); }, From 42a4f92cfa6f0e62cab93f7b1e7805861ddaa967 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 11:40:42 +0900 Subject: [PATCH 217/369] Fix #1125 --- .../desktop/views/components/activity.calendar.vue | 6 +++--- .../app/desktop/views/components/activity.chart.vue | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/client/app/desktop/views/components/activity.calendar.vue b/src/client/app/desktop/views/components/activity.calendar.vue index e488571070..1a88d1a994 100644 --- a/src/client/app/desktop/views/components/activity.calendar.vue +++ b/src/client/app/desktop/views/components/activity.calendar.vue @@ -1,5 +1,5 @@ <template> -<svg viewBox="0 0 21 7" preserveAspectRatio="none"> +<svg viewBox="0 0 21 7"> <rect v-for="record in data" class="day" width="1" height="1" :x="record.x" :y="record.date.weekday" @@ -15,7 +15,7 @@ style="pointer-events: none;"/> <rect class="today" width="1" height="1" - :x="data[data.length - 1].x" :y="data[data.length - 1].date.weekday" + :x="data[0].x" :y="data[0].date.weekday" rx="1" ry="1" fill="none" stroke-width="0.1" @@ -33,7 +33,7 @@ export default Vue.extend({ const peak = Math.max.apply(null, this.data.map(d => d.total)); let x = 0; - this.data.reverse().forEach(d => { + this.data.slice().reverse().forEach(d => { d.x = x; d.date.weekday = (new Date(d.date.year, d.date.month - 1, d.date.day)).getDay(); diff --git a/src/client/app/desktop/views/components/activity.chart.vue b/src/client/app/desktop/views/components/activity.chart.vue index ff489d988b..202eabe90d 100644 --- a/src/client/app/desktop/views/components/activity.chart.vue +++ b/src/client/app/desktop/views/components/activity.chart.vue @@ -1,5 +1,5 @@ <template> -<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" @mousedown.prevent="onMousedown"> +<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" @mousedown.prevent="onMousedown"> <title>%i18n:@total%<br/>%i18n:@notes%<br/>%i18n:@replies%<br/>%i18n:@renotes%</title> <polyline :points="pointsNote" @@ -55,7 +55,6 @@ export default Vue.extend({ }; }, created() { - this.data.reverse(); this.data.forEach(d => d.total = d.notes + d.replies + d.renotes); this.render(); }, @@ -63,10 +62,11 @@ export default Vue.extend({ render() { const peak = Math.max.apply(null, this.data.map(d => d.total)); if (peak != 0) { - this.pointsNote = this.data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.notes / peak)) * this.viewBoxY}`).join(' '); - this.pointsReply = this.data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.replies / peak)) * this.viewBoxY}`).join(' '); - this.pointsRenote = this.data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.renotes / peak)) * this.viewBoxY}`).join(' '); - this.pointsTotal = this.data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.total / peak)) * this.viewBoxY}`).join(' '); + const data = this.data.slice().reverse(); + this.pointsNote = data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.notes / peak)) * this.viewBoxY}`).join(' '); + this.pointsReply = data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.replies / peak)) * this.viewBoxY}`).join(' '); + this.pointsRenote = data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.renotes / peak)) * this.viewBoxY}`).join(' '); + this.pointsTotal = data.map((d, i) => `${(i * this.zoom) + this.pos},${(1 - (d.total / peak)) * this.viewBoxY}`).join(' '); } }, onMousedown(e) { From af2d36a3c99de25292a825ca25c4cfcf6b3daa2d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 11:41:22 +0900 Subject: [PATCH 218/369] 2.34.3 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 701e61db5b..aea105b920 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.34.2", - "clientVersion": "1.0.6325", + "version": "2.34.3", + "clientVersion": "1.0.6328", "codename": "nighthike", "main": "./built/index.js", "private": true, From 8807894890b7c09619815c4f8e3d9a14a32c5d6d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 22:25:15 +0900 Subject: [PATCH 219/369] Fix bug --- src/client/app/store.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client/app/store.ts b/src/client/app/store.ts index 0dbdf9bd5e..267c804fbd 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -180,6 +180,7 @@ export default (os: MiOS) => new Vuex.Store({ removeDeckColumn(state, id) { state.deck.columns = state.deck.columns.filter(c => c.id != id); state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id)); + state.deck.layout = state.deck.layout.filter(ids => ids.length > 0); }, swapDeckColumn(state, x) { From 5bbd318518c908a061cf9b989d84151b6d7bbebf Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 9 Jun 2018 23:52:11 +0900 Subject: [PATCH 220/369] Update message --- src/client/app/safe.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/app/safe.js b/src/client/app/safe.js index 2fd5361725..3d73fa1a9c 100644 --- a/src/client/app/safe.js +++ b/src/client/app/safe.js @@ -5,10 +5,10 @@ // Detect an old browser if (!('fetch' in window)) { alert( - 'お使いのブラウザが古いためMisskeyを動作させることができません。' + + 'お使いのブラウザ(またはOS)が古いためMisskeyを動作させることができません。' + 'バージョンを最新のものに更新するか、別のブラウザをお試しください。' + '\n\n' + - 'Your browser seems outdated. ' + + 'Your browser (or your OS) seems outdated. ' + 'To run Misskey, please update your browser to latest version or try other browsers.'); } From 92999dcaf214de05bbf26f2415e156966512766f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 00:39:30 +0900 Subject: [PATCH 221/369] Update gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 41fef982c4..197c1ec4d2 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,4 @@ npm-debug.log run.bat api-docs.json package-lock.json -yarn.lock +*.log From 72c4ccaee85551bd5f997c14dd9723b9915c0ef4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 00:41:57 +0900 Subject: [PATCH 222/369] Clean up dependencies --- package.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/package.json b/package.json index aea105b920..a0e1500e82 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,6 @@ "@types/debug": "0.0.30", "@types/deep-equal": "1.0.1", "@types/elasticsearch": "5.0.23", - "@types/eventemitter3": "2.0.2", "@types/gm": "1.18.0", "@types/gulp": "3.8.36", "@types/gulp-htmlmin": "1.3.32", @@ -63,7 +62,6 @@ "@types/mkdirp": "0.5.2", "@types/mocha": "5.2.0", "@types/mongodb": "3.0.18", - "@types/monk": "6.0.0", "@types/ms": "0.7.30", "@types/node": "10.1.2", "@types/nopt": "3.0.29", From f9d5af06006edf2389b88e8b262d880989960570 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 01:01:28 +0900 Subject: [PATCH 223/369] MissketDeck: Implement media view tl --- locales/ja.yml | 4 ++ .../desktop/views/pages/deck/deck.list-tl.vue | 7 +++- .../desktop/views/pages/deck/deck.note.vue | 42 +++++++++++++++++-- .../desktop/views/pages/deck/deck.notes.vue | 7 +++- .../views/pages/deck/deck.tl-column.vue | 6 +-- .../app/desktop/views/pages/deck/deck.tl.vue | 7 +++- 6 files changed, 63 insertions(+), 10 deletions(-) diff --git a/locales/ja.yml b/locales/ja.yml index 212ba90b69..dbc4d58761 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -668,6 +668,10 @@ desktop/views/components/window.vue: popout: "ポップアウト" close: "閉じる" +desktop/views/pages/deck/deck.tl-column.vue: + is-media-only: "メディア投稿のみ" + is-media-view: "メディアビュー" + desktop/views/pages/welcome.vue: about: "詳しく..." gotit: "わかった" diff --git a/src/client/app/desktop/views/pages/deck/deck.list-tl.vue b/src/client/app/desktop/views/pages/deck/deck.list-tl.vue index ee4e89747b..d2f46bd8be 100644 --- a/src/client/app/desktop/views/pages/deck/deck.list-tl.vue +++ b/src/client/app/desktop/views/pages/deck/deck.list-tl.vue @@ -1,5 +1,5 @@ <template> - <x-notes ref="timeline" :more="existMore ? more : null"/> + <x-notes ref="timeline" :more="existMore ? more : null" :media-view="mediaView"/> </template> <script lang="ts"> @@ -23,6 +23,11 @@ export default Vue.extend({ type: Boolean, required: false, default: false + }, + mediaView: { + type: Boolean, + required: false, + default: false } }, diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index d94b092412..a888ea7b0e 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -1,5 +1,5 @@ <template> -<div class="zyjjkidcqjnlegkqebitfviomuqmseqk" :class="{ renote: isRenote }"> +<div v-if="!mediaView" class="zyjjkidcqjnlegkqebitfviomuqmseqk" :class="{ renote: isRenote }"> <div class="reply-to" v-if="p.reply && (!$store.getters.isSignedIn || $store.state.settings.showReplyTarget)"> <x-sub :note="p.reply"/> </div> @@ -55,6 +55,14 @@ </div> </article> </div> +<div v-else class="srwrkujossgfuhrbnvqkybtzxpblgchi"> + <div v-if="note.media.length > 0"> + <mk-media-list :media-list="note.media"/> + </div> + <div v-if="note.renote && note.renote.media.length > 0"> + <mk-media-list :media-list="note.renote.media"/> + </div> +</div> </template> <script lang="ts"> @@ -71,7 +79,17 @@ export default Vue.extend({ XSub }, - props: ['note'], + props: { + note: { + type: Object, + required: true + }, + mediaView: { + type: Boolean, + required: false, + default: false + } + }, data() { return { @@ -199,6 +217,16 @@ export default Vue.extend({ <style lang="stylus" scoped> @import '~const.styl' +mediaRoot(isDark) + font-size 13px + margin 4px 12px + + &:first-child + margin-top 12px + + &:last-child + margin-bottom 12px + root(isDark) font-size 13px border-bottom solid 1px isDark ? #1c2023 : #eaeaea @@ -257,7 +285,7 @@ root(isDark) > article display flex - padding 16px 16px 9px + padding 16px 16px 4px > .avatar flex-shrink 0 @@ -408,7 +436,7 @@ root(isDark) > footer > button margin 0 - padding 8px + padding 4px 8px 8px 8px background transparent border none box-shadow none @@ -436,4 +464,10 @@ root(isDark) .zyjjkidcqjnlegkqebitfviomuqmseqk:not([data-darkmode]) root(false) +.srwrkujossgfuhrbnvqkybtzxpblgchi[data-darkmode] + mediaRoot(true) + +.srwrkujossgfuhrbnvqkybtzxpblgchi:not([data-darkmode]) + mediaRoot(false) + </style> diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue index 1f1ca6ad5e..8862b0e0fc 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notes.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue @@ -9,7 +9,7 @@ <transition-group name="mk-notes" class="transition"> <template v-for="(note, i) in _notes"> - <x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)"/> + <x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)" :media-view="mediaView"/> <p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date"> <span>%fa:angle-up%{{ note._datetext }}</span> <span>%fa:angle-down%{{ _notes[i + 1]._datetext }}</span> @@ -44,6 +44,11 @@ export default Vue.extend({ more: { type: Function, required: false + }, + mediaView: { + type: Boolean, + required: false, + default: false } }, diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue index a8e0177baa..ffe1da670b 100644 --- a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue @@ -8,12 +8,12 @@ <span>{{ name }}</span> </span> - <div class="editor" v-if="edit"> + <div class="editor" style="padding:0 12px" v-if="edit"> <mk-switch v-model="column.isMediaOnly" @change="onChangeSettings" text="%i18n:@is-media-only%"/> <mk-switch v-model="column.isMediaView" @change="onChangeSettings" text="%i18n:@is-media-view%"/> </div> - <x-list-tl v-if="column.type == 'list'" :list="column.list" :media-only="column.isMediaOnly"/> - <x-tl v-else :src="column.type" :media-only="column.isMediaOnly"/> + <x-list-tl v-if="column.type == 'list'" :list="column.list" :media-only="column.isMediaOnly" :media-view="column.isMediaView"/> + <x-tl v-else :src="column.type" :media-only="column.isMediaOnly" :media-view="column.isMediaView"/> </x-column> </template> diff --git a/src/client/app/desktop/views/pages/deck/deck.tl.vue b/src/client/app/desktop/views/pages/deck/deck.tl.vue index 47aa8c6413..8e05f09c5d 100644 --- a/src/client/app/desktop/views/pages/deck/deck.tl.vue +++ b/src/client/app/desktop/views/pages/deck/deck.tl.vue @@ -1,5 +1,5 @@ <template> - <x-notes ref="timeline" :more="existMore ? more : null"/> + <x-notes ref="timeline" :more="existMore ? more : null" :media-view="mediaView"/> </template> <script lang="ts"> @@ -23,6 +23,11 @@ export default Vue.extend({ type: Boolean, required: false, default: false + }, + mediaView: { + type: Boolean, + required: false, + default: false } }, From 149b2ee5a7b177b4caa2bef8c62c499c4a66536e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 01:04:31 +0900 Subject: [PATCH 224/369] Update sentences --- locales/ja.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/locales/ja.yml b/locales/ja.yml index dbc4d58761..228893e4af 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -60,7 +60,7 @@ common: timemachine: "カレンダー(タイムマシン)" activity: "アクティビティ" rss: "RSSリーダー" - memo: "メモ" + memo: "付箋" trends: "トレンド" photo-stream: "フォトストリーム" posts-monitor: "投稿チャート" @@ -69,7 +69,7 @@ common: broadcast: "ブロードキャスト" notifications: "通知" users: "おすすめユーザー" - polls: "投票" + polls: "アンケート" post-form: "投稿フォーム" messaging: "メッセージ" server: "サーバー情報" @@ -168,11 +168,11 @@ common/views/components/poll.vue: voted: "投票済み" common/views/components/poll-editor.vue: - no-only-one-choice: "投票には、選択肢が最低2つ必要です" + no-only-one-choice: "アンケートには、選択肢が最低2つ必要です" choice-n: "選択肢{}" remove: "この選択肢を削除" add: "+選択肢を追加" - destroy: "投票を破棄" + destroy: "アンケートを破棄" common/views/components/reaction-picker.vue: choose-reaction: "リアクションを選択" @@ -259,7 +259,7 @@ common/views/widgets/server.vue: toggle: "表示を切り替え" common/views/widgets/memo.vue: - title: "メモ" + title: "付箋" memo: "ここに書いて!" save: "保存" @@ -438,7 +438,7 @@ desktop/views/components/post-form.vue: attach-media-from-drive: "ドライブからメディアを添付" attach-cancel: "添付取り消し" insert-a-kao: "v(‘ω’)v" - create-poll: "投票を作成" + create-poll: "アンケートを作成" text-remain: "残り{}文字" desktop/views/components/post-form-window.vue: @@ -604,7 +604,7 @@ desktop/views/components/sub-note-content.vue: private: "この投稿は非公開です" deleted: "この投稿は削除されました" media-count: "{}つのメディア" - poll: "投票" + poll: "アンケート" desktop/views/components/taskmanager.vue: title: "タスクマネージャ" @@ -751,7 +751,7 @@ desktop/views/widgets/notifications.vue: settings: "通知の設定" desktop/views/widgets/polls.vue: - title: "投票" + title: "アンケート" refresh: "他を見る" nothing: "ありません!" @@ -869,7 +869,7 @@ mobile/views/components/sub-note-content.vue: private: "この投稿は非公開です" deleted: "この投稿は削除されました" media-count: "{}つのメディア" - poll: "投票" + poll: "アンケート" mobile/views/components/timeline.vue: empty: "投稿がありません" From 56df89f8dd23e69131a6677a78c8d243bd3531c3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 01:22:44 +0900 Subject: [PATCH 225/369] 2.35.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a0e1500e82..4d82ad8f43 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.34.3", - "clientVersion": "1.0.6328", + "version": "2.35.0", + "clientVersion": "1.0.6358", "codename": "nighthike", "main": "./built/index.js", "private": true, From 5d01e19ce7cf886c2ba99ad90c9f3479ef6706b3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 03:27:10 +0900 Subject: [PATCH 226/369] Fix bug --- .../app/common/views/components/menu.vue | 30 ++++++++++++++----- .../app/common/views/components/note-menu.vue | 10 ++++--- .../desktop/views/components/context-menu.vue | 8 ++--- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/client/app/common/views/components/menu.vue b/src/client/app/common/views/components/menu.vue index cf3a09e672..9b16732b9a 100644 --- a/src/client/app/common/views/components/menu.vue +++ b/src/client/app/common/views/components/menu.vue @@ -15,7 +15,20 @@ import Vue from 'vue'; import * as anime from 'animejs'; export default Vue.extend({ - props: ['source', 'compact', 'items'], + props: { + source: { + required: true + }, + items: { + type: Array, + required: true + }, + compact: { + type: Boolean, + required: false, + default: false + } + }, data() { return { hukidasi: !this.compact @@ -44,13 +57,13 @@ export default Vue.extend({ top = y; } - if (left + width > window.innerWidth) { - left = window.innerWidth - width; + if (left + width - window.pageXOffset > window.innerWidth) { + left = window.innerWidth - width + window.pageXOffset; this.hukidasi = false; } - if (top + height > window.innerHeight) { - top = window.innerHeight - height; + if (top + height - window.pageYOffset > window.innerHeight) { + top = window.innerHeight - height + window.pageYOffset; this.hukidasi = false; } @@ -139,9 +152,13 @@ $border-color = rgba(27, 31, 35, 0.15) transform-origin center -($balloon-size) &:before + &:after content "" display block position absolute + pointer-events none + + &:before top -($balloon-size * 2) left s('calc(50% - %s)', $balloon-size) border-top solid $balloon-size transparent @@ -150,9 +167,6 @@ $border-color = rgba(27, 31, 35, 0.15) border-bottom solid $balloon-size $border-color &:after - content "" - display block - position absolute top -($balloon-size * 2) + 1.5px left s('calc(50% - %s)', $balloon-size) border-top solid $balloon-size transparent diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue index 4a8aae9e49..889f63779f 100644 --- a/src/client/app/common/views/components/note-menu.vue +++ b/src/client/app/common/views/components/note-menu.vue @@ -1,6 +1,6 @@ <template> -<div class="mk-note-menu" style="position:initial"> - <mk-menu ref="menu" :source="source" :compact="compact" :items="items" @closed="$destroy"/> +<div style="position:initial"> + <mk-menu :source="source" :compact="compact" :items="items" @closed="closed"/> </div> </template> @@ -63,8 +63,10 @@ export default Vue.extend({ }); }, - close() { - this.$refs.menu.close(); + closed() { + this.$nextTick(() => { + this.$destroy(); + }); } } }); diff --git a/src/client/app/desktop/views/components/context-menu.vue b/src/client/app/desktop/views/components/context-menu.vue index a9a083ec0a..afb6838eb6 100644 --- a/src/client/app/desktop/views/components/context-menu.vue +++ b/src/client/app/desktop/views/components/context-menu.vue @@ -23,12 +23,12 @@ export default Vue.extend({ let x = this.x; let y = this.y; - if (x + width > window.innerWidth) { - x = window.innerWidth - width; + if (x + width - window.pageXOffset > window.innerWidth) { + x = window.innerWidth - width + window.pageXOffset; } - if (y + height > window.innerHeight) { - y = window.innerHeight - height; + if (y + height - window.pageYOffset > window.innerHeight) { + y = window.innerHeight - height + window.pageYOffset; } this.$el.style.left = x + 'px'; From 6630ca595c56b32d544638e693c0621a6eb9222d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 03:31:13 +0900 Subject: [PATCH 227/369] :art: --- src/client/app/common/views/components/note-menu.vue | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue index 889f63779f..27a49a6536 100644 --- a/src/client/app/common/views/components/note-menu.vue +++ b/src/client/app/common/views/components/note-menu.vue @@ -13,21 +13,25 @@ export default Vue.extend({ items() { const items = []; items.push({ + icon: '%fa:star%', text: '%i18n:@favorite%', action: this.favorite }); if (this.note.userId == this.$store.state.i.id) { items.push({ + icon: '%fa:thumbtack%', text: '%i18n:@pin%', action: this.pin }); items.push({ + icon: '%fa:trash-alt R%', text: '%i18n:@delete%', action: this.del }); } if (this.note.uri) { items.push({ + icon: '%fa:external-link-square-alt%', text: '%i18n:@remote%', action: () => { window.open(this.note.uri, '_blank'); From 7e3bf06db13cd2d038e43ba03699eadbf7526fde Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 03:31:42 +0900 Subject: [PATCH 228/369] 2.35.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4d82ad8f43..dde0f8d5d8 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.35.0", - "clientVersion": "1.0.6358", + "version": "2.35.1", + "clientVersion": "1.0.6360", "codename": "nighthike", "main": "./built/index.js", "private": true, From 22df79573330bf6dd9309baa2bf65f5a6ac8db0a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 03:47:09 +0900 Subject: [PATCH 229/369] Fix bug --- src/text/html.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/text/html.ts b/src/text/html.ts index 40f86e4b2b..4d0b4267f9 100644 --- a/src/text/html.ts +++ b/src/text/html.ts @@ -24,9 +24,9 @@ const handlers = { }, hashtag({ document }, { hashtag }) { - const a = document.createElement('a'); - a.href = '/search?q=#' + hashtag; - a.textContent = hashtag; + const span = document.createElement('span'); + span.textContent = hashtag; + document.body.appendChild(span); }, 'inline-code'({ document }, { code }) { From 50b37a8420ab106b674bab3c407c46f9cb706af4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 03:48:38 +0900 Subject: [PATCH 230/369] oops --- src/text/html.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/text/html.ts b/src/text/html.ts index 4d0b4267f9..58038bc31b 100644 --- a/src/text/html.ts +++ b/src/text/html.ts @@ -25,7 +25,7 @@ const handlers = { hashtag({ document }, { hashtag }) { const span = document.createElement('span'); - span.textContent = hashtag; + span.textContent = '#' + hashtag; document.body.appendChild(span); }, From 8bcf44bc16866741eed2af5f8757ee13816779fa Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 03:55:51 +0900 Subject: [PATCH 231/369] :v: --- src/text/html.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/text/html.ts b/src/text/html.ts index 58038bc31b..53d4e8a52d 100644 --- a/src/text/html.ts +++ b/src/text/html.ts @@ -24,9 +24,11 @@ const handlers = { }, hashtag({ document }, { hashtag }) { - const span = document.createElement('span'); - span.textContent = '#' + hashtag; - document.body.appendChild(span); + const a = document.createElement('a'); + a.href = config.url + '/search?q=#' + hashtag; + a.textContent = '#' + hashtag; + a.setAttribute('rel', 'tag'); + document.body.appendChild(a); }, 'inline-code'({ document }, { code }) { From c8dd8341ca4cdb8d6c97a7730b0850828e7a2017 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 03:58:12 +0900 Subject: [PATCH 232/369] 2.35.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dde0f8d5d8..a32ef94015 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.35.1", + "version": "2.35.2", "clientVersion": "1.0.6360", "codename": "nighthike", "main": "./built/index.js", From b29ff0e94b3480f8e57425c4a98d1d44d9d41572 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 08:03:02 +0900 Subject: [PATCH 233/369] :v: --- src/client/app/common/views/components/time.vue | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/client/app/common/views/components/time.vue b/src/client/app/common/views/components/time.vue index aebfb33897..700643ff05 100644 --- a/src/client/app/common/views/components/time.vue +++ b/src/client/app/common/views/components/time.vue @@ -58,18 +58,21 @@ export default Vue.extend({ }, created() { if (this.mode == 'relative' || this.mode == 'detail') { - this.tick(); - this.tickId = setInterval(this.tick, 10000); + this.tickId = window.requestAnimationFrame(this.tick); } }, destroyed() { if (this.mode === 'relative' || this.mode === 'detail') { - clearInterval(this.tickId); + window.clearTimeout(this.tickId); } }, methods: { tick() { this.now = new Date(); + + this.tickId = setTimeout(() => { + window.requestAnimationFrame(this.tick); + }, 10000); } } }); From 951b2346ab5760490aa408f147cc17ce4548ca52 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 08:15:05 +0900 Subject: [PATCH 234/369] :v: --- src/models/drive-file.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/models/drive-file.ts b/src/models/drive-file.ts index bb98c11a93..5fa76f4bf8 100644 --- a/src/models/drive-file.ts +++ b/src/models/drive-file.ts @@ -9,7 +9,7 @@ import User from './user'; import DriveFileThumbnail, { deleteDriveFileThumbnail } from './drive-file-thumbnail'; const DriveFile = monkDb.get<IDriveFile>('driveFiles.files'); -DriveFile.createIndex('md5'); +DriveFile.createIndex('md5', { sparse: true }); DriveFile.createIndex('metadata.uri', { sparse: true, unique: true }); export default DriveFile; From 16d4b168724295f2b81afb052c0ab2f76919e93c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 08:21:48 +0900 Subject: [PATCH 235/369] Revert ":v:" This reverts commit 951b2346ab5760490aa408f147cc17ce4548ca52. --- src/models/drive-file.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/models/drive-file.ts b/src/models/drive-file.ts index 5fa76f4bf8..bb98c11a93 100644 --- a/src/models/drive-file.ts +++ b/src/models/drive-file.ts @@ -9,7 +9,7 @@ import User from './user'; import DriveFileThumbnail, { deleteDriveFileThumbnail } from './drive-file-thumbnail'; const DriveFile = monkDb.get<IDriveFile>('driveFiles.files'); -DriveFile.createIndex('md5', { sparse: true }); +DriveFile.createIndex('md5'); DriveFile.createIndex('metadata.uri', { sparse: true, unique: true }); export default DriveFile; From bee77afb7f1215ff660ddd1098a881098b2257f1 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 08:34:46 +0900 Subject: [PATCH 236/369] Fix bug --- src/models/user.ts | 16 ++++++++++------ src/remote/activitypub/models/person.ts | 11 +++++++---- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/models/user.ts b/src/models/user.ts index 2d4d7dc184..c389f477ab 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -405,13 +405,17 @@ export const pack = ( delete _user.publicKey; } - _user.avatarUrl = _user.avatarId != null - ? `${config.drive_url}/${_user.avatarId}` - : `${config.drive_url}/default-avatar.jpg`; + if (_user.avatarUrl == null) { + _user.avatarUrl = _user.avatarId != null + ? `${config.drive_url}/${_user.avatarId}` + : `${config.drive_url}/default-avatar.jpg`; + } - _user.bannerUrl = _user.bannerId != null - ? `${config.drive_url}/${_user.bannerId}` - : null; + if (_user.bannerUrl == null) { + _user.bannerUrl = _user.bannerId != null + ? `${config.drive_url}/${_user.bannerId}` + : null; + } _user.wallpaperUrl = _user.wallpaperId != null ? `${config.drive_url}/${_user.wallpaperId}` diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts index b720c445c6..3bc04b8cbe 100644 --- a/src/remote/activitypub/models/person.ts +++ b/src/remote/activitypub/models/person.ts @@ -9,6 +9,7 @@ import webFinger from '../../webfinger'; import Resolver from '../resolver'; import { resolveImage } from './image'; import { isCollectionOrOrderedCollection, IObject, IPerson } from '../type'; +import { IDriveFile } from '../../../models/drive-file'; const log = debug('misskey:activitypub'); @@ -190,21 +191,23 @@ export async function updatePerson(value: string | IObject, resolver?: Resolver) const summaryDOM = JSDOM.fragment(person.summary); // アイコンとヘッダー画像をフェッチ - const [avatarId, bannerId] = (await Promise.all([ + const [avatar, banner] = (await Promise.all<IDriveFile>([ person.icon, person.image ].map(img => img == null ? Promise.resolve(null) : resolveImage(exist, img) - ))).map(file => file != null ? file._id : null); + ))); // Update user await User.update({ _id: exist._id }, { $set: { updatedAt: new Date(), - avatarId, - bannerId, + avatarId: avatar ? avatar._id : null, + bannerId: banner ? banner._id : null, + avatarUrl: avatar && avatar.metadata.isMetaOnly ? avatar.metadata.url : null, + bannerUrl: banner && banner.metadata.isMetaOnly ? banner.metadata.url : null, description: summaryDOM.textContent, followersCount, followingCount, From 119d38ea08114427450eec11265b76bb27862bf5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 08:41:57 +0900 Subject: [PATCH 237/369] Fix bug --- src/models/user.ts | 2 ++ src/remote/activitypub/models/person.ts | 20 +++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/models/user.ts b/src/models/user.ts index c389f477ab..f0620a6cfd 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -48,6 +48,8 @@ type IUserBase = { usernameLower: string; avatarId: mongo.ObjectID; bannerId: mongo.ObjectID; + avatarUrl?: string; + bannerUrl?: string; wallpaperId: mongo.ObjectID; data: any; description: string; diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts index 3bc04b8cbe..96e73406b2 100644 --- a/src/remote/activitypub/models/person.ts +++ b/src/remote/activitypub/models/person.ts @@ -118,19 +118,33 @@ export async function createPerson(value: any, resolver?: Resolver): Promise<IUs } //#region アイコンとヘッダー画像をフェッチ - const [avatarId, bannerId] = (await Promise.all([ + const [avatar, banner] = (await Promise.all<IDriveFile>([ person.icon, person.image ].map(img => img == null ? Promise.resolve(null) : resolveImage(user, img) - ))).map(file => file != null ? file._id : null); + ))); - User.update({ _id: user._id }, { $set: { avatarId, bannerId } }); + const avatarId = avatar ? avatar._id : null; + const bannerId = banner ? banner._id : null; + const avatarUrl = avatar && avatar.metadata.isMetaOnly ? avatar.metadata.url : null; + const bannerUrl = banner && banner.metadata.isMetaOnly ? banner.metadata.url : null; + + await User.update({ _id: user._id }, { + $set: { + avatarId, + bannerId, + avatarUrl, + bannerUrl + } + }); user.avatarId = avatarId; user.bannerId = bannerId; + user.avatarUrl = avatarUrl; + user.bannerUrl = bannerUrl; //#endregion return user; From 0360337df9e12b362d09dd76dfe7de5a05e2ad40 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 08:42:29 +0900 Subject: [PATCH 238/369] 2.35.3 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a32ef94015..08316631c2 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.35.2", - "clientVersion": "1.0.6360", + "version": "2.35.3", + "clientVersion": "1.0.6371", "codename": "nighthike", "main": "./built/index.js", "private": true, From 94ce658ab977b794b30624ff44781f61be10b06b Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 12:19:19 +0900 Subject: [PATCH 239/369] =?UTF-8?q?=E3=83=8F=E3=83=83=E3=82=B7=E3=83=A5?= =?UTF-8?q?=E3=82=BF=E3=82=B0=E6=A4=9C=E7=B4=A2=E3=82=92=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/app/desktop/script.ts | 2 + .../desktop/views/components/note-detail.vue | 2 +- .../desktop/views/components/notes.note.vue | 2 +- .../desktop/views/pages/deck/deck.note.vue | 2 +- src/client/app/desktop/views/pages/tag.vue | 128 +++++++ .../mobile/views/components/note-detail.vue | 2 +- .../app/mobile/views/components/note.vue | 2 +- src/models/note.ts | 1 + src/remote/activitypub/renderer/hashtag.ts | 2 +- src/server/api/endpoints.ts | 3 + .../api/endpoints/notes/search_by_tag.ts | 329 ++++++++++++++++++ src/text/html.ts | 2 +- 12 files changed, 470 insertions(+), 7 deletions(-) create mode 100644 src/client/app/desktop/views/pages/tag.vue create mode 100644 src/server/api/endpoints/notes/search_by_tag.ts diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts index 61f1f5b870..8b1623ce45 100644 --- a/src/client/app/desktop/script.ts +++ b/src/client/app/desktop/script.ts @@ -33,6 +33,7 @@ import MkHomeCustomize from './views/pages/home-customize.vue'; import MkMessagingRoom from './views/pages/messaging-room.vue'; import MkNote from './views/pages/note.vue'; import MkSearch from './views/pages/search.vue'; +import MkTag from './views/pages/tag.vue'; import MkOthello from './views/pages/othello.vue'; /** @@ -60,6 +61,7 @@ init(async (launch) => { { path: '/i/lists/:list', component: MkUserList }, { path: '/selectdrive', component: MkSelectDrive }, { path: '/search', component: MkSearch }, + { path: '/tags/:tag', component: MkTag }, { path: '/othello', component: MkOthello }, { path: '/othello/:game', component: MkOthello }, { path: '/@:user', component: MkUser }, diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index 2f28d223dd..4b5e5bebdf 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -48,7 +48,7 @@ <mk-poll v-if="p.poll" :note="p"/> <mk-url-preview v-for="url in urls" :url="url" :key="url"/> <div class="tags" v-if="p.tags && p.tags.length > 0"> - <router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link> + <router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link> </div> <a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> <div class="map" v-if="p.geo" ref="map"></div> diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 2f185e335a..ee11fcc55f 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -33,7 +33,7 @@ </div> <mk-poll v-if="p.poll" :note="p" ref="pollViewer"/> <div class="tags" v-if="p.tags && p.tags.length > 0"> - <router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link> + <router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link> </div> <a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a> <div class="map" v-if="p.geo" ref="map"></div> diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index a888ea7b0e..bf830b92ef 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -33,7 +33,7 @@ </div> <mk-poll v-if="p.poll" :note="p" ref="pollViewer"/> <div class="tags" v-if="p.tags && p.tags.length > 0"> - <router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link> + <router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link> </div> <a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> <div class="renote" v-if="p.renote"> diff --git a/src/client/app/desktop/views/pages/tag.vue b/src/client/app/desktop/views/pages/tag.vue new file mode 100644 index 0000000000..0b8fd81ac1 --- /dev/null +++ b/src/client/app/desktop/views/pages/tag.vue @@ -0,0 +1,128 @@ +<template> +<mk-ui> + <header :class="$style.header"> + <h1>#{{ $route.params.tag }}</h1> + </header> + <div :class="$style.loading" v-if="fetching"> + <mk-ellipsis-icon/> + </div> + <p :class="$style.empty" v-if="!fetching && empty">%fa:search%「{{ q }}」に関する投稿は見つかりませんでした。</p> + <mk-notes ref="timeline" :class="$style.notes" :more="existMore ? more : null"/> +</mk-ui> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import Progress from '../../../common/scripts/loading'; + +const limit = 20; + +export default Vue.extend({ + data() { + return { + fetching: true, + moreFetching: false, + existMore: false, + offset: 0, + empty: false + }; + }, + watch: { + $route: 'fetch' + }, + mounted() { + document.addEventListener('keydown', this.onDocumentKeydown); + window.addEventListener('scroll', this.onScroll, { passive: true }); + + this.fetch(); + }, + beforeDestroy() { + document.removeEventListener('keydown', this.onDocumentKeydown); + window.removeEventListener('scroll', this.onScroll); + }, + methods: { + onDocumentKeydown(e) { + if (e.target.tagName != 'INPUT' && e.target.tagName != 'TEXTAREA') { + if (e.which == 84) { // t + (this.$refs.timeline as any).focus(); + } + } + }, + fetch() { + this.fetching = true; + Progress.start(); + + (this.$refs.timeline as any).init(() => new Promise((res, rej) => { + (this as any).api('notes/search_by_tag', { + limit: limit + 1, + offset: this.offset, + tag: this.$route.params.tag + }).then(notes => { + if (notes.length == 0) this.empty = true; + if (notes.length == limit + 1) { + notes.pop(); + this.existMore = true; + } + res(notes); + this.fetching = false; + Progress.done(); + }, rej); + })); + }, + more() { + this.offset += limit; + + const promise = (this as any).api('notes/search_by_tag', { + limit: limit + 1, + offset: this.offset, + tag: this.$route.params.tag + }); + + promise.then(notes => { + if (notes.length == limit + 1) { + notes.pop(); + } else { + this.existMore = false; + } + notes.forEach(n => (this.$refs.timeline as any).append(n)); + this.moreFetching = false; + }); + + return promise; + } + } +}); +</script> + +<style lang="stylus" module> +.header + width 100% + max-width 600px + margin 0 auto + color #555 + +.notes + width 600px + margin 0 auto + border solid 1px rgba(#000, 0.075) + border-radius 6px + overflow hidden + +.loading + padding 64px 0 + +.empty + display block + margin 0 auto + padding 32px + max-width 400px + text-align center + color #999 + + > [data-fa] + display block + margin-bottom 16px + font-size 3em + color #ccc + +</style> diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index bdbb8876df..f3e77d7062 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -41,7 +41,7 @@ <mk-note-html v-if="p.text" :text="p.text" :i="$store.state.i"/> </div> <div class="tags" v-if="p.tags && p.tags.length > 0"> - <router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link> + <router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link> </div> <div class="media" v-if="p.media.length > 0"> <mk-media-list :media-list="p.media" :raw="true"/> diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 62cee0abfc..4498bb5633 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -33,7 +33,7 @@ </div> <mk-poll v-if="p.poll" :note="p" ref="pollViewer"/> <div class="tags" v-if="p.tags && p.tags.length > 0"> - <router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link> + <router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link> </div> <mk-url-preview v-for="url in urls" :url="url" :key="url"/> <a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> diff --git a/src/models/note.ts b/src/models/note.ts index d4681b7b70..359d953735 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -16,6 +16,7 @@ import Following from './following'; const Note = db.get<INote>('notes'); Note.createIndex('uri', { sparse: true, unique: true }); Note.createIndex('userId'); +Note.createIndex('tags', { sparse: true }); Note.createIndex({ createdAt: -1 }); diff --git a/src/remote/activitypub/renderer/hashtag.ts b/src/remote/activitypub/renderer/hashtag.ts index cf0b07b48a..50761c8684 100644 --- a/src/remote/activitypub/renderer/hashtag.ts +++ b/src/remote/activitypub/renderer/hashtag.ts @@ -2,6 +2,6 @@ import config from '../../../config'; export default tag => ({ type: 'Hashtag', - href: `${config.url}/search?q=#${encodeURIComponent(tag)}`, + href: `${config.url}/tags/${encodeURIComponent(tag)}`, name: '#' + tag }); diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts index 94e649d29b..91e5298e73 100644 --- a/src/server/api/endpoints.ts +++ b/src/server/api/endpoints.ts @@ -525,6 +525,9 @@ const endpoints: Endpoint[] = [ { name: 'notes/search' }, + { + name: 'notes/search_by_tag' + }, { name: 'notes/timeline', withCredential: true, diff --git a/src/server/api/endpoints/notes/search_by_tag.ts b/src/server/api/endpoints/notes/search_by_tag.ts new file mode 100644 index 0000000000..4cf070f4ce --- /dev/null +++ b/src/server/api/endpoints/notes/search_by_tag.ts @@ -0,0 +1,329 @@ +import $ from 'cafy'; import ID from '../../../../cafy-id'; +import Note from '../../../../models/note'; +import User from '../../../../models/user'; +import Mute from '../../../../models/mute'; +import { getFriendIds } from '../../common/get-friends'; +import { pack } from '../../../../models/note'; + +/** + * Search notes by tag + */ +module.exports = (params, me) => new Promise(async (res, rej) => { + // Get 'tag' parameter + const [tag, tagError] = $.str.get(params.tag); + if (tagError) return rej('invalid tag param'); + + // Get 'includeUserIds' parameter + const [includeUserIds = [], includeUserIdsErr] = $.arr($.type(ID)).optional().get(params.includeUserIds); + if (includeUserIdsErr) return rej('invalid includeUserIds param'); + + // Get 'excludeUserIds' parameter + const [excludeUserIds = [], excludeUserIdsErr] = $.arr($.type(ID)).optional().get(params.excludeUserIds); + if (excludeUserIdsErr) return rej('invalid excludeUserIds param'); + + // Get 'includeUserUsernames' parameter + const [includeUserUsernames = [], includeUserUsernamesErr] = $.arr($.str).optional().get(params.includeUserUsernames); + if (includeUserUsernamesErr) return rej('invalid includeUserUsernames param'); + + // Get 'excludeUserUsernames' parameter + const [excludeUserUsernames = [], excludeUserUsernamesErr] = $.arr($.str).optional().get(params.excludeUserUsernames); + if (excludeUserUsernamesErr) return rej('invalid excludeUserUsernames param'); + + // Get 'following' parameter + const [following = null, followingErr] = $.bool.optional().nullable().get(params.following); + if (followingErr) return rej('invalid following param'); + + // Get 'mute' parameter + const [mute = 'mute_all', muteErr] = $.str.optional().get(params.mute); + if (muteErr) return rej('invalid mute param'); + + // Get 'reply' parameter + const [reply = null, replyErr] = $.bool.optional().nullable().get(params.reply); + if (replyErr) return rej('invalid reply param'); + + // Get 'renote' parameter + const [renote = null, renoteErr] = $.bool.optional().nullable().get(params.renote); + if (renoteErr) return rej('invalid renote param'); + + // Get 'media' parameter + const [media = null, mediaErr] = $.bool.optional().nullable().get(params.media); + if (mediaErr) return rej('invalid media param'); + + // Get 'poll' parameter + const [poll = null, pollErr] = $.bool.optional().nullable().get(params.poll); + if (pollErr) return rej('invalid poll param'); + + // Get 'sinceDate' parameter + const [sinceDate, sinceDateErr] = $.num.optional().get(params.sinceDate); + if (sinceDateErr) throw 'invalid sinceDate param'; + + // Get 'untilDate' parameter + const [untilDate, untilDateErr] = $.num.optional().get(params.untilDate); + if (untilDateErr) throw 'invalid untilDate param'; + + // Get 'offset' parameter + const [offset = 0, offsetErr] = $.num.optional().min(0).get(params.offset); + if (offsetErr) return rej('invalid offset param'); + + // Get 'limit' parameter + const [limit = 10, limitErr] = $.num.optional().range(1, 30).get(params.limit); + if (limitErr) return rej('invalid limit param'); + + let includeUsers = includeUserIds; + if (includeUserUsernames != null) { + const ids = (await Promise.all(includeUserUsernames.map(async (username) => { + const _user = await User.findOne({ + usernameLower: username.toLowerCase() + }); + return _user ? _user._id : null; + }))).filter(id => id != null); + includeUsers = includeUsers.concat(ids); + } + + let excludeUsers = excludeUserIds; + if (excludeUserUsernames != null) { + const ids = (await Promise.all(excludeUserUsernames.map(async (username) => { + const _user = await User.findOne({ + usernameLower: username.toLowerCase() + }); + return _user ? _user._id : null; + }))).filter(id => id != null); + excludeUsers = excludeUsers.concat(ids); + } + + search(res, rej, me, tag, includeUsers, excludeUsers, following, + mute, reply, renote, media, poll, sinceDate, untilDate, offset, limit); +}); + +async function search( + res, rej, me, tag, includeUserIds, excludeUserIds, following, + mute, reply, renote, media, poll, sinceDate, untilDate, offset, max) { + + let q: any = { + $and: [{ + tags: tag + }] + }; + + const push = x => q.$and.push(x); + + if (includeUserIds && includeUserIds.length != 0) { + push({ + userId: { + $in: includeUserIds + } + }); + } else if (excludeUserIds && excludeUserIds.length != 0) { + push({ + userId: { + $nin: excludeUserIds + } + }); + } + + if (following != null && me != null) { + const ids = await getFriendIds(me._id, false); + push({ + userId: following ? { + $in: ids + } : { + $nin: ids.concat(me._id) + } + }); + } + + if (me != null) { + const mutes = await Mute.find({ + muterId: me._id, + deletedAt: { $exists: false } + }); + const mutedUserIds = mutes.map(m => m.muteeId); + + switch (mute) { + case 'mute_all': + push({ + userId: { + $nin: mutedUserIds + }, + '_reply.userId': { + $nin: mutedUserIds + }, + '_renote.userId': { + $nin: mutedUserIds + } + }); + break; + case 'mute_related': + push({ + '_reply.userId': { + $nin: mutedUserIds + }, + '_renote.userId': { + $nin: mutedUserIds + } + }); + break; + case 'mute_direct': + push({ + userId: { + $nin: mutedUserIds + } + }); + break; + case 'direct_only': + push({ + userId: { + $in: mutedUserIds + } + }); + break; + case 'related_only': + push({ + $or: [{ + '_reply.userId': { + $in: mutedUserIds + } + }, { + '_renote.userId': { + $in: mutedUserIds + } + }] + }); + break; + case 'all_only': + push({ + $or: [{ + userId: { + $in: mutedUserIds + } + }, { + '_reply.userId': { + $in: mutedUserIds + } + }, { + '_renote.userId': { + $in: mutedUserIds + } + }] + }); + break; + } + } + + if (reply != null) { + if (reply) { + push({ + replyId: { + $exists: true, + $ne: null + } + }); + } else { + push({ + $or: [{ + replyId: { + $exists: false + } + }, { + replyId: null + }] + }); + } + } + + if (renote != null) { + if (renote) { + push({ + renoteId: { + $exists: true, + $ne: null + } + }); + } else { + push({ + $or: [{ + renoteId: { + $exists: false + } + }, { + renoteId: null + }] + }); + } + } + + if (media != null) { + if (media) { + push({ + mediaIds: { + $exists: true, + $ne: null + } + }); + } else { + push({ + $or: [{ + mediaIds: { + $exists: false + } + }, { + mediaIds: null + }] + }); + } + } + + if (poll != null) { + if (poll) { + push({ + poll: { + $exists: true, + $ne: null + } + }); + } else { + push({ + $or: [{ + poll: { + $exists: false + } + }, { + poll: null + }] + }); + } + } + + if (sinceDate) { + push({ + createdAt: { + $gt: new Date(sinceDate) + } + }); + } + + if (untilDate) { + push({ + createdAt: { + $lt: new Date(untilDate) + } + }); + } + + if (q.$and.length == 0) { + q = {}; + } + + // Search notes + const notes = await Note + .find(q, { + sort: { + _id: -1 + }, + limit: max, + skip: offset + }); + + // Serialize + res(await Promise.all(notes.map(note => pack(note, me)))); +} diff --git a/src/text/html.ts b/src/text/html.ts index 53d4e8a52d..70b341689a 100644 --- a/src/text/html.ts +++ b/src/text/html.ts @@ -25,7 +25,7 @@ const handlers = { hashtag({ document }, { hashtag }) { const a = document.createElement('a'); - a.href = config.url + '/search?q=#' + hashtag; + a.href = config.url + '/tags/' + hashtag; a.textContent = '#' + hashtag; a.setAttribute('rel', 'tag'); document.body.appendChild(a); From 2ef78bcd409547956088cfa259c05e3fe85b0da3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 12:21:44 +0900 Subject: [PATCH 240/369] :pizza: --- .../app/desktop/views/components/ui.header.search.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/components/ui.header.search.vue b/src/client/app/desktop/views/components/ui.header.search.vue index 1ed28ba3a8..b6149a1878 100644 --- a/src/client/app/desktop/views/components/ui.header.search.vue +++ b/src/client/app/desktop/views/components/ui.header.search.vue @@ -17,7 +17,11 @@ export default Vue.extend({ }, methods: { onSubmit() { - location.href = `/search?q=${encodeURIComponent(this.q)}`; + if (this.q.startsWith('#')) { + this.$router.push(`/tags/${encodeURIComponent(this.q.substr(1))}`); + } else { + this.$router.push(`/search?q=${encodeURIComponent(this.q)}`); + } } } }); From 20ec4104c6c18c0bffb1cd15b00bd8dd7d75d5c5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 12:22:48 +0900 Subject: [PATCH 241/369] 2.36.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 08316631c2..3387d04e55 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.35.3", - "clientVersion": "1.0.6371", + "version": "2.36.0", + "clientVersion": "1.0.6376", "codename": "nighthike", "main": "./built/index.js", "private": true, From 9d248dbb5ace6b29173f6df1ec484a14f2d22bad Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 12:29:19 +0900 Subject: [PATCH 242/369] :art: --- .../app/desktop/views/components/note-preview.vue | 14 ++++++++++++-- .../app/desktop/views/pages/deck/deck.note.vue | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/client/app/desktop/views/components/note-preview.vue b/src/client/app/desktop/views/components/note-preview.vue index 2599439f09..2a49557247 100644 --- a/src/client/app/desktop/views/components/note-preview.vue +++ b/src/client/app/desktop/views/components/note-preview.vue @@ -1,6 +1,6 @@ <template> <div class="mk-note-preview" :title="title"> - <mk-avatar class="avatar" :user="note.user"/> + <mk-avatar class="avatar" :user="note.user" v-if="!mini"/> <div class="main"> <mk-note-header class="header" :note="note" :mini="true"/> <div class="body"> @@ -15,7 +15,17 @@ import Vue from 'vue'; import dateStringify from '../../../common/scripts/date-stringify'; export default Vue.extend({ - props: ['note'], + props: { + note: { + type: Object, + required: true + }, + mini: { + type: Boolean, + required: false, + default: false + } + }, computed: { title(): string { return dateStringify(this.note.createdAt); diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index bf830b92ef..5a8dc2ea65 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -37,7 +37,7 @@ </div> <a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> <div class="renote" v-if="p.renote"> - <mk-note-preview :note="p.renote"/> + <mk-note-preview :note="p.renote" :mini="true"/> </div> </div> <span class="app" v-if="p.app">via <b>{{ p.app.name }}</b></span> From fd88955696ae8e25474fbbd72c3eed27963e9f58 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 10 Jun 2018 12:36:48 +0900 Subject: [PATCH 243/369] :v: --- locales/ja.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/locales/ja.yml b/locales/ja.yml index 228893e4af..64ee00dba5 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -672,6 +672,11 @@ desktop/views/pages/deck/deck.tl-column.vue: is-media-only: "メディア投稿のみ" is-media-view: "メディアビュー" +desktop/views/pages/deck/deck.note.vue: + reposted-by: "{}がRenote" + private: "この投稿は非公開です" + deleted: "この投稿は削除されました" + desktop/views/pages/welcome.vue: about: "詳しく..." gotit: "わかった" From b60903e2b4e781f9e50250bf7674693036d4b2e4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 00:24:03 +0900 Subject: [PATCH 244/369] :pizza: --- src/db/mongodb.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/db/mongodb.ts b/src/db/mongodb.ts index 0f6d27ca15..05bb72bfde 100644 --- a/src/db/mongodb.ts +++ b/src/db/mongodb.ts @@ -12,10 +12,7 @@ const uri = u && p */ import mongo from 'monk'; -const db = mongo(uri, { - poolSize: 16, - keepAlive: 1 -}); +const db = mongo(uri); export default db; From 96ab0e7b4caee288b605ba2799878f89d0e67429 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 00:27:16 +0900 Subject: [PATCH 245/369] :v: --- src/models/note.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/models/note.ts b/src/models/note.ts index 359d953735..4e2fc5d6be 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -15,8 +15,6 @@ import Following from './following'; const Note = db.get<INote>('notes'); Note.createIndex('uri', { sparse: true, unique: true }); -Note.createIndex('userId'); -Note.createIndex('tags', { sparse: true }); Note.createIndex({ createdAt: -1 }); From 72ab5c143e796c24e2d8aba26da34c12c00cab23 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 01:07:34 +0900 Subject: [PATCH 246/369] Revert ":v:" This reverts commit 96ab0e7b4caee288b605ba2799878f89d0e67429. --- src/models/note.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/models/note.ts b/src/models/note.ts index 4e2fc5d6be..359d953735 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -15,6 +15,8 @@ import Following from './following'; const Note = db.get<INote>('notes'); Note.createIndex('uri', { sparse: true, unique: true }); +Note.createIndex('userId'); +Note.createIndex('tags', { sparse: true }); Note.createIndex({ createdAt: -1 }); From 600482660ba79f07cce03faf0306debee8db3ed1 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 01:12:37 +0900 Subject: [PATCH 247/369] =?UTF-8?q?=E3=82=BF=E3=82=B0=E3=81=AF=E6=9C=80?= =?UTF-8?q?=E5=A4=A7100=E6=96=87=E5=AD=97=E3=81=BE=E3=81=A7=E3=81=AB?= =?UTF-8?q?=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/note/create.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/services/note/create.ts b/src/services/note/create.ts index f820182a42..ddf07716e4 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -94,7 +94,7 @@ export default async (user: IUser, data: { if (data.visibility == null) data.visibility = 'public'; if (data.viaMobile == null) data.viaMobile = false; - const tags = data.tags || []; + let tags = data.tags || []; let tokens: any[] = null; @@ -114,6 +114,8 @@ export default async (user: IUser, data: { }); } + tags = tags.filter(tag => tag.length <= 100); + if (data.visibleUsers) { data.visibleUsers = data.visibleUsers.filter(x => x != null); } From 8baddf2ea3fb32422df88f577a3ffd3064304c9d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 01:14:29 +0900 Subject: [PATCH 248/369] Fix #1695 --- src/client/app/common/views/components/visibility-chooser.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client/app/common/views/components/visibility-chooser.vue b/src/client/app/common/views/components/visibility-chooser.vue index 592367cd6d..cc9c75095e 100644 --- a/src/client/app/common/views/components/visibility-chooser.vue +++ b/src/client/app/common/views/components/visibility-chooser.vue @@ -203,6 +203,7 @@ root(isDark) justify-content center align-items center margin-right 10px + width 16px > *:last-child flex 1 1 auto From f499630c2b146d08c79136e136612019ae9580ec Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 01:28:45 +0900 Subject: [PATCH 249/369] 2.36.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 3387d04e55..5bd36f36f2 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.36.0", - "clientVersion": "1.0.6376", + "version": "2.36.1", + "clientVersion": "1.0.6396", "codename": "nighthike", "main": "./built/index.js", "private": true, From e70fb71a04dcd669509ca0298a22532445aade48 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 02:18:00 +0900 Subject: [PATCH 250/369] Update example.yml --- .config/example.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.config/example.yml b/.config/example.yml index 4772a1f22f..955acfabf6 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -55,3 +55,7 @@ twitter: # インテグレーション用アプリのコンシューマーシークレット consumer_secret: + +# true にすると、リモートのファイルをキャッシュしなくなります(直リンクします)。 +# ストレージ容量を節約することができますが、「リモートメディアを表示しない」設定をオンにしているユーザーは、リモートの画像などは見えなくなります。 +preventCache: false From dc3c80e3cef48bbbb1de2c5d8c6fb462b25de6e0 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 06:48:25 +0900 Subject: [PATCH 251/369] wip --- src/daemons/hashtags-stats-child.ts | 60 +++++++++++++++++++++++++ src/daemons/hashtags-stats.ts | 20 +++++++++ src/{ => daemons}/notes-stats-child.ts | 10 +++-- src/{ => daemons}/notes-stats.ts | 0 src/{ => daemons}/server-stats.ts | 10 ++++- src/index.ts | 6 ++- src/server/api/stream/hashtags-stats.ts | 35 +++++++++++++++ src/server/api/streaming.ts | 6 +++ 8 files changed, 140 insertions(+), 7 deletions(-) create mode 100644 src/daemons/hashtags-stats-child.ts create mode 100644 src/daemons/hashtags-stats.ts rename src/{ => daemons}/notes-stats-child.ts (75%) rename src/{ => daemons}/notes-stats.ts (100%) rename src/{ => daemons}/server-stats.ts (88%) create mode 100644 src/server/api/stream/hashtags-stats.ts diff --git a/src/daemons/hashtags-stats-child.ts b/src/daemons/hashtags-stats-child.ts new file mode 100644 index 0000000000..3f7f4d6e9e --- /dev/null +++ b/src/daemons/hashtags-stats-child.ts @@ -0,0 +1,60 @@ +import Note from '../models/note'; + +// 10分 +const interval = 1000 * 60 * 10; + +async function tick() { + const res = await Note.aggregate([{ + $match: { + createdAt: { + $gt: new Date(Date.now() - interval) + }, + tags: { + $exists: true, + $ne: [] + } + } + }, { + $unwind: '$tags' + }, { + $group: { + _id: '$tags', + count: { + $sum: 1 + } + } + }, { + $group: { + _id: null, + tags: { + $push: { + tag: '$_id', + count: '$count' + } + } + } + }, { + $project: { + _id: false, + tags: true + } + }]) as { + tags: Array<{ + tag: string; + count: number; + }> + }; + + const stats = res.tags + .sort((a, b) => a.count - b.count) + .map(tag => [tag.tag, tag.count]) + .slice(0, 10); + + console.log(stats); + + process.send(stats); +} + +tick(); + +setInterval(tick, interval); diff --git a/src/daemons/hashtags-stats.ts b/src/daemons/hashtags-stats.ts new file mode 100644 index 0000000000..5ed028ac33 --- /dev/null +++ b/src/daemons/hashtags-stats.ts @@ -0,0 +1,20 @@ +import * as childProcess from 'child_process'; +import Xev from 'xev'; + +const ev = new Xev(); + +export default function() { + const log = []; + + const p = childProcess.fork(__dirname + '/hashtags-stats-child.js'); + + p.on('message', stats => { + ev.emit('hashtagsStats', stats); + log.push(stats); + if (log.length > 30) log.shift(); + }); + + ev.on('requestHashTagsStatsLog', id => { + ev.emit('hashtagsStatsLog:' + id, log); + }); +} diff --git a/src/notes-stats-child.ts b/src/daemons/notes-stats-child.ts similarity index 75% rename from src/notes-stats-child.ts rename to src/daemons/notes-stats-child.ts index 5f85a2a3cc..7f54a36bff 100644 --- a/src/notes-stats-child.ts +++ b/src/daemons/notes-stats-child.ts @@ -1,8 +1,8 @@ -import Note from './models/note'; +import Note from '../models/note'; const interval = 5000; -setInterval(async () => { +async function tick() { const [all, local] = await Promise.all([Note.count({ createdAt: { $gte: new Date(Date.now() - interval) @@ -19,4 +19,8 @@ setInterval(async () => { }; process.send(stats); -}, interval); +} + +tick(); + +setInterval(tick, interval); diff --git a/src/notes-stats.ts b/src/daemons/notes-stats.ts similarity index 100% rename from src/notes-stats.ts rename to src/daemons/notes-stats.ts diff --git a/src/server-stats.ts b/src/daemons/server-stats.ts similarity index 88% rename from src/server-stats.ts rename to src/daemons/server-stats.ts index 7b0d4a8576..1403402508 100644 --- a/src/server-stats.ts +++ b/src/daemons/server-stats.ts @@ -5,6 +5,8 @@ import Xev from 'xev'; const ev = new Xev(); +const interval = 1000; + /** * Report server stats regularly */ @@ -15,7 +17,7 @@ export default function() { ev.emit('serverStatsLog:' + id, log); }); - setInterval(() => { + async function tick() { osUtils.cpuUsage(cpuUsage => { const disk = diskusage.checkSync(os.platform() == 'win32' ? 'c:' : '/'); const stats = { @@ -32,5 +34,9 @@ export default function() { log.push(stats); if (log.length > 50) log.shift(); }); - }, 1000); + } + + tick(); + + setInterval(tick, interval); } diff --git a/src/index.ts b/src/index.ts index 4a98b7564c..27c5dd0275 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,8 +17,9 @@ import ProgressBar from './utils/cli/progressbar'; import EnvironmentInfo from './utils/environmentInfo'; import MachineInfo from './utils/machineInfo'; import DependencyInfo from './utils/dependencyInfo'; -import serverStats from './server-stats'; -import notesStats from './notes-stats'; +import serverStats from './daemons/server-stats'; +import notesStats from './daemons/notes-stats'; +import hashtagsStats from './daemons/hashtags-stats'; import loadConfig from './config/load'; import { Config } from './config/types'; @@ -52,6 +53,7 @@ function main() { ev.mount(); serverStats(); notesStats(); + hashtagsStats(); } else { workerMain(opt); } diff --git a/src/server/api/stream/hashtags-stats.ts b/src/server/api/stream/hashtags-stats.ts new file mode 100644 index 0000000000..47183467f5 --- /dev/null +++ b/src/server/api/stream/hashtags-stats.ts @@ -0,0 +1,35 @@ +import * as websocket from 'websocket'; +import Xev from 'xev'; + +const ev = new Xev(); + +export default function(request: websocket.request, connection: websocket.connection): void { + const onStats = stats => { + connection.send(JSON.stringify({ + type: 'stats', + body: stats + })); + }; + + connection.on('message', async data => { + const msg = JSON.parse(data.utf8Data); + + switch (msg.type) { + case 'requestLog': + ev.once('hashtagsStatsLog:' + msg.id, statsLog => { + connection.send(JSON.stringify({ + type: 'statsLog', + body: statsLog + })); + }); + ev.emit('requestHashtagsStatsLog', msg.id); + break; + } + }); + + ev.addListener('hashtagsStats', onStats); + + connection.on('close', () => { + ev.removeListener('hashtagsStats', onStats); + }); +} diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts index 2d4cfc108f..e4156096ef 100644 --- a/src/server/api/streaming.ts +++ b/src/server/api/streaming.ts @@ -14,6 +14,7 @@ import othelloGameStream from './stream/othello-game'; import othelloStream from './stream/othello'; import serverStatsStream from './stream/server-stats'; import notesStatsStream from './stream/notes-stats'; +import hashtagsStatsStream from './stream/hashtags-stats'; import requestsStream from './stream/requests'; import { ParsedUrlQuery } from 'querystring'; import authenticate from './authenticate'; @@ -39,6 +40,11 @@ module.exports = (server: http.Server) => { return; } + if (request.resourceURL.pathname === '/hashtags-stats') { + hashtagsStatsStream(request, connection); + return; + } + if (request.resourceURL.pathname === '/requests') { requestsStream(request, connection); return; From 7518e30dcf73ee9b7b385eb4f5878b77d3ea3cc4 Mon Sep 17 00:00:00 2001 From: otofune <otofune@gmail.com> Date: Mon, 11 Jun 2018 06:40:27 +0900 Subject: [PATCH 252/369] :up: move some packages to devDependencies that non required by server presumed by: - move-to-devdependencies.fish ```fish set targets (ls src | grep -v client | xargs -I'%' echo "src/%") alias from_import="git grep 'import ' $targets | grep -v 'from \'\.' | grep -v 'from \"\.' | cut -d: -f2 | cut -d\; -f1 | rev | cut -d' ' -f1 | rev | cut -d\' -f2 | sort | uniq | grep -v '^readline\$' | grep -v '^zlib\$' | grep -v '^os\$' | grep -v '^http\$' | grep -v '^fs\$' | grep -v '^events\$' | grep -v '^crypto\$' | grep -v '^child_process\$' | grep -v '^cluster\$'`" alias from_require="git grep 'require(' $targets | grep -v '(\'\.' | cut -d= -f2 | grep -v '__dirname' | grep require | cut -d' ' -f2 | cut -d')' -f1 | cut -d'(' -f2 | cut -d'\'' -f2 | sort | uniq | grep -v '^readline\$' | grep -v '^zlib\$' | grep -v '^os\$' | grep -v '^http\$' | grep -v '^fs\$' | grep -v '^events\$' | grep -v '^crypto\$' | grep -v '^child_process\$' | grep -v '^cluster\$'" from_import | xargs npm uninstall --save-dev from_require | xargs npm uninstall --save-dev from_import | xargs npm install --save from_require | xargs npm install --save git show HEAD:require | node revert-pinning-dependencies.js ``` - revert-pinning-dependencies.js ```js const readFromStdin = () => new Promise((resolve, reject) => { const chunks = [] process.stdin.setEncoding('utf8') process.stdin.on('readable', () => { const chunk = process.stdin.read() if (chunk == null) return chunks.push(chunk) }) process.stdin.on('end', () => { return resolve(chunks.join('\n')) }) }) async function main () { const fs = require('fs') const raw = await readFromStdin() const head = JSON.parse(raw) const now = JSON.parse(fs.readFileSync('package.json')) Object.keys(now.dependencies).forEach(key => { now.dependencies[key] = head.dependencies[key] }) fs.writeFileSync('package.json', JSON.stringify(now,null,'\t')) } main().catch(console.error) ``` --- package.json | 122 ++++++++++++++++++++++++++------------------------- 1 file changed, 62 insertions(+), 60 deletions(-) diff --git a/package.json b/package.json index 5bd36f36f2..dd85c21629 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,66 @@ "@fortawesome/fontawesome-free-solid": "5.0.2", "@koa/cors": "2.2.1", "@prezzemolo/rap": "0.1.2", + "autwh": "0.1.0", + "bcryptjs": "2.4.3", + "cafy": "8.0.0", + "chalk": "2.4.1", + "crc-32": "1.2.0", + "debug": "3.1.0", + "deepcopy": "0.6.3", + "diskusage": "0.2.4", + "elasticsearch": "15.0.0", + "emojilib": "2.2.12", + "escape-regexp": "0.0.1", + "file-type": "8.0.0", + "gm": "1.23.1", + "http-signature": "1.2.0", + "is-root": "2.0.0", + "is-url": "1.2.4", + "js-yaml": "3.11.0", + "jsdom": "11.11.0", + "koa": "2.5.1", + "koa-bodyparser": "4.2.1", + "koa-compress": "3.0.0", + "koa-favicon": "2.0.1", + "koa-json-body": "5.3.0", + "koa-logger": "3.2.0", + "koa-mount": "3.0.0", + "koa-multer": "1.0.2", + "koa-router": "7.4.0", + "koa-send": "4.1.3", + "koa-slow": "2.1.0", + "koa-views": "6.1.4", + "kue": "0.11.6", + "mongodb": "3.0.10", + "monk": "6.0.6", + "ms": "2.1.1", + "nopt": "4.0.1", + "os-utils": "0.0.14", + "parse5": "5.0.0", + "prominence": "0.2.0", + "promise-sequential": "1.1.1", + "punycode": "2.1.1", + "qrcode": "1.2.0", + "ratelimiter": "3.0.3", + "recaptcha-promise": "0.1.3", + "reconnecting-websocket": "3.2.2", + "redis": "2.8.0", + "request": "2.87.0", + "request-promise-native": "1.0.5", + "rndstr": "1.0.0", + "speakeasy": "2.0.0", + "summaly": "2.0.6", + "tcp-port-used": "0.1.2", + "tmp": "0.0.33", + "uuid": "3.2.1", + "web-push": "3.3.1", + "webfinger.js": "2.6.6", + "websocket": "1.0.26", + "ws": "5.2.0", + "xev": "2.0.1" + }, + "devDependencies": { "@prezzemolo/zip": "0.0.3", "@types/bcryptjs": "2.4.1", "@types/debug": "0.0.30", @@ -84,30 +144,17 @@ "@types/ws": "5.1.1", "animejs": "2.2.0", "autosize": "4.0.2", - "autwh": "0.1.0", - "bcryptjs": "2.4.3", "bootstrap-vue": "2.0.0-rc.6", - "cafy": "8.0.0", - "chalk": "2.4.1", - "crc-32": "1.2.0", "css-loader": "0.28.11", - "debug": "3.1.0", "deep-equal": "1.0.1", - "deepcopy": "0.6.3", - "diskusage": "0.2.4", "dompurify": "1.0.4", - "elasticsearch": "15.0.0", "element-ui": "2.3.9", - "emojilib": "2.2.12", - "escape-regexp": "0.0.1", "eslint": "4.19.1", "eslint-plugin-vue": "4.5.0", "eventemitter3": "3.1.0", "exif-js": "2.3.0", "file-loader": "1.1.11", - "file-type": "8.0.0", "fuckadblock": "3.2.1", - "gm": "1.23.1", "gulp": "3.9.1", "gulp-cssnano": "2.1.3", "gulp-htmlmin": "4.0.0", @@ -125,71 +172,32 @@ "hard-source-webpack-plugin": "0.6.10", "highlight.js": "9.12.0", "html-minifier": "3.5.16", - "http-signature": "1.2.0", "inquirer": "5.2.0", - "is-root": "2.0.0", - "is-url": "1.2.4", - "js-yaml": "3.11.0", - "jsdom": "11.11.0", - "koa": "2.5.1", - "koa-bodyparser": "4.2.1", - "koa-compress": "3.0.0", - "koa-favicon": "2.0.1", - "koa-json-body": "5.3.0", - "koa-logger": "3.2.0", - "koa-mount": "3.0.0", - "koa-multer": "1.0.2", - "koa-router": "7.4.0", - "koa-send": "4.1.3", - "koa-slow": "2.1.0", - "koa-views": "6.1.4", - "kue": "0.11.6", "license-checker": "20.0.0", "loader-utils": "1.1.0", "mecab-async": "0.1.2", "mkdirp": "0.5.1", "mocha": "5.2.0", "moji": "0.5.1", - "mongodb": "3.0.10", - "monk": "6.0.6", - "ms": "2.1.1", "nan": "2.10.0", "node-sass": "4.9.0", "node-sass-json-importer": "3.2.0", - "nopt": "4.0.1", "nprogress": "0.2.0", "object-assign-deep": "0.4.0", "on-build-webpack": "0.1.0", - "os-utils": "0.0.14", - "parse5": "5.0.0", "progress-bar-webpack-plugin": "1.11.0", - "prominence": "0.2.0", - "promise-sequential": "1.1.1", "pug": "2.0.3", - "punycode": "2.1.1", - "qrcode": "1.2.0", - "ratelimiter": "3.0.3", - "recaptcha-promise": "0.1.3", - "reconnecting-websocket": "3.2.2", - "redis": "2.8.0", - "request": "2.87.0", - "request-promise-native": "1.0.5", "rimraf": "2.6.2", - "rndstr": "1.0.0", "s-age": "1.1.2", "sass-loader": "7.0.1", "seedrandom": "2.4.3", "single-line-log": "1.1.2", - "speakeasy": "2.0.0", "style-loader": "0.21.0", "stylus": "0.54.5", "stylus-loader": "3.0.2", - "summaly": "2.0.6", "swagger-jsdoc": "1.9.7", "syuilo-password-strength": "0.0.1", - "tcp-port-used": "0.1.2", "textarea-caret": "3.1.0", - "tmp": "0.0.33", "ts-loader": "4.3.0", "ts-node": "6.0.4", "tslint": "5.10.0", @@ -197,7 +205,6 @@ "typescript-eslint-parser": "15.0.0", "uglify-es": "3.3.9", "url-loader": "1.0.1", - "uuid": "3.2.1", "v-animate-css": "0.0.2", "vue": "2.5.16", "vue-cropperjs": "2.2.0", @@ -210,12 +217,7 @@ "vuedraggable": "2.16.0", "vuex": "3.0.1", "vuex-persistedstate": "^2.5.4", - "web-push": "3.3.1", - "webfinger.js": "2.6.6", "webpack": "4.9.1", - "webpack-cli": "2.1.4", - "websocket": "1.0.26", - "ws": "5.2.0", - "xev": "2.0.1" + "webpack-cli": "2.1.4" } -} +} \ No newline at end of file From 2ec25a7729e8d2fa6734bdf25ffb5a1b35ca2d5b Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 09:11:32 +0900 Subject: [PATCH 253/369] wip --- .../app/common/views/widgets/hashtags.vue | 97 +++++++++++++++++++ src/client/app/common/views/widgets/index.ts | 2 + .../app/desktop/views/components/home.vue | 1 + .../views/pages/deck/deck.widgets-column.vue | 1 + src/client/app/mobile/views/pages/widgets.vue | 1 + src/index.ts | 2 - src/server/api/endpoints.ts | 5 + src/server/api/endpoints/hashtags/trend.ts | 78 +++++++++++++++ src/server/api/stream/hashtags-stats.ts | 35 ------- src/server/api/streaming.ts | 6 -- 10 files changed, 185 insertions(+), 43 deletions(-) create mode 100644 src/client/app/common/views/widgets/hashtags.vue create mode 100644 src/server/api/endpoints/hashtags/trend.ts delete mode 100644 src/server/api/stream/hashtags-stats.ts diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue new file mode 100644 index 0000000000..0ac62af705 --- /dev/null +++ b/src/client/app/common/views/widgets/hashtags.vue @@ -0,0 +1,97 @@ +<template> +<div class="mkw-hashtags"> + <mk-widget-container :show-header="!props.compact"> + <template slot="header">%fa:hashtag%%i18n:@title%</template> + + <div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'"> + <p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> + <div v-else> + <router-link v-for="stat in stats" :key="stat.tag" :to="`/tags/${ stat.tag }`">{{ stat.tag }}</router-link> + </div> + </div> + </mk-widget-container> +</div> +</template> + +<script lang="ts"> +import define from '../../../common/define-widget'; +export default define({ + name: 'hashtags', + props: () => ({ + compact: false + }) +}).extend({ + data() { + return { + stats: [], + fetching: true, + clock: null + }; + }, + mounted() { + this.fetch(); + this.clock = setInterval(this.fetch, 1000 * 60 * 10); + }, + beforeDestroy() { + clearInterval(this.clock); + }, + methods: { + func() { + this.props.compact = !this.props.compact; + this.save(); + }, + fetch() { + (this as any).api('hashtags/trend').then(stats => { + this.stats = stats; + this.fetching = false; + }); + } + } +}); +</script> + +<style lang="stylus" scoped> +root(isDark) + .mkw-rss--body + .feed + padding 12px 16px + font-size 0.9em + + > a + display block + padding 4px 0 + color isDark ? #9aa4b3 : #666 + border-bottom dashed 1px isDark ? #1c2023 : #eee + + &:last-child + border-bottom none + + .fetching + margin 0 + padding 16px + text-align center + color #aaa + + > [data-fa] + margin-right 4px + + &[data-mobile] + background isDark ? #21242f : #f3f3f3 + + .feed + padding 0 + + > a + padding 8px 16px + border-bottom none + + &:nth-child(even) + background isDark ? rgba(#000, 0.05) : rgba(#fff, 0.7) + +.mkw-rss[data-darkmode] + root(true) + +.mkw-rss:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/common/views/widgets/index.ts b/src/client/app/common/views/widgets/index.ts index 0190393ba7..7d548ef353 100644 --- a/src/client/app/common/views/widgets/index.ts +++ b/src/client/app/common/views/widgets/index.ts @@ -13,6 +13,7 @@ import wSlideshow from './slideshow.vue'; import wTips from './tips.vue'; import wDonation from './donation.vue'; import wNav from './nav.vue'; +import wHashtags from './hashtags.vue'; Vue.component('mkw-analog-clock', wAnalogClock); Vue.component('mkw-nav', wNav); @@ -27,3 +28,4 @@ Vue.component('mkw-posts-monitor', wPostsMonitor); Vue.component('mkw-memo', wMemo); Vue.component('mkw-rss', wRss); Vue.component('mkw-version', wVersion); +Vue.component('mkw-hashtags', wHashtags); diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index cac1fd935b..8774aada63 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -23,6 +23,7 @@ <option value="post-form">%i18n:common.widgets.post-form%</option> <option value="messaging">%i18n:common.widgets.messaging%</option> <option value="memo">%i18n:common.widgets.memo%</option> + <option value="hashtags">%i18n:common.widgets.hashtags%</option> <option value="posts-monitor">%i18n:common.widgets.posts-monitor%</option> <option value="server">%i18n:common.widgets.server%</option> <option value="donation">%i18n:common.widgets.donation%</option> diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue index 2a3a2472dc..a41bf8c3ca 100644 --- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue @@ -23,6 +23,7 @@ <option value="post-form">%i18n:common.widgets.post-form%</option> <option value="messaging">%i18n:common.widgets.messaging%</option> <option value="memo">%i18n:common.widgets.memo%</option> + <option value="hashtags">%i18n:common.widgets.hashtags%</option> <option value="posts-monitor">%i18n:common.widgets.posts-monitor%</option> <option value="server">%i18n:common.widgets.server%</option> <option value="donation">%i18n:common.widgets.donation%</option> diff --git a/src/client/app/mobile/views/pages/widgets.vue b/src/client/app/mobile/views/pages/widgets.vue index ea8580b4d0..294c80e7a0 100644 --- a/src/client/app/mobile/views/pages/widgets.vue +++ b/src/client/app/mobile/views/pages/widgets.vue @@ -15,6 +15,7 @@ <option value="rss">%i18n:common.widgets.rss%</option> <option value="photo-stream">%i18n:common.widgets.photo-stream%</option> <option value="slideshow">%i18n:common.widgets.slideshow%</option> + <option value="hashtags">%i18n:common.widgets.hashtags%</option> <option value="posts-monitor">%i18n:common.widgets.posts-monitor%</option> <option value="version">%i18n:common.widgets.version%</option> <option value="server">%i18n:common.widgets.server%</option> diff --git a/src/index.ts b/src/index.ts index 27c5dd0275..35cf5a243b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -19,7 +19,6 @@ import MachineInfo from './utils/machineInfo'; import DependencyInfo from './utils/dependencyInfo'; import serverStats from './daemons/server-stats'; import notesStats from './daemons/notes-stats'; -import hashtagsStats from './daemons/hashtags-stats'; import loadConfig from './config/load'; import { Config } from './config/types'; @@ -53,7 +52,6 @@ function main() { ev.mount(); serverStats(); notesStats(); - hashtagsStats(); } else { workerMain(opt); } diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts index 91e5298e73..5f0a020d6f 100644 --- a/src/server/api/endpoints.ts +++ b/src/server/api/endpoints.ts @@ -628,6 +628,11 @@ const endpoints: Endpoint[] = [ withCredential: true }, + { + name: 'hashtags/trend', + withCredential: true + }, + { name: 'messaging/history', withCredential: true, diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts new file mode 100644 index 0000000000..3b95e1fa4c --- /dev/null +++ b/src/server/api/endpoints/hashtags/trend.ts @@ -0,0 +1,78 @@ +import Note from '../../../../models/note'; + +/** + * Get trends of hashtags + */ +module.exports = (params, user) => new Promise(async (res, rej) => { + // 10分 + const interval = 1000 * 60 * 10; + + const data = await Note.aggregate([{ + $match: { + createdAt: { + $gt: new Date(Date.now() - interval) + }, + tags: { + $exists: true, + $ne: [] + } + } + }, { + $unwind: '$tags' + }, { + $group: { + _id: '$tags', + count: { + $sum: 1 + } + } + }, { + $group: { + _id: null, + tags: { + $push: { + tag: '$_id', + count: '$count' + } + } + } + }, { + $project: { + _id: false, + tags: true + } + }]) as Array<{ + tags: Array<{ + tag: string; + count: number; + }> + }>; + + const hots = data[0].tags + .sort((a, b) => a.count - b.count) + .map(tag => tag.tag) + .slice(0, 10); + + const countPromises: Array<Promise<number[]>> = []; + + for (let i = 0; i < 10; i++) { + countPromises.push(Promise.all(hots.map(tag => Note.count({ + tags: tag, + createdAt: { + $lt: new Date(Date.now() - (interval * i)), + $gt: new Date(Date.now() - (interval * (i + 1))) + } + })))); + } + + const countsLog = await Promise.all(countPromises); + + const stats = hots.map((tag, i) => ({ + tag, + chart: countsLog.map(counts => counts[i]) + })); + + console.log(stats); + + res(stats); +}); diff --git a/src/server/api/stream/hashtags-stats.ts b/src/server/api/stream/hashtags-stats.ts deleted file mode 100644 index 47183467f5..0000000000 --- a/src/server/api/stream/hashtags-stats.ts +++ /dev/null @@ -1,35 +0,0 @@ -import * as websocket from 'websocket'; -import Xev from 'xev'; - -const ev = new Xev(); - -export default function(request: websocket.request, connection: websocket.connection): void { - const onStats = stats => { - connection.send(JSON.stringify({ - type: 'stats', - body: stats - })); - }; - - connection.on('message', async data => { - const msg = JSON.parse(data.utf8Data); - - switch (msg.type) { - case 'requestLog': - ev.once('hashtagsStatsLog:' + msg.id, statsLog => { - connection.send(JSON.stringify({ - type: 'statsLog', - body: statsLog - })); - }); - ev.emit('requestHashtagsStatsLog', msg.id); - break; - } - }); - - ev.addListener('hashtagsStats', onStats); - - connection.on('close', () => { - ev.removeListener('hashtagsStats', onStats); - }); -} diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts index e4156096ef..2d4cfc108f 100644 --- a/src/server/api/streaming.ts +++ b/src/server/api/streaming.ts @@ -14,7 +14,6 @@ import othelloGameStream from './stream/othello-game'; import othelloStream from './stream/othello'; import serverStatsStream from './stream/server-stats'; import notesStatsStream from './stream/notes-stats'; -import hashtagsStatsStream from './stream/hashtags-stats'; import requestsStream from './stream/requests'; import { ParsedUrlQuery } from 'querystring'; import authenticate from './authenticate'; @@ -40,11 +39,6 @@ module.exports = (server: http.Server) => { return; } - if (request.resourceURL.pathname === '/hashtags-stats') { - hashtagsStatsStream(request, connection); - return; - } - if (request.resourceURL.pathname === '/requests') { requestsStream(request, connection); return; From 7d7193cb63ac8811152707a6896e5cf7ae05258c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 11:24:29 +0900 Subject: [PATCH 254/369] :v: --- locales/ja.yml | 3 + .../common/views/widgets/hashtags.chart.vue | 78 +++++++++++++++++++ .../app/common/views/widgets/hashtags.vue | 57 +++++++------- src/server/api/endpoints/hashtags/trend.ts | 12 ++- 4 files changed, 119 insertions(+), 31 deletions(-) create mode 100644 src/client/app/common/views/widgets/hashtags.chart.vue diff --git a/locales/ja.yml b/locales/ja.yml index 64ee00dba5..da751c9e39 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -254,6 +254,9 @@ common/views/widgets/posts-monitor.vue: title: "投稿チャート" toggle: "表示を切り替え" +common/views/widgets/hashtags.vue: + title: "ハッシュタグ" + common/views/widgets/server.vue: title: "サーバー情報" toggle: "表示を切り替え" diff --git a/src/client/app/common/views/widgets/hashtags.chart.vue b/src/client/app/common/views/widgets/hashtags.chart.vue new file mode 100644 index 0000000000..19b56ef283 --- /dev/null +++ b/src/client/app/common/views/widgets/hashtags.chart.vue @@ -0,0 +1,78 @@ +<template> +<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`"> + <defs> + <linearGradient :id="gradientId" x1="0" x2="0" y1="1" y2="0"> + <stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop> + <stop offset="100%" stop-color="hsl(90, 80%, 70%)"></stop> + </linearGradient> + <mask :id="maskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY"> + <polygon + :points="polygonPoints" + fill="#fff" + fill-opacity="0.5"/> + <polyline + :points="polylinePoints" + fill="none" + stroke="#fff" + stroke-width="0.7"/> + <circle + :cx="headX" + :cy="headY" + r="1.2" + fill="#fff"/> + </mask> + </defs> + <rect + x="-2" y="-2" + :width="viewBoxX + 4" :height="viewBoxY + 4" + :style="`stroke: none; fill: url(#${ gradientId }); mask: url(#${ maskId })`"/> +</svg> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import * as uuid from 'uuid'; + +export default Vue.extend({ + props: { + src: { + type: Array, + required: true + } + }, + data() { + return { + viewBoxX: 50, + viewBoxY: 30, + gradientId: uuid(), + maskId: uuid(), + polylinePoints: '', + polygonPoints: '', + headX: null, + headY: null + }; + }, + watch: { + src() { + this.draw(); + } + }, + created() { + this.draw(); + }, + methods: { + draw() { + const stats = this.src.slice().reverse(); + const peak = Math.max.apply(null, stats) || 1; + + const polylinePoints = stats.map((x, i) => [this.viewBoxX - ((stats.length - 1) - i), (1 - (x / peak)) * this.viewBoxY]); + this.polylinePoints = polylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' '); + + this.polygonPoints = `${this.viewBoxX - (stats.length - 1)},${ this.viewBoxY } ${ this.polylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`; + + this.headX = polylinePoints[polylinePoints.length - 1][0]; + this.headY = polylinePoints[polylinePoints.length - 1][1]; + } + } +}); +</script> diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue index 0ac62af705..c4647ee0f9 100644 --- a/src/client/app/common/views/widgets/hashtags.vue +++ b/src/client/app/common/views/widgets/hashtags.vue @@ -6,7 +6,12 @@ <div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'"> <p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> <div v-else> - <router-link v-for="stat in stats" :key="stat.tag" :to="`/tags/${ stat.tag }`">{{ stat.tag }}</router-link> + <div v-for="stat in stats" :key="stat.tag"> + <div class="tag"> + <router-link :to="`/tags/${ stat.tag }`">#{{ stat.tag }}</router-link> + </div> + <x-chart class="chart" :src="stat.chart"/> + </div> </div> </div> </mk-widget-container> @@ -15,12 +20,17 @@ <script lang="ts"> import define from '../../../common/define-widget'; +import XChart from './hashtags.chart.vue'; + export default define({ name: 'hashtags', props: () => ({ compact: false }) }).extend({ + components: { + XChart + }, data() { return { stats: [], @@ -52,21 +62,8 @@ export default define({ <style lang="stylus" scoped> root(isDark) - .mkw-rss--body - .feed - padding 12px 16px - font-size 0.9em - - > a - display block - padding 4px 0 - color isDark ? #9aa4b3 : #666 - border-bottom dashed 1px isDark ? #1c2023 : #eee - - &:last-child - border-bottom none - - .fetching + .mkw-hashtags--body + > .fetching margin 0 padding 16px text-align center @@ -75,23 +72,29 @@ root(isDark) > [data-fa] margin-right 4px - &[data-mobile] - background isDark ? #21242f : #f3f3f3 + > div + > div + display flex + align-items center + padding 16px - .feed - padding 0 + &:not(:last-child) + border-bottom solid 1px #393f4f - > a - padding 8px 16px - border-bottom none + > .tag + flex 1 - &:nth-child(even) - background isDark ? rgba(#000, 0.05) : rgba(#fff, 0.7) + > a + color #9baec8 -.mkw-rss[data-darkmode] + > .chart + width 50px + height 30px + +.mkw-hashtags[data-darkmode] root(true) -.mkw-rss:not([data-darkmode]) +.mkw-hashtags:not([data-darkmode]) root(false) </style> diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts index 3b95e1fa4c..6a49fec3d8 100644 --- a/src/server/api/endpoints/hashtags/trend.ts +++ b/src/server/api/endpoints/hashtags/trend.ts @@ -4,13 +4,10 @@ import Note from '../../../../models/note'; * Get trends of hashtags */ module.exports = (params, user) => new Promise(async (res, rej) => { - // 10分 - const interval = 1000 * 60 * 10; - const data = await Note.aggregate([{ $match: { createdAt: { - $gt: new Date(Date.now() - interval) + $gt: new Date(Date.now() - 1000 * 60 * 60) }, tags: { $exists: true, @@ -48,6 +45,10 @@ module.exports = (params, user) => new Promise(async (res, rej) => { }> }>; + if (data.length == 0) { + return res([]); + } + const hots = data[0].tags .sort((a, b) => a.count - b.count) .map(tag => tag.tag) @@ -56,6 +57,9 @@ module.exports = (params, user) => new Promise(async (res, rej) => { const countPromises: Array<Promise<number[]>> = []; for (let i = 0; i < 10; i++) { + // 10分 + const interval = 1000 * 60 * 10; + countPromises.push(Promise.all(hots.map(tag => Note.count({ tags: tag, createdAt: { From 7cca509eb303813057e27a95a9e4883eca8c0fcd Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 11:27:21 +0900 Subject: [PATCH 255/369] :v: --- src/server/api/endpoints/hashtags/trend.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts index 6a49fec3d8..c888a6cbb5 100644 --- a/src/server/api/endpoints/hashtags/trend.ts +++ b/src/server/api/endpoints/hashtags/trend.ts @@ -50,7 +50,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => { } const hots = data[0].tags - .sort((a, b) => a.count - b.count) + .sort((a, b) => b.count - a.count) .map(tag => tag.tag) .slice(0, 10); @@ -76,7 +76,5 @@ module.exports = (params, user) => new Promise(async (res, rej) => { chart: countsLog.map(counts => counts[i]) })); - console.log(stats); - res(stats); }); From df9cb7cf6ebd51612531c2c85e8ba2d2260ded30 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 11:44:26 +0900 Subject: [PATCH 256/369] 2.37.0 --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index dd85c21629..7a297bb9a8 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.36.1", - "clientVersion": "1.0.6396", + "version": "2.37.0", + "clientVersion": "1.0.6419", "codename": "nighthike", "main": "./built/index.js", "private": true, @@ -220,4 +220,4 @@ "webpack": "4.9.1", "webpack-cli": "2.1.4" } -} \ No newline at end of file +} From da612ef789c4c3a64c869fbba75e0db66fe17e27 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 11:45:10 +0900 Subject: [PATCH 257/369] :v: --- locales/ja.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/locales/ja.yml b/locales/ja.yml index da751c9e39..4ce8caaa18 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -76,6 +76,7 @@ common: donation: "寄付のお願い" nav: "ナビゲーション" tips: "ヒント" + hashtags: "ハッシュタグ" deck: widgets: "ウィジェット" From c0a3ae26121506d75d02c484db67fe0cc5bf1971 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 11:45:27 +0900 Subject: [PATCH 258/369] 2.37.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7a297bb9a8..4d0cdf8cf7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.37.0", + "version": "2.37.1", "clientVersion": "1.0.6419", "codename": "nighthike", "main": "./built/index.js", From c3e375e8a54ccfd164a95ef642ec43eeac77c727 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 12:52:47 +0900 Subject: [PATCH 259/369] :v: --- .../common/views/widgets/hashtags.chart.vue | 18 +++++++++++------- .../app/common/views/widgets/hashtags.vue | 6 +++--- src/server/api/endpoints/hashtags/trend.ts | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/client/app/common/views/widgets/hashtags.chart.vue b/src/client/app/common/views/widgets/hashtags.chart.vue index 19b56ef283..b435188616 100644 --- a/src/client/app/common/views/widgets/hashtags.chart.vue +++ b/src/client/app/common/views/widgets/hashtags.chart.vue @@ -1,5 +1,5 @@ <template> -<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`"> +<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" style="overflow:visible"> <defs> <linearGradient :id="gradientId" x1="0" x2="0" y1="1" y2="0"> <stop offset="0%" stop-color="hsl(200, 80%, 70%)"></stop> @@ -14,17 +14,17 @@ :points="polylinePoints" fill="none" stroke="#fff" - stroke-width="0.7"/> + stroke-width="2"/> <circle :cx="headX" :cy="headY" - r="1.2" + r="3" fill="#fff"/> </mask> </defs> <rect - x="-2" y="-2" - :width="viewBoxX + 4" :height="viewBoxY + 4" + x="-10" y="-10" + :width="viewBoxX + 20" :height="viewBoxY + 20" :style="`stroke: none; fill: url(#${ gradientId }); mask: url(#${ maskId })`"/> </svg> </template> @@ -65,10 +65,14 @@ export default Vue.extend({ const stats = this.src.slice().reverse(); const peak = Math.max.apply(null, stats) || 1; - const polylinePoints = stats.map((x, i) => [this.viewBoxX - ((stats.length - 1) - i), (1 - (x / peak)) * this.viewBoxY]); + const polylinePoints = stats.map((n, i) => [ + i * (this.viewBoxX / (stats.length - 1)), + (1 - (n / peak)) * this.viewBoxY + ]); + this.polylinePoints = polylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' '); - this.polygonPoints = `${this.viewBoxX - (stats.length - 1)},${ this.viewBoxY } ${ this.polylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`; + this.polygonPoints = `0,${ this.viewBoxY } ${ this.polylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`; this.headX = polylinePoints[polylinePoints.length - 1][0]; this.headY = polylinePoints[polylinePoints.length - 1][1]; diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue index c4647ee0f9..9d523f321f 100644 --- a/src/client/app/common/views/widgets/hashtags.vue +++ b/src/client/app/common/views/widgets/hashtags.vue @@ -79,16 +79,16 @@ root(isDark) padding 16px &:not(:last-child) - border-bottom solid 1px #393f4f + border-bottom solid 1px isDark ? #393f4f : #eee > .tag flex 1 > a - color #9baec8 + font-size 14px + color isDark ? #9baec8 : #65727b > .chart - width 50px height 30px .mkw-hashtags[data-darkmode] diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts index c888a6cbb5..443d7d2034 100644 --- a/src/server/api/endpoints/hashtags/trend.ts +++ b/src/server/api/endpoints/hashtags/trend.ts @@ -52,7 +52,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => { const hots = data[0].tags .sort((a, b) => b.count - a.count) .map(tag => tag.tag) - .slice(0, 10); + .slice(0, 5); const countPromises: Array<Promise<number[]>> = []; From 6f724827bd5f54d2eeea222f52af8c178e1198da Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 13:45:32 +0900 Subject: [PATCH 260/369] :v: --- locales/ja.yml | 1 + .../app/common/views/widgets/hashtags.vue | 11 ++- src/server/api/endpoints/hashtags/trend.ts | 69 ++++++++++--------- 3 files changed, 48 insertions(+), 33 deletions(-) diff --git a/locales/ja.yml b/locales/ja.yml index 4ce8caaa18..1b4fc15071 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -257,6 +257,7 @@ common/views/widgets/posts-monitor.vue: common/views/widgets/hashtags.vue: title: "ハッシュタグ" + count: "{}人が投稿" common/views/widgets/server.vue: title: "サーバー情報" diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue index 9d523f321f..f6fd091b79 100644 --- a/src/client/app/common/views/widgets/hashtags.vue +++ b/src/client/app/common/views/widgets/hashtags.vue @@ -9,6 +9,7 @@ <div v-for="stat in stats" :key="stat.tag"> <div class="tag"> <router-link :to="`/tags/${ stat.tag }`">#{{ stat.tag }}</router-link> + <p>{{ '%i18n:@count%'.replace('{}', stat.usersCount) }}</p> </div> <x-chart class="chart" :src="stat.chart"/> </div> @@ -83,10 +84,16 @@ root(isDark) > .tag flex 1 + font-size 14px + color isDark ? #9baec8 : #65727b > a - font-size 14px - color isDark ? #9baec8 : #65727b + color inherit + + > p + margin 0 + font-size 75% + opacity 0.7 > .chart height 30px diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts index 443d7d2034..07317d1db2 100644 --- a/src/server/api/endpoints/hashtags/trend.ts +++ b/src/server/api/endpoints/hashtags/trend.ts @@ -18,49 +18,48 @@ module.exports = (params, user) => new Promise(async (res, rej) => { $unwind: '$tags' }, { $group: { - _id: '$tags', - count: { - $sum: 1 - } - } - }, { - $group: { - _id: null, - tags: { - $push: { - tag: '$_id', - count: '$count' - } - } - } - }, { - $project: { - _id: false, - tags: true + _id: { tags: '$tags', userId: '$userId' } } }]) as Array<{ - tags: Array<{ - tag: string; - count: number; - }> + _id: { + tags: string; + userId: any; + } }>; if (data.length == 0) { return res([]); } - const hots = data[0].tags + const tags = []; + + data.map(x => x._id).forEach(x => { + const i = tags.findIndex(tag => tag.name == x.tags); + if (i != -1) { + tags[i].count++; + } else { + tags.push({ + name: x.tags, + count: 1 + }); + } + }); + + const hots = tags .sort((a, b) => b.count - a.count) - .map(tag => tag.tag) + .map(tag => tag.name) .slice(0, 5); - const countPromises: Array<Promise<number[]>> = []; + const countPromises: Array<Promise<any[]>> = []; - for (let i = 0; i < 10; i++) { - // 10分 - const interval = 1000 * 60 * 10; + const range = 20; - countPromises.push(Promise.all(hots.map(tag => Note.count({ + // 10分 + const interval = 1000 * 60 * 10; + + for (let i = 0; i < range; i++) { + + countPromises.push(Promise.all(hots.map(tag => Note.distinct('userId', { tags: tag, createdAt: { $lt: new Date(Date.now() - (interval * i)), @@ -71,9 +70,17 @@ module.exports = (params, user) => new Promise(async (res, rej) => { const countsLog = await Promise.all(countPromises); + const totalCounts: any = await Promise.all(hots.map(tag => Note.distinct('userId', { + tags: tag, + createdAt: { + $gt: new Date(Date.now() - (interval * range)) + } + }))); + const stats = hots.map((tag, i) => ({ tag, - chart: countsLog.map(counts => counts[i]) + chart: countsLog.map(counts => counts[i].length), + usersCount: totalCounts[i].length })); res(stats); From ebd189fb2740c3ce2f0d87a2078b1293c9d65e55 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 13:46:23 +0900 Subject: [PATCH 261/369] :pizza: --- src/client/app/common/views/widgets/hashtags.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue index f6fd091b79..74b5b76479 100644 --- a/src/client/app/common/views/widgets/hashtags.vue +++ b/src/client/app/common/views/widgets/hashtags.vue @@ -66,7 +66,7 @@ root(isDark) .mkw-hashtags--body > .fetching margin 0 - padding 16px + padding 12px 16px text-align center color #aaa From 36215d50bd5393e039183bcf822e38bcbd02a037 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 13:48:07 +0900 Subject: [PATCH 262/369] 2.37.2 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4d0cdf8cf7..2ba4c7fc34 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.37.1", - "clientVersion": "1.0.6419", + "version": "2.37.2", + "clientVersion": "1.0.6437", "codename": "nighthike", "main": "./built/index.js", "private": true, From b87e7e50b6c1064319564b459f4456a3bb83da72 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 13:49:53 +0900 Subject: [PATCH 263/369] Clean up --- src/server/api/endpoints/hashtags/trend.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts index 07317d1db2..faf4e582fa 100644 --- a/src/server/api/endpoints/hashtags/trend.ts +++ b/src/server/api/endpoints/hashtags/trend.ts @@ -3,7 +3,7 @@ import Note from '../../../../models/note'; /** * Get trends of hashtags */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = () => new Promise(async (res, rej) => { const data = await Note.aggregate([{ $match: { createdAt: { @@ -58,7 +58,6 @@ module.exports = (params, user) => new Promise(async (res, rej) => { const interval = 1000 * 60 * 10; for (let i = 0; i < range; i++) { - countPromises.push(Promise.all(hots.map(tag => Note.distinct('userId', { tags: tag, createdAt: { From e0f847e539455187b5f72bb68e89e6b97d7377f3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 14:06:23 +0900 Subject: [PATCH 264/369] :v: --- src/client/app/common/views/widgets/hashtags.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue index 74b5b76479..809f87f6f2 100644 --- a/src/client/app/common/views/widgets/hashtags.vue +++ b/src/client/app/common/views/widgets/hashtags.vue @@ -41,7 +41,7 @@ export default define({ }, mounted() { this.fetch(); - this.clock = setInterval(this.fetch, 1000 * 60 * 10); + this.clock = setInterval(this.fetch, 1000 * 60); }, beforeDestroy() { clearInterval(this.clock); From bb53db905f8765c0e0faa0fa69e71ba5bcee799e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 14:16:21 +0900 Subject: [PATCH 265/369] :v: --- src/client/app/common/views/widgets/hashtags.vue | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue index 809f87f6f2..8c9ca5d419 100644 --- a/src/client/app/common/views/widgets/hashtags.vue +++ b/src/client/app/common/views/widgets/hashtags.vue @@ -8,7 +8,7 @@ <div v-else> <div v-for="stat in stats" :key="stat.tag"> <div class="tag"> - <router-link :to="`/tags/${ stat.tag }`">#{{ stat.tag }}</router-link> + <router-link :to="`/tags/${ stat.tag }`" :title="stat.tag">#{{ stat.tag }}</router-link> <p>{{ '%i18n:@count%'.replace('{}', stat.usersCount) }}</p> </div> <x-chart class="chart" :src="stat.chart"/> @@ -84,10 +84,16 @@ root(isDark) > .tag flex 1 + overflow hidden font-size 14px color isDark ? #9baec8 : #65727b > a + display block + width 100% + white-space nowrap + overflow hidden + text-overflow ellipsis color inherit > p From 91db24fcfc942983e11e6d14ddc89597da4f6648 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 11 Jun 2018 14:16:46 +0900 Subject: [PATCH 266/369] 2.37.3 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2ba4c7fc34..5ef951a875 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.37.2", - "clientVersion": "1.0.6437", + "version": "2.37.3", + "clientVersion": "1.0.6453", "codename": "nighthike", "main": "./built/index.js", "private": true, From 90337adbbcd5dff8ff23ec353ffca51b9a4b48ca Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 01:41:17 +0900 Subject: [PATCH 267/369] Improve hashtag trend detection --- src/server/api/endpoints/hashtags/trend.ts | 37 ++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts index faf4e582fa..170580dd80 100644 --- a/src/server/api/endpoints/hashtags/trend.ts +++ b/src/server/api/endpoints/hashtags/trend.ts @@ -1,13 +1,23 @@ import Note from '../../../../models/note'; +/* +トレンドに載るためには「『直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上』のハッシュタグの上位5位以内に入る」ことが必要 +ユニーク投稿数とはそのハッシュタグと投稿ユーザーのペアのカウントで、例えば同じユーザーが複数回同じハッシュタグを投稿してもそのハッシュタグのユニーク投稿数は1とカウントされる +*/ + +const rangeA = 1000 * 60 * 10; // 10分 +const rangeB = 1000 * 60 * 60; // 1時間 +const coefficient = 2; // 「n倍」の部分 + /** * Get trends of hashtags */ module.exports = () => new Promise(async (res, rej) => { + //#region 1. 直近Aの内に投稿されたハッシュタグ(とユーザーのペア)を集計 const data = await Note.aggregate([{ $match: { createdAt: { - $gt: new Date(Date.now() - 1000 * 60 * 60) + $gt: new Date(Date.now() - rangeA) }, tags: { $exists: true, @@ -26,6 +36,7 @@ module.exports = () => new Promise(async (res, rej) => { userId: any; } }>; + //#endregion if (data.length == 0) { return res([]); @@ -33,6 +44,7 @@ module.exports = () => new Promise(async (res, rej) => { const tags = []; + // カウント data.map(x => x._id).forEach(x => { const i = tags.findIndex(tag => tag.name == x.tags); if (i != -1) { @@ -45,11 +57,31 @@ module.exports = () => new Promise(async (res, rej) => { } }); - const hots = tags + //#region 2. 1で取得したそれぞれのタグについて、「直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上」かどうかを判定する + const hotsPromises = tags.map(async tag => { + const passedCount = (await Note.distinct('userId', { + tags: tag, + createdAt: { + $lt: new Date(Date.now() - rangeA), + $gt: new Date(Date.now() - rangeB) + } + }) as any).length; + + if (passedCount > (tag.count * coefficient)) { + return tag; + } else { + return null; + } + }); + //#endregion + + const hots = (await Promise.all(hotsPromises)) + .filter(x => x != null) .sort((a, b) => b.count - a.count) .map(tag => tag.name) .slice(0, 5); + //#region 2で話題と判定されたタグそれぞれについて過去の投稿数グラフを取得する const countPromises: Array<Promise<any[]>> = []; const range = 20; @@ -75,6 +107,7 @@ module.exports = () => new Promise(async (res, rej) => { $gt: new Date(Date.now() - (interval * range)) } }))); + //#endregion const stats = hots.map((tag, i) => ({ tag, From c61050244e5e84833688c1aaaea1ebc3be5e72f4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 01:43:56 +0900 Subject: [PATCH 268/369] =?UTF-8?q?=E5=A4=89=E6=95=B0=E8=AA=BF=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/api/endpoints/hashtags/trend.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts index 170580dd80..257718014d 100644 --- a/src/server/api/endpoints/hashtags/trend.ts +++ b/src/server/api/endpoints/hashtags/trend.ts @@ -6,8 +6,8 @@ import Note from '../../../../models/note'; */ const rangeA = 1000 * 60 * 10; // 10分 -const rangeB = 1000 * 60 * 60; // 1時間 -const coefficient = 2; // 「n倍」の部分 +const rangeB = 1000 * 60 * 40; // 40分 +const coefficient = 1.5; // 「n倍」の部分 /** * Get trends of hashtags From 944f9524e2dcd327ca1cb1eea6dc31eb75cbaddb Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 01:45:58 +0900 Subject: [PATCH 269/369] Fix bug --- src/server/api/endpoints/hashtags/trend.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts index 257718014d..3ad143aaf0 100644 --- a/src/server/api/endpoints/hashtags/trend.ts +++ b/src/server/api/endpoints/hashtags/trend.ts @@ -60,7 +60,7 @@ module.exports = () => new Promise(async (res, rej) => { //#region 2. 1で取得したそれぞれのタグについて、「直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上」かどうかを判定する const hotsPromises = tags.map(async tag => { const passedCount = (await Note.distinct('userId', { - tags: tag, + tags: tag.name, createdAt: { $lt: new Date(Date.now() - rangeA), $gt: new Date(Date.now() - rangeB) From f90e9596d48827c9f290a7f139e610fabc1308ad Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 01:48:29 +0900 Subject: [PATCH 270/369] Fix bug --- src/server/api/endpoints/hashtags/trend.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts index 3ad143aaf0..91fbd2f9fd 100644 --- a/src/server/api/endpoints/hashtags/trend.ts +++ b/src/server/api/endpoints/hashtags/trend.ts @@ -67,7 +67,7 @@ module.exports = () => new Promise(async (res, rej) => { } }) as any).length; - if (passedCount > (tag.count * coefficient)) { + if (tag.count > (passedCount * coefficient)) { return tag; } else { return null; From 03fbae7b6d6125b6901734768da185d66f923199 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 01:51:51 +0900 Subject: [PATCH 271/369] =?UTF-8?q?=E5=A4=89=E6=95=B0=E8=AA=BF=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/api/endpoints/hashtags/trend.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts index 91fbd2f9fd..43048c1c9f 100644 --- a/src/server/api/endpoints/hashtags/trend.ts +++ b/src/server/api/endpoints/hashtags/trend.ts @@ -5,8 +5,8 @@ import Note from '../../../../models/note'; ユニーク投稿数とはそのハッシュタグと投稿ユーザーのペアのカウントで、例えば同じユーザーが複数回同じハッシュタグを投稿してもそのハッシュタグのユニーク投稿数は1とカウントされる */ -const rangeA = 1000 * 60 * 10; // 10分 -const rangeB = 1000 * 60 * 40; // 40分 +const rangeA = 1000 * 60 * 30; // 30分 +const rangeB = 1000 * 60 * 120; // 2時間 const coefficient = 1.5; // 「n倍」の部分 /** From ebde84214e57eb5a3af9f28a6671710d78232bfd Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 02:00:05 +0900 Subject: [PATCH 272/369] Improve hashtag trend detection --- src/server/api/endpoints/hashtags/trend.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts index 43048c1c9f..efd74a21e0 100644 --- a/src/server/api/endpoints/hashtags/trend.ts +++ b/src/server/api/endpoints/hashtags/trend.ts @@ -8,6 +8,7 @@ import Note from '../../../../models/note'; const rangeA = 1000 * 60 * 30; // 30分 const rangeB = 1000 * 60 * 120; // 2時間 const coefficient = 1.5; // 「n倍」の部分 +const requiredUsers = 3; // 最低何人がそのタグを投稿している必要があるか /** * Get trends of hashtags @@ -42,7 +43,7 @@ module.exports = () => new Promise(async (res, rej) => { return res([]); } - const tags = []; + let tags = []; // カウント data.map(x => x._id).forEach(x => { @@ -57,6 +58,9 @@ module.exports = () => new Promise(async (res, rej) => { } }); + // 最低要求投稿者数を下回るならカットする + tags = tags.filter(tag => tag.count >= requiredUsers); + //#region 2. 1で取得したそれぞれのタグについて、「直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上」かどうかを判定する const hotsPromises = tags.map(async tag => { const passedCount = (await Note.distinct('userId', { From bbfccb0bbfbe4720e1df11559172f369c085c56d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 02:03:18 +0900 Subject: [PATCH 273/369] :art: --- src/client/app/common/views/widgets/hashtags.vue | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue index 8c9ca5d419..1f1e6ceb52 100644 --- a/src/client/app/common/views/widgets/hashtags.vue +++ b/src/client/app/common/views/widgets/hashtags.vue @@ -5,7 +5,7 @@ <div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'"> <p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> - <div v-else> + <transition-group v-else tag="div" name="chart"> <div v-for="stat in stats" :key="stat.tag"> <div class="tag"> <router-link :to="`/tags/${ stat.tag }`" :title="stat.tag">#{{ stat.tag }}</router-link> @@ -13,7 +13,7 @@ </div> <x-chart class="chart" :src="stat.chart"/> </div> - </div> + </transition-group> </div> </mk-widget-container> </div> @@ -74,6 +74,14 @@ root(isDark) margin-right 4px > div + .chart-enter + .chart-leave-to + opacity 0 + transform translateY(-30px) + + > * + transition transform .3s ease, opacity .3s ease + > div display flex align-items center From 2e680c3d1e0ab3f3beb0aa5d62483267c75d99e3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 02:18:29 +0900 Subject: [PATCH 274/369] Fix bug --- src/client/app/common/views/widgets/hashtags.chart.vue | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/client/app/common/views/widgets/hashtags.chart.vue b/src/client/app/common/views/widgets/hashtags.chart.vue index b435188616..723a3947f8 100644 --- a/src/client/app/common/views/widgets/hashtags.chart.vue +++ b/src/client/app/common/views/widgets/hashtags.chart.vue @@ -49,7 +49,8 @@ export default Vue.extend({ polylinePoints: '', polygonPoints: '', headX: null, - headY: null + headY: null, + clock: null }; }, watch: { @@ -59,6 +60,12 @@ export default Vue.extend({ }, created() { this.draw(); + + // Vueが何故かWatchを発動させない場合があるので + this.clock = setInterval(this.draw, 1000); + }, + beforeDestroy() { + clearInterval(this.clock); }, methods: { draw() { From 2fcc3bb1eaf067411928432e59bc5303e5249af2 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 02:19:00 +0900 Subject: [PATCH 275/369] 2.37.4 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5ef951a875..843bab6880 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.37.3", - "clientVersion": "1.0.6453", + "version": "2.37.4", + "clientVersion": "1.0.6465", "codename": "nighthike", "main": "./built/index.js", "private": true, From d8ff37fc456eb1122361d74863273bd4b66ecf79 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 02:28:28 +0900 Subject: [PATCH 276/369] :v: --- locales/ja.yml | 1 + src/client/app/common/views/widgets/hashtags.vue | 2 ++ 2 files changed, 3 insertions(+) diff --git a/locales/ja.yml b/locales/ja.yml index 1b4fc15071..ed0691ea50 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -258,6 +258,7 @@ common/views/widgets/posts-monitor.vue: common/views/widgets/hashtags.vue: title: "ハッシュタグ" count: "{}人が投稿" + empty: "トレンドなし" common/views/widgets/server.vue: title: "サーバー情報" diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue index 1f1e6ceb52..9dae7661ab 100644 --- a/src/client/app/common/views/widgets/hashtags.vue +++ b/src/client/app/common/views/widgets/hashtags.vue @@ -5,6 +5,7 @@ <div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'"> <p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> + <p class="empty" v-else-if="stats.length == 0">%fa:exclamation-circle%%i18n:@empty%<mk-ellipsis/></p> <transition-group v-else tag="div" name="chart"> <div v-for="stat in stats" :key="stat.tag"> <div class="tag"> @@ -65,6 +66,7 @@ export default define({ root(isDark) .mkw-hashtags--body > .fetching + > .empty margin 0 padding 12px 16px text-align center From ed67e3506b5244e1b79cbb8b5de6951ff9592e42 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 02:46:54 +0900 Subject: [PATCH 277/369] :v: --- .../app/common/views/widgets/hashtags.vue | 2 +- src/server/api/endpoints/hashtags/trend.ts | 27 ++++++++++++++----- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue index 9dae7661ab..65866d70d7 100644 --- a/src/client/app/common/views/widgets/hashtags.vue +++ b/src/client/app/common/views/widgets/hashtags.vue @@ -5,7 +5,7 @@ <div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'"> <p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> - <p class="empty" v-else-if="stats.length == 0">%fa:exclamation-circle%%i18n:@empty%<mk-ellipsis/></p> + <p class="empty" v-else-if="stats.length == 0">%fa:exclamation-circle%%i18n:@empty%</p> <transition-group v-else tag="div" name="chart"> <div v-for="stat in stats" :key="stat.tag"> <div class="tag"> diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts index efd74a21e0..df7addab98 100644 --- a/src/server/api/endpoints/hashtags/trend.ts +++ b/src/server/api/endpoints/hashtags/trend.ts @@ -10,6 +10,8 @@ const rangeB = 1000 * 60 * 120; // 2時間 const coefficient = 1.5; // 「n倍」の部分 const requiredUsers = 3; // 最低何人がそのタグを投稿している必要があるか +const max = 5; + /** * Get trends of hashtags */ @@ -43,7 +45,7 @@ module.exports = () => new Promise(async (res, rej) => { return res([]); } - let tags = []; + const tags = []; // カウント data.map(x => x._id).forEach(x => { @@ -59,10 +61,10 @@ module.exports = () => new Promise(async (res, rej) => { }); // 最低要求投稿者数を下回るならカットする - tags = tags.filter(tag => tag.count >= requiredUsers); + const limitedTags = tags.filter(tag => tag.count >= requiredUsers); //#region 2. 1で取得したそれぞれのタグについて、「直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上」かどうかを判定する - const hotsPromises = tags.map(async tag => { + const hotsPromises = limitedTags.map(async tag => { const passedCount = (await Note.distinct('userId', { tags: tag.name, createdAt: { @@ -71,7 +73,7 @@ module.exports = () => new Promise(async (res, rej) => { } }) as any).length; - if (tag.count > (passedCount * coefficient)) { + if (tag.count >= (passedCount * coefficient)) { return tag; } else { return null; @@ -79,13 +81,24 @@ module.exports = () => new Promise(async (res, rej) => { }); //#endregion - const hots = (await Promise.all(hotsPromises)) + // タグを人気順に並べ替え + let hots = (await Promise.all(hotsPromises)) .filter(x => x != null) .sort((a, b) => b.count - a.count) .map(tag => tag.name) - .slice(0, 5); + .slice(0, max); - //#region 2で話題と判定されたタグそれぞれについて過去の投稿数グラフを取得する + //#region 3. もし上記の方法でのトレンド抽出の結果、求められているタグ数に達しなければ「ただ単に現在投稿数が多いハッシュタグ」に切り替える + if (hots.length < max) { + hots = hots.concat(tags + .filter(tag => hots.indexOf(tag.name) == -1) + .sort((a, b) => b.count - a.count) + .map(tag => tag.name) + .slice(0, max - hots.length)); + } + //#endregion + + //#region 2(または3)で話題と判定されたタグそれぞれについて過去の投稿数グラフを取得する const countPromises: Array<Promise<any[]>> = []; const range = 20; From 399eb60809f1e7c7b60c2f037ac601abd760ddd0 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 02:47:17 +0900 Subject: [PATCH 278/369] 2.37.5 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 843bab6880..278612d572 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.37.4", - "clientVersion": "1.0.6465", + "version": "2.37.5", + "clientVersion": "1.0.6468", "codename": "nighthike", "main": "./built/index.js", "private": true, From b18013025f3383428fe6db1bd41ef23c3cf2897e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 08:09:27 +0900 Subject: [PATCH 279/369] :art: --- src/client/app/common/views/widgets/hashtags.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue index 65866d70d7..89b9976981 100644 --- a/src/client/app/common/views/widgets/hashtags.vue +++ b/src/client/app/common/views/widgets/hashtags.vue @@ -68,7 +68,7 @@ root(isDark) > .fetching > .empty margin 0 - padding 12px 16px + padding 16px text-align center color #aaa @@ -87,7 +87,7 @@ root(isDark) > div display flex align-items center - padding 16px + padding 14px 16px &:not(:last-child) border-bottom solid 1px isDark ? #393f4f : #eee From 1af50fd7b89e2e7c117a00a9e0ad731c4a30f0a2 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 08:43:48 +0900 Subject: [PATCH 280/369] =?UTF-8?q?=E5=86=97=E9=95=B7=E3=81=AA=E3=83=8F?= =?UTF-8?q?=E3=83=83=E3=82=B7=E3=83=A5=E3=82=BF=E3=82=B0=E3=81=AE=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA=E3=82=92=E7=84=A1=E3=81=8F=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/app/common/views/components/note-html.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/client/app/common/views/components/note-html.ts b/src/client/app/common/views/components/note-html.ts index f86b50659e..2fa13b16e1 100644 --- a/src/client/app/common/views/components/note-html.ts +++ b/src/client/app/common/views/components/note-html.ts @@ -40,6 +40,14 @@ export default Vue.component('mk-note-html', { ast = this.ast; } + if (ast.filter(x => x.type != 'hashtag').length == 0) { + return; + } + + while (ast[ast.length - 1].type == 'hashtag') { + ast.pop(); + } + // Parse ast to DOM const els = flatten(ast.map(token => { switch (token.type) { From cea44834bbe3b492a2bb7ba4a1adba6c372c340c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 08:58:50 +0900 Subject: [PATCH 281/369] Improve usability --- .../views/pages/deck/deck.widgets-column.vue | 38 +++++++++++++------ 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue index a41bf8c3ca..05e7f88a25 100644 --- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue @@ -5,7 +5,7 @@ <div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq"> <template v-if="edit"> <header> - <select v-model="widgetAdderSelected"> + <select v-model="widgetAdderSelected" @change="addWidget"> <option value="profile">%i18n:common.widgets.profile%</option> <option value="analog-clock">%i18n:common.widgets.analog-clock%</option> <option value="calendar">%i18n:common.widgets.calendar%</option> @@ -30,20 +30,15 @@ <option value="nav">%i18n:common.widgets.nav%</option> <option value="tips">%i18n:common.widgets.tips%</option> </select> - <button @click="addWidget">%i18n:@add%</button> </header> <x-draggable :list="column.widgets" - :options="{ handle: '.handle', animation: 150 }" + :options="{ animation: 150 }" @sort="onWidgetSort" > - <div v-for="widget in column.widgets" class="customize-container" :key="widget.id"> - <header> - <span class="handle">%fa:bars%</span>{{ widget.name }}<button class="remove" @click="removeWidget(widget)">%fa:times%</button> - </header> - <div @click="widgetFunc(widget.id)"> - <component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="deck"/> - </div> + <div v-for="widget in column.widgets" class="customize-container" :key="widget.id" @contextmenu.stop.prevent="widgetFunc(widget.id)"> + <button class="remove" @click="removeWidget(widget)">%fa:times%</button> + <component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="deck"/> </div> </x-draggable> </template> @@ -142,6 +137,13 @@ export default Vue.extend({ root(isDark) .gqpwvtwtprsbmnssnbicggtwqhmylhnq + > header + padding 16px + + > * + width 100% + padding 4px + .widget, .customize-container margin 8px @@ -149,7 +151,21 @@ root(isDark) margin-top 0 .customize-container - background #fff + cursor move + + > *:not(.remove) + pointer-events none + + > .remove + position absolute + z-index 1 + top 8px + right 8px + width 32px + height 32px + color #fff + background rgba(#000, 0.7) + border-radius 4px > header color isDark ? #fff : #000 From 460147fea23b374ef57c6bd71fd52cef122755e7 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 08:59:36 +0900 Subject: [PATCH 282/369] 2.37.6 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 278612d572..67f6155038 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.37.5", - "clientVersion": "1.0.6468", + "version": "2.37.6", + "clientVersion": "1.0.6472", "codename": "nighthike", "main": "./built/index.js", "private": true, From d6e5dc2167540776c992b96062b5c133e22dec99 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 09:10:34 +0900 Subject: [PATCH 283/369] Fix bugs --- src/client/app/common/views/components/note-html.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/client/app/common/views/components/note-html.ts b/src/client/app/common/views/components/note-html.ts index 2fa13b16e1..8ace375823 100644 --- a/src/client/app/common/views/components/note-html.ts +++ b/src/client/app/common/views/components/note-html.ts @@ -44,7 +44,10 @@ export default Vue.component('mk-note-html', { return; } - while (ast[ast.length - 1].type == 'hashtag') { + while ( + ast[ast.length - 1].type == 'hashtag' || + (ast[ast.length - 1].type == 'text' && ast[ast.length - 1].content == ' ') || + (ast[ast.length - 1].type == 'text' && ast[ast.length - 1].content == '\n')) { ast.pop(); } @@ -100,7 +103,7 @@ export default Vue.component('mk-note-html', { case 'hashtag': return createElement('a', { attrs: { - href: `${url}/search?q=${token.content}`, + href: `${url}/tags/${token.content}`, target: '_blank' } }, token.content); From f968d05ea0917e3b61502e046c7d81303727e7a7 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 09:10:52 +0900 Subject: [PATCH 284/369] 2.37.7 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 67f6155038..acec8eff76 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.37.6", - "clientVersion": "1.0.6472", + "version": "2.37.7", + "clientVersion": "1.0.6474", "codename": "nighthike", "main": "./built/index.js", "private": true, From 8230935fd343be28bd71fb279e4f37aed796c58a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 11:27:35 +0900 Subject: [PATCH 285/369] :art: --- src/client/app/common/views/widgets/hashtags.vue | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue index 89b9976981..9ab855d927 100644 --- a/src/client/app/common/views/widgets/hashtags.vue +++ b/src/client/app/common/views/widgets/hashtags.vue @@ -76,13 +76,8 @@ root(isDark) margin-right 4px > div - .chart-enter - .chart-leave-to - opacity 0 - transform translateY(-30px) - - > * - transition transform .3s ease, opacity .3s ease + .chart-move + transition transform 1s ease > div display flex From e3f6d42a479a00cc9f73bff26a6b863201341847 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 11:38:44 +0900 Subject: [PATCH 286/369] Fix bug --- src/client/app/common/views/components/note-html.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/common/views/components/note-html.ts b/src/client/app/common/views/components/note-html.ts index 8ace375823..4941ee9783 100644 --- a/src/client/app/common/views/components/note-html.ts +++ b/src/client/app/common/views/components/note-html.ts @@ -103,7 +103,7 @@ export default Vue.component('mk-note-html', { case 'hashtag': return createElement('a', { attrs: { - href: `${url}/tags/${token.content}`, + href: `${url}/tags/${token.hashtag}`, target: '_blank' } }, token.content); From 8bc47baf4f47d29afb1c25e2ec3807384d06f812 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 18:54:36 +0900 Subject: [PATCH 287/369] #1710 --- src/models/note.ts | 2 +- src/server/api/stream/home.ts | 10 +++++++++- src/server/api/stream/local-timeline.ts | 8 ++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/models/note.ts b/src/models/note.ts index 359d953735..3bbfec0103 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -289,7 +289,7 @@ export const pack = async ( // Poll if (meId && _note.poll && !hide) { - _note.poll = (async (poll) => { + _note.poll = (async poll => { const vote = await PollVote .findOne({ userId: meId, diff --git a/src/server/api/stream/home.ts b/src/server/api/stream/home.ts index 54fde2d776..d9b8f7fb96 100644 --- a/src/server/api/stream/home.ts +++ b/src/server/api/stream/home.ts @@ -4,7 +4,7 @@ import * as debug from 'debug'; import User, { IUser } from '../../../models/user'; import Mute from '../../../models/mute'; -import { pack as packNote } from '../../../models/note'; +import { pack as packNote, pack } from '../../../models/note'; import readNotification from '../common/read-notification'; import call from '../call'; import { IApp } from '../../../models/app'; @@ -48,6 +48,14 @@ export default async function( } //#endregion + // Renoteなら再pack + if (x.type == 'note' && x.body.renoteId != null) { + x.body.renote = await pack(x.body.renoteId, user, { + detail: true + }); + data = JSON.stringify(x); + } + connection.send(data); } catch (e) { connection.send(data); diff --git a/src/server/api/stream/local-timeline.ts b/src/server/api/stream/local-timeline.ts index a790ba878b..8f6a445be0 100644 --- a/src/server/api/stream/local-timeline.ts +++ b/src/server/api/stream/local-timeline.ts @@ -3,6 +3,7 @@ import * as redis from 'redis'; import { IUser } from '../../../models/user'; import Mute from '../../../models/mute'; +import { pack } from '../../../models/note'; export default async function( request: websocket.request, @@ -31,6 +32,13 @@ export default async function( } //#endregion + // Renoteなら再pack + if (note.renoteId != null) { + note.renote = await pack(note.renoteId, user, { + detail: true + }); + } + connection.send(JSON.stringify({ type: 'note', body: note From 413fbb3d0c6040fe88730f5d4f65d1add3b1e59e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 19:03:57 +0900 Subject: [PATCH 288/369] =?UTF-8?q?=E3=83=A2=E3=83=90=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E3=81=A7=E3=82=82=E3=83=8F=E3=83=83=E3=82=B7=E3=83=A5=E3=82=BF?= =?UTF-8?q?=E3=82=B0=E3=82=92=E6=A4=9C=E7=B4=A2=E3=81=A7=E3=81=8D=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/app/mobile/script.ts | 2 + src/client/app/mobile/views/pages/tag.vue | 81 +++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 src/client/app/mobile/views/pages/tag.vue diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts index 300615ec58..d505b38dcc 100644 --- a/src/client/app/mobile/script.ts +++ b/src/client/app/mobile/script.ts @@ -42,6 +42,7 @@ import MkUserLists from './views/pages/user-lists.vue'; import MkUserList from './views/pages/user-list.vue'; import MkSettings from './views/pages/settings.vue'; import MkOthello from './views/pages/othello.vue'; +import MkTag from './views/pages/tag.vue'; Vue.use(MdCard); Vue.use(MdButton); @@ -88,6 +89,7 @@ init((launch) => { { path: '/i/drive/file/:file', component: MkDrive }, { path: '/selectdrive', component: MkSelectDrive }, { path: '/search', component: MkSearch }, + { path: '/tags/:tag', component: MkTag }, { path: '/othello', name: 'othello', component: MkOthello }, { path: '/othello/:game', component: MkOthello }, { path: '/@:user', component: MkUser }, diff --git a/src/client/app/mobile/views/pages/tag.vue b/src/client/app/mobile/views/pages/tag.vue new file mode 100644 index 0000000000..b4c993e667 --- /dev/null +++ b/src/client/app/mobile/views/pages/tag.vue @@ -0,0 +1,81 @@ +<template> +<mk-ui> + <span slot="header">%fa:hashtag%{{ $route.params.tag }}</span> + + <main> + <p v-if="!fetching && empty">%fa:search%「{{ q }}」に関する投稿は見つかりませんでした。</p> + <mk-notes ref="timeline" :more="existMore ? more : null"/> + </main> +</mk-ui> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import Progress from '../../../common/scripts/loading'; + +const limit = 20; + +export default Vue.extend({ + data() { + return { + fetching: true, + moreFetching: false, + existMore: false, + offset: 0, + empty: false + }; + }, + watch: { + $route: 'fetch' + }, + mounted() { + this.$nextTick(() => { + this.fetch(); + }); + }, + methods: { + fetch() { + this.fetching = true; + Progress.start(); + + (this.$refs.timeline as any).init(() => new Promise((res, rej) => { + (this as any).api('notes/search_by_tag', { + limit: limit + 1, + offset: this.offset, + tag: this.$route.params.tag + }).then(notes => { + if (notes.length == 0) this.empty = true; + if (notes.length == limit + 1) { + notes.pop(); + this.existMore = true; + } + res(notes); + this.fetching = false; + Progress.done(); + }, rej); + })); + }, + more() { + this.offset += limit; + + const promise = (this as any).api('notes/search_by_tag', { + limit: limit + 1, + offset: this.offset, + tag: this.$route.params.tag + }); + + promise.then(notes => { + if (notes.length == limit + 1) { + notes.pop(); + } else { + this.existMore = false; + } + notes.forEach(n => (this.$refs.timeline as any).append(n)); + this.moreFetching = false; + }); + + return promise; + } + } +}); +</script> From 0318f7344fae3265171682a016f90368e3d2a8c3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 19:05:40 +0900 Subject: [PATCH 289/369] Fix bug --- src/client/app/common/views/components/note-html.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/app/common/views/components/note-html.ts b/src/client/app/common/views/components/note-html.ts index 4941ee9783..8fa5f380dd 100644 --- a/src/client/app/common/views/components/note-html.ts +++ b/src/client/app/common/views/components/note-html.ts @@ -44,10 +44,10 @@ export default Vue.component('mk-note-html', { return; } - while ( + while (ast[ast.length - 1] && ( ast[ast.length - 1].type == 'hashtag' || (ast[ast.length - 1].type == 'text' && ast[ast.length - 1].content == ' ') || - (ast[ast.length - 1].type == 'text' && ast[ast.length - 1].content == '\n')) { + (ast[ast.length - 1].type == 'text' && ast[ast.length - 1].content == '\n'))) { ast.pop(); } From 4d914f5c0a89cfcc1a2eb674948cd9cb999965ca Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 12 Jun 2018 19:07:36 +0900 Subject: [PATCH 290/369] 2.38.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index acec8eff76..7558c445ea 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.37.7", - "clientVersion": "1.0.6474", + "version": "2.38.0", + "clientVersion": "1.0.6480", "codename": "nighthike", "main": "./built/index.js", "private": true, From 1472f0b141cdcb4f21c4db0d5ff3d84a5f8ccb93 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 13 Jun 2018 05:11:55 +0900 Subject: [PATCH 291/369] Fix #1712 --- src/models/note.ts | 5 +++++ src/remote/activitypub/renderer/hashtag.ts | 2 +- src/remote/activitypub/renderer/mention.ts | 9 +++++++++ src/remote/activitypub/renderer/note.ts | 17 +++++++++++++++-- src/services/note/create.ts | 7 ++++++- 5 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 src/remote/activitypub/renderer/mention.ts diff --git a/src/models/note.ts b/src/models/note.ts index 3bbfec0103..461bb405a0 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -48,6 +48,11 @@ export type INote = { repliesCount: number; reactionCounts: any; mentions: mongo.ObjectID[]; + mentionedRemoteUsers: Array<{ + uri: string; + username: string; + host: string; + }>; /** * public ... 公開 diff --git a/src/remote/activitypub/renderer/hashtag.ts b/src/remote/activitypub/renderer/hashtag.ts index 50761c8684..a37ba63532 100644 --- a/src/remote/activitypub/renderer/hashtag.ts +++ b/src/remote/activitypub/renderer/hashtag.ts @@ -1,6 +1,6 @@ import config from '../../../config'; -export default tag => ({ +export default (tag: string) => ({ type: 'Hashtag', href: `${config.url}/tags/${encodeURIComponent(tag)}`, name: '#' + tag diff --git a/src/remote/activitypub/renderer/mention.ts b/src/remote/activitypub/renderer/mention.ts new file mode 100644 index 0000000000..4cba7d6a94 --- /dev/null +++ b/src/remote/activitypub/renderer/mention.ts @@ -0,0 +1,9 @@ +export default (mention: { + uri: string; + username: string; + host: string; +}) => ({ + type: 'Mention', + href: mention.uri, + name: `@${mention.username}@${mention.host}` +}); diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts index a05c12b388..39335a7cca 100644 --- a/src/remote/activitypub/renderer/note.ts +++ b/src/remote/activitypub/renderer/note.ts @@ -1,5 +1,6 @@ import renderDocument from './document'; import renderHashtag from './hashtag'; +import renderMention from './mention'; import config from '../../../config'; import DriveFile from '../../../models/drive-file'; import Note, { INote } from '../../../models/note'; @@ -45,6 +46,18 @@ export default async function renderNote(note: INote, dive = true) { const attributedTo = `${config.url}/users/${user._id}`; + const mentions = note.mentionedRemoteUsers && note.mentionedRemoteUsers.length > 0 + ? note.mentionedRemoteUsers.map(x => x.uri) + : []; + + const cc = ['public', 'home', 'followers'].includes(note.visibility) + ? [`${attributedTo}/followers`].concat(mentions) + : []; + + const hashtagTags = (note.tags || []).map(renderHashtag); + const mentionTags = (note.mentionedRemoteUsers || []).map(renderMention); + const tag = hashtagTags.concat(mentionTags) + return { id: `${config.url}/notes/${note._id}`, type: 'Note', @@ -52,9 +65,9 @@ export default async function renderNote(note: INote, dive = true) { content: toHtml(note), published: note.createdAt.toISOString(), to: 'https://www.w3.org/ns/activitystreams#Public', - cc: `${attributedTo}/followers`, + cc, inReplyTo, attachment: (await promisedFiles).map(renderDocument), - tag: (note.tags || []).map(renderHashtag) + tag }; } diff --git a/src/services/note/create.ts b/src/services/note/create.ts index ddf07716e4..7eec7485be 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -329,7 +329,12 @@ export default async (user: IUser, data: { if (mentionedUsers.length > 0) { Note.update({ _id: note._id }, { $set: { - mentions: mentionedUsers.map(u => u._id) + mentions: mentionedUsers.map(u => u._id), + mentionedRemoteUsers: mentionedUsers.filter(u => isRemoteUser(u)).map(u => ({ + uri: (u as IRemoteUser).uri, + username: u.username, + host: u.host + })) } }); } From 80c52433cc501dba736f27feef428e902a1f95f3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 13 Jun 2018 05:15:26 +0900 Subject: [PATCH 292/369] Fix bug --- src/remote/activitypub/kernel/announce/note.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/remote/activitypub/kernel/announce/note.ts b/src/remote/activitypub/kernel/announce/note.ts index fe645b07b5..e258567389 100644 --- a/src/remote/activitypub/kernel/announce/note.ts +++ b/src/remote/activitypub/kernel/announce/note.ts @@ -15,6 +15,11 @@ const log = debug('misskey:activitypub'); export default async function(resolver: Resolver, actor: IRemoteUser, activity: IAnnounce, note: INote): Promise<void> { const uri = activity.id || activity; + // アナウンサーが凍結されていたらスキップ + if (actor.isSuspended) { + return; + } + if (typeof uri !== 'string') { throw new Error('invalid announce'); } From e635a87628746b9e8422044f350d43d86ed6b4bc Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 13 Jun 2018 05:16:53 +0900 Subject: [PATCH 293/369] 2.38.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7558c445ea..e1f7765a98 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.38.0", + "version": "2.38.1", "clientVersion": "1.0.6480", "codename": "nighthike", "main": "./built/index.js", From ce27b36fd04d43dd0852e5d066d50d3236381348 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 13 Jun 2018 05:21:55 +0900 Subject: [PATCH 294/369] Fix bug --- src/client/app/desktop/views/components/post-form.vue | 2 ++ src/client/app/mobile/views/components/post-form.vue | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index 7b2adfe707..a0670a084e 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -50,6 +50,7 @@ import * as XDraggable from 'vuedraggable'; import getKao from '../../../common/scripts/get-kao'; import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue'; import parse from '../../../../../text/parse'; +import { host } from '../../../config'; export default Vue.extend({ components: { @@ -129,6 +130,7 @@ export default Vue.extend({ // 自分は除外 if (this.$store.state.i.username == x.username && x.host == null) return; + if (this.$store.state.i.username == x.username && x.host == host) return; // 重複は除外 if (this.text.indexOf(`${mention} `) != -1) return; diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index 2c7feb3f8e..88853fa236 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -46,6 +46,7 @@ import * as XDraggable from 'vuedraggable'; import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue'; import getKao from '../../../common/scripts/get-kao'; import parse from '../../../../../text/parse'; +import { host } from '../../../config'; export default Vue.extend({ components: { @@ -123,6 +124,7 @@ export default Vue.extend({ // 自分は除外 if (this.$store.state.i.username == x.username && x.host == null) return; + if (this.$store.state.i.username == x.username && x.host == host) return; // 重複は除外 if (this.text.indexOf(`${mention} `) != -1) return; From 1813d17b4ca834ab2220bf4955be5b120d8bb17d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 13 Jun 2018 05:24:44 +0900 Subject: [PATCH 295/369] Fix bug --- src/services/note/delete.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/services/note/delete.ts b/src/services/note/delete.ts index 793f0090be..3e928303d2 100644 --- a/src/services/note/delete.ts +++ b/src/services/note/delete.ts @@ -20,6 +20,7 @@ export default async function(user: IUser, note: INote) { $set: { deletedAt: new Date(), text: null, + tags: [], mediaIds: [], poll: null } From 89105f56413c6d13fb294bec14a8dd1f07f79aec Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 13 Jun 2018 05:25:27 +0900 Subject: [PATCH 296/369] 2.38.2 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e1f7765a98..3a0b8b93a1 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.38.1", - "clientVersion": "1.0.6480", + "version": "2.38.2", + "clientVersion": "1.0.6486", "codename": "nighthike", "main": "./built/index.js", "private": true, From 7d8e70b2ac8e2073e0838eb5a5b4d428eaf24059 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 13 Jun 2018 05:40:12 +0900 Subject: [PATCH 297/369] Fix bug --- src/services/note/create.ts | 110 ++++++++++++++++++------------------ 1 file changed, 56 insertions(+), 54 deletions(-) diff --git a/src/services/note/create.ts b/src/services/note/create.ts index 7eec7485be..f74d04ae62 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -204,6 +204,62 @@ export default async (user: IUser, data: { return packAp(content); }; + //#region メンション + if (data.text) { + // TODO: Drop dupulicates + const mentionTokens = tokens + .filter(t => t.type == 'mention'); + + // TODO: Drop dupulicates + const mentionedUsers = (await Promise.all(mentionTokens.map(async m => { + try { + return await resolveUser(m.username, m.host); + } catch (e) { + return null; + } + }))).filter(x => x != null); + + // Append mentions data + if (mentionedUsers.length > 0) { + const set = { + mentions: mentionedUsers.map(u => u._id), + mentionedRemoteUsers: mentionedUsers.filter(u => isRemoteUser(u)).map(u => ({ + uri: (u as IRemoteUser).uri, + username: u.username, + host: u.host + })) + }; + + Note.update({ _id: note._id }, { + $set: set + }); + + Object.assign(note, set); + } + + mentionedUsers.filter(u => isLocalUser(u)).forEach(async u => { + event(u, 'mention', noteObj); + + // 既に言及されたユーザーに対する返信や引用renoteの場合も無視 + if (data.reply && data.reply.userId.equals(u._id)) return; + if (data.renote && data.renote.userId.equals(u._id)) return; + + // Create notification + notify(u._id, user._id, 'mention', { + noteId: note._id + }); + + nm.push(u._id, 'mention'); + }); + + if (isLocalUser(user)) { + mentionedUsers.filter(u => isRemoteUser(u)).forEach(async u => { + deliver(user, await render(), (u as IRemoteUser).inbox); + }); + } + } + //#endregion + if (!silent) { if (isLocalUser(user)) { if (note.visibility == 'private' || note.visibility == 'followers' || note.visibility == 'specified') { @@ -287,60 +343,6 @@ export default async (user: IUser, data: { } //#endergion - //#region メンション - if (data.text) { - // TODO: Drop dupulicates - const mentions = tokens - .filter(t => t.type == 'mention'); - - let mentionedUsers = await Promise.all(mentions.map(async m => { - try { - return await resolveUser(m.username, m.host); - } catch (e) { - return null; - } - })); - - // TODO: Drop dupulicates - mentionedUsers = mentionedUsers.filter(x => x != null); - - mentionedUsers.filter(u => isLocalUser(u)).forEach(async u => { - event(u, 'mention', noteObj); - - // 既に言及されたユーザーに対する返信や引用renoteの場合も無視 - if (data.reply && data.reply.userId.equals(u._id)) return; - if (data.renote && data.renote.userId.equals(u._id)) return; - - // Create notification - notify(u._id, user._id, 'mention', { - noteId: note._id - }); - - nm.push(u._id, 'mention'); - }); - - if (isLocalUser(user)) { - mentionedUsers.filter(u => isRemoteUser(u)).forEach(async u => { - deliver(user, await render(), (u as IRemoteUser).inbox); - }); - } - - // Append mentions data - if (mentionedUsers.length > 0) { - Note.update({ _id: note._id }, { - $set: { - mentions: mentionedUsers.map(u => u._id), - mentionedRemoteUsers: mentionedUsers.filter(u => isRemoteUser(u)).map(u => ({ - uri: (u as IRemoteUser).uri, - username: u.username, - host: u.host - })) - } - }); - } - } - //#endregion - // If has in reply to note if (data.reply) { // Increment replies count From 9059c149ddb96283f8fed8d3e3d492ae2380407d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 13 Jun 2018 05:40:27 +0900 Subject: [PATCH 298/369] 2.38.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3a0b8b93a1..4b207d5e5a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.38.2", + "version": "2.38.3", "clientVersion": "1.0.6486", "codename": "nighthike", "main": "./built/index.js", From e6e02ece89e9e2af2ae0aa4c57cb9fcdb3d5b890 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 14 Jun 2018 06:29:01 +0900 Subject: [PATCH 299/369] wip --- package.json | 1 - src/client/app/app.styl | 5 - .../app/common/views/components/index.ts | 2 + .../views/components/material/input.vue | 129 ++++++++++++++++++ src/client/app/mobile/script.ts | 15 -- src/client/app/mobile/style.styl | 3 - src/client/app/mobile/views/pages/welcome.vue | 18 ++- .../app/mobile/views/widgets/profile.vue | 2 +- src/client/md.scss | 13 -- 9 files changed, 145 insertions(+), 43 deletions(-) create mode 100644 src/client/app/common/views/components/material/input.vue delete mode 100644 src/client/md.scss diff --git a/package.json b/package.json index 4b207d5e5a..b1b8888b5c 100644 --- a/package.json +++ b/package.json @@ -211,7 +211,6 @@ "vue-js-modal": "1.3.13", "vue-json-tree-view": "2.1.4", "vue-loader": "15.2.1", - "vue-material": "^1.0.0-beta-10.2", "vue-router": "3.0.1", "vue-template-compiler": "2.5.16", "vuedraggable": "2.16.0", diff --git a/src/client/app/app.styl b/src/client/app/app.styl index ba694b73ae..431b9daa65 100644 --- a/src/client/app/app.styl +++ b/src/client/app/app.styl @@ -7,11 +7,6 @@ html cursor progress !important body - // for md - font-size 16px !important - line-height initial !important - letter-spacing initial !important - overflow-wrap break-word #error diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts index 803854468e..659c2aca2a 100644 --- a/src/client/app/common/views/components/index.ts +++ b/src/client/app/common/views/components/index.ts @@ -29,6 +29,7 @@ import fileTypeIcon from './file-type-icon.vue'; import Switch from './switch.vue'; import Othello from './othello.vue'; import welcomeTimeline from './welcome-timeline.vue'; +import uiInput from './material/input.vue'; Vue.component('mk-analog-clock', analogClock); Vue.component('mk-menu', menu); @@ -59,3 +60,4 @@ Vue.component('mk-file-type-icon', fileTypeIcon); Vue.component('mk-switch', Switch); Vue.component('mk-othello', Othello); Vue.component('mk-welcome-timeline', welcomeTimeline); +Vue.component('ui-input', uiInput); diff --git a/src/client/app/common/views/components/material/input.vue b/src/client/app/common/views/components/material/input.vue new file mode 100644 index 0000000000..42ff0bb4b8 --- /dev/null +++ b/src/client/app/common/views/components/material/input.vue @@ -0,0 +1,129 @@ +<template> +<div class="ui-input" :class="{ focused, filled }"> + <div class="input"> + <span class="label" ref="label"><slot></slot></span> + <div class="prefix" ref="prefix" @click="focus"><slot name="prefix"></slot></div> + <input ref="input" :value="value" @input="$emit('input', $event.target.value)" @focus="focused = true" @blur="focused = false"> + <div class="suffix" @click="focus"><slot name="suffix"></slot></div> + </div> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +export default Vue.extend({ + props: ['value'], + data() { + return { + focused: false + } + }, + computed: { + filled(): boolean { + return this.value != '' && this.value != null; + } + }, + mounted() { + this.$refs.label.style.left = this.$refs.prefix.offsetWidth + 'px'; + }, + methods: { + focus() { + this.$refs.input.focus(); + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +.ui-input + padding-bottom 16px + + > .input + display flex + margin-top 16px + + &:before + content '' + display block + position absolute + bottom 0 + left 0 + right 0 + height 1px + background rgba(#000, 0.42) + + &:after + content '' + display block + position absolute + bottom 0 + left 0 + right 0 + height 2px + background $theme-color + opacity 0 + transform scaleX(0.12) + transition border 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.4, 0, 0.2, 1) + will-change border opacity transform + + > .label + position absolute + top 0 + left 0 + pointer-events none + transition 0.4s cubic-bezier(0.25, 0.8, 0.25, 1) + transition-duration 0.3s + font-size 16px + line-height 32px + color rgba(#000, 0.54) + pointer-events none + + > input + display block + flex 1 + width 100% + padding 0 + font-size 16px + line-height 32px + background transparent + border none + border-radius 0 + outline none + box-shadow none + + > .prefix + > .suffix + display block + align-self center + justify-self center + font-size 16px + line-height 32px + color rgba(#000, 0.54) + + > .prefix + padding-right 4px + + > .suffix + padding-left 4px + + &.focused + > .input + &:after + opacity 1 + transform scaleX(1) + + > .label + color $theme-color + + &.focused + &.filled + > .input + > .label + top -16px + left 0 !important + font-size 12px + line-height 20px + +</style> diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts index d505b38dcc..a6f4359432 100644 --- a/src/client/app/mobile/script.ts +++ b/src/client/app/mobile/script.ts @@ -5,10 +5,6 @@ import Vue from 'vue'; import VueRouter from 'vue-router'; -import { MdCard, MdButton, MdField, MdMenu, MdList, MdSwitch, MdSubheader, MdDialog, MdDialogAlert, MdRadio } from 'vue-material/dist/components'; -import 'vue-material/dist/vue-material.min.css'; -import 'vue-material/dist/theme/default.css'; - // Style import './style.styl'; import '../../element.scss'; @@ -44,17 +40,6 @@ import MkSettings from './views/pages/settings.vue'; import MkOthello from './views/pages/othello.vue'; import MkTag from './views/pages/tag.vue'; -Vue.use(MdCard); -Vue.use(MdButton); -Vue.use(MdField); -Vue.use(MdMenu); -Vue.use(MdList); -Vue.use(MdSwitch); -Vue.use(MdSubheader); -Vue.use(MdDialog); -Vue.use(MdDialogAlert); -Vue.use(MdRadio); - /** * init */ diff --git a/src/client/app/mobile/style.styl b/src/client/app/mobile/style.styl index d1ab044eaf..df8f4a8fae 100644 --- a/src/client/app/mobile/style.styl +++ b/src/client/app/mobile/style.styl @@ -10,9 +10,6 @@ html height 100% background #ececed !important - // for md - transition none !important - &[data-darkmode] background #191B22 !important diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue index 64cfa5a46c..ceb1abb9a0 100644 --- a/src/client/app/mobile/views/pages/welcome.vue +++ b/src/client/app/mobile/views/pages/welcome.vue @@ -7,9 +7,16 @@ <p>%fa:lock% ログイン</p> <div> <form @submit.prevent="onSubmit"> - <input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" placeholder="ユーザー名" autofocus required @change="onUsernameChange"/> - <input v-model="password" type="password" placeholder="パスワード" required/> - <input v-if="user && user.twoFactorEnabled" v-model="token" type="number" placeholder="トークン" required/> + <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" placeholder="ユーザー名" autofocus required @change="onUsernameChange"> + <span>ユーザー名</span> + <span slot="prefix">@</span> + <span slot="suffix">@{{ host }}</span> + </ui-input> + <ui-input v-model="password" type="password" placeholder="パスワード" required> + <span>パスワード</span> + <span slot="prefix">%fa:lock%</span> + </ui-input> + <ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" placeholder="トークン" required/> <button type="submit" :disabled="signing">{{ signing ? 'ログインしています' : 'ログイン' }}</button> </form> <div> @@ -33,7 +40,7 @@ <script lang="ts"> import Vue from 'vue'; -import { apiUrl, copyright } from '../../../config'; +import { apiUrl, copyright, host } from '../../../config'; export default Vue.extend({ data() { @@ -45,7 +52,8 @@ export default Vue.extend({ token: '', apiUrl, copyright, - users: [] + users: [], + host }; }, mounted() { diff --git a/src/client/app/mobile/views/widgets/profile.vue b/src/client/app/mobile/views/widgets/profile.vue index beae1ffa36..a94f7e94b8 100644 --- a/src/client/app/mobile/views/widgets/profile.vue +++ b/src/client/app/mobile/views/widgets/profile.vue @@ -56,7 +56,7 @@ export default define({ left 92px margin 0 line-height 100px - color #fff !important // !important is for md + color #fff font-weight bold text-shadow 0 0 8px rgba(#000, 0.5) diff --git a/src/client/md.scss b/src/client/md.scss deleted file mode 100644 index 8368365885..0000000000 --- a/src/client/md.scss +++ /dev/null @@ -1,13 +0,0 @@ -/* SEE: https://vuematerial.io/themes/configuration */ - -@import '../const.json'; - -@import "~vue-material/dist/theme/engine"; - -@include md-register-theme("default", ( - primary: $themeColor, - accent: $themeColor -)); - -@import "~vue-material/dist/components/MdButton/theme"; -@import "~vue-material/dist/components/MdField/theme"; From 8814fc9c9c0614215f7e5dbe3ec1316c49e2b68d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 14 Jun 2018 07:22:50 +0900 Subject: [PATCH 300/369] wip --- .../app/common/views/components/index.ts | 2 + .../views/components/material/button.vue | 39 ++++++ .../views/components/material/input.vue | 41 ++---- src/client/app/mobile/script.ts | 2 - src/client/app/mobile/views/pages/welcome.vue | 123 ++++++------------ 5 files changed, 92 insertions(+), 115 deletions(-) create mode 100644 src/client/app/common/views/components/material/button.vue diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts index 659c2aca2a..5dc466857c 100644 --- a/src/client/app/common/views/components/index.ts +++ b/src/client/app/common/views/components/index.ts @@ -30,6 +30,7 @@ import Switch from './switch.vue'; import Othello from './othello.vue'; import welcomeTimeline from './welcome-timeline.vue'; import uiInput from './material/input.vue'; +import uiButton from './material/button.vue'; Vue.component('mk-analog-clock', analogClock); Vue.component('mk-menu', menu); @@ -61,3 +62,4 @@ Vue.component('mk-switch', Switch); Vue.component('mk-othello', Othello); Vue.component('mk-welcome-timeline', welcomeTimeline); Vue.component('ui-input', uiInput); +Vue.component('ui-button', uiButton); diff --git a/src/client/app/common/views/components/material/button.vue b/src/client/app/common/views/components/material/button.vue new file mode 100644 index 0000000000..0c768cf4cc --- /dev/null +++ b/src/client/app/common/views/components/material/button.vue @@ -0,0 +1,39 @@ +<template> +<div class="ui-button"> + <button> + <slot></slot> + </button> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +export default Vue.extend({ + props: { + type: { + type: String, + required: false + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +.ui-button + > button + display block + width 100% + padding 0 + color $theme-color-foreground + font-weight bold + font-size 16px + line-height 44px + background $theme-color + border none + border-radius 6px + outline none + box-shadow none + +</style> diff --git a/src/client/app/common/views/components/material/input.vue b/src/client/app/common/views/components/material/input.vue index 42ff0bb4b8..fe64354908 100644 --- a/src/client/app/common/views/components/material/input.vue +++ b/src/client/app/common/views/components/material/input.vue @@ -24,7 +24,7 @@ export default Vue.extend({ } }, mounted() { - this.$refs.label.style.left = this.$refs.prefix.offsetWidth + 'px'; + this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px'; }, methods: { focus() { @@ -38,39 +38,18 @@ export default Vue.extend({ @import '~const.styl' .ui-input - padding-bottom 16px + margin-bottom 32px > .input display flex margin-top 16px - - &:before - content '' - display block - position absolute - bottom 0 - left 0 - right 0 - height 1px - background rgba(#000, 0.42) - - &:after - content '' - display block - position absolute - bottom 0 - left 0 - right 0 - height 2px - background $theme-color - opacity 0 - transform scaleX(0.12) - transition border 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.4, 0, 0.2, 1) - will-change border opacity transform + padding 6px 12px + background #f5f5f5 + border-radius 6px > .label position absolute - top 0 + top 6px left 0 pointer-events none transition 0.4s cubic-bezier(0.25, 0.8, 0.25, 1) @@ -85,6 +64,8 @@ export default Vue.extend({ flex 1 width 100% padding 0 + font inherit + font-weight bold font-size 16px line-height 32px background transparent @@ -110,9 +91,7 @@ export default Vue.extend({ &.focused > .input - &:after - opacity 1 - transform scaleX(1) + background #eee > .label color $theme-color @@ -121,7 +100,7 @@ export default Vue.extend({ &.filled > .input > .label - top -16px + top -20px left 0 !important font-size 12px line-height 20px diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts index a6f4359432..8ee078d621 100644 --- a/src/client/app/mobile/script.ts +++ b/src/client/app/mobile/script.ts @@ -2,13 +2,11 @@ * Mobile Client */ -import Vue from 'vue'; import VueRouter from 'vue-router'; // Style import './style.styl'; import '../../element.scss'; -import '../../md.scss'; import init from '../init'; diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue index ceb1abb9a0..07891fd56b 100644 --- a/src/client/app/mobile/views/pages/welcome.vue +++ b/src/client/app/mobile/views/pages/welcome.vue @@ -1,27 +1,23 @@ <template> <div class="welcome"> <div> - <h1><b>Misskey</b>へようこそ</h1> - <p>Twitter風ミニブログSNS、Misskeyへようこそ。共有したいことを投稿したり、タイムラインでみんなの投稿を読むこともできます。<br><a href="/signup">アカウントを作成する</a></p> + <img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="Misskey"> <div class="form"> - <p>%fa:lock% ログイン</p> + <form @submit.prevent="onSubmit"> + <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" placeholder="ユーザー名" autofocus required @change="onUsernameChange"> + <span>ユーザー名</span> + <span slot="prefix">@</span> + <span slot="suffix">@{{ host }}</span> + </ui-input> + <ui-input v-model="password" type="password" placeholder="パスワード" required> + <span>パスワード</span> + <span slot="prefix">%fa:lock%</span> + </ui-input> + <ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" placeholder="トークン" required/> + <ui-button type="submit" :disabled="signing">{{ signing ? 'ログインしています' : 'ログイン' }}</ui-button> + </form> <div> - <form @submit.prevent="onSubmit"> - <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" placeholder="ユーザー名" autofocus required @change="onUsernameChange"> - <span>ユーザー名</span> - <span slot="prefix">@</span> - <span slot="suffix">@{{ host }}</span> - </ui-input> - <ui-input v-model="password" type="password" placeholder="パスワード" required> - <span>パスワード</span> - <span slot="prefix">%fa:lock%</span> - </ui-input> - <ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" placeholder="トークン" required/> - <button type="submit" :disabled="signing">{{ signing ? 'ログインしています' : 'ログイン' }}</button> - </form> - <div> - <a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a> - </div> + <a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a> </div> </div> <div class="tl"> @@ -92,81 +88,44 @@ export default Vue.extend({ <style lang="stylus" scoped> .welcome - background linear-gradient(to bottom, #1e1d65, #bd6659) + background #fff > div padding 16px margin 0 auto max-width 500px - h1 - margin 0 - padding 8px - font-size 1.5em - font-weight normal - color #cacac3 - - & + p - margin 0 0 16px 0 - padding 0 8px 0 8px - color #949fa9 + > img + display block + max-width 200px + margin 0 auto .form margin-bottom 16px - background #fff - border solid 1px rgba(#000, 0.2) - border-radius 8px - overflow hidden - > p - margin 0 - padding 12px 20px - color #555 - background #f5f5f5 - border-bottom solid 1px #ddd + > form + padding 16px - > div - - > form - padding 16px - border-bottom solid 1px #ddd - - input - display block - padding 12px - margin 0 0 16px 0 - width 100% - font-size 1em - color rgba(#000, 0.7) - background #fff - outline none - border solid 1px #ddd - border-radius 4px - - button - display block - width 100% - padding 10px - margin 0 - color #333 - font-size 1em - text-align center - text-decoration none - text-shadow 0 1px 0 rgba(255, 255, 255, 0.9) - background-image linear-gradient(#fafafa, #eaeaea) - border 1px solid #ddd - border-bottom-color #cecece - border-radius 4px - - &:active - background-color #767676 - background-image none - border-color #444 - box-shadow 0 1px 3px rgba(#000, 0.075), inset 0 0 5px rgba(#000, 0.2) - - > div - padding 16px + button + display block + width 100% + padding 10px + margin 0 + color #333 + font-size 1em text-align center + text-decoration none + text-shadow 0 1px 0 rgba(255, 255, 255, 0.9) + background-image linear-gradient(#fafafa, #eaeaea) + border 1px solid #ddd + border-bottom-color #cecece + border-radius 4px + + &:active + background-color #767676 + background-image none + border-color #444 + box-shadow 0 1px 3px rgba(#000, 0.075), inset 0 0 5px rgba(#000, 0.2) > .tl background #fff From 3a4833818f67aec56bc3570088a1ef34466f3905 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 14 Jun 2018 09:51:55 +0900 Subject: [PATCH 301/369] wip --- .../views/components/material/button.vue | 3 +- .../views/components/material/input.vue | 43 ++++++++-- .../app/common/views/components/signup.vue | 54 ++++++------- src/client/app/mobile/views/pages/signup.vue | 41 ++-------- src/client/app/mobile/views/pages/welcome.vue | 80 +++++++++---------- 5 files changed, 109 insertions(+), 112 deletions(-) diff --git a/src/client/app/common/views/components/material/button.vue b/src/client/app/common/views/components/material/button.vue index 0c768cf4cc..8dacedbac6 100644 --- a/src/client/app/common/views/components/material/button.vue +++ b/src/client/app/common/views/components/material/button.vue @@ -1,6 +1,6 @@ <template> <div class="ui-button"> - <button> + <button :type="type"> <slot></slot> </button> </div> @@ -25,6 +25,7 @@ export default Vue.extend({ > button display block width 100% + margin 32px 0 16px 0 padding 0 color $theme-color-foreground font-weight bold diff --git a/src/client/app/common/views/components/material/input.vue b/src/client/app/common/views/components/material/input.vue index fe64354908..6564b3aa6c 100644 --- a/src/client/app/common/views/components/material/input.vue +++ b/src/client/app/common/views/components/material/input.vue @@ -3,16 +3,40 @@ <div class="input"> <span class="label" ref="label"><slot></slot></span> <div class="prefix" ref="prefix" @click="focus"><slot name="prefix"></slot></div> - <input ref="input" :value="value" @input="$emit('input', $event.target.value)" @focus="focused = true" @blur="focused = false"> + <input ref="input" + :type="type" + :value="value" + :required="required" + :readonly="readonly" + @input="$emit('input', $event.target.value)" + @focus="focused = true" + @blur="focused = false"> <div class="suffix" @click="focus"><slot name="suffix"></slot></div> </div> + <div class="text"><slot name="text"></slot></div> </div> </template> <script lang="ts"> import Vue from 'vue'; export default Vue.extend({ - props: ['value'], + props: { + value: { + required: false + }, + type: { + type: String, + required: false + }, + required: { + type: Boolean, + required: false + }, + readonly: { + type: Boolean, + required: false + } + }, data() { return { focused: false @@ -38,13 +62,13 @@ export default Vue.extend({ @import '~const.styl' .ui-input - margin-bottom 32px + margin-bottom 16px + padding-top 16px > .input display flex - margin-top 16px padding 6px 12px - background #f5f5f5 + background rgba(#000, 0.035) border-radius 6px > .label @@ -89,9 +113,16 @@ export default Vue.extend({ > .suffix padding-left 4px + > .text + margin 8px 0 + font-size 14px + + > p + margin 0 + &.focused > .input - background #eee + background rgba(#000, 0.05) > .label color $theme-color diff --git a/src/client/app/common/views/components/signup.vue b/src/client/app/common/views/components/signup.vue index f8bf7dd798..3adb10f2c3 100644 --- a/src/client/app/common/views/components/signup.vue +++ b/src/client/app/common/views/components/signup.vue @@ -1,20 +1,27 @@ <template> <form class="mk-signup" @submit.prevent="onSubmit" autocomplete="off"> <label class="username"> - <p class="caption">%fa:at%%i18n:@username%</p> - <input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" placeholder="a~z、A~Z、0~9、-" autocomplete="off" required @input="onChangeUsername"/> - <p class="profile-page-url-preview" v-if="shouldShowProfileUrl">{{ `${url}/@${username}` }}</p> - <p class="info" v-if="usernameState == 'wait'" style="color:#999">%fa:spinner .pulse .fw%%i18n:@checking%</p> - <p class="info" v-if="usernameState == 'ok'" style="color:#3CB7B5">%fa:check .fw%%i18n:@available%</p> - <p class="info" v-if="usernameState == 'unavailable'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@unavailable%</p> - <p class="info" v-if="usernameState == 'error'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@error%</p> - <p class="info" v-if="usernameState == 'invalid-format'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@invalid-format%</p> - <p class="info" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@too-short%</p> - <p class="info" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@too-long%</p> + <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" autocomplete="off" required @input="onChangeUsername"> + <span>%i18n:@username%</span> + <span slot="prefix">@</span> + <span slot="suffix">@{{ host }}</span> + <p slot="text" v-if="usernameState == 'wait'" style="color:#999">%fa:spinner .pulse .fw%%i18n:@checking%</p> + <p slot="text" v-if="usernameState == 'ok'" style="color:#3CB7B5">%fa:check .fw%%i18n:@available%</p> + <p slot="text" v-if="usernameState == 'unavailable'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@unavailable%</p> + <p slot="text" v-if="usernameState == 'error'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@error%</p> + <p slot="text" v-if="usernameState == 'invalid-format'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@invalid-format%</p> + <p slot="text" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@too-short%</p> + <p slot="text" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@too-long%</p> + </ui-input> </label> <label class="password"> - <p class="caption">%fa:lock%%i18n:@password%</p> - <input v-model="password" type="password" placeholder="%i18n:@password-placeholder%" autocomplete="off" required @input="onChangePassword"/> + <ui-input v-model="password" type="password" autocomplete="off" required @input="onChangePassword"> + <span>%i18n:@password%</span> + <span slot="prefix">%fa:lock%</span> + <div slot="text"> + + </div> + </ui-input> <div class="meter" v-show="passwordStrength != ''" :data-strength="passwordStrength"> <div class="value" ref="passwordMetar"></div> </div> @@ -23,14 +30,15 @@ <p class="info" v-if="passwordStrength == 'high'" style="color:#3CB7B5">%fa:check .fw%%i18n:@strong-password%</p> </label> <label class="retype-password"> - <p class="caption">%fa:lock%%i18n:@password%(%i18n:@retype%)</p> - <input v-model="retypedPassword" type="password" placeholder="%i18n:@retype-placeholder%" autocomplete="off" required @input="onChangePasswordRetype"/> + <ui-input v-model="retypedPassword" type="password" autocomplete="off" required @input="onChangePasswordRetype"> + <span>%i18n:@password% (%i18n:@retype%)</span> + <span slot="prefix">%fa:lock%</span> + </ui-input> <p class="info" v-if="passwordRetypeState == 'match'" style="color:#3CB7B5">%fa:check .fw%%i18n:@password-matched%</p> <p class="info" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@password-not-matched%</p> </label> <label class="recaptcha"> - <p class="caption"><template v-if="recaptchaed">%fa:toggle-on%</template><template v-if="!recaptchaed">%fa:toggle-off%</template>%i18n:@recaptcha%</p> - <div class="g-recaptcha" data-callback="onRecaptchaed" data-expired-callback="onRecaptchaExpired" :data-sitekey="recaptchaSitekey"></div> + <div class="g-recaptcha" :data-sitekey="recaptchaSitekey"></div> </label> <label class="agree-tou"> <input name="agree-tou" type="checkbox" autocomplete="off" required/> @@ -43,18 +51,18 @@ <script lang="ts"> import Vue from 'vue'; const getPasswordStrength = require('syuilo-password-strength'); -import { url, docsUrl, lang, recaptchaSitekey } from '../../../config'; +import { host, url, docsUrl, lang, recaptchaSitekey } from '../../../config'; export default Vue.extend({ data() { return { + host, username: '', password: '', retypedPassword: '', url, touUrl: `${docsUrl}/${lang}/tou`, recaptchaSitekey, - recaptchaed: false, usernameState: null, passwordStrength: '', passwordRetypeState: null @@ -130,19 +138,9 @@ export default Vue.extend({ alert('%i18n:@some-error%'); (window as any).grecaptcha.reset(); - this.recaptchaed = false; }); } }, - created() { - (window as any).onRecaptchaed = () => { - this.recaptchaed = true; - }; - - (window as any).onRecaptchaExpired = () => { - this.recaptchaed = false; - }; - }, mounted() { const head = document.getElementsByTagName('head')[0]; const script = document.createElement('script'); diff --git a/src/client/app/mobile/views/pages/signup.vue b/src/client/app/mobile/views/pages/signup.vue index b8245beb00..f2b29bca60 100644 --- a/src/client/app/mobile/views/pages/signup.vue +++ b/src/client/app/mobile/views/pages/signup.vue @@ -1,28 +1,18 @@ <template> <div class="signup"> <h1>Misskeyをはじめる</h1> - <p>いつでも、どこからでもMisskeyを利用できます。もちろん、無料です。</p> - <div class="form"> - <p>新規登録</p> - <div> - <mk-signup/> - </div> - </div> + <mk-signup/> </div> </template> <script lang="ts"> import Vue from 'vue'; -export default Vue.extend({ - mounted() { - document.documentElement.style.background = '#293946'; - } -}); +export default Vue.extend({}); </script> <style lang="stylus" scoped> .signup - padding 16px + padding 32px margin 0 auto max-width 500px @@ -30,28 +20,7 @@ export default Vue.extend({ margin 0 padding 8px font-size 1.5em - font-weight normal - color #c3c6ca - - & + p - margin 0 0 16px 0 - padding 0 8px 0 8px - color #949fa9 - - .form - background #fff - border solid 1px rgba(#000, 0.2) - border-radius 8px - overflow hidden - - > p - margin 0 - padding 12px 20px - color #555 - background #f5f5f5 - border-bottom solid 1px #ddd - - > div - padding 16px + font-weight bold + color #444 </style> diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue index 07891fd56b..01b20aa472 100644 --- a/src/client/app/mobile/views/pages/welcome.vue +++ b/src/client/app/mobile/views/pages/welcome.vue @@ -2,7 +2,13 @@ <div class="welcome"> <div> <img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="Misskey"> - <div class="form"> + <p class="host">{{ host }}</p> + <div class="about"> + <h2>{{ name || 'unidentified' }}</h2> + <p v-html="description || '%i18n:common.about%'"></p> + <router-link class="signup" to="/signup">新規登録</router-link> + </div> + <div class="login"> <form @submit.prevent="onSubmit"> <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" placeholder="ユーザー名" autofocus required @change="onUsernameChange"> <span>ユーザー名</span> @@ -20,13 +26,6 @@ <a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a> </div> </div> - <div class="tl"> - <p>%fa:comments R% タイムラインを見てみる</p> - <mk-welcome-timeline/> - </div> - <div class="users"> - <mk-avatar class="avatar" v-for="user in users" :key="user.id" :user="user"/> - </div> <footer> <small>{{ copyright }}</small> </footer> @@ -88,10 +87,11 @@ export default Vue.extend({ <style lang="stylus" scoped> .welcome - background #fff + text-align center + //background #fff > div - padding 16px + padding 32px margin 0 auto max-width 500px @@ -100,11 +100,36 @@ export default Vue.extend({ max-width 200px margin 0 auto - .form - margin-bottom 16px + > .host + display block + text-align center + padding 6px 12px + line-height 32px + font-weight bold + color #333 + background rgba(#000, 0.035) + border-radius 6px + + > .about + margin-top 16px + padding 16px + color #444 + background #fff + border-radius 6px + + > h2 + margin 0 + + > p + margin 8px + + > .signup + font-weight bold + + > .login + margin 16px 0 > form - padding 16px button display block @@ -127,36 +152,9 @@ export default Vue.extend({ border-color #444 box-shadow 0 1px 3px rgba(#000, 0.075), inset 0 0 5px rgba(#000, 0.2) - > .tl - background #fff - border solid 1px rgba(#000, 0.2) - border-radius 8px - overflow hidden - - > p - margin 0 - padding 12px 20px - color #555 - background #f5f5f5 - border-bottom solid 1px #ddd - - > .mk-welcome-timeline - max-height 300px - overflow auto - - > .users - margin 12px 0 0 0 - - > * - display inline-block - margin 4px - width 38px - height 38px - border-radius 6px - > footer text-align center - color #fff + color #444 > small display block From a1ae832129e8bfe8c082064349e2b9973be5f0e5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 14 Jun 2018 14:52:37 +0900 Subject: [PATCH 302/369] wip --- .../app/common/views/components/index.ts | 12 +- .../app/common/views/components/signup.vue | 182 +++------------ .../components/{material => ui}/button.vue | 8 +- .../app/common/views/components/ui/form.vue | 28 +++ .../app/common/views/components/ui/group.vue | 23 ++ .../app/common/views/components/ui/input.vue | 215 ++++++++++++++++++ .../app/common/views/components/ui/switch.vue | 199 ++++++++++++++++ .../{material/input.vue => ui/textarea.vue} | 74 +++--- .../app/mobile/views/pages/settings.vue | 170 ++++++-------- .../views/pages/settings/settings.profile.vue | 83 +++---- src/client/app/mobile/views/pages/signup.vue | 2 +- src/client/app/mobile/views/pages/welcome.vue | 8 +- 12 files changed, 658 insertions(+), 346 deletions(-) rename src/client/app/common/views/components/{material => ui}/button.vue (83%) create mode 100644 src/client/app/common/views/components/ui/form.vue create mode 100644 src/client/app/common/views/components/ui/group.vue create mode 100644 src/client/app/common/views/components/ui/input.vue create mode 100644 src/client/app/common/views/components/ui/switch.vue rename src/client/app/common/views/components/{material/input.vue => ui/textarea.vue} (64%) diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts index 5dc466857c..060af388b3 100644 --- a/src/client/app/common/views/components/index.ts +++ b/src/client/app/common/views/components/index.ts @@ -29,8 +29,12 @@ import fileTypeIcon from './file-type-icon.vue'; import Switch from './switch.vue'; import Othello from './othello.vue'; import welcomeTimeline from './welcome-timeline.vue'; -import uiInput from './material/input.vue'; -import uiButton from './material/button.vue'; +import uiInput from './ui/input.vue'; +import uiButton from './ui/button.vue'; +import uiGroup from './ui/group.vue'; +import uiForm from './ui/form.vue'; +import uiTextarea from './ui/textarea.vue'; +import uiSwitch from './ui/switch.vue'; Vue.component('mk-analog-clock', analogClock); Vue.component('mk-menu', menu); @@ -63,3 +67,7 @@ Vue.component('mk-othello', Othello); Vue.component('mk-welcome-timeline', welcomeTimeline); Vue.component('ui-input', uiInput); Vue.component('ui-button', uiButton); +Vue.component('ui-group', uiGroup); +Vue.component('ui-form', uiForm); +Vue.component('ui-textarea', uiTextarea); +Vue.component('ui-switch', uiSwitch); diff --git a/src/client/app/common/views/components/signup.vue b/src/client/app/common/views/components/signup.vue index 3adb10f2c3..d1621a4848 100644 --- a/src/client/app/common/views/components/signup.vue +++ b/src/client/app/common/views/components/signup.vue @@ -1,50 +1,40 @@ <template> <form class="mk-signup" @submit.prevent="onSubmit" autocomplete="off"> - <label class="username"> - <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" autocomplete="off" required @input="onChangeUsername"> - <span>%i18n:@username%</span> - <span slot="prefix">@</span> - <span slot="suffix">@{{ host }}</span> - <p slot="text" v-if="usernameState == 'wait'" style="color:#999">%fa:spinner .pulse .fw%%i18n:@checking%</p> - <p slot="text" v-if="usernameState == 'ok'" style="color:#3CB7B5">%fa:check .fw%%i18n:@available%</p> - <p slot="text" v-if="usernameState == 'unavailable'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@unavailable%</p> - <p slot="text" v-if="usernameState == 'error'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@error%</p> - <p slot="text" v-if="usernameState == 'invalid-format'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@invalid-format%</p> - <p slot="text" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@too-short%</p> - <p slot="text" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@too-long%</p> - </ui-input> - </label> - <label class="password"> - <ui-input v-model="password" type="password" autocomplete="off" required @input="onChangePassword"> - <span>%i18n:@password%</span> - <span slot="prefix">%fa:lock%</span> - <div slot="text"> - - </div> - </ui-input> - <div class="meter" v-show="passwordStrength != ''" :data-strength="passwordStrength"> - <div class="value" ref="passwordMetar"></div> + <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" autocomplete="off" required @input="onChangeUsername"> + <span>%i18n:@username%</span> + <span slot="prefix">@</span> + <span slot="suffix">@{{ host }}</span> + <p slot="text" v-if="usernameState == 'wait'" style="color:#999">%fa:spinner .pulse .fw% %i18n:@checking%</p> + <p slot="text" v-if="usernameState == 'ok'" style="color:#3CB7B5">%fa:check .fw% %i18n:@available%</p> + <p slot="text" v-if="usernameState == 'unavailable'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@unavailable%</p> + <p slot="text" v-if="usernameState == 'error'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@error%</p> + <p slot="text" v-if="usernameState == 'invalid-format'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@invalid-format%</p> + <p slot="text" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-short%</p> + <p slot="text" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-long%</p> + </ui-input> + <ui-input v-model="password" type="password" autocomplete="off" required @input="onChangePassword" :with-password-meter="true"> + <span>%i18n:@password%</span> + <span slot="prefix">%fa:lock%</span> + <div slot="text"> + <p slot="text" v-if="passwordStrength == 'low'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@weak-password%</p> + <p slot="text" v-if="passwordStrength == 'medium'" style="color:#3CB7B5">%fa:check .fw% %i18n:@normal-password%</p> + <p slot="text" v-if="passwordStrength == 'high'" style="color:#3CB7B5">%fa:check .fw% %i18n:@strong-password%</p> </div> - <p class="info" v-if="passwordStrength == 'low'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@weak-password%</p> - <p class="info" v-if="passwordStrength == 'medium'" style="color:#3CB7B5">%fa:check .fw%%i18n:@normal-password%</p> - <p class="info" v-if="passwordStrength == 'high'" style="color:#3CB7B5">%fa:check .fw%%i18n:@strong-password%</p> - </label> - <label class="retype-password"> - <ui-input v-model="retypedPassword" type="password" autocomplete="off" required @input="onChangePasswordRetype"> - <span>%i18n:@password% (%i18n:@retype%)</span> - <span slot="prefix">%fa:lock%</span> - </ui-input> - <p class="info" v-if="passwordRetypeState == 'match'" style="color:#3CB7B5">%fa:check .fw%%i18n:@password-matched%</p> - <p class="info" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw%%i18n:@password-not-matched%</p> - </label> - <label class="recaptcha"> - <div class="g-recaptcha" :data-sitekey="recaptchaSitekey"></div> - </label> - <label class="agree-tou"> + </ui-input> + <ui-input v-model="retypedPassword" type="password" autocomplete="off" required @input="onChangePasswordRetype"> + <span>%i18n:@password% (%i18n:@retype%)</span> + <span slot="prefix">%fa:lock%</span> + <div slot="text"> + <p slot="text" v-if="passwordRetypeState == 'match'" style="color:#3CB7B5">%fa:check .fw% %i18n:@password-matched%</p> + <p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@password-not-matched%</p> + </div> + </ui-input> + <div class="g-recaptcha" :data-sitekey="recaptchaSitekey" style="margin: 16px 0;"></div> + <label class="agree-tou" style="display: block; margin: 16px 0;"> <input name="agree-tou" type="checkbox" autocomplete="off" required/> <p><a :href="touUrl" target="_blank">利用規約</a>に同意する</p> </label> - <button type="submit">%i18n:@create%</button> + <ui-button type="submit">%i18n:@create%</ui-button> </form> </template> @@ -112,7 +102,6 @@ export default Vue.extend({ const strength = getPasswordStrength(this.password); this.passwordStrength = strength > 0.7 ? 'high' : strength > 0.3 ? 'medium' : 'low'; - (this.$refs.passwordMetar as any).style.width = `${strength * 100}%`; }, onChangePasswordRetype() { if (this.retypedPassword == '') { @@ -156,100 +145,6 @@ export default Vue.extend({ .mk-signup min-width 302px - label - display block - margin 0 0 16px 0 - - > .caption - margin 0 0 4px 0 - color #828888 - font-size 0.95em - - > [data-fa] - margin-right 0.25em - color #96adac - - > .info - display block - margin 4px 0 - font-size 0.8em - - > [data-fa] - margin-right 0.3em - - &.username - .profile-page-url-preview - display block - margin 4px 8px 0 4px - font-size 0.8em - color #888 - - &:empty - display none - - &:not(:empty) + .info - margin-top 0 - - &.password - .meter - display block - margin-top 8px - width 100% - height 8px - - &[data-strength=''] - display none - - &[data-strength='low'] - > .value - background #d73612 - - &[data-strength='medium'] - > .value - background #d7ca12 - - &[data-strength='high'] - > .value - background #61bb22 - - > .value - display block - width 0% - height 100% - background transparent - border-radius 4px - transition all 0.1s ease - - [type=text], [type=password] - user-select text - display inline-block - cursor auto - padding 0 12px - margin 0 - width 100% - line-height 44px - font-size 1em - color #333 !important - background #fff !important - outline none - border solid 1px rgba(#000, 0.1) - border-radius 4px - box-shadow 0 0 0 114514px #fff inset - transition all .3s ease - - &:hover - border-color rgba(#000, 0.2) - transition all .1s ease - - &:focus - color $theme-color !important - border-color $theme-color - box-shadow 0 0 0 1024px #fff inset, 0 0 0 4px rgba($theme-color, 10%) - transition all 0s ease - - &:disabled - opacity 0.5 - .agree-tou padding 4px border-radius 4px @@ -267,19 +162,4 @@ export default Vue.extend({ display inline color #555 - button - margin 0 - padding 16px - width 100% - font-size 1em - color #fff - background $theme-color - border-radius 3px - - &:hover - background lighten($theme-color, 5%) - - &:active - background darken($theme-color, 5%) - </style> diff --git a/src/client/app/common/views/components/material/button.vue b/src/client/app/common/views/components/ui/button.vue similarity index 83% rename from src/client/app/common/views/components/material/button.vue rename to src/client/app/common/views/components/ui/button.vue index 8dacedbac6..57747fd469 100644 --- a/src/client/app/common/views/components/material/button.vue +++ b/src/client/app/common/views/components/ui/button.vue @@ -25,7 +25,7 @@ export default Vue.extend({ > button display block width 100% - margin 32px 0 16px 0 + margin 0 padding 0 color $theme-color-foreground font-weight bold @@ -37,4 +37,10 @@ export default Vue.extend({ outline none box-shadow none + &:hover + background lighten($theme-color, 5%) + + &:active + background darken($theme-color, 5%) + </style> diff --git a/src/client/app/common/views/components/ui/form.vue b/src/client/app/common/views/components/ui/form.vue new file mode 100644 index 0000000000..0893af1bce --- /dev/null +++ b/src/client/app/common/views/components/ui/form.vue @@ -0,0 +1,28 @@ +<template> +<div class="ui-form"> + <fieldset :disabled="disabled"> + <slot></slot> + </fieldset> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +export default Vue.extend({ + props: { + disabled: { + type: String, + required: false + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +.ui-form + > fieldset + border none + +</style> diff --git a/src/client/app/common/views/components/ui/group.vue b/src/client/app/common/views/components/ui/group.vue new file mode 100644 index 0000000000..fb29458ce8 --- /dev/null +++ b/src/client/app/common/views/components/ui/group.vue @@ -0,0 +1,23 @@ +<template> +<div class="ui-group"> + <header> + <slot name="title"></slot> + </header> + + <slot></slot> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +export default Vue.extend({}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +.ui-group + > header + font-weight bold + +</style> diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue new file mode 100644 index 0000000000..7461aac7fe --- /dev/null +++ b/src/client/app/common/views/components/ui/input.vue @@ -0,0 +1,215 @@ +<template> +<div class="ui-input" :class="{ focused, filled }"> + <div class="input" @click="focus"> + <div class="password-meter" v-if="withPasswordMeter" v-show="passwordStrength != ''" :data-strength="passwordStrength"> + <div class="value" ref="passwordMetar"></div> + </div> + <span class="label" ref="label"><slot></slot></span> + <div class="prefix" ref="prefix"><slot name="prefix"></slot></div> + <input ref="input" + :type="type" + :value="value" + :required="required" + :readonly="readonly" + :pattern="pattern" + :autocomplete="autocomplete" + @input="$emit('input', $event.target.value)" + @focus="focused = true" + @blur="focused = false"> + <div class="suffix"><slot name="suffix"></slot></div> + </div> + <div class="text"><slot name="text"></slot></div> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +const getPasswordStrength = require('syuilo-password-strength'); + +export default Vue.extend({ + props: { + value: { + required: false + }, + type: { + type: String, + required: false + }, + required: { + type: Boolean, + required: false + }, + readonly: { + type: Boolean, + required: false + }, + pattern: { + type: String, + required: false + }, + autocomplete: { + type: String, + required: false + }, + withPasswordMeter: { + type: Boolean, + required: false, + default: false + } + }, + data() { + return { + focused: false, + passwordStrength: '' + } + }, + computed: { + filled(): boolean { + return this.value != '' && this.value != null; + } + }, + watch: { + value(v) { + if (this.withPasswordMeter) { + if (v == '') { + this.passwordStrength = ''; + return; + } + + const strength = getPasswordStrength(v); + this.passwordStrength = strength > 0.7 ? 'high' : strength > 0.3 ? 'medium' : 'low'; + (this.$refs.passwordMetar as any).style.width = `${strength * 100}%`; + } + } + }, + mounted() { + if (this.$refs.prefix) { + this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px'; + } + }, + methods: { + focus() { + this.$refs.input.focus(); + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +.ui-input + margin 32px 0 + + > .input + display flex + padding 6px 12px + background rgba(#000, 0.035) + border-radius 6px + + > .password-meter + position absolute + top 0 + left 0 + width 100% + height 100% + border-radius 6px + overflow hidden + opacity 0.3 + + &[data-strength=''] + display none + + &[data-strength='low'] + > .value + background #d73612 + + &[data-strength='medium'] + > .value + background #d7ca12 + + &[data-strength='high'] + > .value + background #61bb22 + + > .value + display block + width 0% + height 100% + background transparent + border-radius 6px + transition all 0.1s ease + + > .label + position absolute + top 6px + left 0 + pointer-events none + transition 0.4s cubic-bezier(0.25, 0.8, 0.25, 1) + transition-duration 0.3s + font-size 16px + line-height 32px + color rgba(#000, 0.54) + pointer-events none + //will-change transform + transform-origin top left + transform scale(1) + + > input + display block + flex 1 + width 100% + padding 0 + font inherit + font-weight bold + font-size 16px + line-height 32px + background transparent + border none + border-radius 0 + outline none + box-shadow none + + > .prefix + > .suffix + display block + align-self center + justify-self center + font-size 16px + line-height 32px + color rgba(#000, 0.54) + pointer-events none + + > * + display block + min-width 16px + + > .prefix + padding-right 4px + + > .suffix + padding-left 4px + + > .text + margin 6px 0 + font-size 13px + + * + margin 0 + + &.focused + > .input + background rgba(#000, 0.05) + + > .label + color $theme-color + + &.focused + &.filled + > .input + > .label + top -24px + left 0 !important + transform scale(0.8) + +</style> diff --git a/src/client/app/common/views/components/ui/switch.vue b/src/client/app/common/views/components/ui/switch.vue new file mode 100644 index 0000000000..2cac6262f1 --- /dev/null +++ b/src/client/app/common/views/components/ui/switch.vue @@ -0,0 +1,199 @@ +<template> +<div + class="ui-switch" + :class="{ disabled, checked }" + role="switch" + :aria-checked="checked" + :aria-disabled="disabled" + @click="switchValue" + @mouseover="mouseenter" +> + <input + type="checkbox" + @change="handleChange" + ref="input" + :disabled="disabled" + @keydown.enter="switchValue" + > + <span class="button"> + <span :style="{ transform }"></span> + </span> + <span class="label"> + <span :aria-hidden="!checked"><slot></slot></span> + <p :aria-hidden="!checked"> + <slot name="text"></slot> + </p> + </span> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +export default Vue.extend({ + props: { + value: { + type: Boolean, + default: false + }, + disabled: { + type: Boolean, + default: false + } + },/* + created() { + if (!~[true, false].indexOf(this.value)) { + this.$emit('input', false); + } + },*/ + computed: { + checked(): boolean { + return this.value; + }, + transform(): string { + return this.checked ? 'translate3d(14px, 0, 0)' : ''; + } + }, + watch: { + value() { + (this.$el).style.transition = 'all 0.3s'; + (this.$refs.input as any).checked = this.checked; + } + }, + mounted() { + (this.$refs.input as any).checked = this.checked; + }, + methods: { + mouseenter() { + (this.$el).style.transition = 'all 0s'; + }, + handleChange() { + (this.$el).style.transition = 'all 0.3s'; + this.$emit('input', !this.checked); + this.$emit('change', !this.checked); + this.$nextTick(() => { + // set input's checked property + // in case parent refuses to change component's value + (this.$refs.input as any).checked = this.checked; + }); + }, + switchValue() { + !this.disabled && this.handleChange(); + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +root(isDark) + display flex + margin 16px 0 + cursor pointer + transition all 0.3s + + > * + user-select none + + &.disabled + opacity 0.6 + cursor not-allowed + + &.checked + > .button + background-color $theme-color + border-color $theme-color + + > .label + > span + color $theme-color + + &:hover + > .label + > span + color darken($theme-color, 10%) + + > .button + background darken($theme-color, 10%) + border-color darken($theme-color, 10%) + + &:hover + > .label + > span + color isDark ? #fff : #2e3338 + + > .button + $color = isDark ? #15181d : #ced2da + background $color + border-color $color + + > input + position absolute + width 0 + height 0 + opacity 0 + margin 0 + + &:focus + .button + &:after + content "" + pointer-events none + position absolute + top -5px + right -5px + bottom -5px + left -5px + border 2px solid rgba($theme-color, 0.3) + border-radius 14px + + > .button + $color = isDark ? #1c1f25 : #dcdfe6 + + display inline-block + margin 0 + width 46px + min-width 46px + height 32px + min-height 32px + background $color + border 1px solid $color + outline none + border-radius 6px + transition inherit + + > * + position absolute + top 1px + left 1px + border-radius 6px + transition transform 0.3s + width 28px + height 28px + background-color #fff + + > .label + margin-left 8px + display block + font-size 16px + cursor pointer + transition inherit + + > span + display block + line-height 32px + font-weight bold + color isDark ? #c4ccd2 : #4a535a + transition inherit + + > p + margin 0 + //font-size 90% + color isDark ? #78858e : #9daab3 + +.ui-switch[data-darkmode] + root(true) + +.ui-switch:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/common/views/components/material/input.vue b/src/client/app/common/views/components/ui/textarea.vue similarity index 64% rename from src/client/app/common/views/components/material/input.vue rename to src/client/app/common/views/components/ui/textarea.vue index 6564b3aa6c..0a9f60f1bc 100644 --- a/src/client/app/common/views/components/material/input.vue +++ b/src/client/app/common/views/components/ui/textarea.vue @@ -1,17 +1,17 @@ <template> -<div class="ui-input" :class="{ focused, filled }"> +<div class="ui-textarea" :class="{ focused, filled }"> <div class="input"> <span class="label" ref="label"><slot></slot></span> - <div class="prefix" ref="prefix" @click="focus"><slot name="prefix"></slot></div> - <input ref="input" - :type="type" + <textarea ref="input" :value="value" :required="required" :readonly="readonly" + :pattern="pattern" + :autocomplete="autocomplete" @input="$emit('input', $event.target.value)" @focus="focused = true" @blur="focused = false"> - <div class="suffix" @click="focus"><slot name="suffix"></slot></div> + </textarea> </div> <div class="text"><slot name="text"></slot></div> </div> @@ -19,15 +19,13 @@ <script lang="ts"> import Vue from 'vue'; +const getPasswordStrength = require('syuilo-password-strength'); + export default Vue.extend({ props: { value: { required: false }, - type: { - type: String, - required: false - }, required: { type: Boolean, required: false @@ -35,11 +33,20 @@ export default Vue.extend({ readonly: { type: Boolean, required: false + }, + pattern: { + type: String, + required: false + }, + autocomplete: { + type: String, + required: false } }, data() { return { - focused: false + focused: false, + passwordStrength: '' } }, computed: { @@ -47,9 +54,6 @@ export default Vue.extend({ return this.value != '' && this.value != null; } }, - mounted() { - this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px'; - }, methods: { focus() { this.$refs.input.focus(); @@ -61,20 +65,18 @@ export default Vue.extend({ <style lang="stylus" scoped> @import '~const.styl' -.ui-input - margin-bottom 16px - padding-top 16px +.ui-textarea + margin 32px 0 > .input - display flex - padding 6px 12px + padding 12px background rgba(#000, 0.035) border-radius 6px > .label position absolute top 6px - left 0 + left 12px pointer-events none transition 0.4s cubic-bezier(0.25, 0.8, 0.25, 1) transition-duration 0.3s @@ -82,42 +84,29 @@ export default Vue.extend({ line-height 32px color rgba(#000, 0.54) pointer-events none + //will-change transform + transform-origin top left + transform scale(1) - > input + > textarea display block - flex 1 width 100% + min-height 100px padding 0 font inherit font-weight bold font-size 16px - line-height 32px background transparent border none border-radius 0 outline none box-shadow none - > .prefix - > .suffix - display block - align-self center - justify-self center - font-size 16px - line-height 32px - color rgba(#000, 0.54) - - > .prefix - padding-right 4px - - > .suffix - padding-left 4px - > .text - margin 8px 0 - font-size 14px + margin 6px 0 + font-size 13px - > p + * margin 0 &.focused @@ -131,9 +120,8 @@ export default Vue.extend({ &.filled > .input > .label - top -20px + top -24px left 0 !important - font-size 12px - line-height 20px + transform scale(0.8) </style> diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index 8da7a76633..716f7afc0c 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -6,125 +6,105 @@ <div> <x-profile/> - <md-card> - <md-card-header> - <div class="md-title">%fa:palette% %i18n:@design%</div> - </md-card-header> + <ui-group> + <div slot="title">%fa:palette% %i18n:@design%</div> + + <div> + <ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch> + </div> + + <div> + <ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch> + </div> + + <div> + <div class="md-body-2">%i18n:@timeline%</div> - <md-card-content> <div> - <md-switch v-model="darkmode">%i18n:@dark-mode%</md-switch> + <ui-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</ui-switch> </div> <div> - <md-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</md-switch> + <ui-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch> </div> <div> - <div class="md-body-2">%i18n:@timeline%</div> - - <div> - <md-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</md-switch> - </div> - - <div> - <md-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</md-switch> - </div> - - <div> - <md-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</md-switch> - </div> + <ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch> </div> + </div> - <div> - <div class="md-body-2">%i18n:@post-style%</div> + <div> + <div class="md-body-2">%i18n:@post-style%</div> - <md-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</md-radio> - <md-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</md-radio> - </div> - </md-card-content> - </md-card> + <md-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</md-radio> + <md-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</md-radio> + </div> + </ui-group> - <md-card> - <md-card-header> - <div class="md-title">%fa:cog% %i18n:@behavior%</div> - </md-card-header> + <ui-group> + <div slot="title">%fa:cog% %i18n:@behavior%</div> - <md-card-content> - <div> - <md-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</md-switch> - </div> + <div> + <ui-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</ui-switch> + </div> - <div> - <md-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</md-switch> - </div> + <div> + <ui-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</ui-switch> + </div> - <div> - <md-switch v-model="loadRawImages">%i18n:@load-raw-images%</md-switch> - </div> + <div> + <ui-switch v-model="loadRawImages">%i18n:@load-raw-images%</ui-switch> + </div> - <div> - <md-switch v-model="$store.state.settings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</md-switch> - </div> + <div> + <ui-switch v-model="$store.state.settings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</ui-switch> + </div> - <div> - <md-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</md-switch> - </div> - </md-card-content> - </md-card> + <div> + <ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch> + </div> + </ui-group> - <md-card> - <md-card-header> - <div class="md-title">%fa:language% %i18n:@lang%</div> - </md-card-header> + <ui-group> + <div slot="title">%fa:language% %i18n:@lang%</div> - <md-card-content> - <md-field> - <md-select v-model="lang" placeholder="%i18n:@auto%"> - <md-optgroup label="%i18n:@recommended%"> - <md-option value="">%i18n:@auto%</md-option> - </md-optgroup> + <md-field> + <md-select v-model="lang" placeholder="%i18n:@auto%"> + <md-optgroup label="%i18n:@recommended%"> + <md-option value="">%i18n:@auto%</md-option> + </md-optgroup> - <md-optgroup label="%i18n:@specify-language%"> - <md-option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</md-option> - </md-optgroup> - </md-select> - </md-field> - <span class="md-helper-text">%fa:info-circle% %i18n:@lang-tip%</span> - </md-card-content> - </md-card> + <md-optgroup label="%i18n:@specify-language%"> + <md-option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</md-option> + </md-optgroup> + </md-select> + </md-field> + <span class="md-helper-text">%fa:info-circle% %i18n:@lang-tip%</span> + </ui-group> - <md-card> - <md-card-header> - <div class="md-title">%fa:B twitter% %i18n:@twitter%</div> - </md-card-header> + <ui-group> + <div slot="title">%fa:B twitter% %i18n:@twitter%</div> - <md-card-content> - <p class="account" v-if="$store.state.i.twitter"><a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p> - <p> - <a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ $store.state.i.twitter ? '%i18n:@twitter-reconnect%' : '%i18n:@twitter-connect%' }}</a> - <span v-if="$store.state.i.twitter"> or </span> - <a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter">%i18n:@twitter-disconnect%</a> - </p> - </md-card-content> - </md-card> + <p class="account" v-if="$store.state.i.twitter"><a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p> + <p> + <a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ $store.state.i.twitter ? '%i18n:@twitter-reconnect%' : '%i18n:@twitter-connect%' }}</a> + <span v-if="$store.state.i.twitter"> or </span> + <a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter">%i18n:@twitter-disconnect%</a> + </p> + </ui-group> - <md-card> - <md-card-header> - <div class="md-title">%fa:sync-alt% %i18n:@update%</div> - </md-card-header> + <ui-group> + <div slot="title">%fa:sync-alt% %i18n:@update%</div> - <md-card-content> - <div>%i18n:@version% <i>{{ version }}</i></div> - <template v-if="latestVersion !== undefined"> - <div>%i18n:@latest-version% <i>{{ latestVersion ? latestVersion : version }}</i></div> - </template> - <md-button class="md-raised md-primary" @click="checkForUpdate" :disabled="checkingForUpdate"> - <template v-if="checkingForUpdate">%i18n:@update-checking%<mk-ellipsis/></template> - <template v-else>%i18n:@check-for-updates%</template> - </md-button> - </md-card-content> - </md-card> + <div>%i18n:@version% <i>{{ version }}</i></div> + <template v-if="latestVersion !== undefined"> + <div>%i18n:@latest-version% <i>{{ latestVersion ? latestVersion : version }}</i></div> + </template> + <md-button class="md-raised md-primary" @click="checkForUpdate" :disabled="checkingForUpdate"> + <template v-if="checkingForUpdate">%i18n:@update-checking%<mk-ellipsis/></template> + <template v-else>%i18n:@check-for-updates%</template> + </md-button> + </ui-group> </div> <p><small>ver {{ version }} ({{ codename }})</small></p> </main> diff --git a/src/client/app/mobile/views/pages/settings/settings.profile.vue b/src/client/app/mobile/views/pages/settings/settings.profile.vue index f3444eb1f0..73d876d14e 100644 --- a/src/client/app/mobile/views/pages/settings/settings.profile.vue +++ b/src/client/app/mobile/views/pages/settings/settings.profile.vue @@ -1,62 +1,47 @@ <template> - <md-card> - <md-card-header> - <div class="md-title">%fa:pencil-alt% %i18n:@title%</div> - </md-card-header> +<ui-group> + <div slot="title">%fa:pencil-alt% %i18n:@title%</div> - <md-card-content> - <md-field> - <label>%i18n:@name%</label> - <md-input v-model="name" :disabled="saving" md-counter="30"/> - </md-field> + <ui-form :disabled="saving"> + <ui-input v-model="name" :max="30"> + <span>%i18n:@name%</span> + </ui-input> - <md-field> - <label>%i18n:@account%</label> - <span class="md-prefix">@</span> - <md-input v-model="username" readonly></md-input> - <span class="md-suffix">@{{ host }}</span> - </md-field> + <ui-input v-model="username" readonly> + <span>%i18n:@account%</span> + <span slot="prefix">@</span> + <span slot="suffix">@{{ host }}</span> + </ui-input> - <md-field> - <md-icon>%fa:map-marker-alt%</md-icon> - <label>%i18n:@location%</label> - <md-input v-model="location" :disabled="saving"/> - </md-field> + <ui-input v-model="location"> + <span>%i18n:@location%</span> + <span slot="prefix">%fa:map-marker-alt%</span> + </ui-input> - <md-field> - <md-icon>%fa:birthday-cake%</md-icon> - <label>%i18n:@birthday%</label> - <md-input type="date" v-model="birthday" :disabled="saving"/> - </md-field> + <ui-input v-model="birthday" type="date"> + <span>%i18n:@birthday%</span> + <span slot="prefix">%fa:birthday-cake%</span> + </ui-input> - <md-field> - <label>%i18n:@description%</label> - <md-textarea v-model="description" :disabled="saving" md-counter="500"/> - </md-field> + <ui-textarea v-model="description" :max="500"> + <span>%i18n:@description%</span> + </ui-textarea> - <md-field> - <label>%i18n:@avatar%</label> - <md-file @md-change="onAvatarChange"/> - </md-field> + <ui-input type="file" @change="onAvatarChange"> + <span>%i18n:@avatar%</span> + <span slot="prefix">%fa:picture-o%</span> + </ui-input> - <md-field> - <label>%i18n:@banner%</label> - <md-file @md-change="onBannerChange"/> - </md-field> + <ui-input type="file" @change="onBannerChange"> + <span>%i18n:@banner%</span> + <span slot="prefix">%fa:picture-o%</span> + </ui-input> - <md-dialog-alert - :md-active.sync="uploading" - md-content="%18n:!@uploading%"/> + <ui-switch v-model="isCat">%i18n:@is-cat%</ui-switch> - <div> - <md-switch v-model="isCat">%i18n:@is-cat%</md-switch> - </div> - </md-card-content> - - <md-card-actions> - <md-button class="md-primary" :disabled="saving" @click="save">%i18n:@save%</md-button> - </md-card-actions> - </md-card> + <ui-button @click="save">%i18n:@save%</ui-button> + </ui-form> +</ui-group> </template> <script lang="ts"> diff --git a/src/client/app/mobile/views/pages/signup.vue b/src/client/app/mobile/views/pages/signup.vue index f2b29bca60..47384e2b3c 100644 --- a/src/client/app/mobile/views/pages/signup.vue +++ b/src/client/app/mobile/views/pages/signup.vue @@ -18,7 +18,7 @@ export default Vue.extend({}); h1 margin 0 - padding 8px + padding 8px 0 0 0 font-size 1.5em font-weight bold color #444 diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue index 01b20aa472..3b37a185bd 100644 --- a/src/client/app/mobile/views/pages/welcome.vue +++ b/src/client/app/mobile/views/pages/welcome.vue @@ -10,16 +10,16 @@ </div> <div class="login"> <form @submit.prevent="onSubmit"> - <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" placeholder="ユーザー名" autofocus required @change="onUsernameChange"> + <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" autofocus required @change="onUsernameChange"> <span>ユーザー名</span> <span slot="prefix">@</span> <span slot="suffix">@{{ host }}</span> </ui-input> - <ui-input v-model="password" type="password" placeholder="パスワード" required> + <ui-input v-model="password" type="password" required> <span>パスワード</span> <span slot="prefix">%fa:lock%</span> </ui-input> - <ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" placeholder="トークン" required/> + <ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/> <ui-button type="submit" :disabled="signing">{{ signing ? 'ログインしています' : 'ログイン' }}</ui-button> </form> <div> @@ -113,7 +113,7 @@ export default Vue.extend({ > .about margin-top 16px padding 16px - color #444 + color #555 background #fff border-radius 6px From 120c11b1817429c762d54df865b8cf1a35bf4e08 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 14 Jun 2018 16:48:49 +0900 Subject: [PATCH 303/369] wip --- .../app/common/views/components/index.ts | 4 +- .../components/ui/{group.vue => card.vue} | 11 ++- .../app/common/views/components/ui/form.vue | 2 + .../app/common/views/components/ui/switch.vue | 80 +++++-------------- .../app/mobile/views/pages/settings.vue | 31 ++++--- .../views/pages/settings/settings.profile.vue | 6 +- 6 files changed, 51 insertions(+), 83 deletions(-) rename src/client/app/common/views/components/ui/{group.vue => card.vue} (56%) diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts index 060af388b3..0e20e66f5a 100644 --- a/src/client/app/common/views/components/index.ts +++ b/src/client/app/common/views/components/index.ts @@ -31,7 +31,7 @@ import Othello from './othello.vue'; import welcomeTimeline from './welcome-timeline.vue'; import uiInput from './ui/input.vue'; import uiButton from './ui/button.vue'; -import uiGroup from './ui/group.vue'; +import uiCard from './ui/card.vue'; import uiForm from './ui/form.vue'; import uiTextarea from './ui/textarea.vue'; import uiSwitch from './ui/switch.vue'; @@ -67,7 +67,7 @@ Vue.component('mk-othello', Othello); Vue.component('mk-welcome-timeline', welcomeTimeline); Vue.component('ui-input', uiInput); Vue.component('ui-button', uiButton); -Vue.component('ui-group', uiGroup); +Vue.component('ui-card', uiCard); Vue.component('ui-form', uiForm); Vue.component('ui-textarea', uiTextarea); Vue.component('ui-switch', uiSwitch); diff --git a/src/client/app/common/views/components/ui/group.vue b/src/client/app/common/views/components/ui/card.vue similarity index 56% rename from src/client/app/common/views/components/ui/group.vue rename to src/client/app/common/views/components/ui/card.vue index fb29458ce8..5ba15dad7d 100644 --- a/src/client/app/common/views/components/ui/group.vue +++ b/src/client/app/common/views/components/ui/card.vue @@ -1,5 +1,5 @@ <template> -<div class="ui-group"> +<div class="ui-card"> <header> <slot name="title"></slot> </header> @@ -16,8 +16,15 @@ export default Vue.extend({}); <style lang="stylus" scoped> @import '~const.styl' -.ui-group +.ui-card + margin 16px 0 + padding 32px + background #fff + //box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12) + > header font-weight bold + font-size 28px + color #444 </style> diff --git a/src/client/app/common/views/components/ui/form.vue b/src/client/app/common/views/components/ui/form.vue index 0893af1bce..b6b4a76d2a 100644 --- a/src/client/app/common/views/components/ui/form.vue +++ b/src/client/app/common/views/components/ui/form.vue @@ -23,6 +23,8 @@ export default Vue.extend({ .ui-form > fieldset + margin 0 + padding 0 border none </style> diff --git a/src/client/app/common/views/components/ui/switch.vue b/src/client/app/common/views/components/ui/switch.vue index 2cac6262f1..e78951a352 100644 --- a/src/client/app/common/views/components/ui/switch.vue +++ b/src/client/app/common/views/components/ui/switch.vue @@ -16,7 +16,7 @@ @keydown.enter="switchValue" > <span class="button"> - <span :style="{ transform }"></span> + <span></span> </span> <span class="label"> <span :aria-hidden="!checked"><slot></slot></span> @@ -48,9 +48,6 @@ export default Vue.extend({ computed: { checked(): boolean { return this.value; - }, - transform(): string { - return this.checked ? 'translate3d(14px, 0, 0)' : ''; } }, watch: { @@ -88,7 +85,7 @@ export default Vue.extend({ root(isDark) display flex - margin 16px 0 + margin 32px 0 cursor pointer transition all 0.3s @@ -101,31 +98,12 @@ root(isDark) &.checked > .button - background-color $theme-color - border-color $theme-color + background-color rgba($theme-color, 0.4) + border-color rgba($theme-color, 0.4) - > .label - > span - color $theme-color - - &:hover - > .label - > span - color darken($theme-color, 10%) - - > .button - background darken($theme-color, 10%) - border-color darken($theme-color, 10%) - - &:hover - > .label - > span - color isDark ? #fff : #2e3338 - - > .button - $color = isDark ? #15181d : #ced2da - background $color - border-color $color + > * + background-color $theme-color + transform translateX(14px) > input position absolute @@ -134,42 +112,26 @@ root(isDark) opacity 0 margin 0 - &:focus + .button - &:after - content "" - pointer-events none - position absolute - top -5px - right -5px - bottom -5px - left -5px - border 2px solid rgba($theme-color, 0.3) - border-radius 14px - > .button - $color = isDark ? #1c1f25 : #dcdfe6 - display inline-block - margin 0 - width 46px - min-width 46px - height 32px - min-height 32px - background $color - border 1px solid $color + margin 3px 0 0 0 + width 34px + height 14px + background isDark ? rgba(#fff, 0.1) : rgba(#000, 0.05) outline none - border-radius 6px + border-radius 14px transition inherit > * position absolute - top 1px - left 1px - border-radius 6px - transition transform 0.3s - width 28px - height 28px + top -3px + left 0 + border-radius 100% + transition background-color 0.3s, transform 0.3s + width 20px + height 20px background-color #fff + box-shadow 0 2px 1px -1px rgba(#000, 0.2), 0 1px 1px 0 rgba(#000, 0.14), 0 1px 3px 0 rgba(#000, 0.12) > .label margin-left 8px @@ -180,9 +142,9 @@ root(isDark) > span display block - line-height 32px + line-height 20px font-weight bold - color isDark ? #c4ccd2 : #4a535a + color isDark ? #c4ccd2 : rgba(#000, 0.75) transition inherit > p diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index 716f7afc0c..25cfbf732b 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -6,7 +6,7 @@ <div> <x-profile/> - <ui-group> + <ui-card> <div slot="title">%fa:palette% %i18n:@design%</div> <div> @@ -39,9 +39,9 @@ <md-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</md-radio> <md-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</md-radio> </div> - </ui-group> + </ui-card> - <ui-group> + <ui-card> <div slot="title">%fa:cog% %i18n:@behavior%</div> <div> @@ -63,9 +63,9 @@ <div> <ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch> </div> - </ui-group> + </ui-card> - <ui-group> + <ui-card> <div slot="title">%fa:language% %i18n:@lang%</div> <md-field> @@ -80,9 +80,9 @@ </md-select> </md-field> <span class="md-helper-text">%fa:info-circle% %i18n:@lang-tip%</span> - </ui-group> + </ui-card> - <ui-group> + <ui-card> <div slot="title">%fa:B twitter% %i18n:@twitter%</div> <p class="account" v-if="$store.state.i.twitter"><a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p> @@ -91,9 +91,9 @@ <span v-if="$store.state.i.twitter"> or </span> <a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter">%i18n:@twitter-disconnect%</a> </p> - </ui-group> + </ui-card> - <ui-group> + <ui-card> <div slot="title">%fa:sync-alt% %i18n:@update%</div> <div>%i18n:@version% <i>{{ version }}</i></div> @@ -104,7 +104,7 @@ <template v-if="checkingForUpdate">%i18n:@update-checking%<mk-ellipsis/></template> <template v-else>%i18n:@check-for-updates%</template> </md-button> - </ui-group> + </ui-card> </div> <p><small>ver {{ version }} ({{ codename }})</small></p> </main> @@ -247,20 +247,17 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) - padding 0 16px margin 0 auto max-width 500px width 100% - > div - > * - margin-bottom 16px - > p display block - margin 24px + margin 16px 0 + padding 16px text-align center - color isDark ? #cad2da : #a2a9b1 + color isDark ? #cad2da : #2c662d + background #fcfff5 main[data-darkmode] root(true) diff --git a/src/client/app/mobile/views/pages/settings/settings.profile.vue b/src/client/app/mobile/views/pages/settings/settings.profile.vue index 73d876d14e..de891b5736 100644 --- a/src/client/app/mobile/views/pages/settings/settings.profile.vue +++ b/src/client/app/mobile/views/pages/settings/settings.profile.vue @@ -1,6 +1,6 @@ <template> -<ui-group> - <div slot="title">%fa:pencil-alt% %i18n:@title%</div> +<ui-card> + <div slot="title">%fa:user% %i18n:@title%</div> <ui-form :disabled="saving"> <ui-input v-model="name" :max="30"> @@ -41,7 +41,7 @@ <ui-button @click="save">%i18n:@save%</ui-button> </ui-form> -</ui-group> +</ui-card> </template> <script lang="ts"> From c5e9b69eb3b235e9828371affe0d8d88a780d096 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 14 Jun 2018 18:53:02 +0900 Subject: [PATCH 304/369] wip --- .../app/common/views/components/ui/card.vue | 14 +- .../app/common/views/components/ui/input.vue | 147 +++++++++++++++--- .../app/common/views/components/ui/switch.vue | 1 - .../common/views/components/ui/textarea.vue | 56 ++++++- .../views/pages/settings/settings.profile.vue | 4 +- 5 files changed, 188 insertions(+), 34 deletions(-) diff --git a/src/client/app/common/views/components/ui/card.vue b/src/client/app/common/views/components/ui/card.vue index 5ba15dad7d..97f06ca655 100644 --- a/src/client/app/common/views/components/ui/card.vue +++ b/src/client/app/common/views/components/ui/card.vue @@ -10,17 +10,23 @@ <script lang="ts"> import Vue from 'vue'; -export default Vue.extend({}); +export default Vue.extend({ + provide() { + return { + isCardChild: true + }; + } +}); </script> <style lang="stylus" scoped> @import '~const.styl' .ui-card - margin 16px 0 - padding 32px + margin 16px + padding 16px background #fff - //box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12) + box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12) > header font-weight bold diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue index 7461aac7fe..3a474f0243 100644 --- a/src/client/app/common/views/components/ui/input.vue +++ b/src/client/app/common/views/components/ui/input.vue @@ -1,21 +1,35 @@ <template> -<div class="ui-input" :class="{ focused, filled }"> +<div class="ui-input" :class="[{ focused, filled }, styl]"> + <div class="icon" ref="icon"><slot name="icon"></slot></div> <div class="input" @click="focus"> <div class="password-meter" v-if="withPasswordMeter" v-show="passwordStrength != ''" :data-strength="passwordStrength"> <div class="value" ref="passwordMetar"></div> </div> <span class="label" ref="label"><slot></slot></span> <div class="prefix" ref="prefix"><slot name="prefix"></slot></div> - <input ref="input" - :type="type" - :value="value" - :required="required" - :readonly="readonly" - :pattern="pattern" - :autocomplete="autocomplete" - @input="$emit('input', $event.target.value)" - @focus="focused = true" - @blur="focused = false"> + <template v-if="type != 'file'"> + <input ref="input" + :type="type" + :value="v" + :required="required" + :readonly="readonly" + :pattern="pattern" + :autocomplete="autocomplete" + @input="$emit('input', $event.target.value)" + @focus="focused = true" + @blur="focused = false"> + </template> + <template v-else> + <input ref="input" + type="text" + :value="placeholder" + readonly + @click="chooseFile"> + <input ref="file" + type="file" + :value="value" + @change="onChangeFile"> + </template> <div class="suffix"><slot name="suffix"></slot></div> </div> <div class="text"><slot name="text"></slot></div> @@ -59,17 +73,34 @@ export default Vue.extend({ }, data() { return { + v: this.value, focused: false, - passwordStrength: '' - } + passwordStrength: '', + styl: 'fill' + }; }, computed: { filled(): boolean { - return this.value != '' && this.value != null; + return this.v != '' && this.v != null; + }, + placeholder(): string { + if (this.type != 'file') return null; + if (this.v == null) return null; + + if (typeof this.v == 'string') return this.v; + + if (Array.isArray(this.v)) { + return this.v.map(file => file.name).join(', '); + } else { + return this.v.name; + } } }, watch: { value(v) { + this.v = v; + }, + v(v) { if (this.withPasswordMeter) { if (v == '') { this.passwordStrength = ''; @@ -82,6 +113,12 @@ export default Vue.extend({ } } }, + inject: ['isCardChild'], + created() { + if (this.isCardChild) { + this.styl = 'line'; + } + }, mounted() { if (this.$refs.prefix) { this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px'; @@ -90,6 +127,14 @@ export default Vue.extend({ methods: { focus() { this.$refs.input.focus(); + }, + chooseFile() { + this.$refs.file.click(); + }, + onChangeFile() { + this.v = Array.from((this.$refs.file as any).files); + this.$emit('input', this.v); + this.$emit('change', this.v); } } }); @@ -98,14 +143,52 @@ export default Vue.extend({ <style lang="stylus" scoped> @import '~const.styl' -.ui-input +root(isDark, fill) margin 32px 0 + > .icon + position absolute + top 0 + left 0 + width 24px + text-align center + line-height 32px + color rgba(#000, 0.54) + + &:not(:empty) + .input + margin-left 28px + > .input display flex - padding 6px 12px - background rgba(#000, 0.035) - border-radius 6px + + if fill + padding 6px 12px + background rgba(#000, 0.035) + border-radius 6px + else + &:before + content '' + display block + position absolute + bottom 0 + left 0 + right 0 + height 1px + background rgba(#000, 0.42) + + &:after + content '' + display block + position absolute + bottom 0 + left 0 + right 0 + height 2px + background $theme-color + opacity 0 + transform scaleX(0.12) + transition border 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.4, 0, 0.2, 1) + will-change border opacity transform > .password-meter position absolute @@ -142,7 +225,7 @@ export default Vue.extend({ > .label position absolute - top 6px + top fill ? 6px : 0 left 0 pointer-events none transition 0.4s cubic-bezier(0.25, 0.8, 0.25, 1) @@ -161,7 +244,7 @@ export default Vue.extend({ width 100% padding 0 font inherit - font-weight bold + font-weight fill ? bold : normal font-size 16px line-height 32px background transparent @@ -170,6 +253,9 @@ export default Vue.extend({ outline none box-shadow none + &[type='file'] + display none + > .prefix > .suffix display block @@ -199,7 +285,12 @@ export default Vue.extend({ &.focused > .input - background rgba(#000, 0.05) + if fill + background rgba(#000, 0.05) + else + &:after + opacity 1 + transform scaleX(1) > .label color $theme-color @@ -208,8 +299,20 @@ export default Vue.extend({ &.filled > .input > .label - top -24px + top fill ? -24px : -16px left 0 !important transform scale(0.8) +.ui-input[data-darkmode] + &.fill + root(true, true) + &:not(.fill) + root(true, false) + +.ui-input:not([data-darkmode]) + &.fill + root(false, true) + &:not(.fill) + root(false, false) + </style> diff --git a/src/client/app/common/views/components/ui/switch.vue b/src/client/app/common/views/components/ui/switch.vue index e78951a352..f860309867 100644 --- a/src/client/app/common/views/components/ui/switch.vue +++ b/src/client/app/common/views/components/ui/switch.vue @@ -143,7 +143,6 @@ root(isDark) > span display block line-height 20px - font-weight bold color isDark ? #c4ccd2 : rgba(#000, 0.75) transition inherit diff --git a/src/client/app/common/views/components/ui/textarea.vue b/src/client/app/common/views/components/ui/textarea.vue index 0a9f60f1bc..d5e2b15628 100644 --- a/src/client/app/common/views/components/ui/textarea.vue +++ b/src/client/app/common/views/components/ui/textarea.vue @@ -65,13 +65,43 @@ export default Vue.extend({ <style lang="stylus" scoped> @import '~const.styl' -.ui-textarea +root(isDark, fill) margin 32px 0 > .input padding 12px - background rgba(#000, 0.035) - border-radius 6px + + if fill + background rgba(#000, 0.035) + border-radius 6px + else + &:before + content '' + display block + position absolute + top 0 + bottom 0 + left 0 + right 0 + background none + border solid 1px rgba(#000, 0.42) + border-radius 3px + pointer-events none + + &:after + content '' + display block + position absolute + top 0 + bottom 0 + left 0 + right 0 + background none + border solid 2px $theme-color + border-radius 3px + opacity 0 + transition opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1) + pointer-events none > .label position absolute @@ -94,7 +124,7 @@ export default Vue.extend({ min-height 100px padding 0 font inherit - font-weight bold + font-weight fill ? bold : normal font-size 16px background transparent border none @@ -111,7 +141,11 @@ export default Vue.extend({ &.focused > .input - background rgba(#000, 0.05) + if fill + background rgba(#000, 0.05) + else + &:after + opacity 1 > .label color $theme-color @@ -124,4 +158,16 @@ export default Vue.extend({ left 0 !important transform scale(0.8) +.ui-textarea[data-darkmode] + &.fill + root(true, true) + &:not(.fill) + root(true, false) + +.ui-textarea:not([data-darkmode]) + &.fill + root(false, true) + &:not(.fill) + root(false, false) + </style> diff --git a/src/client/app/mobile/views/pages/settings/settings.profile.vue b/src/client/app/mobile/views/pages/settings/settings.profile.vue index de891b5736..64adac01e6 100644 --- a/src/client/app/mobile/views/pages/settings/settings.profile.vue +++ b/src/client/app/mobile/views/pages/settings/settings.profile.vue @@ -29,12 +29,12 @@ <ui-input type="file" @change="onAvatarChange"> <span>%i18n:@avatar%</span> - <span slot="prefix">%fa:picture-o%</span> + <span slot="icon">%fa:image%</span> </ui-input> <ui-input type="file" @change="onBannerChange"> <span>%i18n:@banner%</span> - <span slot="prefix">%fa:picture-o%</span> + <span slot="icon">%fa:image%</span> </ui-input> <ui-switch v-model="isCat">%i18n:@is-cat%</ui-switch> From 11e95ea092e2c1e5d8ee3defba3a8a211cc65864 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 14 Jun 2018 18:57:54 +0900 Subject: [PATCH 305/369] wip --- .../app/common/views/components/ui/button.vue | 48 ++++++++++++++++--- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/src/client/app/common/views/components/ui/button.vue b/src/client/app/common/views/components/ui/button.vue index 57747fd469..7723c83f57 100644 --- a/src/client/app/common/views/components/ui/button.vue +++ b/src/client/app/common/views/components/ui/button.vue @@ -14,6 +14,17 @@ export default Vue.extend({ type: String, required: false } + }, + data() { + return { + styl: 'fill' + }; + }, + inject: ['isCardChild'], + created() { + if (this.isCardChild) { + this.styl = 'line'; + } } }); </script> @@ -21,26 +32,49 @@ export default Vue.extend({ <style lang="stylus" scoped> @import '~const.styl' -.ui-button +root(isDark, fill) > button display block width 100% margin 0 padding 0 - color $theme-color-foreground font-weight bold font-size 16px line-height 44px - background $theme-color border none border-radius 6px outline none box-shadow none - &:hover - background lighten($theme-color, 5%) + if fill + color $theme-color-foreground + background $theme-color - &:active - background darken($theme-color, 5%) + &:hover + background lighten($theme-color, 5%) + + &:active + background darken($theme-color, 5%) + else + color $theme-color + background none + + &:hover + color darken($theme-color, 5%) + + &:active + background rgba($theme-color, 0.3) + +.ui-button[data-darkmode] + &.fill + root(true, true) + &:not(.fill) + root(true, false) + +.ui-button:not([data-darkmode]) + &.fill + root(false, true) + &:not(.fill) + root(false, false) </style> From dec7d537dca22f60ddc595c7fc34eabaca2c13f1 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 14 Jun 2018 20:23:50 +0900 Subject: [PATCH 306/369] wip --- .../app/common/views/components/index.ts | 4 + .../app/common/views/components/ui/radio.vue | 120 ++++++++++ .../app/common/views/components/ui/select.vue | 212 ++++++++++++++++++ .../app/common/views/components/ui/switch.vue | 2 +- .../app/mobile/views/pages/settings.vue | 22 +- 5 files changed, 347 insertions(+), 13 deletions(-) create mode 100644 src/client/app/common/views/components/ui/radio.vue create mode 100644 src/client/app/common/views/components/ui/select.vue diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts index 0e20e66f5a..b91008f718 100644 --- a/src/client/app/common/views/components/index.ts +++ b/src/client/app/common/views/components/index.ts @@ -35,6 +35,8 @@ import uiCard from './ui/card.vue'; import uiForm from './ui/form.vue'; import uiTextarea from './ui/textarea.vue'; import uiSwitch from './ui/switch.vue'; +import uiRadio from './ui/radio.vue'; +import uiSelect from './ui/select.vue'; Vue.component('mk-analog-clock', analogClock); Vue.component('mk-menu', menu); @@ -71,3 +73,5 @@ Vue.component('ui-card', uiCard); Vue.component('ui-form', uiForm); Vue.component('ui-textarea', uiTextarea); Vue.component('ui-switch', uiSwitch); +Vue.component('ui-radio', uiRadio); +Vue.component('ui-select', uiSelect); diff --git a/src/client/app/common/views/components/ui/radio.vue b/src/client/app/common/views/components/ui/radio.vue new file mode 100644 index 0000000000..2b7f1d9dd4 --- /dev/null +++ b/src/client/app/common/views/components/ui/radio.vue @@ -0,0 +1,120 @@ +<template> +<div + class="ui-radio" + :class="{ disabled, checked }" + :aria-checked="checked" + :aria-disabled="disabled" + @click="toggle" +> + <input type="radio" + :disabled="disabled" + > + <span class="button"> + <span></span> + </span> + <span class="label"><slot></slot></span> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +export default Vue.extend({ + model: { + prop: 'model', + event: 'change' + }, + props: { + model: { + type: String, + required: false + }, + value: { + type: String, + required: false + }, + disabled: { + type: Boolean, + default: false + } + }, + computed: { + checked(): boolean { + return this.model === this.value; + } + }, + methods: { + toggle() { + this.$emit('change', this.value); + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +root(isDark) + display inline-block + margin 32px 32px 32px 0 + cursor pointer + transition all 0.3s + + > * + user-select none + + &.disabled + opacity 0.6 + cursor not-allowed + + &.checked + > .button + border-color $theme-color + + &:after + background-color $theme-color + transform scale(1) + opacity 1 + + > input + position absolute + width 0 + height 0 + opacity 0 + margin 0 + + > .button + position absolute + width 20px + height 20px + background none + border solid 2px rgba(#000, 0.54) + border-radius 100% + transition inherit + + &:after + content '' + display block + position absolute + top 3px + right 3px + bottom 3px + left 3px + border-radius 100% + opacity 0 + transform scale(0) + transition 0.4s cubic-bezier(0.25, 0.8, 0.25, 1) + + > .label + margin-left 28px + display block + font-size 16px + line-height 20px + cursor pointer + +.ui-radio[data-darkmode] + root(true) + +.ui-radio:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/common/views/components/ui/select.vue b/src/client/app/common/views/components/ui/select.vue new file mode 100644 index 0000000000..c56ae86159 --- /dev/null +++ b/src/client/app/common/views/components/ui/select.vue @@ -0,0 +1,212 @@ +<template> +<div class="ui-select" :class="[{ focused, filled }, styl]"> + <div class="icon" ref="icon"><slot name="icon"></slot></div> + <div class="input" @click="focus"> + <span class="label" ref="label"><slot name="label"></slot></span> + <div class="prefix" ref="prefix"><slot name="prefix"></slot></div> + <select ref="input" + :value="v" + :required="required" + @input="$emit('input', $event.target.value)" + @focus="focused = true" + @blur="focused = false"> + <slot></slot> + </select> + <div class="suffix"><slot name="suffix"></slot></div> + </div> + <div class="text"><slot name="text"></slot></div> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; + +export default Vue.extend({ + props: { + value: { + required: false + }, + required: { + type: Boolean, + required: false + } + }, + data() { + return { + v: this.value, + focused: false, + styl: 'fill' + }; + }, + computed: { + filled(): boolean { + return this.v != '' && this.v != null; + } + }, + watch: { + value(v) { + this.v = v; + } + }, + inject: ['isCardChild'], + created() { + if (this.isCardChild) { + this.styl = 'line'; + } + }, + mounted() { + if (this.$refs.prefix) { + this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px'; + } + }, + methods: { + focus() { + this.$refs.input.focus(); + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +root(isDark, fill) + margin 32px 0 + + > .icon + position absolute + top 0 + left 0 + width 24px + text-align center + line-height 32px + color rgba(#000, 0.54) + + &:not(:empty) + .input + margin-left 28px + + > .input + display flex + + if fill + padding 6px 12px + background rgba(#000, 0.035) + border-radius 6px + else + &:before + content '' + display block + position absolute + bottom 0 + left 0 + right 0 + height 1px + background rgba(#000, 0.42) + + &:after + content '' + display block + position absolute + bottom 0 + left 0 + right 0 + height 2px + background $theme-color + opacity 0 + transform scaleX(0.12) + transition border 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.4, 0, 0.2, 1) + will-change border opacity transform + + > .label + position absolute + top fill ? 6px : 0 + left 0 + pointer-events none + transition 0.4s cubic-bezier(0.25, 0.8, 0.25, 1) + transition-duration 0.3s + font-size 16px + line-height 32px + color rgba(#000, 0.54) + pointer-events none + //will-change transform + transform-origin top left + transform scale(1) + + > select + display block + flex 1 + width 100% + padding 0 + font inherit + font-weight fill ? bold : normal + font-size 16px + height 32px + background transparent + border none + border-radius 0 + outline none + box-shadow none + + &[type='file'] + display none + + > .prefix + > .suffix + display block + align-self center + justify-self center + font-size 16px + line-height 32px + color rgba(#000, 0.54) + pointer-events none + + > * + display block + min-width 16px + + > .prefix + padding-right 4px + + > .suffix + padding-left 4px + + > .text + margin 6px 0 + font-size 13px + + * + margin 0 + + &.focused + > .input + if fill + background rgba(#000, 0.05) + else + &:after + opacity 1 + transform scaleX(1) + + > .label + color $theme-color + + &.focused + &.filled + > .input + > .label + top fill ? -24px : -16px + left 0 !important + transform scale(0.8) + +.ui-select[data-darkmode] + &.fill + root(true, true) + &:not(.fill) + root(true, false) + +.ui-select:not([data-darkmode]) + &.fill + root(false, true) + &:not(.fill) + root(false, false) + +</style> diff --git a/src/client/app/common/views/components/ui/switch.vue b/src/client/app/common/views/components/ui/switch.vue index f860309867..2431a76528 100644 --- a/src/client/app/common/views/components/ui/switch.vue +++ b/src/client/app/common/views/components/ui/switch.vue @@ -117,7 +117,7 @@ root(isDark) margin 3px 0 0 0 width 34px height 14px - background isDark ? rgba(#fff, 0.1) : rgba(#000, 0.05) + background isDark ? rgba(#fff, 0.1) : rgba(#000, 0.07) outline none border-radius 14px transition inherit diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index 25cfbf732b..beac788482 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -36,8 +36,8 @@ <div> <div class="md-body-2">%i18n:@post-style%</div> - <md-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</md-radio> - <md-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</md-radio> + <ui-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</ui-radio> + <ui-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</ui-radio> </div> </ui-card> @@ -68,17 +68,15 @@ <ui-card> <div slot="title">%fa:language% %i18n:@lang%</div> - <md-field> - <md-select v-model="lang" placeholder="%i18n:@auto%"> - <md-optgroup label="%i18n:@recommended%"> - <md-option value="">%i18n:@auto%</md-option> - </md-optgroup> + <ui-select v-model="lang" placeholder="%i18n:@auto%"> + <optgroup label="%i18n:@recommended%"> + <option value="">%i18n:@auto%</option> + </optgroup> - <md-optgroup label="%i18n:@specify-language%"> - <md-option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</md-option> - </md-optgroup> - </md-select> - </md-field> + <optgroup label="%i18n:@specify-language%"> + <option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</option> + </optgroup> + </ui-select> <span class="md-helper-text">%fa:info-circle% %i18n:@lang-tip%</span> </ui-card> From d90f75425f0449bcb04e462250a4495b63be39a0 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 14 Jun 2018 21:38:39 +0900 Subject: [PATCH 307/369] wip --- .../app/common/views/components/ui/card.vue | 16 ++++--- .../app/common/views/components/ui/input.vue | 13 +++--- .../app/common/views/components/ui/select.vue | 4 +- .../app/common/views/components/ui/switch.vue | 43 ++++--------------- .../common/views/components/ui/textarea.vue | 7 +-- 5 files changed, 33 insertions(+), 50 deletions(-) diff --git a/src/client/app/common/views/components/ui/card.vue b/src/client/app/common/views/components/ui/card.vue index 97f06ca655..e2b15240e4 100644 --- a/src/client/app/common/views/components/ui/card.vue +++ b/src/client/app/common/views/components/ui/card.vue @@ -22,15 +22,21 @@ export default Vue.extend({ <style lang="stylus" scoped> @import '~const.styl' -.ui-card +root(isDark) margin 16px padding 16px - background #fff + background isDark ? #282C37 : #fff box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12) > header - font-weight bold - font-size 28px - color #444 + font-weight normal + font-size 24px + color isDark ? #fff : #444 + +.ui-card[data-darkmode] + root(true) + +.ui-card:not([data-darkmode]) + root(false) </style> diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue index 3a474f0243..167dd4e2a9 100644 --- a/src/client/app/common/views/components/ui/input.vue +++ b/src/client/app/common/views/components/ui/input.vue @@ -153,7 +153,7 @@ root(isDark, fill) width 24px text-align center line-height 32px - color rgba(#000, 0.54) + color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54) &:not(:empty) + .input margin-left 28px @@ -174,7 +174,7 @@ root(isDark, fill) left 0 right 0 height 1px - background rgba(#000, 0.42) + background isDark ? rgba(#fff, 0.7) : rgba(#000, 0.42) &:after content '' @@ -232,7 +232,7 @@ root(isDark, fill) transition-duration 0.3s font-size 16px line-height 32px - color rgba(#000, 0.54) + color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54) pointer-events none //will-change transform transform-origin top left @@ -247,6 +247,7 @@ root(isDark, fill) font-weight fill ? bold : normal font-size 16px line-height 32px + color isDark ? #fff : #000 background transparent border none border-radius 0 @@ -263,7 +264,7 @@ root(isDark, fill) justify-self center font-size 16px line-height 32px - color rgba(#000, 0.54) + color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54) pointer-events none > * @@ -299,9 +300,9 @@ root(isDark, fill) &.filled > .input > .label - top fill ? -24px : -16px + top fill ? -24px : -17px left 0 !important - transform scale(0.8) + transform scale(0.75) .ui-input[data-darkmode] &.fill diff --git a/src/client/app/common/views/components/ui/select.vue b/src/client/app/common/views/components/ui/select.vue index c56ae86159..4577a15f68 100644 --- a/src/client/app/common/views/components/ui/select.vue +++ b/src/client/app/common/views/components/ui/select.vue @@ -193,9 +193,9 @@ root(isDark, fill) &.filled > .input > .label - top fill ? -24px : -16px + top fill ? -24px : -17px left 0 !important - transform scale(0.8) + transform scale(0.75) .ui-select[data-darkmode] &.fill diff --git a/src/client/app/common/views/components/ui/switch.vue b/src/client/app/common/views/components/ui/switch.vue index 2431a76528..24611b9aa0 100644 --- a/src/client/app/common/views/components/ui/switch.vue +++ b/src/client/app/common/views/components/ui/switch.vue @@ -5,15 +5,13 @@ role="switch" :aria-checked="checked" :aria-disabled="disabled" - @click="switchValue" - @mouseover="mouseenter" + @click="toggle" > <input type="checkbox" - @change="handleChange" ref="input" :disabled="disabled" - @keydown.enter="switchValue" + @keydown.enter="toggle" > <span class="button"> <span></span> @@ -30,6 +28,10 @@ <script lang="ts"> import Vue from 'vue'; export default Vue.extend({ + model: { + prop: 'value', + event: 'change' + }, props: { value: { type: Boolean, @@ -39,42 +41,15 @@ export default Vue.extend({ type: Boolean, default: false } - },/* - created() { - if (!~[true, false].indexOf(this.value)) { - this.$emit('input', false); - } - },*/ + }, computed: { checked(): boolean { return this.value; } }, - watch: { - value() { - (this.$el).style.transition = 'all 0.3s'; - (this.$refs.input as any).checked = this.checked; - } - }, - mounted() { - (this.$refs.input as any).checked = this.checked; - }, methods: { - mouseenter() { - (this.$el).style.transition = 'all 0s'; - }, - handleChange() { - (this.$el).style.transition = 'all 0.3s'; - this.$emit('input', !this.checked); + toggle() { this.$emit('change', !this.checked); - this.$nextTick(() => { - // set input's checked property - // in case parent refuses to change component's value - (this.$refs.input as any).checked = this.checked; - }); - }, - switchValue() { - !this.disabled && this.handleChange(); } } }); @@ -117,7 +92,7 @@ root(isDark) margin 3px 0 0 0 width 34px height 14px - background isDark ? rgba(#fff, 0.1) : rgba(#000, 0.07) + background isDark ? rgba(#fff, 0.1) : rgba(#000, 0.25) outline none border-radius 14px transition inherit diff --git a/src/client/app/common/views/components/ui/textarea.vue b/src/client/app/common/views/components/ui/textarea.vue index d5e2b15628..cc6b376ead 100644 --- a/src/client/app/common/views/components/ui/textarea.vue +++ b/src/client/app/common/views/components/ui/textarea.vue @@ -84,7 +84,7 @@ root(isDark, fill) left 0 right 0 background none - border solid 1px rgba(#000, 0.42) + border solid 1px isDark ? rgba(#fff, 0.7) : rgba(#000, 0.42) border-radius 3px pointer-events none @@ -112,7 +112,7 @@ root(isDark, fill) transition-duration 0.3s font-size 16px line-height 32px - color rgba(#000, 0.54) + color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54) pointer-events none //will-change transform transform-origin top left @@ -126,6 +126,7 @@ root(isDark, fill) font inherit font-weight fill ? bold : normal font-size 16px + color isDark ? #fff : #000 background transparent border none border-radius 0 @@ -156,7 +157,7 @@ root(isDark, fill) > .label top -24px left 0 !important - transform scale(0.8) + transform scale(0.75) .ui-textarea[data-darkmode] &.fill From 0ac9120064b295a363b74a2c2afc487db2b50908 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 15 Jun 2018 07:56:56 +0900 Subject: [PATCH 308/369] wip --- .../app/common/views/components/signup.vue | 10 +-- .../app/common/views/components/ui/button.vue | 8 +- .../app/common/views/components/ui/card.vue | 4 + .../app/common/views/components/ui/form.vue | 2 +- .../app/common/views/components/ui/input.vue | 8 +- .../app/common/views/components/ui/radio.vue | 2 +- .../app/common/views/components/ui/select.vue | 11 ++- .../app/common/views/components/ui/switch.vue | 2 +- src/client/app/config.ts | 4 + .../app/mobile/views/pages/settings.vue | 79 +++++++------------ .../views/pages/settings/settings.profile.vue | 17 ++-- src/client/app/mobile/views/pages/welcome.vue | 6 +- src/config/types.ts | 2 + webpack.config.ts | 2 + 14 files changed, 80 insertions(+), 77 deletions(-) diff --git a/src/client/app/common/views/components/signup.vue b/src/client/app/common/views/components/signup.vue index d1621a4848..987cc7e52d 100644 --- a/src/client/app/common/views/components/signup.vue +++ b/src/client/app/common/views/components/signup.vue @@ -1,6 +1,6 @@ <template> -<form class="mk-signup" @submit.prevent="onSubmit" autocomplete="off"> - <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" autocomplete="off" required @input="onChangeUsername"> +<form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()"> + <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" required @input="onChangeUsername"> <span>%i18n:@username%</span> <span slot="prefix">@</span> <span slot="suffix">@{{ host }}</span> @@ -12,7 +12,7 @@ <p slot="text" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-short%</p> <p slot="text" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-long%</p> </ui-input> - <ui-input v-model="password" type="password" autocomplete="off" required @input="onChangePassword" :with-password-meter="true"> + <ui-input v-model="password" type="password" :autocomplete="Math.random()" required @input="onChangePassword" :with-password-meter="true"> <span>%i18n:@password%</span> <span slot="prefix">%fa:lock%</span> <div slot="text"> @@ -21,7 +21,7 @@ <p slot="text" v-if="passwordStrength == 'high'" style="color:#3CB7B5">%fa:check .fw% %i18n:@strong-password%</p> </div> </ui-input> - <ui-input v-model="retypedPassword" type="password" autocomplete="off" required @input="onChangePasswordRetype"> + <ui-input v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @input="onChangePasswordRetype"> <span>%i18n:@password% (%i18n:@retype%)</span> <span slot="prefix">%fa:lock%</span> <div slot="text"> @@ -31,7 +31,7 @@ </ui-input> <div class="g-recaptcha" :data-sitekey="recaptchaSitekey" style="margin: 16px 0;"></div> <label class="agree-tou" style="display: block; margin: 16px 0;"> - <input name="agree-tou" type="checkbox" autocomplete="off" required/> + <input name="agree-tou" type="checkbox" required/> <p><a :href="touUrl" target="_blank">利用規約</a>に同意する</p> </label> <ui-button type="submit">%i18n:@create%</ui-button> diff --git a/src/client/app/common/views/components/ui/button.vue b/src/client/app/common/views/components/ui/button.vue index 7723c83f57..e778750354 100644 --- a/src/client/app/common/views/components/ui/button.vue +++ b/src/client/app/common/views/components/ui/button.vue @@ -1,6 +1,6 @@ <template> -<div class="ui-button"> - <button :type="type"> +<div class="ui-button" :class="[styl]"> + <button :type="type" @click="$emit('click')"> <slot></slot> </button> </div> @@ -20,7 +20,9 @@ export default Vue.extend({ styl: 'fill' }; }, - inject: ['isCardChild'], + inject: { + isCardChild: { default: false } + }, created() { if (this.isCardChild) { this.styl = 'line'; diff --git a/src/client/app/common/views/components/ui/card.vue b/src/client/app/common/views/components/ui/card.vue index e2b15240e4..05c51bca6b 100644 --- a/src/client/app/common/views/components/ui/card.vue +++ b/src/client/app/common/views/components/ui/card.vue @@ -25,9 +25,13 @@ export default Vue.extend({ root(isDark) margin 16px padding 16px + color isDark ? #fff : #000 background isDark ? #282C37 : #fff box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12) + @media (min-width 500px) + padding 32px + > header font-weight normal font-size 24px diff --git a/src/client/app/common/views/components/ui/form.vue b/src/client/app/common/views/components/ui/form.vue index b6b4a76d2a..fc8fdad9c4 100644 --- a/src/client/app/common/views/components/ui/form.vue +++ b/src/client/app/common/views/components/ui/form.vue @@ -11,7 +11,7 @@ import Vue from 'vue'; export default Vue.extend({ props: { disabled: { - type: String, + type: Boolean, required: false } } diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue index 167dd4e2a9..ec91ca364c 100644 --- a/src/client/app/common/views/components/ui/input.vue +++ b/src/client/app/common/views/components/ui/input.vue @@ -1,7 +1,7 @@ <template> <div class="ui-input" :class="[{ focused, filled }, styl]"> <div class="icon" ref="icon"><slot name="icon"></slot></div> - <div class="input" @click="focus"> + <div class="input" @click="focus" @mousedown="focus"> <div class="password-meter" v-if="withPasswordMeter" v-show="passwordStrength != ''" :data-strength="passwordStrength"> <div class="value" ref="passwordMetar"></div> </div> @@ -62,7 +62,6 @@ export default Vue.extend({ required: false }, autocomplete: { - type: String, required: false }, withPasswordMeter: { @@ -113,7 +112,9 @@ export default Vue.extend({ } } }, - inject: ['isCardChild'], + inject: { + isCardChild: { default: false } + }, created() { if (this.isCardChild) { this.styl = 'line'; @@ -160,6 +161,7 @@ root(isDark, fill) > .input display flex + cursor text if fill padding 6px 12px diff --git a/src/client/app/common/views/components/ui/radio.vue b/src/client/app/common/views/components/ui/radio.vue index 2b7f1d9dd4..04a46c5a96 100644 --- a/src/client/app/common/views/components/ui/radio.vue +++ b/src/client/app/common/views/components/ui/radio.vue @@ -87,7 +87,7 @@ root(isDark) width 20px height 20px background none - border solid 2px rgba(#000, 0.54) + border solid 2px isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54) border-radius 100% transition inherit diff --git a/src/client/app/common/views/components/ui/select.vue b/src/client/app/common/views/components/ui/select.vue index 4577a15f68..4273a4a0de 100644 --- a/src/client/app/common/views/components/ui/select.vue +++ b/src/client/app/common/views/components/ui/select.vue @@ -48,7 +48,9 @@ export default Vue.extend({ this.v = v; } }, - inject: ['isCardChild'], + inject: { + isCardChild: { default: false } + }, created() { if (this.isCardChild) { this.styl = 'line'; @@ -101,7 +103,7 @@ root(isDark, fill) left 0 right 0 height 1px - background rgba(#000, 0.42) + background isDark ? rgba(#fff, 0.7) : rgba(#000, 0.42) &:after content '' @@ -141,14 +143,15 @@ root(isDark, fill) font-weight fill ? bold : normal font-size 16px height 32px + color isDark ? #fff : #000 background transparent border none border-radius 0 outline none box-shadow none - &[type='file'] - display none + * + color #000 > .prefix > .suffix diff --git a/src/client/app/common/views/components/ui/switch.vue b/src/client/app/common/views/components/ui/switch.vue index 24611b9aa0..a9e00d73d2 100644 --- a/src/client/app/common/views/components/ui/switch.vue +++ b/src/client/app/common/views/components/ui/switch.vue @@ -92,7 +92,7 @@ root(isDark) margin 3px 0 0 0 width 34px height 14px - background isDark ? rgba(#fff, 0.1) : rgba(#000, 0.25) + background isDark ? rgba(#fff, 0.15) : rgba(#000, 0.25) outline none border-radius 14px transition inherit diff --git a/src/client/app/config.ts b/src/client/app/config.ts index 70c085de1c..e4a7ff6d38 100644 --- a/src/client/app/config.ts +++ b/src/client/app/config.ts @@ -1,6 +1,8 @@ declare const _HOST_: string; declare const _HOSTNAME_: string; declare const _URL_: string; +declare const _NAME_: string; +declare const _DESCRIPTION_: string; declare const _API_URL_: string; declare const _WS_URL_: string; declare const _DOCS_URL_: string; @@ -21,6 +23,8 @@ declare const _GOOGLE_MAPS_API_KEY_: string; export const host = _HOST_; export const hostname = _HOSTNAME_; export const url = _URL_; +export const name = _NAME_; +export const description = _DESCRIPTION_; export const apiUrl = _API_URL_; export const wsUrl = _WS_URL_; export const docsUrl = _DOCS_URL_; diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index beac788482..2a32e982ba 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -1,41 +1,27 @@ <template> <mk-ui> <span slot="header">%fa:cog%%i18n:@settings%</span> - <main> - <p v-html="'%i18n:@signed-in-as%'.replace('{}', '<b>' + name + '</b>')"></p> + <main :data-darkmode="$store.state.device.darkmode"> + <div class="signin-as" v-html="'%i18n:@signed-in-as%'.replace('{}', '<b>' + name + '</b>')"></div> + <div> <x-profile/> <ui-card> <div slot="title">%fa:palette% %i18n:@design%</div> - <div> - <ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch> - </div> - - <div> - <ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch> - </div> + <ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch> + <ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch> <div> <div class="md-body-2">%i18n:@timeline%</div> - - <div> - <ui-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</ui-switch> - </div> - - <div> - <ui-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch> - </div> - - <div> - <ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch> - </div> + <ui-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</ui-switch> + <ui-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch> + <ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch> </div> <div> <div class="md-body-2">%i18n:@post-style%</div> - <ui-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</ui-radio> <ui-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</ui-radio> </div> @@ -43,26 +29,11 @@ <ui-card> <div slot="title">%fa:cog% %i18n:@behavior%</div> - - <div> - <ui-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</ui-switch> - </div> - - <div> - <ui-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</ui-switch> - </div> - - <div> - <ui-switch v-model="loadRawImages">%i18n:@load-raw-images%</ui-switch> - </div> - - <div> - <ui-switch v-model="$store.state.settings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</ui-switch> - </div> - - <div> - <ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch> - </div> + <ui-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</ui-switch> + <ui-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</ui-switch> + <ui-switch v-model="loadRawImages">%i18n:@load-raw-images%</ui-switch> + <ui-switch v-model="$store.state.settings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</ui-switch> + <ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch> </ui-card> <ui-card> @@ -98,13 +69,16 @@ <template v-if="latestVersion !== undefined"> <div>%i18n:@latest-version% <i>{{ latestVersion ? latestVersion : version }}</i></div> </template> - <md-button class="md-raised md-primary" @click="checkForUpdate" :disabled="checkingForUpdate"> + <ui-button class="md-raised md-primary" @click="checkForUpdate" :disabled="checkingForUpdate"> <template v-if="checkingForUpdate">%i18n:@update-checking%<mk-ellipsis/></template> <template v-else>%i18n:@check-for-updates%</template> - </md-button> + </ui-button> </ui-card> </div> - <p><small>ver {{ version }} ({{ codename }})</small></p> + + <footer> + <small>ver {{ version }} ({{ codename }})</small> + </footer> </main> </mk-ui> </template> @@ -249,13 +223,18 @@ root(isDark) max-width 500px width 100% - > p - display block - margin 16px 0 + > .signin-as + margin 16px padding 16px text-align center - color isDark ? #cad2da : #2c662d - background #fcfff5 + color isDark ? #49ab63 : #2c662d + background isDark ? #273c34 : #fcfff5 + box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12) + + > footer + margin 16px + text-align center + color isDark ? #c9d2e0 : #888 main[data-darkmode] root(true) diff --git a/src/client/app/mobile/views/pages/settings/settings.profile.vue b/src/client/app/mobile/views/pages/settings/settings.profile.vue index 64adac01e6..da97cbebd7 100644 --- a/src/client/app/mobile/views/pages/settings/settings.profile.vue +++ b/src/client/app/mobile/views/pages/settings/settings.profile.vue @@ -30,11 +30,13 @@ <ui-input type="file" @change="onAvatarChange"> <span>%i18n:@avatar%</span> <span slot="icon">%fa:image%</span> + <span slot="text" v-if="avatarUploading">%i18n:@uploading%<mk-ellipsis/></span> </ui-input> <ui-input type="file" @change="onBannerChange"> <span>%i18n:@banner%</span> <span slot="icon">%fa:image%</span> + <span slot="text" v-if="bannerUploading">%i18n:@uploading%<mk-ellipsis/></span> </ui-input> <ui-switch v-model="isCat">%i18n:@is-cat%</ui-switch> @@ -62,7 +64,8 @@ export default Vue.extend({ isBot: false, isCat: false, saving: false, - uploading: false + avatarUploading: false, + bannerUploading: false }; }, @@ -80,7 +83,7 @@ export default Vue.extend({ methods: { onAvatarChange([file]) { - this.uploading = true; + this.avatarUploading = true; const data = new FormData(); data.append('file', file); @@ -93,16 +96,16 @@ export default Vue.extend({ .then(response => response.json()) .then(f => { this.avatarId = f.id; - this.uploading = false; + this.avatarUploading = false; }) .catch(e => { - this.uploading = false; + this.avatarUploading = false; alert('%18n:!@upload-failed%'); }); }, onBannerChange([file]) { - this.uploading = true; + this.bannerUploading = true; const data = new FormData(); data.append('file', file); @@ -115,10 +118,10 @@ export default Vue.extend({ .then(response => response.json()) .then(f => { this.bannerId = f.id; - this.uploading = false; + this.bannerUploading = false; }) .catch(e => { - this.uploading = false; + this.bannerUploading = false; alert('%18n:!@upload-failed%'); }); }, diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue index 3b37a185bd..3bf2a0af9f 100644 --- a/src/client/app/mobile/views/pages/welcome.vue +++ b/src/client/app/mobile/views/pages/welcome.vue @@ -35,7 +35,7 @@ <script lang="ts"> import Vue from 'vue'; -import { apiUrl, copyright, host } from '../../../config'; +import { apiUrl, copyright, host, name, description } from '../../../config'; export default Vue.extend({ data() { @@ -48,7 +48,9 @@ export default Vue.extend({ apiUrl, copyright, users: [], - host + host, + name, + description }; }, mounted() { diff --git a/src/config/types.ts b/src/config/types.ts index 910c03c2c1..d557f2afde 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -15,6 +15,8 @@ export type Source = { */ url: string; }; + name?: string; + description?: string; url: string; port: number; https?: { [x: string]: string }; diff --git a/webpack.config.ts b/webpack.config.ts index 67fb929449..8376cd9c40 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -79,6 +79,8 @@ const consts = { _DEV_URL_: config.dev_url, _LANG_: '%lang%', _LANGS_: Object.keys(locales).map(l => [l, locales[l].meta.lang]), + _NAME_: config.name, + _DESCRIPTION_: config.description, _HOST_: config.host, _HOSTNAME_: config.hostname, _URL_: config.url, From bddff17e5e22104a799d0147301570239a895fbc Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 15 Jun 2018 07:58:27 +0900 Subject: [PATCH 309/369] wip --- src/client/app/mobile/views/pages/settings.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index 2a32e982ba..1c5a43ede4 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -14,14 +14,14 @@ <ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch> <div> - <div class="md-body-2">%i18n:@timeline%</div> + <div>%i18n:@timeline%</div> <ui-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</ui-switch> <ui-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch> <ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch> </div> <div> - <div class="md-body-2">%i18n:@post-style%</div> + <div>%i18n:@post-style%</div> <ui-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</ui-radio> <ui-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</ui-radio> </div> @@ -48,7 +48,7 @@ <option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</option> </optgroup> </ui-select> - <span class="md-helper-text">%fa:info-circle% %i18n:@lang-tip%</span> + <span>%fa:info-circle% %i18n:@lang-tip%</span> </ui-card> <ui-card> @@ -69,7 +69,7 @@ <template v-if="latestVersion !== undefined"> <div>%i18n:@latest-version% <i>{{ latestVersion ? latestVersion : version }}</i></div> </template> - <ui-button class="md-raised md-primary" @click="checkForUpdate" :disabled="checkingForUpdate"> + <ui-button @click="checkForUpdate" :disabled="checkingForUpdate"> <template v-if="checkingForUpdate">%i18n:@update-checking%<mk-ellipsis/></template> <template v-else>%i18n:@check-for-updates%</template> </ui-button> From 3ebaf83ce08e1e9ce4fa016c3ff47a63247c18f8 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 15 Jun 2018 08:00:14 +0900 Subject: [PATCH 310/369] 2.39.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b1b8888b5c..525c6171ce 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.38.3", - "clientVersion": "1.0.6486", + "version": "2.39.0", + "clientVersion": "1.0.6501", "codename": "nighthike", "main": "./built/index.js", "private": true, From ad8aa1c1797c5d740fb6d17ba8e0586472cd25e2 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 15 Jun 2018 09:33:25 +0900 Subject: [PATCH 311/369] Fix --- src/client/app/common/views/components/ui/input.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue index ec91ca364c..a5e47afd53 100644 --- a/src/client/app/common/views/components/ui/input.vue +++ b/src/client/app/common/views/components/ui/input.vue @@ -244,6 +244,7 @@ root(isDark, fill) display block flex 1 width 100% + margin 0 padding 0 font inherit font-weight fill ? bold : normal From bd827f946a94061f9f720cafe26323ccb605ee92 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 15 Jun 2018 09:53:30 +0900 Subject: [PATCH 312/369] =?UTF-8?q?=E3=83=89=E3=83=A9=E3=82=A4=E3=83=96?= =?UTF-8?q?=E3=81=AE=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AE=E5=89=8A?= =?UTF-8?q?=E9=99=A4=E3=82=92=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../desktop/views/components/drive.file.vue | 6 ++-- .../app/desktop/views/components/drive.vue | 6 ++++ .../views/components/drive.file-detail.vue | 20 ++++++------ .../app/mobile/views/components/drive.vue | 6 ++++ src/server/api/endpoints/drive/files.ts | 6 +++- .../api/endpoints/drive/files/delete.ts | 32 +++++++++++++++++++ src/services/drive/add-file.ts | 31 +++--------------- src/services/drive/delete-file.ts | 30 +++++++++++++++++ 8 files changed, 98 insertions(+), 39 deletions(-) create mode 100644 src/server/api/endpoints/drive/files/delete.ts create mode 100644 src/services/drive/delete-file.ts diff --git a/src/client/app/desktop/views/components/drive.file.vue b/src/client/app/desktop/views/components/drive.file.vue index a4531e221f..86addb1318 100644 --- a/src/client/app/desktop/views/components/drive.file.vue +++ b/src/client/app/desktop/views/components/drive.file.vue @@ -145,7 +145,7 @@ export default Vue.extend({ (this as any).api('drive/files/update', { fileId: this.file.id, name: name - }) + }); }); }, @@ -173,7 +173,9 @@ export default Vue.extend({ }, deleteFile() { - alert('not implemented yet'); + (this as any).api('drive/files/delete', { + fileId: this.file.id + }); } } }); diff --git a/src/client/app/desktop/views/components/drive.vue b/src/client/app/desktop/views/components/drive.vue index b69c884089..df141b6d6c 100644 --- a/src/client/app/desktop/views/components/drive.vue +++ b/src/client/app/desktop/views/components/drive.vue @@ -118,6 +118,7 @@ export default Vue.extend({ this.connection.on('file_created', this.onStreamDriveFileCreated); this.connection.on('file_updated', this.onStreamDriveFileUpdated); + this.connection.on('file_deleted', this.onStreamDriveFileDeleted); this.connection.on('folder_created', this.onStreamDriveFolderCreated); this.connection.on('folder_updated', this.onStreamDriveFolderUpdated); @@ -130,6 +131,7 @@ export default Vue.extend({ beforeDestroy() { this.connection.off('file_created', this.onStreamDriveFileCreated); this.connection.off('file_updated', this.onStreamDriveFileUpdated); + this.connection.off('file_deleted', this.onStreamDriveFileDeleted); this.connection.off('folder_created', this.onStreamDriveFolderCreated); this.connection.off('folder_updated', this.onStreamDriveFolderUpdated); (this as any).os.streams.driveStream.dispose(this.connectionId); @@ -167,6 +169,10 @@ export default Vue.extend({ } }, + onStreamDriveFileDeleted(fileId) { + this.removeFile(fileId); + }, + onStreamDriveFolderCreated(folder) { this.addFolder(folder, true); }, diff --git a/src/client/app/mobile/views/components/drive.file-detail.vue b/src/client/app/mobile/views/components/drive.file-detail.vue index ad29135268..f6a22f95f0 100644 --- a/src/client/app/mobile/views/components/drive.file-detail.vue +++ b/src/client/app/mobile/views/components/drive.file-detail.vue @@ -34,15 +34,10 @@ </div> <div class="menu"> <div> - <a :href="`${file.url}?download`" :download="file.name"> - %fa:download%%i18n:@download% - </a> - <button @click="rename"> - %fa:pencil-alt%%i18n:@rename% - </button> - <button @click="move"> - %fa:R folder-open%%i18n:@move% - </button> + <a :href="`${file.url}?download`" :download="file.name">%fa:download%%i18n:@download%</a> + <button @click="rename">%fa:pencil-alt%%i18n:@rename%</button> + <button @click="move">%fa:R folder-open%%i18n:@move%</button> + <button @click="del">%fa:trash-alt R%%i18n:@delete%</button> </div> </div> <div class="exif" v-show="exif"> @@ -112,6 +107,13 @@ export default Vue.extend({ }); }); }, + del() { + (this as any).api('drive/files/delete', { + fileId: this.file.id + }).then(() => { + this.browser.cd(this.file.folderId, true); + }); + }, showCreatedAt() { alert(new Date(this.file.createdAt).toLocaleString()); }, diff --git a/src/client/app/mobile/views/components/drive.vue b/src/client/app/mobile/views/components/drive.vue index 8adf6d8543..c313d225e4 100644 --- a/src/client/app/mobile/views/components/drive.vue +++ b/src/client/app/mobile/views/components/drive.vue @@ -100,6 +100,7 @@ export default Vue.extend({ this.connection.on('file_created', this.onStreamDriveFileCreated); this.connection.on('file_updated', this.onStreamDriveFileUpdated); + this.connection.on('file_deleted', this.onStreamDriveFileDeleted); this.connection.on('folder_created', this.onStreamDriveFolderCreated); this.connection.on('folder_updated', this.onStreamDriveFolderUpdated); @@ -118,6 +119,7 @@ export default Vue.extend({ beforeDestroy() { this.connection.off('file_created', this.onStreamDriveFileCreated); this.connection.off('file_updated', this.onStreamDriveFileUpdated); + this.connection.off('file_deleted', this.onStreamDriveFileDeleted); this.connection.off('folder_created', this.onStreamDriveFolderCreated); this.connection.off('folder_updated', this.onStreamDriveFolderUpdated); (this as any).os.streams.driveStream.dispose(this.connectionId); @@ -136,6 +138,10 @@ export default Vue.extend({ } }, + onStreamDriveFileDeleted(fileId) { + this.removeFile(fileId); + }, + onStreamDriveFolderCreated(folder) { this.addFolder(folder, true); }, diff --git a/src/server/api/endpoints/drive/files.ts b/src/server/api/endpoints/drive/files.ts index ab4b18cef4..0f0e3d65a8 100644 --- a/src/server/api/endpoints/drive/files.ts +++ b/src/server/api/endpoints/drive/files.ts @@ -37,10 +37,13 @@ module.exports = async (params, user, app) => { const sort = { _id: -1 }; + const query = { 'metadata.userId': user._id, - 'metadata.folderId': folderId + 'metadata.folderId': folderId, + 'metadata.deletedAt': { $exists: false } } as any; + if (sinceId) { sort._id = 1; query._id = { @@ -51,6 +54,7 @@ module.exports = async (params, user, app) => { $lt: untilId }; } + if (type) { query.contentType = new RegExp(`^${type.replace(/\*/g, '.+?')}$`); } diff --git a/src/server/api/endpoints/drive/files/delete.ts b/src/server/api/endpoints/drive/files/delete.ts new file mode 100644 index 0000000000..a722b4e825 --- /dev/null +++ b/src/server/api/endpoints/drive/files/delete.ts @@ -0,0 +1,32 @@ +import $ from 'cafy'; import ID from '../../../../../cafy-id'; +import DriveFile from '../../../../../models/drive-file'; +import del from '../../../../../services/drive/delete-file'; +import { publishDriveStream } from '../../../../../publishers/stream'; + +/** + * Delete a file + */ +module.exports = async (params, user) => { + // Get 'fileId' parameter + const [fileId, fileIdErr] = $.type(ID).get(params.fileId); + if (fileIdErr) throw 'invalid fileId param'; + + // Fetch file + const file = await DriveFile + .findOne({ + _id: fileId, + 'metadata.userId': user._id + }); + + if (file === null) { + throw 'file-not-found'; + } + + // Delete + await del(file); + + // Publish file_deleted event + publishDriveStream(user._id, 'file_deleted', file._id); + + return; +}; diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts index ace1a6d623..d7f71e8665 100644 --- a/src/services/drive/add-file.ts +++ b/src/services/drive/add-file.ts @@ -9,13 +9,14 @@ import * as debug from 'debug'; import fileType = require('file-type'); import prominence = require('prominence'); -import DriveFile, { IMetadata, getDriveFileBucket, IDriveFile, DriveFileChunk } from '../../models/drive-file'; +import DriveFile, { IMetadata, getDriveFileBucket, IDriveFile } from '../../models/drive-file'; import DriveFolder from '../../models/drive-folder'; import { pack } from '../../models/drive-file'; import event, { publishDriveStream } from '../../publishers/stream'; import { isLocalUser, IUser, IRemoteUser } from '../../models/user'; -import DriveFileThumbnail, { getDriveFileThumbnailBucket, DriveFileThumbnailChunk } from '../../models/drive-file-thumbnail'; +import { getDriveFileThumbnailBucket } from '../../models/drive-file-thumbnail'; import genThumbnail from '../../drive/gen-thumbnail'; +import delFile from './delete-file'; const gm = _gm.subClass({ imageMagick: true @@ -58,31 +59,7 @@ async function deleteOldFile(user: IRemoteUser) { }); if (oldFile) { - // チャンクをすべて削除 - DriveFileChunk.remove({ - files_id: oldFile._id - }); - - DriveFile.update({ _id: oldFile._id }, { - $set: { - 'metadata.deletedAt': new Date(), - 'metadata.isExpired': true - } - }); - - //#region サムネイルもあれば削除 - const thumbnail = await DriveFileThumbnail.findOne({ - 'metadata.originalId': oldFile._id - }); - - if (thumbnail) { - DriveFileThumbnailChunk.remove({ - files_id: thumbnail._id - }); - - DriveFileThumbnail.remove({ _id: thumbnail._id }); - } - //#endregion + delFile(oldFile, true); } } diff --git a/src/services/drive/delete-file.ts b/src/services/drive/delete-file.ts new file mode 100644 index 0000000000..a8ed13bd77 --- /dev/null +++ b/src/services/drive/delete-file.ts @@ -0,0 +1,30 @@ +import DriveFile, { DriveFileChunk, IDriveFile } from "../../models/drive-file"; +import DriveFileThumbnail, { DriveFileThumbnailChunk } from '../../models/drive-file-thumbnail'; + +export default async function(file: IDriveFile, isExpired = false) { + // チャンクをすべて削除 + await DriveFileChunk.remove({ + files_id: file._id + }); + + await DriveFile.update({ _id: file._id }, { + $set: { + 'metadata.deletedAt': new Date(), + 'metadata.isExpired': isExpired + } + }); + + //#region サムネイルもあれば削除 + const thumbnail = await DriveFileThumbnail.findOne({ + 'metadata.originalId': file._id + }); + + if (thumbnail) { + await DriveFileThumbnailChunk.remove({ + files_id: thumbnail._id + }); + + await DriveFileThumbnail.remove({ _id: thumbnail._id }); + } + //#endregion +} From 7f7d7edc7f38bc7b2d4c075f4f342c882c3c34f5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 15 Jun 2018 09:53:53 +0900 Subject: [PATCH 313/369] 2.40.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 525c6171ce..af53cb0ab0 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.39.0", - "clientVersion": "1.0.6501", + "version": "2.40.0", + "clientVersion": "1.0.6504", "codename": "nighthike", "main": "./built/index.js", "private": true, From fcd437c89fd429a61e774a59b97c28f16676419d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 15 Jun 2018 09:56:59 +0900 Subject: [PATCH 314/369] Fix bug --- src/server/api/endpoints/drive.ts | 44 +++++++++++++++---------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/server/api/endpoints/drive.ts b/src/server/api/endpoints/drive.ts index d77ab2bbb0..26944dbc15 100644 --- a/src/server/api/endpoints/drive.ts +++ b/src/server/api/endpoints/drive.ts @@ -1,34 +1,32 @@ -/** - * Module dependencies - */ import DriveFile from '../../../models/drive-file'; /** * Get drive information - * - * @param {any} params - * @param {any} user - * @return {Promise<any>} */ module.exports = (params, user) => new Promise(async (res, rej) => { // Calculate drive usage - const usage = ((await DriveFile - .aggregate([ - { $match: { 'metadata.userId': user._id } }, - { - $project: { - length: true - } - }, - { - $group: { - _id: null, - usage: { $sum: '$length' } - } + const usage = await DriveFile + .aggregate([{ + $match: { + 'metadata.userId': user._id, + 'metadata.deletedAt': { $exists: false } } - ]))[0] || { - usage: 0 - }).usage; + }, { + $project: { + length: true + } + }, { + $group: { + _id: null, + usage: { $sum: '$length' } + } + }]) + .then((aggregates: any[]) => { + if (aggregates.length > 0) { + return aggregates[0].usage; + } + return 0; + }); res({ capacity: user.driveCapacity, From ca668898f4f6449ceeb15a655501a004752fd60c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 15 Jun 2018 09:57:06 +0900 Subject: [PATCH 315/369] 2.40.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index af53cb0ab0..5643a8fb18 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.40.0", + "version": "2.40.1", "clientVersion": "1.0.6504", "codename": "nighthike", "main": "./built/index.js", From b1b1b7592b8a3b9df3db58e03806bf3340320eb8 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 15 Jun 2018 13:08:56 +0900 Subject: [PATCH 316/369] :v: --- src/client/app/common/views/components/signup.vue | 2 +- src/client/app/common/views/components/ui/input.vue | 4 ++++ .../app/common/views/components/ui/textarea.vue | 2 +- .../app/common/views/components/welcome-timeline.vue | 3 +++ src/client/app/mobile/views/pages/signup.vue | 2 +- src/client/app/mobile/views/pages/welcome.vue | 12 +++++++++++- 6 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/client/app/common/views/components/signup.vue b/src/client/app/common/views/components/signup.vue index 987cc7e52d..62373a59ec 100644 --- a/src/client/app/common/views/components/signup.vue +++ b/src/client/app/common/views/components/signup.vue @@ -1,6 +1,6 @@ <template> <form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()"> - <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" required @input="onChangeUsername"> + <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername"> <span>%i18n:@username%</span> <span slot="prefix">@</span> <span slot="suffix">@{{ host }}</span> diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue index a5e47afd53..504f1e32d3 100644 --- a/src/client/app/common/views/components/ui/input.vue +++ b/src/client/app/common/views/components/ui/input.vue @@ -15,6 +15,7 @@ :readonly="readonly" :pattern="pattern" :autocomplete="autocomplete" + :spellcheck="spellcheck" @input="$emit('input', $event.target.value)" @focus="focused = true" @blur="focused = false"> @@ -64,6 +65,9 @@ export default Vue.extend({ autocomplete: { required: false }, + spellcheck: { + required: false + }, withPasswordMeter: { type: Boolean, required: false, diff --git a/src/client/app/common/views/components/ui/textarea.vue b/src/client/app/common/views/components/ui/textarea.vue index cc6b376ead..60fe1cdd82 100644 --- a/src/client/app/common/views/components/ui/textarea.vue +++ b/src/client/app/common/views/components/ui/textarea.vue @@ -66,7 +66,7 @@ export default Vue.extend({ @import '~const.styl' root(isDark, fill) - margin 32px 0 + margin 42px 0 32px 0 > .input padding 12px diff --git a/src/client/app/common/views/components/welcome-timeline.vue b/src/client/app/common/views/components/welcome-timeline.vue index a9d558df66..f3372bf062 100644 --- a/src/client/app/common/views/components/welcome-timeline.vue +++ b/src/client/app/common/views/components/welcome-timeline.vue @@ -109,6 +109,9 @@ root(isDark) > .created-at color isDark ? #606984 : #c0c0c0 + > .text + text-align left + .mk-welcome-timeline[data-darkmode] root(true) diff --git a/src/client/app/mobile/views/pages/signup.vue b/src/client/app/mobile/views/pages/signup.vue index 47384e2b3c..238d386efc 100644 --- a/src/client/app/mobile/views/pages/signup.vue +++ b/src/client/app/mobile/views/pages/signup.vue @@ -1,6 +1,6 @@ <template> <div class="signup"> - <h1>Misskeyをはじめる</h1> + <h1>📦 始めましょう</h1> <mk-signup/> </div> </template> diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue index 3bf2a0af9f..79648ac425 100644 --- a/src/client/app/mobile/views/pages/welcome.vue +++ b/src/client/app/mobile/views/pages/welcome.vue @@ -22,10 +22,13 @@ <ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/> <ui-button type="submit" :disabled="signing">{{ signing ? 'ログインしています' : 'ログイン' }}</ui-button> </form> - <div> + <div style="margin: 8px 0;"> <a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a> </div> </div> + <div class="tl"> + <mk-welcome-timeline/> + </div> <footer> <small>{{ copyright }}</small> </footer> @@ -154,6 +157,13 @@ export default Vue.extend({ border-color #444 box-shadow 0 1px 3px rgba(#000, 0.075), inset 0 0 5px rgba(#000, 0.2) + > .tl + > * + max-height 300px + border-radius 6px + overflow auto + -webkit-overflow-scrolling touch + > footer text-align center color #444 From a44387f250ce8de6261d39d0287655344a7c8c46 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 15 Jun 2018 13:58:09 +0900 Subject: [PATCH 317/369] :v: --- .config/example.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.config/example.yml b/.config/example.yml index 955acfabf6..427377a694 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -1,3 +1,9 @@ +# インスタンス名 +name: + +# インスタンスの紹介 +description: + # サーバーのメンテナ情報 maintainer: # メンテナの名前 From e6f33e997fbbcdee7b661f4a78b01767b5d6b2f8 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 15 Jun 2018 19:56:18 +0900 Subject: [PATCH 318/369] :art: --- locales/ja.yml | 2 +- .../app/common/views/components/forkit.vue | 3 - .../app/common/views/components/signin.vue | 26 +- .../app/common/views/components/ui/input.vue | 5 +- src/client/app/config.ts | 2 + .../app/desktop/views/pages/welcome.vue | 293 +++++++++--------- src/client/assets/pointer.png | Bin 0 -> 252860 bytes src/config/types.ts | 1 + webpack.config.ts | 3 +- 9 files changed, 169 insertions(+), 166 deletions(-) create mode 100644 src/client/assets/pointer.png diff --git a/locales/ja.yml b/locales/ja.yml index ed0691ea50..86b16adaad 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -3,7 +3,7 @@ meta: divider: "" common: - misskey: "A planet of fediverse" + misskey: "A ⭐ of fediverse" about-title: "A ⭐ of fediverse." about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。" diff --git a/src/client/app/common/views/components/forkit.vue b/src/client/app/common/views/components/forkit.vue index bb71db19db..de627181ef 100644 --- a/src/client/app/common/views/components/forkit.vue +++ b/src/client/app/common/views/components/forkit.vue @@ -13,9 +13,6 @@ .a display block - position fixed - top 0 - right 0 > svg display block diff --git a/src/client/app/common/views/components/signin.vue b/src/client/app/common/views/components/signin.vue index 6b9d58e0a8..66e0c68e30 100644 --- a/src/client/app/common/views/components/signin.vue +++ b/src/client/app/common/views/components/signin.vue @@ -1,22 +1,23 @@ <template> <form class="mk-signin" :class="{ signing }" @submit.prevent="onSubmit"> - <label class="user-name"> - <input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" placeholder="%i18n:@username%" autofocus required @change="onUsernameChange"/>%fa:at% - </label> - <label class="password"> - <input v-model="password" type="password" placeholder="%i18n:@password%" required/>%fa:lock% - </label> - <label class="token" v-if="user && user.twoFactorEnabled"> - <input v-model="token" type="number" placeholder="%i18n:@token%" required/>%fa:lock% - </label> - <button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</button> - もしくは <a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a> + <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" autofocus required @change="onUsernameChange"> + <span>%i18n:@username%</span> + <span slot="prefix">@</span> + <span slot="suffix">@{{ host }}</span> + </ui-input> + <ui-input v-model="password" type="password" required> + <span>%i18n:@password%</span> + <span slot="prefix">%fa:lock%</span> + </ui-input> + <ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/> + <ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button> + <p style="margin: 8px 0;">または<a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a></p> </form> </template> <script lang="ts"> import Vue from 'vue'; -import { apiUrl } from '../../../config'; +import { apiUrl, host } from '../../../config'; export default Vue.extend({ data() { @@ -27,6 +28,7 @@ export default Vue.extend({ password: '', token: '', apiUrl, + host }; }, methods: { diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue index 504f1e32d3..525ff71c08 100644 --- a/src/client/app/common/views/components/ui/input.vue +++ b/src/client/app/common/views/components/ui/input.vue @@ -10,13 +10,12 @@ <template v-if="type != 'file'"> <input ref="input" :type="type" - :value="v" + v-model="v" :required="required" :readonly="readonly" :pattern="pattern" :autocomplete="autocomplete" :spellcheck="spellcheck" - @input="$emit('input', $event.target.value)" @focus="focused = true" @blur="focused = false"> </template> @@ -104,6 +103,8 @@ export default Vue.extend({ this.v = v; }, v(v) { + this.$emit('input', v); + if (this.withPasswordMeter) { if (v == '') { this.passwordStrength = ''; diff --git a/src/client/app/config.ts b/src/client/app/config.ts index e4a7ff6d38..c6efe26cd5 100644 --- a/src/client/app/config.ts +++ b/src/client/app/config.ts @@ -19,6 +19,7 @@ declare const _VERSION_: string; declare const _CODENAME_: string; declare const _LICENSE_: string; declare const _GOOGLE_MAPS_API_KEY_: string; +declare const _WELCOME_BG_URL_: string; export const host = _HOST_; export const hostname = _HOSTNAME_; @@ -41,3 +42,4 @@ export const version = _VERSION_; export const codename = _CODENAME_; export const license = _LICENSE_; export const googleMapsApiKey = _GOOGLE_MAPS_API_KEY_; +export const welcomeBgUrl = _WELCOME_BG_URL_; diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 688d3e21cb..a3ca98eb6f 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -1,36 +1,39 @@ <template> <div class="mk-welcome"> + <img ref="pointer" class="pointer" src="/assets/pointer.png" alt=""> <button @click="dark"> <template v-if="$store.state.device.darkmode">%fa:moon%</template> <template v-else>%fa:R moon%</template> </button> - <main v-if="about" class="about"> - <article> - <h1>%i18n:common.about-title%</h1> - <p v-html="'%i18n:common.about%'"></p> - <span class="gotit" @click="about = false">%i18n:@gotit%</span> - </article> - </main> - <main v-else class="index"> - <img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="Misskey"> - <p class="desc"><b>%i18n:common.misskey%</b> - <span @click="about = true">%i18n:@about%</span></p> - <p class="account"> - <button class="signup" @click="signup">%i18n:@signup-button%</button> - <button class="signin" @click="signin">%i18n:@signin-button%</button> - </p> - - <div class="tl"> - <header>%fa:comments R% %i18n:@timeline%<div><span></span><span></span><span></span></div></header> - <mk-welcome-timeline/> + <div class="body" :style="{ backgroundImage: `url('${ welcomeBgUrl }')` }"> + <div class="container"> + <div class="info"> + <span>%i18n:common.misskey% <b>{{ host }}</b></span> + <span class="stats" v-if="stats"> + <span>%fa:user% {{ stats.originalUsersCount | number }}</span> + <span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span> + </span> + </div> + <main> + <div class="about"> + <h1 v-if="name">{{ name }}</h1> + <h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="Misskey"></h1> + <p class="powerd-by" v-if="name">powerd by <b>Misskey</b></p> + <p class="desc" v-html="description || '%i18n:common.about%'"></p> + <a ref="signup" @click="signup">%i18n:@signup%</a> + </div> + <div class="login"> + <mk-signin/> + </div> + </main> + <mk-nav class="nav"/> </div> - </main> - <mk-forkit/> - <footer> - <div> - <mk-nav :class="$style.nav"/> - <p class="c">{{ copyright }}</p> - </div> - </footer> + <mk-forkit class="forkit"/> + <img src="assets/title.dark.svg" alt="Misskey"> + </div> + <div class="tl"> + <mk-welcome-timeline/> + </div> <modal name="signup" width="500px" height="auto" scrollable> <header :class="$style.signupFormHeader">%i18n:@signup%</header> <mk-signup :class="$style.signupForm"/> @@ -44,15 +47,27 @@ <script lang="ts"> import Vue from 'vue'; -import { copyright } from '../../../config'; +import { host, copyright, welcomeBgUrl } from '../../../config'; export default Vue.extend({ data() { return { - about: false, - copyright + stats: null, + copyright, + welcomeBgUrl, + host }; }, + created() { + (this as any).api('stats').then(stats => { + this.stats = stats; + }); + }, + mounted() { + const x = this.$refs.signup.getBoundingClientRect(); + this.$refs.pointer.style.top = x.top + x.height + 'px'; + this.$refs.pointer.style.left = x.left + 'px'; + }, methods: { signup() { this.$modal.show('signup'); @@ -80,13 +95,20 @@ export default Vue.extend({ <style lang="stylus" scoped> @import '~const.styl' -@import url(https://fonts.googleapis.com/earlyaccess/notosansjp.css); - root(isDark) + display flex min-height 100vh - background-image isDark ? url('/assets/welcome-bg.dark.svg') : url('/assets/welcome-bg.light.svg') - background-size cover - background-position center + + > .pointer + display block + position absolute + z-index 1 + top 0 + right 0 + width 180px + margin 0 0 0 -180px + transform rotateY(180deg) translateX(-10px) translateY(-25px) + pointer-events none > button position fixed @@ -95,140 +117,117 @@ root(isDark) left 0 padding 16px font-size 18px - color isDark ? #fff : #555 + color #fff - > main + display none // TODO + + > .body flex 1 padding 64px 0 0 0 text-align center + background #578394 + background-position center + background-size cover - &.about - font-family 'Noto Sans JP' - color isDark ? #fff : #627574 + &:before + content '' + display block + position absolute + top 0 + left 0 + right 0 + bottom 0 + background rgba(#000, 0.5) - > article - max-width 700px - margin 42px auto 0 auto - padding 64px 82px - background isDark ? #282C37 : #fff - box-shadow 0 8px 32px rgba(#000, 0.15) + > .forkit + position absolute + top 0 + right 0 - > h1 - margin 0 - font-weight 900 + > img + position absolute + bottom 16px + right 16px + width 150px - > p - margin 20px 0 - line-height 2em + > .container + $aboutWidth = 380px + $loginWidth = 340px + $width = $aboutWidth + $loginWidth - > .gotit - color $theme-color - cursor pointer - - &:hover - text-decoration underline - - &.index - color isDark ? #9aa4b3 : #555 - - > img - width 350px - - > .desc - margin -12px 0 24px 0 - color isDark ? #fff : #555 - - > span - color $theme-color - cursor pointer - - &:hover - text-decoration underline - - > .account - margin 8px 0 - line-height 2em - - button - padding 8px 16px - font-size inherit - - .signup - color $theme-color - border solid 2px $theme-color - border-radius 4px - - &:focus - box-shadow 0 0 0 3px rgba($theme-color, 0.2) - - &:hover - color $theme-color-foreground - background $theme-color - - &:active - color $theme-color-foreground - background darken($theme-color, 10%) - border-color darken($theme-color, 10%) - - .signin - &:hover - color isDark ? #fff : #000 - - > .tl - margin 32px auto 0 auto - width 410px - text-align left - background isDark ? #313543 : #fff + > .info + margin 0 auto 16px auto + padding 12px + width $width + font-size 14px + color #fff + background rgba(#000, 0.2) + border-radius 8px + + > .stats + margin-left 16px + padding-left 16px + border-left solid 1px #fff + + > * + margin-right 16px + + > main + display flex + margin auto + width $width border-radius 8px - box-shadow 0 8px 32px rgba(#000, 0.15) overflow hidden + box-shadow 0 2px 8px rgba(#000, 0.3) - > header - z-index 1 - padding 12px 16px - color isDark ? #e3e5e8 : #888d94 - box-shadow 0 1px 0px rgba(#000, 0.1) + > .about + width $aboutWidth + color #444 + background #fff - > div - position absolute - top 0 - right 0 - padding inherit + > h1 + margin 0 0 16px 0 + padding 32px 32px 0 32px + color #444 - > span - display inline-block - height 11px - width 11px - margin-left 6px - border-radius 100% - vertical-align middle + > img + width 170px + vertical-align bottom - &:nth-child(1) - background #5BCC8B + > .powerd-by + margin 16px + opacity 0.7 - &:nth-child(2) - background #E6BB46 + > .desc + margin 0 + padding 0 32px 16px 32px - &:nth-child(3) - background #DF7065 + > a + display inline-block + margin 0 0 32px 0 + font-weight bold - > .mk-welcome-timeline - max-height 350px - overflow auto + > .login + width $loginWidth + padding 16px 32px 32px 32px + background #f5f5f5 - > footer - font-size 12px - color isDark ? #949ea5 : #737c82 + > .nav + display block + margin 16px 0 + font-size 14px + color #fff - > div - margin 0 auto - padding 64px - text-align center + > .tl + margin 0 + width 410px + height 100vh + text-align left + background isDark ? #313543 : #fff - > .c - margin 16px 0 0 0 - font-size 10px - opacity 0.7 + > * + max-height 100% + overflow auto .mk-welcome[data-darkmode] root(true) diff --git a/src/client/assets/pointer.png b/src/client/assets/pointer.png new file mode 100644 index 0000000000000000000000000000000000000000..c8bd07a3ae30be502a71df97758c47bdc5af5420 GIT binary patch literal 252860 zcmeEt^;4T$)b6QrfC43yQoMyAMO)k{B|w5x+$B&bF2St^B@kSTJH-hU3tB8C6bbI` zT3mwMwCDToFZW-#?+ncF4m0oGYcF}8XRQraS5+V(q9OX{pMOXoV9=X?{<*XM=jY%1 z_%|v!!^{8t^YkAGNJh)cWP66d&uGk@?HV_G6g=z8+<N<DHVhn{4T5Op_*8K{kJ%ot z<nk0hk>-J?ov5WQstDD@mW<t~c%<D-s_Ij*)L1;P9ASrN>-`9xojRI0Y)@e$W4Lcd z4kmp+ce=E6>!mFDlV6?Fhr9J_ws6pE^8X&}NS>jz4Cuc{mw^Jt^!Ler(0Vs5<nP0N z=Y<U0e{V7WC=bB@d&~FF|NqzjZ-M{E0<#p{-51_WOehfprs#@*h(FG<o(&FgjHOKk zftZr#fwB0%U;cHdY^4Mv(NoB>l9u9U;04Phi@aqS{4?I`c>c$?P{8hGIz!ei79B++ z=9e5U%8R1#$6xJEnsHPiAvTKt`QmyEIAAx5w!EVkAkH$X*a3`+%ZT&hrY6`I{puO< zBrrB4WYGMh>K_MB1OZ^R)5{P)@S;52`|La4Nfwmls-mM9zzc3<ae19>xS9c8goph6 zXgvML&DY;dut)%`04x}A-!0CqTksVC0Z{6hOJWBfq4mK_5XkZe<==Qg0h9Bsx>bTY zoRo~p5gpS$(=<9gp8(t#JsI@Qb9fG*C2rkvL!3PN1EJWTurmfg2Evx#W_1(*J?1sL z!342=!<O{8!HifD9xN;NIhNN=Gp>t*ychC6d(37LuM<|>j<3_DUfG6vHsLb&e?bbq ze*3}_3{>T0*1utcn_{LP6>oz;Zh-#|1qF=BDUV4}h)4QF<c#v%XU%f40&eI@Ds<z> z;j#c;CAvg!4k<N|fc1ajovp+~c%f5&jsR7GkSmU@iuIxsAU6v)_Zbw%v8?EnJ!km} zjTz5~=-b-?wDVbqUtcVMKvfhCbrkp=Ve?!ek64|CWT<f!cavKe)~gH0fd?!JijAg= z`tX7{Bzh*}K!hn<Ka6wz&r!f20xIp-hvl5ikW>9#9gl{9vc{idNN@M!pIJF+yUc99 zZub@1y!oz<IC7T6a}8A#HgNAdM6Kc)TCx#`!=};ocBU98Jmf89S?1sG%f&9!an3pt z0;fdC{BLJWF-+HGzrJZxAmj4Ah;}$1b10-Q;y7kJ^w}<OH{R0jA`*|;*8-34&-KOY zJ#`7|m;neYmBa+r8nu13f1>~rDE?ooe5iCw{S*O|+(`vI|K9GXbk}dUW7cl;ao|qX zsrJ?H6h?O6RsWRN#I|nY_ClqmD#jNP!08+W-{};KRCHr!XcPa63*JtzCr$J5`~FH) z{I-qf$LWjgVopOQ1?s%bScC%i2jEP;9mm7p4N6L(t~8rPN={7y4*UF(j#ZKYYoSZT zv<Gv}4ffV?NHxhBTe0gY@L+TtuSS=m*h&6g{M;Rq=aDQ-$@{G5R*E1{oM;q+P00Xh z@I@6n^6$A@5U3Co4J!L=+Sa+8wjSC_<nxMpWu3~%(Xnd77JGSd+2GXVF-s+VK97o& zs1&Rys?X)`*%Qm#GDwsF<|06n)f#|n9D5FLlpgPX6rawZaF17cTq}nZITnFt#cwTc zKPr_IdR+37dIh6bE&Fae^KP=dxy2j@HsR7sYj(-mo`PJ3pE?$tl=vJPD1s_w_D**; z=VF@|^EmADmTkE)Bonf<vQn{OqKaf2o}Zup{dIJAA#qNE{=9fkV(h%lZY?w$D}t(r zP8TR$MmIw3b0n@SIt~GW+)GzGE|E-3$sdyNPM{&LREE%oZ0pE-+m-Su+C@J!i-{N! zit8eM4sDCDq@T%9(3Fb&Oh1#UrgVhyWxOUOH_o>F*le_@1GgS#VO`I67KvG3-&ATm z!el|E&$_qL`kTgM+{>UZr0L*GZAK_cA7wN0Cwm3JYsg{&fR}w~k*;5vEt?wtC#tOk zy6-41zfJ2H0)zn%x}+D4S3l1f8Os79Kuv~=bse-Aks?AyPj=`^8a_-DpMK3OSC{{I zO@7Qkaio=IEGZj!l@{oL>pPu$A_Z$Keo7M#%@F4qex{*D06i<|Xi@ajq=q&cb_t1f z;1dHoML;wF|Is8xtGK~Y_8jPu)~}_n>emsLnc&+hxiyLsPxlQ0rg2_I7I}OTE=<{B zQObS2E^k>^M=5ue5>nDuyysi{V#@t20<lofQu+s8^y4*v?@~PXuKkbl>vX80eu;cF zKOU0ziu_4I>_g`LqRFqHeO2`xbp-(K^8daLzI)qOFZvsFr0F%aHAi{;croJhl~lK& zhmHIvQ6Mb{#z2^J3Hb1G>CKQt#&_}Un#JtfH=B8fp?fneWoO;Kx}HKKtIhAK-hK0v zu|iZ|Qa~9@35pyliX#2@ahA%$cJfdNQ#Li!ATSHRQ5C9^K|*CzN*r?X%A`SHNs^54 z9_keo5Lk=%NHQ>20()#=KW^&_1@=)z{M{vrTSGM;9Wgz<gSxz?QMjN;$%@^aNJqDk zxO)a^r1XY570He!KyVPTYhBbA$|G^0hvKk{5d~Jc?GNhVqwJF`)0HnQ@{SvV$?$!! zq+dB4gZM!f{Q-7@3|M(sR@9kAs)-J&tdQ2DwDi0yaqncV(JsK#v4$4cTe_B4&?fgO z2(Xt}r%A2N4+8PuW_yN@lftMt=n5SKhB|PodPb*cg3JznrO6I+k{|j8<Fse3dce>v z_mxj)_!K<N>e2w*s0Ivq%e=R#`SGOfOeRKZr+7{0-nsXLoeo!t&)kRbbKyNB5u><0 zaaQOf`sq?Qs$QCbO)~SQLl7YR6I!d3$#xGP6VN}U?<*07J<LhrqvI~OS`g50d}F{+ z(s7FVb5CK$j|`-)_E@!v6&*78?yU0o&<{(7mBYFx&J7&|EJEN%-JfTBDc!TbzhLO4 zJSyY~R-uhV@6^5R*{m#Jm^Q&RPwCbjR!TY~3wgY`69e07adLbo^Qqe(a0=#%+4qx4 zTZV^}J!Ytq2Z5*|tb-zlmpvG8DmKfT4$>;#L)28t=xgs=QJ6Ixw&Bf0uIqm%$G~tc z^D5laV1&~t9ZoMgvBW?JU+!2UY~efkmJe;FmXCAsxOfI%V`*k{(VOLTi4Y?%L?YqK zR94GmO4D3OW0k?~t2Yt);u%?43t&S9wcqIemYHMSo2xmTX+W`mGhd90-AI^d*~@(2 zIF|=gWGvUwXik7ezQrF)Q7ZucQ9jazTo&GCodcJlySrWK8{R3juUls{mzJO^FK4Q- z3ZKYF#-txf``0)e{l;q2motiuxPQ+R_gmMi#VO;|Auk@u>RJPdG)oa=oJ(9Q8IVh( zMJsqt>M%ukxLRud`}jiwpkvJV2Q@ZmYEN{gEEkPZs>7b*WyV^7_i}kNE-YPlZkK~h zVKLA4VCO{$Gv-NuAn$%MVr}$Kw!{3RsiKNUCuNWMZ@v23Fu^h@AT+_liJ_Tka)4;J z?zNj7dwNfkY8#{$m+K>2J?H2f>;g}#B1^6t%B7q3d-`{K4C^btjcvKif6JE<be|9h z5DI+t0aMS+B3~z!@3RXrQN*|)o`EKpFI_7q91OI*kpcY<V?zEovcMeg0EgZB<(dT8 z%I?|Zi?y@@MAabnp(_%x)-yXF5wdRa2is*Uf6k>vXPG<IRohc$v)oHx$RnnmHi=}L zx!P;9Xq;M6PZ<@W3OF9}v<%$H5$+N$FA{UCdM8pwh#O-2bPA5^DA(z_9wCEp(VzaC zT~7!(|HfDISub{h6SGlKTp8on&v-TZq0N7ab{4V=L660g0^Bc6WFiS+o^zZnjI2{9 zuR$>FKNTFml6W`eT%?7A@mJZ`4|{t&6fhW~w8h3fE0O%dil_Z8wi_QquY7fcBwXh5 zOPW&b=AQpLq>Ba7<9gT(-DM9V`}#%L{L4F3__F4J3n~c<6uqK^&_G}eObhk2j0WLQ zKIULr>*I38?CHRvSNr|Qp|&R&I__NbiL#4}=OP|#uho?_%Oy)4$jXHIcP(xBAs+tS z0}l{uUyQf`3CJ_h)Wm1gP>LhsyeU{|<M&q$S6vRrH*>;Ll_yz-30+D=erXsRrl6&X zUrj}Yzsbzz#F9s63J{g2M1;T%KgPWJ2i-ikOO{qcUB?}4w}RsjTh0kukoFUoZKNqX zjVrq%9~}z#POv!*;<e=uHRR_zKH?J`IcpEQq{^vO{D1&uEa6#@_3FEE2cfBU&mFGo zZG!S@<J#&41bRm#2jMnc@G<PZAxkq5X`0P7@gmHo?8mr3q<&SpT!406s)x2g+}7Du z|8#mF+MPIJ{bF2nBR2e9)wF+D2RER>lFJZh{E*z(WrI};kA8Gh^i8Dn4+}qE&mOqt zZJ=h=b+utL5tQ1Iv(-qO(}a6z=k>Gg2N|6c8>5mXt79KN=PEAJSkdvie*#r0Z@XzS zC<zp^@G6>fnH|$H78FZ(kHt@tSX6Cbw%jL1ON^#}k4qYc)s*oB4lUJW=*X87ZjF86 zC8DBIC#iy1)OG;Q4dx`tKZdN^n*B|S|Hf{>Rtj0UU!MC@<(1_AY;rp7nlATWEgNAB zu*qrPs_|5m`VixJI9Gcut~b*kJ<hg&3lE~*`H*V55o!XoS*Ux^e`>+7Qm7>zwVE!g ztQzv&%)$B1Wo?F0i>tYLahcr}$CaKC@7=|Y`!G+mUfIehB@-(7j2IukeB>ve40Vy3 z8}K^!va8ugD+I$1W97V;J>}Cvbr$CP;;LU}^YeLTIx*(;9XkLr#p$OMI2VOx^4>R3 zGTH&(gnn#(*WZcJfbENCG*+KQY^}DWNqlsuboKo8#U)s*4~AA0i!g(FdNQFn{^Fy2 z#oEPt225Gs_56ya&$Hi|L~7c7D`u}d4&G5>Z18Qe+Zn8^VyL~cuUy8%OsQE}tb}7U zpW^Jx`nl&6xJ`WSN%oJ*TuKrIuGK{eP3XiG6HV!jmKhD6jZ032j&bowEqYA!J!gif z2`9L?I5c;hSjJ)WglOmS9{=($ilA7yBIF#7Rk?5g4}=e;=To8Dr2S53Sz2)2hCQ{V zJdExQ+mf4OoExKo16<La9Sq_5QbmZRl#sXF)SgesM7p?+>0n#qKc5uq3J71dn@Uxc z)jw-tuJ^xJV#*t^mI<Nj1Ecj!G7&>Se12qS#Z!$q`0s0h3ExLC7Lt!bH*$W2gsQm} zHWX&nFyS;A$JYYaYvMl%u81luYktCr;Jo>4k_FWk%~gh^IFVYnIk!PolsZWoL{cMl zb(^WA4VdnOqPdIT&C^YWo3n9hB;UGQ-ug+4eB5z?hw}ydPsVS$Du8lXGcNx`xytHG zyI2*3Lr&H=2OD7SVxl=Ey{lWL|CSE#^Ol>0<9N@xI-_Eqe#y7BkvmFix=dl^6sG(U z4hEbqDSW8L^7wlH`Y!&2caI@L8vL<tT2Z-Ew_{$aQ+{F|uW>NI;;n8-oMKxU`BTqP zccaBoYuAj<NvCTxUK_K1q6&h^{ZIbuZc)n%%%CxpAq&oqxc;F*8LnFMP)JgTCoSW6 zxZRhg`8sHdip%!rmTJOJ1GeMB-|jgQC-2}2z)?J0=fv87=%7;|P7WVt-J*)tnCAI1 z`Q1^!-ScMqlhPJPr8Cl@(v$%_xPP^f8~h~>i%bt$4+RVFKf_A^lNA<0xgM3L&m9Cx z>_6R+-PaTF(WkhhGFH9)zQ3lVzVE!7%@gN1JK;6HQ@LPoB@n5Eo=%L2@hr)gMhpm$ zaJqo1ZUGF9zP0UJ)ycgUpU~@NXNc4+FJgyDxSE9r1~|-`3!YPN{F@4Ie!X}_*8+m& z{R;U*vjjYCy1W<lf=-qq6B<+uUOcKjCV2pYCfZT>5GD2$#y?uw7;`k8`u*ceIrkj0 zY}4MPra^8<D}ztWz_8`M-wfD*BVL0e%=L8ZMR(%Q)pVWYg{aJ&F!2Zj*^go8%Lp$O z@ok~_70=?Pv67;ut<{mTRIbx^)Dch68%6&(N0-V|b8e)pxQtAfy#^)H{^8@8C*4h@ z>$!-#{*?gFsJoIDTN@i>3OU$!l1>gBw=xVJ^s2udH3Xhytwc^EnY5yocC|Ki=as<* z&ROQ+c!--3|4p|mz&)G#`9vpu)02nm%Th}MquQd5GgXz#a9<tVLFJ6G?ZHdLoNO3N znRXZThW#ZNlsIBZ!N|mvU2JY2=zZX!2qpBHGkf7tFPvpKzAcoZFztWXwTNeZR+d(7 z-GsG00rKI}t{BSzMm-hY7`;+N)5fVyvJTsiRZW3d^Ae`PQYmWzJX2lCySF>#q{ld3 zk!{h6Pqf+;r@1M4yH8q(Sv(ZyVZm*GNtyiLkdHNsiG&<z#a<yHZtQeeU)+~=tlqR( zVKY-QRUc=|UX24u<XjVv^-Lv(r)A9h4YdL?Ygsa0v|FK`OL10%CyZyW0Z5~9kba<- zjYyo%{!q&PVkyQ=^Xa@Nm&y3Ux}^)N<`v>lF?ZwkbRRpp_ukkFEsMMkQh2asH5obf z`w}nJAM3NH#kbDt0B1Ct738vAngY#4=pxZ&iXTaX&b`wcPWITZ5718U{5G%Mljooc z-M#}Cb&t-{)eoBG7G*KuQChU*NA|-7cSP)C^-V{eh+jW}^p5obN;3+xf#LjY^V`GU zk^aXUW|Z`h3uBDU_4?ZwRZ!xcK;%Pm4c0aWhi$ox@57RS@OO7)v%p;Gb+&{k$07IH zshuQU!__8-y~)OYe`f{L!^X>6dm$2QE;SDmu~}b@Nt0(TIUV$T*tzG?(!0^1uf%Xs zAKnM-IU1?@EPTxMMm%fDD=M9)mp^y2iUwQp9JICSq^9-s3v@*>PUFh8_AZ)>Tt)nE z9@K~_exsKr3kZWC1-t1fB3X_Wu+9Pj_fT~iYN{TuOe?=V+uJ8_GB~F_E%D?o=@;Me zm~igni?C=1&0Pp4r)|1?9%8V9d7JXgiJufwSbhJj-h~l0nG<>IAkVh0ZtzCy>>B5& z=f1UjZ-J{NM=sCl+J+$`<jv_7pqKBhi-{QiF#hUr)XaHd;(f0a%s$#1chfL?*FPqb zTZ9+aeN0yz6I}6_81b*&v%l<_t1tKJUqyZ3YN24+d)IOe^lLc;I>vjcTMX6t!ue<~ zxb=K_e%VCMw0LfOVVrzaGtqUDqbB5mbZyq6ZUQ<-hlkiq{+9wj`ls6@<Fhk6TXmUP z6K6EoM&vF%qyAol!GL(r*0E1AO%ZX1pPBDydu=(j!MOTajq*wKw*osUtAyTFNJ;EC z=S}!leT*vqU6UdH05YGV!NuD*H6+BuLR_3Xum<}zt&2Sp&J8_L^u6k8J`+2jvw3vL zy5xV<>n??9Tn&`$B95g>Z}PQ!gN8$j{$)UhFD_qOJ94I>X`>J~x+bV)mEkT1i))0M zqTIDf=h&L(4Dk7|y@)Qtb@5sU1G5RS*&XX^{NP2{$WUNgRQ%KTXjjFGMBBRwBl7jx zOj4&%Dyx+MLiV>Gj4Ao?|BbvD{p}mjyuU35BpExRl^}AmH<NU8Jl9<AiksZ@FdiGw zva5_S^UKf%j6Kh}McFg+d}!eqk)(Za=$b0LZID>)ChGviyZ0N4V$;^fiW<d5Rk($R zJ6rZft0@p)Tp>}7+52(c!!)@n1J%e-SBH`k2~ANtQb}InscK7e;~zPmPTln`3hf%@ z=l}!iv~tb7ga+t}-=~i7gQlI>S7SEWh?qfkQuF2jwx9D0qR&%i@|O@tcZAD0MV$TJ zz6@n~vM+r!=kT*mQh@qmEZ|e|(Iph*O>F<|@ab~}T^rzLtm=i#F8Hamu+%Rjp_H-% zS3ldeQEifp^8xO|QC`liI3T^R;mZXzU9m8}oBQw`jNVtnE>};C`rFvL=RH$aNvhs~ z`36nd^%wiTo{xk_m%mT!i0KRt#UJDhHz_Z&!b_hN1N8LSm{7pK-yJf$jfl5Y_Cwbs zN4EIBJ*Z17LY6UYMc!oKw#c@P$5&tom9x@fS61L=($P}mif<f#(N;7i=}Ur$St4qe z<ThAwAqOvRiFaDF$;;$gU-0}i<i5)>fHwZ+Tkj(pa$~-~Aq%NE_{_5_VnGr+3**$` z2Sk`3dKpDbZXUD|I8JGKjgf>I+?GN=w~9L|P~`R$ZfMA<635Iap(SJ1CEKLPx6=|{ zt#oy^X;?~PY#s}9^5p7!H!+OG$dPmk?-;E==RRW4?K*k1wFgA#rbae{Eh0gs5*cUw z<XE}?ab0xD3ivFBu|Ry$M&1oiFRnIONHPLfTR-*|bNF1E;Iw9D_NBt(MN2ZFEc7e8 zUI8Jq{FbYjC)RrVr7_Y>M8IkABsW>c(`ay}3|$PYBwMWpC6Qwurs&a{Q#MmmvN<Xl z=AJk-TEHq4&X2au<4YFj(UrgV0KWq9Jzi6M<>LG~{VDu2W%wdrK;(H|Yi`T8r)<CR zc(-bIbcR?wjkL*7#blS%=25LIweMg#gjEN$7eBH5K!uPo@vNew6yS~#*>zUz1~Qb( z0oSTFUngrHUW(0ekCnnk;|Nd=LL}(&yiY`#OjZa@y02gm4Eq-;v%YMoV^$XmJ1x{d zH(7y+?U1-@calxlAlFYM57qAbMLf1jtxx5so~939?83~jl*KNGaKesE%<Z3%qcOZ< zQ8{mx4B&Qg8u{Uh35PPS5lFFfA{6$Qi~OOF<cVDPh$y3<88kbei`Y<eF#b5Df9*9~ z<>1mGdOiTggkrC99hAkZMvnooxF{wW1?s~3*TS4x)Bf#~dB>*b!%e-0I=V-SqyuHF zyq*e~4dO8cIF<y=vNZ0sVl+Je{TL;{MeE)Cakb8(7(5=Za&S?(Bq#(K3C73iiIrM< zW<TKkynZ55(s`&d#j}^JA=RgVudArq^&iSt_W*Xl6D6&AQM#LlOxfN0Du3iKd8X(W zk^1eqo;tfSwUrymnEu`azYVCT7UOusw|2*j%4vECK+y&{2<J0^A)4b>O+fGWgFzH5 zQ(z&N4-Z)Oz<qmfx@^Tbgz387`q7X8(wp!?RGr<s>rF(>4XQf)bkFo9JCw42%5sjb z2v7qN;Dr7HkQ+bz8wD=~a$*Hgj5*4WaH7^KRHxl$=75!5l|$Q}-4=J~erW@Z#%=^) zvK!Tq)8L=g;e+oH>{--{8#B>a)xD;M0CoJ4@wdx)fg4JAbg~`Go|gUQ4n$ICz(rg} zB3(V&=9d9EUrujvF=npT&PvtWB~xjPZCgPY{k#ZJ6z>v!r~f56_TJa+L~eYSW8}TI z8(mc}kiPq(#8gIj!U1K_@)mNn7kK@Hg*Gwq*lSuSH8$eF+|Cus?b)Jh0SBsILoiWr zR&atb^K-OZx&vliEaEeL`7=b5#h(PfMcnOUa&SAD65w{En#3hD_9=_~;7I>vga%1e zMq(bXq29to6OuJLWu;9-WeiBxPZ<#g`q-?W-awatqQD0I$74H`N!1s_wM8$z`x<q# zrX_{N=dY)SYPDuizUEWjn3-Fg8&h!_5skXkoS7i1+rE9eoH>9Td1`1c5mnD)rOSN2 z3x=nV+UBm`7pX_?G~t~N?aT{Fx#gq8D*Q3tBqdL!$8LTt;S_623pa<|NfdhX8eV;v zv-&3A>UNn4>crRMkijJWSO&ZlPhJ5C8gx|l>b)yzy!e8XdS#c?@bF{s0fFO;y4TXl z1x2^3rv#PG+j?;wvFLxyq%Szmoy@f3*8K*I8|AaL+R6hYN8jA(_KM(B{O+VKA5)L5 z%)1SL-X~j|P9nwnSZzF5zHJ}G<Y;W3j!orL-?A+xa%u^%+C8`z#1@mcyTS9?3^A&- zouHSAEEXqEBlrWplXcju<e!&(=G7n7k3#q<tHx&3mbHaLfB<qhgOxxjU+kc0Y-Wmt zBc9s?=wFSs99>h=>c*X-jG-&L;Ljz5@Ab{!-!&`dJ0TXHKkp<npJs-4$u1`4A%K2G z=TCRr6)#xfkxJ7%$k+U;4_|c)0o?dyGAdZ)05J4Vn_+u);Vt{AMjvc}bVa$u)ZQz~ zTgfYVe7rC`UyVS@9!hR2u`$^WbISkkEI{(GR!bDV0m*ZZrZFq-PzbK3bcyW90AHqe zSOZDHT%)W`V)xu^S0w1SA^m*^q5)eQS5~Lfb!Vygdik?Jp)^vd%`He<MPf~aiP);! zrc&7B2N2(dVm10#ypT0eMgOaB5i)*}5KgA}OS5ZEx)?D;#TtU9IEj8*)}S(;Bgtt= zAYmII`_*m;6B^PFb*h@p_`F7{P2{y(qqob<L}Ojl{kP}WIy>rsNkU}bqD%&6UDB|m zpB<J0Je8(->z7OjQ`f@pTkE+Kl&qUuk?v_w=q#@iEsv;nV-kggbtIjq@?-G&o$5Wm zh@s6f^gy_89Uslsh~l<-mzxRG4aup!aeeOT1HuazEBohPw?n>bJ&AmhsErX>!pU2e z<U@V$on#c)#pN%LSmSx^q&=sLu;{iBUi4h6_q>^G%?^I8h067n>fO10$THef*CBLk zTZN4&`Td_(jY=(z6>uRX{^hey(4!9>O&S)Fd^+<1x{K`?_8$2Owv)F^-5@i*Fvw02 zU6n^O&RPKYkDZRtSin-TTFGo(W23ICN8Dh(ugNdhQ+I$cge#^s;dWW(&|NqvTg}m6 z_z@00^n%mSSx5|1{W4-tQ@*g#d-G#FGa!5mspmIp!g+x6-!(jSC~q=X&;-`gvwUNf zqVk&kb#>|0XZyXd7~kBESmeErcU&R91(3HmU_S_x^u6E{oC8ztA|2s`(xmPdJE@&5 zK|r{4mYrd-=VyeAgn4q%q(j5CA5~<i23#Z0)sotby2n&{kTt%_LBwL-!+uF_^s_@v z#Uf2}y60b$>G-kva;K4Xadf>9Ys~Rso-z9#)b?_0qejZ#2I!D;st>)HJ$CPxLfw;O z#*>~MD)Y8IbU0=_IA+p5GQ{S=-^fx;ieozO>hQNGgVBH=BPWAdwMAGT6mL((V_7Z| zET8^RsEkDCsqnD89D7~0?zd9-w54XsVG@%^T*TPu55*>EQ?f}q;zX?k@+t#vyqpvS zZ|e*q8R`4EX?*r2GfG~VxIE+9xpuLd&ZvPIQ!fqDwfAD49By<KaX*4LM9_)T?(8u( z4#Zzj7uKM%&k~xpijr+zFJh^%Z@!KYNLgu7oAX{&4ih{izcp6^$1?)(AcBQYAY5_G z#g7l%7L5>oo`bLA%N4rxXz7LK??C=Bg^$r*OboTVr>WHgGyXG0o$fa)c4{U1(@Ars zTQoY-(GvO;>=I7n9Ph&zBEedUb$D+06Wpw^DW&}}BJ9<wSNe8!Fo>RNdC*vWs6G1g z+I*JgLfP)De$(e&4^b^SNc!5Uaad(f=%onUqH>KGO5x8`^DcSSEQpvq?{5=gh=fo~ zQG(ZsFQS`MCrSMRp6gnv?L`^Rw(bAv8D)59l*BJ;o&sY^ykbbeFmCeQTy6zoRq|fd zBl>n)4wCBXxs|{PlVT9^6Y2KohzUiE8!*|4GiM1GWCEjQ1BBO``0aGOGE_LVyy+`h zIQB8BovC={v=oXlfi&z-=M~eudL7YBC*ren%c|rX1$p>i)`nlx65;Wd+b`bxvx!l0 z%*c*t)!1gW&LzUNRx@yz{F=^3d_x(t<x<4Gm8di0K7@Lu?=t_r%x?W>TA2%7@=g}O zyns(<>oLTvI`-eF_Ze}m<N+HxzPAWhiR<;#sa&fh(Xr*#Fvwc21+wn&XSYdHQxzG> z##_OHp?4``>ah);3RQT?$1zO8^qV^Pv@zTEn+)~LZ(1v(MNbBD?DAisLur`TMUT3- zU{FQ57t~5ah0nlat<K{N5g;~0$@CG7(&4dj%Brr!)j;rIwgh7g>*4F5<9ZO2dI92U z9mi6Mo>Osq0yu&K)~%x)-RY>jDg+nV@FB3VLnd9v)9@5MQi$OAO3cs#|Lp31de1*i z@>6X5U_XaPN?F-Nr4Key%Ej8fbxlak7;Lqxz^l_`0>hKCLlGvXKTt+sr{ZG-L>h1e zQ^yYpFcf<vt($UKzo0w(p1OlqM%FqS13xadNuWs@bbL?j-~GGtwn44Xlx<@pvkE5& zz~Lt*Ts%SG0X24J83i^^J0`eywlxlwjN?>vJDsicOgrUdY>?TR)$;whF@OwTc}<Wm z2~hGP_#zL*CLL!arMXr%+RDhn{k7fpzfD=$RnKM!oLq7&twXfxACmv=+r0Y{(^nf) zyP;G2Qr0Q)Oe10LI9S;PN${AZib~wARxX>c-_9v5w5G=0NKy0(v3BVF2O7^#o$~Zg z)#UpOIF2Dvq7%{j<A<S+Q#N$9Ix$B8!iJTX0$+dtLWEk$??v}d`?gK3pR`S^txwfe zZd#oeF1rkFRK^_AZ-(zo5!aL#N<=5_NX2t41Q+UH9rnH2hOqoar^jThi^wyr$TUhL z)h{|aaZ8QRJ%E#}I}eZiqD9EDXKH<(HM~QfI<gl~;`}Um=?{#@!rDLIXv28~UE0W! zqAaRUPo=$XCac6pbx7?d#{=BAmXG}elrJ)FM)o@va=72dykIkK@OS8pJ#``(jyw0Y z7wVOemZAr4_{JkGzA&c`s3fmeSjI#&E!5cr0|zkyi^>^m@xp3QiQ?_|3Of_X{1e~6 ztL@E(Q*NR)>jLhDnl`_okx@#I46z~V$gV--+7$mrhT5%#hEt*4xq35D06NRSrqW5m z)S|v44WONX!{`0~f=!Y2QjcENB7*M(rjliEQk%296zOnr*)<YQEOq&_`nq4L`nco5 z%8H=sQZ;VMg2}g;P}=4|Z9)w71t97F$<6iNOzsA1v@x^nw_Qf#M017Ijb&wYq9FB) z(<X}%zf!)KTS5g)uUrGvRi+d8PLiofI{ixN?~p@nBAaGmUuGNw&-xsKB4_L0R+Rko zR5oz~4;M^EmZiPhsbQ4zsbmAda~qt6ar2h~-ep4NhU(SUZadTk?ZJvcuzs?1YXP?o ztlgmqD|}VxkKe;Y%>bc<;t|x9gA^RmL$jh4?BYF!74NPN4%iq_-klVu4t+D#NXN|F z7tYgo*R?+Us59b#Vl_`WT>F=5dCkf+aHs2>pv*K|_YqEwtr$=Of0)kJc&e*puhXS? zVFA1gX6cfQSp^_!b>m!Qdc{_cyd)O3)~T!APf3Ao3t&E_vF|Kl$(Y^7cm5NS!aNai zlowM#NXGW|9ugGj1+?5--z7sYRkd_TYD0~!HvDVt*?W6km(GzVGcR~ktsq=+dfdqO zOVKvFi}U!VV$UrK=Ms$h-pbtt@UP=y;r{#LsEZ4Fj}%PLei3b%vFZ7F<n-*3Zw3l! zdsR8eP&*XdT_X5{PJtB}JsB#|^j$<4?K5Wt?EiwgiLgtQx@s;}O&kg)25u-O+*<3+ ziNovfQ$S2S7MZe|&kx{L%q?#GN4Njg@Zkxz3ZAvFe{Q8ItFo{r?c=m$EX<|&Xw6ss zzLU!DITk{{ws*Dt_4U@~GU@)k2dviqR-++)xNlsF1W<sXs`KRS+kvdvqBeb3F+e=K zz8!lMiy60*GM6J!$W3#khaH`egvSpvA&-2fYeFk;kKy}?k{N!RVslg(6EoM>4MOxr z)pgs|sqYVyB<|vV^~x)~j2nKu<||%PV&^)l6^{f8Jm(djAFmA1z%F@~(scLl)9G$B zxIsHf3IFL!R<J%L1KYn|s&k3VuD`7>9AgKJ6tViD$Vf+oG7Z>q*1c(+uX|uzyMY?o zfKB`N<bU*aG!lCFTTHcEulhu$HK^u8@MhzDOwjSIR7%JCKpi)cZ37vTnyr0Y%_>id z>F4|;FR8(B2q=&5BnK+-I6UxQ^4@!YM4NTjSFZ!!P!pounL^#7(>^hi2YT+Qzeteq z=zcpCKevYE;0)avv)9)=9lshYKO3jO|LP?WUfY=)5%^vqbqdx<Uvo~FbC(dGmm1ZJ z_4L`R37+rLR?%na3=$~{`Hb&rACFjhlg(Az{peF6{>V_f^qnt;XRH6mbY$}@i;RwA z04K|H_PAHf(#gyK_+3?v)=oaHQazj~f+d3aN5xv+nCb)YN5`20ski%WU4spdCZ@2N zQPghC?YZX-#!l^Wf^d@pSts7-zf&g~QGFBYrYm^;*o{MG%w5I1$r0UGT1<OlT-Cba zG3g9Ss~(>DY@5jnpTT^yf0iwJpTwgigPDoRrytlYi~cPRynaQUHl@k7q9;RhHSA>X zb2w2zT5{-<3N2oLOlYqi4q`&8vp?Ekd=lR1zO1!<R(SHc-EoY@R_Q4Jg2>uLHKAwY z`_{Yb>(n4N(*Bu4-X_troj|Xw<Efi1UHyZ#+g6u!B`?UI7%s$}edzE6n#7&UpssHT zC@r)hru_`4{RwHfJvkwDQ)}8*?pNJZq;<89M*2=oj22iMn7|XFz{7@{f}OzY9=iou zg$4(Yl*i?TKjE|POGVi`v{bkhnj%TC-Wn64JEP^d;uho87$eEmVZW-E?1CQZF5MD2 z6=Z;FUZ48QT-CH1sESVauLHc)UB+uVlqfAInkVfYqf45@4noD1hc7wSjwf-5;omdK z&Q5Rr9;z|xoyo?I7AUl;rM_^|G%91s+*OJ^UBptJcvaiy58FJMbx=vWl~F85ZFsk& zzq&pq;xKUxGF^(`|2o7%Cg8ikL~@dyGjw(rsW&}=m9%A~A+_iM83;AZ?4IHp8)~`x zZ^oAzBuy{YccXcw+>FmC)Qq-ftKIc=yx(Qnm9eh9-)qXM;lrh0Z8dp!?ZcQy(d<wO zR6KUX{|lns0q`UPB%ttD+wNhC20x|lFd2sRV!C45hDxs@me~49m4Y2rXwWjZcVXk& z8Zu?2S!ILzx|+LD%hSR4-IV*-boHX_Oso7%e#D+SludmvdfU2F3BBQr`Phw_v5QBt z(HDPHTB#=i|0;A{7JWd4tzfy=OV4%`-dYovg$?l)c;a(fSKa-qxV&$+32J;S>uHSV z%y)br@8Q#UfQfM)C+B?1;bC8Pw%=ZYyV5}-FBcKYxCU9ZGSsREG7TpI7_x|v!dIh2 zZ^B~mJeRYi#=I@VaYRMjzYOiM{&OQe$#Q*E{GE>_!DUVFR)UxG<xjzC0!KZX$_bd! z3#5)fQq+^oM*%H-Vh~}lbKuSNdrFv=ei9)HPqI|%@I97oiE~kvAC5!XI;~5MPB*AY z$}mhx?@`Grge#U^r>jVey!Y0BX`#&o1I4g=stJyI6*bxYJl-_42FgULB)k~(&7Fev z?s#m3t?3f%&a_CKUK@_WC|A8Bi@J3Ok!ti1F`d2Lm~U@~>O^lrACla|wm#@a36hLa zz&{sPi(78(FxJc}Q2lVMvLjBmtx8#=M88oj0283go<XED5n)y!0fPU|@HM|}Kh|q| zXL;vy<-~%Sfb*G`t|jnEXx0aSu@t+fX+tA&U6yRm2tO~G@9fbEU#f6k=rCw{pF!IP zQefL?0@$%|bV+`EOAl$@7i+zCOASgd+iC%>V_eGo$7d&Ito?fj<OX0WoV?twJcfF! zKl?qZ+0f=<-)v-fLugqZW6HHm4^BDAdoBK&q!RpuR{P~dpbB;GVhKe6Wf;pP{Y-n` zN#BPK8|O+nU@{Lwt!8gA=ZMr<GcAqOd50io4XIXh^^f|b3HN?f2TzZ`05J<re*TR2 zvml{@g^l>o<U2dNJ+P;anDJ+>7Q<3g!Io{T_}JMUDJmT-+oz^=Jvq}7gf>hF!JNGE z7rL!jmSyJH3mKy=tmo7_PGd7#COyllul#T?HzZ$sdKL_2X=^{acVcg7a)}>7Bc-A` ztGIUyf;zrUwE8c25E&DpI_N97#LkmE6XmzGd@ruvaD&?#1z=OHK20sxpi?0Yo5yzw zIC{eTgm+ESnkt$z$<X74@F}8ydKc6;n++^-_=*feY##p=!V|-l7m<K3eGC5zuvJxt z2WRU`Uv~e%Ch(VPmNH=l4!n(vvdWm&y1zIXp*(SenLY2M3lPAW<fmroQM^b+{Cw$s z2u~E(z;+PvyLBGN9pVp^uqz|<`>XYCp@@-pQL$-Orn3_LRc_F<oZQwh+Z@8F_ga;% zG8WMtK5z@_Pxem~1j7E}bIt`zzLHoq%J8nH7QdX{fJH5Z$-~5r17|V&qHF=(nT9~C z8Dn7{;;9`mz+F3i{--jnQhIc!pD7zr`<_EwpRNY#G7}uPK8=b$bgfO@pkCEk-^kiZ z4%iu`6x>P}Tlxq_t@^PVv8V7N<*1jUL*73Bi{JEFPP3tm7sVXCceQriNg_a1ecw;y zzbL%+^4pw&ea)PR8!{hz{EM@{-o5`|dWBdCWvohD!<1XL816o$+eNO%0%%~V=`rPw zcV=Ofts>?brqk#md@%asTM)C0sqd*X>cA6qw{GBNd2?G!fOqxo@pwNAZC9Ql1Pvj| z1B@vSBU-{j-ctNs3=3V1mn=2Tu(bI5iI)Vq$dFK`JM36~>1B;uOH3%y!M0sue-G+r zb*27TyWVE?ONV{s)jB(}N!}t4#2~KNuQ(q1v6=jBc9LQ&auZMNHf7s$;5Gtpn=*JF z(}*uy+i@oM`1Pz&k&4pSbo;oNm8?8pI&1en7`sguh@W@=BYU6#127_%?Yin+hfd$< zrL&EI)2Y2wIyfk2bUBKrYP;n9)(LIxqiL_+OJ~*Ai7W)qtj?;UShBW1e)hV?NG{{g z9L-0XuA*ZL8WG%mXu2?2Mkv{XMFUcmFO$ib7&eBwd@j!UueO2GG#!*mT)Oh6|3*k> z>xcYNuZ%t5pxZ3Sq~DCXU6|DPfSRVc>#iwoV-54BSRP({0}YRueNJ}_G`!HWs|@8X zm&t+<;S_C3FqcNx#4kOKf{A<5o<_Mc*-4I!D5)2Zj;=2|g~fbu7enDzsJq@1`n&F& zYinGNTy*YYtUK!w-r_L_d6*}@_Ky_=i2w7#dwD5N&!LOb<{56Ddm&rB%%yj*Hos79 zs=7Zz@yd?W(RI^E*ydpa3#3(%Lr1+7ep_chDt9k-Je<hb-nv#I`0Y0k(}(>p9aGc0 zQMM(qIPi;Y-`$}0PsTI;vGLF$xdR_#19!RTW`Bq3+LE7<bJ5>`l@XFvY@i%I4t*k# zlaRNJe|;g(Y!EK*V)I(?hYkCtlzSO39mOba9aAv{(>BnGx~eCe)2jD)_to3OAC*C% zGuRV{)wnQ+Z{lO&!IuotfNK#)hmX#{T`8|R{@EenkfJBa^2G_goOX^J?T6CZEYYUa z;fpV>i@N6IK>YN7PyWq|uYsD>oNlA>&nV$tGsaCha4(5;o@cq7|40@zn$)_D9GvIj zD;0T?X^QWgF~Q5m!Q*?cytyNcrkIh+*E}a(gWK<ye<$%p7^VzpNHD1V)FZ*${>vu` zcXOW+t+<OsZuYSm9$Fudq_m?_wMt`ZUo5r)IqJ$t-s}7~JuAvgY>Q*S!)!o5zJ5<K z(k~7_oI$QI57!n0e8Qw$z8Kkc;M~O1M8VE_eFh+r9weiJTZTGs*G4C(Z}4zJ+h_FE zSDZOKmZMjXvP>PAFf$_jh$N_uFg;wvKQ#1UN9l1~{T64{{cR8bO3CXd*7blCAdTgC zy(r%7WdCdS$PqndvGxR9>q`KlA+iQ$=YQuX!G<jdcVDf8VatG9&+a_~^YmJ66{F5O zznCjxnw2aFq!J`<t?UU@nU^eDOcGilwC!RXW8<dX&p;VCFQqN5ym46crAcD)oO*O1 z&Rxmvw$zxG@1+Zm7*7=U8~GuTKjnetZ+W1M1_Kwn?`z%Zu3+`6F%wz!-sxTXffw0e zGdUYXt_{XM-tRuF_4yYc3YUDNtC$cd$z7tuX}z^RrGeuWTX0;y)cdy#2yLsQ(AIuB z=t%PCr8URE!{7QlrR{83<*0l@4n4)NL;r>vo*t)f7<zouqrd#vlO>4?9hC{)_U@Wf z0r6A*b%?<i`)a})!_3i1Yk9hn_ou|g*f@7`Ie+eWOyM!D25ib*DRm_811aS3Z#U%i zbX3VX@UfBv6SkvokUs-|Ax9KV#6#1m&uP+ys%Ny@@Mu06?RM0uQ!B@35r^{_`O}1v zc%Og>;uhYawEPz*{82VBdYsWLOA&`Y+4}GAe8msC2?(T%<*_F87TIv^Ua!zvw_6)D z40%N67emqcEAgi1<KZ>aTw|hwE|fE$C6OYG^f)ZCNP(YG)#O!`$d-#;=J63h)0c=E zvaY3H0|gWwvH0nxYKN=rgAt`7XBW$&9JZ=>m(bf0COx&&3LyT6|Lxl#4q5BoCfdS> z^{jD^s1t9vsQ;KQ6H0XGR%5ScRPXPg4V-sR!eL7x)H=P<Pcx@I<ZOpH{J7`<CU7G- z6PyT61DA)(0oL!fC|aa-$iuk-Q$P=}Q7qu>&;woyNWqVvm&EHmM`~s3-!49L2WSKG z03y6JoQQGe{`&r)_Mpl!?F;Vb9FO4V{ol!ovZ5dIl<Du~D*?-~NWF2b*ak=MQpeh@ zI`xml(2Xv7%(N0vh=aisEWl~QrSzw_3}H<_c6E#Gpo&8}@d=s}ZJ~tD;Ao-7t9t9* zId;Z^X*pfZ7f(WOj?Q)Eujk9t#m{3+>Cm?H5k8fy4M|#Na|hCjen!-J^<EF!iV=q? z$VDn}0AkQ<I+=0l_`NgBo$!iZfdstwFHfThlh;5{D{@W**kqvAOn`cwFGSna4`FEZ z`=u{qraf)om_%Q{vd^!Zlh0tIuI`v%Wv+8`zF(2$pFLYnVRJct?^ZDDgExfm5!=gt z+Q>+J_uAxUp;oFg_q)g#!*AcR;W0_J4hxs#^8Ti?6P)z*+!DRyk3}!MnAX^HA+cnM z_yjObJaa^4u#orC{mmnxF?cBw*#rp8M_7^&CJ{n3*MD4v&7ECVot8f5`Sr#lMUWu3 z_!&bOn~x7JC-A!V=AcWrWq+@}Jx8M?ff=hB1i1%zs|C3%-~$j|`XN#2G~mYG<*5e( zDY8j~P1J>OPCbgv;oO-<K?<+K$L0w{DYb=!QUGt@zKB(;eMGS9b<HyR*;ihD+Po&V zWbDqYAF1=p+nia2{c5N^e-0|~tai7cJw~b*&I=acW`)D-&L`(I`|i&mH_Z6<d)j1( z{kAopoJk!7kr}77*lqDS8LQmmX&VsuL3cIs>C05hh4tJX?ng_8Gg&04D8^IYl%noc z(AbVHOY^gr$@WM8*OeD77h5!`3B|+$n9YS3RG!zov+DezCRJVQb2!<l&k)He_@SV9 zJ1Ega`kHO-LSyVS0G7-CB=nhiMOo497!zP482Ae`tlZq2d+1v7#E?yJHKP>bZwqiL zYlV)`<GVKS=x?=3F!r3RXS?l0{<f~tJYQAJP4rq%?aHnTO#E6;Lk*{`O}@Q)6Ja^7 z+^1Q5KYyzpVkJd(CiS~1tLPu;au^lQ@4Y}Ub<@28>sEo2X_WB^e}k}gq}1U$!_9@D zQqP;+f_KiF%2VsoH_N)REmsB7J0fFJW;$hhrWC842~Lp9>W(eGmNor&5dWjU@w*6= znF9*9a3j^T2V848cu!i~=2Vo9tOKBd`l_lzx+{GDVjRWAd@qEzZx+Q1rh;9r5A1iw z9a#^+e!pV8;{eRjooKLGX)HVcz7U0DNodN-MPaumD)hr}80F~Q2XCYkFZS|%x3vb1 zzk{3f%md2n)IWqhs(Xcel`Wqq`dV$QdiK&@cWtc2S?Mf+wnor!ui!L4&>84*sa4>! zoHKXPKSrANqyN^F%p2a&JRgn4K&8vPUwivi%-Pg7mACMhHDIFV2RD^`$?7TtBjTI> z3-Jlf>g>M`2lyXc-1d@CHFS{kn06eqKBOK8`$fNEM)tkw3d*&Gp9AV%Am32qsx<Fp z7_xo<QKC&p6ty^V;JP0`5qvfGl5jhkrxS)09(GCahWgtXyN6VO!oV@374&IHIe{r{ zvua#5wAv$_PjPDBWpneqVPG5?$iBVD_@v8LT!p_JUAS39G*T8`ogQ<WmqtK!1WPY1 z4BYoJCdWSL{Bysk?EZG*B^jZzNUwj#9+85DK3m_(mgJQz*4fga_Ii-zbtiqmW7+l} zpqu$`ct!D8Z0Ew>B#%E<pZ|j#3xN-7riN}bUyP&OBep%+m@u?Hg{zy~l^>*Du&|lV zr5QwTDy{Pi8GegVE#XMCJ-Y73Xsv=3;$yKL^m?evyw+~wR(Xy4PGh!qSWkPhP|c26 z<ql<C$Qx#ja7|*aQ~V--{I|%G)SDE(K2XMsiMZ#@wN5X#Mg7Z!UkW^0{(MseMz9zX z(z$YzhjlI8xs!vea*#xNs=`2@$k!I4&5qa^k`OL|=aL<Dq?>DmTXRjrncaD;#~V+P zr}WbN>k|HD6ugvMR{|sn0{y%b&CS@2imma0_u5CWa$_T-A3@pptAr}}n{^?+f0Ub0 zrF6M)?T&KrbTNVwH5}IEf)~P?ti~>9(YrIr4c=F-szL?Svp0eMZDZxne$WsGkIWC) zWaEcCXD3I=@gK{%@lx`=+1H%OQ82gw6c~I-lk{(201E`G?&_IWvpTO{?;zjW9`w)m zYn-2U#n@g_Gj17dq9@1ELjKzi)<qOI!f}CD8R4DiGHRQ%!IiDy<^Ck}_+r-@tbU3$ zaCHBr<4XDXZ)CDh5DlvoIV`J-HAZ+_@As&a)b~=4t&2PcdTCIyPCN6n<LN_Q#+%;$ zo2&JWnyfZGt`8g}TXpUIx2dE9Irbf>??{8|BNsBcZvXErK*-yF|3a=2@WC-+dYTyt zrY7{o_}gXz=Y~!S**rhb2F^8i3Nh3QmHxhtw3K)pSqv6Qe!@Vn^5DUPh?66d2N@zG z6LYR*((Le8jZIZ(kD6))@v)a?jMVV;oU9~fnlSvNr{TEcP!4GW_e+{k5h$`w7Vvh) ze2m#K(LsQ1p6;M-+dOgTvFyPPY*L^>MN`O_aSF{7Ib<)C5^UIDtV{YuCGn<vt?QaA zvU=lSj?t4urg`-9<rE=A6%Y;P;<-`!%!~yI0MtO)UFf=aG(xZ{?C09b-qUDZtc_7( zg`5T97YSuYL0=%i9hCF3LBd3es<tO^mL=LCAU*k43J=S<a+-Y}ZXA^y*xdcq`{ukk z0Y>$#&(jy#)toSsvPOR~FKbxr;b^i^wLqXUL<BwVl~oXLzF3>vyS{cq8{Lszpb^}! zCbT*5e6x6?EnihfNT~>loA?VQwV5ZzdR^TbIsyc*5mq6Ju0jWAX`H0jebx-K>n`Gh zWoLtVKR!!83H^pO109n+=!{I0pcVI82hH)CN{jw(E4FTPFwSXq21ZB@C$S^kpC<aD z*m!$Jq|3$FbPOI<jA^a<7AX?@l{b$JPPx_yPxC)S;71I_$9T#QcPEfF-@dc!5}&b7 zp%7tryLMJCk&AP!Mg((P^UmtWB#5Hf<_})@yOKx0>igyktBl*(RNW)fMTV#(r=)Vp zNEIX&Y^J#b(JX<z68C$RhZo*7PY!p`YTqqnO!=UA$E(&aFmw#pK<MMj@P!~>YWDI{ zuk+P`ca08NF77bz39fvvrRIFVNvg3l;0hzB%DSGY;H%(ybe=dH>bLC~;C$J!!I1j? z*611yp=iv}T>P0N{Gm`00<WrD{T)$+jeuWkFbn&#G-o1$4fLu7!dbX`4~b^IF8mE$ z9h)7Y5FMS?<c^_xulOSFJLTjofaY2&Y#sKVh+<tG=jW%aQFBtGFI`dYua3#&=w+GB z`|(T=F26)-Je184DH%uMET>3Z1=Xg!XYejdS5Rwhiq=j^f+2Ef<q#8&-r3z_q@!aX zj0k3q1}DsI_4M?fJf@<&m~kvvtthw#m!~5sk8PCYn6MxbI_)23FNA1fo{-%C60D%G zLi>c8hK8P+h7|7nh|vE=9b~r$7g0;!t*G`mn!ph#9ILbE%UQT^Gbrg%<RFPjP-QH1 z9`uxV2qUMy{`O5H%ot1ijWfb5xw0&a!W(AF>ZS@8O>`x8-NhFj6D4<DC(!`=?dyT# z;as~mY5x0i%lqHm>MRqaYp9Jhq4m^!0^auQbVF^?NerZDn3n2%`BK0CCv!vV{%=<> zyV}uNLCY=12lby8lEfb?nKeH9W&07<#Un7?Xop=u@68ysz%)MbbIy+}<B(DjvpEY3 z*t3b6-7^B|!yVm#0}G|_%Mk3Nz6;RO+J{n>8`;Ga052vo&}^DHggxgkhcA`~0F-%Z zpXbm~_<qIi_|RpbU0m0Ki>{?FFR!#Ityt<cOE_XWTj!k{O)G!>AF94GAkJmkHo-ku zu;A_x+}+*XCBWdWgA?2>xNC3%1a}WE0}Sr&68z0R`@H+^`^gWW`|GY%RjXE2=XSkq zE#Bt_vD?4)Tk%Vo4ePJm?l2KORV)hGo3Nh7NbD$$?wKViNK@5E`K&doNJa_^bT{{C z8KvzwRxwRvYHMpI<Pc5YxHR0ptRf1R>cT&sU0Sow%y8x_<?`__xwP5;?re0F!TcLR zc~Or5IK%2@mXvm28s%k{Idn)DfAGnUI}HS-=7e4P`WeNq9bECO5~oARSq6x@WORo^ zcKdVEGJ`W2G%l@^vslt~eI*oyXnf^cP>_zVwDO_X`0~0r4gZsJ?h(Gj8D7NwE&Rei zvH&ESRY)*9Wlg&sKe$c&=t~>jvjp^Ho%~71^UKvdM5w!lRn;)@fS&o!)xO1JBSf}6 zesZ<cNu1sQwkH_ADCw7^HsE>MCh<R5=za@N@5~VteVH5>{cyCYaC;&DqW!3w*SIb# zkrDkL-iC8@`3VrIOt*t_<TkPSJ?chK`u$O#gf@FaL*JhYGb01$V&^D{nDU1skq|y` zZ?k?2*O+(qIa*r@l|-0*Geu&Y>|yIStHNoxpo4yZY!|nIZe~fXp23k(XGeX0;V+e1 z+KIVnqy~3cq&jT_&loCg03&kKn|`A<l!m}Jj$i5TBn+R4pPevA^CYj|hu#9yTdxjw zr|2G+cgt$l=WP7H=opdc#}3C{<qTZ~B>ka*3lE9JD&w1<GV&@qffwfG@jLX22RczE zK`3FT(`;`A!sd_p5&=tlzwS~$dxzsL;vWA@*VvnMthxn(G`uRukT|<Hs(FbPVU63+ z_ot9*(*s_%x?A2K1AMzKq~Dzj6@+3bu4a2N(s;(Mcdk91SD-K^(EpR1R3;%>m8_no zK;-_7k4K&)`5N<Q4LQK;^(G3>wO?J<%iGj$Xl2+sutfN%u{p~A+q*|^{nE-0UBF*W z4<+0yJ4^>poe+Pk%!=(UWsZ1jf_z}nD#ak*ScJ++wY5KFR$ak0b@t%fA^F%E)EB(U zSUX(g+v!ks8AtVG9{H%LKzVfBGbKcjN(rPb=WB0=SI)D)usJzAIXU`*go+BklLP!J zZ42pCR<Lb3(UDIFI?<lS4q>5rR}V}xPVabx3OZP^vVe)QwNr^49q6w(7t;4N(?0L* z9_;bCxHO!8%=4`Z4pby%Sv_$i{_>dh{@7O`{IuVVJ2Exm1NGfTW;=gCn#w5kQ7Fy| z67T*;wq~fwmhmtSnKDwAI>U<g(|M;sbQIM$3*ZXQ^M2<#3xf8|+;?gC>u_)<qYxVh zR|FjrvejsB*vVw&`&}vLOB}J^v&Bn}d3AG|EA(Wd38Wi&@N9JUj;tHRtCnyQQwv~r zb<oi?X6-JZZfR>6(9}p^=OXFZ{%hdxaMTw=bzW~>*yt;hV|ylI^D=V7LL~J1v~{my zJDgze#B+@F-8|Qca$h3c?~wtqOq_)2&s}KcxC>U3Caj*lWmk0#{f4Hx>LCN&*v<aF zg*QY8;lgw3`cq~H^Owgh)!W0n_v4|o|MP|W<L5xvskt*=(Z=69n8s;dN<$Bb<F67a z1^;^M68z`sue~oF1Fx960KY~a1hAdnd$MP(-@(s3UyB_BBl~`#?Sid@<1-R1rZRnL zBmdXS%TEDMTEo4bZFazrt-y|I@Lng8AqXfG-`P|^Z)Krso@o0zCN;GUiy9O-Re_6Z zan#D|4=)EAo+Pr8lE7t36e)C&U?h$nBp0VB(2;%++5Xd7^LGa8K&+MofbV~%a&mYz z_v&*YGD1_U7~|R=^Oyj(JYiwEhSO%IcXu!lWbu969_q*(Gt*aUHtvr^<!B8mm>IZX zAr^R@VR-|-&&)xG%~%u4wtc4l%Y*eAAp7#^G3S!ve{DN;H8h&?)j6`ADotKzYQJxN zWBSQ*&k=Yo4$`dEZ>0raJWPz~3aqDB|6Jk$@#CS;DCOBlcU;|%*1Z4S<IfpZzLU_K zL|x+Zl?FnKlX)`YfO60TQ_{~6)6#bbDjDR+Ct_jmOIHMpokf*AoK=HZXlTGYPD`m^ z%L5~mOb=@_E`q4?t*ykrJ)0`UEiD0m6>POP5|a)4;Wv(Ah<Vq)L1N0y<1Z+D=Jhbl zeS=i^@w+erA*q(FNmaOy=}eV>43~5abu?8^|4d$=_~j^tM!QMJ<s838cRzy8-|t_! zu{vLSy%&cm3;w*iM>>vNq&n(eP!|3f_|HIwV9FBE=!E?kt*i91FCdNY{+s5H174ql zJLH`yq5AG$zlsqU&Klz~^2aF!$Yfh7`TGmvYSs&q%lMy+eO@(A2ep+XjD%PBWzHYm zN6mMX!tG@+Z+iE=z3VNJ$D!nLwGNnd=Tr0zewa^P`wq#0B5S^@@KpLd!|jw!H4i&G zA1$=#J#9dIj)1oZ>C7C7OL!kfZO1&;byEEP!SA9wP4Ah#XnLY?Tun-X%IJ;~NFDiO z_tcI@`x$dO)&x@PXK^?82dUimDQ;=uS6^WP??WB!WIrTL_C*@1;BYyJx|c*I6iWar zhj!;b-Z_R8>m1g_wR2#YvMM%yXuZn9Y<)o`)&2PWeVj&~;MjK7-7oL+<@zdEIEe>X z!~eFD75@BwCXD9(c8E(;m?K!kyCp+tn3Xs^@IvhSJ|;=E#dJcjW~<F%$&{(>@bJ8b zmOf|W$umU1lnjd`p{=aI=A;pXf`TUP3om7sV+dW3Ri+;T@k4?yFST)>x`9>Tb$-0b z*x_Nmej1Bxcp$N_vbv&!)6H>aPZZUiH$?idK07Ps>(H!R;9USjb94<-p-nnGC5{k& z9DTo@6@ERH2odn)1#D*=$_({m1{B1=bSnC{gboRZMzEp&Lr9DvB*~C(NpX8}L^G%l zeKi?jR%ic{cp7-J%iZk}V6t;u8r88{rJD-8hiJhjn?0nBfjc?u?~hLzHR&6t2u+^% zmhKOz&+y^>x@hgh*S<s)sU^HyW3wW~-bVFZ4w676cTHIbRnabCZtzrNDV=%7K^?rf zDkldA_R-N9k>K3Q!p$PT75s+4EU`T=w}~)#5uytE;tVJLwSA&=@WsfAgJqa|UL^<D zxV3zs`<t%#R$u9{h`Z%c)#|oOLEQt%0;2Kr+(p+L?#5$Dd$lc0ETs8?;xqN5%xnPZ z6*s1Es&~M{-*9x*(tq3FM3dyQCpwL`brGvdacPTm4FJuNF6XW!KGrvfK|tFmh)nv= zA)6;*JPykDZ3>E_#ICoXuKr=Lw2@yE)srI&ArfRdhWQB*g15V&E7(o&*lkIgpt2EO zn=_qnv9_GW-md&!HffuVX)O0<uZzQ#>ZhazWE{q=#CXPLZ;O&ghufvXM(z4(gj``R zg*hb+j{Jau5?IEjfV;y-Hg%=B2GY3Y-buqhp0{`7v*yq;eD1U~q_uFcqVso{<n44d z?{#eo&i^Gk4bz+Xil1W*>oRkoTjr%gpmflO2E!8PpR_dv!@?{!bKwy)Ugi`c=64Wu zK`mJWMiX352|_ea_s^eBd)LSD5mB4?+Ta&P)epoVSMKWz%lrLMt8vFlWs_&TNnz{( z#kR{~L1jbFNSo!tQ|{T%YaFh$L#i-crLz7lDa7_rp>+P0xl@ze7G{ii3G%JC-kE9e z@Ct?SYdq*F;N_;jfIH3&+?R;g+_@RNpyH7B(@Iud)b07n+j|^mVQ+C!<1y;GQKRQV z&9%B>b-b1c?QQMBNZ@98!(T`~cUUY{NYpXiOLklLam{7q|84CnC7oo(K5-;J6&Ibk zG8NnOyzD_aL@fV49byX>em{k_RTs*;y3CF4{B3WaQy?y__dWM{u)ww3XUAZ7>BwK( zYAS&nGqRORTXpbpef|6Ki<7H)q8?lKYI}YGd0BI5gOlBRH8{foN{Pc(qNrZN@jZcW z#--+c6I|wF%;!~eGM%UeUT!vWl%8Vc>*04-l;5>zm6k&S_CAeeFFk#3TK<{Nxyzir zk#KO+hMhS&0ei60W-k14RjVZQI(T72Q8c6Wm@@o?_mw<o;Kc?qLF|I;B_o3EKm6br zUQ+(Sm}29AIp%YU^D05o?fkNb#@zg6P$x3l+fh2n+UCt~&aAbxE7_AnYg!>59zutc z)AN9<RC94*|2LJ>gKh!*i(_O<=_2RuiPBg&zsau5>z>VArr6~Z?FkkGjsPPMReuq0 zLF;J+jusek3{D=7%mlJzo^=<G%UE%mr?;~~^EF4JGY_|WIM<?jo}`)I{WY<Feohjt zH`j=EJ3J?eC|V}glCpqLuDn#N3+pm~&1qdbyiZf<8+><%!|%-x1It0PI*h6oz?cZx z?4-ZJkb!TFe{yI;{>50bWb2e)<|KQ`V>*(<QRoCDC0wCmb45!lmZ^?@kIPv&%*F;6 z2!Db2h6k|^D-^>@;qNTI7axhOy!U_`${FjNl0~W)hG|S-my5L_lP_QF_?CWAhAJ*u z+%S_Zzow;Iq*G>bFS}s^WN_38#l8-rnV7HsT%CU|pRo4Hdpu_^A~R#eidg{qr%zGY z<YvrxaZJ5tzXMmg`Z@2@H+UBPi%aD#nx0XhD^5id1KnAEByQ<878|tXx9L>MtH~X` zLmF73|9Tmo^#HN*2t=uwE;Bxb_syVP28odF-aJB~rGtUZ&1;^UGKQOLzykwZ0w%F= zhWsFP3G)3je5qE~(Nn_F>?7Efh9oG(1|wMwBsz9o^^Gk-0N|+Z^{I6&&B{pd^J)F> z@XScG$*!;!B>>CZa7UICp=g3L43Zm+D7wWeEBb!0(^cnuv+8&WT<j)k5-~ip0Y<W@ z|JHg|Y4rJW^PdDWj-J(9XJ`Zc0`;cWpTpXqrEl+lN5V?YIde?usf&r$JS1tcx55Oz zuo7TTuHI4xsMe%0W@}nAGLI<8vEx&bQagF@1{)yF|9sGW60bg6>oT`GZbu`u^&sS* z6V>CZHjC$`EeiKeHL&JBOsR>{=yW|gWjw2@SRS<;d?cvQ7*H6xvg-tDz2^dH1UKG~ z_?d9O_{xuzSc(QluQ&s`%TDG<FyqJ&*y2Qj;z$vKV;JBv2ZMMv#O(PvWqjk2Z<TYD zA|o7g3~f%I^M)O{_Yc0|@3h2IshXbONvkh||8(Aq(;Tn*-se4ZzB@x7+`{BXCI{~5 z#FNPaGIUK*m@*8le`qDvj!sQrGko5*Ep@=jARGXW%uJpJZXm0=AHJ>6E*|~l-8l3) z=x4VNS8`9fXHG{`+c;{4W0_3OE2*zCQX%ayT|jY{s#GdfWf(L|j0kZKO)lvzoZE|> z=W+`rd0NklBjH&`p%SYb&G?&#ta4I%j|>nlz91{^q(ERp6a9B*{N?@KfdhbP#{#&u zEEXG_;f5H_1ycLB@e5*=)N~w+VMh{0xUw8^i%&zPoE%NCXhhxCuRAp%L^M+mQPm!K zX~bAp0w)}lk@g@ark%7uOo^Il#nGBbtqSBA$dYCluNSO%oYK_TtRTY4k7<^O(!%XU zbn{ye-#4>w9{Y{*xDTD$a&V9N1xZM%k<Z`2_y@~y(F1#ElyjinRC#Y()8?Tj7ylr$ z``g0Zj%<YrX4&2m%k4w!=14S-g(C8t)rT`<60f}+WXap=psJ#QY=2tR;C-j=!h0T0 z8sMjpyiVj`(w&dkhX}!>BfmrV77|KZlUDk7FK(s_(13N^XR2eciu?i2E!LBNq6q7) zoid&d&CWcfR`}Zm%ceNpE?$d!eKvL2!SfE9@WG~EKQs4YhZJ^mY;0y}W>D*Jv@<f% zj2F*RRX9r!uoYZAhRiqz)z!l+lbAnx!v!>N?4z`}d%&ZSbT4&X$b`IJR-koFtg>7^ zieoMbOjlCHo!(Mzq>w}F^0jDa>!#VtaO3mfc;HgA*6|_)L=OjC_thJBdPyu_TxQ8s zc@CTOY=xIUj#J`D3d?S=gRL$goAUYq%NI<Fz;>QL$-xmGLi^-d5!8rCcW!pA8$^tW zxV)GL3=ns^OTy2f8<j1poDS)A8aTKKBUCCoFfc58-YIIDY<bAN&Z#*2%xe%tNw3%E zQjuRvtH0A`v!>BsRcU4~YE-I2mPe?{zq<nWA{{^qGXp-HsuSf(gAzpRV9x3n&(!A! z(%2pgw6F8d_#JA{fb6db`nFgR+`Glb9#}GRb_~1CGJQnd3p6Sc<Oj$TX;+?uqV8t? zz~G^6FY^cZpLGry3%%DrSSzMScA-w&xzY+1+#@v!&pcFeUXccqnt%EiTnxT$5``?) z<li6mfGk`pMB<$Y=X_6|kj8WL_m2;zDnm8?suukO5%YT1kKThk(K0udHxBKr&$Lx~ zp=yJ$5Os!w@$t_&<;TKqzG2I_>ow_BBp{YxB61T;pai49Z;B7Cja+HuepChKO_AJt zb&6*7&jj3?wfjyD<B~g`^X@os^3UHUMCFEi<mj2{@=!1}SUA)-1LV5M7}f?Lgx9yi zyWoiD>*r574Z=6G!)sF=K4OxR?Lu1)&IILWMfWhk)yIJl2%rekPGi78P;)p?W~!h$ zXT=OqGH<efWpzA#)M=+4bxUO2Z5wpiJi$<~^Be)i9&Ya;UDv<5;~NlQxOV<&(r0q9 z$+n7%g#<-Xr?OXEw?gju50bjmLSNLc>m)lxAHAqh^JQl$6ZBoZKC>p+69RAu1dJS3 zJb%ylmNsjz+Pcdg@-ieudgsyUTGrA}A=K(6IR4PeEgSp8IvNJ$pkaF)9+IZzx*01t ztk-=P(#=Nf$eQb&f)Jz6FM0N5UP(d)0b)+j|GjyT@gvh2K>VhOd7PvlBH`1Eo9Msv zi?H4OUgH4ZqK)58fa$Y-q(5f&kI)0F_IKGoZQcF<j`CjQz4?sIerxWxO>rg!mnbLQ zGiD{1to#OKdaPGfjLL<<s4rt!5Ps-lb^~6VyC*!AYCR-k;S$z%y0%3lxmWamo(^GP z#B@pHRaXao(bh!5nV_4)LnX-2Ajd!mgBtNx_8W6XEN&&?b#6Y|uYFlxUp|@4e`j&u z2GR;)Mi&Nzt$ci1_ri*U;Neidh%`Ek=n&OB9o#`f_CVnwC|M_p-;J6$JK*@hyVUbJ zR-M5AZ6M?ZZcV7_7EHK>>~6osy)L|Zc@K}<c|gDjsAVb6_xD{YPrhf)%{egaES6JM zwbm%1q#50H$>3Q}1s3u=Ah2b848U!h^zH1*pF6q+aeAx>3AlB=H?5VCAADhA^ATd; zjYF;c+?RU|Rqfe7MmOZmF24Zlt*cfak%xZp^@W6Go-4EaY3-mLEtkVqu**bm8z@ty zYJl7HUf7%^v~SSo4A}+VfAKDqZy+HT5#yL>-hucpvBZ-}5OJY@qwCFB@SO7N?#YdW znE#U6=nfiC-ZuPXWOOJu$1(4i-)N4J<Kg$bP=E|oG7=-KE+6=bD(v({ckrn&INKse zO39?l<>jhJ!s!%aSFeBTI%#O%<9Xvg@7VWUMEv~-`I~6%V970fe|Df%N9&R7WGZsh z@4cI76xh~`W6D@H($t6_TYAP)QE`(F!;ZNdYd7=q!_YZ`lfgk*@ZHurKk|L~IikR_ zpo$haB5`yJ!ayh@QFIvmbd=)O5WH^po>EoygsI7gu;s3xJy*7P!Mh^(O4DYDKK(cS zCxV*j0u`R^doO4pPS!*0L;UT9-%T;_y`GCxkUHr6l$`9uK!|4C{b0ZKXdFjlv_x%m z;Fvy)6vX3{+i%VGb3&0IQx8a^1k&Aj(O10KnltQJIG>x|QHU~HY`6YK-R*Pa<}K-5 zO3uzCOP@SVWkMKldD6lwmPg2o>vcQqXdvL++!!-3;Jtlvr@}9LX7lv^;@<c5f1Qb? zNHI%kbI=M7W>(}|hSK@GSnA*qByY|65>;8ci>x6xn2s}k<t%xY)43HgJn7zbdHnI_ z%2iOUat>0m_%T;Gn091I*L#wtiBL)3z`1-xmq{5b$C^vz0VDbyZt}r|RziT-ap~O2 z$M^Zko_~YKZuxF~`7%sO9@7vQ3YB{&M^)IRiHy|OVj#@q>ENEBK$iY#osv-7OW;jL zJev3A@*!8S>%jzBp(hZOxr9O?GNEt=(tsDpbwUwM_zL&0&DRtVbS4aB4ho8)0_b<3 z2qm0v$<u7qasvL=@MeAiO=y?mxz7geXv1(M9-lNmF)y~XZ7gep@7KE;-`H^{+Ei%C z(UEvOwK69g>iCk4`Dl!V%>fmvMOp|Z_w2!>SR|L>qIG#Zz}|+3p2uA7d!t`mzivku zxmx;mP?4Gd6(wzKOuub3TYq)Xs@uxRE|#Y@SPxBl$@zx6|M~Wi@P0Euf+qN|lHnFW zic&;^)!r(;pBTL|H!qT}fAqfbp5Y7enBV?u^PJEV+m#isfdum!V%!gh1%H7Ya?bs+ z49Mc|FPnF5*;O2hFZTg32GB+6qECw5Ye&NVZHxEUS>dZJo$iz7O}^@f81+(A07DLn ze&37g@$0eZ#sR62{W$_xuTw9VNeq})K9lclb7!%?Jak6Z<Kuq4?{%`jl8`v!KE9Cg z4u9?KV~llO?ttnYlbl1b3_CKbmg<cj>>EJ1`*CwqW+eDpv;m~FJ8{W8<by2{4GGfx zB=Pif{*9z*t`5fko*Cj#KJPe)LTp4d0VaE%uY4gv=V43UBTcX?Fu%EV>g?vZ#@Yhi zVp?3z*E26f;Pt?hfcW{!m@gN2#sRvx%qV9+XBwI10NyPwuLt;>R6784<3x&*0`}`^ zCowEsdYu^)WhE#X6r~rL@+#iS&c+u!9V(Ibis_yYd8dr*&OvW)CFTXv!~w1Qd)z|j zRgQqWxM36RZ<Rt7tkPc!Y9Cz^ou@w}B*J9niN~5lOgiSjakXvv&6i?h#`!pPTV)<X zDs+@+K3_tNZecH8t6NNyX793An!5MR(KzE5Q&41?C-GHI+jP$E4SXt6M!utuE&z1T zG}jty`z^CH<#X}jFM1=&wl+97$oB{^!3;5={>C;NbFHf>Ii$~}QMTa%q|(<kJ4})F z3LnN*F|s~XdS1)>#FzUt7w&%XcBZ24s-F(tyN~-)l4~|kAAO@JmS&m1E|BQ8!*h6~ zs-Sqk+z<K7R6n-=lM?vieOH}jNu570^T1l=Fo7P9RIJ5l>A24#O3KjO^S%OyL)G~9 zn$VtJJ&BPJ^6dFL9CXEXpH{1fiDB@*3Vv)2ZE?_5$6Rml_jt-avNS{A<Do|tt+CGs zKet9JHg9xZ);w0n6Z{~KhA*5FtN3y8!zk_a_j9RN*D&OzfPdcz2+P!+i*8!B;X@y^ zs6w900=H2(p7AccO$-}H{(YJ8J{0fFB?gq01G8$PrLjJdBd~Fq!2E-y83-cBKG2aR zzr`gE+1tl8TyKm5WJHK&rVs1|`s<0KlL>kJ7VqaaIu>6JlN~v_9!-lF@nXu|0kRL3 zkGyBfezuBE!_6hK>T)hHVjtsO|6st7u~j7OT4qp!xh6sDjjfpqEbI%&Ud=N*$S&~8 z8I~K*7cI;$Pmi4tlD7sm)AxzOXhS9FWJa736SG=RAruO3adO-eM^yNeHF@|NGsNu& z{Rj0SE6wy}i7aUoSLEa1A&BWALAdb<55MvX_lW5<3V?(YsQz{DI^*p84^6^1$5+#j z--(Na(UYt-w&NC}kyiPeCl~B>*t_ehD3!|;)oyr%P({%{aGh`vggF7c3mkS<jw&7; zvZ{XwvrkoNMfgJZ*8OT-%e*fG#UuDXzJ%in@#&bKAD({K-7){JKy9iZ#hI7J=;};p zE-xSym_T4bQ-Sv#gN9fF-NNp_m)aN7g7bqwA~=7}i6j#7zSn8XNn(ECz=TL?%1ZnY z!^@3l*3mP3D%<huZ9ksmzWa6&-%`C@P#8OkHd!O7t9G4F{A$8i`=H8D2xKu$ho9)Q z8pkUIF&gws!Wn>tg`Rhi-3e+md%)kE*qi1mx~){Upd8bP`bMzP<BP3ya^Biw{i}vz zryw@Ucat+&zuXxS=Ff?zZk-mrF^rLNWDUtWi>lkUL5ZoXX|p1VssDj>sDEKS(Ynwh zCX;{5gBm*y!8XfBMq9bo@$w^H*8H>`TKDf0kqPMdx5t4XtQ@3TVagqzQb#>mm$iOR z7K@g3R^zlp0D7$RGA#tZVG05%c=1OqhMTF{hDmhy40%~vWUH}T)C8H=eCuT2Uh~em z-of!kJf1HKISc0<g<F{Y-(_eqQ*lcwl2T^JOMZu-1>zq~w?H4yW5D3U{|nXBn2Ng> zP(UY+h)9Wu{E8;-)j3;d@oH~UJaR!noQ+8KrbXO$m&=zq7T`8y_~|&}_dfC_u_bjw z2fG!2^(M2O%F3$X4#rk7vSB_27|||t!l|$HB{6g?qw-zOYcG)I!pxiwJBM5bSt@%( znEpS5r9u-o?Mf~z9c{H|$^B*ge1AI0TEP63AKepWXldz3RF0A<>ufS~aA11kD2rRI zRM@Er{~x|7P-d2kwrt5CPgl?$=<`2Q2m-lqZzEk>fxEYl)EA8`0lQw;+!wB#O*yPe zGU<Q>-e$)Nv%JS6?XnG@o$IRLRX6N?gkV296Nfgb5_Cp=9`W}x_(g2s!_V<@(lo<c z_`ZTPC96piBR=}~J=co|5<$%`r;U7ly(+X<bW$kv)60F33COA}ut8{+qT*+05L-gx zwBP;+2}j`m4G|@v2v~G0MCXcnD^Afxt$Z14WaRbp%IX(RpXV4ZIA1Q)+p}_kcNR-~ zh}KkQT~?F7ezi$^FrsZVn0CPdCc+?jJ@^*|g3D(ScG*aY0Shb28wMODRsV+qcUk0b z79R409m{*DW9$6W<d6G10Tquo#zGDqIv@eS#EwpyrHMkZ0e#H0CR#(>_Z6ZKOdoPq z3v>w~8T*HSmlsNg87YE2B3YdUiO54teXDav3e>Cb*L>reg&$VFf`YKB3Bt!6F%fw| zztob?-s~HjK(*N!x{z7N>9Ufc2bXLSq$3N^wvl=zCa#T&4esNm8mmpME3BS+m6Fxy z%P&C*RRtw1H(`d-tB|y!YHu~{yMNi7du!XJDfB(@Ao<6y$DgxxMtDa`COALpz!ZpP z3tWAGWTenO)c-IF63~QTEzIcRPv0APUryn}Gney(pMx$gkCc+ZSR86J3$1QSaSvHw zTuVEnZk@cOs*vSw$nW)|O*K+3l#`vLO-=f3^XnsDEU|{M<L}mK(J2`pj=epyKldwl z{{k(qtnURG;Zq=Tbf!Sw#GvUX<vuQUs04+tU<aa*!*c5We@6+eCc&a|LRrsu`#T-E zapsn*Y-4_Ue>${3(IiRF#}s@w$9KNgCi1njK?L%)0Aon?3dFL$;vtQX?3r<~Pms2m zx;OcNpDMP3tBU#BUUaHFYHuGwlR9}%H{sO*V9%;r&@ts(k4n(l76tcQc{RPfC7pOv za`+uOU#mF_8Vo+of31{&bb3m~mh7K}h=ki_1|zxZvf`luI2-ow#_0`=+s#d9UUW<7 zsEa;Q96($u5-Yo5b&~VvlE)R)pQUB1ovm_e*;a=I<ZIxC13CY_GxpQQTEE%5nINpQ zoPD7KnW)=ajgV3wy_(PiNa`7B`s_vHN!HIwXvacHD2;BB@-Mfgz>&W^;|$639+IaP zHN~X2g(@Vxj@ym9m2O##b@g?1)20|KFx~hdA3;;(WUPdot%=dtd&B;xI?3xw)T*vJ zyNSB$>a5L_|4}u26v^v;&RahXbIf7YEq0M8YZGI#Uz|wzDMdtKKQ%P~8V29|l2QT^ zf>9GpN8%9-xF;+vHT|AL+*kTq-uAZFtC>mVilnZF0>Du2R8z2pEVF9UD=t;GB=~p? zYPl1PLtCq_rN#0Y`55?y?)zd8{}gF_dj59i8X&m5W*h(arJqDLT<KgcgGVgAx0gyZ z<f9-db-mI#=^|wP;wt$RkZXm78gaX;I+xtdpLNM8L!<(p$5j72)TG(iFzYs5K@`Rd zxwvRCX7Zf)q0t8^76N_`+kLPLk2n<)7Nz8dZl%qjzr%(!eHTEd;?}PEiG8QGKGp{E zE8Z?f!g004$+_B@2}SgyNXRMw58qp8n(sl<q+g+#*c}glZM#4YN)f9bu$V?qM1O@K z><})XB)fuf0z>#|dd0@mJ{NUam`1Dsp>@el(fd|9z`gqx^a{LF%-M4CTDtZAmBl|l zFjq@D9iACRTq_>lgpI2N`LO@p9o%=*{aKa=b$tn@<biBCC*~se6f`T5*%ceq6+$Cw zyeN~~f0$_4l+}@9vr<wpE%;X({apcn`eg>SCGJ#x@4Z9%TdTJ6y}<Kzf%0)yJCsK_ z4V!@&QD*nd#>bhPaYVNfg+2tn;27wC|Km<(&}5$+VDEOgX`V}+p|CW#KP2V>R?NjU zp2E!2M~0R|gPI0{0!trbcSMS5Y_R{N%*Om70`E_OJK8i7zNI{<er2{kKLmB&?q6O0 zY>x*maJuUnI5=AHXz(GpB_<%x84GJ9@>k_0Y}b(SIG~CS5&nyNUhss&n1FY=GwSPy z5pVKMi-rQH(4gZ9Q^qaG9mDs)X2Ter;Bfl1-b8)StAF6~ol=&2VJ2$QLI3K(|HWr> zuO*Hv%lB#2iP4g=zrhTHq+m)oMFc)Sq&*F#vl$WyM*TPUp+dhbNR#Sb6FK_`Xe=*D z&<Uma3M4XE3e@<ckL>EE(4Zt6suLn~9>f?f6iuN9o+jq=+3t8a4J#G#wK5(!x%(tN zjV?OGiPFyo^>K>wq^ZI3h9RljAGF$&LM|Sz(bo>ut1<-fbeK=ebG~RscBi+z+2=p` z$aLZ?kDd_R4<n%jbAw=@45e9v;~=;5zf}a$Fy7+Y1GOyWGbzBAijw3XSiE>ndc7}% z!?)Vl$JMT72ct~{y1(c!+5E43fCcxH4i5!b?q`l?f(uV?U30Gx>ehQg@O4I2eQOKh z3;77l2Le3^OMiH=+}wOyqd50@4;BvIa0+UlSpO-y9qp#J+p_^<b}dKA^Y8e%fiq)& z1vdG2e^g51FCW-a|5@4pbx2+?#}h58&$s~O3fa*T)f?r4$tosx$(g%Dkd}O{{#W== z0k+Ab^CmANZ*${!&pf}T9Z2=7`7XATGwtbH<HW(ucku%BG+I&+j7l<E&-X$-I<gb3 zNv^ekalgUSG3;oW5!fm&&;9QATU5~8`?Kmz*wdoQrTqQkCQlrQX4H#p%0E{`nH*14 zI^iq)zd@Tr{$yqDiqF#-4&bK@V-#9W*p^Q!?R2mDo!o%mNflj%;)b`0b8%%MsV;MR z&=2XMuhsU3Z=ZyCK{vMyG<@E<RuCjaanLgy{gau-0?|b3B&vukecTEr1woO{^TtuZ z<w&tv`4rr*SKkzW4*M=tAK~iT5%dRAR>OZhizXpyR{@>Z^VbNh5y7<4>C)juKMr6& z@JtUHDnjgN<VVQA{0*)O{O3aM)cIyLeQA68NXbd8TFuSu?}x8BYLPt#f>eV~P5k>d z=PS+4YGv|J@L2d|A{vC`fsmtI@_0XsX|G?Pr)S}Ces`N{sAyUHT~*#zsgRyjWj<&| z2Hltip`swUM8Y4GWV5v~Z+!hljR@oh4iD=WhjaHIM*hz*&-WW~o=v~pd22Y5m^ZzJ z2J_R#D8=v^aad3ZP~vpO6Cm$B&4oa!J*4J?YyhyV-B4?!0m0XJ=(rLVT?YH^=b?%M zny${#I<uME`2l{i9c1)_H<5^2@Y?Q#AdO!9!mp%^&r%M9FE7P~FK$Y7>FAL<GO$P_ zv6MsV0g%;&l;s7qYDm-=bJD!#W_?4Rjdfuk{u(o}HSu<_adCJ02Cm1E?~XQ*<>ec8 z^=mL<N*<R;SHCCyV>w^v4Idoy^<T>PYZ%g3=q66ev{|9#mrhmHj`m9v0kMx@Rox^X zkKx7E-fGa)Y$~?JQHmT@X;Zwb!1@Op8_xE1|96q+!BQhF=Fc!KRXNlddb!Dz$x-<9 zq=l-kkRVemAIvBF_1FUWTk7$}l8)pxJLj5M?%kbE=l2}PoZAbZlcE)erx0PM)|k7g zzIwu+ph}5bgJ|h#tdBuxs%{X}`X34v<;SDE8T%wzHBn}-Wx|gl9-R_N^_7ZNO0%v; zMq}{fk~jnVMW>~#uDfQ29(A(W#4b$F$^}9W-^Q+&GsrY+?Fb8J@0h|iUGs!}PEihf z55a{l;XF4zr>1jfUvrSVx&qzeN6MlTPhU>!QjzadiL$}4?J;8~kn2+n!;7>N;V`w0 z26+Xf8zcxV^8*au|MJa4m_O{%DCR}7`(tj%QVA9u9jfK#y+Ng8T@VS5_E@lPiJT#3 ziaa@1*nTtG1$>^tuXFwtVl_I8x4j!V^%SHEgjsKhyCuNuO*2zT{8F2h-u$|++c8SY z4$=Sgjv@=Lki38M+~^7^`=iuyK~mb@$S9BP0?U9CO}Z;IpF`$CJY^t;Zh_MKll-5O z&9TUCwjSN92VxWKe3Go)pQ+7X9!})_0#hEAC6$@y>jswXz#Ri~XH$nvy%Kap7y-T{ ztPkjDte}^r3ZI*b#%i+q2=l0$7y}#CG(Ad87d%1fgmLJKbJAJ%x!5Qw*YUfSs@fPl z_l9*7+CCCKOD&=I<E=N(dqO*|2c1r*Ttl?Dod`WDt6eiF&)@{#LYa7EHw;0VdR4;U z7_xt_n`#(ez$Sv&FF!hn!HSlPXFjReoJ}$&H$23ls!PNRI03hAZAy-o)_l#j?w<PA z1Q&Y>uwt9zi23!6^3AQZzR}LjsYz&XY?5G!c70HbOu*j#W_{6R={`F4=xrLNu<7It z^%RfBZJWF9-DBk1HEP<(%fh`w7%EhxCWjZ666Ee)&f&>}YfAK8%DGNAigX0;Ut$2? z-XxnKMx{MRkE~Teo%~pZ&xKush~J^++xdE%fNqJ34CX~hjH3y*hLvaD``V|tB^IuG z#A36cfagUBZ=y-%^ZC_v`x|nwpL0I7;6yo@zT=N9kJknl7Qp~UG*6MH3!SW&_}a6U z>{|O@ltR>K*|uu+=%GRqQ=%g@NN&?Gq|>Irp(nEc3BHQpu*R)&#qBwppaAs0y?caU z36+bK7X3l7bK*a7wFwmHM(K@uKGE$aUPZ5M#by6IJN5Ag)x(v6Nk$bx5~a#?Dqm3b zDpUe>e<8R~1&+Wa8W|*Hxb=_GpWR;nVy=&9X%qZ7cpiUD;TYi5{A>nn1YJCQTIOU< zW1i~OhJ?WnL7aF>a?p{HkV5<r!oP7uxkwYQ8^U7Z51#OPfcV5JY}rh$X0-1j%P8`? z@A%klQlSB`514=`=BXTTIbDG>E*-9~leQN;H$L~dLJAfBs11^S^4{uwRyWMB|GU^3 zjXaJV`|9R?=lRg8Slb=I)!-QrJGgRj8y;LRfZ&Zyf61Fh<qs*%!J7zv_b07Wf|ORI z{tY#xqWu8x64jY6f-boc()9Zi+|_iAz@2sX3b`=CgDho}V*-6Ut4Yq_+JX^<xuokP zMxx<*JU;1!pAywtPB-7uq8v6<N;37#ezBtLbT7@9{e5(W&qT`uoL)4oV3A--iox=w z9_G<ZH_gvS!b5^2!GD7|3N&}(o5OVPc`em(O7ZxcE7<`*P}`vQ{)Da7p=$&CZAYN= zSMHCI667;aH&~ppYl_vK*>cR6={Us*jkD?&gwe5E=(_+61ehwNG7QEH{iF{2R}N>b z%&|Z9DEgpz+rN2M!gfo(n|*^u(Sn!?5yj&cW(695p7E(yXdPIu)F{voAmunno<shx zNnu##+w%Y6Hx{kVHXz9P2+!8n5W~bGzVLhzznUTp)YDb^=R{y4pvvZmg!~#7)@|=D zAtgZrOXnzhUR@d!-cyut(tb%(|7O3NHo(qWRw+H?-q4_<;BUMhW?wDmkU&OS*xvjW z>|(Y1F{nC5WtJ)iv+Y-&VV94b|KI$z2>#zdYaoA{aOh41_0bM6H#!Z<v0i&jAvXte zx3DO39WJn)!gD(#hV>P<g9rqiiih+!00#*DK8q~18tJ%JG^)-Y@*)SqNg>();V*)# z3GP4IEIB!639^sGKFRxsN7QHP0gyJAn)<bKw`ZZwS~<E@ygN2)>~uU)_|4tWL*83> zh+-rLZ%kF}AL@FGJaz>RpgAA2I~#X~Q3=Whl>GL7y{0RKb)}!R#H{}??5Jq4Y9wr9 zcjVS__4c)K>H;?dMehCOSgmQaJUJ><r#_IhKNivm-pHnwYMY*B`z<Boi8s#up5O2I zLC9fu{rOPC(N@2V$=^6tjhd6{r`LDW?@{^veaJJer>{Yz<_Ji)&L3ik3hNT!_)O}Y zf_onhOCYiG7M>1BBsNvm_lF*0<iwJq!JL>z{DY&BCZ$eOJ}DK&LXV5UBCWCxd1A!G zdEC5#-ATZ6zh0iq$Td4d(x9azeuq?bPd7tw4EiSXWTsJ~FK9x3L9X>T6LwVHzLEBr z?L{_9PE|#VRD0Xpje13b>|6{012;OK#=|Gv6}#{tDHIHGI+7~+@nq0wj4?#P-pS~e z!Dz$k<%&gIsd{9Q?sJf&Aj3Mah&y?Jpua>VMB_nz)4REaho<7-JPTJ2`I?Qj+68mk z^!ys)WshtwT%u$6EUlkX2nEOMbQ%LmDPpuJXyzE$k~~&9)a~aP+9)vkas@Uh{9j*@ zJFQrnLsyAOR7Whtl2wNr8GTz3_^K8*vmjpvV%j9IaG}3b^az?<0In6)l=Z)+vMSct zOu*&#B_3E!Un&fx?LT*3utDPGiF_>)MR7%*%MQFm5p)ZK-hs@%pd~nGw5Eduwu~QO zl$kHaN|}{A`zQ3UdxNcjRJBN@Eg1Mrh$OS=0mPX}u_Yt%p=bfgWj0x-N>?NSLz)ts z)kZ4TuYYW;D)k1rk3MYa^i${_35hLw*VBE_(ETKFnGEB8<Ln*E6b7w=GGP<k0bNx; zW?NizMS+q?!q*SV9T*lO!XZUS?TK&z_VWK^LGfzOWKHj-_vV22^cBwvL9sJ3z$dl# z_!Usa>rD>`EK`Nd7Q+x+&R<L#q!RAt<>n8;8kWEi_}DF+1Rd<xq&8Q8Xyq~?xaKE< zeYg7=HiqT2vqdmwY30l9<6;+=t1u1LP0$M?QC=nhTO31s8;IdUKF!UDjS{v4Crq;r zFIoeWp)fY_LyNrCR^EMoC{<Em_^W^AxVrztfp`~|RaVtJQ|#`yLvlzhFKJ22hFm2I z=1Uc;J#^Q<+=q~uN+${`7h5?~p$9``<TZaqbs1Osz$~c16q7MHG64QBFY~dhEaMqb zwn0Q&zw7Il$VgxG+bkJIqIHn~nm?bVARA&o<b(MVUS|Z1*8AG(28<@huIrSqob&xz zwuet;M&@y!3**)C(d@h)!spv~@@Ic+reqn_)=MCttK9qhKm-*)D&xZxcgase*zn>F z%I)gzYTsB~0^Iuog9h5kM?R~oB~UFlIFvfc6?93{ZVIg7)ZTlt_*=go_FSbwLc2>s z=qyojL^qwrf@EL5UOhJ$e5~(o*$FIDA{<|4d85mjsK0*fOk5$rl)np=lC3*Dl2OS1 zw7`M*#+-nLG|V}lR8gWfUZ5pwHr1Xsptig9*jrP^75#QD0N}$ufq*d=G`@IUmuT}e zJtjDm@R)ChgL0J7(;>HrZft7)YE{Kklo~T(W!<sy8N$>%aW*gWM8Hl}kEK}_Q!^A} zb`YY%!i+=rqC2-j+bLErzxCA=#Xh6uo>@B_IrWvd^)~***p-u=EtgC!;muV1IYvpx zml5k<N*S)~PU{)qHEFbAhZfpDqflDl5n>|xUH1^(LJXqFGXLNs+5btRtAK2l4dAH) zRx*pDcVqjWq8w2bf|d2-`cd-344O^;C4as*p~RNxi}=&?L&ci7{bSEroopZ^q|EFg zfW;Rkon{{`De~zdi-`!Ws_sxZS+Dz6!zZ{9fwoEcVc?s#XWm0UblDnCmT}*W*hR<j ztVJg?A|cQMf%K<{g!1><Z9h~~OT+ec!Hd6h#%K>DJT8k{H?ZVe=%wux+Tm&yDUNLp zvc1_hHvVzu9Uj^}x4i|_R~u;A$Ud(#*RBD5;@e$x64T*&{Se%ORmuNE0c~@JP6ls^ zhT;0xpMwu1hD{6z%U{Rxf8efIlQ*6M0Pvw}ks;1tApZpAb}$fyWGNvu<3JoEc1a_( z#C@&FvMbU2abU=K1ZHptIiYlsc{~@|U8^9FwH1F%MazecAvtPh>Ng5hE`>|Rk75E& zi_z1LUy48FK0`zms~2w%5sz!1K7rePnIg9lMQafL#^AdlHMp2&INW0=!#?@{@HLDQ z?pED#@`bK@LrdL86M=k6!LP5dqC+1#oY1fos(R4WX2xZ!v<SPzP#+IEhwFfdxF+zN z$W6=uqItfGI~CWYg1LCiAjJ<6VwQ<Z5nM7s;VGW1PHAL!g1(!a<OsniU+QX5?4bI7 z$XJ^p&bZ3Bk|4#a^mwr38I%9e)XeO4ULx~i`w%-(rR96*2W&YJOHS3MlPIWEOCGS6 z*&Z;%F!E%E=4i%6^p>K-WgqmW8_HT#9LGU!b#iT&d>P9MZ$HW8vr_@ZlN#gvjTwc| znVoDKb(U*x-VIudM3E9YKi6yv%g$5;6Sf0cwK424!%5Bi_LLNM$ATU(0Ry6>+6g*m ze}$num<^G_`c(Dw##r<qjr#ttPrFUFAnK_+VdJcv9Hx@t8V;yW{DpPpV#(Ba%Wy=S z-C|}H7b+z20j>}M0+x<?zMmCNBxn5}>hw5`=)Rk(A_3!*Y~DdiZYtY4=OxOIawT9s zUop<6HPd$X{7G3*vNt=jnkEt=1-8Kv)#=KB#XO=Gb1t(!AAd3ivhFpg(|vbj6wbEx z^Zf<J?l|;`osm}N-|w329AC7to%EXUf`t>@5p7P>vvNP$dUa4@i6*Fi@1>^f?-y}< z^2f|F?n*FdE0?roso+%qS>$1QvRIwLpjD+)JY$W`YAQpDt^%J%Q=k&TlcO{{KQB?G z#ZV7ED=sSwp9g`GS5{UcCcaSwiF_a!>A3+KG5IDC#LUzsEnNso+Osqz&##m}9;q8J zcOr_S@4DjaJdh$aMhs+XIZ)Tz<w^vh*`|Vu(~bUK40F+1X@0g<q=Q?Mk)Y;L@jbut z5@$K}t9{MTMgzysyV-PmKXjb)JL+kqWZ7W42za)hU?qKs(e?GcC^$D3d{+gX1Mh6c z55Bcr{PwPS`@V1!^E)fdfXShS#_4u<@GbA<d@YSzxQZP%#1wsV#<?@{p@c&XEPd8p zk>|zukBE)}8R^zE)JV8nx!aDcp4vWyVj*D+4ZO)TA9v)|mMQ$Q^{GWeOG}HAhK8N= z4?GrHcqHhA>RV$5bNP9B@58}V9t|fa=gfs@oqDv&6|r-x0S5gsydwh2ophK0FK&~k zjNJ@uJz8y9xIf$`M2nKZ5M1Lu{Q-plv9}HW=q#Z%S;kEe6S?)?(v@u`?|oTVF<mB< zFgyoL14~>hJPWq^<aaSDoc9Rs^+}xA!g}3pKLKVfGSR2XvfyTm!$JGw9Xir}wr1BK zWyu3x%qMrRC8uRFo-8-CaojF(JJ4Z7hoR)Mk1Tx1vSE&o@A!M|d*BaI;`QBC-(&lH zvG7G}dYltEqW}n(<W22F!b6Zr*Qtrb$OPA=JVz$Nf?L%W(t&9eM<VPGo-L6tD=scJ zApb|Q8mU1~rK_t8`8iY}iz~LupfzdLa|5`0HB3UIEN~@p``qe!z{bnVTcua66tnmV z_Juq`M>ORmPsWb<*$+S$GPe#-ZU&*1jA5`MIm-;>%oM+}NEcHoALw*fkt@<;G|+NT ze{zV=`{kk6Pm*`&q<hxoq}oiKkWraj!1KO6z|wxXP_CUg+d-*Rgs#W<YIGH}!*pI_ z<O_2UzwQ2iwE$K{6x#9~#K7}ENvB|Lt)F2~Xi(DPux=kN_1AW<6?Y*%U36NWfch}( za|g!nG01#w%4zvC@}_?HPsD!nCafvqa{R-<t{S)kG&q|Jv4Vt=J(ohz3F7BHi_s)1 z)x@`0N57EMrFshb&714%2(g0St7gcxsBi0aK_4bgx9<u))%B%}g=4-)mrjJpNEgJB zj_l#-kdtyY1P(~aiK+h{r(+`-{tA@e-)+U6s8$J1j!+;z^$727?pikY^xB2WwW?%b zFV>629LMcKxh>xIj+?RhJj+oefL99IITvC9EiZhz_v#RT#6fV8475!zRz-GgOybRb zUZox&oh)#!XZfcvNAU^ib_*K7Y&z^*4*Q9~#qDghwULdA%91R?9(`RKim{UPP;}|% z0w5_bPZ@{VKxVPlSeeUyMS{y=RR)3zA7?z^$ZyQ*|K4<%l;ckna;2}hQ{rgmi3dpI zaN<=vTe6^uCfLHYN%c$?X6rFW#%hKn0$9zMoQJ=zc!or|`btH0_+C{(=_+ZpLD|~S z;6i46x<2_O&z&I46l0oN>q$B!$yE%@<Qil02y)1^c2Fv_Sm1G)xxz}^DMFgV#syOx zgGjYe?jQrY#Ne{3#3hG!UXz|Ga%jH3e}*6%T-eg(M`WT?9-omCI`O)j2?$aJFrgz* z^3@v?{7zs<m1DCU!)~w#b6sEde@gZ}Zw>#G#T{?mwBnV*Ah&G}ABccAKfWP#W(43) zSX!0$Crz64pEQR^l(>Qv1x9`cIVT~@GENXVd;wHPlz&cogLlkG&d$p5X`QhhfhjGk z-SF6T%VI}I!Dv<3rXQI|8iSN3<T?{rBJ`>gw9~$cAi0d}+{wr1*|_Q0dt9=h?^Xu- z!#maZ_?g0WbPVi32TmbT1Qft^vTWf6lNNpW=d?UpOw)MX6qF^%u#pr!+6BQoA76z8 z0zKeD_&ko$6X)kO%H?UmEspU>cbvA13AeXy<cWc3B$ztcJ4GBO4*Y*0L-KA1Z@qhu zzQOYiLJDC6L8W3Uj*z^ft`{EV=&+vAd_q=xMT@B>iRQ~M((Oc9n0d(-_gh}utg38- zF=@GL4ufxPxv8U<%0SMDQ1T$rGMp<yT(q!0KdY7r=_{J`Pog#0m-xNa$kNEvh2!@s zLd1k&h$38UZd$aED~AFBRx=X={8Nr#DrPSv`jj#c4-Xe+&<KY@xFjyYxG3-mf+$5c z7hkySB1(J3i+IZol_|;i&@k%pDY>X^m?9U-t!CSMvLOYt8fUXs9ux^F^$NujEvX5a zx2|<mBjwFzl_a@&_7?gOCgwkw47&}c<HTY^xlXi%^*Uz-PdL#VfQQjvfUg;97Ai*^ zE<b=myWdf-2hpR$vPH`<WT-kwCW}291x=b-JJ25`5`IedxJoc?BaTb43$uX0AAF*E zzA=95hj43wP(ZJsZ%%@{YC+7X;r&l(X*k<XB6EKdVF3%#(b1#sAVXYxa?j_pmSo*V z5l7>(z&Rq%QquWcNi)u)PikNZCaX=zxq`TyIzNP0{}_1EE{Avca?A&%l;^nIQMfs@ z(3qb{$To@))?ZxED(F>EAAbYimxLWcua=OL1Vi*B-2M=4K&KWNIw~W-uZF5d!f{>c z*i^4*-<j**&QI_PS-dDSR^q&cw+^KVDT8^rA<2?LSW+<+rPe*9)KANvVjkw_onHZ` z(=jSVxOnk^{ErKt<K=thB0UqNql?_#-<RU=+VB9|?<PtUlPxSP%uu^-iu8sFIY9Ru zd>pFp4K|Ro7i<C_0=d;fobA$2W@AW4D8HFteQK}~`7uRNe}0xQj1oOe1&CP(Go@ax zHI{v2du+9tPQlEu2<_jR9&Bq~PxB~0CHGf%QR5keG+5lReqf)9^+7EH$xtwkOAyus zE^Xbyn#OSk8!)lji&iAm$<jLq`geUlw*O$uXCcS*4^w2JAQB|hu_VhlDCq1#32A9s zy1&0yjm#eoy0SwGBhTDMGhZ?x{35aNv$9e~PEO9v?#rrGgmrktI$Y7xw<MjN-&wL% z>m2dxHN``pqS_!t++)xw!J&M8#K0mfbfo?MAgqs{U|?Rq*hi}zExS5J2Kn^kCP2re zf>>~`$)TOSZ$RzBD5BS5YGS3On=ApN5DA=D92G?7mHFX`M*^y#juagw?5ZIe1wLVq zJUt4A7at(SxJwG);3>y8o)Z1hABx8Gy1GRWM_PoE>(-B4?kMBzNb@!Ejn2P2?_-dV z9>#5Nk0jB6mzEYz>-*dDXiN92eFI>j(z^2r*P0aGMoGRxP|D18uHallmYJv`lyqbl zHd9BTfGd1p%)|ux+U4j>w8&`TIe@s0jDdw8T0)R*G!XJe_ra&!>Jty|j*si*$$uNv zG|f`gzRn+fY!xfVp;3ZpU9BpoG7yH@M9aTO0pn0`$rDu?%K4NX=f_z<c!&+ACa>Qc zO2_&B4^7v=oyoRsW81cE+jgg8+qP}nwmY`jv2Ay3zwg{J-e0Jyy=zUbC;&)=^I*o; zD-id_Z23c$cJWOukRP8hZMLwrCC9_V^Pl{?K06NVylVK(6Qf^UQ$yCa<pjIl>1yrb z##1sNTH?zDYI(DV09Dx^uC-`mRb8<yZX|ys16g$biY<~L4a48p5%@q@#z#leXqJRT z9{S+taKxveL3ZRt1M?I(*`$-ILOli{nv7IFg==})9G1<C2i8<4``}`uo~2L)V7LVl z$J2>cOnF6?WFm#g4uS#=LLPZRkjodpGPBsg-kKuBjRuOik1q~%@Wo<%juv*LkwOBY z1(%m-Q2&cJ4HmTH=o!$3W^Op5SYtub@O7Sn2MdoHH70CqXgS>-j8qs9R$tP&xP*5; z;@Y(nTft(`5qWxgij}H}hx(8_x(>!R1j9tLu_bIu8O?YhN0tf}qQ(&=qe>Zv(`8vM znI&uB^F%ZhvRD)_=Lk-fG}C3~(sNp%$4HGA8)TdGyH1(8hh5-I3r9~g8ews8^^l0B zCe<X$irqR2*I|r%9eSoQpP`{tY9N&v>6$dYMGT!I#3ybB$gzZo0RPs@s;8S?6vpQf zn-7L|kA$$0vMEBW`T37%O|N1;k`=|r)Yu~m>W$Z;jl7Z>jb~O%k(|jFRE#6w$Eg)3 zyrOzH=%1LJnTcB|6a2g#Ix5SyBUvnykLF1KfUE%U3ym)B5oJTyG)vY0ot=PKZmdd( zmWU3(MFWBY+)EL4L*)91m%XY629SLzS@*G6q=5q0%p1KF^K0EdK7kYENMO=1%&L}T zO0lf86RRN?){j+~=P9YhP#TeT)KZ6z_xr=8x*3Cfunkb51k5RlwQ5qJ-_PUo->ZWI zX7vOHECm1((cZGlYoLT9W@U>~@N;WE#|}^;0`)au5+Al|5z&1wN5ru;a12XvKYK&~ zfJ)cCx0CFN_oqu~VPRn8NHJ0Nc+h@k$izHJqu9e%Wo_9TZ3Xy+LI7L1$Hctn6NUq@ z(e=L}oPO^uJ<rl1;f<{|$=&B=rgF;|H>nG}VzGDzOmFA)`fW!3sb!#wSEmgXPF7|_ zixw9({Y9jYl4c5F-rVTW37@(j27sNncQDSXuB^0j0&&KN(+2|1m?#e~a*w^4XNSb& zXMxpUOrp7%gzOPTqF_DQa5B!2ot>RhqN1SZ=jX(Fj3&eJ^bP~z5{|0n3goN${=Ur| zzSmnFWTd3Q<0efO=`T}2(Qd>omr``czT7Q%W(5qs{R4z5`+&FOhs|X#Y$I&UmEj3^ z3Kjg}_~Kk?9@_y=^c6|bbewdI7)Peq%SLjpdCmQVU0t(gg1d8=CzTOw7i419%eNxR zYzxtFs7k>EaG`?<y9)krFyJ~Nhg{udBttT8Wz?SA3sGc|5#em^RH`^|K05~83^hMY zJ*4M<!T~UX`ZkEiNr>JHH*)#OhX!Evix+zAuB?n)vuRbl;ll_ZM8K#I4To@o#bh9J z-*S|6vEvb2K+PT_2a4t_>7OA2d}mA%t-`3(<5*H#vEoQ3pP;MYTz7@mA23#yWa`mS z*|F(jGt|hPG3`;#$?v_rUp&SVUNCZ=LKM_$OeoRI=T|LWU?|Ll3W~}PG96qzIB?hm z6%3RD{sA7oz;mY#_)oWdgkkWm-8Cdb(ppi%4G!we)d_b@p=VB(xd{h;xGgcmp#Qt= z#PPX>a#j;HvOdbA2>@veCPBYX54I$Pmb1Ov81g$IPO+(FD|TvHTGFX>#&|bR{bmbg z7d+gOAxb`q>xv<BsG@VF{LYx+tZ`vAe6up+EZQJBzC9B~^2V}+Ib)C+<A{o(t2=-< zpaA3Zoh;IG|F4Z@)&Cp=%sv9pz=mf}?;@15It>I|J1A~mK~8f~PL&a<G9mNpljFC* zH}tcO|N1{By?p&fPoH9I{{+bK0C*9A6#a^p`*+q6F5<B;K-rpUf;4o1%^eII{Wgln zsac6v(x~z}Ka&+2<ZG@_^k}QYd0y?M(FTJP4M`fn(Ezeb$G*@1)`v}4kSo>REtl}6 zqzuEQyuc%44T2$@oGVR(rOLxvBB59u1K_aM96-b2CN&P=_lcI7@3N4Kssp?SV*bqy zu8+)J;b)eB1s6*7O=Ej}Z6EqV#<fj~6h^?fnUfjiB}P;VjlG{4f<qKUi;L*>OD=AJ z>($3Uy#iFKq4)q5bps@t5)q^`2QA7n%YOC&AtO}&f=6iK1Z0T%3Q|elmc=CnrAu6& z{&N?Ju8w?uZw?+zek3S30X~L+2u~lp&29HxdAq(ZH^BU#BHP(b8Q}ti;aKr2$mOM7 zDV%!}Do75FNCf2kDw7O@JD%4j@|1`FCsL9D{ZY5AnU1fg>DBqtFd;H_d!P99va6f1 z*Kc&&tW{K=MtL$6xksHC1E$?VmDR)}prS)*9JNwye5jq>E13!}j_H+vlr&I-E~!S7 zhrNeL5^<nJ%n_j<5|O2%3>B{<jHnm{<`J0$;NyhkvcPbUB7=G~V1m-!A|;x^#l;;f z6@uJ`C)u`OlL&p=Xt6HV-Ql!Z6JlXyEsi~g*v7=TX-7p==Adt3v68LWmb&7hSUJwc z6`AvAaQNYh9Ag;kze!Y5RZ?Yc9Ca<C^+W*cNW<b9@vutRKrmkJM-IM=oD&7DLnT_; z|BTERb*Kw3MG>BD;?}&TF3pstDLwe($~0a=ga#-6cRTI&n-tU9|7kFMZ1XRNDVa#f zBS8O4v3^89DjCGdeq}nMF+BIiK@cYaWj`|n5ZpQp`r}tm$wEvaEob8m#7I!>RZ%{! zmU+OF%-duu_9jdYK|`)UO=RT=ufH@VLx@NL`cfkJLMYL6Px$b~+~IFE3Ooc>e0=<p z)>e+JdxRoiJ`mUQgnI$!lfM?>FCW)k@qaT}!vP3SQrv5c8Q0<VP!EUeLFo@z^cy_c ziVj$oeBi?mqUsK09*h_V*JlGN5PJhr(|!?9Sy@?OnwY$-yrjG$eI`y!Xb>Bn)O_e$ zE;#7!&`sFKkn!OxC<sAFcL287rz_DoJD3jao=$MxRkSo+5W*=_jrLvyd7N`V%ir|e zvKD@ak9(u!c>_7F?@-`EWKObYKcVD?0f^Y{v4byYfb*ez6PHJM(Z=^WRguTN*Hcbv zg!mE9F)B32)9n{=etveTtPdUwomh9T5YRB!$c=;Nm#%N?cioO(-{uv*#dRFfZ^T(= zIdusb{gh<1BTonka71)=kX<MrYN+0T{HGT{q!(bB1w6bF$=c)%aH}UWjM#THnz<oL z#XPc)mmA93TBRz1US*op`He^auT_8YmmP1$%DOrVr?=DRK+tjm9v)G#YXm_2xi#VQ z5QhRgvUKt^A!9sW-pF`sMRileDCmd43Q_5Ur^R0RgP?`7f?xVda*3e)nX1KJ<%6c> zqw<QVaTU1oMO)g253gh|xFCEN8W%+6gwTcvfDXXKxN_2o{u-iyrj+)-A=L{il2IW$ z@-NE31zH|=bgK{(UI^$zt)YTmoj*Vp8$D`4?m$LQqqp>aXRPB996XIM5Egf28kW}Y zFTJS)nkC<Rin|2)AoG#eB9NiMYwF1ur8ANXm8sCzSgqOv`|O#}NZi6V1#jIE^Lpo& zKTq<qKyUu>+t}XxdmaY4gkte2$xKoMB>Hnru_KBQ!A+!s>>=RAh^6jJSAD^R1qiW1 zQ$285<b+JphDXtbAF+6{McLj|?ZZqp?fv|EE#B^r|DH@|PXvL(9)yqbmn-H|d^}%~ zdO!b*^xFm0y7&m}p1PKVPs7l*@Gm_p^U4^_b0ZBkpu*n3`hW*R!HeA(oKXA&3h)R! zB*NMQ0oLE|iPipevoK-NPzx{z?F04WTvF$T^b5m;HiT}662=C3ggqmC#g;)W_z?Kp z5I**}=nO^>Pn3+&sXo9B`7mR6XoVkHtL;EAKw(!T6+Y_l42XQ<_Bnlkyro@Yil$Be zGQ4X0u$tj)Cr4=%Dp!V<r}hFCbFE|lL0rhd&DyY)R9xW^BLOCa2`AOFCt9<2=2=j6 z4f6a$^I%YtsX>M}&k2DuxSmVU^y6T=y~r!b(f2XWow#`z&W^FNL>DS&q1{DA`PhFo z#hz*k&Xb9TKs+SQghs)T&iPra->dd9wyFr3y>X>vckgGJH>1rz!ge!5539EP%arF| zPCOiCc>Jmh|I<PE*X+-6^V%h>$evLJBG#+qjmiiAQ!HTj8z4X80l<4ON|dN7wZB!p zV}?V_edb|d!9Z@7DpgDM-zI+-vG2@<*cNe>etmrb__+7W`eeXo9`EArjv7Da+)?)! zENC&ucVml!`j@DJSRAFuU8xJ<1~CGhDWZ4Cn;pd-D#8WnGGP*3@iZt2EJOc?)9O^3 z?gLl`%?t7xH);<$SdIlkjj4oAPtlgO<&CVB8$4TIw3OM4jAZ6>am)^?R+pKVQPbVk zc(!o#%}3Yy$6nu~Z@1u=6s-))QS^yi>bQxKTTxBuZ&*6o1ce>r#y9sH{;j)zQ;=Vs zWZaVWh%Z_>fhP#K+Bww^UmtC)@)Hwts4XfSM)q(e3SC<}bL$)Gv&nsaFR#^IiXza+ zHc73EtBX>7>X*qS-(B`KYId6qLYfKbl}NW4E^IkM7~*}?=->4}Z@UkSHv*WJ?7aIM z?Tm{hx2NV+<$jleznaJ&%=hH1Of=3f&g1a}w=Mb(6U{f?Yp!3x;>B#pFqU2sTG}eW z=NUy3_RTA{nN3~;N8lE=w58-yMh!s%f&5SYVy`wDj}`ry7v56<16W!btrJcV@OS#2 zTk6Fxms~p;)#5VbjYNP{mWhoZi`R*kyMs*E`SMOxx#K_s1(Na=9UKnXuaW3Or1(qh z2E?Hk&iaI}K9&f`8do8+>GHE@<B3qwUUkY7HK<{rT)8-j$aqqmC5A<2SXwl0=;-BA zt<-+!@7P?QQ+~v=J$JuK#9qx+wi1Ld9vWvzy=oz!0xh4E>|VolKc4`o{;x&g4@yej zQcUgOx-`484;x>7P+fa|oYD{rH5QfyBP^0rfSAwacl+lz<G-(0zQ=zFM<*uPQ?jyq z@8Gy;3XvLE<I^%}w8tvM@yc6<kR*pp+IhWg$nW1nW-KOd)F6QkC}zcf;DYUWSpN0D zt7KS{S#<z4K{KAl44UEFAPiv5bpPjcfkSN{j|W-m2pU1i$?jRolA@DGa>E+{JqEM} zIo#~@_!9cu0-s-A;<mvbLV(V&ihT$tq^G7PqSLA;;M#X5(&=`l9G#x}mrZ>j1rR|b zA{1d}#R<`%FL6+W4jE#9{lJP8D)Bjen|8Z+*dMxa?|B}ccipjhddw?%12}1%LLo}) zai2A@D+(*wv!AYnNY{`tXUNPsfZZ-Kb>Ad$&AcaNm_>sK974^Y2nDQgkC}X`>t=&b zHYwFk4GLV;>Xo*ruw&cp)ud<4>fyE!>TtQ@m~TwnTu{-=pm_1>E;-tDdZq85z})9x z9cpWI>=#NH`m56e%vafCjuH_anl!nQ(Gso4g%GPqp@G;AZbXh~?MLRHC;s~GH|bMJ z$<3o)A&sQW#GOB$ix6hhS*iC?_X}z?h>;p(P&iLoky3O)Ge41vp*rMvQwe7sBSJ~W zk1P<U1h`P4nq5<v*MB+(5z^h4ypV~8AU~%^FL&Wr(#T?C<XI;HYz{A11{;>fqoFG1 zCmGU3I}p)0Q~-(bW5Ck+Z$L71&CbIoG^{Uh4{)vgyWZ{sy}G(WrHDd^!(PgvMT1dM zQxmi6y5ayZ$gLLizD`a~E^@eB&Y%c7IyS*yqQLO+z`<jx=KNN3$^;zX4CW4ecA$ci zXNQBgu6rL)zP+<wJ<tI{fx1R#__ydN)=X_7!wYwXAG~>j<6;m3eGSy$*~+leHPobH zk_W}h5dOXUInc`6HrcG~%dQ{t)%Qv8oz;2X2t^GiKFLoyw!9H2iV9)ODVcd?dv%Ei z8$v`_=NFCdyI;2@$L6y>NIY7`D_)<8Ql{b^Pbc)86tmf^n?%VnvC`63j#0woDzv4f z7{V{g>^oa4hyKp9j#IMsc_#l9`Z%biPj~!Y@RNA$`^fE||7L=F<<>><+!-}$AT3#_ zbq8STp!%23Q*;6={LB<8Wqd~ub0%*;LMpoF^KJq12G5V&Mbqesk)VJ7I(P61lrJ7X zz4;6{oZZWNkHX{~z8>fVi!q>&nio;}O&+ujnB+_?R{~N}se6&^Uj24Q>%i8;(D>Wb z_oR|>E+SdHE-v{{$}T`5&U`^4Jsd2?qi{{eV+c*YA8t(!`yxdul|?~sGJ&TdV}Y-n zSa9>}mq?k604{UJG@rv3CsV-J>yh>oPWkiTz(_?y18Niv9i933`1l{-6|YxS(Y)qO zOidY|IWx1Yqp#YFq#(oC7Ir;NFA<P5rucw{5JB!D3sWE^u!BsO%Sh3AAy{6`!;3mu zs*#BZo?lOr1e;E5k)Tdd5cE2A_X3@tT~m(DG_QHpGW62v)6&t-QC6lloxz<=AS_{L zd)Mro>U-6HSN`yy3GB|*r%j>Hq)w$jf9?L<cy|s4`P7abLi6A$0Ah%y$xl_tw2gtQ z3x?N@J+G4=Pxal-qpQoOsV3%T&30X$(f)_<m#T8q5}7T1yUTNHR7i8=y9F35FdZ@b zk`{k}B2gOGw*2Bbf$Ujwkj&359UHr5NnN=3cdShityO@lK7YQhTe2kmUwy6~cz3Vt zINf#YwBIv?eR&3ACT)Dfq@Uum4n??$Y_12-wrJh&k-*+`8l<<VL@`;U(t8s(R8VBg zA<VfHZlcg>N!)il%l+1yOvQ@leW)FIG5Sxb>V6ewd&|qiza1qj7RevY<nl`X$2E@_ zb&$2d7X4$YqNk_7TKr**@QVlt-h&K87%SY-B|{OvL41k)VX%;bgh=%9u#0G?l-S-k zZ`;JTwStWOXK>B;2^a6og*V>>!ZfY}1rdzQ1h7*^g0hMjQV_T>e<f@PTdBWy5z~SQ zQ@}mq1-ZCM+4d#>=Y!G3;{!Lm<=#t+c&oGD?&^0x%*wPJ3FZDxkKz4cGoX5!1+x2d zXKk*<^FDH!hBj%Zqg|UN&>}{g3?;}vMu~gZ{JimglK1kGd;L8$GgJtu93sIo8-hKZ zZQ1htpr3TLRzJ?~bD00G-u>)-UdQ~d*lhNydU?hzD`C)QJG|hzCkMiYBdE{M>6)8+ zBJic3?R8>XGQE=l1F3w;>#}<Z<f^A)ln-D16zqGy+W+x55KJWzkW-(Xb@IQ-x6iFo zR6&aLxFv_fMlg8pSUiW{zPtV5eIF=PZ<#{H5BqlRNHO>Mz8%u<@r`@<-c(nZP*_F9 zxZh8N4xBo^_j&m6Z}&LRDOX}ZmFRs)ZMo1~oRUAZgaMIr;QFO{`ZcTH<LY<1X)YWv z1fguifes|^x?BEyvy^p)1DxytkVh#120NCe^AIWYh=(renlST*A$0t&r@dfA8TWr{ z1Hx>tgiB8Gv<La6?Z)s$ZLO_o|2A5pg?zsvQ7Hj7f>#$b+^zpkrHQF&BET^rQG7@= zDjX3^1nJ0-JW+H5yageG8!$E&%58!(9LgQ>-kt#ID3H;P6z`rDKKAzIr=qV<XgdS> zaMsn?Su}Pgjus~_U~Yo<329jOCAsu1c7?|7+^vBmOab!v89eGR*MXl!A|e4LCU-!> zukgq^?I@?{R#o&hl5hK4v6d>x^|C5JwY08rx##jK_*%c$p<<md2F(BV$~E*)IXV@~ zLhRO&EgweYtB>%)yeYgu+e1%h`L|ET)j!uuags*UnVQU%dI1l8tEa!`6t*fVd&|1@ zoIeM@`>wt%egcmm?Q;)%4oBC)7inO^e!+Y9d`oq$<GgRf+Ut7wtwPsT&yp%GkUiCD zcWwNv_4)C#^3t+q)&(O+kI4Al9w{RHd}8*=NXx5pwbjx>`yU2Qmx9LrMajqLkik<> zEU8^Y>Ab}4<8!<ash=c-a*rN4&|egdS-t#9$LE}N<@fj)tR#Osr{mXDDo{k)vWx#Q z@7r8{UeKoO!OXTv8Y9p;*=+JN6qcxR+sYBUgC8dR{HF++_qzNI<77EB*PajBlEGwl zMQueWZiGtk-^(AJE^>eeKEGlD1+3wo-XMVc<o^#^+H*Od$gxfGCISucb6tRgbQKf? z*lc&E_G58N`R22lBLJ>eQfzGO`Q}G**)%ch)!+4c@+UL7xbm8ejEwOD2-l$JS5_@N zG)uxh!2>V1TL}V)Ao|tI5`8qOlf)z3KqQ2DunR}Bva-_R;^L3)!p>d)X|{aduZKqy zl=)=w{LfgLZFcxJ7)(g>;W*F3r#L`a8^4k@bl>r;s57qP<j^wK*61pT2WF7}{l6C= zWajEtGi=t5&nr)gX}jXW=d3Q&DtR903$qTVYf%;_>u>AJi~gBmMgte4u5?+7iIZ2Z z*8&9Cz+KD6*3n}J#c6V%&)YxNdOX-ijh-eoRhg;UO}mS)cz<s>&T6kP8PQeVwSSk_ z*LUr?7=cpbEEK^x^Awegx@&bH@ti_go1HncJ&y`sv^P2MFHavS5W&6n4`uMz;k{n| zGEKsW$!rF!tXq~GyxG~>B!NOo6~CfM&&$ZTBOWH++i<Kw0+AwIyz&4-tO3?&!1Hzc z$ISBPP46Lu*R>b@7su$<@*%Y3U^_KmAQBYV=fBL-jUc?_O-!iJXZ$+AItkZS+B-jE z=yqnK!~lyFm9#@Fs_AZ>9&#N<gZpVTD{1I4B(M&d{~h+5pyq;hDf==A8a@V)fz5rz zJU;BTKj!i9MY9QM{K|nYE=V&(5t#H^VjKWcio<?K4qy|&ip|jX|9Vnph9kkh7?Y<^ zZSKecFnIz9Vjg@X0`1UvK8UmMZK61Q8hl^AQ~)aMaIZtiMfBA375}!&$=SJB#1|l~ zm@HTQI_kWvBhBWpjp}VJl}%?+t8k`CwW3Ny0HI7CCW)V_m@a_W-kvuWAEm#2GckG! z`VsU#1*ZJv`uyX(`KagS*7~B0p<!T25(JJ5B}LbmjfKvhWp;nUekH%N<ZomYMM2R! zN>E&61P)dbK_z7m+ht?=p>XrG^C38k&!8EmS^9Sn=;h-L&n>fqmzVct$2o7;6USq= z5QyX`KiCmGtT*G5Cx?t<VJmqQW2C;*M5a=&Jn-^6<?bD1Yd}HL;uIK?(wK^^mqYPa zhP~MmO+`<}H^z(~k&TPNc<R=zrt_Gf-p<_PbvXU_RqRA8#h=Sg@zv4m&WGnuOI6DB z(@h(zj4`7|ER2!hJ1I61Y7@1EymE4QFI)B1%kRL#xv_lqjvb9g#`zm4YiccwOm=58 zqxnJWd)(1j`q76{kT_$_w9E6W2ShkHkzssWW~y<%KYH+a56*Ww#~^fLMN(v=V<>Z` zv1IqQp7&Lg_wPl6K{P(TNUzkRm$0Ly1+{-*qevpNCQ)>aMZs%V$A_k`L?6SZrxn&3 zLYl*LfG==0VsJXtN5F3B^YWq*IQii;7>VRz2KQiZL%lBeImyY$;u4m@^$*$u`OE-3 zGVXSyO5xQ|rPtH)Z%|xLyQ4w_JRsP+^-io{3kEtmG_iM4ME(%J*CE29a6&(gvs?rt zEHJ)^J67OsPNY`@v|!2J?rywopNHu)?cH~b_Y=-OYLB(*>gr0vurr5fw0lIMGrD18 zfP;?K<X%Wd>IjDEH25}14R=kaN~|)Cdx#TS++Z+rou20A?<k0;X=bh(m5HXZiCuiW z?YYBfPF{sV{jWyUOW7Kk(3lyCyN(=C#jSm*l+BiU{=3&d)w#0_>n2yuA#@PQ%P(`F z(Gxd*r?|_k3>oSaWw$~&34%y_A0LoOkzlgtY;YK7ULy6=DxIk9r`&P7-UZt~?@d>Y zCkl$dQ^ZDFYs}ZYc3mAFgCTe5L!3N~LW*wq7tg%93?9KD>lNhi5b|j|F=7-%Jv51O z_jF^(PI9*Lt{u~9=FC`dEG;sn2gs!HqX!cynhwt!5U03v0|L8Mlnfb423;OjiB{w2 z>NVS21efQ|4~bHI<qAa;CCh0TR;aJ^!9uf-JA2F;yax1@{X-yK(vpNE#KewGQk;vK zz}+YGRH;MVfUzPRv}gYKa<v{&B(7Ow{!8ahU8tSgqh2^Am}y3wNQa>N9m%iH<IboV zFn$l(wUrY>^h*co9!c;K^c#N~B9?}TF_46j$8qx!^&u^3l+7iV=ty+h>n~yT_^gz~ zVE#-jY_pzSa<M@j1T}5O*obQmaBphWR(liO?NreR3w|s{ZD+f?ST-aoti)Gd_MX<& z7i8OY@0c-X$4ALXQD~yUgeDH1hula<D@UR^X|7aBy#*7y4V~x~Vy4?&?l%7+EQ<GG zEmI_X{dVuO&0}j6ww{AcypohM3f$S=MuiR&LDLI5!1$B5YTeSo?U+w0WZ&XI2ExA* z5)=y)8pM<t6Eb3RK$Ugi8;Hbtb{lGZ2L`$EsnZBQgDDgB?_K=2qO$dJlLHf4`ps6C z;NHu};rUpu^gmCEA#haL6qYcY${R+Ti@_&oWDQfQ;~Fl?QwQis)<755T;K-ftp1@; z75@3caS1{mt&$<n`5MhXqwwH=wY0R9*u1XMpu-)U$4LpP_4zOZULXo@=LX?vE`rPZ z8XFS>V!>_T24<Myn3rI?rH`qOrNfJ8BrGX4NhE=9xF73kMW~BmLNIiygWMkl!vovG zZ_zcDcd8jP4XSFWCS<NVq_ltcm7Dj=GO=Y+F|r_wgL9Be=V)I$Ls=6#d9Ar-BRukT znJms-gMPh}Ng|n+mWsCRdL@5$io?oORnt7A$Q&yl;C7eac?7+9^nk5cn)Hf`8V34J z24T^(0{S0&Ta4#^78dApv)!Ip@5mJ6YY7j#k56!$)AjheNOsLs2evrzI3}F<`Frj( z$mAB$kSE$M67=e)rz1b`fV%hZJaV4if?rV%EHvyJxXN95@N4HSq*7HzB#Ir6o*{~Z zK6DOhhKx8W%h=<XH)=1aat>Q?v++b3+62=T%=1P{GPzsSt5xOz2Jg~0U?#-=ERbhJ zF=OGZe3K6;DHGsx37$WXhmDY>Av__Sh>`>_p)l&TTIkxXHrV$be1pLqY=QZVLTexL zoZDn*O~He1Z15b5%vvB@3aH97^=)9%FKJ?SBz6?SUtmbvq!Qj|>`uGKnCj!vu+tkh zZ3|XBYd4OaqRqmT(JLvqSlP=$IoA7EfE#3Yduc%6<=yOML;h;TBj{I5Wwq<qfw|yh z*ClP+>fTKu<QH?v2}a(_2Po5SvRk%Zol;H~B>qY)*;G+4FlV2g>YtZmceg}Q05soC z!+gED@h!I)=<aYe`$KK4t(az<%-`dy!-8$jM#H0Svzh>rd$Pr&$qhCojDBUYu>U;L zD3U(UHiC(PMwJ3nszaO($hC}(IgDe*jACUS%(Q%*_yEDsVQj`8y=vjYhhhl6w$uAn zjO_<G=hJHZrC5)lev)ZPf+;j!WCC_H#tcAmj~EZq5x0C$5Fvq;B02aA(s7m$-U|kJ zuK!e`SlMbim+Ex8g63rL-lKSP6{u6_VFMazj$X-8BsZFUk(DwK?&kqx16fF~D3lM5 zgVCN}R*Z`6qfAK=H3~NrmQq6`nBnyxUT~Z)WIq-x+mcpTuiFE;MD=<~%jFuN;^+gx z#nD@vUx#d_@NOBSw|Tti7tQf-N5PySL*z(uMR7G_qtR7dVE*U+SMKJ^^Z4!Oe$T(8 z_3d4cTY>GGXtS&sh~S(embNh-KEXSHxf!J1T{=*@Qp(*rpGe7}rnWfVdp}mOP2leH zo#2z;ctku@)P2hhmf2Axc*BCNL?0An-vR9D3H}zaGXl<!)+A3lb-e8iJ5?s{u17Y9 zhiDBY(!*$cKiVizA(3q4_*nA}oyhoBFlOC^tZ<}45KDG&IqCZW#T@eWySz-Xs#zTk z_f?5&0FE29TaZbG?d@EWq8K_@A(V{<+XZ<XZ4lZyfD2J53xSJzIE5M-I#QMFu!zpl zt3M3u2v0aVR`G5vPUYA32p^g7Er0=hN~6~vB=mhmwz9S5|4b315ON9L!w7wm^8Kqy zT;f=G${nLY_Z%vM&mmDDz8Qnf8sg>vn68z&CE;8N72pXLm1umhU@D}favX{NAtAEL zc+M79#IIqPw<m)4KjAG_VU5*Pnz|f@FniKCyqEyD_wniZ+iYHA`2Q#=jXsDqIqEcS z<e4wz)AlqQH*&463Z`iMarD1&uD8e8T3;$ZhNj^zH2j=9@a|3XUp{uGX=Ga2?>N-> z{bX2Bi;XdA!-fM6KD+r4LsK)Yz!L&2);oq7VYkt`d$$wbwSMhaFJ7zu!PsNs<}^R} zCLRjzMvgZ5SBwfx=JENNLdUKRPBGA=QCAY@(F$8smgCg|*jk=0E#e9B%?RmRZc(E^ zn_h`F&g|CJfDNb8gCsKN8VNUQm{^hji=1o*L@J2v(prX|99#lK5x1#TR8;3Dfb_j1 zY}^t|CWz_?&X9x3Gm3=e3a`Ht_y#?SEU*^zil@-kT%E@k@W5_zaMkD6;i2w<Q&7$c z4}g6s!%1&0FG=-1kI|nO6$SB?UGi?Ah;uYdMC$}NXhI3@i3VAH^=>_wu*3i^dH~D? zG*N>kBIrdXBCX0*NFdU$72NZ2q_B7<64{{NdlM60o>|GFpqK{?aR(ALS>Lq-m5Lz4 zTZD9r*kpv7E7D6V<g4lCOn2HM^`7@v9TZQ0@E1DB#l`lmy)v761?&0GV7UOgGB$fp z4L)yvHuf|-3dtD*(N}6RS$+LI|GCFH*LQZ;G&Jlv7b6?w0X8&4hc9ABQ=(`TP$ror z>ro_6NuWLIgLyo9zlVXy{<d*;d+xMl6Su_Bab|ZPtL4O$v%oS}qe&(0btA%x!N0hM zKIHx-vB#>RZlXqY)b!U%kHlKcxRFZ06guvZI;%)CdYvwP%7iWWxKp^^*oc{Kj^A+M z82Z3?V1U}O6&P4lJk+gYxn!h`s(fpEN%q?QJb<H{8?*+0#0|eVY4JQXM!er5=(K+Y zI2$tRSZgm*&NBc71!YX}xrQ+^IY^OOa4m2vbnJs_*$=+^!l<2B&PmSO+uLO*4F2=7 zzAp{}64Kc;ncW=75q`%3>Esq&tdnYqHPXccPC)dP`?ftg$d7EeWz>MFAS?`m4d5MC zQ&j~uv^tMQ+EPW506-kEgplD(i0*m=p+F(X8}1|Xe&fuOp9n2!Zu<<*$b6>O`wYG~ z)qzXI;$VExz*)B^2@4$MQaAYDDj8!HzpCVJNGYL0i+rrdfZ9B@RZWJ<boX_=H&Md9 z@bMn$74n0#5#7S{{BM%4CG)k~+G;l`#|AmMUM^_)+<lLqyEn3|&f-!VJw_b%EcyJ! zy}ds`Y?4B!QPe4n3vNG7zqd{sUB`9?(s$Ol+AUXs6qTDi<mI3Cp7cA_fB)7t9`!;L z_(0a@MT3!ihkziNAe*8xVf$^uStUeWMo5{c3o;;8QZ5*P$&j>au{0kP1OlS32sXsj zJYZq4=OjhpNfH(6#c)h7izk?{V9a3^ktLJ;*G$FZJy+Q8BQH*P%^|QNT?c5ES8XVR z#5hkpmwH$i>;wsGPrSZg6!Brpa8q4G<bZ5KbLh+mgn|W5%_%(U`cj#O5#Nnm+*I07 zxKgjjtK}ireMcC;HDE@Knxf>L(%xzYVB(3ja`k5;kS3e!G$)HEB8)}rJ<e+XCPG8o zs9j!NEe6oKg%v0@;+Elo=`}crynYH_;u0Mp!&IcL>cQ419B~Coc*9hPi1wHZ>_;q< zs`{2NGdVmG`UbNfI`%ivf%Y`vL-@P997x<tga%78VYu4H%4@b}T9qlMM?7E;K+R;l za~tTot#0l=(e`%NpR3y0h`kR3=CzjsJ1ZTgAH6$eCmg@ECEW{JdT1MrzOH-IcQ*ES z7Z2u`WB53nM_pz?qi?8lUFTz9DhA<4$QS)3DF*i)n#<c5LHHY}llHKvNL^7>q11xh zJG=i)#%JNt3fL8kC@ZLIXdLz2y^9|`TB_QrSA%n)2x5Nf8G(WZ&$)&qO`MrH28z?q zF7ITVLRH>A3Av2phvi~p<d=u=?@G|1Ie|oBA8FP)g$3S&Rcg_om@_8utEpJbtEFdh zwQ<VWZf_FeyLfe2u%+3l<{(S)fyP$Tvj4`&?vKFHBb5fDpwN)*p8$IRsbQRR<Dfis zfsXtGeNHh+zva;#uCjl<CoV|i25{SBrPFJ>kr94H-<Qo|?y(|;K05@9|CLnq$HV0> zY7n^3pjr@~BaEL{RZ;@-JQGoTfeYgd`6t4_12;aAgu+2SLq;@S*n;E1DbV)YHd6Pd z3sAOA?v;xXQ&Y3Byp6fN%QFlyB<-1}Ii-NDZ^nYlUZUf-aK2nDLoxxw{osx05~k<r z9)8)u*^2D%<;MTk=dXwCf7E6V?*H1w*%SW*Sd%-#xdNW&ZJYZukuCsjzq4#h29>1g za`ic^|8u|g%AKwk(~^1>A~Fcrlvm?#Ks4h>_xIPo{SF%6xHp}C&{Nou*DLRhHTP9E zO2nr(d5k~YP9L?L6W2W-b&aij)fB2D&n|<BQd{RvjeN7jEh>2pn{+anHb<YHk*c68 z%=$z@oge%*L^(@?Wm1}!(1GGSLB7b?y_!+cFv~RHpv#+{726I*zr)1p3RkPxTaGcv z1$O@iBE%c%J7Yq=*u6WNgZRWExBNQptWrT;D<T?P+{LURXCe#;$FCEMSO~f%>fo-F zmC6y1v8a&FK{oQh8#HDmAlzqmd1W5x3WYqr^N0X&Dq*X2y3z0N?_l-y!{ZU)`(fVm zg)cl<yhKak-U}mm&xgoo6v@!3sj1M0*Vr_jLkdkA3Dt1E3beG)k&6NChH4J4A9A=7 z(mu2vW6K(#>C-s{^A>8FU1kHMXZIm<as2qA^jE<KM<X;cwvF!_D!DS$l!aEV3?he~ zgH{~lW(t+6TV7Xe$DdOdLzoIQaVu%rP@y>|&utxFH}&>IgTCd5=c}#ZJl;JR5iUV* zX8McYuanExo$9{rt<F=eS8=V+aTQa?Cq!QmCnQ)*yCyVd*s-HYc5TtcQgJG@P$I?Z z$ZW1g<wIBS_uB66PoF3D)dJRnM<6#n_RlrZD2wF^%-Ql1Bl~mD$boN2CnDvG*n~KE z{b`)>k2pABJfZAHc6klXKzWCr<%?6#a4_hfca^{Yh=+#4NI4>Lq)|tyQK6~P2~&Ix zfHCjg?pf2kkHDsh%^0<0r2H|DS*AKd6G&xVpXsr+%byignR&4Ur!cP;SHw87H1rJ+ zaXjCTD1yZA9V7!cyiN$VBPsDaLqRDIaREI>TB9<$yFIXXKWxN^|MDooDfoeW1867{ zu9qw1tv2f<5iU&cWGaT2=W!Iu1;NC0Bwlmju#b<%i?Jszk6!#V)YQoL^Tdq&@EU-U zi}V7uzH`(+b>w7CV7<Kq9zn3p1f_#ph7V8-@B5rEHs9j#S{>H!Ax52@O<?yitdXzD zBslW7NUa^N_VxaA=tZecJbbNX2{g3yYE!rM(tYO6;NuVMI8Smz?KoHIm~!|JbHB}2 z8GB8=Cg7dNF3S|D4B4$r=guP&_(22tK3gJ8J;}wDh56dVyuG|k>*+mNA0Js~dGkH5 zM;Jc829619c-sAj#%l9zw^w?tXLqhar|CiQb9L(m3JVifFJ(hS3=3;BS5IY)nB#Bj zDP3{0+A`ov<lKyk+RN>kx~~^0cFQ+;r=c;FM@GbFJe}*=)B&N<0^?0g-xH!azz{lk zL%Q$MLCyE;-iv++7oI1{P~l&X6rSL12XD^xYXK|ROTI`sr$cBcxMXKwfYKOAu9O2D zW}MSf!O)OIQIe2g_WZfa<a?G=uHMk_8kywH)++w(E69LOWZY84(YVnHNf<>Tp;ws* ze*vjjA%dmyo^W_#3%i)efsYu<S%);HjOUziNn1HTBx<40NEA9KWA`mco9BaBp~co4 z99A|_>moR30?U8(0%Chyw?#uzm}f>6AGe3Bg({UHQP)azGe*c!X$X*dXdwysr6N(} zfeemi0k>`z{-8ax#8srEZ1Q2JIvQ~}xHJZ;)YW1|$i3zM5!P1DlqB<HzqIWNE@@)C z{s=q&{mQZyf@)MK7W!oheiW*DaU6Z3SJHLb+R=Km(^qgWiKxqrtVLG1)N{RR+0w(l z{A*@1>Yggk?TFX?X2q|;s^u=zTz~H8UwWTm@7>i6`Sr(pTM#1OqwOl9-{a!<*!QE@ zY@fbwkN@^NJm5aeBH8BWuPATBbbWbrVrYXbl1)@Dm%~_(m8#@wjF{(_ubqkKz%NLm z`yBwTcU0}ZRn>DFbnfY?KIQo9FD7Y}!JqycL?Il$`d?GZR-)uz7LhiAg6@9f$8qg^ zz^^Hu)gyzO4-c;AFVF%p2HbJakRmoDc?n?ens7E?lO}8n*61Q}FTE>;A*+~hCHW7m zk$Tl?XG?NOeWh|B_yI2nULYLF{nvr)k_(uCqZa@;dPE*~;I3z4)QP>o@t__7*?49) zjv2pewb&c%wt4(cXL3cV8yHbiPgxo=nBhnxuJ;29sl7&pE26s=9QZuu7vsZ?M+7eN zAwO%Dt;AzvW5;bcqD4fv?!$iid%!30F=zmM&4C>7Dk0i+U@Qq!9?SF_a&43&eWw!& zcUk9SL>q&)0WvcGoYVLztXK-0{2it|wQ4$=2AtCXZH}n=85Dpi$Wo#@Dv>EI(acNX z-UhZC%Txd43`O@qfR@YRD*Wml(TDwh9E%_KyZySMA@JGLJ9yT%kJDj&v3iNYUc`Sg zw&H(#YsC^@>|Q)KYrWYD-O>LRzR#Z(AbdTxC%Af_SM=|Fp%nZ$UeW)4ci+tOzthjF ztFzN&!lTUH;o983-1~s+>0U$?Q{pGsD2r7)UOz=_*mP%?-2E(=SY9|!rA~!eHBJ8; zN8fH{mq$Nal`<7yPn6$&jvXtpF2x3sxSXRSp*lh4(kCUTMWQXlo|-3+K6?y3;5(pM zi@^XW%QuRhV;3u4Mq<gN3sgkTmTThUT^J#9R4+(irJAiFrHq>}XS1T1U&mFuvUC)K z#MjH4O?0;Yg98uWqOLHibiSWe#1F%P0GFXpqyoE8N!BGPa)8EFH==bA1BALyz$Y+j zOezEIw$_98FrTX7khSZ1nhSguzq7SP*No1q4;+kgKM6RIL{WA~XGUk8RA-CPBf#h4 z$1K33v`2ZO2s|Eh#5RviL*hJW8$rEiFeK<!bi|IGfh3`+RIc<QjV$v8AR!$gWzznh zi5zUkGO?3+_Tcf}>UZy-1Nh!upN$?OmC6$+tmP|Nw(7|g+59Vtkd@N{1g<X6UaP)M zvyEQH+H84yk%K`Xr=Ty}ww*saU1L6PVV9%39$!U{{|*0P;RG6d*WSBtX4~$4U$F-t z*FBpJ4&Qu67e}LFmeP)DfEY@$P14i5kIQPI-Ey6-H`}GaMuASFQ;W|{?^l@vnNbv_ z#;<(Rik$|_-%bzDzFRZf^cMckyccH|;-J9{pB)f|@Hs?lnrWhm7CAT9&Tr{{4L#lu zb#@eZ(sPHSD_!-O-l>Ita=N`*wPl7oJbHU;9(*%~=;KUmBb6y|skDY|rz8%xBSzA7 zf5y-s!Hpb>NWh<cZi@&tbquCiaNts8O6640hQdXdIgk}athO3{Cvj!>zhJOjEQ=ks zqlo5d4vikvRJKfwAoB1jRR~fxWWa}ME>=A{VZ*ysS_C6N7J&_n2I9FQohhZLNlSSG zexH=FE)PcxOu&GQ?v+P(sEVG;kFq2Y87>wU6N7H&($|W%J@KdS#^NcWft&~|8<PPG zcHuero={3~g#sf6rGPtM|ILC`OAsYK0B^kZASuA;xr~qT6w1t?plE{dogSY#cVlz> zne>19r}ams@^i3Nn=%-%VA;2|oO0BePt)Mn2rjPGkwozKuu-cs5R#GxSn-SCXU*w4 zd3G_quAaQ1VdGEW$93X#zIRJcMS~FS46TM*Az=Hfm(!ux6}mISbl-6qu1w$49O$y( z#{{C4|4X+1(&rUp{PO4B{Lk;#LqZ>Y=P_H(Vpwyzcyvs333M6o2>J{ugX=j&xHp;a z?}PA9RmNJ0+3qHsughuIvt0E2q842DB3*g>idt(Vc%CmRthmB&V#bYz(w>`oM!yS} z_Mw=a0>bwhPQqsS+yxCcKJ-o2L@Ba2vMCiO?rF;<C2a*5M?(67jG{5jBQ2hsMu!wr z6SzZwh<jM8K9v|M&X5khilJvuB|(w?0_SC{=g$O#4@owocgruHlD;NC;+9P0bH`2Y z``xds>oY@UmaNR~>(m1X_rcr$@Zx0{gvgVpG`SO5!S<T@4*drFHutf_i4$>!7;q4K zY>}My=R?L=_}mJY5RM%fYY+AYg10_y`UpK<w%zBSuL@3Q1&0&<%5@wAK{+Fx8;QGn z=+&GcydB*F>ip&=Pi|kvKtC0r93dIsnF0m){=p8S8ggnf3Q!X>Z|q%a$3cqO3*9`h zq-YileWDO(+deV0J4Fe@E(bKh%<^sne+z~4ZY^V`P@}mNwGPUiXu_q45c5`>5O`D~ zKEZ+QYCS8zd{}1}i(XR&-+0clKb$!IXA8-kreM!w4Vm>=+Y+I=C5%1A%+xDa1+alF zrR3!A@64{F)UnAm={kJ0{@>lz5B7b>6q^U$*DO1IuXe`=U42m$3KkCg9bj;V`8pC3 z>@rDG6sRFX$C4k2&&Ba=%>^%lTTyzx*6;+?^GR*$jrKi#4EIM5v~6EsrSb2LdbH}5 zDUsC4xW>u2l;_hFi_rE6gFe_W;Y5(Rdm0L5>PChUKVt1-1)V)&&yiwAp8-Q-gcpcL zjWbDJ!2)Uqv*m#KF0mqA?V4M5k3B|;EGcCOJ%$n`l1uF_nX796L|0kc@|Zdb3J%^g zVkM5?H%TTKFVolDVw^%T#U%|ab!=3Sn^orh&+x5VgCbz&gqK*m<rff@0YHAN5>5WG zfn?T4<;x*scA4X1_ky3t95m+Zot|u+CX>iHKX|_LQ{xYIrkDX$umc|5g6NJjBYl@U z52VAnDIL7M&~Qf*0?OOGV9c-E*^>IQhG3njaABC2BrbfU%4kBTi2-MX{VURA(9vVK z^V}V!Vfj2Idl2SKzy8YpMtfxo;s5sn@Lk|LP-Gz>IL>2PGg+WdG%f>n7g1BrwBEYK zuja4ymT$lOwa$moMtoapmc#BcnlYWQ#?(uW2XB*y_?6cSltI|wAR$p4*sy+Ik#s;Z zlF_Mk2!Q4=_1!)S%dxAzmEYH0*EtT$=;{0E$>I%2ZkaBB0h<q()qFc((6uZ}QXHv} z;0ojHFgKd2acg&7kZLvB5PLd&aDOhmH_<+{-ieGz^edI_0W2ro0m?VP;CK7x(+Id_ z{gp4`pakMxynG$w$7GxE#)Ja7s-<avQxhMY)of^UTStf)<Mrw%+3CxTk_OSy(3#Y# zN8_!KCaPg|D-EN8@$4f?tdmUvR)c;>A6P*70KUu2%qSz$$|P0ga7r<bHu%@uH-TPU zw-jX>Q?bBlsk0>)yn2Sr7+FVD=os1zSmA=~1T=0cV#fukKkw_nM|o`rcLD^ndx->7 z2&c+->*o0*yS^{mP$69}FE8czPJTcKcyL*AdM-j}7bHd&-4eyfPLsqY_#$eo$4&8I z&6=Q$?@%E47*rK8@ZA0S7Q?at!KQttpDSqc3aJN}{wJ;jyFnhSu9oS2Obt^*LewSj zvb?95cg@cNsGDjMBs;HyZkAJ+%ly5uW9IuL?sl`<4T9tPj1?s%r|0otJ+Xe*-JTg^ zO{wuUCBRd(Qf==|k~W0#(v^n_XmpWnKa;%{X1n=J=6+_=p7Of)fx=}LA9ikfbw=d3 zTwB52vX%++92Hj7J?}H3GJ-qU3HBOX34m<&d5cPI6cqe6xk=*Oz1VDW?Q%D8pu&zd zYpRV89pTcw4p=+}QJysz%9*oLOKRkg3K`rtvCk(Zh^9<M6Mtx7Uv}!I!2i{Zyuug( zHgt&rU6f<WT|t_LN}_PE6!1`)z*-VhxMo15fWY;M97Xaf=k^ynXwDkFAw5Bl3IS=C zY^@3@5`12poyzn@3cx^v0k8@z7v42O+AmxJ!h<^snd358TW%#Qrx52#-9EpbkJR6K zk@ebb2rVrG`{o2pG{ejr5r&sUO#sLr9^Q{Qiyl5UlCYFGc-RMZ7KxzuIAnNtK8n(8 z5L85sbTEVWY$qcXLqSxsmxUXw!j8mZ3rBv;ve0%GbtmR)iyiS+lWd~d+flo^%()l( z6Bhl?td(fjOUJg?Db#{(=H<ET&0Sz?wexxLS&C(Xyo$E^Ga6&2ZAtBSri+%Xx>z-r zAb2qG5h55hU6gbd#UVL3MQ8VLP}P*Jn6Er^7GEL4bk=-CUH63++s_5J#lSDt`DVxW z_8j8jXGv+kaQMB|Lp+7_=iHaHM8(f5!aV)Y6ZhJ_cmH@h|Id2=-S3Me&KKKv8(DpK zcSWT4I`gdbMgc`0ytsndQ`8gMU<GLz5MLKSr(a_0OrR3U#N_RJDwei>`MedIBuzUg z3wH2dkJ`p#&BPc(jW)(XZ=XUFvaE3r0`eJxBNm)vZTQK1BYw0~%1*DIt%9L3N#l;h zD1<T<%Rs#{^|=JU<Qa!9iN}JWlVj!8`jC*}J5uP!KTzF3-bz(XA1Hh)1u2yHZmhy+ zgJ95hyCQT8^Sn3RsG%3v4C%7tT>`)QFMaqR0?rD<n4H$m!+{NtZwZE<O>ejEx>qKE zBp9Gfp?+hEcVay=oTTMPxPN*8)$>NUe0uNkmB6|vUCsI9@DVpSNQ3AaH3Jtzf$?}S z!BIW1V=h{o1a>%6WKYUQH!;i=wren<8NRR~zHaqWNh^o6HIE0?n4unxmJ{av5dyBG z=gr=xUEv&q%poq7sJ-s+nIT^aWi3m`hVwcRQ!(s?f}#aT!`)L?6x?Z~)Jak}k2IO; zwMbr#*|An?8TLZ1zuW+f40`8dk%Y_oze<aZC0MM`oG2DH>_O)pgI}iNihjM*rAp(; zetr7$^XsN-pX=(2*0MWG0&h!;!}$b1)@SRd`ZyYmR<5&k+umLqygU%^kPzE;@suIb z2c9@ELya1H;iQRFYfw4!1r#k>rfJq_QV~LDotuY<SN6CthsVh()hUh4t}Q%tbLc~> zG8#j47_1m)o*_CjMD1-k*9Lrek;TedD&z{NO4IzaMspl-^hyKVV-N7Y6{{1WBJ(cU z2QflOWXif}<*c}=Mpz2(=#Z#g7Ki<21kJBY`)_$kc&LCmG>&X;R=~h%D}2m}Pj9IB z;nsMlaM$ayb{v+m8%ev@=Z*TeJESl?{g#kHd<fOw{R{`Ln4kfo!BOISuO7*;u|wqd z7D<vsWz6$)!%L<mtEa@Ot97ubzXO+ttDy(f=h4*vAOg6;bzGziWOEP-xDbzWMagxc z>;)k#YSnY<V^6hRQ&fP33D(JxVhUDfi0#~?X)$8SBT>32)V1wYGU19<sQi}Bc$Rn{ zPyPMoHaX9j&s;Wc+xp%Loc2FG$)A02Q?ES1PKE$~8wpaSlx$P!p!jOECgUhNVL%Cd zA=o@ZY9C}SLF+EI>e<uA8u=eaC%&g6{hFVbqr;K-@00Yj@LoSc-j^y`kmX;g!eNH( z1H|E8Q!7_1=K22fw>>}K%-&<VF9?2L*}GStU&j8|9v|B;AMRH>xHwK+`>PKg1m=dK z=-DfdT=rTm?-?&7ju-u&h?0jD)vM>byVt|fBm>6C1eLY5iTkeL!}9O({SvIu))lja z$)2G59t@Hlr&6>xe?ahiCq`G%&yj^43H(LoSJrV6!$dk%it;P!X<OCMw1>y1T?|Cf zIPVOU1D_x_e9Yt;lM)hMeVVKdrDAw|U@SZkQnz<SD-RsKm8-zBHFT4Q$FNpwG!H$` zOVbag(&$CKp92oRqLHg}AwhtbmX|{XzF&=-O(swtKObgE>0Xi5qQd7qk@gHU0*D|7 z;D5sN0|6cW`^*;B5F-}`0g(6*d=xMquLORp7C@t{9&P>63|@<@EoxH`2RHrskpB!y z7<K-SrgPw~tL@fs)Yxu}HnwdyY}nYgZQE(AHnwfsX>4c5=2`C<<NFEOYdkB@n)AA^ zTf_$}S+l0@tSv2m1krt<*9%;)S3eLzx8r!{WxrD5@8#|ZmSv3Q-x1djkHmwS_<4+# z+UCK_n_%FdjAPR9stNESwe}rT=Kju&c!!A+Vr2eW1$n`#ZvAL$g*Qi?T(%#LP!v|B z;~vvlRtEup8lX&7?g!J6rCsvI5Qb@lx`UWwNbN3ol9^7IhVCK<vpV}g=p|AM6$TGF z964}eP*uPcoD%RkP2Q!g{;ljdF2{+v-u+}%Was@Z@C<6+#B6`7`>}3xHjH?<W=-_g z&egnDxZ30scCq-~Zm!$!obdw4Dd}B2Z(M%19GsZtY(0L|VZ9@VVL0k1d1i;IQzg&6 zvBO^xOnY?*cXh7exV03@&~;$|(>`rsUxAS7kisfvja-9`V44e!C-f)X!Ygn(cRhtW zOQ;>bx3<7D#5Sy+A{1|wo==~Ea7CTX1GpPoJJ{BB;Sa@2)aBL9@umhB$~7L(l^`4b z(Rcdn>y1~<Lf*#)F;~vUA!LH{NX}*=8IESx?^k=w-hv^VHXHa{|2FY&pZXH*r~PIA z8jk&dPhkm-7{s8fuWnsCdT{UGedbE)xmVSWucod$Gw3HtlEUFXE+B-mLOmam;SmKE zU-7nC^_U$sfm&}E$utCyXfhsikW{MT%3zGU&;MnB?pLj<zXS3G(R_OX_nLXpO@mn& zG$e?%9s9h^P2Gjn)kuK3j80|HiOlhRvA6?3dw9rTp74jMsVQ<p?Yq<{2*LsGjvU-M z<Z4FbTH@BHdi(Y3(CJ(%AS77h%G|&|&e7=q`!@EIBivZ(Q*=PbM5E=;tDK<<Hys}7 zrS`<<kGS5@v!u$(ktjW8FOgCahH1~-RSmj;7ntmw$u+H@1as}bDkJ|aFvcgJJtQil zrTutYVSGP3`VaOtU+u$=-Ww<D?7vx*m6Svp)LPl#axNLO;Ry>DfBvI}Jd)2>QKV^% zEU<_)#MR6({)NuLH&-k<@&iPClV8b;awSJd`c)h~|0Sbte}Ov2!?H1hBU8@U<5#KS z+yI=1x}JylqWVQk<IawqAltK_@0}C?;9kA=4Z3X&YCB$6*gH5FfVp~SGo(ETIYs$^ zUXYrObf3~rtNlI&4f}@_us(#q9HsL)c~cYky!l^Zq_S9^f(8qghh6WVpEa@;X_Lpq zOgvgA%-LYA#_fBokV8JMJbKbddV_|B)R85X{?uG^ylJ5J>>eU}#|&e5a}gYf<}=~I zhH@RtZaaDuA{X<r?c0BOeF=le4)g2;dYG%4rY`bht8#h|m!^Or&?*dvtp#YU0VMQ! z2$J*3wOw2O+zI7>A72I$X*ZcJ&)m3pL8t9pZt1rA98Vr-5!%tMooYvRchx(F?RBEK zA$2|OOy&QjZQ|DTF{{7*`!~0R!+P_Qe}Nab|Lh=LJ)1l9XX!Ttgc}o@?->1$0<+FF zjJpreBK9#^7I{3{U6VAlBlG?-a5*V=oZsP{nG;dr2YO!;-$#Fn?DF}?W3SiakS#VL z^o8MFwP41TUzdnWs!#3LG9k%lut@`^DLTuc=&$Cx0}&-<WiqJcB)^5Jg4_k2k5Mfx zEQIBYm0_b`6u8}I!$L!$lu#t7gCo+Clk>`}+Te8@2C@1cNqh&FOoqMqdoQs&#QuQ= z*gL~wOq&WEoj?f`rqHSvND_GroVd0d2;=F((!z#qU%T<?4)=qHUep``YYd34;+}rE zS-j?*>+i`K7(IQ&U9?|@l%E2$C@$Xz{kB--if0w$&-u=ul_4(t(l~=R^`50)b3a-s zmgWw~5pIz-w?3~{;gl)W=3O(nkL+#&gw-9_s)9y|1)C~P^wYGeRZ4aNT<GICyLszp zjCi$-y<Hqcjnc`r`z-Ot-BT*i3(xrc#iK0ta>L7EF<Y;z4h&uj$?oqW@3y#>>$xOj z$Bls7wjx>4oaQR_*1PHo`)#+1rium$<UPmv-#9VeorGXtE9N%^Oj`c9Wqdm;t0UL* zRnS(GjpV+*75;&Jn|TKX)zxc2Un;5rTIbHG=cRg8H_7GPuOvBYJDVkj^jjit`4)D3 zSFw+$iMH59e68}+;RTm<x69@IE$^$3$UCFK$vZ**kLFYyJx`!{xJLE0$EF^-tKR)$ z!LS{zDuJ95x<F_b4qMoY?`abRXCEXg&jHO2UBgA>=uRfzEVzp#c6A@G57}$p2a5R? zy50-ib@vnLhKKj)b`U7s`B24gSiA|9o(v*QJQDZ5yox^gl$zugU#UL{B7R(bC$lEl z9=3QxK@xGg(P)32I>Wnf)^YolBT+cz>pS^NmM>xdJ%Fn1p=!%!)oaFrmUd>y_g?Sz z#Hy;Jga_xMRV-0lf&X*LZ0qIVh9?<)tAAb>2;noqNTRt1Y`1prT(c0tJgWrf1NUeL z7Mjq|fs>sYbx4_SqAjm7e4GExcd_DvbWgwn2J2miV+j)u#?$KUI<BE#9=ktdbiF|A z4VH^E4W^TLR8(Of_tk!In+{jMMWy&u0=62ha855Suy2ON6}ZD6-(MdKk?=Y47R%KU za$K**`r*Ahb_t|Fr}cqXFmb#czHMfo*1~srMtg9<ZZBaZp)En~GJXIWm+4=Nkm>Z7 zD&;lJ!Z(iEIJvoEL<;|ohbMEF!2j#$CCYVn=cc`x9vCy*DAo#F3CR|j^2h-<F&Wb4 zX%~2y+w&?RKmWV#cWK4z@~Yn$UG5L!re3~XrVRtFQe^2uweJ6IJo*fyl7+wWWMJM* ziR)k7J&BmVUSKbrg@0$G@o?;Azco&xRN%~rmZ0i$o8S%!)6app<PnfCnQs0%HZEg> zv^RvU$Ks`SGRdi{ceVW<6{FXEsoP-x(II3bmjc-hUa}<XNKmcW+={^u&~UNcf{#;G za$1i(VOh2oNz6aCU4nQQSdR&vpP+iRG&FkBQc`;kN0`HpYI}03S<)v1uYlM2&oIxI zT~T>KOUnz`%B_~k=S>)5x9+D^7$9<TG?(4|xn`y1cblf(^l>`<!}aYZ;=s%Ib^o+8 z?tLqx$SlqJ)a(8|yQ^9KBC2BDp6O$yis(bXIO@U;3Jcjy<KTXn?fP5!&k^bnX~yCh z9&VE*TB&lSUaW&N!|$#>Ei*+iJ<B(SMm1#%yOj*}?zA$pn}+QI`qT5!*ADqNWXfQl zTe)UxuhBf>B|SytF`hO<XLsH(0vMtBuu)3Vee2x&v5G-}^rr0Y2%?6&SdBLCm~sLs z{RU$vD{|10)Dd;AB2UV8YWf`=y)|@SSWuGdoS$}h51p?{v=sY?+FkCtnSq&B;p`Q5 zR0tIfjfjbfN#HV`7+3g3SC_!`K^N-rtB$&Q7&g6TFdja>l847LTJ_jyMY|ypC#F_V zu3-8ymvYO7ZG+(;yz}S#<0Ej%9BIYdY{%x1(RP1Bi%Yw*mmzYFm<8KnRjegE^uNqg zVMD@|l<d&PB|_l0vj{NVHrr~8>;{F>o}mclu;&TR01N3+${fAsqrc5f8Ru%M<{y9A z*B^;rZl3t+u}f83wO|SGWZHq0jaNB`8}K|*-tuT^#-|zW`R|*%RoK{~mk)o@7rq?k zGp*%c*aD38=X`AO$FsJQO=~SE0fwQv9rVI2sk#!@u^q?Bc?~>ZT5EMbHqBqUxF65e zAC?s*B}Fk3{nBSdHDC0T8qO5mwt*A&O8k7Spu>=cUq#94JDR60@#RJ~awd@bexYL= zPYy@EbdeTICek#t_2IkxZ+#|$*JmTf=FS^mj15lA21bAq&w0J<Y`2^nfbQjmJNiPl z;jY1T#SXD~*}SF0@icv;YhSI^P3mXZ+4&h-KAbtEf-{cX;41k*eEtKu_3b?0SMcmX z;!CwF*=WKwlw_|uAK^f4Ph@F|$hTno+L9DDvzamOB;g42$ZuD-P}oKQ^*M=qM<Y?K zI<~EdCrFVtiwSFuP7Imj7800``6L{o&7chfkka=s{ZBS^1Y(Zn>@pMtu@oDdLJf8! z_&JJtRoPrsV;VZT{)1FLjyPxB@a`q~WS@SYyXo1NRTfH~kj(df8?56lmmnwna}Vfb z5Yl4OPGhscy2mBT*36!=<<PQP5!oM6s+2Hf?&BGUV=O+kopDZOFAjhaMFW<g+<iMC z*nEv7W8+sX@NpJYi<WS%OoQ5a-?00D)eG6c8%M1@e()3_BkB@zXE#0`-VFP)HhFNn zXbBJ3@9hj8B}ohd#wN)i`^SF%!D;xszV~s)?g{><?Vt-l7lE*JRl~1QLNf8*?9LYy zriFftUI?B8Vf{2N#@7|_a|dMT`-~P4E3Wp5q`oMQz2#bKdw3VYq;8Bwch&N!W_!c` zTphDv#p$9!xp>rip|McX`94%G!*0nvwn*SSvK+ExZ`aY>^xC@I+_G%PZA?u=hudL0 zOZE^J=WUk-jM9Y;&hK)^DKuuUCh1{}x_$2A+Vx%@%LkK&aXq`-KH2X%>3;jDTs~d+ za%wi+Bn?b|-U!bb&%H9FyW}6KcYheAs1?Jwy;6U@VshKNCs|otVs>Bdd~~~5Su^f; z%4jPa*j6hypF4^p^P?JFQau#E=(MnWu0R;FiiEe0+}U|VA4b76cH-*X@#=bfEShW& zlfC{{;P)Pt3vKs&gXHr3%&{XHqI)lj43mXp-iu>*d5rkJH9yVa*W}WUT)mQ_0SSZU zNRy{Dw_~0awCjMm)VUpSpbDQc&RVXR^GnV!Uv7@AKNFG1xcMva*)Bg4EcK1+jY~Qs z25-)AE?)n~z@9YS@vooNss`7SLVsem!4EtjtR?8?zQR)UZaEPM!)~Ed(*~n*pmSl5 z;ldC7y<!uH4q5^m6=TW&Nqu0MA_KiaPE!3`g0jyCeZl`Uuzj}oslEC!kw|}Cq~<nD zk3iw-{d&Ref-$T%i;2VzK20~S?lbo``RNnH%ZA!eLzioT1Re(EzMPLe#*!=p^1}Gk z(T9<ik|Lm-EAxy6iz0*eEO^|lCH(vH$F8rC80B9prkkNTEOl7TeQ&QY=_A2vE@2!O z4*wbxNiLeNEg(M-ndO4@2wM&&Xid7_4yRuoIK9kWo}*v(NBzvnAtLHFyQ+!EKi@q< z`owW+{IkInF}p8y`3rc-_Uv$yM}6_UO8jbs8RDw7^qMW~?oNVhlBwCI;{&Pt)ERMO zNUN^=s|046TkgO%+2|Yk-YfLRx|dZ(wij}n2^)RXR1Q0B)A1_sDH9|tu)3=a<s0|& z@3$+nl%6fxL}_f1iIAfn`>^SjPAmVdCZqO#P@EH9<t(r1`8VCdS@dF>De&Lz2aep8 zvnAK#%)r=IqcQP;p{*{b^Reh;0r)Y+DB@_50m}YHicOd@kuG?zxI20Ps9>b@D5e|` z;eq|&6F&AdMoc;<#)W14)K>*K3a`%RQ9r)Uvq!(T@u~kVa~poIuk(|PA7?26K5{Tr z9j5)BkaNG4sefz8wQ{d3W?tG6sGoQ3_Q4;ysK;Dyc9|RQH(60CH~XAGOcE~Zn0MZ` zeSL1$=B<2MrNyUZ$mTA6n~TDuWysvn;CSte_^wP5OO2<cuBxb~WkIa2XM?Y&XH!{4 z$DWdkc^ZiTI$fwK)fXK~HA_ACB^OOUO%_&-U7x^_d54J@wIX!1bF{<FXRP){;63OR zi>^Cv$vmn`^9A-%xl4EY`}Sr~927@8yp2T6U`YUel)aZ|@H{B0mLL=3A!s&lHny@! z5m7GEBKf3em7IrKpB@4Y#fDLSoPdVZp^9XK=?FEf^BC-0*L8a~5@sJ@N<ITSoP{w_ zBr&%XK?HpN46iw;5YtM-@q<MJdw@WB>lq-A3TzSh8h{-B#l9yKrP`@U%uNWbb81Td zDpGXOn)#2$8|wBaNtOgVpPC57Uyi`MPi}W@)=7|bV<5aPQ>%o*baNkjx@y5JSDY$& zyOW<@&kmgOzki6!YMAi{|ER*q%vvqu`uX+{ppxY1!whrJj}LtUes@$f4ESvngbX1R z$<Y_;i|`@&^UR+#u#^wVva(Q&Vnp*{Mi?p~JFzo1s6~nGl^p29ba#_aP$qiQb=UL> zy1p4hri<e=X>hUOA_khJ)TF0epB>3BZ9b-iunT%TElGF3?;t66KO7*O{fM-t`GS3W zBFLDKzH|09IWE8%@GB8mfE+!tbAFR07@O2;toxO;Q?^|c#_{|4+?0+K`aQ9}4iA6Q zc<l_PHCA^#guVr-mX~Jpy4BaZ6O6U=4|$PI|GCljQzg7U%JnmO!{~lFz3cusjYY_L zn%qSodfoCWe!uf_lWjYS{j#{M<K)nrwW54q&zSWmo2^SiNy(B@P6EkbrW6%Bun#xK zS7dKox>P^5)lB(8_)zU{IuWFVr?#Q-1V#3k<x=k#3}h(sj`@Qq$5zEL!T_P=(;_)4 zR;vBze~lFHJ^?~Fgy<wQy-CPc^A_on0HKdn*HrRjAF8G=FhBq+E>npH$A^GO(f+Vy zik+?qItW}<MJ4ZKz8GO~6^Bm4|8OFmT*Z1i_*fbyq05Jt>rw%!)}8>dmdBgH>7VZ> zS(;$D8>)C>BUysWl@9_mn)_fr7lF3bu)iHBT%K0pv{ngu(6>(R8=mNU(B}S!s{$Xo z5jEZUzZ*kfz`wkI$Bx3iQAx;up}w{94}>CyY1uf|4KNr*bp`A0Jjyou7mFqAQiZdy z^wHh{RCmL%l19?`SUCGdM5iwKMX48mIK@U9G-HemMT0t8N@m!sogR`S#0mhpIL54b za&JMR;s~|DEm#iZj+(9^Ib}@sw_@3nq6$+;ZoK8W)^PVol4&l~$ow2|6i>VRDxa;- z`^4-nA*dyD4BgAqT<=p0kddEfUwgBKU$jZmbw=6PNTAi>i|^gY<3GQ*`{}y096!y6 z5kG!edD|>l(tfmhrIeELiDk@#%#s^J1R824@@#0wQRSmAQwnV}sUtS$&m0~~0a%9t z$NuC(4GoX2iP9XDs|1FxinCn#YUL^;q=u}@Pl(p5z5bjCIHdn_wr!?WROCfO454Cw zG)V7rpz;L6xKC1SGo$=nrR!amNM7wEkjCv};6urAq<R7T`k@qZ8Nm!)Pllw`Z$I>2 z=9G+17fMG=>k0RyVX8S*+`_s}a(!P)744Dvm?)!gFBsHZ6&~-7fKJ`(*We|x+-A={ zZm^x?6Fy)UMq}?I%*^~RZ`?h56qiNCd>$P>J(>t9h#wQ468Ro^Xk)X4pqo!g)sh6k z+A~G7a^iz=99<FjLQ%o*Jjtf=f<4!@&ast@+jsrnRn|B|?LM%&|FzIL9P;$qgNh=V zH0n<F6;cUN=->gMy?ynZ(l~Rr(Tyyvg7$_N%jr#7gX2s=F?~hmh|}$(#)&<4LH;c? zBa)$4p0Gcbwr?%i%%x$?QpeM+KTe$@cYH?pbp_WJ)`@i64XiHlFRN@k9uBbDKd*Pg zGIM<ojO^6o$`OgnhpilXENkyn)l{JH@P<N6C$rErx%_l@o3!i-x*d;fiWqg;^PX<T z87jN(c7HXdO>~v~X)BX~B@ZpImH8sNCtRWmZ!p95T`a!86|Gw)i@!vLW;HLRmwP`b zfs3CB6D%MTBQ##Eu;8>T3QH5~%O!OZ%ohqehh^j{C5^c4@;{v4zR81~gmRDfA~4E& zD|UWeUn3d2?AsIIGu>4R{;BIy8`&O?nhLc`AhKMkMq5@|DvYD+PO8~rPud39S7$-Z zTMXV`43LTL&Z^pxb$p)>%-35SL`HbSe`?$fh7gPKG-$82IFP>pg7$>|9j@<}oWZ|D zuG!r;ls&TN!M&k%tKFF1ulsw<kPv8Fb_Ya!(9u_*IgayizwPHm4ep2qzv>jHN?MK4 z%VbbU4$_~aK<$CD-)A-W@>566*&Jj8c%}^%$A7Qi*N9Xf!3<2`|BnUWe_ac*60nd% z=ITG(O{_b1iNeOCh$c2;J-(O3GQ+nK8tL`Mi5r%_(jGRHKIZ)zBCvFo)sMC9X8Rco zI*%ISMh-dDcCGCwYLfvB`gJrt+l^F_m>l>!KK@K7p+<_eyzhz;Y}<SePZ@!MK|A)} zcCMfMiQc9If^<HxteV1dJw0@uYKxa^;`ndT-T~oci;mnzO}<)a*n~9;lJAig%FoZI zv)uBWm$h8RCs4JYz`JDJ+wwwtx2IWuN}8UUn(D9o`7;-hmvmtKwtc32r6OTO_Z5B^ z{mJbp*guKO#XOP>lSP-xF;}Xlff7|(NK@=Tl04<7d@|NAxa^Ej)JNG)2LPxdZPE;4 zatlXIn0x#0X-m^(4eE=+cbKwXX+#g(UA2J6trjBVftO_Hs;Nm#<?v^=+)nY%_M-^W zMQho%e$jEB6)&l)LkDQT{4$;fAxI_PgB10GYQOh0^VJ3mDn>>HM34adh-lcyDaiuh z^N{C`(?0L^EvshDKtx1@g*3U+B!U*{)n`t+;Eb4sh$co&)`#sa+F)KTm@JD>C}HGK z#^k4g*Z^HWyK=a|^sbdDQIo~&(cVdP%1dYKONPyhmzC%Q>)g+FT?A#@%H%6TRkax+ zhYZGV=+9sjvv%k}agbYN6dAMpA~@q?z*c}S<3f!t$k`OI9T(7}$}raWp=+=W9HP<b z>E;vG$^K#p=SP1<uMP?S03-}X_nD9x>xgNXIaE&={<o#<$?LSOH~Z~wzw5r<RyV%3 zPyEl@%h<=Ib3*vgy|?6R@w!*rbYVFny$0mJ@U0Tpjmw-aGKH5*nYIm!i)!Vy8j?%{ z^0X(%&YCG3wnkTt=*W`XyNcBaZH=||azC=(&Dr5q)Ql5=EH7!e;mPTJ!G$jhaisBF zzZrC=JTmC1r)d;QJ6!+P|B>(VYUH=)cT&=X^!0|UZxT>Zj_@e>L`YBFX?wL`aaM|D zmFNvBkanIFc{KKas;Xi;-)_buGHu%;z?gmaVmRS<&NWI9c0hpleZ;o8AGuSX!2cS? zkf?7J(A&@c7Zuz*iqA#Pahnat>O2V$61w_Rt<#PT*s$bA6kzP0Mj`Sqwp9bY?|`#9 z3-#Hlt*(ya&Kip*PSvRRjDn(}<K$K>ylV|@E5_t6^v8^5eQ>36RZLEt`EGZttRQHz zUWzTC%`-coh=Ve!7@^Nrb$Dnor4-2%i4||>t{6U;s9ihf>Ehj{ciQ#wd(aM)l8)+0 zyZ#HCj)imt90J8La>|EMA^b#cysa@CE^LYn9Ow^R7%eWu?9oGrqQaJ9M=R~XTr{21 zFV#$3Wp%T_2fLNK97si|=mh3IzAx2s%HL2tCVo|jx=n#CD=}dnw7(L}#$>uabT&I0 zy`EiG+4&f)6mR5OTSam6lbQ<`k2IUl1h)k~nXs14c8pV49!;ie+xM@-{WS@JZqcJo znmx{C@jzGB)HEEjswSv{{D(_?f~Qih5<P1kJofHDHwI@%0#BqSoef0L0|YX~0RzyS z=o(+&K@2m49qizhg}mT{Y``*x=9D6-bA=qaywnw!HGx&U$~SqD-QZEa*B|=?V(?sg zHF?W>wWx70*DYvqqf}TD$+o}yp+*f8Cevjp+M1fwxcxr7Pw}^&pkF|Ceo_CgSg7{B zFAqG1j(fVs^&}Z1eIpd(4;~B(<KGAetA1>AIhz4A*-Bns?WkqGG(`5OC%``bi6$78 zXi7<t0NGQ*X<_G`fXklb<lb}VHVlR7T{M{UXsACzvS?6Ngbd%m9Er?QKb)GrAL)D3 zOp$bQDrRYoQtqM$v54nJ4$0QK049hS-fAClbTRd7`01FTX0fWMPxKuzcl~xI2lkJv z?2VvVl%)$qmq(aIsPAzANL)n_<;;&gd?M(e=|2tEw|K2Bd)l}v#y7>13o<{udxiv} zib?DBZf?Wzyi?{2W5-VpM(J<fnIy-O2&pCplfB(R5_pYS{xWaqpKwOQRwy`#AsC(S zRRgKnFysoI9SnEHW=jJf*Ef`-&1&p}**W&!OA9pfaow$X509TtM+3Qnjz<G_n_fPX zZ?udP<)u`LT5^%CriGS#zS1TE{DQxfbbZ&Uv1%?X+3}F8JEh$Pr7PyXhKi^l+lESK zan+C(Etl?_h)Zy*_+G&z)#)>heP3C3_?e88&L+{RU9q2otQ}s19D%g~h%@BlEATAQ z3;PWWkg+oI$#~r->;{blh>{e`V6}(1xH`h?v9PcP00ZgBU=$9<*2hD0NY>5Jkc4rq zMlj(E#uvU*;N&(Fih26@bSmES6T&VAk6nCzJa*6K@OuRlolqj+0%lf&aH5wqJ>ReV zFUN()0I`J?IhPHm@6-cwElf>KW%7+1x;sLFgxCoC`F<Q0uQIAaHcpU3EL0j$2Zfa) zP~FdtJIz{(;bCgCM9U)@axEOjy0WrIX#}TcwLqK5j-?j!)7Lt)NE<BD?H;A=`95>4 zP1oB?0fo%uy7u0smOD+yx>;i)p3Gh%pE}amm}S6GYKavSiS1Iu^D=RH%l&4LFvqr{ zzh!qf5f}Sd5!GHrVBMZ8kN}x7Qo=}I0|O6Bv;>odChhfKE(1yMI&pM?4}Eq-v%0nO z`z5ii?MJTUXXj_gcjEgpRhGj!gfh0rO+L~0VPd`Ew{za*)9QB9P|L9a%eImpSt=}+ z9beRriyd?Cv#QwME@5KtlG&RZ78Ny3mN`5}#F~fgd(>`%-hK*rOpHQO=kLoL{omyA zzV?qyNW?_vk3w~UMst8<4HK?x&sz$Diu%8p!Dr|ZuhF|ueWbu=$eb|nhqDO$EOhiE z=9ADYvDg3{ZKjr9^Q`dU6nAg9xD~1c@#cILjWhdk>QN?HK&s)S5k9Z3=fmy+YFvgN z+!`RWL+wK*do^~#AzkmRsE{2|&1JVrMa4$R$=VqL54Ri{4;{ORk3%*j9H0w7#}L2E z2paCFu0{d<s}-dZdz|9E%mdbH@U0hS5XXL9z}jPBVF7AUR?^WVfCOgR1ND=TWS^DZ z6bM1UThE!$z{1%-Ey?PG_X_vcTH{~SsS#{+2IX%GGe%U~dKl#7l+!hSl{iiFE;8Uw zwF4br+pNxF<J&{sab(i79L+^xxiqqyR!XqW`FLxh76jC6CXVj&kxBJoNY#8^wmuwk zE+e{ohVE*_B_y=9IcU46{&i>&(4za$$eo@J01IAGCoPUs`68GLZh#pf*1Fl1Kaf)t zyFJyZGi(2?*L;CRMb}zpBJ1b(_T63R{tj*cxNI@DTuhcWLZBUsT=2jqM@qTO#}mu~ z{-I0(P&B&M<3kukJ`{NpbJyys<uBhZq=K4Q{5Pj$ZPK{@j9ru=u8L<5YMA$R;rw`3 zao428d<(iU?z-l!uLvPz5lU?!h2J-c5I(<Z;TT#H#CR&ine=S}CyQAzGQN>Iq>{ni ztxKNUAY-leI{EU;9At><qR2+>4p4ccv?gizvjQs^3ZNk@?xOXGh}4Xr?;jwv3R%BN z!aD2^XtLfLj>Dnp5PfC8DhRTNd8dvwXQK(f1J+fA|81PU?92as$LrA5(!zfMHvCWt zU3Oan4OYtx`G#*N&>sR<`-0a47}jQHl(_fljx#%1{z75vPNR;AxL8jr_ogkS;+N0N z%cR)QaL`c|4a4;i*vHmpkNQ13@I9ADG%~j(i3Q$QSBE5gDDS~;=Qb|H=Af`wHMico z(uGBJU0w6(Y2wBB>pgG|rt8*%WSK8ntjFFJ8l5YpmtP}SccuTRQ>O&LA?=y`{XSS@ z!Ao<*8oLE#@uPS2rf#$o|JJZfck+eIql`O@0Nw_A5dWyoD^HNT0@K6aRvgUt>HcQ6 zw+BkSOy{$EbxduZdL`bXqU51n%YkWxZfMI(#~PT`PGh>M1huF|b#>)JmQ2~2B4Qjx zVu|YcB<N0oRH?eRc-n#XPEx52DM6K8I`LAKF`1~_MvY=hjo9K>82(ywI_&Wjt=fh^ ziaI)`p^Y%sS<V5-c0Z%f17j$|?~<X~f(PJ8faeF(_wRCG51wx<*7sC!TRO9O#d`gG zrM|TNvI~F1@AF-R%ge)~RWZPa4a~@O;y1JTR2H}SW`~E!;-hm9ITQrmfVHx6l48QU zF}M<9cVR(+2<$A3(Sv<>E9xP#fnRY{oWKigCtxi{{pt_mu>EuTr^Z}3MfqP!yvW*j z2@ED*i8f^JL@{Yi>ym5}4UTkk%M&NBceKO;SU>TIh{hu=CkBJBhbXWLwjk$$G`|IA zrhR#PwWvXl>x!t~85x#x47gp2&hx2h#dy3$$d=Cm*ILoT1bj02O}QI6!~macOs@Jk z1r6Uy03Sb^BJ)Kup6vudj605TLYTDY_A9y`F<xV0MLCUutu~kPV^6mFF=Z@m+AldC zsUKWb=4d6sTN`VaYc(Eml$a4G2k;)&FAdb!Kx!dG!s+d-L4;J&Gbnb(vQe=$+xfM? zm<07evV5)!^U3AKz&v!}tl?YNW$zG)7qri{A{Wok#k={~(L9M~Y`Mg5aN#5q##`ZJ zIs|&&K>)%^V4#A?5upsj_`t#^bJdKKr((|Apb%tyxufgkziiI7Gnzyh#F+`9gxtD= z>I<9;TK6W&avfC6u>Nj*EKE#T(n~|XyB**dkU5|t`<4+oGoh0}fZc4~-rjy;gy<j& zzXh!|BM?2zLOX6}W@d(<deO~!#0`^Ui;O~LQ9cEce!lIyQGEN>g<EqWoL4-J0w$UC z?T2WhWh#L8bd2MhX0B@2N+thoupH7;vL=(0*eDG<G5(6m=<^;sL#g%Pp~;htIE=Br zKNN8d=#g=wq5IQavWcM&RXTNxD@v%;XE2d0$0LVT_-+ik%F8Qv=&<Wqd~zl!o*or> zvavNgdwIkL(CLVQx$qT9?zB*Nx6EG>_;WSS_1`l6!4B+dnTrD@DmQ!ZpJAxa`c$Es ztFImS&5e@R_f*4Yzuc$(;^3b@cuz(w1P7S2{}lmW{6Gs~#EV(d-<8&6#^d3^i@8Nk zi{qV{L*x3lgw?Zkd+mOqf+47$FltU0=<-KGJm~4W=gT|Y$2s|vuB_l)G!VKPDN#pb z$q2^ma=wIJN8Ls3U$^+J5X%F={Dxw6wl&hmNU(015yOM-vO?tU!##?bEGChbfX8iL z!S@Ek834gaQO`WzkC%8Lc94jys6Gw>&4mM^1Z1?Vzf_pL8`p)3>z)AySOEk)0zwFr z7nKBz_%X>ep=NCiM`vfJ$i*vQ84bSjd~5dJ<cGqx0gE#QkTnL<1Q%p{eqcNpg}kKI zmbhEvkBf!UCI}R0^JZC}kqQnNBw~rbh*>23%2z!K-sFdv;GU_n_WM!%2})TL=~cwE zBDe7dSjQs1^80@@X=bQ&9s3+wL@H~*^cdqAmroYHH86LENw;*~Qj%Q-lfzk621|jU zE0&~#@D$D;=GhzCmbIj+a-Isx!LdLSl7nk~6Lqz-o42NWva%;Io4#hPpVd^hnrZvX ztC(IKi4=>VpkQ@HMMXnNNsAabFYQYAU;-nm1Pt;+on1#a_0>}3v<Q&yun*Wiu5LWy zona@PE)aE%$|{x$JR^i>*6F;UnrLnPNhM#YHsS)zCYIBj0|W?Ks0^k82}>rR3jh>? z+1QUGjmrcXe_ek^1g#|+)P6;pb9!nCq%*G|Z+60nCDL?U(@`IM3ZmXdAwpJ2n%|bY zKiECbYlmmn?7Hb;?T=NFFG=5h{N2F%=25&%Vm&X!{BuL(BK{L#0JcZciOmydk#g3% zlj2->2v0UJNWaI6jlQk7A$+?$V6qNdi=!_66vX1eU~q(sT@@tt-&!!r9Vzl2IaWLF zDRt*-#&(Us^o#f9^^+kCvg<%WZLq|UqP1wHT>gAn9B<l#bAoK0x7)P-ZW1U=JJS{E z8ylXE_1M0I>*~U&X^?K3!|koCLGAAYWlGMns3?R&_o^Tci5ln<W5=)9$9u9o$AcV^ zLZ^yMnBR6Ig7sy~QxNl2feG~FYH2S;lJ;kh{<(fySloa{r)DL53_fpY!<sc95HO@h zsF`A68Bzn<EDL5&P3R=iHie*QE{lmh$L{VP+EW=m?`G=ltRDrQtL1V8-`+QTcpr(* z!<^9~W`l|>M2c0>JWP>DjYh=irsl4pGQWis5w-@5=FKmvXL!7QNUYWdu)|UykN81l za%@Ndgeh*odh7i6P)H0sS<~&6uNU-aDK_X)*CQPsw{(j6gpNJeA~7muvyH6$L~-$# z??9m@f{4q>+~4EM=1mc+<tnVQ2GQ!9yPSR0Iyf>sn&IWeMbb*_Hk&Ly04`-GMe*qi zh6BcG?gymaL^NfhRlM$t^>A-G@q#D@pmMcJ5ni_oF@`h*><q@S@<2`q1RRxG-sgY5 za1o5qbWSZxEC-N|8hlQQ_uQas<)OXnP+*Zp9`UVQk;eGErH!l;nl|okZ;DNE<U+_Q z&FytlG(w1~ih-IsWDL}HQ^x|C!>J%k7{l`P&h&jy{514>4>m>u5{-*#`pPpqwz{;6 zrEIYfKZoS*5jm8LBV~HR$N-st<_lxnz-W*-``XgV-r4E>Pl91ucm(*uBnq|?BxwF# zrir6U@~;Ww2Q*2uQi=_TA!H8wH_%FKsr&&964?aj$G4TA74#pUE3e2`TxI2;`c5nL z^3AC4D~Z<Qj*KnpOhrbB6i~42!NL2K#Hi?r@e=UT{wT200(1U~h;WlbE!&&z^ebwY zbJ(CN*T&BG$LxEqGjV8~uj2-~g3I+8>DlSotxgvn)7+0)4@72`UU9Tu^B1n5Lmd|% z5FtO2yW=z^nS9R)xFGZ<w`k(eqU3r8j0hQ@4}CVak(bG5e>CTf1qX3Wpu6(jl!Wq& zzXJ@K?u-@8Dua-}KR8Krizo)4Ffr9Psy?Z*;<h%;AapaJPYfsP_bu47&r!D9aRg;f zp5EIo&K*#1pe!jlY(`-QnI3x7QCF8}I-MgYvA6xrO`<`_*H_^0-@gu|=@dy30succ zrReWy9aPHJqxAvAA7{&}yJY_JFZ$XQknXa983YE#oXeQqeF2A<!k*PIyELjyGYrjB z9@}K{KvSjph9*&mZZhi8Z+Ygl$npCv-(IXhiQ3y_u+_6s)8#P9qMHQjtLsI1Gh36U z@KE9H;l$60Y}WD-bJ;F^Zk{PDCJ{1CkJEi=>5wna@=asklVmziEG%X_*0sO1cjGv( zBeReJRGo<M10y;z1)djF7CA((;`Y_7Yi8?mhyX4TdmRgp=fVgkZVj`14iZxe;_dX; z)}xLSj?5ssPM>{3F%-|=33f?~(vq=m&lzjkjuNN`vUBFzIr>wfgh<XcMVlcV$U$5S z@Zpdbf{5Q7(^V+aq+8Y|K2lrwgUYwEP@*M*Y!4U8Ccag|w@sZm6FA%6d7!ml<QwUr zlIVx;olATH*TW?7Aw3s57x+H&Z<}uM#912m&$O$)ptApdQ*-ltEFmw~&yPL?#u>ej z8=M!wiQHm;10cE#nCN2czBN5&U4M&<=LaG%P9E0mj_NvsvQSc4q7{LUuDUvwix!ee zl9Q|RAgTT}zpkE3txiw&&YLk>?IBmxd#)Se%j+H|Jo5o-lgd;>xLtvJf-kVRV)nXf zk@xHx6T7fHA<@vP!Dz?A<Wuf2FX;vU<_th~C&w7lg9Y{yWh}olvl*0VFmWWPvdOh= ziP@XAM0k-Kp82|JzHw5narkOCl5tX+&0Gwx=#w1ao$ZqQ{mx3BO6O-aI=NqtjEaKS zDw4}IY;(LOi%}~_BfVq4C=Wt@c>7jLP3`EDC_t7VC63)rxqfCJ)^+}CeHupU+@$v5 z*^S8B?a@nwB}K-h)B4od;+MrJ_mQAbNxe2vCPG{n27Kthn|YrzZT~Y6^IAvsrxj@S zae4WL|07<uR7LaOGtWO$JGr1=bsp+IX5r+=K~D1E#Uf<b2{P1$9oB`KxqqUeMbTWm z;-X|t>xnP!2HqK=o$(q=3g{FJXQT~qiKK*t)OwkswefJoH{nt3OAV!{e?rJZ>=Vdv zbW}%RbTWzS48fM-ew~0}&BBMIm!dv&CQl~3A4)((a;n;L-$RP6xN#ZAU@f}6o!Xg{ z40Q>vSIA(C_^%OHUB?9reZ?W-3_2>$h=^w@#Ml8gbJ$0StgX}Q(eZW%Ep%&XY3Mzt zUWufJ@q+g7ANe&wE-G@wvCs>~1t;{k7P_knXm~ffVvRtqc#2+(@7p2}gc$FrIf!)6 zv5`=s`4cKJV&zImnvTp9CruALeMprY-IFKkG+2o}HGG{^tmNVaDq|R1K~bUhTq34X zlg*d*h2^dNqyM70_&nys3<ts^kU)81Z^MvvP|*B<(WF76QrF6^I+y<4G-_~db9QBU zb;;Dq!UAMtby-t?s9zcPZewL>Tgy>@PjYf_(EpuW0`an>f~xrsZqi0}wod1H`$Ozh zRTojx=w$3s{mMBw8v*f;;(4r?ILkn^d+Q-M38KN1uP4-nl5sT5c*-#Xekz-n4`GZd zaMg^EFIiQJI!<ZbrJV{>QVmqJto_WE#(yd3>F={{;d;2Lf6_=ZBsr1Ct>OOxBVP*Y z-LUVJjBEDzcz1~DZk+#{By*56774$0RrfPVg!Iy(HR!ZcvaJu4P0>AkhQ%}V1?-Oc z+jm)oMXNg=EHbR*CV||69s7__c;T>$X{jIB#kiQHuC2IU&}|H;&bDn7$;$&V5KyqV zxDdj`8R5C@SsFP%29oKiM-1KEIE%rMu~BKlcn(N*NLu|~*S5Iq*raIqPDm<AdW)4G z@|gUy`mKD=Dx2s2s}lpFAB73zl8&3ss3*O2C{VxRDlV=MEcE&O4R+GH-@YHo4PSEi z+dCuw!+CT$7)uGRcw&+#F$8-w1uKX%3wCV_n;Fz3x3VQ|_|fwPT4tjs4@MLfQIZl# z1PIwC=cZK5SgHoG;6S(K3!?s6ddN`}Ef+mU31*iFVp05+@mHSJ5-l<PDJ2RbmV~wM z=d{MGBtCMVQ|ZhpVou2I5#HB$cTgY%OaJV$qzh6^S9beD%L7R8Sit_O#%p@>{hhc< z)5c@3(oMFy>qBjt_tSIw?IWz5&N};fviZ~GWw^Zh@$LSy`k_LzbI9{fL+5s>a!t?g zpmBN2=M3a``FxZ~D@(ii+-z}Bwzwph+00{K5fp~vg+g2keD!$MSle1euq68ayy%rW zd4z#Z1f+@i^VHN57LJZ}q$}pK3gaWxs6UK@OxK@T3hLL+x0;F>7M6(@SnKdh@c3zx zb8?FKh=bV4jum+c_sUer{_2LMWnF-&%U{Xn-k;1Y+FaYLEA8>G8nZ(6|0$s&-u&EN zzLfL13V4m#8;)^_5J$JXJXyB;=h|Zha<R{uzvVCX56D-d#nNnq7*HdC4HoMXVj>_E z;l%$AJs*P?p-mB5#WUlQpF}QAAc&&l4+d@qHUTHCO}S0B7o37dDqIrqfwg3t_gjCj zPop+HL3b9Iz8=T&UTmLc=T>#BtbpY>x#yt`Aty#voJ+++$FaOf8|wAC_}llh#<p(% z#t<-_z^$6ll9q-uF*deeQ=!3XX2eumKnr^$%$>%8?G0lFH^v)XdotS9CGj9g9O>2Y zkG=#JG3!2fBmM|Mkm3BNndIOEsX)1<wjq}`V~5h4o#3@kbX<uIGDMDCE#3Ha4yrb+ zNY}@}>RAP$;cKpMK^GYK5$qCi{u5?BM{Xl^MNGlxf|z>k#p%TOg3HHo{`kC^Y?Um{ z#5B((lo83X&(z0ux0-Ej=hc|&ct9aP_x$kD{d%)^*+-Gp;jRxZx_?@CVSCy~m*H)` zU`N|`yvUIO<ziXa&#Tus)#MapW#+FA!b$!20HhkXK;Xhs;A8zB8Y54Uc2)6*Wa7fN zxnv83{0bQmE>oJ!%njd*Zn7pOyBYrG>j&IKC4GRxGsD`4I*@EM4ZCKH1TA`mG#y&u z2fJC8@#_~8meM%-cOD?xmYQlgW8tzhF@ab{MVwD8(7{G8$jKRU4Pwne|KhQ{zA7R3 zGOE1rPeXFW0?+fVYbAjhi`&rs4l0YA$yVR8r@fqmo&Rw;X0x-=)W}n_?RjnMCDeOm z4xi=L(P@Tq3eL4XD3++a@JR246~Fmm_9@|4!`o>so7IgyL+ig*5?n;_wf2bw&aExg z*EuV#w`>Y^O$kqlOU^FexSKNC>Jh|Hky&=DWi7vl1-m}*ZY};wp0(RfJ39Fc76<1G zMP>k)G?;&Y%=z^4(K;)?B$TS8lVkS*4PC!z+5Ju{RhS!_y5~mW@V#2lLwUakL5|s$ z7l#`L^AXMX#FHNkSG<4qL-`IF1O_gOCAtT~wuhI8Wpp=@!~F3U?C!XUgjg5}J5XC* z9z{N*_yi4EV%FvN={u$M-`w!xsRM>bDQ75gVW4kCc<euQ`?9VVy^hC0iuP!;QlW&y z&XHziD*3e{;tstKJ{==Z;u%m0{S&B5HACF)L~9}bO&+&(J?;0A^y3QJjz?ta@qDE} z!9H2GAKkAXx7HP;$w1Ce1`Slj_oi3}^#<lTAsfbS`EN}KJStk-wx%2I^Ubygn}zuZ z?JDVlCUl-4puCawdyL}i)P$JHH&ZGm4JtDXp~+F5J8E=;<Y!s`@=$VBmC2?hCVFq~ z6NJ}12A~b=`}~L-w{+X%DQNvQT2K*<aG4^2A1snD^+T)KYkG&Hd+=};sG0CElg%xn zrW;viU2zZ|<u-=yQ|uJb`v<67E0#7<wIqIbAbWLgDgq^qeN5p$W8$$=WM2Nq0;r!m zv7tM8NcNw5S;N$pck2!L29XY$)5*xmjT+WTUf#d_A&Qf{aBjnN4HGq~UptUp8f|Oy z`jf4*LDm#~_j{susi{dy)Ci;2<lljF2u$KmF(kRgKozs8Kh_V}Cdk$-A09|Y#%+}z zsRb)H31lLWBcW9jtr(fZH(uUx!6HlNNQpvu0?sLTTuFeSYes|$+&@P_4P2W_Y3RK= zd~graa$CIfuKB2G?p!NXAHj;PT~xjJa(i@maCC4Q2@ii)Z#FeDA*J9{%kX_w%P5h( zK@&);f6iljg9kx$%2TpZoNfQU=G75U(lV>g#2|^_)fG!d8fV!zJ=ys!^hba9ukcP# z@9!U&X*F`dyRbN5TbQ^&zYo_M!)4~u7-YLNN5wD-&9?+g_<7;h{R5bAAEFm!GcrxT zv>xUB7ne}<;g@mCC4!}g;U?yFrK8vF_zjfi4Tr4u7D5*A#TSR(QZNmo5P1ZT<ubbe z#eiE^JhcJ(g|m7CQF@2j^L8?}M<oy4P(9q2g)eqS!<70=>m7n~;;{WG1(fnb>fj5- zY;A4-w6;FWHJ##GVO8iz)`C;{ZU-2c04<gJHZCf#b~sGo`aTJaT23%lQ5yIPpGy8U zG2}-Tzic}S#%}JbCrW^lix!#u_y`3t|12Eu4-yyW44t@--NhmW*QQdPi@ZZ#y-ZNs z{i<}oL@Ex_SI&(2mCMgtt8!V!?#Alss==!6BdcaD+in|=-j>?MQWEwc2S$0A5#)Hg zs6jl_KP!{Q(F$pQlyUE%CCZWqVB5pd9^%8$$QmW+mo3>1>61zY{De-NxlK4SA(hh$ zWPQK<L3bctqqv2E$j>248U|h4WB-cLq#qw0RVx(3IV>PQ@%))6|5IBfd0-@0YV3E$ z^kv%DJ5M+*#*hi#q^;<yr_dq_&+9n9{I<QuKgv<Z30`JOE`Xb*L8d3YfA3oSk+2Nq z{rq{6-Ku%%=)_rb{C-&%<oPyxsb*$oLPocHOFUw+ZGWfaBTCNyK5?5R?6H4k-S)Xu z>ijH=_`?jv{Y7i79fZR7kyf-JDJw1DC)T9DnU%w9_bGGQ_k0_<Xqf_giG<(&?zZu` zy{TF*$Whmo_;AI4+ji0BF;tQm7@b6F3IUBWX_Goa`?;!gyU$9Dd&iS*wqqimbL8u) z{;N(vnpMU2vC2o%hq1G%_1Vtua<uT@KTJOZCceOqPyfcFU$?MC&fpLN#JQ$Q5TWow zr}2^NV;Oq`Ta@6Aa6d<r`C{*op|=ScXlQm1qxPK0Mxlkphwe(1iyiat|LY6!0a@u4 zjx)5M?-Mx1?+jcHLJs579pDZJFoWfvv6@bhECg4Vlx$B0?A?wg2(_X0Z4M;M2M=5V zZ8o<VMsNx|W5WiU+#@`EhfnfvPXW=_PaE~7lOoArV?>=Hixs^=5yY8XxTGDOA?&;( z-0Rs6YhPfw^rH1a;E^6v<y0KqD4SgIMtAIY(hqo%#$TyvEF?T5H7QaMH8}@5Y|A&W zE{<I#`gX!K3KQEL>k|h&J1_1SKX4Ey`azBD-kEOf4?No75xsfM3Yk2=1gte`U2FEI z&31x?6^z*^euQD+SnM#<6ANhTX~f%&j83s6r=%XQ@bm}6?fo2zCNj}qLyXqIACn2C zmQ+=fqL9O-%we$z3}y$GXBezy!z$ku2n46N>@Ln52Gba2CHs%y_J;7v%O&uO6*3b! zoL(9lA~1&jV&h;@)H;1LF*P->udl=O^hv~IIhXaT|5=)6EXs12pCm>@-afDJ+jRZ% zYnH>|IK($9=eG4t`gY6JGc8$dq~jfvzwh%!vP*x8|L&xFUqJS9IrA_CIm7}KxOJcV z#_}blS8iOnrhVHbB9!e|<oFLSWCHfj`xqA;m^dvLYiBG{()GH(oF$ZUS@Dr`zQ04k zYnXL^vU~pFp$8VvuGh0K59U5bv}A)&+F;@OYFJJ>;!v47B&f0B^0F=jG$YfK@o88^ zP%Ga_J(*@n0}w)XaFHpGWdl<b{QX&b;+0CEvfw#-BsBWL!UIqYE{X?ggQNnp$bS*Q z9_xeUm;{#>k|OZ-4WkvsYMueJmUZn5i}@l4gLBR;Z&rG}t}G@L-+wg*1WF$r;E-z` z)erh$GO$uyQrvx~!g&rpE%NS<%#YdX_NWq(_CED16O%f2wzh|<Pxv{v1FMJLQeD0J z+rGrns7zorTWbRx#HRE~jovTLBiK0@IbZqC1Lw%}XL?F4$k1Na5tnRDY{;yB-JQT9 zlhCC_l3Pfm{L5RewHspVxc##EJ#C!u;=DFQwv!0+2+QPeX;26^bgO_gFBjtj3E1+# zIoliJs(M8dTr|~a+@0zQs^y}hKU9JW@<`Y%bZfHE%!v%6BT{J;l=xy&J<xR%QmnwA zD^pj`Vq#4#!EY5KF<Ge~DG=A84g98s9qR;RV`G>G#IA_Hlnerz8jOE~Bjv7m{<5@; zWMkw6u=4n7gJA8DpVn8Y{TlEPVbf-;m9Wdj^On@o#YWx2eNshf30)-5Z%4VD`{Pi! z5f!e*cKuV(X4M<ziKBns)8w+r@Hky%X>t(KqIy6P50CBSy49SguI<c(5a}PUlcqnq z8=IHSIJ64+DOg<|f478AWB*`Gr&p`1zb2kXQ?x`fO6i;yHO)-(v|%VBhEj6Nj&c<a zQUW>udRk#7)7ePvS)G&wY`bL%4_+c|`}>%WNXt5fS=@VdbW1o$9kclQ@0xs`#wILh ze#fW<hpw6D8a|nO*3l3UQv|>3NYWw)enwDX#)^q^6btS@K#`q$AgAN!WEi3znV$Bc zN0^fYBI{fCXsF6EABBPeZ!s8AiF|Z>O%hg$y4GBgnXmZ+{!?goy|6eis1$;LZ@O(K z6#uws&313BkktDf82c3i-mBcM&-crD3<bVk6LT22Pzd*?F$RU1>(2W3ixaRxu%R!> zj{S{3N4#74012(^`p|k*9w-vU<SR?wa#ECed?fhEO|R32Y3zePNY`_Mndur2YdmLb zU_(22n78*5Iw3@}od}JYiT|rTz0ttg(y&jt=c$E}R|iC-o0TucY<}go%Wwo$M4Gs0 zia=m@49ler9-=~nte*Nu+Nu7hist<cwbPnS9aPh0Il=?an`Wu(*WVm2bt2WvxevZ@ zTv+jwS+glj3Y*iZ;OHoc9UpcQ6XpaMk0e7BPI|}Yg*s@k68ojpr4PSYi_apXBBR6S zSkmbi7Us|`tS#Z)oL$B7Gc_T+9xmJ}b(-_t?lW9cb=n`Lo2|D<HM<R1D_`8{E44dA zmnznTGMjCRV=|lPQf+vTd-BNv;BRE_K4J2rz&0uk?OE56iyydtDaQ>;>rlY_!nJT~ z^UhKiL<`6hblf*DG@DF)0fyVOqLpgxMS2|UJ+Ph@mXX)WPDesB<KvRXfEd@1K*d#S z{pQ7#wcst-;Q~U4H0`HmoveXW;;TqLEW1lf-z4ZEyj-vr;&Sl+XgUY>y4tR5H%4RI zwr$&uZQDDxZ97eahK+5jjjbKq{Pz8P$NLx7vDUTbHRc%S2-P5?s+FS6kf&_>xkx#L zDR2x9nFkfddn`_%pqeAeT2A1WzuO`RH&rb~+hkYQ9&twi8jYOTQ%XrG2o8wv8hn)5 z@S<3vco|NCdvK#SK7-(aJ^hdZyRbi`3B7tqcL~`R$Q!mqfCqwa&-s3P{1ONx^MnJy z$;rtokQ=j?7bGhF-Ut{a^y(w@Aht{0LmDK;XqnY&dW5vo^knM4pxEi^f3+t4sQd+S zls71n2HS(YmObF^=bijHhurJ`@be^9T8WjSDjUrsz~s`~X-9Ii(X99I%E{>r0Nmea z>sC7HJ{w`p`Mt#<EnLImBtsD$T6taSvA%Bf{3f+rAxOATQex6A{BeVP3!2R>W#koy z-(|oGgI92jOP95}#H+OeC8il`?>7NQ3vo9-8cDf1ZJj|p#zd{9vzRBxjS{Ep_PZY~ zSiXRNLJjNtiJ&6yN5x#W@tiz+XQ<GAnZUr_wfSZ2i;I?*)m(hIaB&=b^6MDj(GeCU zHMNzA07UjEfIeAf6^CMX#4v7B8`-SSg=@sa-QAh!WgatJ!?3K_Jv59bHxKqeR?IdX z95O~NrKN1~m(F4mtB$hJqZs#}9D+b^54-g(@_fEl?ko<knVLVHmu-wb^C2&kQKvXR z#SqxWzCf}G!SfcnGG0k?{ZCtojuWTeZaaI;3e}Q-d2e05V1>}He=8i`bbH?Jyk7Cw z^Uvq22m)WGwZ4zU)6H3x;YJK~M@&6?e<YY00q!57R*xplKNhmukOu>ngv>8+{|Hw& z!lRJvusc5@$oF9*wv7s7?jeB~hZ5LBZY+K1Kc=W*NF}woiMbMbQ7;pGj$nfYuw9X^ z3+^OJlAfR1!IvW-ecL>}zcLwg#MrH7%4AciT;MK5x=<Sv*qlkWt)Jr_U@u0WKyv4p zB&Y`9!(-WCG(BECiw0lgmB{b9pUX3c7o!Op8FET>bZ3z{$qfwnoy8V9O@Bz=ElqET zEtxVnt5j5~C@-E8Bf<S2#|pCUxlrc#c~n@4jIZ};<_y-e(Ae+sHK3#Qg#|G=sL_as zj&@2;Z669395!-5HFFZZw)W}|aaAh`+K7>cHVT2EW=@^juNiu~$4n@dKcN0yGrij2 zX-NelBOJJMG%w7gZ{E|>-5(_%Erbh*{Cb#$=hiAKgi5&N?XFy&6&?>+Qh)yv5&J)n z&8s3RGL~Ol7+6@wwlp?%T6yaMqz&!#I(wR`<@Zm$teRU|Q^)O(#8#8re$TE-b8&6u zPGdE$o)1L{K4kf}(K?cxWj!waT~p+LY+ayUKP$!e{JR)&@o?@&Si7kvU(HQa;U&B! zedXU3sad-%e%5+kiM)J))N}JWvy%YfASE^P!`EMJ)?=ArUMX9E7JHEqnhf|Y3IJ*r z7XV%T`VWH2YS+taYMqez3@(EQa-s5IlCtKDwB+M_9X%5$FyQG;%WWfPYNgE6HK@`n zanev5wB7kcgIy3*BO$!#z(8jTcz>wSP(Ot$r5=Ovh3HbuUTf9A(_@faB>|Ew_Xp~k zG5bOjUhZzjSG+@nvOZ7^p}k4=fM?uXT&}VYC{RJx-|R=XVXuJW{4zpE2?M!A!cPf= zPTdMrfMkD(MOA%G|JTGPS4NO}{OI+l2Tjcz6vWJ^y)CZ&rm<9Kae)={&^hGFc?^g$ z7}m(z$H+~cp`?FbTZoQ0Tvn(l&=wS{QyCL^-0$)96!EUvJSpz&ZRmJh?R7-;(i2>} zHOb!W^?A=>{YM@ts}?5<v~0nbc>d@=z8RSrQ)jMOdwP_HQ3q`WeVsZVEN?!ZHaM}u z_7%|F;Q9zY1DN7`hkLg`_fPHxhh@dG$x7_Gq0`;yPSEm4Y#cuaaGXl$(QKoPeIdBg zN9oSUz)+@2PM@qC6lY%(d@~q0uoKLCkd2EQ7e!kVY&=JZ0BvFau1bNApsxhp)kJda zSBIO%B*_F3=d`qCsN3X7?y&hMKY>_S=^y!>jXf>Dp{3{Fv%6UP$AHr&ujEBSGG{A> zkA7I7kJcFF-?QsC#srZeAhH>Py}s|DM~~A+pt7OOcs<8s9m2EFo!R{#LjK&q&%aLp zAz)d5l%s?bb$fN}{t8F`XE6w`qAJ!$0`>#|Zh?Y_f)5F9PpGMyq?v$%x0{FTMJj}4 zAg~Ns&LZJ1e0{%?5Rl;hvG;;Zz>oAu(eRm;+lD+mQW;+(I2536wI}u8TM`2XRUbqO z6*qBRWabltO$doyd^`r?=KblXXvIb|`Wpo98t-!u1uHVZPthrU%Rf~Z*-CIX*^tNM zLN;9>m`kOQ_3igJ?7f5&i0J668cq5r?k;ERXr0V@a=g>Uf6gE=0}2+)4v4MCup<w* zWFaylPpc`1=%$U}?(2#a4g;U0TATJO;t;oNnW;u?I!}O%lbilW+}z6DMM$zW#oE=Q z<T~ILRBRM5#gAZFUPVK`Ns~NT4)nSf6=AUR3^bnYH#>SgBBH2|Rlwoq;`3P;a?e+y z7t?$gx&rC@QAr`^VF-s4s(gY6Hvx1}@*?1W<#=&ZI0#-O10~YdqfiHJc0+uc-;c`O z4-aFlKR0wZtd<aTS)8~S^MoVc0H+7h95#DA^UbvAEuguxB#Xm@As$ySg>J=bGBR`i zI2n`Uk1xlv)Q=3eGrCFXx#tEmoSWaqW_nCd0hPF%8ak>(`TjaB$G7dNCu_s()}Vdb z!fm<yarGqDJmKWgLW<8hKc$QsHdQA*4ICtyYq{7Zj+S7>6)4H0WHq{wpO6Q^gRI-w zUqqzNsY{zV`7RWw(qIC}Z)ut|m3HL=3ypN9h>;=jv2DalN7u=W8Jofa%$+?z&1zL3 zW0|wTQJ!er=EYI);@c@LgP~Xq<7TaT6#fZ>Lm?r7-lfES-GSqitIJQp1RW`oqH~H= z=s;3v*<Ou4<XZt_{k9}%XzwA>zpTFr$_R=tNY00chxMO@qIfYDX2HqNuT8<T)RVlM zL{oOq`kMxtA<ch^k6eH+xoS_E_Hy4zOj<GmB?hf(<gFO9IT`J2mo!Rn`ib$#>w}mv zO0vL11Ke=!+;s3|zi3OLuT3sgBHAQU&iOykqG@R94ag06{IhmDpQZ}=tk%X%eA;o@ zDme1JgvGMDrnj(9k6j}DK9j`C(;(s9Qp#*-$M=eNvLl{0%unu|)>N%7{<N9Pg%5DM z9k~;dGh|2gB^G8t=tPg<G3=B3)E^9nzc_r0!aB`iZ^W}$FIj;`rpmA<JVJ*NBvQs% zPwqpPf4^{T2e;S5(dlqe;E*`Kf9h;My76xJh&m7*+;(h@w0nQwZ##=G;8DT=Ccqe} zrEGus1(${Rjrh!5?>?#vlY`1kIKUvpnKBz2pq~(+OKG?-<M8=2u%-*8wHOU0*ejKb zqxa1Y0Qw%7@r3L-$yai8bW@di=k^nm(}zN4(QIDc(ALj+>Dl9)rL0H6%5n=XfxyE9 z=j<=AaxpPn8(Iwzkr{myW4?xV@Fa$}^yHPEYT@>*Vlkh4w*2gOUVoj5KvkNlsVV8N zACp~!^05S3MlCp$AGfLQ9qhM3O&=WO^pmL|E7Sgg>PzuH)+yJzfs8qo@%6WCip+5g z-fZ7;1-b-N+vL?fST@|$pP~93V-{+1oK&=QlZ`*<!XdLaUT$cKqIe`ql%{e~+1kIO zT=Sy9zRtnO@E&n^sl=5PLaL9Hcy<b|fi|Jxt%#ajPhV8V&im-6c{AUfD@MSic7X4< znY|JhHWVT94DfNHa70sVOLZm=yu)HCnW_wDTp8BdUq6<5M%DytHeF16DKWlVFjZzP zH%FOL1Rj@-U|omrgsDPrK~scw=9=QJD`&o7jgX~%%Bzi0MkG_xUh+HTmGzjdZfwLf z3dsIa9ko~yGzu#7!9{g&IJ<q&wr}J5Ar(U<P{L!7Z~K=GijlSGAU1OHqC5ks(`)|{ zDRUh=9t#Vr4fiFvva-B@4Tx&KWZI&p<%QgOe&*(CX!=b8C(z5&BX!kuSF9WC_p-F6 z9Wz>mBtKtgn*%KWNJ{N@LLTq7-p6B?KzTd8=FZAU-SxG>XTa0eM-Mrt^e|$)B3at_ zfERvlPIT@5+D(V=C7&|^!x=ta)#EWMpJ!JBeKiys@@jbd=mlZ^#!CZnT{6r8ew5(S zuJ4Ukm%yOayJbxxGv$kp2<G=tq3D!UMEy_1NO}>j$V34l9K@M(93v?bbzi;A`~;4b zaa%7J&WTZt_>z!!?V+o7Dy<KOB1gf(DMZSf8m>qhfj+kg?POWXjhE0G=9Slwvc)m- zADFxefU7QEo2|T69IqK`2FSm*Ex+oE`hG6jh@Y>hCNfi4e9*%>{R--bIA~R>&H!5A z|2uyPU%5kl1N8<y55;;{%$|vna}NJB6mW8t>rjQ-<w(LNB!n<T=|ad#{Lk_-8^i+R z9~Fw|rxLLnE%|5})*)sCL^TO5`!6O|g74Io45Fe8`GiOEv1B4;FU?Asbg78o0BQ`K z8D2K6z+!GA5b^avCiw@h)^)^0DuFzK9l=O0rwSY!aBq6H4c+JBXM_s`2+ZHZ#w3GY zqSrTq0nYp6)GEq^qY}9IVXXYC{D2M$2Jp}CL9p;KKGVM|S2o<<^Ru*J{Ndns=Zy5( zs<c&;@(<pRv?@<3m43?5GEJ~k*uXG5;in8{*K%#=er>J1RdPS^oa&w9Hc=hvTp9=| z1`ejI0u5)KQCw<zrh8pK!0u9K>s)Bka^})wnUMp(<|EzY<svNDc+oktrvp;Q&q1uA zlO}C|<h5%PfY9Wskr@LX1~(9nK1~i6FiRPSBfs;36h0`Lu7;~dbKq*;b;+8Ym+UMt z?bxHwfEE6au7v?FUIHiE6B-<h7Qo$pt=J$jrOgHvflSQ$gDjnf6v(m^LJ>@Iv(F?n z3TzJw{`O`n$j_V!BVMjna9z{638EuyRw>J=QJ<tzj6*{l2=k|F55Q*gU?4=xNT|l^ z5?Y*5LWlPMv@#x*=0K{8p9DwZrB0QVtx{n#tu&qJO(6HVf$JwZGY)!QuXdV?W&TKZ zWkYbk2!Zd|kBHV^r7jdkxoBx0P$cX=A1F<6FO6_*QfoulHM0E6?X{R8$ar7L{ixDQ zEpm96e&6Ts<wE3!!_NeXM8Ky&FRUv+`+4;p<o7QcW|u#y=AJG$?|x0A;ruIh)o?#Q zav^Q~kn=EK3v;2Nnu6Qrx2wP2HJOPEA1nQ9CtFyZWTLdQlG+`FnY>zWax#))!BG+L z+_qoboCL;C%&_b+wjHZ-elZ>&pWpo6s-OKTwOaCc;1iIQw*>W5eWkCi;i`{X?x7-w zi||v#+`WRkA3F4|ba)tXr(}!a4C$4U+~aA#87(cb`Doy`{<kQB1094YFz8(*uCy5P z7_Dh7!`l8OlG$X~wKX*uv-$j)mmOzJARrzN+Q4fQiv}#;C3=@QE2Z|ZPrT4~m4a5M zZ6)ECab?}*I!PuTCck_bLyC7C1R1N_Z_ghu_$b6Z2tnS#S!O79rCG}X$ivV)HOTc| zPkWmJVAzn<2(I;wAIQTpd}Op}!9XN(C2l*RrTBj*Qt4*ndAq@dLbvIxva)n=Vn{IP zV@jLzHkV%?h1+NE%Q^dGvD0>4hrj6F^0}49^H^K(?%<jE{#^1{f32^tpa1R-l*r4^ zH~ZKkN5-$~GF62pmy(Mto$d7c0z2#ZfFX!X{QHaphE0l*kGf8?j%B)mUA%9KqDQ4J zslXI{ffTuNb>{|OAyyRyO4HP9*Z6~a9l`~v2?1Z`@Zkfq2N8+m>^L(h9dK9?Z}Wv2 z8B|0<e%`1D(B?!Hq`}_eN7uK|`^;jiKD=Y89?dw#83il^Qlbl+Fvvs#15y0^wPH0Y zW1;8Tq@IGRe+tv!Fl;!`;wKIptxZf!q(Ez;iUL%hJnE5ji8%eq_Pfv|>J#@kj?;EX z3+T{-yMYOc##Bf{GSo#orylWHfj5EiGSrUU7}opg^$OSC;->Y}^}sUDHXo--E;OWA zI{A1GD_tne!*b-88=#o!+t&X5R>%JRX(yoFMqP`!Jtc#&JK@&N4SLgUrnI~zUdXUD zIN&kXNL48(<VbP6^3AC?L@l+2x&XicUa`De;n115`0F3N%^4U#gA8@PB~!U%{qo(D z<M&UwGL5s@)Ba+kPW=xM<?#LZGO+inxc|f*sq<vwbRT(>7x3IRZ=u#8L2?`#eo16! zJz1BtL*DydUp0BIkgt;M_!amx^~12;*>~4iLI#nlu6-XnSIg0s)~bXvTPVL8Cb`I| z=}*XbD<j-GBrFO_WbuRL_h*bOl+Y*40v&TJXw}fl2MSiRn0(l~IXhe1Hggx1#|XZN z5b#L5pxf_PylIEC>IFp%ULGE*;^Gh!Yln?jW=ucGgx*LBrAoL3iTr4Ajz~(ou*C9v z``0`$z6XD~cK-SV1Uq{wl;Vu)S`Kg#C4oiN!LmRJ{L+vKnat1#zwC4nEf)QaMIPr- zAKX4F6iD)S>+ssgpVS=b(W0DMy-`%y+wt{IqH^3;Sk3A-b_fk5JR>I(b93oc|NEJv zr%UKm=Uw?wW%T9wbQk!nK0Ru;-0HZ}T<)}<U@#*Hcx>_V^sKXx*msax+XfMNY8*h; zCl2mbZQK)~gNGNc`p4)^OQ+`5bH}7x6`GZygG(i;l_$162T$Jq=~C}Z(!$nKRy6zR zi3z&CcUO%lk<0IC&J4`Vz!Hz0;)r)qv5A}gQ8zfc<h~STCAbuQ6%~;mKYr*(k1Z^) z$;rwl*I!f#^$KrXd6MI5MQ(xoZZ;>lbS)Ly3>gUM@)VSKwRIb3cfh~@xMjE;*TkxY zUbD8oj4^9JL7L{9ImGhTmow(aMf&pb(`>hl^5?nMeQM!XPQmBL-TlOw(|iXaepSUI zjr9BL+go;AntJd0sBRK?KTBqV&vw6=Aid^t)UtgQx_@(a@`7?sRe4il_3FC?)K;=% zbz%b7Ds0Qtq@29XQk)GaKP%+r$4gA|y(=Z&Oy4|0M(VmfsQKoAz$`OXu(v|<d#!$J zD$-KB_BQ%rN!1C5n;P7qIWS6y+1H+==!@*d)aHbRHx(j_oXn*|z_fBw@IF0B9)V@d z!m48OFI_k?U-9%wEZ>_y7{x2TtrAza5^b`q<S{aY0Zzp^=`G5L0_cwF2hFtclhl|6 zEW9h-)KFte90+`Jc0{d^k<!!COSZ_97opf`>W@q(qb2B)y=KV=LC_wKOb|{^PLf$D z@gNY02NFi4IsHC^O?RG#`FWC-2^qd0jLNW<XpXH(ELk>iL7budnYd!uS%{#4reXeR z##v}Ok}Yu?8{nXy4)%Xu0BGp2OadwXc3oOTW#Y^;0~RxLUs)H!7zyypyp{AB;<2d> z;B5q;#*u;+jsC#YNz*q)yK)hshjWJk%=F*}8V8J(f4$>%h^~A<OHGYndSXh2W#Gd1 z&FJdS*JnHSd*{=+{MqH@c=I~piDT>fnC`E|!wL3mMofdvP0XdOEx*SEeB2Wy%QAu4 z{hJInAHKX6aH*I@v0@Z97tF@HbkMKaRI0H_TOLlD%v&1uK_xCDCr7t`?13k8ko2<O z&z&k)b*rJg{LoxXId>YGcfg_g_ix}I(LW@Ou<H#*?@z{l7C<dab90O%ATW`RiK&3k z@A-Q8Tpztf*8!FMLyBtFU4iKYr%H2og$G(rKE%9qH;<4o|L@$KjEBbqC`UN;u{pU^ zs*im%O3dS(#pSpqRV`#Fo%`o<N5(e{H7KAp)0a>Pl(n}v(z>@UZTVfdTHJikH)h(h zcr)V2r)E|BM+x#tf9=@Kr-aJR=<m^SqGzuC{K(PFTtE54)?f?br`bbo@axE<%5=lg zPB6J*^OZ9MVU116M`W(`U_xp0zA-l^8`+e!W%vrf3<R7P<sRs->Mn(Nfm`u+04_E3 zj8Vdc^+S(%9H2P!ytbV{X&2&{K(l3JnTeDxsl?37*w|Dlh(!JTy{+u{yYM^j5!(C1 z+s}%+ST6g`(Yls!5~7jxGn>mH_g^&Ar0KfUXtA?B17J=EOt_jg(=#*Rv`^Z;`N>P3 zsiCaWIJIcKWIF_;W^vrKvXfCxVUysvuwjz(G872nli^8Ez|bj<e6{M7;38y<-AH}9 z6AXDQ>i-SHB6G}OeWnw59K=(iBexjbQ0gR-DkCCu#Zhn|G)Go&(j7d8z_ArPjTB1| zPri~s>SD54LVeR+-hxuim%tGEr^Jq5y?|B|SEQ*AoXVwQUm(o2pGg$%@S1r{xZJ3n zp<nMeUg__#!(=X=5klTqw>rb6QWzH2|E#t$XR(BgNY?DUBx^l?<1mo$%A$@bDW@Da zuf+;QkmywWTf(lh`vZNUR5+1U^OTW@!}QOVvsgSbk>~T_@~wEJ!ZOKWL%kV1MiF1G zd<DRfYWgB*{4C}UA4g7EqgcGs89{@Eqf}2s;ddVG;EjFbkK#q(#sOHSW`9vx+uCA+ zs=BnKK!6kQy4q6g^t>nmSxH@oa2q>9lUvr-bl3hktdBcHE%bXn`tyMZvlkofsq2PX zTBEg3FMepAe!T0-BR%vMkOiq9u-p;$`)Cua1Bi`@luP1U!;KAQhV7|Smh95cFJ&dy z$JMyw5QX420?yYc4y%7cZEX{i^OGgB6=r76sB_t6HkZD6<h&W=cavqeFVkw$pfLR= ztDF>Xc@T`tGsJ@=JYdy?W~8!R^+)7?ef6Vi8V)$n?(}&ImRc-;@TjQmOw3(!sAUbT z_w2R!_Zpg!D8y@R(DV{zF}?IUms5+_Y-vYcySXG&-THS?j~;n(gm9GAD64ZjtJJ{l zoabV#Dbe$COaASV*tGCzF~I<!y{-s&A}-4*9j&S=PhaEXt7_>E#mmY0Sy!B_x93Cw z->mC!?z6gj=k6>Y+meY2NO}%PnA>kBF9k^XLI=<0IuM<<Jh*`xg#(lL00ci(70<XX z%8^nN7g8}fYU#p95+{n!^9Yh<O8WY;oFiv&N=gR6&16{(zq{(#JF1#hk7L3{BtMdx zXn_IY6*^UE4#;$-GD*a?ExfoH+JlmDfiZbg<_>a=@JeNisP1Eiq~I!`dtERK%m*5H z>XcT~FsNaxOl&M4GOb3M*gvhV<CLzh=SgK`I45*Q?_G521+Ul2)_(*5uDmo#9H{VL zEnb(N>U#vwHB1a!c-D8^gF(Dvoc&g+3@N;CH_ZDdObFw9IXZyg7UdNWPAYqBXSk3D zac>hR3&g8u_ZUf)Av>e@t~-zh9sf5brFrI1EAhvc$7B~-zNSaNT)rr7jgu{MK-WqA zgLJRaMU=$A?Yu=*L1kgvxVB)20MK+c`26ZAto5qu;p_Y*F~MnjJDJOCDXtFYvX|NC zXlk-C;OqSE;mglW^6O^*!Mk;<45zp!-c$;yOa5n4Ff8SUlLGyC5l(dE&G!fuKjaZ~ znhfo|(E+_EV81kvaUn}oeF*E42uWXjwfC3VU9Xw!?%sBw;ia*lIZ36*Xl>}!w`a3! zRiPE^_2(;*h+-4|rQ+bUJ7C|_i`m`iVPgE1v9Ge69K217?u<2DC?#7WHYVo$KYNCT zM_rrEj)!K~L%Cl>>^Yb3r;7LEYl((VXD%}<9S&NLS-<Emc?k0fHS(;A!ZR`F4Y(Ee z6NLYoT-`Z${Y@&XFnF`w;D01)b=X{70o1I{TeScvlAU>?U8Ya~DFF>KVfx5q0!u19 zB_McbjpY*|FKiod?aEVKIWZh(92kd-lc>6czK9Rvv~YlJn0?~j&Hi8#R|;C;sD7sK zXDyA1!>{D9@7ha+GJS>UiPZ;RN$5?M?=$~1xBeB7c$%=B!YV8Gw9OVSrG??_1G(g| zrhLX_zbm$$4$rEHn=kjh5_@q&CsQ*1rAb270n?>l+lmK^ieznJ4eR-CGO+ez_;)~V zzNyL+W46KHuZ`JD!r_3s6FOyB9{GE~``@K``6r><g@SI*3Wa>#BmaY*?1Ii-R|`yp zCaYhgeyGn+6N*RJMysZJt=&+nlF>RayE>7WS3m`#?zI0I;9T0;a?*pEpg_qqRfS@K z;YRTC?}nM6yc?5-5=&Pe{8lVvc%)XujHSw84|HfS$OU2j`Tml{PG?$JI+kOktxW@} z<lIHO|DmN7OQn=2qh6_0{-0yyPN`D4Pzhu^D&loJa^C)r$6^D@P3kXwtTtIK9*n2* zmcsKZ@zB!3&8|o^pd1AUjfcSg9_{mbM2CSw;EgiXS>MeM2NGDk7OhZCSSE>~$o*wP zvir+6+EqoFvZ_AGt`_Gz9!>@%2sWRd2i~^)$^8g6)@DqVB_E7c$Ar$;^l2F9-MM@F zkWOg1&#C>8xjw2U;8iO~O?5zchM<wfijpdE#w4!L=H=@$^7iUeBbD|+OL((0s|6{% z8f5Q?7L6A}d{b|cKadVFNF()>YP{<2eA(F84zjbeOKNHu5)N)r`I5Lv>`AOiGz5~5 zqOjJH+96-SP2(c~MDl;B_Lsy9$X#JbXTK@0klv{hC2Wu2gSjB|)cJ~aKc=?)^C=}= z>R&`s79K%n*i9bglRBZLC(oy&mvU~L{dZMthG;O4dFAB(#4AYKHsZ4X%jUKWE^YRp zsC-#b@j?l-;n!dKDvq<JK-=sx3tS}ry6NAoH1c*^2JMoB9`~v{^N5{n=9gRVZ51`W z`Y!Kt9sGrwrgs~3E*!lh0V|FDXNd$qe-)6_5&Te;9E?ci8XtQ#&Z_C=;_9(p6~rAK z_l(2zW@@XvcDHNcquP(9p{LJ{7iOz-FZ{lUyg`((6S@H^#kMt@EiP_IP9Wl+N#Edi zZ;N<5-&Drub|`N-<C+__Tbc*mQkov&8XFd2sx=p>@wwHtw7B`DggvtLn>~~TyIXy+ zyC1fsUac=I`4(1`J+-3VNohTJ)0%sAB>C~1OUS2#W$Xa0y)E6Fi)%|qHdn{jISNNC zb=dyqB!Xo9KbhnfPB3h2Y|yB%Nr;EeiNXc9zEuniT~Y4{eB-TFR#VSWCA26E{n#q1 zS>HqKc=bP?C=8InMm@0^&pB5hA0dYg9<mE1#n{g`?m{KmaU=1bV<u&>K%`u%E73N% z5R0MjhLl7$zsj+zBTdr}6@!Ixq6wL`o&tn0QFvdWUP1{-sHE%*Vp>7yGmELSGGmZd z!SYMe&?ZEhvAa%F`V4eOk_Ktj-z3~@F$qwg$Ihx`?1oFX(GovST*@CjgO1wKgyIf7 zY{%GOrUE}vd6?iYL_6XJv*l3-^#A?<h~6HRjgPQ)>F&R7!NKC8O<@~<{<SeLh%RL# zN8W59@i`ruU-jJ#&piq1`QF
hd}_2CwK78)Pl;a)m&v*VD8Fj<#fJUKbubzB^C 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 literal 0 HcmV?d00001 diff --git a/src/config/types.ts b/src/config/types.ts index d557f2afde..62f63d4a3c 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -17,6 +17,7 @@ export type Source = { }; name?: string; description?: string; + welcome_bg_url?: string; url: string; port: number; https?: { [x: string]: string }; diff --git a/webpack.config.ts b/webpack.config.ts index 8376cd9c40..480f5d4a7a 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -85,7 +85,8 @@ const consts = { _HOSTNAME_: config.hostname, _URL_: config.url, _LICENSE_: licenseHtml, - _GOOGLE_MAPS_API_KEY_: config.google_maps_api_key + _GOOGLE_MAPS_API_KEY_: config.google_maps_api_key, + _WELCOME_BG_URL_: config.welcome_bg_url }; const _consts = {}; From 392cb1ba893a66f7912e6b3738239d0fe7a41f90 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 15 Jun 2018 19:57:13 +0900 Subject: [PATCH 319/369] 2.41.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5643a8fb18..12e4cf870c 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.40.1", - "clientVersion": "1.0.6504", + "version": "2.41.0", + "clientVersion": "1.0.6510", "codename": "nighthike", "main": "./built/index.js", "private": true, From 07265f594ba857a6829b62cb37a06781970bb901 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 15 Jun 2018 19:58:04 +0900 Subject: [PATCH 320/369] :v: --- src/client/app/desktop/views/pages/welcome.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index a3ca98eb6f..9687eea2ec 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -47,7 +47,7 @@ <script lang="ts"> import Vue from 'vue'; -import { host, copyright, welcomeBgUrl } from '../../../config'; +import { host, name, description, copyright, welcomeBgUrl } from '../../../config'; export default Vue.extend({ data() { @@ -55,7 +55,9 @@ export default Vue.extend({ stats: null, copyright, welcomeBgUrl, - host + host, + name, + description }; }, created() { From 7c596be6383b1fd8d29ad0d58f3c27add25df0bd Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 15 Jun 2018 19:58:15 +0900 Subject: [PATCH 321/369] 2.41.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 12e4cf870c..64ba6d70f2 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.41.0", - "clientVersion": "1.0.6510", + "version": "2.41.1", + "clientVersion": "1.0.6512", "codename": "nighthike", "main": "./built/index.js", "private": true, From fa5a82c9ab43b38f8d33a849924220b5ee1d2083 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 16 Jun 2018 07:06:58 +0900 Subject: [PATCH 322/369] :v: --- .../app/common/views/components/signin.vue | 2 +- .../app/common/views/components/ui/input.vue | 45 +++++++++++++------ 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/client/app/common/views/components/signin.vue b/src/client/app/common/views/components/signin.vue index 66e0c68e30..d876fc7a0c 100644 --- a/src/client/app/common/views/components/signin.vue +++ b/src/client/app/common/views/components/signin.vue @@ -1,6 +1,6 @@ <template> <form class="mk-signin" :class="{ signing }" @submit.prevent="onSubmit"> - <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" autofocus required @change="onUsernameChange"> + <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @change="onUsernameChange"> <span>%i18n:@username%</span> <span slot="prefix">@</span> <span slot="suffix">@{{ host }}</span> diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue index 525ff71c08..0d11c14131 100644 --- a/src/client/app/common/views/components/ui/input.vue +++ b/src/client/app/common/views/components/ui/input.vue @@ -1,7 +1,7 @@ <template> <div class="ui-input" :class="[{ focused, filled }, styl]"> <div class="icon" ref="icon"><slot name="icon"></slot></div> - <div class="input" @click="focus" @mousedown="focus"> + <div class="input"> <div class="password-meter" v-if="withPasswordMeter" v-show="passwordStrength != ''" :data-strength="passwordStrength"> <div class="value" ref="passwordMetar"></div> </div> @@ -30,7 +30,7 @@ :value="value" @change="onChangeFile"> </template> - <div class="suffix"><slot name="suffix"></slot></div> + <div class="suffix" ref="suffix"><slot name="suffix"></slot></div> </div> <div class="text"><slot name="text"></slot></div> </div> @@ -128,6 +128,14 @@ export default Vue.extend({ mounted() { if (this.$refs.prefix) { this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px'; + if (this.$refs.prefix.offsetWidth) { + this.$refs.input.style.paddingLeft = this.$refs.prefix.offsetWidth + 'px'; + } + } + if (this.$refs.suffix) { + if (this.$refs.suffix.offsetWidth) { + this.$refs.input.style.paddingRight = this.$refs.suffix.offsetWidth + 'px'; + } } }, methods: { @@ -165,14 +173,8 @@ root(isDark, fill) margin-left 28px > .input - display flex - cursor text - if fill - padding 6px 12px - background rgba(#000, 0.035) - border-radius 6px - else + if !fill &:before content '' display block @@ -232,6 +234,7 @@ root(isDark, fill) > .label position absolute + z-index 1 top fill ? 6px : 0 left 0 pointer-events none @@ -247,7 +250,6 @@ root(isDark, fill) > input display block - flex 1 width 100% margin 0 padding 0 @@ -262,29 +264,46 @@ root(isDark, fill) outline none box-shadow none + if fill + padding 6px 12px + background rgba(#000, 0.035) + border-radius 6px + &[type='file'] display none > .prefix > .suffix display block - align-self center - justify-self center + position absolute + z-index 1 + top 0 font-size 16px - line-height 32px + line-height fill ? 44px : 32px color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54) pointer-events none + &:empty + display none + > * display block min-width 16px > .prefix + left 0 padding-right 4px + if fill + padding-left 12px + > .suffix + right 0 padding-left 4px + if fill + padding-right 12px + > .text margin 6px 0 font-size 13px From b600d462c11c08d42d017aa64ee6a9ed9aa95d03 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 16 Jun 2018 07:13:45 +0900 Subject: [PATCH 323/369] :v: --- src/client/app/desktop/views/pages/welcome.vue | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 9687eea2ec..6f6a1b8665 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -57,7 +57,8 @@ export default Vue.extend({ welcomeBgUrl, host, name, - description + description, + pointerInterval: null }; }, created() { @@ -66,11 +67,18 @@ export default Vue.extend({ }); }, mounted() { - const x = this.$refs.signup.getBoundingClientRect(); - this.$refs.pointer.style.top = x.top + x.height + 'px'; - this.$refs.pointer.style.left = x.left + 'px'; + this.point(); + this.pointerInterval = setInterval(this.point, 100); + }, + beforeDestroy() { + clearInterval(this.pointerInterval); }, methods: { + point() { + const x = this.$refs.signup.getBoundingClientRect(); + this.$refs.pointer.style.top = x.top + x.height + 'px'; + this.$refs.pointer.style.left = x.left + 'px'; + }, signup() { this.$modal.show('signup'); }, @@ -109,7 +117,7 @@ root(isDark) right 0 width 180px margin 0 0 0 -180px - transform rotateY(180deg) translateX(-10px) translateY(-25px) + transform rotateY(180deg) translateX(-10px) translateY(-48px) pointer-events none > button From 65f35dc9f418c430d1a3cd42b6d53d128fe4e498 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 16 Jun 2018 07:31:35 +0900 Subject: [PATCH 324/369] :v: --- .../app/common/views/components/signin.vue | 90 +++---------------- .../app/desktop/views/pages/welcome.vue | 48 +++++----- 2 files changed, 38 insertions(+), 100 deletions(-) diff --git a/src/client/app/common/views/components/signin.vue b/src/client/app/common/views/components/signin.vue index d876fc7a0c..3473d313c8 100644 --- a/src/client/app/common/views/components/signin.vue +++ b/src/client/app/common/views/components/signin.vue @@ -1,6 +1,7 @@ <template> <form class="mk-signin" :class="{ signing }" @submit.prevent="onSubmit"> - <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @change="onUsernameChange"> + <div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }"></div> + <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @input="onUsernameChange"> <span>%i18n:@username%</span> <span slot="prefix">@</span> <span slot="suffix">@{{ host }}</span> @@ -37,6 +38,8 @@ export default Vue.extend({ username: this.username }).then(user => { this.user = user; + }, () => { + this.user = null; }); }, onSubmit() { @@ -61,84 +64,19 @@ export default Vue.extend({ @import '~const.styl' .mk-signin + color #555 + &.signing &, * cursor wait !important - label - display block - margin 12px 0 - - [data-fa] - display block - pointer-events none - position absolute - bottom 0 - top 0 - left 0 - z-index 1 - margin auto - padding 0 16px - height 1em - color #898786 - - input[type=text] - input[type=password] - input[type=number] - user-select text - display inline-block - cursor auto - padding 0 0 0 38px - margin 0 - width 100% - line-height 44px - font-size 1em - color rgba(#000, 0.7) - background #fff - outline none - border solid 1px #eee - border-radius 4px - - &:hover - background rgba(255, 255, 255, 0.7) - border-color #ddd - - & + i - color #797776 - - &:focus - background #fff - border-color #ccc - - & + i - color #797776 - - [type=submit] - cursor pointer - padding 16px - margin -6px 0 0 0 - width 100% - font-size 1.2em - color rgba(#000, 0.5) - outline none - border none - border-radius 0 - background transparent - transition all .5s ease - - &:hover - color $theme-color - transition all .2s ease - - &:focus - color $theme-color - transition all .2s ease - - &:active - color darken($theme-color, 30%) - transition all .2s ease - - &:disabled - opacity 0.7 + > .avatar + margin 16px auto 0 auto + width 64px + height 64px + background #ddd + background-position center + background-size cover + border-radius 100% </style> diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 6f6a1b8665..e7b09331be 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -7,13 +7,6 @@ </button> <div class="body" :style="{ backgroundImage: `url('${ welcomeBgUrl }')` }"> <div class="container"> - <div class="info"> - <span>%i18n:common.misskey% <b>{{ host }}</b></span> - <span class="stats" v-if="stats"> - <span>%fa:user% {{ stats.originalUsersCount | number }}</span> - <span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span> - </span> - </div> <main> <div class="about"> <h1 v-if="name">{{ name }}</h1> @@ -26,6 +19,13 @@ <mk-signin/> </div> </main> + <div class="info"> + <span>%i18n:common.misskey% <b>{{ host }}</b></span> + <span class="stats" v-if="stats"> + <span>%fa:user% {{ stats.originalUsersCount | number }}</span> + <span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span> + </span> + </div> <mk-nav class="nav"/> </div> <mk-forkit class="forkit"/> @@ -165,23 +165,6 @@ root(isDark) $loginWidth = 340px $width = $aboutWidth + $loginWidth - > .info - margin 0 auto 16px auto - padding 12px - width $width - font-size 14px - color #fff - background rgba(#000, 0.2) - border-radius 8px - - > .stats - margin-left 16px - padding-left 16px - border-left solid 1px #fff - - > * - margin-right 16px - > main display flex margin auto @@ -222,6 +205,23 @@ root(isDark) padding 16px 32px 32px 32px background #f5f5f5 + > .info + margin 16px auto + padding 12px + width $width + font-size 14px + color #fff + background rgba(#000, 0.2) + border-radius 8px + + > .stats + margin-left 16px + padding-left 16px + border-left solid 1px #fff + + > * + margin-right 16px + > .nav display block margin 16px 0 From c9d993b83849cab7599fac3948f76c8f5f196899 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 16 Jun 2018 07:40:07 +0900 Subject: [PATCH 325/369] :v: --- .../app/common/views/components/signin.vue | 9 ++- .../app/desktop/views/pages/welcome.vue | 4 -- src/client/app/mobile/views/pages/welcome.vue | 71 ++++++------------- 3 files changed, 28 insertions(+), 56 deletions(-) diff --git a/src/client/app/common/views/components/signin.vue b/src/client/app/common/views/components/signin.vue index 3473d313c8..58241cef09 100644 --- a/src/client/app/common/views/components/signin.vue +++ b/src/client/app/common/views/components/signin.vue @@ -1,6 +1,6 @@ <template> <form class="mk-signin" :class="{ signing }" @submit.prevent="onSubmit"> - <div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }"></div> + <div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }" v-show="withAvatar"></div> <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @input="onUsernameChange"> <span>%i18n:@username%</span> <span slot="prefix">@</span> @@ -21,6 +21,13 @@ import Vue from 'vue'; import { apiUrl, host } from '../../../config'; export default Vue.extend({ + props: { + withAvatar: { + type: Boolean, + required: false, + default: true + } + }, data() { return { signing: false, diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index e7b09331be..70fa0123af 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -38,10 +38,6 @@ <header :class="$style.signupFormHeader">%i18n:@signup%</header> <mk-signup :class="$style.signupForm"/> </modal> - <modal name="signin" width="500px" height="auto" scrollable> - <header :class="$style.signinFormHeader">%i18n:@signin%</header> - <mk-signin :class="$style.signinForm"/> - </modal> </div> </template> diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue index 79648ac425..cd8f5841e7 100644 --- a/src/client/app/mobile/views/pages/welcome.vue +++ b/src/client/app/mobile/views/pages/welcome.vue @@ -9,26 +9,15 @@ <router-link class="signup" to="/signup">新規登録</router-link> </div> <div class="login"> - <form @submit.prevent="onSubmit"> - <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" autofocus required @change="onUsernameChange"> - <span>ユーザー名</span> - <span slot="prefix">@</span> - <span slot="suffix">@{{ host }}</span> - </ui-input> - <ui-input v-model="password" type="password" required> - <span>パスワード</span> - <span slot="prefix">%fa:lock%</span> - </ui-input> - <ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/> - <ui-button type="submit" :disabled="signing">{{ signing ? 'ログインしています' : 'ログイン' }}</ui-button> - </form> - <div style="margin: 8px 0;"> - <a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a> - </div> + <mk-signin :with-avatar="false"/> </div> <div class="tl"> <mk-welcome-timeline/> </div> + <div class="stats" v-if="stats"> + <span>%fa:user% {{ stats.originalUsersCount | number }}</span> + <span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span> + </div> <footer> <small>{{ copyright }}</small> </footer> @@ -43,49 +32,18 @@ import { apiUrl, copyright, host, name, description } from '../../../config'; export default Vue.extend({ data() { return { - signing: false, - user: null, - username: '', - password: '', - token: '', apiUrl, copyright, - users: [], + stats: null, host, name, description }; }, - mounted() { - (this as any).api('users', { - sort: '+follower', - limit: 20 - }).then(users => { - this.users = users; + created() { + (this as any).api('stats').then(stats => { + this.stats = stats; }); - }, - methods: { - onUsernameChange() { - (this as any).api('users/show', { - username: this.username - }).then(user => { - this.user = user; - }); - }, - onSubmit() { - this.signing = true; - - (this as any).api('signin', { - username: this.username, - password: this.password, - token: this.user && this.user.twoFactorEnabled ? this.token : undefined - }).then(() => { - location.reload(); - }).catch(() => { - alert('something happened'); - this.signing = false; - }); - } } }); </script> @@ -164,6 +122,17 @@ export default Vue.extend({ overflow auto -webkit-overflow-scrolling touch + > .stats + margin 16px 0 + padding 8px + font-size 14px + color #444 + background rgba(#000, 0.1) + border-radius 6px + + > * + margin 0 8px + > footer text-align center color #444 From f164661ef246b62dfbc87feb0a37b8396ffabdb9 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 16 Jun 2018 07:40:39 +0900 Subject: [PATCH 326/369] 2.42.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 64ba6d70f2..6aea76fc37 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.41.1", - "clientVersion": "1.0.6512", + "version": "2.42.0", + "clientVersion": "1.0.6517", "codename": "nighthike", "main": "./built/index.js", "private": true, From e11f547308af19c5ae54a906cec795e65f407b8c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 16 Jun 2018 10:40:53 +0900 Subject: [PATCH 327/369] #1715 --- CHANGELOG.md | 11 +++++++ cli/recount-stats.js | 42 +++++++++++++++++++++++++ package.json | 2 +- src/models/meta.ts | 6 ++++ src/remote/activitypub/models/person.ts | 9 ++++++ src/server/api/endpoints/stats.ts | 24 +++----------- src/server/api/private/signup.ts | 10 ++++++ src/services/note/create.ts | 20 +++++++++++- 8 files changed, 102 insertions(+), 22 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 cli/recount-stats.js diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000..614d50d0ff --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,11 @@ +ChangeLog +========= + +3.0.0 +----- + +### Migration + +起動する前に、`node cli/recount-stats`してください。 + +Please run `node cli/recount-stats` before launch. diff --git a/cli/recount-stats.js b/cli/recount-stats.js new file mode 100644 index 0000000000..84cb5d0f57 --- /dev/null +++ b/cli/recount-stats.js @@ -0,0 +1,42 @@ +const { default: Note } = require('../built/models/note'); +const { default: Meta } = require('../built/models/meta'); +const { default: User } = require('../built/models/user'); + +async function main() { + const meta = await Meta.findOne({}); + + const notesCount = await Note.count(); + + const usersCount = await User.count(); + + const originalNotesCount = await Note.count({ + '_user.host': null + }); + + const originalUsersCount = await User.count({ + host: null + }); + + const stats = { + notesCount, + usersCount, + originalNotesCount, + originalUsersCount + }; + + if (meta) { + await Meta.update({}, { + $set: { + stats + } + }); + } else { + await Meta.insert({ + stats + }); + } +} + +main().then(() => { + console.log('done'); +}).catch(console.error); diff --git a/package.json b/package.json index 6aea76fc37..72cbc7356b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "2.42.0", + "version": "3.0.0", "clientVersion": "1.0.6517", "codename": "nighthike", "main": "./built/index.js", diff --git a/src/models/meta.ts b/src/models/meta.ts index 710bb23382..11b9b186ce 100644 --- a/src/models/meta.ts +++ b/src/models/meta.ts @@ -5,4 +5,10 @@ export default Meta; export type IMeta = { broadcasts: any[]; + stats: { + notesCount: number; + originalNotesCount: number; + usersCount: number; + originalUsersCount: number; + }; }; diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts index 96e73406b2..42ee5a27df 100644 --- a/src/remote/activitypub/models/person.ts +++ b/src/remote/activitypub/models/person.ts @@ -10,6 +10,7 @@ import Resolver from '../resolver'; import { resolveImage } from './image'; import { isCollectionOrOrderedCollection, IObject, IPerson } from '../type'; import { IDriveFile } from '../../../models/drive-file'; +import Meta from '../../../models/meta'; const log = debug('misskey:activitypub'); @@ -117,6 +118,14 @@ export async function createPerson(value: any, resolver?: Resolver): Promise<IUs throw e; } + //#region Increment users count + Meta.update({}, { + $inc: { + 'stats.usersCount': 1 + } + }, { upsert: true }); + //#endregion + //#region アイコンとヘッダー画像をフェッチ const [avatar, banner] = (await Promise.all<IDriveFile>([ person.icon, diff --git a/src/server/api/endpoints/stats.ts b/src/server/api/endpoints/stats.ts index d1e17651f2..74ab6ba945 100644 --- a/src/server/api/endpoints/stats.ts +++ b/src/server/api/endpoints/stats.ts @@ -1,26 +1,10 @@ -import Note from '../../../models/note'; -import User from '../../../models/user'; +import Meta from '../../../models/meta'; /** * Get the misskey's statistics */ -module.exports = params => new Promise(async (res, rej) => { - const notesCount = await Note.count(); +module.exports = () => new Promise(async (res, rej) => { + const meta = await Meta.findOne(); - const usersCount = await User.count(); - - const originalNotesCount = await Note.count({ - '_user.host': null - }); - - const originalUsersCount = await User.count({ - host: null - }); - - res({ - notesCount, - usersCount, - originalNotesCount, - originalUsersCount - }); + res(meta.stats); }); diff --git a/src/server/api/private/signup.ts b/src/server/api/private/signup.ts index 14d4b8a3fc..fee899b374 100644 --- a/src/server/api/private/signup.ts +++ b/src/server/api/private/signup.ts @@ -5,6 +5,7 @@ import recaptcha = require('recaptcha-promise'); import User, { IUser, validateUsername, validatePassword, pack } from '../../../models/user'; import generateUserToken from '../common/generate-native-user-token'; import config from '../../../config'; +import Meta from '../../../models/meta'; recaptcha.init({ secret_key: config.recaptcha.secret_key @@ -93,6 +94,15 @@ export default async (ctx: Koa.Context) => { } }); + //#region Increment users count + Meta.update({}, { + $inc: { + 'stats.usersCount': 1, + 'stats.originalUsersCount': 1 + } + }, { upsert: true }); + //#endregion + // Response ctx.body = await pack(account); }; diff --git a/src/services/note/create.ts b/src/services/note/create.ts index f74d04ae62..b21bfa316e 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -18,6 +18,7 @@ import parse from '../../text/parse'; import { IApp } from '../../models/app'; import UserList from '../../models/user-list'; import resolveUser from '../../remote/resolve-user'; +import Meta from '../../models/meta'; type Reason = 'reply' | 'quote' | 'mention'; @@ -167,7 +168,24 @@ export default async (user: IUser, data: { res(note); - // Increment notes count + //#region Increment notes count + if (isLocalUser(user)) { + Meta.update({}, { + $inc: { + 'stats.notesCount': 1, + 'stats.originalNotesCount': 1 + } + }, { upsert: true }); + } else { + Meta.update({}, { + $inc: { + 'stats.notesCount': 1 + } + }, { upsert: true }); + } + //#endregion + + // Increment notes count (user) User.update({ _id: user._id }, { $inc: { notesCount: 1 From 2864a9027f8baee64f972a91e36cb7a83cef8647 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 16 Jun 2018 12:02:38 +0900 Subject: [PATCH 328/369] save-exact=true --- .npmrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.npmrc b/.npmrc index c1ca392fea..2fcf1d76c2 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,2 @@ package-lock = false +save-exact=true From cc2947063adaf13fb6d34910be17c636c3bf2272 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 16 Jun 2018 12:42:59 +0900 Subject: [PATCH 329/369] add lock file --- yarn.lock | 11915 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 11915 insertions(+) create mode 100644 yarn.lock diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000000..014a443d0d --- /dev/null +++ b/yarn.lock @@ -0,0 +1,11915 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@fortawesome/fontawesome-free-brands@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-brands/-/fontawesome-free-brands-5.0.2.tgz#a1cc602eec40a379a3dd8a44c78b31110dd3d3d3" + +"@fortawesome/fontawesome-free-regular@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-regular/-/fontawesome-free-regular-5.0.2.tgz#429af86bed14689f87648e6322983c65c782c017" + +"@fortawesome/fontawesome-free-solid@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-solid/-/fontawesome-free-solid-5.0.2.tgz#090ce2c59dd5ec76983f3da8a43e1ab0321b42d5" + +"@fortawesome/fontawesome@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome/-/fontawesome-1.0.1.tgz#8ac60e1e7b437889baf9c9d6e3a61ef3b637170d" + +"@gulp-sourcemaps/identity-map@1.X": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz#cfa23bc5840f9104ce32a65e74db7e7a974bbee1" + dependencies: + acorn "^5.0.3" + css "^2.2.1" + normalize-path "^2.1.1" + source-map "^0.5.6" + through2 "^2.0.3" + +"@gulp-sourcemaps/map-sources@1.X": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda" + dependencies: + normalize-path "^2.0.1" + through2 "^2.0.3" + +"@koa/cors@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@koa/cors/-/cors-2.2.1.tgz#c06a1c34d787e3cee79c0d4c20e8952d1b6d75c5" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.0.1": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz#50c1e2260ac0ed9439a181de3725a0168d59c48a" + +"@prezzemolo/rap@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@prezzemolo/rap/-/rap-0.1.2.tgz#01f8a60bb61de33822fc632563fb8b23e574854e" + +"@prezzemolo/zip@0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@prezzemolo/zip/-/zip-0.0.3.tgz#6532d4bcd77c6a95e3a90ca5388a09b532a1f8e4" + +"@samverschueren/stream-to-observable@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" + dependencies: + any-observable "^0.3.0" + +"@sindresorhus/is@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" + +"@types/accepts@*": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" + dependencies: + "@types/node" "*" + +"@types/babel-types@*", "@types/babel-types@^7.0.0": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.3.tgz#9dc5316090ad99cd2679051ab21a5676c90a2bcc" + +"@types/babylon@^6.16.2": + version "6.16.3" + resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.3.tgz#c2937813a89fcb5e79a00062fc4a8b143e7237bb" + dependencies: + "@types/babel-types" "*" + +"@types/bcryptjs@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.1.tgz#7fb63922b5b106edacdcfe084cd38850f78aacfc" + +"@types/body-parser@*": + version "1.17.0" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bson@*": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/bson/-/bson-1.0.8.tgz#6ad272b3f049e9598ec33aed09cf56d8946b75f1" + dependencies: + "@types/node" "*" + +"@types/caseless@*": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.1.tgz#9794c69c8385d0192acc471a540d1f8e0d16218a" + +"@types/cheerio@^0.22.5": + version "0.22.7" + resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.7.tgz#4a92eafedfb2b9f4437d3a4410006d81114c66ce" + +"@types/clean-css@*": + version "3.4.30" + resolved "https://registry.yarnpkg.com/@types/clean-css/-/clean-css-3.4.30.tgz#0052c136f5248002428e3638b37de4a39818641d" + +"@types/connect@*": + version "3.4.32" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" + dependencies: + "@types/node" "*" + +"@types/cookies@*": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.1.tgz#f9f204bd6767d389eea3b87609e30c090c77a540" + dependencies: + "@types/connect" "*" + "@types/express" "*" + "@types/keygrip" "*" + "@types/node" "*" + +"@types/debug@0.0.30": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-0.0.30.tgz#dc1e40f7af3b9c815013a7860e6252f6352a84df" + +"@types/deep-equal@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/deep-equal/-/deep-equal-1.0.1.tgz#71cfabb247c22bcc16d536111f50c0ed12476b03" + +"@types/elasticsearch@5.0.23": + version "5.0.23" + resolved "https://registry.yarnpkg.com/@types/elasticsearch/-/elasticsearch-5.0.23.tgz#235622772a7c7f3ccedd0dc9769dfcfe20eed1ec" + +"@types/events@*": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" + +"@types/express-serve-static-core@*": + version "4.16.0" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz#fdfe777594ddc1fe8eb8eccce52e261b496e43e7" + dependencies: + "@types/events" "*" + "@types/node" "*" + "@types/range-parser" "*" + +"@types/express@*": + version "4.16.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.0.tgz#6d8bc42ccaa6f35cf29a2b7c3333cb47b5a32a19" + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/serve-static" "*" + +"@types/fancy-log@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@types/fancy-log/-/fancy-log-1.3.0.tgz#a61ab476e5e628cd07a846330df53b85e05c8ce0" + +"@types/form-data@*": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.2.1.tgz#ee2b3b8eaa11c0938289953606b745b738c54b1e" + dependencies: + "@types/node" "*" + +"@types/glob@*": + version "5.0.35" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.35.tgz#1ae151c802cece940443b5ac246925c85189f32a" + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/gm@1.18.0": + version "1.18.0" + resolved "https://registry.yarnpkg.com/@types/gm/-/gm-1.18.0.tgz#49be90ff74286fcdc23b00f13d3699e6dfaceef2" + dependencies: + "@types/node" "*" + +"@types/gulp-htmlmin@1.3.32": + version "1.3.32" + resolved "https://registry.yarnpkg.com/@types/gulp-htmlmin/-/gulp-htmlmin-1.3.32.tgz#342baec649f285c7cbd78dfcf54dd17c388bde2b" + dependencies: + "@types/html-minifier" "*" + "@types/node" "*" + +"@types/gulp-mocha@0.0.32": + version "0.0.32" + resolved "https://registry.yarnpkg.com/@types/gulp-mocha/-/gulp-mocha-0.0.32.tgz#dbc425e804a8354236c31ab23406222a8ab9bdaf" + dependencies: + "@types/mocha" "*" + "@types/node" "*" + +"@types/gulp-rename@0.0.33": + version "0.0.33" + resolved "https://registry.yarnpkg.com/@types/gulp-rename/-/gulp-rename-0.0.33.tgz#38d146e97786569f74f5391a1b1f9b5198674b6c" + dependencies: + "@types/node" "*" + +"@types/gulp-replace@0.0.31": + version "0.0.31" + resolved "https://registry.yarnpkg.com/@types/gulp-replace/-/gulp-replace-0.0.31.tgz#87c3ac90b437694c58d68d1da677fcaff38b25ff" + dependencies: + "@types/node" "*" + +"@types/gulp-uglify@3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/gulp-uglify/-/gulp-uglify-3.0.5.tgz#ddcbbb6bd15a84b8a6c5e2218c2efba98102d135" + dependencies: + "@types/node" "*" + "@types/uglify-js" "^2" + +"@types/gulp-util@3.0.34": + version "3.0.34" + resolved "https://registry.yarnpkg.com/@types/gulp-util/-/gulp-util-3.0.34.tgz#d1291ebf706d93f46eb8df11344bbfd96247697e" + dependencies: + "@types/node" "*" + "@types/through2" "*" + "@types/vinyl" "*" + chalk "^2.2.0" + +"@types/gulp@3.8.36": + version "3.8.36" + resolved "https://registry.yarnpkg.com/@types/gulp/-/gulp-3.8.36.tgz#11eaf583bf0534669b4ffa9bfed51557faa00a4c" + dependencies: + "@types/node" "*" + "@types/orchestrator" "*" + "@types/vinyl" "*" + +"@types/html-minifier@*": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@types/html-minifier/-/html-minifier-3.5.2.tgz#f897a13d847a774e9b6fd91497e9b0e0ead71c35" + dependencies: + "@types/clean-css" "*" + "@types/relateurl" "*" + "@types/uglify-js" "*" + +"@types/http-assert@*": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.3.0.tgz#5e932606153da28e1d04f9043f4912cf61fd55dd" + +"@types/inquirer@0.0.41": + version "0.0.41" + resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-0.0.41.tgz#0c33027dcd0b0dde234e22afa454f2c75d8b30d2" + dependencies: + "@types/rx" "*" + "@types/through" "*" + +"@types/is-root@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/is-root/-/is-root-1.0.0.tgz#1cf41787243a8f030eb737a9aaf08b071e4f2453" + +"@types/is-url@1.2.28": + version "1.2.28" + resolved "https://registry.yarnpkg.com/@types/is-url/-/is-url-1.2.28.tgz#914dabd50546d9b0142806e42c72bc7c2b7e0787" + +"@types/js-yaml@3.11.1": + version "3.11.1" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.11.1.tgz#ac5bab26be5f9c6f74b6b23420f2cfa5a7a6ba40" + +"@types/keygrip@*": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.1.tgz#ff540462d2fb4d0a88441ceaf27d287b01c3d878" + +"@types/koa-bodyparser@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/koa-bodyparser/-/koa-bodyparser-4.2.0.tgz#04febc567f3d3dd40e3d1a0e095cdf7b07c4d7ce" + dependencies: + "@types/koa" "*" + +"@types/koa-compose@*": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.2.tgz#dc106e000bbf92a3ac900f756df47344887ee847" + +"@types/koa-compress@2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@types/koa-compress/-/koa-compress-2.0.8.tgz#426a2fac419aff7d1a7d87fd78203bf0d26a94fb" + dependencies: + "@types/koa" "*" + "@types/node" "*" + +"@types/koa-favicon@2.0.19": + version "2.0.19" + resolved "https://registry.yarnpkg.com/@types/koa-favicon/-/koa-favicon-2.0.19.tgz#a1b584fd64c99f16710633272292bf7d4b0ca1fa" + dependencies: + "@types/koa" "*" + +"@types/koa-logger@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/koa-logger/-/koa-logger-3.1.0.tgz#133acdbc56d87b5a559cab25528b087381a8fc0d" + dependencies: + "@types/koa" "*" + +"@types/koa-mount@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/koa-mount/-/koa-mount-3.0.1.tgz#2c068d1696b173c62c316158210c4316c4401f57" + dependencies: + "@types/koa" "*" + +"@types/koa-multer@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/koa-multer/-/koa-multer-1.0.0.tgz#f449f399ac3f80c05753452f000e8694ceec4249" + dependencies: + "@types/koa" "*" + +"@types/koa-router@7.0.28": + version "7.0.28" + resolved "https://registry.yarnpkg.com/@types/koa-router/-/koa-router-7.0.28.tgz#67487c862a831099aed8864a8996bfa7e989edc0" + dependencies: + "@types/koa" "*" + +"@types/koa-send@4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@types/koa-send/-/koa-send-4.1.1.tgz#88f57cbe0343c8204903f9096d8ff6b98ec3296f" + dependencies: + "@types/koa" "*" + +"@types/koa-views@2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/koa-views/-/koa-views-2.0.3.tgz#38fc1f3027503acba73a93fe06678813f306779b" + dependencies: + "@types/koa" "*" + +"@types/koa@*": + version "2.0.46" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.0.46.tgz#24bc3cd405d10fcde81f876cd8285b44d4ddc3e9" + dependencies: + "@types/accepts" "*" + "@types/cookies" "*" + "@types/events" "*" + "@types/http-assert" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/koa@2.0.45": + version "2.0.45" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.0.45.tgz#133cbda6cc8d12b73434b5d9663898c833f80aa2" + dependencies: + "@types/accepts" "*" + "@types/cookies" "*" + "@types/events" "*" + "@types/http-assert" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/koa__cors@2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@types/koa__cors/-/koa__cors-2.2.2.tgz#03d7cf3b076d5dfab8a5444ac6c5df5173147de8" + dependencies: + "@types/koa" "*" + +"@types/kue@0.11.8": + version "0.11.8" + resolved "https://registry.yarnpkg.com/@types/kue/-/kue-0.11.8.tgz#820f5e3db6025f0411e0942cd3ccab461a060c90" + dependencies: + "@types/express" "*" + "@types/node" "*" + "@types/redis" "*" + +"@types/license-checker@15.0.0": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@types/license-checker/-/license-checker-15.0.0.tgz#685d69e2cf61ffd862320434601f51c85e28bba1" + +"@types/mime@*": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b" + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + +"@types/mkdirp@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" + dependencies: + "@types/node" "*" + +"@types/mocha@*": + version "5.2.2" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.2.tgz#202d2b8fe1364c5b617b439b26a54f0e75eac0a7" + +"@types/mocha@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.0.tgz#b3c8e69f038835db1a7fdc0b3d879fc50506e29e" + +"@types/mongodb@3.0.18": + version "3.0.18" + resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.0.18.tgz#e5775ba9c15bf1601e57ada52d9fcbc6d6095d18" + dependencies: + "@types/bson" "*" + "@types/events" "*" + "@types/node" "*" + +"@types/ms@0.7.30": + version "0.7.30" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.30.tgz#f6c38b7ecbbf698b0bbd138315a0f0f18954f85f" + +"@types/node@*": + version "10.3.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.3.3.tgz#8798d9e39af2fa604f715ee6a6b19796528e46c3" + +"@types/node@10.1.2": + version "10.1.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.1.2.tgz#1b928a0baa408fc8ae3ac012cc81375addc147c6" + +"@types/node@^8.0.47": + version "8.10.20" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.20.tgz#fe674ea52e13950ab10954433a7824438aabbcac" + +"@types/nopt@3.0.29": + version "3.0.29" + resolved "https://registry.yarnpkg.com/@types/nopt/-/nopt-3.0.29.tgz#f19df3db4c97ee1459a2740028320a71d70964ce" + +"@types/orchestrator@*": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@types/orchestrator/-/orchestrator-0.3.2.tgz#cd15c6cea978a32b98e5054239cbcc78e55671f1" + dependencies: + "@types/node" "*" + "@types/q" "*" + +"@types/parse5@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-3.0.0.tgz#b63305718d82af42a9e5da79c56ecfc1f32e32c0" + dependencies: + parse5 "*" + +"@types/pug@2.0.4", "@types/pug@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.4.tgz#8772fcd0418e3cd2cc171555d73007415051f4b2" + +"@types/q@*": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.0.tgz#87567ea1206935405e51c03635b6cbf3a01f7bc4" + +"@types/qrcode@0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@types/qrcode/-/qrcode-0.8.1.tgz#5776cb5da299cfa7cee2610f59997acad90ad38d" + dependencies: + "@types/node" "*" + +"@types/range-parser@*": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.2.tgz#fa8e1ad1d474688a757140c91de6dace6f4abc8d" + +"@types/ratelimiter@2.1.28": + version "2.1.28" + resolved "https://registry.yarnpkg.com/@types/ratelimiter/-/ratelimiter-2.1.28.tgz#cf6371e6d9b1d236e3f0b25889a6d52aed2e0e22" + dependencies: + "@types/redis" "*" + +"@types/redis@*", "@types/redis@2.8.6": + version "2.8.6" + resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.6.tgz#3674d07a13ad76bccda4c37dc3909e4e95757e7e" + dependencies: + "@types/events" "*" + "@types/node" "*" + +"@types/relateurl@*": + version "0.2.28" + resolved "https://registry.yarnpkg.com/@types/relateurl/-/relateurl-0.2.28.tgz#6bda7db8653fa62643f5ee69e9f69c11a392e3a6" + +"@types/request-promise-native@1.0.14": + version "1.0.14" + resolved "https://registry.yarnpkg.com/@types/request-promise-native/-/request-promise-native-1.0.14.tgz#20f2ba136e6f29c2ea745c60767738d434793d31" + dependencies: + "@types/request" "*" + +"@types/request@*": + version "2.47.1" + resolved "https://registry.yarnpkg.com/@types/request/-/request-2.47.1.tgz#25410d3afbdac04c91a94ad9efc9824100735824" + dependencies: + "@types/caseless" "*" + "@types/form-data" "*" + "@types/node" "*" + "@types/tough-cookie" "*" + +"@types/request@2.47.0": + version "2.47.0" + resolved "https://registry.yarnpkg.com/@types/request/-/request-2.47.0.tgz#76a666cee4cb85dcffea6cd4645227926d9e114e" + dependencies: + "@types/caseless" "*" + "@types/form-data" "*" + "@types/node" "*" + "@types/tough-cookie" "*" + +"@types/rimraf@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.2.tgz#7f0fc3cf0ff0ad2a99bb723ae1764f30acaf8b6e" + dependencies: + "@types/glob" "*" + "@types/node" "*" + +"@types/rx-core-binding@*": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/rx-core-binding/-/rx-core-binding-4.0.4.tgz#d969d32f15a62b89e2862c17b3ee78fe329818d3" + dependencies: + "@types/rx-core" "*" + +"@types/rx-core@*": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/rx-core/-/rx-core-4.0.3.tgz#0b3354b1238cedbe2b74f6326f139dbc7a591d60" + +"@types/rx-lite-aggregates@*": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/rx-lite-aggregates/-/rx-lite-aggregates-4.0.3.tgz#6efb2b7f3d5f07183a1cb2bd4b1371d7073384c2" + dependencies: + "@types/rx-lite" "*" + +"@types/rx-lite-async@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/rx-lite-async/-/rx-lite-async-4.0.2.tgz#27fbf0caeff029f41e2d2aae638b05e91ceb600c" + dependencies: + "@types/rx-lite" "*" + +"@types/rx-lite-backpressure@*": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/rx-lite-backpressure/-/rx-lite-backpressure-4.0.3.tgz#05abb19bdf87cc740196c355e5d0b37bb50b5d56" + dependencies: + "@types/rx-lite" "*" + +"@types/rx-lite-coincidence@*": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/rx-lite-coincidence/-/rx-lite-coincidence-4.0.3.tgz#80bd69acc4054a15cdc1638e2dc8843498cd85c0" + dependencies: + "@types/rx-lite" "*" + +"@types/rx-lite-experimental@*": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/rx-lite-experimental/-/rx-lite-experimental-4.0.1.tgz#c532f5cbdf3f2c15da16ded8930d1b2984023cbd" + dependencies: + "@types/rx-lite" "*" + +"@types/rx-lite-joinpatterns@*": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/rx-lite-joinpatterns/-/rx-lite-joinpatterns-4.0.1.tgz#f70fe370518a8432f29158cc92ffb56b4e4afc3e" + dependencies: + "@types/rx-lite" "*" + +"@types/rx-lite-testing@*": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/rx-lite-testing/-/rx-lite-testing-4.0.1.tgz#21b19d11f4dfd6ffef5a9d1648e9c8879bfe21e9" + dependencies: + "@types/rx-lite-virtualtime" "*" + +"@types/rx-lite-time@*": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/rx-lite-time/-/rx-lite-time-4.0.3.tgz#0eda65474570237598f3448b845d2696f2dbb1c4" + dependencies: + "@types/rx-lite" "*" + +"@types/rx-lite-virtualtime@*": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/rx-lite-virtualtime/-/rx-lite-virtualtime-4.0.3.tgz#4b30cacd0fe2e53af29f04f7438584c7d3959537" + dependencies: + "@types/rx-lite" "*" + +"@types/rx-lite@*": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/rx-lite/-/rx-lite-4.0.5.tgz#b3581525dff69423798daa9a0d33c1e66a5e8c4c" + dependencies: + "@types/rx-core" "*" + "@types/rx-core-binding" "*" + +"@types/rx@*": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@types/rx/-/rx-4.1.1.tgz#598fc94a56baed975f194574e0f572fd8e627a48" + dependencies: + "@types/rx-core" "*" + "@types/rx-core-binding" "*" + "@types/rx-lite" "*" + "@types/rx-lite-aggregates" "*" + "@types/rx-lite-async" "*" + "@types/rx-lite-backpressure" "*" + "@types/rx-lite-coincidence" "*" + "@types/rx-lite-experimental" "*" + "@types/rx-lite-joinpatterns" "*" + "@types/rx-lite-testing" "*" + "@types/rx-lite-time" "*" + "@types/rx-lite-virtualtime" "*" + +"@types/seedrandom@2.4.27": + version "2.4.27" + resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-2.4.27.tgz#9db563937dd86915f69092bc43259d2f48578e41" + +"@types/serve-static@*": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" + dependencies: + "@types/express-serve-static-core" "*" + "@types/mime" "*" + +"@types/single-line-log@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@types/single-line-log/-/single-line-log-1.1.0.tgz#7e6fc4e8e785f5f5ab11157418df2684a21ed971" + +"@types/speakeasy@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/speakeasy/-/speakeasy-2.0.2.tgz#153ec3636eea0562209b0a2f1fdf8b479286919b" + +"@types/tapable@*": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.2.tgz#e13182e1b69871a422d7863e11a4a6f5b814a4bd" + +"@types/through2@*": + version "2.0.33" + resolved "https://registry.yarnpkg.com/@types/through2/-/through2-2.0.33.tgz#1ff2e88a100dfb5b140e7bb98791f1194400d131" + dependencies: + "@types/node" "*" + +"@types/through@*": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.29.tgz#72943aac922e179339c651fa34a4428a4d722f93" + dependencies: + "@types/node" "*" + +"@types/tmp@0.0.33": + version "0.0.33" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d" + +"@types/tough-cookie@*": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.3.tgz#7f226d67d654ec9070e755f46daebf014628e9d9" + +"@types/uglify-js@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.2.tgz#f30c75458d18e8ee885c792c04adcb78a13bc286" + dependencies: + source-map "^0.6.1" + +"@types/uglify-js@^2": + version "2.6.31" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-2.6.31.tgz#c694755eeb6a1bb9f8f321f3ec37cc22ca4c4f6b" + dependencies: + source-map "^0.6.1" + +"@types/uuid@3.4.3": + version "3.4.3" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.3.tgz#121ace265f5569ce40f4f6d0ff78a338c732a754" + dependencies: + "@types/node" "*" + +"@types/vinyl@*": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/vinyl/-/vinyl-2.0.2.tgz#4f3b8dae8f5828d3800ef709b0cff488ee852de3" + dependencies: + "@types/node" "*" + +"@types/webpack-stream@3.2.10": + version "3.2.10" + resolved "https://registry.yarnpkg.com/@types/webpack-stream/-/webpack-stream-3.2.10.tgz#eed8389a60d9928b357aa6d13599428d2c4889e7" + dependencies: + "@types/node" "*" + "@types/webpack" "*" + +"@types/webpack@*", "@types/webpack@4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.4.0.tgz#c0551b772be241d786c0548812dd75a932f8efb4" + dependencies: + "@types/node" "*" + "@types/tapable" "*" + "@types/uglify-js" "*" + source-map "^0.6.0" + +"@types/websocket@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-0.0.39.tgz#aa971e24f9c1455fe2a57ee3e69c7d395016b12a" + dependencies: + "@types/events" "*" + "@types/node" "*" + +"@types/ws@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-5.1.1.tgz#4adc1f1a5e92e7e0e95658fb35c7eab1bc52f4ac" + dependencies: + "@types/events" "*" + "@types/node" "*" + +"@vue/component-compiler-utils@^1.2.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-1.3.1.tgz#686f0b913d59590ae327b2a1cb4b6d9b931bbe0e" + dependencies: + consolidate "^0.15.1" + hash-sum "^1.0.2" + lru-cache "^4.1.2" + merge-source-map "^1.1.0" + postcss "^6.0.20" + postcss-selector-parser "^3.1.1" + prettier "^1.13.0" + source-map "^0.5.6" + vue-template-es2015-compiler "^1.6.0" + +"@webassemblyjs/ast@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.4.3.tgz#3b3f6fced944d8660273347533e6d4d315b5934a" + dependencies: + "@webassemblyjs/helper-wasm-bytecode" "1.4.3" + "@webassemblyjs/wast-parser" "1.4.3" + debug "^3.1.0" + webassemblyjs "1.4.3" + +"@webassemblyjs/floating-point-hex-parser@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.4.3.tgz#f5aee4c376a717c74264d7bacada981e7e44faad" + +"@webassemblyjs/helper-buffer@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.4.3.tgz#0434b55958519bf503697d3824857b1dea80b729" + dependencies: + debug "^3.1.0" + +"@webassemblyjs/helper-code-frame@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.4.3.tgz#f1349ca3e01a8e29ee2098c770773ef97af43641" + dependencies: + "@webassemblyjs/wast-printer" "1.4.3" + +"@webassemblyjs/helper-fsm@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.4.3.tgz#65a921db48fb43e868f17b27497870bdcae22b79" + +"@webassemblyjs/helper-wasm-bytecode@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.4.3.tgz#0e5b4b5418e33f8a26e940b7809862828c3721a5" + +"@webassemblyjs/helper-wasm-section@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.4.3.tgz#9ceedd53a3f152c3412e072887ade668d0b1acbf" + dependencies: + "@webassemblyjs/ast" "1.4.3" + "@webassemblyjs/helper-buffer" "1.4.3" + "@webassemblyjs/helper-wasm-bytecode" "1.4.3" + "@webassemblyjs/wasm-gen" "1.4.3" + debug "^3.1.0" + +"@webassemblyjs/leb128@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.4.3.tgz#5a5e5949dbb5adfe3ae95664d0439927ac557fb8" + dependencies: + leb "^0.3.0" + +"@webassemblyjs/validation@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/validation/-/validation-1.4.3.tgz#9e66c9b3079d7bbcf2070c1bf52a54af2a09aac9" + dependencies: + "@webassemblyjs/ast" "1.4.3" + +"@webassemblyjs/wasm-edit@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.4.3.tgz#87febd565e0ffb5ae25f6495bb3958d17aa0a779" + dependencies: + "@webassemblyjs/ast" "1.4.3" + "@webassemblyjs/helper-buffer" "1.4.3" + "@webassemblyjs/helper-wasm-bytecode" "1.4.3" + "@webassemblyjs/helper-wasm-section" "1.4.3" + "@webassemblyjs/wasm-gen" "1.4.3" + "@webassemblyjs/wasm-opt" "1.4.3" + "@webassemblyjs/wasm-parser" "1.4.3" + "@webassemblyjs/wast-printer" "1.4.3" + debug "^3.1.0" + +"@webassemblyjs/wasm-gen@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.4.3.tgz#8553164d0154a6be8f74d653d7ab355f73240aa4" + dependencies: + "@webassemblyjs/ast" "1.4.3" + "@webassemblyjs/helper-wasm-bytecode" "1.4.3" + "@webassemblyjs/leb128" "1.4.3" + +"@webassemblyjs/wasm-opt@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.4.3.tgz#26c7a23bfb136aa405b1d3410e63408ec60894b8" + dependencies: + "@webassemblyjs/ast" "1.4.3" + "@webassemblyjs/helper-buffer" "1.4.3" + "@webassemblyjs/wasm-gen" "1.4.3" + "@webassemblyjs/wasm-parser" "1.4.3" + debug "^3.1.0" + +"@webassemblyjs/wasm-parser@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.4.3.tgz#7ddd3e408f8542647ed612019cfb780830993698" + dependencies: + "@webassemblyjs/ast" "1.4.3" + "@webassemblyjs/helper-wasm-bytecode" "1.4.3" + "@webassemblyjs/leb128" "1.4.3" + "@webassemblyjs/wasm-parser" "1.4.3" + webassemblyjs "1.4.3" + +"@webassemblyjs/wast-parser@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.4.3.tgz#3250402e2c5ed53dbe2233c9de1fe1f9f0d51745" + dependencies: + "@webassemblyjs/ast" "1.4.3" + "@webassemblyjs/floating-point-hex-parser" "1.4.3" + "@webassemblyjs/helper-code-frame" "1.4.3" + "@webassemblyjs/helper-fsm" "1.4.3" + long "^3.2.0" + webassemblyjs "1.4.3" + +"@webassemblyjs/wast-printer@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.4.3.tgz#3d59aa8d0252d6814a3ef4e6d2a34c9ded3904e0" + dependencies: + "@webassemblyjs/ast" "1.4.3" + "@webassemblyjs/wast-parser" "1.4.3" + long "^3.2.0" + +abab@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +accepts@^1.2.2, accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + +accord@^0.26.3: + version "0.26.4" + resolved "https://registry.yarnpkg.com/accord/-/accord-0.26.4.tgz#fc4c8d3ebab406a07cb28819b859651c44a92e80" + dependencies: + convert-source-map "^1.2.0" + glob "^7.0.5" + indx "^0.2.3" + lodash.clone "^4.3.2" + lodash.defaults "^4.0.1" + lodash.flatten "^4.2.0" + lodash.merge "^4.4.0" + lodash.partialright "^4.1.4" + lodash.pick "^4.2.1" + lodash.uniq "^4.3.0" + resolve "^1.1.7" + semver "^5.3.0" + uglify-js "^2.7.0" + when "^3.7.7" + +acorn-dynamic-import@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" + dependencies: + acorn "^5.0.0" + +acorn-globals@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + dependencies: + acorn "^4.0.4" + +acorn-globals@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" + dependencies: + acorn "^5.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@5.X, acorn@^5.0.0, acorn@^5.0.3, acorn@^5.3.0, acorn@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" + +acorn@^3.0.4, acorn@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^4.0.4, acorn@~4.0.2: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + +agent-base@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.0.tgz#9838b5c3392b962bad031e6a4c5e1024abec45ce" + dependencies: + es6-promisify "^5.0.0" + +agentkeepalive@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.4.1.tgz#aa95aebc3a749bca5ed53e3880a09f5235b48f0c" + dependencies: + humanize-ms "^1.2.1" + +ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + +ajv-keywords@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" + +ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ajv@^6.1.0: + version "6.5.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.1.tgz#88ebc1263c7133937d108b80c5572e64e1d9322d" + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.1" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +animejs@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/animejs/-/animejs-2.2.0.tgz#35eefdfc535b81949c9cb06f0b3e60c02e6fdc80" + +ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + dependencies: + ansi-wrap "^0.1.0" + +ansi-cyan@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" + dependencies: + ansi-wrap "0.1.0" + +ansi-escapes@^1.0.0, ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-escapes@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" + +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + dependencies: + ansi-wrap "0.1.0" + +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + dependencies: + ansi-wrap "0.1.0" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + +ansi-styles@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" + +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + +any-observable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" + +any-promise@^1.0.0, any-promise@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +"apparatus@>= 0.0.9": + version "0.0.10" + resolved "https://registry.yarnpkg.com/apparatus/-/apparatus-0.0.10.tgz#81ea756772ada77863db54ceee8202c109bdca3e" + dependencies: + sylvester ">= 0.0.8" + +append-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" + dependencies: + buffer-equal "^1.0.0" + +append-field@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/append-field/-/append-field-0.1.0.tgz#6ddc58fa083c7bc545d3c5995b2830cc2366d44a" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +archive-type@^3.0.0, archive-type@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-3.2.0.tgz#9cd9c006957ebe95fadad5bd6098942a813737f6" + dependencies: + file-type "^3.1.0" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" + dependencies: + arr-flatten "^1.0.1" + array-slice "^0.2.3" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +arr-union@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + +array-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + +array-find-index@^1.0.1, array-find-index@^1.0.2: + 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-map@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + +array-parallel@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/array-parallel/-/array-parallel-0.1.3.tgz#8f785308926ed5aa478c47e64d1b334b6c0c947d" + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + +array-series@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/array-series/-/array-series-0.1.5.tgz#df5d37bfc5c2ef0755e2aa4f92feae7d4b5a972f" + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + +array-slice@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" + +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.0, array-uniq@^1.0.1, array-uniq@^1.0.2: + 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" + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asap@^2.0.0, asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1.js@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.0.1.tgz#7668b56416953f0ce3421adbb3893ace59c96f59" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + +ast-types@0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.10.1.tgz#f52fca9715579a14f841d67d7f8d25432ab6a3dd" + +ast-types@0.11.5: + version "0.11.5" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.5.tgz#9890825d660c03c28339f315e9fa0a360e31ec28" + +async-each-series@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-1.1.0.tgz#f42fd8155d38f21a5b8ea07c28e063ed1700b138" + +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-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + +async-validator@~1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.8.2.tgz#b77597226e96242f8d531c0d46ae295f62422ba4" + dependencies: + babel-runtime "6.x" + +async@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.5.0, async@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + dependencies: + lodash "^4.17.10" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +atob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" + +autoprefixer@^6.3.1: + version "6.7.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" + dependencies: + browserslist "^1.7.6" + caniuse-db "^1.0.30000634" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^5.2.16" + postcss-value-parser "^3.2.3" + +autosize@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/autosize/-/autosize-4.0.2.tgz#073cfd07c8bf45da4b9fd153437f5bafbba1e4c9" + +autwh@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/autwh/-/autwh-0.1.0.tgz#24a5300923309d105133401a2568f9c8ab7d7e03" + dependencies: + oauth "0.9.15" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.2.1, aws4@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" + +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-bindify-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-explode-class@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" + dependencies: + babel-helper-bindify-decorators "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-vue-jsx-merge-props@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-async-generators@^6.5.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + +babel-plugin-syntax-class-constructor-call@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" + +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + +babel-plugin-syntax-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-export-extensions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" + +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-generator-functions@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-generators "^6.5.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-class-constructor-call@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" + dependencies: + babel-plugin-syntax-class-constructor-call "^6.18.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-class-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" + dependencies: + babel-helper-function-name "^6.24.1" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" + dependencies: + babel-helper-explode-class "^6.24.1" + babel-plugin-syntax-decorators "^6.13.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-export-extensions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" + dependencies: + babel-plugin-syntax-export-extensions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-flow-strip-types@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-regenerator@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-preset-es2015@^6.9.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-preset-stage-1@^6.5.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" + dependencies: + babel-plugin-transform-class-constructor-call "^6.24.1" + babel-plugin-transform-export-extensions "^6.22.0" + babel-preset-stage-2 "^6.24.1" + +babel-preset-stage-2@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-plugin-transform-class-properties "^6.24.1" + babel-plugin-transform-decorators "^6.24.1" + babel-preset-stage-3 "^6.24.1" + +babel-preset-stage-3@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-generator-functions "^6.24.1" + babel-plugin-transform-async-to-generator "^6.24.1" + babel-plugin-transform-exponentiation-operator "^6.24.1" + babel-plugin-transform-object-rest-spread "^6.22.0" + +babel-register@^6.26.0, babel-register@^6.9.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@6.x, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.17.3, babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + +babylon@^7.0.0-beta.47: + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.47.tgz#6d1fa44f0abec41ab7c780481e62fd9aafbdea80" + +balanced-match@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base32.js@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/base32.js/-/base32.js-0.0.1.tgz#d045736a57b1f6c139f0c7df42518a84e91bb2ba" + +base64-js@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +bcryptjs@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" + +beeper@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + +bin-build@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-2.2.0.tgz#11f8dd61f70ffcfa2bdcaa5b46f5e8fedd4221cc" + dependencies: + archive-type "^3.0.1" + decompress "^3.0.0" + download "^4.1.2" + exec-series "^1.0.0" + rimraf "^2.2.6" + tempfile "^1.0.0" + url-regex "^3.0.0" + +bin-check@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-2.0.0.tgz#86f8e6f4253893df60dc316957f5af02acb05930" + dependencies: + executable "^1.0.0" + +bin-version-check@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-2.1.0.tgz#e4e5df290b9069f7d111324031efc13fdd11a5b0" + dependencies: + bin-version "^1.0.0" + minimist "^1.1.0" + semver "^4.0.3" + semver-truncate "^1.0.0" + +bin-version@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-1.0.4.tgz#9eb498ee6fd76f7ab9a7c160436f89579435d78e" + dependencies: + find-versions "^1.0.0" + +bin-wrapper@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-3.0.2.tgz#67d3306262e4b1a5f2f88ee23464f6a655677aeb" + dependencies: + bin-check "^2.0.0" + bin-version-check "^2.1.0" + download "^4.0.0" + each-async "^1.1.1" + lazy-req "^1.0.0" + os-filter-obj "^1.0.0" + +binary-extensions@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + +binaryextensions@2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935" + +bl@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.0.5, bluebird@^3.1.1, bluebird@^3.4.1, bluebird@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + +body-parser@1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.1" + http-errors "~1.6.2" + iconv-lite "0.4.19" + on-finished "~2.3.0" + qs "6.5.1" + raw-body "2.3.2" + type-is "~1.6.15" + +body-parser@^1.12.2: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + +bootstrap-vue@2.0.0-rc.6: + version "2.0.0-rc.6" + resolved "https://registry.yarnpkg.com/bootstrap-vue/-/bootstrap-vue-2.0.0-rc.6.tgz#12d0a241414f1efd647e8b14a88c51707c920c86" + dependencies: + bootstrap "^4.0.0" + lodash.get "^4.4.2" + lodash.startcase "^4.4.0" + opencollective "^1.0.3" + popper.js "^1.12.9" + vue-functional-data-merge "^2.0.5" + +bootstrap@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.1.1.tgz#3aec85000fa619085da8d2e4983dfd67cf2114cb" + +brace-expansion@^1.0.0, brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.0, braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + +browser-process-hrtime@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.1.tgz#3343124db6d7ad53e26a8826318712bdc8450f9c" + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + dependencies: + pako "~1.0.5" + +browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: + version "1.7.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" + dependencies: + caniuse-db "^1.0.30000639" + electron-to-chromium "^1.2.7" + +bson@~1.0.4: + version "1.0.9" + resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.9.tgz#12319f8323b1254739b7c6bef8d3e89ae05a2f57" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + +buffer-alloc@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + +buffer-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + +buffer-from@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-0.1.2.tgz#15f4b9bcef012044df31142c14333caf6e0260d0" + +buffer-from@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" + +buffer-shims@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +buffer-to-vinyl@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz#00f15faee3ab7a1dda2cde6d9121bffdd07b2262" + dependencies: + file-type "^3.1.0" + readable-stream "^2.0.2" + uuid "^2.0.1" + vinyl "^1.0.0" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + +buffer@^4.3.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +bufferstreams@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-1.1.3.tgz#a8515ac024fa90e8fa7d58c11b13dea1f28abe72" + dependencies: + readable-stream "^2.0.2" + +builtin-modules@^1.0.0, builtin-modules@^1.1.1: + 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" + +busboy@^0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" + dependencies: + dicer "0.2.5" + readable-stream "1.1.x" + +bytes@3.0.0, bytes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + +bytes@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.5.0.tgz#4c9423ea2d252c270c41b2bdefeff9bb6b62c06a" + +cacache@^10.0.4: + version "10.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^2.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^5.2.4" + unique-filename "^1.1.0" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cacheable-request@^2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" + dependencies: + clone-response "1.0.2" + get-stream "3.0.0" + http-cache-semantics "3.8.1" + keyv "3.0.0" + lowercase-keys "1.0.0" + normalize-url "2.0.1" + responselike "1.0.2" + +cafy@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/cafy/-/cafy-8.0.0.tgz#8f6ce8556d64ee145c5cdc79b5b68f7fc57ee46f" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + +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" + +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +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" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +can-promise@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/can-promise/-/can-promise-0.0.1.tgz#7a7597ad801fb14c8b22341dfec314b6bd6ad8d3" + dependencies: + window-or-global "^1.0.1" + +caniuse-api@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" + dependencies: + browserslist "^1.3.6" + caniuse-db "^1.0.30000529" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: + version "1.0.30000856" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000856.tgz#fbebb99abe15a5654fc7747ebb5315bdfde3358f" + +capture-stack-trace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +caw@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/caw/-/caw-1.2.0.tgz#ffb226fe7efc547288dc62ee3e97073c212d1034" + dependencies: + get-proxy "^1.0.1" + is-obj "^1.0.0" + object-assign "^3.0.0" + tunnel-agent "^0.4.0" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" + dependencies: + ansi-styles "^3.2.0" + escape-string-regexp "^1.0.5" + supports-color "^5.2.0" + +chalk@2.4.1, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.2.0, chalk@^2.3.0, chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" + dependencies: + ansi-styles "~1.0.0" + has-color "~0.1.0" + strip-ansi "~0.1.0" + +character-parser@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" + dependencies: + is-regex "^1.0.3" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + +cheerio-httpcli@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cheerio-httpcli/-/cheerio-httpcli-0.7.2.tgz#346d41b0f00f01aaa2da8d5e7efb3f806fb277a3" + dependencies: + "@types/cheerio" "^0.22.5" + "@types/node" "^8.0.47" + async "^2.5.0" + cheerio "^0.22.0" + colors "^1.1.2" + foreach "^2.0.5" + he "^1.1.1" + iconv-lite "^0.4.19" + jschardet "^1.6.0" + object-assign "^4.1.1" + os-locale "^2.1.0" + prettyjson "^1.2.1" + request "^2.83.0" + require-uncached "^1.0.3" + rsvp "^4.7.0" + spawn-sync "^1.0.15" + tough-cookie "^2.3.3" + type-of "^2.0.1" + valid-url "^1.0.9" + yargs "^10.0.3" + +cheerio@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash.assignin "^4.0.9" + lodash.bind "^4.1.4" + lodash.defaults "^4.0.1" + lodash.filter "^4.4.0" + lodash.flatten "^4.2.0" + lodash.foreach "^4.3.0" + lodash.map "^4.4.0" + lodash.merge "^4.4.0" + lodash.pick "^4.2.1" + lodash.reduce "^4.4.0" + lodash.reject "^4.4.0" + lodash.some "^4.4.0" + +chokidar@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +chokidar@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176" + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^2.1.1" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + upath "^1.0.0" + optionalDependencies: + fsevents "^1.1.2" + +chownr@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + +chrome-trace-event@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-0.1.3.tgz#d395af2d31c87b90a716c831fe326f69768ec084" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + +clap@^1.0.9: + version "1.2.3" + resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" + dependencies: + chalk "^1.1.3" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-css@4.1.x, clean-css@^4.1.11: + version "4.1.11" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a" + dependencies: + source-map "0.5.x" + +cli-cursor@^1.0.2: + 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-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-spinners@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" + +cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + dependencies: + slice-ansi "0.0.4" + string-width "^1.0.1" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + 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" + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + +clone-deep@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" + dependencies: + for-own "^1.0.0" + is-plain-object "^2.0.4" + kind-of "^6.0.0" + shallow-clone "^1.0.0" + +clone-response@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + dependencies: + mimic-response "^1.0.0" + +clone-stats@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + +clone@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + +clone@^1.0.0, clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + +clone@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" + +cloneable-readable@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65" + dependencies: + inherits "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" + +co-body@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/co-body/-/co-body-5.2.0.tgz#5a0a658c46029131e0e3a306f67647302f71c124" + dependencies: + inflation "^2.0.0" + qs "^6.4.0" + raw-body "^2.2.0" + type-is "^1.6.14" + +co-body@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.0.0.tgz#965b9337d7f5655480787471f4237664820827e3" + dependencies: + inflation "^2.0.0" + qs "^6.5.2" + raw-body "^2.3.3" + type-is "^1.6.16" + +co@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +coa@~1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" + dependencies: + q "^1.1.2" + +coa@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.1.tgz#f3f8b0b15073e35d70263fb1042cb2c023db38af" + dependencies: + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.3.0, color-convert@^1.9.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" + dependencies: + color-name "1.1.1" + +color-name@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" + +color-name@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +color-string@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" + dependencies: + color-name "^1.0.0" + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + +color@^0.11.0: + version "0.11.4" + resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" + dependencies: + clone "^1.0.2" + color-convert "^1.3.0" + color-string "^0.3.0" + +colormin@^1.0.5: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" + dependencies: + color "^0.11.0" + css-color-names "0.0.4" + has "^1.0.1" + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +colors@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.0.tgz#5f20c9fef6945cb1134260aab33bfbdc8295e04e" + +colors@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +commander@2.15.1, commander@2.15.x, commander@^2.11.0, commander@^2.12.1, commander@^2.7.1, commander@^2.9.0, commander@~2.15.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + +commander@~2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" + dependencies: + graceful-readlink ">= 1.0.0" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +compressible@^2.0.0: + version "2.0.14" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7" + dependencies: + mime-db ">= 1.34.0 < 2" + +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.4.6, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +condense-newlines@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/condense-newlines/-/condense-newlines-0.2.1.tgz#3de985553139475d32502c83b02f60684d24c55f" + dependencies: + extend-shallow "^2.0.1" + is-whitespace "^0.3.0" + kind-of "^3.0.2" + +config-chain@~1.1.5: + version "1.1.11" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2" + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +console-stream@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44" + +consolidate@^0.15.0, consolidate@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" + dependencies: + bluebird "^3.1.1" + +constantinople@^3.0.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647" + dependencies: + "@types/babel-types" "^7.0.0" + "@types/babylon" "^6.16.2" + babel-types "^6.26.0" + babylon "^6.18.0" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + +content-disposition@0.5.2, content-disposition@~0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-type@^1.0.0, content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + +convert-source-map@1.X, convert-source-map@^1.1.1, convert-source-map@^1.2.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +cookies@~0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.7.1.tgz#7c8a615f5481c61ab9f16c833731bcb8f663b99b" + dependencies: + depd "~1.1.1" + keygrip "~1.0.2" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + +copy-to@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5" + +core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0: + version "2.5.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + +core-util-is@1.0.2, 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" + +crc-32@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.1.0" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-error-class@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cropperjs@^1.1.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cropperjs/-/cropperjs-1.4.0.tgz#e9851559c590d148a10c17c36cdc8126acf01a2e" + +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.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-color-names@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + +css-loader@0.28.11: + version "0.28.11" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7" + dependencies: + babel-code-frame "^6.26.0" + css-selector-tokenizer "^0.7.0" + cssnano "^3.10.0" + icss-utils "^2.1.0" + loader-utils "^1.0.2" + lodash.camelcase "^4.3.0" + object-assign "^4.1.1" + postcss "^5.0.6" + postcss-modules-extract-imports "^1.2.0" + postcss-modules-local-by-default "^1.2.0" + postcss-modules-scope "^1.1.0" + postcss-modules-values "^1.3.0" + postcss-value-parser "^3.3.0" + source-list-map "^2.0.0" + +css-parse@1.7.x: + version "1.7.0" + resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b" + +css-select-base-adapter@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz#0102b3d14630df86c3eb9fa9f5456270106cf990" + +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-select@~1.3.0-rc0: + version "1.3.0-rc0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.3.0-rc0.tgz#6f93196aaae737666ea1036a8cb14a8fcb7a9231" + dependencies: + boolbase "^1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "^1.0.1" + +css-selector-tokenizer@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" + dependencies: + cssesc "^0.1.0" + fastparse "^1.1.1" + regexpu-core "^1.0.0" + +css-tree@1.0.0-alpha.29: + version "1.0.0-alpha.29" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-tree@1.0.0-alpha25: + version "1.0.0-alpha25" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha25.tgz#1bbfabfbf6eeef4f01d9108ff2edd0be2fe35597" + dependencies: + mdn-data "^1.0.0" + source-map "^0.5.3" + +css-url-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec" + +css-what@2.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" + +css@2.X, css@^2.2.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.3.tgz#f861f4ba61e79bedc962aa548e5780fd95cbc6be" + dependencies: + inherits "^2.0.1" + source-map "^0.1.38" + source-map-resolve "^0.5.1" + urix "^0.1.0" + +cssesc@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" + +cssnano@^3.0.0, cssnano@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" + dependencies: + autoprefixer "^6.3.1" + decamelize "^1.1.2" + defined "^1.0.0" + has "^1.0.1" + object-assign "^4.0.1" + postcss "^5.0.14" + postcss-calc "^5.2.0" + postcss-colormin "^2.1.8" + postcss-convert-values "^2.3.4" + postcss-discard-comments "^2.0.4" + postcss-discard-duplicates "^2.0.1" + postcss-discard-empty "^2.0.1" + postcss-discard-overridden "^0.1.1" + postcss-discard-unused "^2.2.1" + postcss-filter-plugins "^2.0.0" + postcss-merge-idents "^2.1.5" + postcss-merge-longhand "^2.0.1" + postcss-merge-rules "^2.0.3" + postcss-minify-font-values "^1.0.2" + postcss-minify-gradients "^1.0.1" + postcss-minify-params "^1.0.4" + postcss-minify-selectors "^2.0.4" + postcss-normalize-charset "^1.1.0" + postcss-normalize-url "^3.0.7" + postcss-ordered-values "^2.1.0" + postcss-reduce-idents "^2.2.2" + postcss-reduce-initial "^1.0.0" + postcss-reduce-transforms "^1.0.3" + postcss-svgo "^2.1.1" + postcss-unique-selectors "^2.0.2" + postcss-value-parser "^3.2.3" + postcss-zindex "^2.0.1" + +csso@^3.5.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" + dependencies: + css-tree "1.0.0-alpha.29" + +csso@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" + dependencies: + clap "^1.0.9" + source-map "^0.5.3" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.3.1 < 0.4.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.3.1.tgz#6da9b4cff1bc5d716e6e5fe8e04fcb1b50a49adf" + dependencies: + cssom "0.3.x" + +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" + +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +dargs@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" + dependencies: + abab "^1.0.4" + whatwg-mimetype "^2.0.0" + whatwg-url "^6.4.0" + +date-fns@^1.27.2: + version "1.29.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + +dateformat@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" + +dateformat@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" + +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + +debug-fabulous@1.X: + version "1.1.0" + resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-1.1.0.tgz#af8a08632465224ef4174a9f06308c3c2a1ebc8e" + dependencies: + debug "3.X" + memoizee "0.4.X" + object-assign "4.X" + +debug@*, debug@3.1.0, debug@3.X, debug@^3.0.0, debug@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +debug@0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" + +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.1, debug@^2.6.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +debuglog@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + +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" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + +decompress-response@^3.2.0, decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + dependencies: + mimic-response "^1.0.0" + +decompress-tar@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-3.1.0.tgz#217c789f9b94450efaadc5c5e537978fc333c466" + dependencies: + is-tar "^1.0.0" + object-assign "^2.0.0" + strip-dirs "^1.0.0" + tar-stream "^1.1.1" + through2 "^0.6.1" + vinyl "^0.4.3" + +decompress-tarbz2@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz#8b23935681355f9f189d87256a0f8bdd96d9666d" + dependencies: + is-bzip2 "^1.0.0" + object-assign "^2.0.0" + seek-bzip "^1.0.3" + strip-dirs "^1.0.0" + tar-stream "^1.1.1" + through2 "^0.6.1" + vinyl "^0.4.3" + +decompress-targz@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-3.1.0.tgz#b2c13df98166268991b715d6447f642e9696f5a0" + dependencies: + is-gzip "^1.0.0" + object-assign "^2.0.0" + strip-dirs "^1.0.0" + tar-stream "^1.1.1" + through2 "^0.6.1" + vinyl "^0.4.3" + +decompress-unzip@^3.0.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-3.4.0.tgz#61475b4152066bbe3fee12f9d629d15fe6478eeb" + dependencies: + is-zip "^1.0.0" + read-all-stream "^3.0.0" + stat-mode "^0.2.0" + strip-dirs "^1.0.0" + through2 "^2.0.0" + vinyl "^1.0.0" + yauzl "^2.2.1" + +decompress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/decompress/-/decompress-3.0.0.tgz#af1dd50d06e3bfc432461d37de11b38c0d991bed" + dependencies: + buffer-to-vinyl "^1.0.0" + concat-stream "^1.4.6" + decompress-tar "^3.0.0" + decompress-tarbz2 "^3.0.0" + decompress-targz "^3.0.0" + decompress-unzip "^3.0.0" + stream-combiner2 "^1.1.1" + vinyl-assign "^1.0.1" + vinyl-fs "^2.2.0" + +deep-equal@1.0.1, deep-equal@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + +deep-extend@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + +deep-is@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.2.tgz#9ced65ea0bc0b09f42a6d79c1b1903f9d913cc18" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +deepcopy@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/deepcopy/-/deepcopy-0.6.3.tgz#634780f2f8656ab771af8fa8431ed1ccee55c7b0" + +deepmerge@^1.2.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753" + +deepmerge@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.1.1.tgz#e862b4e45ea0555072bf51e7fd0d9845170ae768" + +defaults@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + +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" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + +depd@^1.1.0, depd@~1.1.1, depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + +deprecated@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@^1.0.3, destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-conflict@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/detect-conflict/-/detect-conflict-1.0.1.tgz#088657a66a961c05019db7c4230883b1c6b4176e" + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +detect-newline@2.X: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + +dezalgo@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + dependencies: + asap "^2.0.0" + wrappy "1" + +dicer@0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" + dependencies: + readable-stream "1.1.x" + streamsearch "0.1.2" + +diff@3.5.0, diff@^3.1.0, diff@^3.2.0, diff@^3.3.1, diff@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dijkstrajs@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.1.tgz#d3cd81221e3ea40742cfcde556d4e99e98ddc71b" + +dir-glob@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + +diskusage@0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/diskusage/-/diskusage-0.2.4.tgz#e956f7a1051e0c6a1af706154efe620a2ee432ec" + dependencies: + nan "^2.5.0" + +doctrine@^2.0.0, doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + dependencies: + esutils "^2.0.2" + +doctypes@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" + +dom-serializer@0, dom-serializer@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + +domelementtype@1, domelementtype@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + +domexception@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + dependencies: + webidl-conversions "^4.0.2" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + dependencies: + domelementtype "1" + +dompurify@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-1.0.4.tgz#b0655d07856c1ef76fd27ae18e8ab1174ed18819" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + dependencies: + is-obj "^1.0.0" + +double-ended-queue@^2.1.0-0: + version "2.1.0-0" + resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c" + +download@^4.0.0, download@^4.1.2: + version "4.4.3" + resolved "https://registry.yarnpkg.com/download/-/download-4.4.3.tgz#aa55fdad392d95d4b68e8c2be03e0c2aa21ba9ac" + dependencies: + caw "^1.0.1" + concat-stream "^1.4.7" + each-async "^1.0.0" + filenamify "^1.0.1" + got "^5.0.0" + gulp-decompress "^1.2.0" + gulp-rename "^1.2.0" + is-url "^1.2.0" + object-assign "^4.0.1" + read-all-stream "^3.0.0" + readable-stream "^2.0.2" + stream-combiner2 "^1.1.1" + vinyl "^1.0.0" + vinyl-fs "^2.2.0" + ware "^1.2.0" + +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + dependencies: + readable-stream "~1.1.9" + +duplexer2@^0.1.4, duplexer2@~0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + dependencies: + readable-stream "^2.0.2" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + +duplexify@^3.2.0, duplexify@^3.4.2, duplexify@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +each-async@^1.0.0, each-async@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/each-async/-/each-async-1.1.1.tgz#dee5229bdf0ab6ba2012a395e1b869abf8813473" + dependencies: + onetime "^1.0.0" + set-immediate-shim "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ecdsa-sig-formatter@1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz#1c595000f04a8897dfb85000892a0f4c33af86c3" + dependencies: + safe-buffer "^5.0.1" + +editions@^1.3.3: + version "1.3.4" + resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" + +editorconfig@^0.13.2: + version "0.13.3" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.13.3.tgz#e5219e587951d60958fd94ea9a9a008cdeff1b34" + dependencies: + bluebird "^3.0.5" + commander "^2.9.0" + lru-cache "^3.2.0" + semver "^5.1.0" + sigmund "^1.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +ejs@^2.5.9: + version "2.6.1" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" + +elasticsearch@15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/elasticsearch/-/elasticsearch-15.0.0.tgz#d888ceb858bba30221b68698d72c54bdcfdf2fba" + dependencies: + agentkeepalive "^3.4.1" + chalk "^1.0.0" + lodash "^4.17.10" + +electron-to-chromium@^1.2.7: + version "1.3.48" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz#d3b0d8593814044e092ece2108fc3ac9aea4b900" + +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + +element-ui@2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/element-ui/-/element-ui-2.3.9.tgz#0c5996e74b375f2665d703c68bdb3269ae9269e0" + dependencies: + async-validator "~1.8.1" + babel-helper-vue-jsx-merge-props "^2.0.0" + deepmerge "^1.2.0" + normalize-wheel "^1.0.1" + resize-observer-polyfill "^1.5.0" + throttle-debounce "^1.0.1" + +elliptic@^6.0.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emojilib@2.2.12: + version "2.2.12" + resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.2.12.tgz#29481fa5521ac5ed97a5cc0503901c3435d523fa" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + dependencies: + once "^1.4.0" + +end-of-stream@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" + dependencies: + once "~1.3.0" + +enhanced-resolve@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz#e34a6eaa790f62fccd71d93959f56b2b432db10a" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +entities@^1.1.1, entities@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + +envinfo@^5.7.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-5.10.0.tgz#503a9774ae15b93ea68bdfae2ccd6306624ea6df" + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +error-inject@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" + +error@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" + dependencies: + string-template "~0.2.1" + xtend "~4.0.0" + +es-abstract@^1.5.1, es-abstract@^1.6.1: + version "1.12.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + +es5-ext@^0.10.14, es5-ext@^0.10.30, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2: + version "0.10.45" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz#0bfdf7b473da5919d5adf3bd25ceb754fccc3653" + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "1" + +es6-iterator@^2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.2.1.tgz#ec56233868032909207170c39448e24449dd1fc4" + +es6-promise@^3.0.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + +es6-promise@^4.0.3, es6-promise@^4.1.1: + version "4.2.4" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + dependencies: + es6-promise "^4.0.3" + +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.2: + 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.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-regexp@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/escape-regexp/-/escape-regexp-0.0.1.tgz#f44bda12d45bbdf9cb7f862ee7e4827b3dd32254" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, 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" + +escodegen@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.10.0.tgz#f647395de22519fbd0d928ffcf1d17e0dec2603e" + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-plugin-vue@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-4.5.0.tgz#09d6597f4849e31a3846c2c395fccf17685b69c3" + dependencies: + vue-eslint-parser "^2.0.3" + +eslint-scope@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + +eslint@4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" + dependencies: + ajv "^5.3.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.4" + esquery "^1.0.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.0.1" + ignore "^3.3.3" + imurmurhash "^0.1.4" + inquirer "^3.0.6" + is-resolvable "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^1.0.1" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "4.0.2" + text-table "~0.2.0" + +espree@^3.5.2, espree@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + dependencies: + acorn "^5.5.0" + acorn-jsx "^3.0.0" + +esprima@^2.6.0: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esprima@^4.0.0, esprima@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +esquery@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.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" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + +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@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + +events@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exec-buffer@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/exec-buffer/-/exec-buffer-3.2.0.tgz#b1686dbd904c7cf982e652c1f5a79b1e5573082b" + dependencies: + execa "^0.7.0" + p-finally "^1.0.0" + pify "^3.0.0" + rimraf "^2.5.4" + tempfile "^2.0.0" + +exec-series@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/exec-series/-/exec-series-1.0.3.tgz#6d257a9beac482a872c7783bc8615839fc77143a" + dependencies: + async-each-series "^1.1.0" + object-assign "^4.1.0" + +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +executable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/executable/-/executable-1.1.0.tgz#877980e9112f3391066da37265de7ad8434ab4d9" + dependencies: + meow "^3.1.0" + +exif-js@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/exif-js/-/exif-js-2.3.0.tgz#9d10819bf571f873813e7640241255ab9ce1a814" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + +exit-on-epipe@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + dependencies: + homedir-polyfill "^1.0.1" + +express@^4.12.2: + version "4.16.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.2" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.3" + qs "6.5.1" + range-parser "~1.2.0" + safe-buffer "5.1.1" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" + dependencies: + kind-of "^1.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-1.3.0.tgz#d1516fb0ff5624d2ebf9123ea1dac5a1994004f8" + +extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +external-editor@^2.0.1, external-editor@^2.0.4, external-editor@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +fancy-log@1.3.2, fancy-log@^1.1.0, fancy-log@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + time-stamp "^1.0.0" + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + +fast-glob@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.2.tgz#71723338ac9b4e0e2fff1d6748a2a13d5ed352bf" + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.0.1" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.1" + micromatch "^3.1.10" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fastparse@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + dependencies: + pend "~1.2.0" + +figures@^1.3.5, figures@^1.7.0: + 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" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +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" + +file-loader@1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8" + dependencies: + loader-utils "^1.0.2" + schema-utils "^0.4.5" + +file-type@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.0.0.tgz#6e4bccc741187f4113334a4e4a4ef84d54d7cc1e" + +file-type@^3.1.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + +file-type@^4.1.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +filename-reserved-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4" + +filenamify@^1.0.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5" + dependencies: + filename-reserved-regex "^1.0.0" + strip-outer "^1.0.0" + trim-repeated "^1.0.0" + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^2.0.0" + +find-index@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^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" + +find-versions@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-1.2.1.tgz#cbde9f12e38575a0af1be1b9a2c5d5fd8f186b62" + dependencies: + array-uniq "^1.0.0" + get-stdin "^4.0.1" + meow "^3.5.0" + semver-regex "^1.0.0" + +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +fined@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" + dependencies: + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" + parse-filepath "^1.0.1" + +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + +first-chunk-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70" + dependencies: + readable-stream "^2.0.2" + +flagged-respawn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.0.tgz#4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7" + +flat-cache@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +flatten@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" + +flow-parser@^0.*: + version "0.74.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.74.0.tgz#4acc8f55bdce5fa4da43c72c28ef8a9600ace87c" + +flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.4" + +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + dependencies: + for-in "^1.0.1" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +form-data@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" + +format-util@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.3.tgz#032dca4a116262a12c43f4c3ec8566416c5b2d95" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2, fresh@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + +from2@^2.1.0, from2@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + +fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + dependencies: + minipass "^2.2.1" + +fs-mkdirp-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" + dependencies: + graceful-fs "^4.1.11" + through2 "^2.0.3" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0, fsevents@^1.1.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +fstream@^1.0.0, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +fuckadblock@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/fuckadblock/-/fuckadblock-3.2.1.tgz#17fa3237a5e15c86613406b911e608191a3e62e2" + +function-bind@^1.1.0, function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" + dependencies: + globule "~0.1.0" + +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + 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" + +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-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-paths@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/get-paths/-/get-paths-0.0.2.tgz#a9c27b1a8d006c931a4f26fcf7d1546e3ad71bea" + dependencies: + fs-extra "^4.0.2" + +get-proxy@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-1.1.0.tgz#894854491bc591b0f147d7ae570f5c678b7256eb" + dependencies: + rc "^1.1.2" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +get-stream@3.0.0, get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +gh-got@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gh-got/-/gh-got-6.0.0.tgz#d74353004c6ec466647520a10bd46f7299d268d0" + dependencies: + got "^7.0.0" + is-plain-obj "^1.1.0" + +gifsicle@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-3.0.4.tgz#f45cb5ed10165b665dc929e0e9328b6c821dfa3b" + dependencies: + bin-build "^2.0.0" + bin-wrapper "^3.0.0" + logalot "^2.0.0" + +github-username@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/github-username/-/github-username-4.1.0.tgz#cbe280041883206da4212ae9e4b5f169c30bf417" + dependencies: + gh-got "^6.0.0" + +glob-all@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-all/-/glob-all-3.1.0.tgz#8913ddfb5ee1ac7812656241b03d5217c64b02ab" + dependencies: + glob "^7.0.5" + yargs "~1.2.6" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob-parent@^3.0.0, glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-stream@^3.1.5: + version "3.1.18" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" + dependencies: + glob "^4.3.1" + glob2base "^0.0.12" + minimatch "^2.0.1" + ordered-read-streams "^0.1.0" + through2 "^0.6.1" + unique-stream "^1.0.0" + +glob-stream@^5.3.2: + version "5.3.5" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" + dependencies: + extend "^3.0.0" + glob "^5.0.3" + glob-parent "^3.0.0" + micromatch "^2.3.7" + ordered-read-streams "^0.3.0" + through2 "^0.6.0" + to-absolute-glob "^0.1.1" + unique-stream "^2.0.2" + +glob-stream@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" + dependencies: + extend "^3.0.0" + glob "^7.1.1" + glob-parent "^3.1.0" + is-negated-glob "^1.0.0" + ordered-read-streams "^1.0.0" + pumpify "^1.3.5" + readable-stream "^2.1.5" + remove-trailing-separator "^1.0.1" + to-absolute-glob "^2.0.0" + unique-stream "^2.0.2" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + +glob-watcher@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" + dependencies: + gaze "^0.5.1" + +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + dependencies: + find-index "^0.1.1" + +glob@7.0.x: + 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" + +glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^4.3.1: + version "4.5.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "^2.0.1" + once "^1.3.0" + +glob@^5.0.3: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@~3.1.21: + version "3.1.21" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" + dependencies: + graceful-fs "~1.2.0" + inherits "1" + minimatch "~0.2.11" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^11.0.1: + version "11.5.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +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" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^8.0.0, globby@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50" + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +globule@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + +globule@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" + dependencies: + glob "~3.1.21" + lodash "~1.0.1" + minimatch "~0.2.11" + +glogg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810" + dependencies: + sparkles "^1.0.0" + +gm@1.23.1: + version "1.23.1" + resolved "https://registry.yarnpkg.com/gm/-/gm-1.23.1.tgz#2edeeb958084d0f8ea7988e5d995b1c7dfc14777" + dependencies: + array-parallel "~0.1.3" + array-series "~0.1.5" + cross-spawn "^4.0.0" + debug "^3.1.0" + +got@^5.0.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" + dependencies: + create-error-class "^3.0.1" + duplexer2 "^0.1.4" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + node-status-codes "^1.0.0" + object-assign "^4.0.1" + parse-json "^2.1.0" + pinkie-promise "^2.0.0" + read-all-stream "^3.0.0" + readable-stream "^2.0.5" + timed-out "^3.0.0" + unzip-response "^1.0.2" + url-parse-lax "^1.0.0" + +got@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" + dependencies: + decompress-response "^3.2.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-plain-obj "^1.1.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + p-cancelable "^0.3.0" + p-timeout "^1.1.1" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + url-parse-lax "^1.0.0" + url-to-options "^1.0.1" + +got@^8.3.1: + version "8.3.1" + resolved "https://registry.yarnpkg.com/got/-/got-8.3.1.tgz#093324403d4d955f5a16a7a8d39955d055ae10ed" + dependencies: + "@sindresorhus/is" "^0.7.0" + cacheable-request "^2.1.1" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + into-stream "^3.1.0" + is-retry-allowed "^1.1.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + mimic-response "^1.0.0" + p-cancelable "^0.4.0" + p-timeout "^2.0.1" + pify "^3.0.0" + safe-buffer "^5.1.1" + timed-out "^4.0.1" + url-parse-lax "^3.0.0" + url-to-options "^1.0.1" + +graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +graceful-fs@^3.0.0: + version "3.0.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + dependencies: + natives "^1.1.0" + +graceful-fs@~1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +grouped-queue@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/grouped-queue/-/grouped-queue-0.3.3.tgz#c167d2a5319c5a0e0964ef6a25b7c2df8996c85c" + dependencies: + lodash "^4.17.2" + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + +gulp-cssnano@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/gulp-cssnano/-/gulp-cssnano-2.1.3.tgz#02007e2817af09b3688482b430ad7db807aebf72" + dependencies: + buffer-from "^1.0.0" + cssnano "^3.0.0" + object-assign "^4.0.1" + plugin-error "^1.0.1" + vinyl-sourcemaps-apply "^0.2.1" + +gulp-decompress@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gulp-decompress/-/gulp-decompress-1.2.0.tgz#8eeb65a5e015f8ed8532cafe28454960626f0dc7" + dependencies: + archive-type "^3.0.0" + decompress "^3.0.0" + gulp-util "^3.0.1" + readable-stream "^2.0.2" + +gulp-htmlmin@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/gulp-htmlmin/-/gulp-htmlmin-4.0.0.tgz#266feaed83588838aedda3666f67d057ec120313" + dependencies: + bufferstreams "^1.1.0" + html-minifier "^3.0.3" + plugin-error "^0.1.2" + readable-stream "^2.0.2" + tryit "^1.0.1" + +gulp-imagemin@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/gulp-imagemin/-/gulp-imagemin-4.1.0.tgz#5ce347f1d1706fed3cc8f1777ca9094a583b50b7" + dependencies: + chalk "^2.1.0" + fancy-log "^1.3.2" + imagemin "^5.3.1" + plugin-error "^0.1.2" + plur "^2.1.2" + pretty-bytes "^4.0.2" + through2-concurrent "^1.1.1" + optionalDependencies: + imagemin-gifsicle "^5.2.0" + imagemin-jpegtran "^5.0.2" + imagemin-optipng "^5.2.1" + imagemin-svgo "^6.0.0" + +gulp-mocha@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gulp-mocha/-/gulp-mocha-6.0.0.tgz#80f32bc705ce30747f355ddb8ccd96a1c73bef13" + dependencies: + dargs "^5.1.0" + execa "^0.10.0" + mocha "^5.2.0" + npm-run-path "^2.0.2" + plugin-error "^1.0.1" + supports-color "^5.4.0" + through2 "^2.0.3" + +gulp-pug@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/gulp-pug/-/gulp-pug-4.0.1.tgz#5c5bb38303a5a565add8b200e292b4a076cf2efa" + dependencies: + "@types/pug" "^2.0.4" + fancy-log "^1.3.2" + plugin-error "^1.0.1" + pug "^2.0.3" + replace-ext "^1.0.0" + through2 "^2.0.3" + +gulp-rename@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.3.tgz#37b75298e9d3e6c0fe9ac4eac13ce3be5434646b" + +gulp-rename@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.3.0.tgz#2e789d8f563ab0c924eeb62967576f37ff4cb826" + +gulp-replace@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulp-replace/-/gulp-replace-1.0.0.tgz#b32bd61654d97b8d78430a67b3e8ce067b7c9143" + dependencies: + istextorbinary "2.2.1" + readable-stream "^2.0.1" + replacestream "^4.0.0" + +gulp-sourcemaps@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c" + dependencies: + convert-source-map "^1.1.1" + graceful-fs "^4.1.2" + strip-bom "^2.0.0" + through2 "^2.0.0" + vinyl "^1.0.0" + +gulp-sourcemaps@2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.6.4.tgz#cbb2008450b1bcce6cd23bf98337be751bf6e30a" + dependencies: + "@gulp-sourcemaps/identity-map" "1.X" + "@gulp-sourcemaps/map-sources" "1.X" + acorn "5.X" + convert-source-map "1.X" + css "2.X" + debug-fabulous "1.X" + detect-newline "2.X" + graceful-fs "4.X" + source-map "~0.6.0" + strip-bom-string "1.X" + through2 "2.X" + +gulp-stylus@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/gulp-stylus/-/gulp-stylus-2.7.0.tgz#f3e932626004927b75ea27ff5c1d3b0ba0b7cbb1" + dependencies: + accord "^0.26.3" + lodash.assign "^3.2.0" + plugin-error "^0.1.2" + replace-ext "0.0.1" + stylus "^0.54.0" + through2 "^2.0.0" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-tslint@8.1.3: + version "8.1.3" + resolved "https://registry.yarnpkg.com/gulp-tslint/-/gulp-tslint-8.1.3.tgz#a89ed144038ae861ee7bfea9528272d126a93da1" + dependencies: + "@types/fancy-log" "1.3.0" + chalk "2.3.1" + fancy-log "1.3.2" + map-stream "~0.0.7" + plugin-error "1.0.1" + through "~2.3.8" + +gulp-typescript@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/gulp-typescript/-/gulp-typescript-4.0.2.tgz#80bb9e376e7aa87b763a6ad5fe054a5d078da1e6" + dependencies: + ansi-colors "^1.0.1" + plugin-error "^0.1.2" + source-map "^0.6.1" + through2 "^2.0.3" + vinyl "^2.1.0" + vinyl-fs "^3.0.0" + +gulp-uglify@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.0.tgz#0df0331d72a0d302e3e37e109485dddf33c6d1ca" + dependencies: + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash "^4.13.1" + make-error-cause "^1.1.1" + through2 "^2.0.0" + uglify-js "^3.0.5" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-util@3.0.8, gulp-util@^3.0.0, gulp-util@^3.0.1: + version "3.0.8" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^2.0.0" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulp@3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" + dependencies: + archy "^1.0.0" + chalk "^1.0.0" + deprecated "^0.0.1" + gulp-util "^3.0.0" + interpret "^1.0.0" + liftoff "^2.1.0" + minimist "^1.1.0" + orchestrator "^0.3.0" + pretty-hrtime "^1.0.0" + semver "^4.1.0" + tildify "^1.0.0" + v8flags "^2.0.2" + vinyl-fs "^0.3.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + dependencies: + glogg "^1.0.0" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +hard-source-webpack-plugin@0.6.10: + version "0.6.10" + resolved "https://registry.yarnpkg.com/hard-source-webpack-plugin/-/hard-source-webpack-plugin-0.6.10.tgz#bae18a97c12150d31fa9d5e40625c65b0b10034d" + dependencies: + lodash "^4.15.0" + mkdirp "^0.5.1" + node-object-hash "^1.2.0" + rimraf "^2.6.2" + tapable "^1.0.0-beta.5" + webpack-core "~0.6.0" + webpack-sources "^1.0.1" + write-json-file "^2.3.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-color@~0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + dependencies: + sparkles "^1.0.0" + +has-symbol-support-x@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + +has-to-string-tag-x@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" + dependencies: + has-symbol-support-x "^1.4.1" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash-sum@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.4.tgz#8b50e1f35d51bd01e5ed9ece4dbe3549ccfa0a3c" + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.0" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + +he@1.1.1, he@1.1.x, he@^1.1.0, he@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + +highlight.js@9.12.0: + version "9.12.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +hoek@4.x.x: + version "4.2.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.6.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" + +html-comment-regex@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + dependencies: + whatwg-encoding "^1.0.1" + +html-entities@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + +html-minifier@3.5.16, html-minifier@^3.0.3: + version "3.5.16" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.16.tgz#39f5aabaf78bdfc057fe67334226efd7f3851175" + dependencies: + camel-case "3.0.x" + clean-css "4.1.x" + commander "2.15.x" + he "1.1.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.3.x" + +htmlparser2@^3.9.1: + version "3.9.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" + dependencies: + domelementtype "^1.3.0" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^2.0.2" + +http-assert@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.3.0.tgz#a31a5cf88c873ecbb5796907d4d6f132e8c01e4a" + dependencies: + deep-equal "~1.0.1" + http-errors "~1.6.1" + +http-cache-semantics@3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + +http-errors@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-errors@1.6.3, http-errors@^1.2.8, http-errors@^1.3.1, http-errors@^1.6.1, http-errors@~1.6.1, http-errors@~1.6.2, http-errors@~1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-signature@1.2.0, http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http_ece@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/http_ece/-/http_ece-1.0.5.tgz#b60660faaf14215102d1493ea720dcd92b53372f" + dependencies: + urlsafe-base64 "~1.0.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + +https-proxy-agent@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" + dependencies: + agent-base "^4.1.0" + debug "^3.1.0" + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + dependencies: + ms "^2.0.0" + +humanize-number@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/humanize-number/-/humanize-number-0.0.2.tgz#11c0af6a471643633588588048f1799541489c18" + +iconv-lite@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +iconv-lite@0.4.23, iconv-lite@^0.4.17, iconv-lite@^0.4.19, iconv-lite@^0.4.4, iconv-lite@~0.4.13: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + +icss-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" + dependencies: + postcss "^6.0.1" + +ieee754@^1.1.4: + version "1.1.12" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + dependencies: + minimatch "^3.0.4" + +ignore@^3.3.3, ignore@^3.3.5: + version "3.3.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b" + +imagemin-gifsicle@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/imagemin-gifsicle/-/imagemin-gifsicle-5.2.0.tgz#3781524c457612ef04916af34241a2b42bfcb40a" + dependencies: + exec-buffer "^3.0.0" + gifsicle "^3.0.0" + is-gif "^1.0.0" + +imagemin-jpegtran@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/imagemin-jpegtran/-/imagemin-jpegtran-5.0.2.tgz#e6882263b8f7916fddb800640cf75d2e970d2ad6" + dependencies: + exec-buffer "^3.0.0" + is-jpg "^1.0.0" + jpegtran-bin "^3.0.0" + +imagemin-optipng@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz#d22da412c09f5ff00a4339960b98a88b1dbe8695" + dependencies: + exec-buffer "^3.0.0" + is-png "^1.0.0" + optipng-bin "^3.0.0" + +imagemin-svgo@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/imagemin-svgo/-/imagemin-svgo-6.0.0.tgz#2dd8c82946be42a8e2cbcae3c5bf007bc2b8b9e8" + dependencies: + buffer-from "^0.1.1" + is-svg "^2.0.0" + svgo "^1.0.0" + +imagemin@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/imagemin/-/imagemin-5.3.1.tgz#f19c2eee1e71ba6c6558c515f9fc96680189a6d4" + dependencies: + file-type "^4.1.0" + globby "^6.1.0" + make-dir "^1.0.0" + p-pipe "^1.1.0" + pify "^2.3.0" + replace-ext "^1.0.0" + +import-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" + dependencies: + pkg-dir "^2.0.0" + resolve-cwd "^2.0.0" + +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" + dependencies: + repeating "^2.0.0" + +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +indx@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/indx/-/indx-0.2.3.tgz#15dcf56ee9cf65c0234c513c27fbd580e70fbc50" + +inflation@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@^1.3.4, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + +inquirer@3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347" + dependencies: + ansi-escapes "^1.1.0" + chalk "^1.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.1" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx "^4.1.0" + string-width "^2.0.0" + strip-ansi "^3.0.0" + through "^2.3.6" + +inquirer@5.2.0, inquirer@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.1.0" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^5.5.2" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +interpret@^1.0.0, interpret@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" + +into-stream@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" + dependencies: + from2 "^2.1.1" + p-is-promise "^1.1.0" + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +ip-regex@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" + +ipaddr.js@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b" + +irregular-plurals@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.4.0.tgz#2ca9b033651111855412f16be5d77c62a458a766" + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + +is-absolute@^0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f" + dependencies: + is-relative "^0.1.0" + +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + +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" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +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-bzip2@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-bzip2/-/is-bzip2-1.0.0.tgz#5ee58eaa5a2e9c80e21407bedf23ae5ac091b3fc" + +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-expression@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz#39acaa6be7fd1f3471dc42c7416e61c24317ac9f" + dependencies: + acorn "~4.0.2" + object-assign "^4.0.1" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + 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-generator-function@^1.0.3: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" + +is-gif@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-gif/-/is-gif-1.0.0.tgz#a6d2ae98893007bffa97a1d8c01d63205832097e" + +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" + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + dependencies: + is-extglob "^2.1.1" + +is-gzip@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" + +is-jpg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-1.0.1.tgz#296d57fdd99ce010434a7283e346ab9a1035e975" + +is-my-ip-valid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" + +is-my-json-valid@^2.12.4: + version "2.17.2" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz#6b2103a288e94ef3de5cf15d29dd85fc4b78d65c" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + is-my-ip-valid "^1.0.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-natural-number@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-2.1.1.tgz#7d4c5728377ef386c3e194a9911bf57c6dc335e7" + +is-negated-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" + +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-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + +is-observable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" + dependencies: + symbol-observable "^1.1.0" + +is-odd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" + dependencies: + is-number "^4.0.0" + +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.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + dependencies: + path-is-inside "^1.0.1" + +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + +is-png@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-png/-/is-png-1.1.0.tgz#d574b12bf275c0350455570b0e5b57ab062077ce" + +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" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-promise@^2.0.0, is-promise@^2.1, is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-regex@^1.0.3, is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-relative@^0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82" + +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + dependencies: + is-unc-path "^1.0.0" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + +is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + +is-root@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.0.0.tgz#838d1e82318144e5a6f77819d90207645acc7019" + +is-scoped@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-scoped/-/is-scoped-1.0.0.tgz#449ca98299e713038256289ecb2b540dc437cb30" + dependencies: + scoped-regex "^1.0.0" + +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-svg@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + +is-tar@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-tar/-/is-tar-1.0.0.tgz#2f6b2e1792c1f5bb36519acaa9d65c0d26fe853d" + +is-there@^4.0.0: + version "4.4.3" + resolved "https://registry.yarnpkg.com/is-there/-/is-there-4.4.3.tgz#a2c49366c6a487f719dbcad80cbde21248d2c18d" + +is-typedarray@^1.0.0, is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + dependencies: + unc-path-regex "^0.1.2" + +is-url@1.2.4, is-url@^1.2.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + +is-utf8@^0.2.0, is-utf8@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-valid-glob@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" + +is-valid-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" + +is-whitespace@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f" + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + +is-zip@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-zip/-/is-zip-1.0.0.tgz#47b0a8ff4d38a76431ccfd99a8e15a4c86ba2325" + +is2@0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/is2/-/is2-0.0.9.tgz#119556d1d1651a41ba105af803267c80b299f629" + dependencies: + deep-is "0.1.2" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +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" + +isarray@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7" + +isbinaryfile@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istextorbinary@2.2.1, istextorbinary@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.2.1.tgz#a5231a08ef6dd22b268d0895084cf8d58b5bec53" + dependencies: + binaryextensions "2" + editions "^1.3.3" + textextensions "2" + +isurl@^1.0.0-alpha5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" + dependencies: + has-to-string-tag-x "^1.2.0" + is-object "^1.0.1" + +jpegtran-bin@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz#f60ecf4ae999c0bdad2e9fbcdf2b6f0981e7a29b" + dependencies: + bin-build "^2.0.0" + bin-wrapper "^3.0.0" + logalot "^2.0.0" + +js-base64@^2.1.8, js-base64@^2.1.9: + version "2.4.5" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.5.tgz#e293cd3c7c82f070d700fc7a1ca0a2e69f101f92" + +js-beautify@^1.6.12: + version "1.7.5" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.7.5.tgz#69d9651ef60dbb649f65527b53674950138a7919" + dependencies: + config-chain "~1.1.5" + editorconfig "^0.13.2" + mkdirp "~0.5.0" + nopt "~3.0.1" + +js-stringify@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" + +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@3.11.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.4.6, js-yaml@^3.7.0, js-yaml@^3.8.4, js-yaml@^3.9.1: + version "3.12.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@~3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jschardet@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.6.0.tgz#c7d1a71edcff2839db2f9ec30fc5d5ebd3c1a678" + +jscodeshift@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.4.1.tgz#da91a1c2eccfa03a3387a21d39948e251ced444a" + dependencies: + async "^1.5.0" + babel-plugin-transform-flow-strip-types "^6.8.0" + babel-preset-es2015 "^6.9.0" + babel-preset-stage-1 "^6.5.0" + babel-register "^6.9.0" + babylon "^6.17.3" + colors "^1.1.2" + flow-parser "^0.*" + lodash "^4.13.1" + micromatch "^2.3.7" + node-dir "0.1.8" + nomnom "^1.8.1" + recast "^0.12.5" + temp "^0.8.1" + write-file-atomic "^1.2.0" + +jscodeshift@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.5.1.tgz#4af6a721648be8638ae1464a190342da52960c33" + dependencies: + babel-plugin-transform-flow-strip-types "^6.8.0" + babel-preset-es2015 "^6.9.0" + babel-preset-stage-1 "^6.5.0" + babel-register "^6.9.0" + babylon "^7.0.0-beta.47" + colors "^1.1.2" + flow-parser "^0.*" + lodash "^4.13.1" + micromatch "^2.3.7" + neo-async "^2.5.0" + node-dir "0.1.8" + nomnom "^1.8.1" + recast "^0.15.0" + temp "^0.8.1" + write-file-atomic "^1.2.0" + +jsdom@11.11.0: + version "11.11.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.11.0.tgz#df486efad41aee96c59ad7a190e2449c7eb1110e" + dependencies: + abab "^1.0.4" + acorn "^5.3.0" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.3.1 < 0.4.0" + data-urls "^1.0.0" + domexception "^1.0.0" + escodegen "^1.9.0" + html-encoding-sniffer "^1.0.2" + left-pad "^1.2.0" + nwsapi "^2.0.0" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.83.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.3" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^4.0.0" + xml-name-validator "^3.0.0" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + +json-schema-ref-parser@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-1.4.1.tgz#c0c2e438bf0796723b02451bae8bc7dd0b37fed0" + dependencies: + call-me-maybe "^1.0.1" + debug "^2.2.0" + es6-promise "^3.0.2" + js-yaml "^3.4.6" + ono "^2.0.1" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + +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-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + +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: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@0.5.1, json5@^0.5.0, json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + optionalDependencies: + graceful-fs "^4.1.6" + +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.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jstransformer@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" + dependencies: + is-promise "^2.0.0" + promise "^7.0.1" + +jwa@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.6.tgz#87240e76c9808dbde18783cf2264ef4929ee50e6" + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.10" + safe-buffer "^5.0.1" + +jws@^3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.5.tgz#80d12d05b293d1e841e7cb8b4e69e561adcf834f" + dependencies: + jwa "^1.1.5" + safe-buffer "^5.0.1" + +keygrip@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.2.tgz#ad3297c557069dea8bcfe7a4fa491b75c5ddeb91" + +keyv@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" + dependencies: + json-buffer "3.0.0" + +kind-of@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + +koa-bodyparser@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-4.2.1.tgz#4d7dacb5e6db1106649b595d9e5ccb158b6f3b29" + dependencies: + co-body "^6.0.0" + copy-to "^2.0.1" + +koa-compose@^3.0.0, koa-compose@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" + dependencies: + any-promise "^1.1.0" + +koa-compose@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" + +koa-compress@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/koa-compress/-/koa-compress-3.0.0.tgz#3194059c215cbc24e59bbc84c2c7453a4c88564f" + dependencies: + bytes "^3.0.0" + compressible "^2.0.0" + koa-is-json "^1.0.0" + statuses "^1.0.0" + +koa-convert@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0" + dependencies: + co "^4.6.0" + koa-compose "^3.0.0" + +koa-favicon@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/koa-favicon/-/koa-favicon-2.0.1.tgz#cfae363e5fd00bd5dd67c1150fbef31e0b5d6f4d" + dependencies: + mz "^2.7.0" + +koa-is-json@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/koa-is-json/-/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14" + +koa-json-body@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/koa-json-body/-/koa-json-body-5.3.0.tgz#64aad3f400adfb81df54b63f7a5eb38bad62d980" + dependencies: + co-body "^5.0.0" + +koa-logger@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/koa-logger/-/koa-logger-3.2.0.tgz#8aef64d8b848fb6253a9b31aa708d0e05141f0e6" + dependencies: + bytes "^2.5.0" + chalk "^1.1.3" + humanize-number "0.0.2" + passthrough-counter "^1.0.0" + +koa-mount@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/koa-mount/-/koa-mount-3.0.0.tgz#08cab3b83d31442ed8b7e75c54b1abeb922ec197" + dependencies: + debug "^2.6.1" + koa-compose "^3.2.1" + +koa-multer@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/koa-multer/-/koa-multer-1.0.2.tgz#d38f7ffd1db97b1aad33e7774732f000ebd67259" + dependencies: + multer "1.3.0" + +koa-router@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/koa-router/-/koa-router-7.4.0.tgz#aee1f7adc02d5cb31d7d67465c9eacc825e8c5e0" + dependencies: + debug "^3.1.0" + http-errors "^1.3.1" + koa-compose "^3.0.0" + methods "^1.0.1" + path-to-regexp "^1.1.1" + urijs "^1.19.0" + +koa-send@4.1.3, koa-send@^4.0.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/koa-send/-/koa-send-4.1.3.tgz#0822207bbf5253a414c8f1765ebc29fa41353cb6" + dependencies: + debug "^2.6.3" + http-errors "^1.6.1" + mz "^2.6.0" + resolve-path "^1.4.0" + +koa-slow@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/koa-slow/-/koa-slow-2.1.0.tgz#39007ca628c620f2b307b90dbf423d7a0c9be971" + dependencies: + lodash.isregexp "3.0.5" + q "1.4.1" + +koa-views@6.1.4: + version "6.1.4" + resolved "https://registry.yarnpkg.com/koa-views/-/koa-views-6.1.4.tgz#595eb683ca17d8dfaa1d100b42ba4e34c762154d" + dependencies: + consolidate "^0.15.0" + debug "^3.1.0" + get-paths "^0.0.2" + koa-send "^4.0.0" + mz "^2.4.0" + pretty "^2.0.0" + +koa@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/koa/-/koa-2.5.1.tgz#79f8b95f8d72d04fe9a58a8da5ebd6d341103f9c" + dependencies: + accepts "^1.2.2" + content-disposition "~0.5.0" + content-type "^1.0.0" + cookies "~0.7.0" + debug "*" + delegates "^1.0.0" + depd "^1.1.0" + destroy "^1.0.3" + error-inject "~1.0.0" + escape-html "~1.0.1" + fresh "^0.5.2" + http-assert "^1.1.0" + http-errors "^1.2.8" + is-generator-function "^1.0.3" + koa-compose "^4.0.0" + koa-convert "^1.2.0" + koa-is-json "^1.0.0" + mime-types "^2.0.7" + on-finished "^2.1.0" + only "0.0.2" + parseurl "^1.3.0" + statuses "^1.2.0" + type-is "^1.5.5" + vary "^1.0.0" + +kue@0.11.6: + version "0.11.6" + resolved "https://registry.yarnpkg.com/kue/-/kue-0.11.6.tgz#5b76916bcedd56636a107861471c63c94611860a" + dependencies: + body-parser "^1.12.2" + express "^4.12.2" + lodash "^4.0.0" + nib "~1.1.2" + node-redis-warlock "~0.2.0" + pug "^2.0.0-beta3" + redis "~2.6.0-2" + stylus "~0.54.5" + yargs "^4.0.0" + optionalDependencies: + reds "^0.2.5" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lazy-req@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac" + +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + dependencies: + readable-stream "^2.0.5" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +lead@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" + dependencies: + flush-write-stream "^1.0.2" + +leb@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/leb/-/leb-0.3.0.tgz#32bee9fad168328d6aea8522d833f4180eed1da3" + +left-pad@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + +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" + +license-checker@20.0.0: + version "20.0.0" + resolved "https://registry.yarnpkg.com/license-checker/-/license-checker-20.0.0.tgz#29b338ba7f4e841b850cc59ddd393dbc8927f375" + dependencies: + chalk "^2.4.1" + debug "^3.1.0" + mkdirp "^0.5.1" + nopt "^4.0.1" + read-installed "~4.0.3" + semver "^5.5.0" + spdx "^0.5.1" + spdx-correct "^3.0.0" + spdx-satisfies "^4.0.0" + strip-ansi "^4.0.0" + treeify "^1.1.0" + +liftoff@^2.1.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" + dependencies: + extend "^3.0.0" + findup-sync "^2.0.0" + fined "^1.0.1" + flagged-respawn "^1.0.0" + is-plain-object "^2.0.4" + object.map "^1.0.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + +listr-update-renderer@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz#344d980da2ca2e8b145ba305908f32ae3f4cc8a7" + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^1.0.2" + strip-ansi "^3.0.1" + +listr-verbose-renderer@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35" + dependencies: + chalk "^1.1.3" + cli-cursor "^1.0.2" + date-fns "^1.27.2" + figures "^1.7.0" + +listr@^0.14.1: + version "0.14.1" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.1.tgz#8a7afa4a7135cee4c921d128e0b7dfc6e522d43d" + dependencies: + "@samverschueren/stream-to-observable" "^0.3.0" + cli-truncate "^0.2.1" + figures "^1.7.0" + indent-string "^2.1.0" + is-observable "^1.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.4.0" + listr-verbose-renderer "^0.4.0" + log-symbols "^1.0.2" + log-update "^1.0.2" + ora "^0.2.3" + p-map "^1.1.1" + rxjs "^6.1.0" + strip-ansi "^3.0.1" + +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" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + +loader-utils@1.1.0, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + +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._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +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@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +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.assignin@^4.0.9: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + +lodash.bind@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + +lodash.clone@^4.3.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" + +lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + +lodash.defaults@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + dependencies: + lodash._root "^3.0.0" + +lodash.filter@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + +lodash.foreach@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + +lodash.get@^4.0.0, lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isequal@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + +lodash.isregexp@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/lodash.isregexp/-/lodash.isregexp-3.0.5.tgz#e0f596242f2fa228a840086b6c8ad82e4b71fd2d" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.map@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + +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@^4.4.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" + +lodash.mergewith@^4.6.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" + +lodash.partialright@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.partialright/-/lodash.partialright-4.2.1.tgz#0130d80e83363264d40074f329b8a3e7a8a1cc4b" + +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + +lodash.reduce@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" + +lodash.reject@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.some@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + +lodash.startcase@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" + +lodash.tail@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + +lodash.uniq@^4.3.0, lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + +lodash@^3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.3.0, lodash@~4.17.10: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + +lodash@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" + +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + dependencies: + chalk "^1.0.0" + +log-symbols@^2.1.0, log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + dependencies: + chalk "^2.0.1" + +log-update@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" + dependencies: + ansi-escapes "^1.0.0" + cli-cursor "^1.0.2" + +logalot@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/logalot/-/logalot-2.1.0.tgz#5f8e8c90d304edf12530951a5554abb8c5e3f552" + dependencies: + figures "^1.3.5" + squeak "^1.0.0" + +long@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" + +longest@^1.0.0, longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + 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" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + +lowercase-keys@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + +lpad-align@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/lpad-align/-/lpad-align-1.1.2.tgz#21f600ac1c3095c3c6e497ee67271ee08481fe9e" + dependencies: + get-stdin "^4.0.1" + indent-string "^2.1.0" + longest "^1.0.0" + meow "^3.3.0" + +lru-cache@2, lru-cache@^2.5.0: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +lru-cache@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee" + dependencies: + pseudomap "^1.0.1" + +lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-queue@0.1: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" + dependencies: + es5-ext "~0.10.2" + +make-dir@^1.0.0, make-dir@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + dependencies: + pify "^3.0.0" + +make-error-cause@^1.1.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d" + dependencies: + make-error "^1.2.0" + +make-error@^1.1.1, make-error@^1.2.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535" + +make-iterator@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" + dependencies: + kind-of "^6.0.2" + +map-cache@^0.2.0, map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +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" + +map-stream@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8" + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + +math-expression-evaluator@^1.2.14: + version "1.2.17" + resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" + +math-random@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" + +md5.js@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +mdn-data@^1.0.0, mdn-data@~1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" + +mecab-async@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/mecab-async/-/mecab-async-0.1.2.tgz#69efb838729216709597a57da2df03922f9b593a" + dependencies: + shell-quote "*" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +mem-fs-editor@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/mem-fs-editor/-/mem-fs-editor-4.0.2.tgz#55a79b1e824da631254c4c95ba6366602c77af90" + dependencies: + commondir "^1.0.1" + deep-extend "^0.5.1" + ejs "^2.5.9" + glob "^7.0.3" + globby "^8.0.0" + isbinaryfile "^3.0.2" + mkdirp "^0.5.0" + multimatch "^2.0.0" + rimraf "^2.2.8" + through2 "^2.0.0" + vinyl "^2.0.1" + +mem-fs@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/mem-fs/-/mem-fs-1.1.3.tgz#b8ae8d2e3fcb6f5d3f9165c12d4551a065d989cc" + dependencies: + through2 "^2.0.0" + vinyl "^1.1.0" + vinyl-file "^2.0.0" + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + +memoizee@0.4.X: + version "0.4.12" + resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.12.tgz#780e99a219c50c549be6d0fc61765080975c58fb" + dependencies: + d "1" + es5-ext "^0.10.30" + es6-weak-map "^2.0.2" + event-emitter "^0.3.5" + is-promise "^2.1" + lru-queue "0.1" + next-tick "1" + timers-ext "^0.1.2" + +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.1.0, meow@^3.3.0, meow@^3.5.0, 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" + +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + dependencies: + source-map "^0.6.1" + +merge-stream@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + dependencies: + readable-stream "^2.0.1" + +merge2@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.2.tgz#03212e3da8d86c4d8523cebd6318193414f94e34" + +methods@^1.0.1, methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.1.5, micromatch@^2.3.7: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +"mime-db@>= 1.34.0 < 2": + version "1.34.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.34.0.tgz#452d0ecff5c30346a6dc1e64b1eaee0d3719ff9a" + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + +mime-types@^2.0.7, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + dependencies: + mime-db "~1.33.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + +mime@^2.0.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + +mimic-response@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimatch@^2.0.1: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + dependencies: + brace-expansion "^1.0.0" + +minimatch@~0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" + +minipass@^2.2.1, minipass@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" + dependencies: + minipass "^2.2.1" + +mississippi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^2.0.1" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mocha@5.2.0, mocha@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" + dependencies: + browser-stdout "1.3.1" + commander "2.15.1" + debug "3.1.0" + diff "3.5.0" + escape-string-regexp "1.0.5" + glob "7.1.2" + growl "1.10.5" + he "1.1.1" + minimatch "3.0.4" + mkdirp "0.5.1" + supports-color "5.4.0" + +moji@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/moji/-/moji-0.5.1.tgz#088eecd1c22c8f31a240adcf9c95e54f33eb54fb" + dependencies: + object-assign "^3.0.0" + +mongodb-core@2.1.19: + version "2.1.19" + resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.1.19.tgz#00fbd5e5a3573763b9171cfd844e60a8f2a3a18b" + dependencies: + bson "~1.0.4" + require_optional "~1.0.0" + +mongodb-core@3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-3.0.9.tgz#8327410c88811013fb3e4ac7c4c670f324349be1" + dependencies: + bson "~1.0.4" + require_optional "^1.0.1" + +mongodb@3.0.10: + version "3.0.10" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.0.10.tgz#f948cb9595adcbfcad7444f6b24a040b653b23e8" + dependencies: + mongodb-core "3.0.9" + +mongodb@^2.1.18: + version "2.2.35" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.2.35.tgz#cd1b5af8a9463e3f9a787fa5b3d05565579730f9" + dependencies: + es6-promise "3.2.1" + mongodb-core "2.1.19" + readable-stream "2.2.7" + +monk-middleware-cast-ids@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/monk-middleware-cast-ids/-/monk-middleware-cast-ids-0.2.1.tgz#40c40e5a6cb33ccedc289220943275ee8861c529" + +monk-middleware-fields@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/monk-middleware-fields/-/monk-middleware-fields-0.2.0.tgz#ff637af35f5948879ccb2be15a91360911bea6c1" + +monk-middleware-handle-callback@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/monk-middleware-handle-callback/-/monk-middleware-handle-callback-0.2.2.tgz#47de6cc1248726c72a2be0c81bc4e68310c32146" + +monk-middleware-options@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/monk-middleware-options/-/monk-middleware-options-0.2.1.tgz#58dae1c518d46636ebdff506fadfc773bb442886" + +monk-middleware-query@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/monk-middleware-query/-/monk-middleware-query-0.2.0.tgz#a926c677d4a5620c62151b0a56d0c0c151675874" + +monk-middleware-wait-for-connection@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/monk-middleware-wait-for-connection/-/monk-middleware-wait-for-connection-0.2.0.tgz#312958d30e588b57d09754dd7c97b4843316835a" + +monk@6.0.6: + version "6.0.6" + resolved "https://registry.yarnpkg.com/monk/-/monk-6.0.6.tgz#2ff1cd57f001bba0fea73d1eea3952a7d35450c5" + dependencies: + debug "*" + mongodb "^2.1.18" + monk-middleware-cast-ids "^0.2.1" + monk-middleware-fields "^0.2.0" + monk-middleware-handle-callback "^0.2.0" + monk-middleware-options "^0.2.1" + monk-middleware-query "^0.2.0" + monk-middleware-wait-for-connection "^0.2.0" + object-assign "^4.1.1" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +ms@2.1.1, ms@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + +multer@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/multer/-/multer-1.3.0.tgz#092b2670f6846fa4914965efc8cf94c20fec6cd2" + dependencies: + append-field "^0.1.0" + busboy "^0.2.11" + concat-stream "^1.5.0" + mkdirp "^0.5.1" + object-assign "^3.0.0" + on-finished "^2.3.0" + type-is "^1.6.4" + xtend "^4.0.0" + +multimatch@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" + dependencies: + array-differ "^1.0.0" + array-union "^1.0.1" + arrify "^1.0.0" + minimatch "^3.0.0" + +multipipe@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + dependencies: + duplexer2 "0.0.2" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +mz@^2.4.0, mz@^2.6.0, mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nan@2.10.0, nan@^2.10.0, nan@^2.3.3, nan@^2.5.0, nan@^2.9.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + +nanomatch@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-odd "^2.0.0" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natives@^1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.4.tgz#2f0f224fc9a7dd53407c7667c84cf8dbe773de58" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +natural@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/natural/-/natural-0.2.1.tgz#1eb5156a9d90b4591949e20e94ebc77bb2339eda" + dependencies: + apparatus ">= 0.0.9" + sylvester ">= 0.0.12" + underscore ">=1.3.1" + +needle@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +neo-async@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" + +next-tick@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + +nib@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/nib/-/nib-1.1.2.tgz#6a69ede4081b95c0def8be024a4c8ae0c2cbb6c7" + dependencies: + stylus "0.54.5" + +nice-try@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + dependencies: + lower-case "^1.1.1" + +node-dir@0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.8.tgz#55fb8deb699070707fb67f91a460f0448294c77d" + +node-fetch@1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-gyp@^3.3.1: + version "3.7.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.7.0.tgz#789478e8f6c45e277aa014f3e28f958f286f9203" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request ">=2.9.0 <2.82.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-libs-browser@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.0" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + +node-object-hash@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/node-object-hash/-/node-object-hash-1.4.1.tgz#de968492e20c493b8bbc25ad2ee828265fd60934" + +node-pre-gyp@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46" + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.0" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.1.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-redis-scripty@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/node-redis-scripty/-/node-redis-scripty-0.0.5.tgz#4bf2d365ab6dab202cc08b7ac63f8f55aadc9625" + dependencies: + extend "^1.2.1" + lru-cache "^2.5.0" + +node-redis-warlock@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/node-redis-warlock/-/node-redis-warlock-0.2.0.tgz#56395b994c828e8e32f6aae53b93b6edfcd97990" + dependencies: + node-redis-scripty "0.0.5" + uuid "^2.0.1" + +node-sass-json-importer@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/node-sass-json-importer/-/node-sass-json-importer-3.2.0.tgz#9cfe2355035d5437b7c2ecb535450bf6acde8195" + dependencies: + is-there "^4.0.0" + json5 "0.5.1" + lodash "^3.10.1" + +node-sass@4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.0.tgz#d1b8aa855d98ed684d6848db929a20771cc2ae52" + 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" + lodash.mergewith "^4.6.0" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.10.0" + node-gyp "^3.3.1" + npmlog "^4.0.0" + request "~2.79.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +node-status-codes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" + +nomnom@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7" + dependencies: + chalk "~0.4.0" + underscore "~1.6.0" + +"nopt@2 || 3", nopt@~3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +nopt@4.0.1, nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + 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.0, normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + +normalize-url@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" + dependencies: + prepend-http "^2.0.0" + query-string "^5.0.1" + sort-keys "^2.0.0" + +normalize-url@^1.4.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +normalize-wheel@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz#aec886affdb045070d856447df62ecf86146ec45" + +now-and-later@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.0.tgz#bc61cbb456d79cb32207ce47ca05136ff2e7d6ee" + dependencies: + once "^1.3.2" + +npm-bundled@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + +npm-packlist@^1.1.6: + version "1.1.10" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0, npm-run-path@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nprogress@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + +nth-check@^1.0.1, nth-check@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" + dependencies: + boolbase "~1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +nwsapi@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.3.tgz#3f4010d6c943f34018d3dfb5f2fbc0de90476959" + +oauth-sign@~0.8.1, oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +oauth@0.9.15: + version "0.9.15" + resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" + +object-assign-deep@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-assign-deep/-/object-assign-deep-0.4.0.tgz#43505d3679abb9686ab359b97ac14cc837a9d143" + +object-assign@4.X, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-assign@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.11, object-keys@^1.0.8: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + +object.assign@^4.0.1, object.assign@^4.0.4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.defaults@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.map@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.2.0, object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + +object.values@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.6.1" + function-bind "^1.1.0" + has "^1.0.1" + +on-build-webpack@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/on-build-webpack/-/on-build-webpack-0.1.0.tgz#a287c0e17766e6141926e5f2cbb0d8bb53b76814" + +on-finished@^2.1.0, on-finished@^2.3.0, on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +onetime@^1.0.0: + version "1.1.0" + resolved "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +only@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" + +ono@^2.0.1: + version "2.2.5" + resolved "https://registry.yarnpkg.com/ono/-/ono-2.2.5.tgz#daf09488b51174da7a7e4275dfab31b438ffa0e3" + +ono@^4.0.2: + version "4.0.5" + resolved "https://registry.yarnpkg.com/ono/-/ono-4.0.5.tgz#bc62740493a5c1c08b2c21e60cbb0e5c56ab7de2" + dependencies: + format-util "^1.0.3" + +opencollective@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1" + dependencies: + babel-polyfill "6.23.0" + chalk "1.1.3" + inquirer "3.0.6" + minimist "1.2.0" + node-fetch "1.6.3" + opn "4.0.2" + +opn@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + +optionator@^0.8.1, 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" + +optipng-bin@^3.0.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-3.1.4.tgz#95d34f2c488704f6fd70606bfea0c659f1d95d84" + dependencies: + bin-build "^2.0.0" + bin-wrapper "^3.0.0" + logalot "^2.0.0" + +ora@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" + dependencies: + chalk "^1.1.1" + cli-cursor "^1.0.2" + cli-spinners "^0.1.2" + object-assign "^4.0.1" + +orchestrator@^0.3.0: + version "0.3.8" + resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" + dependencies: + end-of-stream "~0.1.5" + sequencify "~0.0.7" + stream-consume "~0.1.0" + +ordered-read-streams@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" + +ordered-read-streams@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" + dependencies: + is-stream "^1.0.1" + readable-stream "^2.0.1" + +ordered-read-streams@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" + dependencies: + readable-stream "^2.0.1" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + +os-filter-obj@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-1.0.3.tgz#5915330d90eced557d2d938a31c6dd214d9c63ad" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-locale@^2.0.0, os-locale@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-shim@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +os-utils@0.0.14: + version "0.0.14" + resolved "https://registry.yarnpkg.com/os-utils/-/os-utils-0.0.14.tgz#29e511697b1982b8c627722175fe39797ef64156" + +osenv@0, osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-cancelable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" + +p-cancelable@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + dependencies: + p-reduce "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-is-promise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + +p-lazy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-lazy/-/p-lazy-1.0.0.tgz#ec53c802f2ee3ac28f166cc82d0b2b02de27a835" + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + dependencies: + p-try "^1.0.0" + +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" + +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + +p-pipe@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9" + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + +p-timeout@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" + dependencies: + p-finally "^1.0.0" + +p-timeout@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" + dependencies: + p-finally "^1.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + +pako@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@2.1.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + dependencies: + no-case "^2.2.0" + +parse-asn1@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + +parse-filepath@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.1.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" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + +parse5@*, parse5@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.0.0.tgz#4d02710d44f3c3846197a11e205d4ef17842b81a" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + +parseurl@^1.3.0, parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + +passthrough-counter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passthrough-counter/-/passthrough-counter-1.0.0.tgz#1967d9e66da572b5c023c787db112a387ab166fa" + +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + 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.1, path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + 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, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + dependencies: + path-root-regex "^0.1.0" + +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-to-regexp@^1.1.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + dependencies: + isarray "0.0.1" + +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" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + dependencies: + pify "^3.0.0" + +pbkdf2@^3.0.3: + version "3.0.16" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + +plugin-error@1.0.1, plugin-error@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" + dependencies: + ansi-colors "^1.0.1" + arr-diff "^4.0.0" + arr-union "^3.1.0" + extend-shallow "^3.0.2" + +plugin-error@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" + dependencies: + ansi-cyan "^0.1.1" + ansi-red "^0.1.1" + arr-diff "^1.0.1" + arr-union "^2.0.1" + extend-shallow "^1.1.2" + +plur@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" + dependencies: + irregular-plurals "^1.0.0" + +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + +pngjs@^3.3.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.3.tgz#85173703bde3edac8998757b96e5821d0966a21b" + +popper.js@^1.12.9: + version "1.14.3" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.3.tgz#1438f98d046acf7b4d78cd502bf418ac64d4f095" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + +postcss-calc@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" + dependencies: + postcss "^5.0.2" + postcss-message-helpers "^2.0.0" + reduce-css-calc "^1.2.6" + +postcss-colormin@^2.1.8: + version "2.2.2" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" + dependencies: + colormin "^1.0.5" + postcss "^5.0.13" + postcss-value-parser "^3.2.3" + +postcss-convert-values@^2.3.4: + version "2.6.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" + dependencies: + postcss "^5.0.11" + postcss-value-parser "^3.1.2" + +postcss-discard-comments@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" + dependencies: + postcss "^5.0.14" + +postcss-discard-duplicates@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" + dependencies: + postcss "^5.0.4" + +postcss-discard-empty@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" + dependencies: + postcss "^5.0.14" + +postcss-discard-overridden@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" + dependencies: + postcss "^5.0.16" + +postcss-discard-unused@^2.2.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" + dependencies: + postcss "^5.0.14" + uniqs "^2.0.0" + +postcss-filter-plugins@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" + dependencies: + postcss "^5.0.4" + +postcss-merge-idents@^2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" + dependencies: + has "^1.0.1" + postcss "^5.0.10" + postcss-value-parser "^3.1.1" + +postcss-merge-longhand@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" + dependencies: + postcss "^5.0.4" + +postcss-merge-rules@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" + dependencies: + browserslist "^1.5.2" + caniuse-api "^1.5.2" + postcss "^5.0.4" + postcss-selector-parser "^2.2.2" + vendors "^1.0.0" + +postcss-message-helpers@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" + +postcss-minify-font-values@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" + dependencies: + object-assign "^4.0.1" + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-minify-gradients@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" + dependencies: + postcss "^5.0.12" + postcss-value-parser "^3.3.0" + +postcss-minify-params@^1.0.4: + version "1.2.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.2" + postcss-value-parser "^3.0.2" + uniqs "^2.0.0" + +postcss-minify-selectors@^2.0.4: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" + dependencies: + alphanum-sort "^1.0.2" + has "^1.0.1" + postcss "^5.0.14" + postcss-selector-parser "^2.0.0" + +postcss-modules-extract-imports@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" + dependencies: + postcss "^6.0.1" + +postcss-modules-local-by-default@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-scope@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-values@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + +postcss-normalize-charset@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" + dependencies: + postcss "^5.0.5" + +postcss-normalize-url@^3.0.7: + version "3.0.8" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^1.4.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + +postcss-ordered-values@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.1" + +postcss-reduce-idents@^2.2.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-reduce-initial@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" + dependencies: + postcss "^5.0.4" + +postcss-reduce-transforms@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" + dependencies: + has "^1.0.1" + postcss "^5.0.8" + postcss-value-parser "^3.0.1" + +postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" + dependencies: + dot-prop "^4.1.1" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^2.1.1: + version "2.1.6" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" + dependencies: + is-svg "^2.0.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + svgo "^0.7.0" + +postcss-unique-selectors@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + +postcss-zindex@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" + dependencies: + has "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: + version "5.2.18" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^6.0.1, postcss@^6.0.20: + version "6.0.22" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.22.tgz#e23b78314905c3b90cbd61702121e7a78848f2a3" + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.0, prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +prettier@^1.12.1, prettier@^1.13.0: + version "1.13.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.5.tgz#7ae2076998c8edce79d63834e9b7b09fead6bfd0" + +pretty-bytes@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9" + +pretty-hrtime@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + +pretty@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5" + dependencies: + condense-newlines "^0.2.1" + extend-shallow "^2.0.1" + js-beautify "^1.6.12" + +prettyjson@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prettyjson/-/prettyjson-1.2.1.tgz#fcffab41d19cab4dfae5e575e64246619b12d289" + dependencies: + colors "^1.1.2" + minimist "^1.2.0" + +printj@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" + +private@^0.1.6, private@^0.1.8, private@~0.1.5: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + +progress-bar-webpack-plugin@1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/progress-bar-webpack-plugin/-/progress-bar-webpack-plugin-1.11.0.tgz#4f801288443c55ec029b20cbfdcbf3e1dc17f852" + dependencies: + chalk "^1.1.1" + object.assign "^4.0.1" + progress "^1.1.8" + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + +prominence@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/prominence/-/prominence-0.2.0.tgz#38704264981ddf65e5b00b0b5cfce6e53348f2b2" + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + +promise-sequential@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/promise-sequential/-/promise-sequential-1.1.1.tgz#f79e8950ef86e7a7a85bf320452643592f6d2fb2" + +promise@^7.0.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + +proxy-addr@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.6.0" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + +pseudomap@^1.0.1, pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +psl@^1.1.24: + version "1.1.28" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" + +public-encrypt@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + +pug-attrs@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.3.tgz#a3095f970e64151f7bdad957eef55fb5d7905d15" + dependencies: + constantinople "^3.0.1" + js-stringify "^1.0.1" + pug-runtime "^2.0.4" + +pug-code-gen@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.1.tgz#0951ec83225d74d8cfc476a7f99a259b5f7d050c" + dependencies: + constantinople "^3.0.1" + doctypes "^1.1.0" + js-stringify "^1.0.1" + pug-attrs "^2.0.3" + pug-error "^1.3.2" + pug-runtime "^2.0.4" + void-elements "^2.0.1" + with "^5.0.0" + +pug-error@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.2.tgz#53ae7d9d29bb03cf564493a026109f54c47f5f26" + +pug-filters@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.0.tgz#27165555bc04c236e4aa2b0366246dfa021b626e" + dependencies: + clean-css "^4.1.11" + constantinople "^3.0.1" + jstransformer "1.0.0" + pug-error "^1.3.2" + pug-walk "^1.1.7" + resolve "^1.1.6" + uglify-js "^2.6.1" + +pug-lexer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.0.0.tgz#210c18457ef2e1760242740c5e647bd794cec278" + dependencies: + character-parser "^2.1.1" + is-expression "^3.0.0" + pug-error "^1.3.2" + +pug-linker@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.5.tgz#9e9a7ae4005682d027deeb96b000f88eeb83a02f" + dependencies: + pug-error "^1.3.2" + pug-walk "^1.1.7" + +pug-load@^2.0.11: + version "2.0.11" + resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.11.tgz#e648e57ed113fe2c1f45d57858ea2bad6bc01527" + dependencies: + object-assign "^4.1.0" + pug-walk "^1.1.7" + +pug-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.0.tgz#e394ad9b3fca93123940aff885c06e44ab7e68e4" + dependencies: + pug-error "^1.3.2" + token-stream "0.0.1" + +pug-runtime@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.4.tgz#e178e1bda68ab2e8c0acfc9bced2c54fd88ceb58" + +pug-strip-comments@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz#f1559592206edc6f85310dacf4afb48a025af59f" + dependencies: + pug-error "^1.3.2" + +pug-walk@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.7.tgz#c00d5c5128bac5806bec15d2b7e7cdabe42531f3" + +pug@2.0.3, pug@^2.0.0-beta3, pug@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.3.tgz#71cba82537c95a5eab7ed04696e4221f53aa878e" + dependencies: + pug-code-gen "^2.0.1" + pug-filters "^3.1.0" + pug-lexer "^4.0.0" + pug-linker "^3.0.5" + pug-load "^2.0.11" + pug-parser "^5.0.0" + pug-runtime "^2.0.4" + pug-strip-comments "^1.0.3" + +pump@^2.0.0, pump@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3, pumpify@^1.3.5: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +punycode@2.1.1, punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +q@0.9.7: + version "0.9.7" + resolved "https://registry.yarnpkg.com/q/-/q-0.9.7.tgz#4de2e6cb3b29088c9e4cbc03bf9d42fb96ce2f75" + +q@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + +qrcode@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.2.0.tgz#330d24313fbf8d429a806091af9525250239e44a" + dependencies: + can-promise "^0.0.1" + dijkstrajs "^1.0.1" + isarray "^2.0.1" + pngjs "^3.3.0" + yargs "^8.0.2" + +qs@6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +qs@6.5.2, qs@^6.4.0, qs@^6.5.2, qs@~6.5.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + +qs@~6.3.0: + version "6.3.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +query-string@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +randomatic@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +rangestr@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/rangestr/-/rangestr-0.0.1.tgz#f72ff9246f10f2a7d7c16e14616f617be2c2635a" + +ratelimiter@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ratelimiter/-/ratelimiter-3.0.3.tgz#6dbca58b05422f2a08e224d4ba3a0cfb86c30966" + +raw-body@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + dependencies: + bytes "3.0.0" + http-errors "1.6.2" + iconv-lite "0.4.19" + unpipe "1.0.0" + +raw-body@2.3.3, raw-body@^2.2.0, raw-body@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + +rc@^1.1.2, rc@^1.1.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-all-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" + dependencies: + pinkie-promise "^2.0.0" + readable-stream "^2.0.0" + +read-chunk@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-2.1.0.tgz#6a04c0928005ed9d42e1a6ac5600e19cbc7ff655" + dependencies: + pify "^3.0.0" + safe-buffer "^5.1.1" + +read-installed@~4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" + dependencies: + debuglog "^1.0.1" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + semver "2 || 3 || 4 || 5" + slide "~1.1.3" + util-extend "^1.0.1" + optionalDependencies: + graceful-fs "^4.1.2" + +read-package-json@^2.0.0: + version "2.0.13" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a" + dependencies: + glob "^7.1.1" + json-parse-better-errors "^1.0.1" + normalize-package-data "^2.0.0" + slash "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.2" + +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-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + dependencies: + find-up "^2.0.0" + read-pkg "^3.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" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@1.1.x, readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@2.2.7: + version "2.2.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.7.tgz#07057acbe2467b22042d36f98c5ad507054e95b1" + 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" + +"readable-stream@>=1.0.33-1 <1.1.0-0": + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdir-scoped-modules@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + graceful-fs "^4.1.2" + once "^1.3.0" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +recaptcha-promise@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/recaptcha-promise/-/recaptcha-promise-0.1.3.tgz#7d3d66d045a53674054ebdfa1684e0609ef5d912" + dependencies: + bluebird "^3.4.1" + request "^2.73.0" + +recast@^0.12.5: + version "0.12.9" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.12.9.tgz#e8e52bdb9691af462ccbd7c15d5a5113647a15f1" + dependencies: + ast-types "0.10.1" + core-js "^2.4.1" + esprima "~4.0.0" + private "~0.1.5" + source-map "~0.6.1" + +recast@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.15.0.tgz#b8c8bfdda245e1580c0a4d9fc25d4e820bf57208" + dependencies: + ast-types "0.11.5" + esprima "~4.0.0" + private "~0.1.5" + source-map "~0.6.1" + +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" + +reconnecting-websocket@3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/reconnecting-websocket/-/reconnecting-websocket-3.2.2.tgz#8097514e926e9855e03c39e76efa2e3d1f371bee" + +recursive-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/recursive-iterator/-/recursive-iterator-2.0.3.tgz#d0e0d2c7e7a83109d73091cf043fc509e5a76dc3" + +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" + +redis-commands@^1.2.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.3.5.tgz#4495889414f1e886261180b1442e7295602d83a2" + +redis-parser@^2.0.0, redis-parser@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b" + +redis@2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/redis/-/redis-2.8.0.tgz#202288e3f58c49f6079d97af7a10e1303ae14b02" + dependencies: + double-ended-queue "^2.1.0-0" + redis-commands "^1.2.0" + redis-parser "^2.6.0" + +redis@^0.12.1: + version "0.12.1" + resolved "https://registry.yarnpkg.com/redis/-/redis-0.12.1.tgz#64df76ad0fc8acebaebd2a0645e8a48fac49185e" + +redis@~2.6.0-2: + version "2.6.5" + resolved "https://registry.yarnpkg.com/redis/-/redis-2.6.5.tgz#87c1eff4a489f94b70871f3d08b6988f23a95687" + dependencies: + double-ended-queue "^2.1.0-0" + redis-commands "^1.2.0" + redis-parser "^2.0.0" + +reds@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/reds/-/reds-0.2.5.tgz#38a767f7663cd749036848697d82c74fd29bc01f" + dependencies: + natural "^0.2.0" + redis "^0.12.1" + +reduce-css-calc@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + dependencies: + balanced-match "^0.4.2" + math-expression-evaluator "^1.2.14" + reduce-function-call "^1.0.1" + +reduce-function-call@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" + dependencies: + balanced-match "^0.4.2" + +regenerate@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + +regenerator-runtime@^0.10.0: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" + +regexpu-core@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +relateurl@0.2.x: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + +remove-bom-buffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" + dependencies: + is-buffer "^1.1.5" + is-utf8 "^0.2.1" + +remove-bom-stream@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523" + dependencies: + remove-bom-buffer "^3.0.0" + safe-buffer "^5.1.0" + through2 "^2.0.3" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + +replace-ext@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + +replacestream@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/replacestream/-/replacestream-4.0.3.tgz#3ee5798092be364b1cdb1484308492cb3dff2f36" + dependencies: + escape-string-regexp "^1.0.3" + object-assign "^4.0.1" + readable-stream "^2.0.2" + +request-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + dependencies: + lodash "^4.13.1" + +request-promise-native@1.0.5, request-promise-native@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.3" + +request@2.85.0: + version "2.85.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +request@2.87.0, request@^2.73.0, request@^2.83.0: + version "2.87.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +"request@>=2.9.0 <2.82.0": + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +request@~2.79.0: + version "2.79.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + qs "~6.3.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + uuid "^3.0.0" + +require-all@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/require-all/-/require-all-2.2.0.tgz#b4420c233ac0282d0ff49b277fb880a8b5de0894" + +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.3: + 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" + +require_optional@^1.0.1, require_optional@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" + dependencies: + resolve-from "^2.0.0" + semver "^5.1.0" + +resize-observer-polyfill@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.0.tgz#660ff1d9712a2382baa2cad450a4716209f9ca69" + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + dependencies: + resolve-from "^3.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve-from@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + +resolve-options@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" + dependencies: + value-or-function "^3.0.0" + +resolve-path@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" + dependencies: + http-errors "~1.6.2" + path-is-absolute "1.0.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2: + version "1.8.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.0.tgz#a7f2ac27b78480ecc09c83782741d9f26e4f0c3e" + dependencies: + path-parse "^1.0.5" + +responselike@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + dependencies: + lowercase-keys "^1.0.0" + +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" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + +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, rimraf@2.6.2, rimraf@^2.2.6, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +rimraf@~2.2.6: + version "2.2.8" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rndstr@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rndstr/-/rndstr-1.0.0.tgz#77e66fa8f9b4836853fdd91e50719591bb67d349" + dependencies: + rangestr "0.0.1" + seedrandom "2.4.2" + +rsvp@^4.7.0: + version "4.8.2" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.2.tgz#9d5647108735784eb13418cdddb56f75b919d722" + +run-async@^2.0.0, run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + dependencies: + aproba "^1.1.1" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +rx@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + +rxjs@^5.5.2: + version "5.5.11" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.11.tgz#f733027ca43e3bec6b994473be4ab98ad43ced87" + dependencies: + symbol-observable "1.0.1" + +rxjs@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.1.tgz#246cebec189a6cbc143a3ef9f62d6f4c91813ca1" + dependencies: + tslib "^1.9.0" + +s-age@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/s-age/-/s-age-1.1.2.tgz#c0cf15233ccc93f41de92ea42c36d957977d1ea2" + +safe-buffer@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + +sass-graph@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +sass-loader@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.0.1.tgz#fd937259ccba3a9cfe0d5f8a98746d48adfcc261" + dependencies: + clone-deep "^2.0.1" + loader-utils "^1.0.1" + lodash.tail "^4.1.1" + neo-async "^2.5.0" + pify "^3.0.0" + +sax@0.5.x: + version "0.5.8" + resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" + +sax@^1.2.4, sax@~1.2.1, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +schema-utils@^0.4.3, schema-utils@^0.4.4, schema-utils@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +scoped-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/scoped-regex/-/scoped-regex-1.0.0.tgz#a346bb1acd4207ae70bd7c0c7ca9e566b6baddb8" + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +seedrandom@2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.2.tgz#18d78c41287d13aff8eadb29e235938b248aa9ff" + +seedrandom@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.3.tgz#2438504dad33917314bff18ac4d794f16d6aaecc" + +seek-bzip@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" + dependencies: + commander "~2.8.1" + +semver-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9" + +semver-truncate@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8" + dependencies: + semver "^5.3.0" + +"semver@2 || 3 || 4 || 5", semver@5.5.0, semver@^5.0.1, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + +semver@^4.0.3, semver@^4.1.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + +sequencify@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" + +serialize-javascript@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +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" + +set-immediate-shim@^1.0.0, set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571" + dependencies: + is-extendable "^0.1.1" + kind-of "^5.0.0" + mixin-object "^2.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shell-quote@*: + version "1.6.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + +shelljs@^0.8.0: + version "0.8.2" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.2.tgz#345b7df7763f4c2340d584abb532c5f752ca9e35" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +shvl@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/shvl/-/shvl-1.3.1.tgz#6c20a17b4a20b08e9f8cab60c50a92229fcc176e" + +sigmund@^1.0.1, sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +single-line-log@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364" + dependencies: + string-width "^1.0.1" + +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" + +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + dependencies: + is-fullwidth-code-point "^2.0.0" + +slide@^1.1.5, slide@~1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + dependencies: + hoek "4.x.x" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + dependencies: + is-plain-obj "^1.0.0" + +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + dependencies: + is-plain-obj "^1.0.0" + +sortablejs@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.7.0.tgz#80a2b2370abd568e1cec8c271131ef30a904fa28" + +source-list-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + +source-list-map@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + +source-map-support@^0.5.3: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + +source-map@0.1.x, source-map@^0.1.38: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + dependencies: + amdefine ">=0.0.4" + +source-map@0.5.x, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +source-map@^0.4.2, source-map@~0.4.1: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +sparkles@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" + +spawn-sync@^1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" + dependencies: + concat-stream "^1.4.7" + os-shim "^0.1.2" + +spdx-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/spdx-compare/-/spdx-compare-1.0.0.tgz#2c55f117362078d7409e6d7b08ce70a857cd3ed7" + dependencies: + array-find-index "^1.0.2" + spdx-expression-parse "^3.0.0" + spdx-ranges "^2.0.0" + +spdx-correct@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-1.0.5.tgz#9d21ac4da4bdb71d060fb74e5a67531d032cbba6" + +spdx-exceptions@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +spdx-license-ids@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" + +spdx-ranges@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/spdx-ranges/-/spdx-ranges-2.0.0.tgz#257686798e5edb41d45c1aba3d3f1bb47af8d5ec" + +spdx-satisfies@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/spdx-satisfies/-/spdx-satisfies-4.0.0.tgz#ebc79eec88b68ac75618e2e5ee94fbc347587552" + dependencies: + spdx-compare "^1.0.0" + spdx-expression-parse "^3.0.0" + spdx-ranges "^2.0.0" + +spdx@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/spdx/-/spdx-0.5.1.tgz#d36c275088b48d75a9046cd44a838ce4b5339998" + dependencies: + spdx-exceptions "^1.0.0" + spdx-license-ids "^1.0.0" + +speakeasy@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/speakeasy/-/speakeasy-2.0.0.tgz#85c91a071b09a5cb8642590d983566165f57613a" + dependencies: + base32.js "0.0.1" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +squeak@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/squeak/-/squeak-1.3.0.tgz#33045037b64388b567674b84322a6521073916c3" + dependencies: + chalk "^1.0.0" + console-stream "^0.1.1" + lpad-align "^1.0.1" + +sshpk@^1.7.0: + version "1.14.2" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + safer-buffer "^2.0.2" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +ssri@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" + dependencies: + safe-buffer "^5.1.1" + +stable@~0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + +stat-mode@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2", statuses@^1.0.0, statuses@^1.2.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + +stdout-stream@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" + dependencies: + readable-stream "^2.0.1" + +stealthy-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + +stream-browserify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-combiner2@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" + dependencies: + duplexer2 "~0.1.0" + readable-stream "^2.0.2" + +stream-consume@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48" + +stream-each@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +streamsearch@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + +string-template@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@^1.0.0, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + dependencies: + safe-buffer "~5.1.0" + +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.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.4, stringstream@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" + +strip-bom-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" + dependencies: + first-chunk-stream "^1.0.0" + strip-bom "^2.0.0" + +strip-bom-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz#f87db5ef2613f6968aa545abfe1ec728b6a829ca" + dependencies: + first-chunk-stream "^2.0.0" + strip-bom "^2.0.0" + +strip-bom-string@1.X: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + +strip-bom@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" + dependencies: + first-chunk-stream "^1.0.0" + is-utf8 "^0.2.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-dirs@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-1.1.1.tgz#960bbd1287844f3975a4558aa103a8255e2456a0" + dependencies: + chalk "^1.0.0" + get-stdin "^4.0.1" + is-absolute "^0.1.5" + is-natural-number "^2.0.0" + minimist "^1.1.0" + sum-up "^1.0.1" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +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" + +strip-outer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" + dependencies: + escape-string-regexp "^1.0.2" + +style-loader@0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.21.0.tgz#68c52e5eb2afc9ca92b6274be277ee59aea3a852" + dependencies: + loader-utils "^1.1.0" + schema-utils "^0.4.5" + +stylus-loader@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-3.0.2.tgz#27a706420b05a38e038e7cacb153578d450513c6" + dependencies: + loader-utils "^1.0.2" + lodash.clonedeep "^4.5.0" + when "~3.6.x" + +stylus@0.54.5, stylus@^0.54.0, stylus@~0.54.5: + version "0.54.5" + resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79" + dependencies: + css-parse "1.7.x" + debug "*" + glob "7.0.x" + mkdirp "0.5.x" + sax "0.5.x" + source-map "0.1.x" + +sum-up@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" + dependencies: + chalk "^1.0.0" + +summaly@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/summaly/-/summaly-2.0.6.tgz#559561e05c267f01e7199a296dd650a994b19053" + dependencies: + cheerio-httpcli "0.7.2" + debug "3.1.0" + escape-regexp "0.0.1" + html-entities "1.2.1" + request "2.85.0" + request-promise-native "1.0.5" + require-all "2.2.0" + trace-redirect "1.0.6" + +supports-color@5.4.0, supports-color@^5.2.0, supports-color@^5.3.0, supports-color@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + dependencies: + has-flag "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +svgo@^0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" + dependencies: + coa "~1.0.1" + colors "~1.1.2" + csso "~2.3.1" + js-yaml "~3.7.0" + mkdirp "~0.5.1" + sax "~1.2.1" + whet.extend "~0.9.9" + +svgo@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.0.5.tgz#7040364c062a0538abacff4401cea6a26a7a389a" + dependencies: + coa "~2.0.1" + colors "~1.1.2" + css-select "~1.3.0-rc0" + css-select-base-adapter "~0.1.0" + css-tree "1.0.0-alpha25" + css-url-regex "^1.1.0" + csso "^3.5.0" + js-yaml "~3.10.0" + mkdirp "~0.5.1" + object.values "^1.0.4" + sax "~1.2.4" + stable "~0.1.6" + unquote "~1.1.1" + util.promisify "~1.0.0" + +swagger-jsdoc@1.9.7: + version "1.9.7" + resolved "https://registry.yarnpkg.com/swagger-jsdoc/-/swagger-jsdoc-1.9.7.tgz#7a761d4d7ef4a54bf457cea5c67ec316bb82f8b9" + dependencies: + chokidar "^1.7.0" + commander "^2.11.0" + doctrine "^2.0.0" + glob "^7.1.2" + js-yaml "^3.8.4" + recursive-iterator "^2.0.3" + swagger-parser "^3.4.1" + +swagger-methods@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/swagger-methods/-/swagger-methods-1.0.4.tgz#2c5b844f4a22ab2f5e773f98193c28e386b1c37e" + +swagger-parser@^3.4.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/swagger-parser/-/swagger-parser-3.4.2.tgz#244d67d6eeed08c00acb5d95950d5aefbd6185a3" + dependencies: + call-me-maybe "^1.0.1" + debug "^3.0.0" + es6-promise "^4.1.1" + json-schema-ref-parser "^1.4.1" + ono "^4.0.2" + swagger-methods "^1.0.0" + swagger-schema-official "2.0.0-bab6bed" + z-schema "^3.16.1" + +swagger-schema-official@2.0.0-bab6bed: + version "2.0.0-bab6bed" + resolved "https://registry.yarnpkg.com/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz#70070468d6d2977ca5237b2e519ca7d06a2ea3fd" + +"sylvester@>= 0.0.12", "sylvester@>= 0.0.8": + version "0.0.21" + resolved "https://registry.yarnpkg.com/sylvester/-/sylvester-0.0.21.tgz#2987b1ce2bd2f38b0dce2a34388884bfa4400ea7" + +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + +symbol-observable@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + +symbol-tree@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + +syuilo-password-strength@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/syuilo-password-strength/-/syuilo-password-strength-0.0.1.tgz#08f71a8f0ecb77db649f3d9a6424510d9d945f52" + +table@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + dependencies: + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + +tapable@^1.0.0, tapable@^1.0.0-beta.5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" + +tar-stream@^1.1.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395" + dependencies: + bl "^1.0.0" + buffer-alloc "^1.1.0" + end-of-stream "^1.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.0" + xtend "^4.0.0" + +tar@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +tar@^4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" + dependencies: + chownr "^1.0.1" + fs-minipass "^1.2.5" + minipass "^2.3.3" + minizlib "^1.1.0" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +tcp-port-used@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-0.1.2.tgz#9450e8768c83b416fd4d1a6a9449eeccbf496c29" + dependencies: + debug "0.7.4" + is2 "0.0.9" + q "0.9.7" + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + +temp@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + dependencies: + os-tmpdir "^1.0.0" + rimraf "~2.2.6" + +tempfile@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2" + dependencies: + os-tmpdir "^1.0.0" + uuid "^2.0.1" + +tempfile@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265" + dependencies: + temp-dir "^1.0.0" + uuid "^3.0.1" + +text-table@^0.2.0, text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +textarea-caret@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/textarea-caret/-/textarea-caret-3.1.0.tgz#5d5a35bb035fd06b2ff0e25d5359e97f2655087f" + +textextensions@2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286" + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.0" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" + dependencies: + any-promise "^1.0.0" + +throttle-debounce@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz#51853da37be68a155cb6e827b3514a3c422e89cd" + +through2-concurrent@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/through2-concurrent/-/through2-concurrent-1.1.1.tgz#11cb4ea4c9e31bca6e4c1e6dba48d1c728c3524b" + dependencies: + through2 "^2.0.0" + +through2-filter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2@2.X, through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through2@^0.6.0, through2@^0.6.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through@^2.3.6, through@~2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +tildify@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + dependencies: + os-homedir "^1.0.0" + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + +timed-out@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" + +timed-out@^4.0.0, timed-out@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + +timers-browserify@^2.0.4: + version "2.0.10" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + dependencies: + setimmediate "^1.0.4" + +timers-ext@^0.1.2: + version "0.1.5" + resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.5.tgz#77147dd4e76b660c2abb8785db96574cbbd12922" + dependencies: + es5-ext "~0.10.14" + next-tick "1" + +tmp@0.0.33, tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + +to-absolute-glob@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" + dependencies: + extend-shallow "^2.0.1" + +to-absolute-glob@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" + dependencies: + is-absolute "^1.0.0" + is-negated-glob "^1.0.0" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + +to-buffer@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +to-through@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" + dependencies: + through2 "^2.0.3" + +token-stream@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a" + +tough-cookie@>=2.3.3, tough-cookie@^2.3.3: + version "2.4.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.2.tgz#aa9133154518b494efab98a58247bfc38818c00c" + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +tough-cookie@~2.3.0, tough-cookie@~2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + dependencies: + punycode "^1.4.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + dependencies: + punycode "^2.1.0" + +trace-redirect@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/trace-redirect/-/trace-redirect-1.0.6.tgz#ac629b5bf8247d30dde5a35fe9811b811075b504" + +treeify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-repeated@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" + dependencies: + escape-string-regexp "^1.0.2" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +"true-case-path@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" + dependencies: + glob "^6.0.4" + +tryit@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" + +ts-loader@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-4.3.0.tgz#4e3ba172783d1256d3a23bdfadde011a795fae9e" + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^3.1.4" + semver "^5.0.1" + +ts-node@6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-6.0.4.tgz#245af3a8cdf3baa1121893fe12b9a54ee297c4c5" + dependencies: + arrify "^1.0.0" + chalk "^2.3.0" + diff "^3.1.0" + make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map-support "^0.5.3" + yn "^2.0.0" + +tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.2.tgz#8be0cc9a1f6dc7727c38deb16c2ebd1a2892988e" + +tslint@5.10.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.10.0.tgz#11e26bccb88afa02dd0d9956cae3d4540b5f54c3" + dependencies: + babel-code-frame "^6.22.0" + builtin-modules "^1.1.1" + chalk "^2.3.0" + commander "^2.12.1" + diff "^3.2.0" + glob "^7.1.1" + js-yaml "^3.7.0" + minimatch "^3.0.4" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.8.0" + tsutils "^2.12.1" + +tsutils@^2.12.1: + version "2.27.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.27.1.tgz#ab0276ac23664f36ce8fd4414daec4aebf4373ee" + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + +tunnel-agent@^0.4.0, tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +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.5.5, type-is@^1.6.14, type-is@^1.6.16, type-is@^1.6.4, type-is@~1.6.15, type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + +type-of@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/type-of/-/type-of-2.0.1.tgz#e72a1741896568e9f628378d816d6912f7f23972" + +typedarray-to-buffer@^3.1.2: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +typescript-eslint-parser@15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-15.0.0.tgz#882fd3d7aabffbab0a7f98d2a59fb9a989c2b37f" + dependencies: + lodash.unescape "4.0.1" + semver "5.5.0" + +typescript@2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170" + +uglify-es@3.3.9, uglify-es@^3.3.4: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + +uglify-js@3.3.x: + version "3.3.28" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.28.tgz#0efb9a13850e11303361c1051f64d2ec68d9be06" + dependencies: + commander "~2.15.0" + source-map "~0.6.1" + +uglify-js@^2.6.1, uglify-js@^2.7.0: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-js@^3.0.5: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.0.tgz#796762282b5b5f0eafe7d5c8c708d1d7bd5ba11d" + dependencies: + commander "~2.15.0" + source-map "~0.6.1" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uglifyjs-webpack-plugin@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz#2ef8387c8f1a903ec5e44fa36f9f3cbdcea67641" + dependencies: + cacache "^10.0.4" + find-cache-dir "^1.0.0" + schema-utils "^0.4.5" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + uglify-es "^3.3.4" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + +underscore@>=1.3.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" + +underscore@~1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + +unique-filename@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" + dependencies: + imurmurhash "^0.1.4" + +unique-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" + +unique-stream@^2.0.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" + dependencies: + json-stable-stringify "^1.0.0" + through2-filter "^2.0.0" + +universalify@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +untildify@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" + +unzip-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" + +upath@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + +uri-js@^4.2.1: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + dependencies: + punycode "^2.1.0" + +urijs@^1.19.0: + version "1.19.1" + resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.1.tgz#5b0ff530c0cbde8386f6342235ba5ca6e995d25a" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +url-loader@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.0.1.tgz#61bc53f1f184d7343da2728a1289ef8722ea45ee" + dependencies: + loader-utils "^1.1.0" + mime "^2.0.3" + schema-utils "^0.4.3" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + dependencies: + prepend-http "^2.0.0" + +url-regex@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724" + dependencies: + ip-regex "^1.0.1" + +url-to-options@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +urlsafe-base64@^1.0.0, urlsafe-base64@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/urlsafe-base64/-/urlsafe-base64-1.0.0.tgz#23f89069a6c62f46cf3a1d3b00169cefb90be0c6" + +use@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" + dependencies: + kind-of "^6.0.2" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util-extend@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" + +util.promisify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +util@^0.10.3: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + dependencies: + inherits "2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + +uuid@3.2.1, uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + +uuid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +v-animate-css@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/v-animate-css/-/v-animate-css-0.0.2.tgz#61f233b641de5ab544ab50bc5450c747030e3bde" + +v8-compile-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz#526492e35fc616864284700b7043e01baee09f0a" + +v8flags@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +vali-date@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" + +valid-url@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" + +validate-npm-package-license@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validator@^10.0.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-10.3.0.tgz#157a8c0981858cff381f59aabcdb8f83b57317cc" + +value-or-function@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" + +vary@^1.0.0, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + +vendors@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vinyl-assign@^1.0.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/vinyl-assign/-/vinyl-assign-1.2.1.tgz#4d198891b5515911d771a8cd9c5480a46a074a45" + dependencies: + object-assign "^4.0.1" + readable-stream "^2.0.0" + +vinyl-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/vinyl-file/-/vinyl-file-2.0.0.tgz#a7ebf5ffbefda1b7d18d140fcb07b223efb6751a" + dependencies: + graceful-fs "^4.1.2" + pify "^2.3.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + strip-bom-stream "^2.0.0" + vinyl "^1.1.0" + +vinyl-fs@^0.3.0: + version "0.3.14" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" + dependencies: + defaults "^1.0.0" + glob-stream "^3.1.5" + glob-watcher "^0.0.6" + graceful-fs "^3.0.0" + mkdirp "^0.5.0" + strip-bom "^1.0.0" + through2 "^0.6.1" + vinyl "^0.4.0" + +vinyl-fs@^2.2.0: + version "2.4.4" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239" + dependencies: + duplexify "^3.2.0" + glob-stream "^5.3.2" + graceful-fs "^4.0.0" + gulp-sourcemaps "1.6.0" + is-valid-glob "^0.3.0" + lazystream "^1.0.0" + lodash.isequal "^4.0.0" + merge-stream "^1.0.0" + mkdirp "^0.5.0" + object-assign "^4.0.0" + readable-stream "^2.0.4" + strip-bom "^2.0.0" + strip-bom-stream "^1.0.0" + through2 "^2.0.0" + through2-filter "^2.0.0" + vali-date "^1.0.0" + vinyl "^1.0.0" + +vinyl-fs@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" + dependencies: + fs-mkdirp-stream "^1.0.0" + glob-stream "^6.1.0" + graceful-fs "^4.0.0" + is-valid-glob "^1.0.0" + lazystream "^1.0.0" + lead "^1.0.0" + object.assign "^4.0.4" + pumpify "^1.3.5" + readable-stream "^2.3.3" + remove-bom-buffer "^3.0.0" + remove-bom-stream "^1.2.0" + resolve-options "^1.1.0" + through2 "^2.0.0" + to-through "^2.0.0" + value-or-function "^3.0.0" + vinyl "^2.0.0" + vinyl-sourcemap "^1.1.0" + +vinyl-sourcemap@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" + dependencies: + append-buffer "^1.0.2" + convert-source-map "^1.5.0" + graceful-fs "^4.1.6" + normalize-path "^2.1.1" + now-and-later "^2.0.0" + remove-bom-buffer "^3.0.0" + vinyl "^2.0.0" + +vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" + dependencies: + source-map "^0.5.1" + +vinyl@^0.4.0, vinyl@^0.4.3: + version "0.4.6" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" + dependencies: + clone "^0.2.0" + clone-stats "^0.0.1" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^1.0.0, vinyl@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^2.0.0, vinyl@^2.0.1, vinyl@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c" + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + +void-elements@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + +vue-cropperjs@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/vue-cropperjs/-/vue-cropperjs-2.2.0.tgz#cd8f00ee01914e86f114ee8aa3f7354e3c76a8fc" + dependencies: + cropperjs "^1.1.3" + +vue-eslint-parser@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1" + dependencies: + debug "^3.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.2" + esquery "^1.0.0" + lodash "^4.17.4" + +vue-functional-data-merge@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/vue-functional-data-merge/-/vue-functional-data-merge-2.0.6.tgz#f08055adfb92458debcf2ad10c3aa712277f7fc2" + +vue-hot-reload-api@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz#97976142405d13d8efae154749e88c4e358cf926" + +vue-js-modal@1.3.13: + version "1.3.13" + resolved "https://registry.yarnpkg.com/vue-js-modal/-/vue-js-modal-1.3.13.tgz#1718c3182a94a03e03422db50c60229bbbd53f18" + +vue-json-tree-view@2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/vue-json-tree-view/-/vue-json-tree-view-2.1.4.tgz#b6f8ae2ba2eec4eec5b6f53b90fa187054cad79b" + dependencies: + lodash "^4.17.4" + vue "^2.5.16" + +vue-loader@15.2.1: + version "15.2.1" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.2.1.tgz#89a13b6b7dec63614729c73b1b46a571a69bb20e" + dependencies: + "@vue/component-compiler-utils" "^1.2.1" + hash-sum "^1.0.2" + loader-utils "^1.1.0" + vue-hot-reload-api "^2.3.0" + vue-style-loader "^4.1.0" + +vue-router@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.0.1.tgz#d9b05ad9c7420ba0f626d6500d693e60092cc1e9" + +vue-style-loader@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.0.tgz#7588bd778e2c9f8d87bfc3c5a4a039638da7a863" + dependencies: + hash-sum "^1.0.2" + loader-utils "^1.0.2" + +vue-template-compiler@2.5.16: + version "2.5.16" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.16.tgz#93b48570e56c720cdf3f051cc15287c26fbd04cb" + dependencies: + de-indent "^1.0.2" + he "^1.1.0" + +vue-template-es2015-compiler@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz#dc42697133302ce3017524356a6c61b7b69b4a18" + +vue@2.5.16, vue@^2.5.16: + version "2.5.16" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.16.tgz#07edb75e8412aaeed871ebafa99f4672584a0085" + +vuedraggable@2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/vuedraggable/-/vuedraggable-2.16.0.tgz#52127081a2adb3de5fabd214d404ff3eee63575a" + dependencies: + sortablejs "^1.7.0" + +vuex-persistedstate@^2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/vuex-persistedstate/-/vuex-persistedstate-2.5.4.tgz#a19710ad7f9a08cea4e65fc585924d9fdac7384a" + dependencies: + deepmerge "^2.1.0" + shvl "^1.3.0" + +vuex@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.0.1.tgz#e761352ebe0af537d4bb755a9b9dc4be3df7efd2" + +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + dependencies: + browser-process-hrtime "^0.1.2" + +ware@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ware/-/ware-1.3.0.tgz#d1b14f39d2e2cb4ab8c4098f756fe4b164e473d4" + dependencies: + wrap-fn "^0.1.0" + +watchpack@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +web-push@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/web-push/-/web-push-3.3.1.tgz#6d49517b927ffb97241a719d2f7f9014de130f09" + dependencies: + asn1.js "^5.0.0" + http_ece "1.0.5" + https-proxy-agent "^2.2.1" + jws "^3.1.3" + minimist "^1.2.0" + urlsafe-base64 "^1.0.0" + +webassemblyjs@1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webassemblyjs/-/webassemblyjs-1.4.3.tgz#0591893efb8fbde74498251cbe4b2d83df9239cb" + dependencies: + "@webassemblyjs/ast" "1.4.3" + "@webassemblyjs/validation" "1.4.3" + "@webassemblyjs/wasm-parser" "1.4.3" + "@webassemblyjs/wast-parser" "1.4.3" + long "^3.2.0" + +webfinger.js@2.6.6: + version "2.6.6" + resolved "https://registry.yarnpkg.com/webfinger.js/-/webfinger.js-2.6.6.tgz#52ebdc85da8c8fb6beb690e8e32594c99d2ff4ae" + dependencies: + xhr2 "^0.1.4" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + +webpack-addons@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/webpack-addons/-/webpack-addons-1.1.5.tgz#2b178dfe873fb6e75e40a819fa5c26e4a9bc837a" + dependencies: + jscodeshift "^0.4.0" + +webpack-cli@2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-2.1.4.tgz#cab81e79249127384fb69b2fdfe2055f9c771b76" + dependencies: + chalk "^2.4.1" + cross-spawn "^6.0.5" + diff "^3.5.0" + enhanced-resolve "^4.0.0" + envinfo "^5.7.0" + glob-all "^3.1.0" + global-modules "^1.0.0" + got "^8.3.1" + import-local "^1.0.0" + inquirer "^5.2.0" + interpret "^1.1.0" + jscodeshift "^0.5.0" + listr "^0.14.1" + loader-utils "^1.1.0" + lodash "^4.17.10" + log-symbols "^2.2.0" + mkdirp "^0.5.1" + p-each-series "^1.0.0" + p-lazy "^1.0.0" + prettier "^1.12.1" + supports-color "^5.4.0" + v8-compile-cache "^2.0.0" + webpack-addons "^1.1.5" + yargs "^11.1.0" + yeoman-environment "^2.1.1" + yeoman-generator "^2.0.5" + +webpack-core@~0.6.0: + version "0.6.9" + resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2" + dependencies: + source-list-map "~0.1.7" + source-map "~0.4.1" + +webpack-sources@^1.0.1, webpack-sources@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@4.9.1: + version "4.9.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.9.1.tgz#fa7bd738b17fd7f09f37da461b2f5c16c6565f34" + dependencies: + "@webassemblyjs/ast" "1.4.3" + "@webassemblyjs/wasm-edit" "1.4.3" + "@webassemblyjs/wasm-parser" "1.4.3" + acorn "^5.0.0" + acorn-dynamic-import "^3.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chrome-trace-event "^0.1.1" + enhanced-resolve "^4.0.0" + eslint-scope "^3.7.1" + json-parse-better-errors "^1.0.2" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + micromatch "^3.1.8" + mkdirp "~0.5.0" + neo-async "^2.5.0" + node-libs-browser "^2.0.0" + schema-utils "^0.4.4" + tapable "^1.0.0" + uglifyjs-webpack-plugin "^1.2.4" + watchpack "^1.5.0" + webpack-sources "^1.0.1" + +websocket@1.0.26: + version "1.0.26" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.26.tgz#a03a01299849c35268c83044aa919c6374be8194" + dependencies: + debug "^2.2.0" + nan "^2.3.3" + typedarray-to-buffer "^3.1.2" + yaeti "^0.0.6" + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" + dependencies: + iconv-lite "0.4.19" + +whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" + +whatwg-url@^6.4.0, whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +when@^3.7.7: + version "3.7.8" + resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" + +when@~3.6.x: + version "3.6.4" + resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" + +whet.extend@~0.9.9: + version "0.9.9" + resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + +which@1, which@^1.2.14, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + dependencies: + string-width "^1.0.2 || 2" + +window-or-global@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/window-or-global/-/window-or-global-1.0.1.tgz#dbe45ba2a291aabc56d62cf66c45b7fa322946de" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +window-size@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" + +with@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe" + dependencies: + acorn "^3.1.0" + acorn-globals "^3.0.0" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +worker-farm@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" + dependencies: + errno "~0.1.7" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-fn@^0.1.0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/wrap-fn/-/wrap-fn-0.1.5.tgz#f21b6e41016ff4a7e31720dbc63a09016bdf9845" + dependencies: + co "3.1.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^1.2.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write-file-atomic@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-json-file@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f" + dependencies: + detect-indent "^5.0.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + pify "^3.0.0" + sort-keys "^2.0.0" + write-file-atomic "^2.0.0" + +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" + +ws@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.0.tgz#9fd95e3ac7c76f6ae8bcc868a0e3f11f1290c33e" + dependencies: + async-limiter "~1.0.0" + +ws@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289" + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + +xev@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/xev/-/xev-2.0.1.tgz#24484173a22115bc8a990ef5d4d5129695b827a7" + +xhr2@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + +yaeti@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + +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-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + dependencies: + camelcase "^3.0.0" + +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + dependencies: + camelcase "^4.1.0" + +yargs-parser@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" + dependencies: + camelcase "^4.1.0" + +yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + dependencies: + camelcase "^4.1.0" + +yargs@^10.0.3: + version "10.1.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^8.1.0" + +yargs@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^9.0.2" + +yargs@^4.0.0: + 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@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + 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.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yargs@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" + +yargs@~1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.2.6.tgz#9c7b4a82fd5d595b2bf17ab6dcc43135432fe34b" + dependencies: + minimist "^0.1.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yauzl@^2.2.1: + version "2.9.2" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.9.2.tgz#4fb1bc7ae1fc2f57037b54af6acc8fe1031c5b77" + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yeoman-environment@^2.0.5, yeoman-environment@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-2.2.0.tgz#6c0ee93a8d962a9f6dbc5ad4e90ae7ab34875393" + dependencies: + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^3.1.0" + diff "^3.3.1" + escape-string-regexp "^1.0.2" + globby "^8.0.1" + grouped-queue "^0.3.3" + inquirer "^5.2.0" + is-scoped "^1.0.0" + lodash "^4.17.10" + log-symbols "^2.1.0" + mem-fs "^1.1.0" + strip-ansi "^4.0.0" + text-table "^0.2.0" + untildify "^3.0.2" + +yeoman-generator@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/yeoman-generator/-/yeoman-generator-2.0.5.tgz#57b0b3474701293cc9ec965288f3400b00887c81" + dependencies: + async "^2.6.0" + chalk "^2.3.0" + cli-table "^0.3.1" + cross-spawn "^6.0.5" + dargs "^5.1.0" + dateformat "^3.0.3" + debug "^3.1.0" + detect-conflict "^1.0.0" + error "^7.0.2" + find-up "^2.1.0" + github-username "^4.0.0" + istextorbinary "^2.2.1" + lodash "^4.17.10" + make-dir "^1.1.0" + mem-fs-editor "^4.0.0" + minimist "^1.2.0" + pretty-bytes "^4.0.2" + read-chunk "^2.1.0" + read-pkg-up "^3.0.0" + rimraf "^2.6.2" + run-async "^2.0.0" + shelljs "^0.8.0" + text-table "^0.2.0" + through2 "^2.0.0" + yeoman-environment "^2.0.5" + +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" + +z-schema@^3.16.1: + version "3.22.0" + resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-3.22.0.tgz#e1326063cb438f348c648350770258ff5e20a22b" + dependencies: + lodash.get "^4.0.0" + lodash.isequal "^4.0.0" + validator "^10.0.0" + optionalDependencies: + commander "^2.7.1" From b5b437b8784eb32531e0965d722ddb691775df08 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 16 Jun 2018 12:43:58 +0900 Subject: [PATCH 330/369] :v: --- .gitattributes | 1 + yarn.lock | 23830 +++++++++++++++++++++++------------------------ 2 files changed, 11916 insertions(+), 11915 deletions(-) diff --git a/.gitattributes b/.gitattributes index 952d6cd0e9..9ea77a4b0e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,4 @@ *.svg -diff -text *.psd -diff -text *.ai -diff -text +yarn.lock -diff -text diff --git a/yarn.lock b/yarn.lock index 014a443d0d..a99e498628 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,11915 +1,11915 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@fortawesome/fontawesome-free-brands@5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-brands/-/fontawesome-free-brands-5.0.2.tgz#a1cc602eec40a379a3dd8a44c78b31110dd3d3d3" - -"@fortawesome/fontawesome-free-regular@5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-regular/-/fontawesome-free-regular-5.0.2.tgz#429af86bed14689f87648e6322983c65c782c017" - -"@fortawesome/fontawesome-free-solid@5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-solid/-/fontawesome-free-solid-5.0.2.tgz#090ce2c59dd5ec76983f3da8a43e1ab0321b42d5" - -"@fortawesome/fontawesome@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome/-/fontawesome-1.0.1.tgz#8ac60e1e7b437889baf9c9d6e3a61ef3b637170d" - -"@gulp-sourcemaps/identity-map@1.X": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz#cfa23bc5840f9104ce32a65e74db7e7a974bbee1" - dependencies: - acorn "^5.0.3" - css "^2.2.1" - normalize-path "^2.1.1" - source-map "^0.5.6" - through2 "^2.0.3" - -"@gulp-sourcemaps/map-sources@1.X": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda" - dependencies: - normalize-path "^2.0.1" - through2 "^2.0.3" - -"@koa/cors@2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@koa/cors/-/cors-2.2.1.tgz#c06a1c34d787e3cee79c0d4c20e8952d1b6d75c5" - -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - -"@nodelib/fs.stat@^1.0.1": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz#50c1e2260ac0ed9439a181de3725a0168d59c48a" - -"@prezzemolo/rap@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@prezzemolo/rap/-/rap-0.1.2.tgz#01f8a60bb61de33822fc632563fb8b23e574854e" - -"@prezzemolo/zip@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@prezzemolo/zip/-/zip-0.0.3.tgz#6532d4bcd77c6a95e3a90ca5388a09b532a1f8e4" - -"@samverschueren/stream-to-observable@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" - dependencies: - any-observable "^0.3.0" - -"@sindresorhus/is@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" - -"@types/accepts@*": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" - dependencies: - "@types/node" "*" - -"@types/babel-types@*", "@types/babel-types@^7.0.0": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.3.tgz#9dc5316090ad99cd2679051ab21a5676c90a2bcc" - -"@types/babylon@^6.16.2": - version "6.16.3" - resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.3.tgz#c2937813a89fcb5e79a00062fc4a8b143e7237bb" - dependencies: - "@types/babel-types" "*" - -"@types/bcryptjs@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.1.tgz#7fb63922b5b106edacdcfe084cd38850f78aacfc" - -"@types/body-parser@*": - version "1.17.0" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/bson@*": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/bson/-/bson-1.0.8.tgz#6ad272b3f049e9598ec33aed09cf56d8946b75f1" - dependencies: - "@types/node" "*" - -"@types/caseless@*": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.1.tgz#9794c69c8385d0192acc471a540d1f8e0d16218a" - -"@types/cheerio@^0.22.5": - version "0.22.7" - resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.7.tgz#4a92eafedfb2b9f4437d3a4410006d81114c66ce" - -"@types/clean-css@*": - version "3.4.30" - resolved "https://registry.yarnpkg.com/@types/clean-css/-/clean-css-3.4.30.tgz#0052c136f5248002428e3638b37de4a39818641d" - -"@types/connect@*": - version "3.4.32" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" - dependencies: - "@types/node" "*" - -"@types/cookies@*": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.1.tgz#f9f204bd6767d389eea3b87609e30c090c77a540" - dependencies: - "@types/connect" "*" - "@types/express" "*" - "@types/keygrip" "*" - "@types/node" "*" - -"@types/debug@0.0.30": - version "0.0.30" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-0.0.30.tgz#dc1e40f7af3b9c815013a7860e6252f6352a84df" - -"@types/deep-equal@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/deep-equal/-/deep-equal-1.0.1.tgz#71cfabb247c22bcc16d536111f50c0ed12476b03" - -"@types/elasticsearch@5.0.23": - version "5.0.23" - resolved "https://registry.yarnpkg.com/@types/elasticsearch/-/elasticsearch-5.0.23.tgz#235622772a7c7f3ccedd0dc9769dfcfe20eed1ec" - -"@types/events@*": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" - -"@types/express-serve-static-core@*": - version "4.16.0" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz#fdfe777594ddc1fe8eb8eccce52e261b496e43e7" - dependencies: - "@types/events" "*" - "@types/node" "*" - "@types/range-parser" "*" - -"@types/express@*": - version "4.16.0" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.0.tgz#6d8bc42ccaa6f35cf29a2b7c3333cb47b5a32a19" - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "*" - "@types/serve-static" "*" - -"@types/fancy-log@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@types/fancy-log/-/fancy-log-1.3.0.tgz#a61ab476e5e628cd07a846330df53b85e05c8ce0" - -"@types/form-data@*": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.2.1.tgz#ee2b3b8eaa11c0938289953606b745b738c54b1e" - dependencies: - "@types/node" "*" - -"@types/glob@*": - version "5.0.35" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.35.tgz#1ae151c802cece940443b5ac246925c85189f32a" - dependencies: - "@types/events" "*" - "@types/minimatch" "*" - "@types/node" "*" - -"@types/gm@1.18.0": - version "1.18.0" - resolved "https://registry.yarnpkg.com/@types/gm/-/gm-1.18.0.tgz#49be90ff74286fcdc23b00f13d3699e6dfaceef2" - dependencies: - "@types/node" "*" - -"@types/gulp-htmlmin@1.3.32": - version "1.3.32" - resolved "https://registry.yarnpkg.com/@types/gulp-htmlmin/-/gulp-htmlmin-1.3.32.tgz#342baec649f285c7cbd78dfcf54dd17c388bde2b" - dependencies: - "@types/html-minifier" "*" - "@types/node" "*" - -"@types/gulp-mocha@0.0.32": - version "0.0.32" - resolved "https://registry.yarnpkg.com/@types/gulp-mocha/-/gulp-mocha-0.0.32.tgz#dbc425e804a8354236c31ab23406222a8ab9bdaf" - dependencies: - "@types/mocha" "*" - "@types/node" "*" - -"@types/gulp-rename@0.0.33": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/gulp-rename/-/gulp-rename-0.0.33.tgz#38d146e97786569f74f5391a1b1f9b5198674b6c" - dependencies: - "@types/node" "*" - -"@types/gulp-replace@0.0.31": - version "0.0.31" - resolved "https://registry.yarnpkg.com/@types/gulp-replace/-/gulp-replace-0.0.31.tgz#87c3ac90b437694c58d68d1da677fcaff38b25ff" - dependencies: - "@types/node" "*" - -"@types/gulp-uglify@3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/gulp-uglify/-/gulp-uglify-3.0.5.tgz#ddcbbb6bd15a84b8a6c5e2218c2efba98102d135" - dependencies: - "@types/node" "*" - "@types/uglify-js" "^2" - -"@types/gulp-util@3.0.34": - version "3.0.34" - resolved "https://registry.yarnpkg.com/@types/gulp-util/-/gulp-util-3.0.34.tgz#d1291ebf706d93f46eb8df11344bbfd96247697e" - dependencies: - "@types/node" "*" - "@types/through2" "*" - "@types/vinyl" "*" - chalk "^2.2.0" - -"@types/gulp@3.8.36": - version "3.8.36" - resolved "https://registry.yarnpkg.com/@types/gulp/-/gulp-3.8.36.tgz#11eaf583bf0534669b4ffa9bfed51557faa00a4c" - dependencies: - "@types/node" "*" - "@types/orchestrator" "*" - "@types/vinyl" "*" - -"@types/html-minifier@*": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@types/html-minifier/-/html-minifier-3.5.2.tgz#f897a13d847a774e9b6fd91497e9b0e0ead71c35" - dependencies: - "@types/clean-css" "*" - "@types/relateurl" "*" - "@types/uglify-js" "*" - -"@types/http-assert@*": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.3.0.tgz#5e932606153da28e1d04f9043f4912cf61fd55dd" - -"@types/inquirer@0.0.41": - version "0.0.41" - resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-0.0.41.tgz#0c33027dcd0b0dde234e22afa454f2c75d8b30d2" - dependencies: - "@types/rx" "*" - "@types/through" "*" - -"@types/is-root@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/is-root/-/is-root-1.0.0.tgz#1cf41787243a8f030eb737a9aaf08b071e4f2453" - -"@types/is-url@1.2.28": - version "1.2.28" - resolved "https://registry.yarnpkg.com/@types/is-url/-/is-url-1.2.28.tgz#914dabd50546d9b0142806e42c72bc7c2b7e0787" - -"@types/js-yaml@3.11.1": - version "3.11.1" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.11.1.tgz#ac5bab26be5f9c6f74b6b23420f2cfa5a7a6ba40" - -"@types/keygrip@*": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.1.tgz#ff540462d2fb4d0a88441ceaf27d287b01c3d878" - -"@types/koa-bodyparser@4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@types/koa-bodyparser/-/koa-bodyparser-4.2.0.tgz#04febc567f3d3dd40e3d1a0e095cdf7b07c4d7ce" - dependencies: - "@types/koa" "*" - -"@types/koa-compose@*": - version "3.2.2" - resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.2.tgz#dc106e000bbf92a3ac900f756df47344887ee847" - -"@types/koa-compress@2.0.8": - version "2.0.8" - resolved "https://registry.yarnpkg.com/@types/koa-compress/-/koa-compress-2.0.8.tgz#426a2fac419aff7d1a7d87fd78203bf0d26a94fb" - dependencies: - "@types/koa" "*" - "@types/node" "*" - -"@types/koa-favicon@2.0.19": - version "2.0.19" - resolved "https://registry.yarnpkg.com/@types/koa-favicon/-/koa-favicon-2.0.19.tgz#a1b584fd64c99f16710633272292bf7d4b0ca1fa" - dependencies: - "@types/koa" "*" - -"@types/koa-logger@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/koa-logger/-/koa-logger-3.1.0.tgz#133acdbc56d87b5a559cab25528b087381a8fc0d" - dependencies: - "@types/koa" "*" - -"@types/koa-mount@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/koa-mount/-/koa-mount-3.0.1.tgz#2c068d1696b173c62c316158210c4316c4401f57" - dependencies: - "@types/koa" "*" - -"@types/koa-multer@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/koa-multer/-/koa-multer-1.0.0.tgz#f449f399ac3f80c05753452f000e8694ceec4249" - dependencies: - "@types/koa" "*" - -"@types/koa-router@7.0.28": - version "7.0.28" - resolved "https://registry.yarnpkg.com/@types/koa-router/-/koa-router-7.0.28.tgz#67487c862a831099aed8864a8996bfa7e989edc0" - dependencies: - "@types/koa" "*" - -"@types/koa-send@4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@types/koa-send/-/koa-send-4.1.1.tgz#88f57cbe0343c8204903f9096d8ff6b98ec3296f" - dependencies: - "@types/koa" "*" - -"@types/koa-views@2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/koa-views/-/koa-views-2.0.3.tgz#38fc1f3027503acba73a93fe06678813f306779b" - dependencies: - "@types/koa" "*" - -"@types/koa@*": - version "2.0.46" - resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.0.46.tgz#24bc3cd405d10fcde81f876cd8285b44d4ddc3e9" - dependencies: - "@types/accepts" "*" - "@types/cookies" "*" - "@types/events" "*" - "@types/http-assert" "*" - "@types/keygrip" "*" - "@types/koa-compose" "*" - "@types/node" "*" - -"@types/koa@2.0.45": - version "2.0.45" - resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.0.45.tgz#133cbda6cc8d12b73434b5d9663898c833f80aa2" - dependencies: - "@types/accepts" "*" - "@types/cookies" "*" - "@types/events" "*" - "@types/http-assert" "*" - "@types/keygrip" "*" - "@types/koa-compose" "*" - "@types/node" "*" - -"@types/koa__cors@2.2.2": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@types/koa__cors/-/koa__cors-2.2.2.tgz#03d7cf3b076d5dfab8a5444ac6c5df5173147de8" - dependencies: - "@types/koa" "*" - -"@types/kue@0.11.8": - version "0.11.8" - resolved "https://registry.yarnpkg.com/@types/kue/-/kue-0.11.8.tgz#820f5e3db6025f0411e0942cd3ccab461a060c90" - dependencies: - "@types/express" "*" - "@types/node" "*" - "@types/redis" "*" - -"@types/license-checker@15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@types/license-checker/-/license-checker-15.0.0.tgz#685d69e2cf61ffd862320434601f51c85e28bba1" - -"@types/mime@*": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b" - -"@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - -"@types/mkdirp@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" - dependencies: - "@types/node" "*" - -"@types/mocha@*": - version "5.2.2" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.2.tgz#202d2b8fe1364c5b617b439b26a54f0e75eac0a7" - -"@types/mocha@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.0.tgz#b3c8e69f038835db1a7fdc0b3d879fc50506e29e" - -"@types/mongodb@3.0.18": - version "3.0.18" - resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.0.18.tgz#e5775ba9c15bf1601e57ada52d9fcbc6d6095d18" - dependencies: - "@types/bson" "*" - "@types/events" "*" - "@types/node" "*" - -"@types/ms@0.7.30": - version "0.7.30" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.30.tgz#f6c38b7ecbbf698b0bbd138315a0f0f18954f85f" - -"@types/node@*": - version "10.3.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.3.3.tgz#8798d9e39af2fa604f715ee6a6b19796528e46c3" - -"@types/node@10.1.2": - version "10.1.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.1.2.tgz#1b928a0baa408fc8ae3ac012cc81375addc147c6" - -"@types/node@^8.0.47": - version "8.10.20" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.20.tgz#fe674ea52e13950ab10954433a7824438aabbcac" - -"@types/nopt@3.0.29": - version "3.0.29" - resolved "https://registry.yarnpkg.com/@types/nopt/-/nopt-3.0.29.tgz#f19df3db4c97ee1459a2740028320a71d70964ce" - -"@types/orchestrator@*": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@types/orchestrator/-/orchestrator-0.3.2.tgz#cd15c6cea978a32b98e5054239cbcc78e55671f1" - dependencies: - "@types/node" "*" - "@types/q" "*" - -"@types/parse5@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-3.0.0.tgz#b63305718d82af42a9e5da79c56ecfc1f32e32c0" - dependencies: - parse5 "*" - -"@types/pug@2.0.4", "@types/pug@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.4.tgz#8772fcd0418e3cd2cc171555d73007415051f4b2" - -"@types/q@*": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.0.tgz#87567ea1206935405e51c03635b6cbf3a01f7bc4" - -"@types/qrcode@0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@types/qrcode/-/qrcode-0.8.1.tgz#5776cb5da299cfa7cee2610f59997acad90ad38d" - dependencies: - "@types/node" "*" - -"@types/range-parser@*": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.2.tgz#fa8e1ad1d474688a757140c91de6dace6f4abc8d" - -"@types/ratelimiter@2.1.28": - version "2.1.28" - resolved "https://registry.yarnpkg.com/@types/ratelimiter/-/ratelimiter-2.1.28.tgz#cf6371e6d9b1d236e3f0b25889a6d52aed2e0e22" - dependencies: - "@types/redis" "*" - -"@types/redis@*", "@types/redis@2.8.6": - version "2.8.6" - resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.6.tgz#3674d07a13ad76bccda4c37dc3909e4e95757e7e" - dependencies: - "@types/events" "*" - "@types/node" "*" - -"@types/relateurl@*": - version "0.2.28" - resolved "https://registry.yarnpkg.com/@types/relateurl/-/relateurl-0.2.28.tgz#6bda7db8653fa62643f5ee69e9f69c11a392e3a6" - -"@types/request-promise-native@1.0.14": - version "1.0.14" - resolved "https://registry.yarnpkg.com/@types/request-promise-native/-/request-promise-native-1.0.14.tgz#20f2ba136e6f29c2ea745c60767738d434793d31" - dependencies: - "@types/request" "*" - -"@types/request@*": - version "2.47.1" - resolved "https://registry.yarnpkg.com/@types/request/-/request-2.47.1.tgz#25410d3afbdac04c91a94ad9efc9824100735824" - dependencies: - "@types/caseless" "*" - "@types/form-data" "*" - "@types/node" "*" - "@types/tough-cookie" "*" - -"@types/request@2.47.0": - version "2.47.0" - resolved "https://registry.yarnpkg.com/@types/request/-/request-2.47.0.tgz#76a666cee4cb85dcffea6cd4645227926d9e114e" - dependencies: - "@types/caseless" "*" - "@types/form-data" "*" - "@types/node" "*" - "@types/tough-cookie" "*" - -"@types/rimraf@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.2.tgz#7f0fc3cf0ff0ad2a99bb723ae1764f30acaf8b6e" - dependencies: - "@types/glob" "*" - "@types/node" "*" - -"@types/rx-core-binding@*": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/rx-core-binding/-/rx-core-binding-4.0.4.tgz#d969d32f15a62b89e2862c17b3ee78fe329818d3" - dependencies: - "@types/rx-core" "*" - -"@types/rx-core@*": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/rx-core/-/rx-core-4.0.3.tgz#0b3354b1238cedbe2b74f6326f139dbc7a591d60" - -"@types/rx-lite-aggregates@*": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/rx-lite-aggregates/-/rx-lite-aggregates-4.0.3.tgz#6efb2b7f3d5f07183a1cb2bd4b1371d7073384c2" - dependencies: - "@types/rx-lite" "*" - -"@types/rx-lite-async@*": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/rx-lite-async/-/rx-lite-async-4.0.2.tgz#27fbf0caeff029f41e2d2aae638b05e91ceb600c" - dependencies: - "@types/rx-lite" "*" - -"@types/rx-lite-backpressure@*": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/rx-lite-backpressure/-/rx-lite-backpressure-4.0.3.tgz#05abb19bdf87cc740196c355e5d0b37bb50b5d56" - dependencies: - "@types/rx-lite" "*" - -"@types/rx-lite-coincidence@*": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/rx-lite-coincidence/-/rx-lite-coincidence-4.0.3.tgz#80bd69acc4054a15cdc1638e2dc8843498cd85c0" - dependencies: - "@types/rx-lite" "*" - -"@types/rx-lite-experimental@*": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/rx-lite-experimental/-/rx-lite-experimental-4.0.1.tgz#c532f5cbdf3f2c15da16ded8930d1b2984023cbd" - dependencies: - "@types/rx-lite" "*" - -"@types/rx-lite-joinpatterns@*": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/rx-lite-joinpatterns/-/rx-lite-joinpatterns-4.0.1.tgz#f70fe370518a8432f29158cc92ffb56b4e4afc3e" - dependencies: - "@types/rx-lite" "*" - -"@types/rx-lite-testing@*": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/rx-lite-testing/-/rx-lite-testing-4.0.1.tgz#21b19d11f4dfd6ffef5a9d1648e9c8879bfe21e9" - dependencies: - "@types/rx-lite-virtualtime" "*" - -"@types/rx-lite-time@*": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/rx-lite-time/-/rx-lite-time-4.0.3.tgz#0eda65474570237598f3448b845d2696f2dbb1c4" - dependencies: - "@types/rx-lite" "*" - -"@types/rx-lite-virtualtime@*": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/rx-lite-virtualtime/-/rx-lite-virtualtime-4.0.3.tgz#4b30cacd0fe2e53af29f04f7438584c7d3959537" - dependencies: - "@types/rx-lite" "*" - -"@types/rx-lite@*": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/rx-lite/-/rx-lite-4.0.5.tgz#b3581525dff69423798daa9a0d33c1e66a5e8c4c" - dependencies: - "@types/rx-core" "*" - "@types/rx-core-binding" "*" - -"@types/rx@*": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@types/rx/-/rx-4.1.1.tgz#598fc94a56baed975f194574e0f572fd8e627a48" - dependencies: - "@types/rx-core" "*" - "@types/rx-core-binding" "*" - "@types/rx-lite" "*" - "@types/rx-lite-aggregates" "*" - "@types/rx-lite-async" "*" - "@types/rx-lite-backpressure" "*" - "@types/rx-lite-coincidence" "*" - "@types/rx-lite-experimental" "*" - "@types/rx-lite-joinpatterns" "*" - "@types/rx-lite-testing" "*" - "@types/rx-lite-time" "*" - "@types/rx-lite-virtualtime" "*" - -"@types/seedrandom@2.4.27": - version "2.4.27" - resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-2.4.27.tgz#9db563937dd86915f69092bc43259d2f48578e41" - -"@types/serve-static@*": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" - dependencies: - "@types/express-serve-static-core" "*" - "@types/mime" "*" - -"@types/single-line-log@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@types/single-line-log/-/single-line-log-1.1.0.tgz#7e6fc4e8e785f5f5ab11157418df2684a21ed971" - -"@types/speakeasy@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/speakeasy/-/speakeasy-2.0.2.tgz#153ec3636eea0562209b0a2f1fdf8b479286919b" - -"@types/tapable@*": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.2.tgz#e13182e1b69871a422d7863e11a4a6f5b814a4bd" - -"@types/through2@*": - version "2.0.33" - resolved "https://registry.yarnpkg.com/@types/through2/-/through2-2.0.33.tgz#1ff2e88a100dfb5b140e7bb98791f1194400d131" - dependencies: - "@types/node" "*" - -"@types/through@*": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.29.tgz#72943aac922e179339c651fa34a4428a4d722f93" - dependencies: - "@types/node" "*" - -"@types/tmp@0.0.33": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d" - -"@types/tough-cookie@*": - version "2.3.3" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.3.tgz#7f226d67d654ec9070e755f46daebf014628e9d9" - -"@types/uglify-js@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.2.tgz#f30c75458d18e8ee885c792c04adcb78a13bc286" - dependencies: - source-map "^0.6.1" - -"@types/uglify-js@^2": - version "2.6.31" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-2.6.31.tgz#c694755eeb6a1bb9f8f321f3ec37cc22ca4c4f6b" - dependencies: - source-map "^0.6.1" - -"@types/uuid@3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.3.tgz#121ace265f5569ce40f4f6d0ff78a338c732a754" - dependencies: - "@types/node" "*" - -"@types/vinyl@*": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/vinyl/-/vinyl-2.0.2.tgz#4f3b8dae8f5828d3800ef709b0cff488ee852de3" - dependencies: - "@types/node" "*" - -"@types/webpack-stream@3.2.10": - version "3.2.10" - resolved "https://registry.yarnpkg.com/@types/webpack-stream/-/webpack-stream-3.2.10.tgz#eed8389a60d9928b357aa6d13599428d2c4889e7" - dependencies: - "@types/node" "*" - "@types/webpack" "*" - -"@types/webpack@*", "@types/webpack@4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.4.0.tgz#c0551b772be241d786c0548812dd75a932f8efb4" - dependencies: - "@types/node" "*" - "@types/tapable" "*" - "@types/uglify-js" "*" - source-map "^0.6.0" - -"@types/websocket@0.0.39": - version "0.0.39" - resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-0.0.39.tgz#aa971e24f9c1455fe2a57ee3e69c7d395016b12a" - dependencies: - "@types/events" "*" - "@types/node" "*" - -"@types/ws@5.1.1": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-5.1.1.tgz#4adc1f1a5e92e7e0e95658fb35c7eab1bc52f4ac" - dependencies: - "@types/events" "*" - "@types/node" "*" - -"@vue/component-compiler-utils@^1.2.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-1.3.1.tgz#686f0b913d59590ae327b2a1cb4b6d9b931bbe0e" - dependencies: - consolidate "^0.15.1" - hash-sum "^1.0.2" - lru-cache "^4.1.2" - merge-source-map "^1.1.0" - postcss "^6.0.20" - postcss-selector-parser "^3.1.1" - prettier "^1.13.0" - source-map "^0.5.6" - vue-template-es2015-compiler "^1.6.0" - -"@webassemblyjs/ast@1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.4.3.tgz#3b3f6fced944d8660273347533e6d4d315b5934a" - dependencies: - "@webassemblyjs/helper-wasm-bytecode" "1.4.3" - "@webassemblyjs/wast-parser" "1.4.3" - debug "^3.1.0" - webassemblyjs "1.4.3" - -"@webassemblyjs/floating-point-hex-parser@1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.4.3.tgz#f5aee4c376a717c74264d7bacada981e7e44faad" - -"@webassemblyjs/helper-buffer@1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.4.3.tgz#0434b55958519bf503697d3824857b1dea80b729" - dependencies: - debug "^3.1.0" - -"@webassemblyjs/helper-code-frame@1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.4.3.tgz#f1349ca3e01a8e29ee2098c770773ef97af43641" - dependencies: - "@webassemblyjs/wast-printer" "1.4.3" - -"@webassemblyjs/helper-fsm@1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.4.3.tgz#65a921db48fb43e868f17b27497870bdcae22b79" - -"@webassemblyjs/helper-wasm-bytecode@1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.4.3.tgz#0e5b4b5418e33f8a26e940b7809862828c3721a5" - -"@webassemblyjs/helper-wasm-section@1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.4.3.tgz#9ceedd53a3f152c3412e072887ade668d0b1acbf" - dependencies: - "@webassemblyjs/ast" "1.4.3" - "@webassemblyjs/helper-buffer" "1.4.3" - "@webassemblyjs/helper-wasm-bytecode" "1.4.3" - "@webassemblyjs/wasm-gen" "1.4.3" - debug "^3.1.0" - -"@webassemblyjs/leb128@1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.4.3.tgz#5a5e5949dbb5adfe3ae95664d0439927ac557fb8" - dependencies: - leb "^0.3.0" - -"@webassemblyjs/validation@1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@webassemblyjs/validation/-/validation-1.4.3.tgz#9e66c9b3079d7bbcf2070c1bf52a54af2a09aac9" - dependencies: - "@webassemblyjs/ast" "1.4.3" - -"@webassemblyjs/wasm-edit@1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.4.3.tgz#87febd565e0ffb5ae25f6495bb3958d17aa0a779" - dependencies: - "@webassemblyjs/ast" "1.4.3" - "@webassemblyjs/helper-buffer" "1.4.3" - "@webassemblyjs/helper-wasm-bytecode" "1.4.3" - "@webassemblyjs/helper-wasm-section" "1.4.3" - "@webassemblyjs/wasm-gen" "1.4.3" - "@webassemblyjs/wasm-opt" "1.4.3" - "@webassemblyjs/wasm-parser" "1.4.3" - "@webassemblyjs/wast-printer" "1.4.3" - debug "^3.1.0" - -"@webassemblyjs/wasm-gen@1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.4.3.tgz#8553164d0154a6be8f74d653d7ab355f73240aa4" - dependencies: - "@webassemblyjs/ast" "1.4.3" - "@webassemblyjs/helper-wasm-bytecode" "1.4.3" - "@webassemblyjs/leb128" "1.4.3" - -"@webassemblyjs/wasm-opt@1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.4.3.tgz#26c7a23bfb136aa405b1d3410e63408ec60894b8" - dependencies: - "@webassemblyjs/ast" "1.4.3" - "@webassemblyjs/helper-buffer" "1.4.3" - "@webassemblyjs/wasm-gen" "1.4.3" - "@webassemblyjs/wasm-parser" "1.4.3" - debug "^3.1.0" - -"@webassemblyjs/wasm-parser@1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.4.3.tgz#7ddd3e408f8542647ed612019cfb780830993698" - dependencies: - "@webassemblyjs/ast" "1.4.3" - "@webassemblyjs/helper-wasm-bytecode" "1.4.3" - "@webassemblyjs/leb128" "1.4.3" - "@webassemblyjs/wasm-parser" "1.4.3" - webassemblyjs "1.4.3" - -"@webassemblyjs/wast-parser@1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.4.3.tgz#3250402e2c5ed53dbe2233c9de1fe1f9f0d51745" - dependencies: - "@webassemblyjs/ast" "1.4.3" - "@webassemblyjs/floating-point-hex-parser" "1.4.3" - "@webassemblyjs/helper-code-frame" "1.4.3" - "@webassemblyjs/helper-fsm" "1.4.3" - long "^3.2.0" - webassemblyjs "1.4.3" - -"@webassemblyjs/wast-printer@1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.4.3.tgz#3d59aa8d0252d6814a3ef4e6d2a34c9ded3904e0" - dependencies: - "@webassemblyjs/ast" "1.4.3" - "@webassemblyjs/wast-parser" "1.4.3" - long "^3.2.0" - -abab@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - -accepts@^1.2.2, accepts@~1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" - dependencies: - mime-types "~2.1.18" - negotiator "0.6.1" - -accord@^0.26.3: - version "0.26.4" - resolved "https://registry.yarnpkg.com/accord/-/accord-0.26.4.tgz#fc4c8d3ebab406a07cb28819b859651c44a92e80" - dependencies: - convert-source-map "^1.2.0" - glob "^7.0.5" - indx "^0.2.3" - lodash.clone "^4.3.2" - lodash.defaults "^4.0.1" - lodash.flatten "^4.2.0" - lodash.merge "^4.4.0" - lodash.partialright "^4.1.4" - lodash.pick "^4.2.1" - lodash.uniq "^4.3.0" - resolve "^1.1.7" - semver "^5.3.0" - uglify-js "^2.7.0" - when "^3.7.7" - -acorn-dynamic-import@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" - dependencies: - acorn "^5.0.0" - -acorn-globals@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" - dependencies: - acorn "^4.0.4" - -acorn-globals@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" - dependencies: - acorn "^5.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@5.X, acorn@^5.0.0, acorn@^5.0.3, acorn@^5.3.0, acorn@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" - -acorn@^3.0.4, acorn@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^4.0.4, acorn@~4.0.2: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - -agent-base@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.0.tgz#9838b5c3392b962bad031e6a4c5e1024abec45ce" - dependencies: - es6-promisify "^5.0.0" - -agentkeepalive@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.4.1.tgz#aa95aebc3a749bca5ed53e3880a09f5235b48f0c" - dependencies: - humanize-ms "^1.2.1" - -ajv-keywords@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" - -ajv-keywords@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" - -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - -ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - -ajv@^6.1.0: - version "6.5.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.1.tgz#88ebc1263c7133937d108b80c5572e64e1d9322d" - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.1" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - -animejs@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/animejs/-/animejs-2.2.0.tgz#35eefdfc535b81949c9cb06f0b3e60c02e6fdc80" - -ansi-colors@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" - dependencies: - ansi-wrap "^0.1.0" - -ansi-cyan@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" - dependencies: - ansi-wrap "0.1.0" - -ansi-escapes@^1.0.0, ansi-escapes@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" - -ansi-escapes@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" - -ansi-gray@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" - dependencies: - ansi-wrap "0.1.0" - -ansi-red@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" - dependencies: - ansi-wrap "0.1.0" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - dependencies: - color-convert "^1.9.0" - -ansi-styles@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" - -ansi-wrap@0.1.0, ansi-wrap@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" - -any-observable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" - -any-promise@^1.0.0, any-promise@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -"apparatus@>= 0.0.9": - version "0.0.10" - resolved "https://registry.yarnpkg.com/apparatus/-/apparatus-0.0.10.tgz#81ea756772ada77863db54ceee8202c109bdca3e" - dependencies: - sylvester ">= 0.0.8" - -append-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" - dependencies: - buffer-equal "^1.0.0" - -append-field@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/append-field/-/append-field-0.1.0.tgz#6ddc58fa083c7bc545d3c5995b2830cc2366d44a" - -aproba@^1.0.3, aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - -archive-type@^3.0.0, archive-type@^3.0.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-3.2.0.tgz#9cd9c006957ebe95fadad5bd6098942a813737f6" - dependencies: - file-type "^3.1.0" - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" - dependencies: - arr-flatten "^1.0.1" - array-slice "^0.2.3" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - dependencies: - arr-flatten "^1.0.1" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - -arr-flatten@^1.0.1, arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - -arr-union@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - -array-differ@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - -array-each@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" - -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - -array-filter@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" - -array-find-index@^1.0.1, array-find-index@^1.0.2: - 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-map@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" - -array-parallel@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/array-parallel/-/array-parallel-0.1.3.tgz#8f785308926ed5aa478c47e64d1b334b6c0c947d" - -array-reduce@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" - -array-series@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/array-series/-/array-series-0.1.5.tgz#df5d37bfc5c2ef0755e2aa4f92feae7d4b5a972f" - -array-slice@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" - -array-slice@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" - -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.0, array-uniq@^1.0.1, array-uniq@^1.0.2: - 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" - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - -arrify@^1.0.0, arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - -asap@^2.0.0, asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -asn1.js@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.0.1.tgz#7668b56416953f0ce3421adbb3893ace59c96f59" - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - -assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - dependencies: - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - -ast-types@0.10.1: - version "0.10.1" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.10.1.tgz#f52fca9715579a14f841d67d7f8d25432ab6a3dd" - -ast-types@0.11.5: - version "0.11.5" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.5.tgz#9890825d660c03c28339f315e9fa0a360e31ec28" - -async-each-series@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-1.1.0.tgz#f42fd8155d38f21a5b8ea07c28e063ed1700b138" - -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-limiter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - -async-validator@~1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.8.2.tgz#b77597226e96242f8d531c0d46ae295f62422ba4" - dependencies: - babel-runtime "6.x" - -async@^1.5.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - -async@^2.5.0, async@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" - dependencies: - lodash "^4.17.10" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -atob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" - -autoprefixer@^6.3.1: - version "6.7.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" - dependencies: - browserslist "^1.7.6" - caniuse-db "^1.0.30000634" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^5.2.16" - postcss-value-parser "^3.2.3" - -autosize@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/autosize/-/autosize-4.0.2.tgz#073cfd07c8bf45da4b9fd153437f5bafbba1e4c9" - -autwh@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/autwh/-/autwh-0.1.0.tgz#24a5300923309d105133401a2568f9c8ab7d7e03" - dependencies: - oauth "0.9.15" - -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - -aws4@^1.2.1, aws4@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" - -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-bindify-decorators@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-explode-class@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" - dependencies: - babel-helper-bindify-decorators "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-vue-jsx-merge-props@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - -babel-plugin-syntax-async-generators@^6.5.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" - -babel-plugin-syntax-class-constructor-call@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" - -babel-plugin-syntax-class-properties@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" - -babel-plugin-syntax-decorators@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" - -babel-plugin-syntax-dynamic-import@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - -babel-plugin-syntax-export-extensions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" - -babel-plugin-syntax-flow@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" - -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - -babel-plugin-transform-async-generator-functions@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-generators "^6.5.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-class-constructor-call@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" - dependencies: - babel-plugin-syntax-class-constructor-call "^6.18.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-class-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" - dependencies: - babel-helper-function-name "^6.24.1" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-decorators@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" - dependencies: - babel-helper-explode-class "^6.24.1" - babel-plugin-syntax-decorators "^6.13.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-export-extensions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" - dependencies: - babel-plugin-syntax-export-extensions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-flow-strip-types@^6.8.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" - dependencies: - babel-plugin-syntax-flow "^6.18.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-object-rest-spread@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - -babel-plugin-transform-regenerator@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-polyfill@6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" - dependencies: - babel-runtime "^6.22.0" - core-js "^2.4.0" - regenerator-runtime "^0.10.0" - -babel-preset-es2015@^6.9.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.24.1" - babel-plugin-transform-es2015-classes "^6.24.1" - babel-plugin-transform-es2015-computed-properties "^6.24.1" - babel-plugin-transform-es2015-destructuring "^6.22.0" - babel-plugin-transform-es2015-duplicate-keys "^6.24.1" - babel-plugin-transform-es2015-for-of "^6.22.0" - babel-plugin-transform-es2015-function-name "^6.24.1" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-plugin-transform-es2015-modules-systemjs "^6.24.1" - babel-plugin-transform-es2015-modules-umd "^6.24.1" - babel-plugin-transform-es2015-object-super "^6.24.1" - babel-plugin-transform-es2015-parameters "^6.24.1" - babel-plugin-transform-es2015-shorthand-properties "^6.24.1" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.24.1" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.22.0" - babel-plugin-transform-es2015-unicode-regex "^6.24.1" - babel-plugin-transform-regenerator "^6.24.1" - -babel-preset-stage-1@^6.5.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" - dependencies: - babel-plugin-transform-class-constructor-call "^6.24.1" - babel-plugin-transform-export-extensions "^6.22.0" - babel-preset-stage-2 "^6.24.1" - -babel-preset-stage-2@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" - dependencies: - babel-plugin-syntax-dynamic-import "^6.18.0" - babel-plugin-transform-class-properties "^6.24.1" - babel-plugin-transform-decorators "^6.24.1" - babel-preset-stage-3 "^6.24.1" - -babel-preset-stage-3@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" - dependencies: - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-generator-functions "^6.24.1" - babel-plugin-transform-async-to-generator "^6.24.1" - babel-plugin-transform-exponentiation-operator "^6.24.1" - babel-plugin-transform-object-rest-spread "^6.22.0" - -babel-register@^6.26.0, babel-register@^6.9.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@6.x, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.17.3, babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - -babylon@^7.0.0-beta.47: - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.47.tgz#6d1fa44f0abec41ab7c780481e62fd9aafbdea80" - -balanced-match@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -base32.js@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/base32.js/-/base32.js-0.0.1.tgz#d045736a57b1f6c139f0c7df42518a84e91bb2ba" - -base64-js@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" - dependencies: - tweetnacl "^0.14.3" - -bcryptjs@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" - -beeper@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" - -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - -bin-build@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-2.2.0.tgz#11f8dd61f70ffcfa2bdcaa5b46f5e8fedd4221cc" - dependencies: - archive-type "^3.0.1" - decompress "^3.0.0" - download "^4.1.2" - exec-series "^1.0.0" - rimraf "^2.2.6" - tempfile "^1.0.0" - url-regex "^3.0.0" - -bin-check@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-2.0.0.tgz#86f8e6f4253893df60dc316957f5af02acb05930" - dependencies: - executable "^1.0.0" - -bin-version-check@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-2.1.0.tgz#e4e5df290b9069f7d111324031efc13fdd11a5b0" - dependencies: - bin-version "^1.0.0" - minimist "^1.1.0" - semver "^4.0.3" - semver-truncate "^1.0.0" - -bin-version@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-1.0.4.tgz#9eb498ee6fd76f7ab9a7c160436f89579435d78e" - dependencies: - find-versions "^1.0.0" - -bin-wrapper@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-3.0.2.tgz#67d3306262e4b1a5f2f88ee23464f6a655677aeb" - dependencies: - bin-check "^2.0.0" - bin-version-check "^2.1.0" - download "^4.0.0" - each-async "^1.1.1" - lazy-req "^1.0.0" - os-filter-obj "^1.0.0" - -binary-extensions@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" - -binaryextensions@2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935" - -bl@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" - -bluebird@^3.0.5, bluebird@^3.1.1, bluebird@^3.4.1, bluebird@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - -body-parser@1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" - dependencies: - bytes "3.0.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.1" - http-errors "~1.6.2" - iconv-lite "0.4.19" - on-finished "~2.3.0" - qs "6.5.1" - raw-body "2.3.2" - type-is "~1.6.15" - -body-parser@^1.12.2: - version "1.18.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" - dependencies: - bytes "3.0.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "~1.6.3" - iconv-lite "0.4.23" - on-finished "~2.3.0" - qs "6.5.2" - raw-body "2.3.3" - type-is "~1.6.16" - -boolbase@^1.0.0, boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" - -boom@4.x.x: - version "4.3.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" - dependencies: - hoek "4.x.x" - -boom@5.x.x: - version "5.2.0" - resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" - dependencies: - hoek "4.x.x" - -bootstrap-vue@2.0.0-rc.6: - version "2.0.0-rc.6" - resolved "https://registry.yarnpkg.com/bootstrap-vue/-/bootstrap-vue-2.0.0-rc.6.tgz#12d0a241414f1efd647e8b14a88c51707c920c86" - dependencies: - bootstrap "^4.0.0" - lodash.get "^4.4.2" - lodash.startcase "^4.4.0" - opencollective "^1.0.3" - popper.js "^1.12.9" - vue-functional-data-merge "^2.0.5" - -bootstrap@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.1.1.tgz#3aec85000fa619085da8d2e4983dfd67cf2114cb" - -brace-expansion@^1.0.0, brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.0, braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - -browser-process-hrtime@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.1.tgz#3343124db6d7ad53e26a8826318712bdc8450f9c" - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - dependencies: - pako "~1.0.5" - -browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: - version "1.7.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" - dependencies: - caniuse-db "^1.0.30000639" - electron-to-chromium "^1.2.7" - -bson@~1.0.4: - version "1.0.9" - resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.9.tgz#12319f8323b1254739b7c6bef8d3e89ae05a2f57" - -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - -buffer-alloc@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - -buffer-equal-constant-time@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" - -buffer-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - -buffer-from@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-0.1.2.tgz#15f4b9bcef012044df31142c14333caf6e0260d0" - -buffer-from@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" - -buffer-shims@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" - -buffer-to-vinyl@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz#00f15faee3ab7a1dda2cde6d9121bffdd07b2262" - dependencies: - file-type "^3.1.0" - readable-stream "^2.0.2" - uuid "^2.0.1" - vinyl "^1.0.0" - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - -buffer@^4.3.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -bufferstreams@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-1.1.3.tgz#a8515ac024fa90e8fa7d58c11b13dea1f28abe72" - dependencies: - readable-stream "^2.0.2" - -builtin-modules@^1.0.0, builtin-modules@^1.1.1: - 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" - -busboy@^0.2.11: - version "0.2.14" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" - dependencies: - dicer "0.2.5" - readable-stream "1.1.x" - -bytes@3.0.0, bytes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - -bytes@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.5.0.tgz#4c9423ea2d252c270c41b2bdefeff9bb6b62c06a" - -cacache@^10.0.4: - version "10.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" - dependencies: - bluebird "^3.5.1" - chownr "^1.0.1" - glob "^7.1.2" - graceful-fs "^4.1.11" - lru-cache "^4.1.1" - mississippi "^2.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.2" - ssri "^5.2.4" - unique-filename "^1.1.0" - y18n "^4.0.0" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -cacheable-request@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" - dependencies: - clone-response "1.0.2" - get-stream "3.0.0" - http-cache-semantics "3.8.1" - keyv "3.0.0" - lowercase-keys "1.0.0" - normalize-url "2.0.1" - responselike "1.0.2" - -cafy@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/cafy/-/cafy-8.0.0.tgz#8f6ce8556d64ee145c5cdc79b5b68f7fc57ee46f" - -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - -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" - -camel-case@3.0.x: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" - dependencies: - no-case "^2.2.0" - upper-case "^1.1.1" - -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" - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - -can-promise@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/can-promise/-/can-promise-0.0.1.tgz#7a7597ad801fb14c8b22341dfec314b6bd6ad8d3" - dependencies: - window-or-global "^1.0.1" - -caniuse-api@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" - dependencies: - browserslist "^1.3.6" - caniuse-db "^1.0.30000529" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000856" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000856.tgz#fbebb99abe15a5654fc7747ebb5315bdfde3358f" - -capture-stack-trace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" - -caseless@~0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - -caw@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/caw/-/caw-1.2.0.tgz#ffb226fe7efc547288dc62ee3e97073c212d1034" - dependencies: - get-proxy "^1.0.1" - is-obj "^1.0.0" - object-assign "^3.0.0" - tunnel-agent "^0.4.0" - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" - dependencies: - ansi-styles "^3.2.0" - escape-string-regexp "^1.0.5" - supports-color "^5.2.0" - -chalk@2.4.1, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.2.0, chalk@^2.3.0, chalk@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" - dependencies: - ansi-styles "~1.0.0" - has-color "~0.1.0" - strip-ansi "~0.1.0" - -character-parser@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" - dependencies: - is-regex "^1.0.3" - -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - -cheerio-httpcli@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/cheerio-httpcli/-/cheerio-httpcli-0.7.2.tgz#346d41b0f00f01aaa2da8d5e7efb3f806fb277a3" - dependencies: - "@types/cheerio" "^0.22.5" - "@types/node" "^8.0.47" - async "^2.5.0" - cheerio "^0.22.0" - colors "^1.1.2" - foreach "^2.0.5" - he "^1.1.1" - iconv-lite "^0.4.19" - jschardet "^1.6.0" - object-assign "^4.1.1" - os-locale "^2.1.0" - prettyjson "^1.2.1" - request "^2.83.0" - require-uncached "^1.0.3" - rsvp "^4.7.0" - spawn-sync "^1.0.15" - tough-cookie "^2.3.3" - type-of "^2.0.1" - valid-url "^1.0.9" - yargs "^10.0.3" - -cheerio@^0.22.0: - version "0.22.0" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" - dependencies: - css-select "~1.2.0" - dom-serializer "~0.1.0" - entities "~1.1.1" - htmlparser2 "^3.9.1" - lodash.assignin "^4.0.9" - lodash.bind "^4.1.4" - lodash.defaults "^4.0.1" - lodash.filter "^4.4.0" - lodash.flatten "^4.2.0" - lodash.foreach "^4.3.0" - lodash.map "^4.4.0" - lodash.merge "^4.4.0" - lodash.pick "^4.2.1" - lodash.reduce "^4.4.0" - lodash.reject "^4.4.0" - lodash.some "^4.4.0" - -chokidar@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - -chokidar@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176" - dependencies: - anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" - glob-parent "^3.1.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^2.1.1" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.0" - optionalDependencies: - fsevents "^1.1.2" - -chownr@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" - -chrome-trace-event@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-0.1.3.tgz#d395af2d31c87b90a716c831fe326f69768ec084" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - -clap@^1.0.9: - version "1.2.3" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" - dependencies: - chalk "^1.1.3" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -clean-css@4.1.x, clean-css@^4.1.11: - version "4.1.11" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a" - dependencies: - source-map "0.5.x" - -cli-cursor@^1.0.2: - 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-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - dependencies: - restore-cursor "^2.0.0" - -cli-spinners@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" - -cli-table@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" - dependencies: - colors "1.0.3" - -cli-truncate@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" - dependencies: - slice-ansi "0.0.4" - string-width "^1.0.1" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - 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" - -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -clone-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" - -clone-deep@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" - dependencies: - for-own "^1.0.0" - is-plain-object "^2.0.4" - kind-of "^6.0.0" - shallow-clone "^1.0.0" - -clone-response@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - dependencies: - mimic-response "^1.0.0" - -clone-stats@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" - -clone-stats@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" - -clone@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" - -clone@^1.0.0, clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - -clone@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" - -cloneable-readable@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65" - dependencies: - inherits "^2.0.1" - process-nextick-args "^2.0.0" - readable-stream "^2.3.5" - -co-body@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/co-body/-/co-body-5.2.0.tgz#5a0a658c46029131e0e3a306f67647302f71c124" - dependencies: - inflation "^2.0.0" - qs "^6.4.0" - raw-body "^2.2.0" - type-is "^1.6.14" - -co-body@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.0.0.tgz#965b9337d7f5655480787471f4237664820827e3" - dependencies: - inflation "^2.0.0" - qs "^6.5.2" - raw-body "^2.3.3" - type-is "^1.6.16" - -co@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -coa@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" - dependencies: - q "^1.1.2" - -coa@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.1.tgz#f3f8b0b15073e35d70263fb1042cb2c023db38af" - dependencies: - q "^1.1.2" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.3.0, color-convert@^1.9.0: - version "1.9.2" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" - dependencies: - color-name "1.1.1" - -color-name@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" - -color-name@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - -color-string@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" - dependencies: - color-name "^1.0.0" - -color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - -color@^0.11.0: - version "0.11.4" - resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" - dependencies: - clone "^1.0.2" - color-convert "^1.3.0" - color-string "^0.3.0" - -colormin@^1.0.5: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" - dependencies: - color "^0.11.0" - css-color-names "0.0.4" - has "^1.0.1" - -colors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - -colors@^1.1.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.0.tgz#5f20c9fef6945cb1134260aab33bfbdc8295e04e" - -colors@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - -combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" - dependencies: - delayed-stream "~1.0.0" - -commander@2.15.1, commander@2.15.x, commander@^2.11.0, commander@^2.12.1, commander@^2.7.1, commander@^2.9.0, commander@~2.15.0: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - -commander@~2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" - dependencies: - graceful-readlink ">= 1.0.0" - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - -component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - -compressible@^2.0.0: - version "2.0.14" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7" - dependencies: - mime-db ">= 1.34.0 < 2" - -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.4.6, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -condense-newlines@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/condense-newlines/-/condense-newlines-0.2.1.tgz#3de985553139475d32502c83b02f60684d24c55f" - dependencies: - extend-shallow "^2.0.1" - is-whitespace "^0.3.0" - kind-of "^3.0.2" - -config-chain@~1.1.5: - version "1.1.11" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2" - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - -console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - dependencies: - date-now "^0.1.4" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - -console-stream@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44" - -consolidate@^0.15.0, consolidate@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" - dependencies: - bluebird "^3.1.1" - -constantinople@^3.0.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647" - dependencies: - "@types/babel-types" "^7.0.0" - "@types/babylon" "^6.16.2" - babel-types "^6.26.0" - babylon "^6.18.0" - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - -content-disposition@0.5.2, content-disposition@~0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" - -content-type@^1.0.0, content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - -convert-source-map@1.X, convert-source-map@^1.1.1, convert-source-map@^1.2.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - -cookies@~0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.7.1.tgz#7c8a615f5481c61ab9f16c833731bcb8f663b99b" - dependencies: - depd "~1.1.1" - keygrip "~1.0.2" - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - -copy-to@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5" - -core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0: - version "2.5.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" - -core-util-is@1.0.2, 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" - -crc-32@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" - dependencies: - exit-on-epipe "~1.0.1" - printj "~1.1.0" - -create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" - -create-error-class@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - dependencies: - capture-stack-trace "^1.0.0" - -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cropperjs@^1.1.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cropperjs/-/cropperjs-1.4.0.tgz#e9851559c590d148a10c17c36cdc8126acf01a2e" - -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.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - -cross-spawn@^5.0.1, cross-spawn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - -cryptiles@3.x.x: - version "3.1.2" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" - dependencies: - boom "5.x.x" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-color-names@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - -css-loader@0.28.11: - version "0.28.11" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7" - dependencies: - babel-code-frame "^6.26.0" - css-selector-tokenizer "^0.7.0" - cssnano "^3.10.0" - icss-utils "^2.1.0" - loader-utils "^1.0.2" - lodash.camelcase "^4.3.0" - object-assign "^4.1.1" - postcss "^5.0.6" - postcss-modules-extract-imports "^1.2.0" - postcss-modules-local-by-default "^1.2.0" - postcss-modules-scope "^1.1.0" - postcss-modules-values "^1.3.0" - postcss-value-parser "^3.3.0" - source-list-map "^2.0.0" - -css-parse@1.7.x: - version "1.7.0" - resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b" - -css-select-base-adapter@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz#0102b3d14630df86c3eb9fa9f5456270106cf990" - -css-select@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - dependencies: - boolbase "~1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "~1.0.1" - -css-select@~1.3.0-rc0: - version "1.3.0-rc0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.3.0-rc0.tgz#6f93196aaae737666ea1036a8cb14a8fcb7a9231" - dependencies: - boolbase "^1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "^1.0.1" - -css-selector-tokenizer@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" - dependencies: - cssesc "^0.1.0" - fastparse "^1.1.1" - regexpu-core "^1.0.0" - -css-tree@1.0.0-alpha.29: - version "1.0.0-alpha.29" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" - dependencies: - mdn-data "~1.1.0" - source-map "^0.5.3" - -css-tree@1.0.0-alpha25: - version "1.0.0-alpha25" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha25.tgz#1bbfabfbf6eeef4f01d9108ff2edd0be2fe35597" - dependencies: - mdn-data "^1.0.0" - source-map "^0.5.3" - -css-url-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec" - -css-what@2.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" - -css@2.X, css@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/css/-/css-2.2.3.tgz#f861f4ba61e79bedc962aa548e5780fd95cbc6be" - dependencies: - inherits "^2.0.1" - source-map "^0.1.38" - source-map-resolve "^0.5.1" - urix "^0.1.0" - -cssesc@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" - -cssnano@^3.0.0, cssnano@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" - dependencies: - autoprefixer "^6.3.1" - decamelize "^1.1.2" - defined "^1.0.0" - has "^1.0.1" - object-assign "^4.0.1" - postcss "^5.0.14" - postcss-calc "^5.2.0" - postcss-colormin "^2.1.8" - postcss-convert-values "^2.3.4" - postcss-discard-comments "^2.0.4" - postcss-discard-duplicates "^2.0.1" - postcss-discard-empty "^2.0.1" - postcss-discard-overridden "^0.1.1" - postcss-discard-unused "^2.2.1" - postcss-filter-plugins "^2.0.0" - postcss-merge-idents "^2.1.5" - postcss-merge-longhand "^2.0.1" - postcss-merge-rules "^2.0.3" - postcss-minify-font-values "^1.0.2" - postcss-minify-gradients "^1.0.1" - postcss-minify-params "^1.0.4" - postcss-minify-selectors "^2.0.4" - postcss-normalize-charset "^1.1.0" - postcss-normalize-url "^3.0.7" - postcss-ordered-values "^2.1.0" - postcss-reduce-idents "^2.2.2" - postcss-reduce-initial "^1.0.0" - postcss-reduce-transforms "^1.0.3" - postcss-svgo "^2.1.1" - postcss-unique-selectors "^2.0.2" - postcss-value-parser "^3.2.3" - postcss-zindex "^2.0.1" - -csso@^3.5.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" - dependencies: - css-tree "1.0.0-alpha.29" - -csso@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" - dependencies: - clap "^1.0.9" - source-map "^0.5.3" - -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" - -"cssstyle@>= 0.3.1 < 0.4.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.3.1.tgz#6da9b4cff1bc5d716e6e5fe8e04fcb1b50a49adf" - dependencies: - cssom "0.3.x" - -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" - -cyclist@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" - -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - dependencies: - es5-ext "^0.10.9" - -dargs@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - -data-urls@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" - dependencies: - abab "^1.0.4" - whatwg-mimetype "^2.0.0" - whatwg-url "^6.4.0" - -date-fns@^1.27.2: - version "1.29.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" - -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - -dateformat@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" - -dateformat@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" - -de-indent@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" - -debug-fabulous@1.X: - version "1.1.0" - resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-1.1.0.tgz#af8a08632465224ef4174a9f06308c3c2a1ebc8e" - dependencies: - debug "3.X" - memoizee "0.4.X" - object-assign "4.X" - -debug@*, debug@3.1.0, debug@3.X, debug@^3.0.0, debug@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - dependencies: - ms "2.0.0" - -debug@0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" - -debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.1, debug@^2.6.3, debug@^2.6.8, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -debuglog@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" - -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" - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - -decompress-response@^3.2.0, decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - dependencies: - mimic-response "^1.0.0" - -decompress-tar@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-3.1.0.tgz#217c789f9b94450efaadc5c5e537978fc333c466" - dependencies: - is-tar "^1.0.0" - object-assign "^2.0.0" - strip-dirs "^1.0.0" - tar-stream "^1.1.1" - through2 "^0.6.1" - vinyl "^0.4.3" - -decompress-tarbz2@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz#8b23935681355f9f189d87256a0f8bdd96d9666d" - dependencies: - is-bzip2 "^1.0.0" - object-assign "^2.0.0" - seek-bzip "^1.0.3" - strip-dirs "^1.0.0" - tar-stream "^1.1.1" - through2 "^0.6.1" - vinyl "^0.4.3" - -decompress-targz@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-3.1.0.tgz#b2c13df98166268991b715d6447f642e9696f5a0" - dependencies: - is-gzip "^1.0.0" - object-assign "^2.0.0" - strip-dirs "^1.0.0" - tar-stream "^1.1.1" - through2 "^0.6.1" - vinyl "^0.4.3" - -decompress-unzip@^3.0.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-3.4.0.tgz#61475b4152066bbe3fee12f9d629d15fe6478eeb" - dependencies: - is-zip "^1.0.0" - read-all-stream "^3.0.0" - stat-mode "^0.2.0" - strip-dirs "^1.0.0" - through2 "^2.0.0" - vinyl "^1.0.0" - yauzl "^2.2.1" - -decompress@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-3.0.0.tgz#af1dd50d06e3bfc432461d37de11b38c0d991bed" - dependencies: - buffer-to-vinyl "^1.0.0" - concat-stream "^1.4.6" - decompress-tar "^3.0.0" - decompress-tarbz2 "^3.0.0" - decompress-targz "^3.0.0" - decompress-unzip "^3.0.0" - stream-combiner2 "^1.1.1" - vinyl-assign "^1.0.1" - vinyl-fs "^2.2.0" - -deep-equal@1.0.1, deep-equal@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - -deep-extend@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - -deep-is@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.2.tgz#9ced65ea0bc0b09f42a6d79c1b1903f9d913cc18" - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - -deepcopy@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/deepcopy/-/deepcopy-0.6.3.tgz#634780f2f8656ab771af8fa8431ed1ccee55c7b0" - -deepmerge@^1.2.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753" - -deepmerge@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.1.1.tgz#e862b4e45ea0555072bf51e7fd0d9845170ae768" - -defaults@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - dependencies: - clone "^1.0.2" - -define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" - dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - -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" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - -depd@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" - -depd@^1.1.0, depd@~1.1.1, depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - -deprecated@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" - -des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@^1.0.3, destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - -detect-conflict@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/detect-conflict/-/detect-conflict-1.0.1.tgz#088657a66a961c05019db7c4230883b1c6b4176e" - -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" - -detect-indent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - -detect-newline@2.X: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - -dezalgo@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" - dependencies: - asap "^2.0.0" - wrappy "1" - -dicer@0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" - dependencies: - readable-stream "1.1.x" - streamsearch "0.1.2" - -diff@3.5.0, diff@^3.1.0, diff@^3.2.0, diff@^3.3.1, diff@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dijkstrajs@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.1.tgz#d3cd81221e3ea40742cfcde556d4e99e98ddc71b" - -dir-glob@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" - dependencies: - arrify "^1.0.1" - path-type "^3.0.0" - -diskusage@0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/diskusage/-/diskusage-0.2.4.tgz#e956f7a1051e0c6a1af706154efe620a2ee432ec" - dependencies: - nan "^2.5.0" - -doctrine@^2.0.0, doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - dependencies: - esutils "^2.0.2" - -doctypes@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" - -dom-serializer@0, dom-serializer@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" - dependencies: - domelementtype "~1.1.1" - entities "~1.1.1" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - -domelementtype@1, domelementtype@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" - -domelementtype@~1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" - -domexception@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - dependencies: - webidl-conversions "^4.0.2" - -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - dependencies: - domelementtype "1" - -dompurify@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-1.0.4.tgz#b0655d07856c1ef76fd27ae18e8ab1174ed18819" - -domutils@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^1.5.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - dependencies: - dom-serializer "0" - domelementtype "1" - -dot-prop@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - dependencies: - is-obj "^1.0.0" - -double-ended-queue@^2.1.0-0: - version "2.1.0-0" - resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c" - -download@^4.0.0, download@^4.1.2: - version "4.4.3" - resolved "https://registry.yarnpkg.com/download/-/download-4.4.3.tgz#aa55fdad392d95d4b68e8c2be03e0c2aa21ba9ac" - dependencies: - caw "^1.0.1" - concat-stream "^1.4.7" - each-async "^1.0.0" - filenamify "^1.0.1" - got "^5.0.0" - gulp-decompress "^1.2.0" - gulp-rename "^1.2.0" - is-url "^1.2.0" - object-assign "^4.0.1" - read-all-stream "^3.0.0" - readable-stream "^2.0.2" - stream-combiner2 "^1.1.1" - vinyl "^1.0.0" - vinyl-fs "^2.2.0" - ware "^1.2.0" - -duplexer2@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" - dependencies: - readable-stream "~1.1.9" - -duplexer2@^0.1.4, duplexer2@~0.1.0: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - dependencies: - readable-stream "^2.0.2" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - -duplexify@^3.2.0, duplexify@^3.4.2, duplexify@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -each-async@^1.0.0, each-async@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/each-async/-/each-async-1.1.1.tgz#dee5229bdf0ab6ba2012a395e1b869abf8813473" - dependencies: - onetime "^1.0.0" - set-immediate-shim "^1.0.0" - -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - dependencies: - jsbn "~0.1.0" - -ecdsa-sig-formatter@1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz#1c595000f04a8897dfb85000892a0f4c33af86c3" - dependencies: - safe-buffer "^5.0.1" - -editions@^1.3.3: - version "1.3.4" - resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" - -editorconfig@^0.13.2: - version "0.13.3" - resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.13.3.tgz#e5219e587951d60958fd94ea9a9a008cdeff1b34" - dependencies: - bluebird "^3.0.5" - commander "^2.9.0" - lru-cache "^3.2.0" - semver "^5.1.0" - sigmund "^1.0.1" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - -ejs@^2.5.9: - version "2.6.1" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" - -elasticsearch@15.0.0: - version "15.0.0" - resolved "https://registry.yarnpkg.com/elasticsearch/-/elasticsearch-15.0.0.tgz#d888ceb858bba30221b68698d72c54bdcfdf2fba" - dependencies: - agentkeepalive "^3.4.1" - chalk "^1.0.0" - lodash "^4.17.10" - -electron-to-chromium@^1.2.7: - version "1.3.48" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz#d3b0d8593814044e092ece2108fc3ac9aea4b900" - -elegant-spinner@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" - -element-ui@2.3.9: - version "2.3.9" - resolved "https://registry.yarnpkg.com/element-ui/-/element-ui-2.3.9.tgz#0c5996e74b375f2665d703c68bdb3269ae9269e0" - dependencies: - async-validator "~1.8.1" - babel-helper-vue-jsx-merge-props "^2.0.0" - deepmerge "^1.2.0" - normalize-wheel "^1.0.1" - resize-observer-polyfill "^1.5.0" - throttle-debounce "^1.0.1" - -elliptic@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -emojilib@2.2.12: - version "2.2.12" - resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.2.12.tgz#29481fa5521ac5ed97a5cc0503901c3435d523fa" - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - -encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - dependencies: - iconv-lite "~0.4.13" - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - dependencies: - once "^1.4.0" - -end-of-stream@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" - dependencies: - once "~1.3.0" - -enhanced-resolve@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz#e34a6eaa790f62fccd71d93959f56b2b432db10a" - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - tapable "^1.0.0" - -entities@^1.1.1, entities@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" - -envinfo@^5.7.0: - version "5.10.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-5.10.0.tgz#503a9774ae15b93ea68bdfae2ccd6306624ea6df" - -errno@^0.1.3, errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - dependencies: - prr "~1.0.1" - -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" - dependencies: - is-arrayish "^0.2.1" - -error-inject@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" - -error@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" - dependencies: - string-template "~0.2.1" - xtend "~4.0.0" - -es-abstract@^1.5.1, es-abstract@^1.6.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" - dependencies: - es-to-primitive "^1.1.1" - function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" - is-regex "^1.0.4" - -es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" - dependencies: - is-callable "^1.1.1" - is-date-object "^1.0.1" - is-symbol "^1.0.1" - -es5-ext@^0.10.14, es5-ext@^0.10.30, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2: - version "0.10.45" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz#0bfdf7b473da5919d5adf3bd25ceb754fccc3653" - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.1" - next-tick "1" - -es6-iterator@^2.0.1, es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-promise@3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.2.1.tgz#ec56233868032909207170c39448e24449dd1fc4" - -es6-promise@^3.0.2: - version "3.3.1" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" - -es6-promise@^4.0.3, es6-promise@^4.1.1: - version "4.2.4" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - dependencies: - es6-promise "^4.0.3" - -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.2: - 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.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-regexp@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/escape-regexp/-/escape-regexp-0.0.1.tgz#f44bda12d45bbdf9cb7f862ee7e4827b3dd32254" - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, 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" - -escodegen@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.10.0.tgz#f647395de22519fbd0d928ffcf1d17e0dec2603e" - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-plugin-vue@4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-4.5.0.tgz#09d6597f4849e31a3846c2c395fccf17685b69c3" - dependencies: - vue-eslint-parser "^2.0.3" - -eslint-scope@^3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - -eslint@4.19.1: - version "4.19.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" - dependencies: - ajv "^5.3.0" - babel-code-frame "^6.22.0" - chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^3.1.0" - doctrine "^2.1.0" - eslint-scope "^3.7.1" - eslint-visitor-keys "^1.0.0" - espree "^3.5.4" - esquery "^1.0.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.0.1" - ignore "^3.3.3" - imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" - progress "^2.0.0" - regexpp "^1.0.1" - require-uncached "^1.0.3" - semver "^5.3.0" - strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "4.0.2" - text-table "~0.2.0" - -espree@^3.5.2, espree@^3.5.4: - version "3.5.4" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" - dependencies: - acorn "^5.5.0" - acorn-jsx "^3.0.0" - -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - -esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - -esprima@^4.0.0, esprima@~4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" - -esquery@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - dependencies: - estraverse "^4.0.0" - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - dependencies: - estraverse "^4.1.0" - -estraverse@^4.0.0, estraverse@^4.1.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" - -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - -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@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" - -events@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -exec-buffer@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/exec-buffer/-/exec-buffer-3.2.0.tgz#b1686dbd904c7cf982e652c1f5a79b1e5573082b" - dependencies: - execa "^0.7.0" - p-finally "^1.0.0" - pify "^3.0.0" - rimraf "^2.5.4" - tempfile "^2.0.0" - -exec-series@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/exec-series/-/exec-series-1.0.3.tgz#6d257a9beac482a872c7783bc8615839fc77143a" - dependencies: - async-each-series "^1.1.0" - object-assign "^4.1.0" - -execa@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" - dependencies: - cross-spawn "^6.0.0" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -executable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/executable/-/executable-1.1.0.tgz#877980e9112f3391066da37265de7ad8434ab4d9" - dependencies: - meow "^3.1.0" - -exif-js@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/exif-js/-/exif-js-2.3.0.tgz#9d10819bf571f873813e7640241255ab9ce1a814" - -exit-hook@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" - -exit-on-epipe@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - dependencies: - is-posix-bracket "^0.1.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - dependencies: - fill-range "^2.1.0" - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - dependencies: - homedir-polyfill "^1.0.1" - -express@^4.12.2: - version "4.16.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" - dependencies: - accepts "~1.3.5" - array-flatten "1.1.1" - body-parser "1.18.2" - content-disposition "0.5.2" - content-type "~1.0.4" - cookie "0.3.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.1.1" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.2" - path-to-regexp "0.1.7" - proxy-addr "~2.0.3" - qs "6.5.1" - range-parser "~1.2.0" - safe-buffer "5.1.1" - send "0.16.2" - serve-static "1.13.2" - setprototypeof "1.1.0" - statuses "~1.4.0" - type-is "~1.6.16" - utils-merge "1.0.1" - vary "~1.1.2" - -extend-shallow@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" - dependencies: - kind-of "^1.1.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extend/-/extend-1.3.0.tgz#d1516fb0ff5624d2ebf9123ea1dac5a1994004f8" - -extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - -external-editor@^2.0.1, external-editor@^2.0.4, external-editor@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" - dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" - tmp "^0.0.33" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - dependencies: - is-extglob "^1.0.0" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - -fancy-log@1.3.2, fancy-log@^1.1.0, fancy-log@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" - dependencies: - ansi-gray "^0.1.1" - color-support "^1.1.3" - time-stamp "^1.0.0" - -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - -fast-glob@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.2.tgz#71723338ac9b4e0e2fff1d6748a2a13d5ed352bf" - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.0.1" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.1" - micromatch "^3.1.10" - -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - -fast-levenshtein@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - -fastparse@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" - -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - dependencies: - pend "~1.2.0" - -figures@^1.3.5, figures@^1.7.0: - 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" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - dependencies: - escape-string-regexp "^1.0.5" - -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" - -file-loader@1.1.11: - version "1.1.11" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8" - dependencies: - loader-utils "^1.0.2" - schema-utils "^0.4.5" - -file-type@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.0.0.tgz#6e4bccc741187f4113334a4e4a4ef84d54d7cc1e" - -file-type@^3.1.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" - -file-type@^4.1.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5" - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - -filename-reserved-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4" - -filenamify@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5" - dependencies: - filename-reserved-regex "^1.0.0" - strip-outer "^1.0.0" - trim-repeated "^1.0.0" - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -finalhandler@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.2" - statuses "~1.4.0" - unpipe "~1.0.0" - -find-cache-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" - dependencies: - commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^2.0.0" - -find-index@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^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" - -find-versions@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-1.2.1.tgz#cbde9f12e38575a0af1be1b9a2c5d5fd8f186b62" - dependencies: - array-uniq "^1.0.0" - get-stdin "^4.0.1" - meow "^3.5.0" - semver-regex "^1.0.0" - -findup-sync@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" - dependencies: - detect-file "^1.0.0" - is-glob "^3.1.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -fined@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" - dependencies: - expand-tilde "^2.0.2" - is-plain-object "^2.0.3" - object.defaults "^1.1.0" - object.pick "^1.2.0" - parse-filepath "^1.0.1" - -first-chunk-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" - -first-chunk-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70" - dependencies: - readable-stream "^2.0.2" - -flagged-respawn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.0.tgz#4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7" - -flat-cache@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" - dependencies: - circular-json "^0.3.1" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" - -flatten@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" - -flow-parser@^0.*: - version "0.74.0" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.74.0.tgz#4acc8f55bdce5fa4da43c72c28ef8a9600ace87c" - -flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.4" - -for-in@^0.1.3: - version "0.1.8" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" - -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - dependencies: - for-in "^1.0.1" - -for-own@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" - dependencies: - for-in "^1.0.1" - -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - -form-data@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" - dependencies: - asynckit "^0.4.0" - combined-stream "1.0.6" - mime-types "^2.1.12" - -format-util@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.3.tgz#032dca4a116262a12c43f4c3ec8566416c5b2d95" - -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2, fresh@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - -from2@^2.1.0, from2@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - -fs-extra@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - dependencies: - minipass "^2.2.1" - -fs-mkdirp-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" - dependencies: - graceful-fs "^4.1.11" - through2 "^2.0.3" - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fsevents@^1.0.0, fsevents@^1.1.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" - dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" - -fstream@^1.0.0, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -fuckadblock@3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/fuckadblock/-/fuckadblock-3.2.1.tgz#17fa3237a5e15c86613406b911e608191a3e62e2" - -function-bind@^1.1.0, function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -gaze@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" - dependencies: - globule "~0.1.0" - -gaze@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" - 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" - -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-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-paths@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/get-paths/-/get-paths-0.0.2.tgz#a9c27b1a8d006c931a4f26fcf7d1546e3ad71bea" - dependencies: - fs-extra "^4.0.2" - -get-proxy@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-1.1.0.tgz#894854491bc591b0f147d7ae570f5c678b7256eb" - dependencies: - rc "^1.1.2" - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - -get-stream@3.0.0, get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" - -gh-got@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/gh-got/-/gh-got-6.0.0.tgz#d74353004c6ec466647520a10bd46f7299d268d0" - dependencies: - got "^7.0.0" - is-plain-obj "^1.1.0" - -gifsicle@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-3.0.4.tgz#f45cb5ed10165b665dc929e0e9328b6c821dfa3b" - dependencies: - bin-build "^2.0.0" - bin-wrapper "^3.0.0" - logalot "^2.0.0" - -github-username@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/github-username/-/github-username-4.1.0.tgz#cbe280041883206da4212ae9e4b5f169c30bf417" - dependencies: - gh-got "^6.0.0" - -glob-all@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-all/-/glob-all-3.1.0.tgz#8913ddfb5ee1ac7812656241b03d5217c64b02ab" - dependencies: - glob "^7.0.5" - yargs "~1.2.6" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - dependencies: - is-glob "^2.0.0" - -glob-parent@^3.0.0, glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-stream@^3.1.5: - version "3.1.18" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" - dependencies: - glob "^4.3.1" - glob2base "^0.0.12" - minimatch "^2.0.1" - ordered-read-streams "^0.1.0" - through2 "^0.6.1" - unique-stream "^1.0.0" - -glob-stream@^5.3.2: - version "5.3.5" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" - dependencies: - extend "^3.0.0" - glob "^5.0.3" - glob-parent "^3.0.0" - micromatch "^2.3.7" - ordered-read-streams "^0.3.0" - through2 "^0.6.0" - to-absolute-glob "^0.1.1" - unique-stream "^2.0.2" - -glob-stream@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" - dependencies: - extend "^3.0.0" - glob "^7.1.1" - glob-parent "^3.1.0" - is-negated-glob "^1.0.0" - ordered-read-streams "^1.0.0" - pumpify "^1.3.5" - readable-stream "^2.1.5" - remove-trailing-separator "^1.0.1" - to-absolute-glob "^2.0.0" - unique-stream "^2.0.2" - -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - -glob-watcher@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" - dependencies: - gaze "^0.5.1" - -glob2base@^0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" - dependencies: - find-index "^0.1.1" - -glob@7.0.x: - 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" - -glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^4.3.1: - version "4.5.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "^2.0.1" - once "^1.3.0" - -glob@^5.0.3: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@~3.1.21: - version "3.1.21" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" - dependencies: - graceful-fs "~1.2.0" - inherits "1" - minimatch "~0.2.11" - -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -globals@^11.0.1: - version "11.5.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642" - -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - -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" - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -globby@^8.0.0, globby@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50" - dependencies: - array-union "^1.0.1" - dir-glob "^2.0.0" - fast-glob "^2.0.2" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" - -globule@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" - dependencies: - glob "~7.1.1" - lodash "~4.17.10" - minimatch "~3.0.2" - -globule@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" - dependencies: - glob "~3.1.21" - lodash "~1.0.1" - minimatch "~0.2.11" - -glogg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810" - dependencies: - sparkles "^1.0.0" - -gm@1.23.1: - version "1.23.1" - resolved "https://registry.yarnpkg.com/gm/-/gm-1.23.1.tgz#2edeeb958084d0f8ea7988e5d995b1c7dfc14777" - dependencies: - array-parallel "~0.1.3" - array-series "~0.1.5" - cross-spawn "^4.0.0" - debug "^3.1.0" - -got@^5.0.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" - dependencies: - create-error-class "^3.0.1" - duplexer2 "^0.1.4" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - node-status-codes "^1.0.0" - object-assign "^4.0.1" - parse-json "^2.1.0" - pinkie-promise "^2.0.0" - read-all-stream "^3.0.0" - readable-stream "^2.0.5" - timed-out "^3.0.0" - unzip-response "^1.0.2" - url-parse-lax "^1.0.0" - -got@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - dependencies: - decompress-response "^3.2.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" - url-to-options "^1.0.1" - -got@^8.3.1: - version "8.3.1" - resolved "https://registry.yarnpkg.com/got/-/got-8.3.1.tgz#093324403d4d955f5a16a7a8d39955d055ae10ed" - dependencies: - "@sindresorhus/is" "^0.7.0" - cacheable-request "^2.1.1" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - into-stream "^3.1.0" - is-retry-allowed "^1.1.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - mimic-response "^1.0.0" - p-cancelable "^0.4.0" - p-timeout "^2.0.1" - pify "^3.0.0" - safe-buffer "^5.1.1" - timed-out "^4.0.1" - url-parse-lax "^3.0.0" - url-to-options "^1.0.1" - -graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -graceful-fs@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" - dependencies: - natives "^1.1.0" - -graceful-fs@~1.2.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" - -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - -grouped-queue@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/grouped-queue/-/grouped-queue-0.3.3.tgz#c167d2a5319c5a0e0964ef6a25b7c2df8996c85c" - dependencies: - lodash "^4.17.2" - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - -gulp-cssnano@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/gulp-cssnano/-/gulp-cssnano-2.1.3.tgz#02007e2817af09b3688482b430ad7db807aebf72" - dependencies: - buffer-from "^1.0.0" - cssnano "^3.0.0" - object-assign "^4.0.1" - plugin-error "^1.0.1" - vinyl-sourcemaps-apply "^0.2.1" - -gulp-decompress@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gulp-decompress/-/gulp-decompress-1.2.0.tgz#8eeb65a5e015f8ed8532cafe28454960626f0dc7" - dependencies: - archive-type "^3.0.0" - decompress "^3.0.0" - gulp-util "^3.0.1" - readable-stream "^2.0.2" - -gulp-htmlmin@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/gulp-htmlmin/-/gulp-htmlmin-4.0.0.tgz#266feaed83588838aedda3666f67d057ec120313" - dependencies: - bufferstreams "^1.1.0" - html-minifier "^3.0.3" - plugin-error "^0.1.2" - readable-stream "^2.0.2" - tryit "^1.0.1" - -gulp-imagemin@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/gulp-imagemin/-/gulp-imagemin-4.1.0.tgz#5ce347f1d1706fed3cc8f1777ca9094a583b50b7" - dependencies: - chalk "^2.1.0" - fancy-log "^1.3.2" - imagemin "^5.3.1" - plugin-error "^0.1.2" - plur "^2.1.2" - pretty-bytes "^4.0.2" - through2-concurrent "^1.1.1" - optionalDependencies: - imagemin-gifsicle "^5.2.0" - imagemin-jpegtran "^5.0.2" - imagemin-optipng "^5.2.1" - imagemin-svgo "^6.0.0" - -gulp-mocha@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/gulp-mocha/-/gulp-mocha-6.0.0.tgz#80f32bc705ce30747f355ddb8ccd96a1c73bef13" - dependencies: - dargs "^5.1.0" - execa "^0.10.0" - mocha "^5.2.0" - npm-run-path "^2.0.2" - plugin-error "^1.0.1" - supports-color "^5.4.0" - through2 "^2.0.3" - -gulp-pug@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/gulp-pug/-/gulp-pug-4.0.1.tgz#5c5bb38303a5a565add8b200e292b4a076cf2efa" - dependencies: - "@types/pug" "^2.0.4" - fancy-log "^1.3.2" - plugin-error "^1.0.1" - pug "^2.0.3" - replace-ext "^1.0.0" - through2 "^2.0.3" - -gulp-rename@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.3.tgz#37b75298e9d3e6c0fe9ac4eac13ce3be5434646b" - -gulp-rename@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.3.0.tgz#2e789d8f563ab0c924eeb62967576f37ff4cb826" - -gulp-replace@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulp-replace/-/gulp-replace-1.0.0.tgz#b32bd61654d97b8d78430a67b3e8ce067b7c9143" - dependencies: - istextorbinary "2.2.1" - readable-stream "^2.0.1" - replacestream "^4.0.0" - -gulp-sourcemaps@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c" - dependencies: - convert-source-map "^1.1.1" - graceful-fs "^4.1.2" - strip-bom "^2.0.0" - through2 "^2.0.0" - vinyl "^1.0.0" - -gulp-sourcemaps@2.6.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.6.4.tgz#cbb2008450b1bcce6cd23bf98337be751bf6e30a" - dependencies: - "@gulp-sourcemaps/identity-map" "1.X" - "@gulp-sourcemaps/map-sources" "1.X" - acorn "5.X" - convert-source-map "1.X" - css "2.X" - debug-fabulous "1.X" - detect-newline "2.X" - graceful-fs "4.X" - source-map "~0.6.0" - strip-bom-string "1.X" - through2 "2.X" - -gulp-stylus@2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/gulp-stylus/-/gulp-stylus-2.7.0.tgz#f3e932626004927b75ea27ff5c1d3b0ba0b7cbb1" - dependencies: - accord "^0.26.3" - lodash.assign "^3.2.0" - plugin-error "^0.1.2" - replace-ext "0.0.1" - stylus "^0.54.0" - through2 "^2.0.0" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-tslint@8.1.3: - version "8.1.3" - resolved "https://registry.yarnpkg.com/gulp-tslint/-/gulp-tslint-8.1.3.tgz#a89ed144038ae861ee7bfea9528272d126a93da1" - dependencies: - "@types/fancy-log" "1.3.0" - chalk "2.3.1" - fancy-log "1.3.2" - map-stream "~0.0.7" - plugin-error "1.0.1" - through "~2.3.8" - -gulp-typescript@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/gulp-typescript/-/gulp-typescript-4.0.2.tgz#80bb9e376e7aa87b763a6ad5fe054a5d078da1e6" - dependencies: - ansi-colors "^1.0.1" - plugin-error "^0.1.2" - source-map "^0.6.1" - through2 "^2.0.3" - vinyl "^2.1.0" - vinyl-fs "^3.0.0" - -gulp-uglify@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.0.tgz#0df0331d72a0d302e3e37e109485dddf33c6d1ca" - dependencies: - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash "^4.13.1" - make-error-cause "^1.1.1" - through2 "^2.0.0" - uglify-js "^3.0.5" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-util@3.0.8, gulp-util@^3.0.0, gulp-util@^3.0.1: - version "3.0.8" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" - dependencies: - array-differ "^1.0.0" - array-uniq "^1.0.2" - beeper "^1.0.0" - chalk "^1.0.0" - dateformat "^2.0.0" - fancy-log "^1.1.0" - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash._reescape "^3.0.0" - lodash._reevaluate "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.template "^3.0.0" - minimist "^1.1.0" - multipipe "^0.1.2" - object-assign "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl "^0.5.0" - -gulp@3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" - dependencies: - archy "^1.0.0" - chalk "^1.0.0" - deprecated "^0.0.1" - gulp-util "^3.0.0" - interpret "^1.0.0" - liftoff "^2.1.0" - minimist "^1.1.0" - orchestrator "^0.3.0" - pretty-hrtime "^1.0.0" - semver "^4.1.0" - tildify "^1.0.0" - v8flags "^2.0.2" - vinyl-fs "^0.3.0" - -gulplog@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" - dependencies: - glogg "^1.0.0" - -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - -har-validator@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" - dependencies: - chalk "^1.1.1" - commander "^2.9.0" - is-my-json-valid "^2.12.4" - pinkie-promise "^2.0.0" - -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - dependencies: - ajv "^5.1.0" - har-schema "^2.0.0" - -hard-source-webpack-plugin@0.6.10: - version "0.6.10" - resolved "https://registry.yarnpkg.com/hard-source-webpack-plugin/-/hard-source-webpack-plugin-0.6.10.tgz#bae18a97c12150d31fa9d5e40625c65b0b10034d" - dependencies: - lodash "^4.15.0" - mkdirp "^0.5.1" - node-object-hash "^1.2.0" - rimraf "^2.6.2" - tapable "^1.0.0-beta.5" - webpack-core "~0.6.0" - webpack-sources "^1.0.1" - write-json-file "^2.3.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - -has-color@~0.1.0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - -has-gulplog@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" - dependencies: - sparkles "^1.0.0" - -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - dependencies: - has-symbol-support-x "^1.4.1" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash-sum@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.4.tgz#8b50e1f35d51bd01e5ed9ece4dbe3549ccfa0a3c" - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.0" - -hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - -hawk@~6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" - dependencies: - boom "4.x.x" - cryptiles "3.x.x" - hoek "4.x.x" - sntp "2.x.x" - -he@1.1.1, he@1.1.x, he@^1.1.0, he@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - -highlight.js@9.12.0: - version "9.12.0" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e" - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - -hoek@4.x.x: - version "4.2.1" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" - -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -homedir-polyfill@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" - dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4: - version "2.6.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" - -html-comment-regex@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" - -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - dependencies: - whatwg-encoding "^1.0.1" - -html-entities@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" - -html-minifier@3.5.16, html-minifier@^3.0.3: - version "3.5.16" - resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.16.tgz#39f5aabaf78bdfc057fe67334226efd7f3851175" - dependencies: - camel-case "3.0.x" - clean-css "4.1.x" - commander "2.15.x" - he "1.1.x" - param-case "2.1.x" - relateurl "0.2.x" - uglify-js "3.3.x" - -htmlparser2@^3.9.1: - version "3.9.2" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" - dependencies: - domelementtype "^1.3.0" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^2.0.2" - -http-assert@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.3.0.tgz#a31a5cf88c873ecbb5796907d4d6f132e8c01e4a" - dependencies: - deep-equal "~1.0.1" - http-errors "~1.6.1" - -http-cache-semantics@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" - -http-errors@1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" - dependencies: - depd "1.1.1" - inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" - -http-errors@1.6.3, http-errors@^1.2.8, http-errors@^1.3.1, http-errors@^1.6.1, http-errors@~1.6.1, http-errors@~1.6.2, http-errors@~1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-signature@1.2.0, http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -http_ece@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/http_ece/-/http_ece-1.0.5.tgz#b60660faaf14215102d1493ea720dcd92b53372f" - dependencies: - urlsafe-base64 "~1.0.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - -https-proxy-agent@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" - dependencies: - agent-base "^4.1.0" - debug "^3.1.0" - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - dependencies: - ms "^2.0.0" - -humanize-number@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/humanize-number/-/humanize-number-0.0.2.tgz#11c0af6a471643633588588048f1799541489c18" - -iconv-lite@0.4.19: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" - -iconv-lite@0.4.23, iconv-lite@^0.4.17, iconv-lite@^0.4.19, iconv-lite@^0.4.4, iconv-lite@~0.4.13: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-replace-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" - -icss-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" - dependencies: - postcss "^6.0.1" - -ieee754@^1.1.4: - version "1.1.12" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - -ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - dependencies: - minimatch "^3.0.4" - -ignore@^3.3.3, ignore@^3.3.5: - version "3.3.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b" - -imagemin-gifsicle@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/imagemin-gifsicle/-/imagemin-gifsicle-5.2.0.tgz#3781524c457612ef04916af34241a2b42bfcb40a" - dependencies: - exec-buffer "^3.0.0" - gifsicle "^3.0.0" - is-gif "^1.0.0" - -imagemin-jpegtran@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/imagemin-jpegtran/-/imagemin-jpegtran-5.0.2.tgz#e6882263b8f7916fddb800640cf75d2e970d2ad6" - dependencies: - exec-buffer "^3.0.0" - is-jpg "^1.0.0" - jpegtran-bin "^3.0.0" - -imagemin-optipng@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz#d22da412c09f5ff00a4339960b98a88b1dbe8695" - dependencies: - exec-buffer "^3.0.0" - is-png "^1.0.0" - optipng-bin "^3.0.0" - -imagemin-svgo@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/imagemin-svgo/-/imagemin-svgo-6.0.0.tgz#2dd8c82946be42a8e2cbcae3c5bf007bc2b8b9e8" - dependencies: - buffer-from "^0.1.1" - is-svg "^2.0.0" - svgo "^1.0.0" - -imagemin@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/imagemin/-/imagemin-5.3.1.tgz#f19c2eee1e71ba6c6558c515f9fc96680189a6d4" - dependencies: - file-type "^4.1.0" - globby "^6.1.0" - make-dir "^1.0.0" - p-pipe "^1.1.0" - pify "^2.3.0" - replace-ext "^1.0.0" - -import-local@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" - dependencies: - pkg-dir "^2.0.0" - resolve-cwd "^2.0.0" - -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" - dependencies: - repeating "^2.0.0" - -indent-string@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - -indx@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/indx/-/indx-0.2.3.tgz#15dcf56ee9cf65c0234c513c27fbd580e70fbc50" - -inflation@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" - -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - -ini@^1.3.4, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - -inquirer@3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347" - dependencies: - ansi-escapes "^1.1.0" - chalk "^1.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.1" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx "^4.1.0" - string-width "^2.0.0" - strip-ansi "^3.0.0" - through "^2.3.6" - -inquirer@5.2.0, inquirer@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726" - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.1.0" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^5.5.2" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -inquirer@^3.0.6: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -interpret@^1.0.0, interpret@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" - -into-stream@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" - dependencies: - from2 "^2.1.1" - p-is-promise "^1.1.0" - -invariant@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - -ip-regex@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" - -ipaddr.js@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b" - -irregular-plurals@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.4.0.tgz#2ca9b033651111855412f16be5d77c62a458a766" - -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - -is-absolute@^0.1.5: - version "0.1.7" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f" - dependencies: - is-relative "^0.1.0" - -is-absolute@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" - dependencies: - is-relative "^1.0.0" - is-windows "^1.0.1" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - dependencies: - kind-of "^6.0.0" - -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" - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - -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-bzip2@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-bzip2/-/is-bzip2-1.0.0.tgz#5ee58eaa5a2e9c80e21407bedf23ae5ac091b3fc" - -is-callable@^1.1.1, is-callable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - dependencies: - is-primitive "^2.0.0" - -is-expression@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz#39acaa6be7fd1f3471dc42c7416e61c24317ac9f" - dependencies: - acorn "~4.0.2" - object-assign "^4.0.1" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - 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-generator-function@^1.0.3: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" - -is-gif@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-gif/-/is-gif-1.0.0.tgz#a6d2ae98893007bffa97a1d8c01d63205832097e" - -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" - dependencies: - is-extglob "^1.0.0" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" - dependencies: - is-extglob "^2.1.1" - -is-gzip@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" - -is-jpg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-1.0.1.tgz#296d57fdd99ce010434a7283e346ab9a1035e975" - -is-my-ip-valid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" - -is-my-json-valid@^2.12.4: - version "2.17.2" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz#6b2103a288e94ef3de5cf15d29dd85fc4b78d65c" - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - is-my-ip-valid "^1.0.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" - -is-natural-number@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-2.1.1.tgz#7d4c5728377ef386c3e194a9911bf57c6dc335e7" - -is-negated-glob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" - -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-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - -is-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" - -is-observable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" - dependencies: - symbol-observable "^1.1.0" - -is-odd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" - dependencies: - is-number "^4.0.0" - -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.1" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - dependencies: - path-is-inside "^1.0.1" - -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - dependencies: - isobject "^3.0.1" - -is-png@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-png/-/is-png-1.1.0.tgz#d574b12bf275c0350455570b0e5b57ab062077ce" - -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" - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - -is-promise@^2.0.0, is-promise@^2.1, is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - -is-regex@^1.0.3, is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - dependencies: - has "^1.0.1" - -is-relative@^0.1.0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82" - -is-relative@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" - dependencies: - is-unc-path "^1.0.0" - -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - -is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" - -is-root@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.0.0.tgz#838d1e82318144e5a6f77819d90207645acc7019" - -is-scoped@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-scoped/-/is-scoped-1.0.0.tgz#449ca98299e713038256289ecb2b540dc437cb30" - dependencies: - scoped-regex "^1.0.0" - -is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - -is-svg@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" - dependencies: - html-comment-regex "^1.1.0" - -is-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" - -is-tar@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-tar/-/is-tar-1.0.0.tgz#2f6b2e1792c1f5bb36519acaa9d65c0d26fe853d" - -is-there@^4.0.0: - version "4.4.3" - resolved "https://registry.yarnpkg.com/is-there/-/is-there-4.4.3.tgz#a2c49366c6a487f719dbcad80cbde21248d2c18d" - -is-typedarray@^1.0.0, is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - -is-unc-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" - dependencies: - unc-path-regex "^0.1.2" - -is-url@1.2.4, is-url@^1.2.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" - -is-utf8@^0.2.0, is-utf8@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - -is-valid-glob@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" - -is-valid-glob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" - -is-whitespace@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f" - -is-windows@^1.0.1, is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - -is-zip@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-zip/-/is-zip-1.0.0.tgz#47b0a8ff4d38a76431ccfd99a8e15a4c86ba2325" - -is2@0.0.9: - version "0.0.9" - resolved "https://registry.yarnpkg.com/is2/-/is2-0.0.9.tgz#119556d1d1651a41ba105af803267c80b299f629" - dependencies: - deep-is "0.1.2" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - -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" - -isarray@^2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7" - -isbinaryfile@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - -istextorbinary@2.2.1, istextorbinary@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.2.1.tgz#a5231a08ef6dd22b268d0895084cf8d58b5bec53" - dependencies: - binaryextensions "2" - editions "^1.3.3" - textextensions "2" - -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - -jpegtran-bin@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz#f60ecf4ae999c0bdad2e9fbcdf2b6f0981e7a29b" - dependencies: - bin-build "^2.0.0" - bin-wrapper "^3.0.0" - logalot "^2.0.0" - -js-base64@^2.1.8, js-base64@^2.1.9: - version "2.4.5" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.5.tgz#e293cd3c7c82f070d700fc7a1ca0a2e69f101f92" - -js-beautify@^1.6.12: - version "1.7.5" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.7.5.tgz#69d9651ef60dbb649f65527b53674950138a7919" - dependencies: - config-chain "~1.1.5" - editorconfig "^0.13.2" - mkdirp "~0.5.0" - nopt "~3.0.1" - -js-stringify@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" - -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - -js-yaml@3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^3.4.6, js-yaml@^3.7.0, js-yaml@^3.8.4, js-yaml@^3.9.1: - version "3.12.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@~3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" - dependencies: - argparse "^1.0.7" - esprima "^2.6.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - -jschardet@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.6.0.tgz#c7d1a71edcff2839db2f9ec30fc5d5ebd3c1a678" - -jscodeshift@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.4.1.tgz#da91a1c2eccfa03a3387a21d39948e251ced444a" - dependencies: - async "^1.5.0" - babel-plugin-transform-flow-strip-types "^6.8.0" - babel-preset-es2015 "^6.9.0" - babel-preset-stage-1 "^6.5.0" - babel-register "^6.9.0" - babylon "^6.17.3" - colors "^1.1.2" - flow-parser "^0.*" - lodash "^4.13.1" - micromatch "^2.3.7" - node-dir "0.1.8" - nomnom "^1.8.1" - recast "^0.12.5" - temp "^0.8.1" - write-file-atomic "^1.2.0" - -jscodeshift@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.5.1.tgz#4af6a721648be8638ae1464a190342da52960c33" - dependencies: - babel-plugin-transform-flow-strip-types "^6.8.0" - babel-preset-es2015 "^6.9.0" - babel-preset-stage-1 "^6.5.0" - babel-register "^6.9.0" - babylon "^7.0.0-beta.47" - colors "^1.1.2" - flow-parser "^0.*" - lodash "^4.13.1" - micromatch "^2.3.7" - neo-async "^2.5.0" - node-dir "0.1.8" - nomnom "^1.8.1" - recast "^0.15.0" - temp "^0.8.1" - write-file-atomic "^1.2.0" - -jsdom@11.11.0: - version "11.11.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.11.0.tgz#df486efad41aee96c59ad7a190e2449c7eb1110e" - dependencies: - abab "^1.0.4" - acorn "^5.3.0" - acorn-globals "^4.1.0" - array-equal "^1.0.0" - cssom ">= 0.3.2 < 0.4.0" - cssstyle ">= 0.3.1 < 0.4.0" - data-urls "^1.0.0" - domexception "^1.0.0" - escodegen "^1.9.0" - html-encoding-sniffer "^1.0.2" - left-pad "^1.2.0" - nwsapi "^2.0.0" - parse5 "4.0.0" - pn "^1.1.0" - request "^2.83.0" - request-promise-native "^1.0.5" - sax "^1.2.4" - symbol-tree "^3.2.2" - tough-cookie "^2.3.3" - w3c-hr-time "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.3" - whatwg-mimetype "^2.1.0" - whatwg-url "^6.4.1" - ws "^4.0.0" - xml-name-validator "^3.0.0" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - -json-schema-ref-parser@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-1.4.1.tgz#c0c2e438bf0796723b02451bae8bc7dd0b37fed0" - dependencies: - call-me-maybe "^1.0.1" - debug "^2.2.0" - es6-promise "^3.0.2" - js-yaml "^3.4.6" - ono "^2.0.1" - -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - -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-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - -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: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -json5@0.5.1, json5@^0.5.0, json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - optionalDependencies: - graceful-fs "^4.1.6" - -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.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -jstransformer@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" - dependencies: - is-promise "^2.0.0" - promise "^7.0.1" - -jwa@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.6.tgz#87240e76c9808dbde18783cf2264ef4929ee50e6" - dependencies: - buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.10" - safe-buffer "^5.0.1" - -jws@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.5.tgz#80d12d05b293d1e841e7cb8b4e69e561adcf834f" - dependencies: - jwa "^1.1.5" - safe-buffer "^5.0.1" - -keygrip@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.2.tgz#ad3297c557069dea8bcfe7a4fa491b75c5ddeb91" - -keyv@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" - dependencies: - json-buffer "3.0.0" - -kind-of@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - -koa-bodyparser@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-4.2.1.tgz#4d7dacb5e6db1106649b595d9e5ccb158b6f3b29" - dependencies: - co-body "^6.0.0" - copy-to "^2.0.1" - -koa-compose@^3.0.0, koa-compose@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" - dependencies: - any-promise "^1.1.0" - -koa-compose@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" - -koa-compress@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/koa-compress/-/koa-compress-3.0.0.tgz#3194059c215cbc24e59bbc84c2c7453a4c88564f" - dependencies: - bytes "^3.0.0" - compressible "^2.0.0" - koa-is-json "^1.0.0" - statuses "^1.0.0" - -koa-convert@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0" - dependencies: - co "^4.6.0" - koa-compose "^3.0.0" - -koa-favicon@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/koa-favicon/-/koa-favicon-2.0.1.tgz#cfae363e5fd00bd5dd67c1150fbef31e0b5d6f4d" - dependencies: - mz "^2.7.0" - -koa-is-json@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/koa-is-json/-/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14" - -koa-json-body@5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/koa-json-body/-/koa-json-body-5.3.0.tgz#64aad3f400adfb81df54b63f7a5eb38bad62d980" - dependencies: - co-body "^5.0.0" - -koa-logger@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/koa-logger/-/koa-logger-3.2.0.tgz#8aef64d8b848fb6253a9b31aa708d0e05141f0e6" - dependencies: - bytes "^2.5.0" - chalk "^1.1.3" - humanize-number "0.0.2" - passthrough-counter "^1.0.0" - -koa-mount@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/koa-mount/-/koa-mount-3.0.0.tgz#08cab3b83d31442ed8b7e75c54b1abeb922ec197" - dependencies: - debug "^2.6.1" - koa-compose "^3.2.1" - -koa-multer@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/koa-multer/-/koa-multer-1.0.2.tgz#d38f7ffd1db97b1aad33e7774732f000ebd67259" - dependencies: - multer "1.3.0" - -koa-router@7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/koa-router/-/koa-router-7.4.0.tgz#aee1f7adc02d5cb31d7d67465c9eacc825e8c5e0" - dependencies: - debug "^3.1.0" - http-errors "^1.3.1" - koa-compose "^3.0.0" - methods "^1.0.1" - path-to-regexp "^1.1.1" - urijs "^1.19.0" - -koa-send@4.1.3, koa-send@^4.0.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/koa-send/-/koa-send-4.1.3.tgz#0822207bbf5253a414c8f1765ebc29fa41353cb6" - dependencies: - debug "^2.6.3" - http-errors "^1.6.1" - mz "^2.6.0" - resolve-path "^1.4.0" - -koa-slow@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/koa-slow/-/koa-slow-2.1.0.tgz#39007ca628c620f2b307b90dbf423d7a0c9be971" - dependencies: - lodash.isregexp "3.0.5" - q "1.4.1" - -koa-views@6.1.4: - version "6.1.4" - resolved "https://registry.yarnpkg.com/koa-views/-/koa-views-6.1.4.tgz#595eb683ca17d8dfaa1d100b42ba4e34c762154d" - dependencies: - consolidate "^0.15.0" - debug "^3.1.0" - get-paths "^0.0.2" - koa-send "^4.0.0" - mz "^2.4.0" - pretty "^2.0.0" - -koa@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/koa/-/koa-2.5.1.tgz#79f8b95f8d72d04fe9a58a8da5ebd6d341103f9c" - dependencies: - accepts "^1.2.2" - content-disposition "~0.5.0" - content-type "^1.0.0" - cookies "~0.7.0" - debug "*" - delegates "^1.0.0" - depd "^1.1.0" - destroy "^1.0.3" - error-inject "~1.0.0" - escape-html "~1.0.1" - fresh "^0.5.2" - http-assert "^1.1.0" - http-errors "^1.2.8" - is-generator-function "^1.0.3" - koa-compose "^4.0.0" - koa-convert "^1.2.0" - koa-is-json "^1.0.0" - mime-types "^2.0.7" - on-finished "^2.1.0" - only "0.0.2" - parseurl "^1.3.0" - statuses "^1.2.0" - type-is "^1.5.5" - vary "^1.0.0" - -kue@0.11.6: - version "0.11.6" - resolved "https://registry.yarnpkg.com/kue/-/kue-0.11.6.tgz#5b76916bcedd56636a107861471c63c94611860a" - dependencies: - body-parser "^1.12.2" - express "^4.12.2" - lodash "^4.0.0" - nib "~1.1.2" - node-redis-warlock "~0.2.0" - pug "^2.0.0-beta3" - redis "~2.6.0-2" - stylus "~0.54.5" - yargs "^4.0.0" - optionalDependencies: - reds "^0.2.5" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - -lazy-req@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac" - -lazystream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" - dependencies: - readable-stream "^2.0.5" - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - dependencies: - invert-kv "^1.0.0" - -lead@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" - dependencies: - flush-write-stream "^1.0.2" - -leb@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/leb/-/leb-0.3.0.tgz#32bee9fad168328d6aea8522d833f4180eed1da3" - -left-pad@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - -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" - -license-checker@20.0.0: - version "20.0.0" - resolved "https://registry.yarnpkg.com/license-checker/-/license-checker-20.0.0.tgz#29b338ba7f4e841b850cc59ddd393dbc8927f375" - dependencies: - chalk "^2.4.1" - debug "^3.1.0" - mkdirp "^0.5.1" - nopt "^4.0.1" - read-installed "~4.0.3" - semver "^5.5.0" - spdx "^0.5.1" - spdx-correct "^3.0.0" - spdx-satisfies "^4.0.0" - strip-ansi "^4.0.0" - treeify "^1.1.0" - -liftoff@^2.1.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" - dependencies: - extend "^3.0.0" - findup-sync "^2.0.0" - fined "^1.0.1" - flagged-respawn "^1.0.0" - is-plain-object "^2.0.4" - object.map "^1.0.0" - rechoir "^0.6.2" - resolve "^1.1.7" - -listr-silent-renderer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" - -listr-update-renderer@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz#344d980da2ca2e8b145ba305908f32ae3f4cc8a7" - dependencies: - chalk "^1.1.3" - cli-truncate "^0.2.1" - elegant-spinner "^1.0.1" - figures "^1.7.0" - indent-string "^3.0.0" - log-symbols "^1.0.2" - log-update "^1.0.2" - strip-ansi "^3.0.1" - -listr-verbose-renderer@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35" - dependencies: - chalk "^1.1.3" - cli-cursor "^1.0.2" - date-fns "^1.27.2" - figures "^1.7.0" - -listr@^0.14.1: - version "0.14.1" - resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.1.tgz#8a7afa4a7135cee4c921d128e0b7dfc6e522d43d" - dependencies: - "@samverschueren/stream-to-observable" "^0.3.0" - cli-truncate "^0.2.1" - figures "^1.7.0" - indent-string "^2.1.0" - is-observable "^1.1.0" - is-promise "^2.1.0" - is-stream "^1.1.0" - listr-silent-renderer "^1.1.1" - listr-update-renderer "^0.4.0" - listr-verbose-renderer "^0.4.0" - log-symbols "^1.0.2" - log-update "^1.0.2" - ora "^0.2.3" - p-map "^1.1.1" - rxjs "^6.1.0" - strip-ansi "^3.0.1" - -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" - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -loader-runner@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" - -loader-utils@1.1.0, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - -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._baseassign@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" - dependencies: - lodash._basecopy "^3.0.0" - lodash.keys "^3.0.0" - -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" - -lodash._basetostring@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" - -lodash._basevalues@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" - -lodash._bindcallback@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - -lodash._createassigner@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" - dependencies: - lodash._bindcallback "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash.restparam "^3.0.0" - -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - -lodash._reescape@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" - -lodash._reevaluate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - -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@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" - dependencies: - lodash._baseassign "^3.0.0" - lodash._createassigner "^3.0.0" - lodash.keys "^3.0.0" - -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.assignin@^4.0.9: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" - -lodash.bind@^4.1.4: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - -lodash.clone@^4.3.2: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" - -lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - -lodash.defaults@^4.0.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - -lodash.escape@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" - dependencies: - lodash._root "^3.0.0" - -lodash.filter@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" - -lodash.flatten@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - -lodash.foreach@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" - -lodash.get@^4.0.0, lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - -lodash.isequal@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - -lodash.isregexp@3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/lodash.isregexp/-/lodash.isregexp-3.0.5.tgz#e0f596242f2fa228a840086b6c8ad82e4b71fd2d" - -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - -lodash.map@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" - -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@^4.4.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" - -lodash.mergewith@^4.6.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" - -lodash.partialright@^4.1.4: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.partialright/-/lodash.partialright-4.2.1.tgz#0130d80e83363264d40074f329b8a3e7a8a1cc4b" - -lodash.pick@^4.2.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - -lodash.reduce@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" - -lodash.reject@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" - -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - -lodash.some@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - -lodash.startcase@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" - -lodash.tail@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" - -lodash.template@^3.0.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" - dependencies: - lodash._basecopy "^3.0.0" - lodash._basetostring "^3.0.0" - lodash._basevalues "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.keys "^3.0.0" - lodash.restparam "^3.0.0" - lodash.templatesettings "^3.0.0" - -lodash.templatesettings@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - -lodash.unescape@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" - -lodash.uniq@^4.3.0, lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - -lodash@^3.10.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - -lodash@^4.0.0, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.3.0, lodash@~4.17.10: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - -lodash@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" - -log-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - dependencies: - chalk "^1.0.0" - -log-symbols@^2.1.0, log-symbols@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - dependencies: - chalk "^2.0.1" - -log-update@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" - dependencies: - ansi-escapes "^1.0.0" - cli-cursor "^1.0.2" - -logalot@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/logalot/-/logalot-2.1.0.tgz#5f8e8c90d304edf12530951a5554abb8c5e3f552" - dependencies: - figures "^1.3.5" - squeak "^1.0.0" - -long@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" - -longest@^1.0.0, longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - -loose-envify@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" - 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" - -lower-case@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" - -lowercase-keys@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" - -lowercase-keys@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - -lpad-align@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/lpad-align/-/lpad-align-1.1.2.tgz#21f600ac1c3095c3c6e497ee67271ee08481fe9e" - dependencies: - get-stdin "^4.0.1" - indent-string "^2.1.0" - longest "^1.0.0" - meow "^3.3.0" - -lru-cache@2, lru-cache@^2.5.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - -lru-cache@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee" - dependencies: - pseudomap "^1.0.1" - -lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-queue@0.1: - version "0.1.0" - resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" - dependencies: - es5-ext "~0.10.2" - -make-dir@^1.0.0, make-dir@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - dependencies: - pify "^3.0.0" - -make-error-cause@^1.1.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d" - dependencies: - make-error "^1.2.0" - -make-error@^1.1.1, make-error@^1.2.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535" - -make-iterator@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" - dependencies: - kind-of "^6.0.2" - -map-cache@^0.2.0, map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - -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" - -map-stream@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8" - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - dependencies: - object-visit "^1.0.0" - -math-expression-evaluator@^1.2.14: - version "1.2.17" - resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" - -math-random@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" - -md5.js@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -mdn-data@^1.0.0, mdn-data@~1.1.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" - -mecab-async@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/mecab-async/-/mecab-async-0.1.2.tgz#69efb838729216709597a57da2df03922f9b593a" - dependencies: - shell-quote "*" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - -mem-fs-editor@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/mem-fs-editor/-/mem-fs-editor-4.0.2.tgz#55a79b1e824da631254c4c95ba6366602c77af90" - dependencies: - commondir "^1.0.1" - deep-extend "^0.5.1" - ejs "^2.5.9" - glob "^7.0.3" - globby "^8.0.0" - isbinaryfile "^3.0.2" - mkdirp "^0.5.0" - multimatch "^2.0.0" - rimraf "^2.2.8" - through2 "^2.0.0" - vinyl "^2.0.1" - -mem-fs@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/mem-fs/-/mem-fs-1.1.3.tgz#b8ae8d2e3fcb6f5d3f9165c12d4551a065d989cc" - dependencies: - through2 "^2.0.0" - vinyl "^1.1.0" - vinyl-file "^2.0.0" - -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - dependencies: - mimic-fn "^1.0.0" - -memoizee@0.4.X: - version "0.4.12" - resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.12.tgz#780e99a219c50c549be6d0fc61765080975c58fb" - dependencies: - d "1" - es5-ext "^0.10.30" - es6-weak-map "^2.0.2" - event-emitter "^0.3.5" - is-promise "^2.1" - lru-queue "0.1" - next-tick "1" - timers-ext "^0.1.2" - -memory-fs@^0.4.0, memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -meow@^3.1.0, meow@^3.3.0, meow@^3.5.0, 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" - -merge-source-map@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" - dependencies: - source-map "^0.6.1" - -merge-stream@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - dependencies: - readable-stream "^2.0.1" - -merge2@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.2.tgz#03212e3da8d86c4d8523cebd6318193414f94e34" - -methods@^1.0.1, methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - -micromatch@^2.1.5, micromatch@^2.3.7: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -"mime-db@>= 1.34.0 < 2": - version "1.34.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.34.0.tgz#452d0ecff5c30346a6dc1e64b1eaee0d3719ff9a" - -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" - -mime-types@^2.0.7, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7: - version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" - dependencies: - mime-db "~1.33.0" - -mime@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" - -mime@^2.0.3: - version "2.3.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - -mimic-response@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e" - -minimalistic-assert@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - -"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - -minimatch@^2.0.1: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - dependencies: - brace-expansion "^1.0.0" - -minimatch@~0.2.11: - version "0.2.14" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" - dependencies: - lru-cache "2" - sigmund "~1.0.0" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -minimist@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" - -minipass@^2.2.1, minipass@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" - dependencies: - minipass "^2.2.1" - -mississippi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^2.0.1" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mixin-object@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" - dependencies: - for-in "^0.1.3" - is-extendable "^0.1.1" - -mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -mocha@5.2.0, mocha@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" - dependencies: - browser-stdout "1.3.1" - commander "2.15.1" - debug "3.1.0" - diff "3.5.0" - escape-string-regexp "1.0.5" - glob "7.1.2" - growl "1.10.5" - he "1.1.1" - minimatch "3.0.4" - mkdirp "0.5.1" - supports-color "5.4.0" - -moji@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/moji/-/moji-0.5.1.tgz#088eecd1c22c8f31a240adcf9c95e54f33eb54fb" - dependencies: - object-assign "^3.0.0" - -mongodb-core@2.1.19: - version "2.1.19" - resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.1.19.tgz#00fbd5e5a3573763b9171cfd844e60a8f2a3a18b" - dependencies: - bson "~1.0.4" - require_optional "~1.0.0" - -mongodb-core@3.0.9: - version "3.0.9" - resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-3.0.9.tgz#8327410c88811013fb3e4ac7c4c670f324349be1" - dependencies: - bson "~1.0.4" - require_optional "^1.0.1" - -mongodb@3.0.10: - version "3.0.10" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.0.10.tgz#f948cb9595adcbfcad7444f6b24a040b653b23e8" - dependencies: - mongodb-core "3.0.9" - -mongodb@^2.1.18: - version "2.2.35" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.2.35.tgz#cd1b5af8a9463e3f9a787fa5b3d05565579730f9" - dependencies: - es6-promise "3.2.1" - mongodb-core "2.1.19" - readable-stream "2.2.7" - -monk-middleware-cast-ids@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/monk-middleware-cast-ids/-/monk-middleware-cast-ids-0.2.1.tgz#40c40e5a6cb33ccedc289220943275ee8861c529" - -monk-middleware-fields@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/monk-middleware-fields/-/monk-middleware-fields-0.2.0.tgz#ff637af35f5948879ccb2be15a91360911bea6c1" - -monk-middleware-handle-callback@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/monk-middleware-handle-callback/-/monk-middleware-handle-callback-0.2.2.tgz#47de6cc1248726c72a2be0c81bc4e68310c32146" - -monk-middleware-options@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/monk-middleware-options/-/monk-middleware-options-0.2.1.tgz#58dae1c518d46636ebdff506fadfc773bb442886" - -monk-middleware-query@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/monk-middleware-query/-/monk-middleware-query-0.2.0.tgz#a926c677d4a5620c62151b0a56d0c0c151675874" - -monk-middleware-wait-for-connection@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/monk-middleware-wait-for-connection/-/monk-middleware-wait-for-connection-0.2.0.tgz#312958d30e588b57d09754dd7c97b4843316835a" - -monk@6.0.6: - version "6.0.6" - resolved "https://registry.yarnpkg.com/monk/-/monk-6.0.6.tgz#2ff1cd57f001bba0fea73d1eea3952a7d35450c5" - dependencies: - debug "*" - mongodb "^2.1.18" - monk-middleware-cast-ids "^0.2.1" - monk-middleware-fields "^0.2.0" - monk-middleware-handle-callback "^0.2.0" - monk-middleware-options "^0.2.1" - monk-middleware-query "^0.2.0" - monk-middleware-wait-for-connection "^0.2.0" - object-assign "^4.1.1" - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -ms@2.1.1, ms@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - -multer@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/multer/-/multer-1.3.0.tgz#092b2670f6846fa4914965efc8cf94c20fec6cd2" - dependencies: - append-field "^0.1.0" - busboy "^0.2.11" - concat-stream "^1.5.0" - mkdirp "^0.5.1" - object-assign "^3.0.0" - on-finished "^2.3.0" - type-is "^1.6.4" - xtend "^4.0.0" - -multimatch@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" - dependencies: - array-differ "^1.0.0" - array-union "^1.0.1" - arrify "^1.0.0" - minimatch "^3.0.0" - -multipipe@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" - dependencies: - duplexer2 "0.0.2" - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - -mz@^2.4.0, mz@^2.6.0, mz@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nan@2.10.0, nan@^2.10.0, nan@^2.3.3, nan@^2.5.0, nan@^2.9.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" - -nanomatch@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-odd "^2.0.0" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natives@^1.1.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.4.tgz#2f0f224fc9a7dd53407c7667c84cf8dbe773de58" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - -natural@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/natural/-/natural-0.2.1.tgz#1eb5156a9d90b4591949e20e94ebc77bb2339eda" - dependencies: - apparatus ">= 0.0.9" - sylvester ">= 0.0.12" - underscore ">=1.3.1" - -needle@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" - dependencies: - debug "^2.1.2" - iconv-lite "^0.4.4" - sax "^1.2.4" - -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" - -neo-async@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" - -next-tick@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - -nib@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/nib/-/nib-1.1.2.tgz#6a69ede4081b95c0def8be024a4c8ae0c2cbb6c7" - dependencies: - stylus "0.54.5" - -nice-try@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" - -no-case@^2.2.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" - dependencies: - lower-case "^1.1.1" - -node-dir@0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.8.tgz#55fb8deb699070707fb67f91a460f0448294c77d" - -node-fetch@1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-gyp@^3.3.1: - version "3.7.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.7.0.tgz#789478e8f6c45e277aa014f3e28f958f286f9203" - dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - osenv "0" - request ">=2.9.0 <2.82.0" - rimraf "2" - semver "~5.3.0" - tar "^2.0.0" - which "1" - -node-libs-browser@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^1.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.0" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.10.3" - vm-browserify "0.0.4" - -node-object-hash@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/node-object-hash/-/node-object-hash-1.4.1.tgz#de968492e20c493b8bbc25ad2ee828265fd60934" - -node-pre-gyp@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46" - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.0" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.1.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -node-redis-scripty@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/node-redis-scripty/-/node-redis-scripty-0.0.5.tgz#4bf2d365ab6dab202cc08b7ac63f8f55aadc9625" - dependencies: - extend "^1.2.1" - lru-cache "^2.5.0" - -node-redis-warlock@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/node-redis-warlock/-/node-redis-warlock-0.2.0.tgz#56395b994c828e8e32f6aae53b93b6edfcd97990" - dependencies: - node-redis-scripty "0.0.5" - uuid "^2.0.1" - -node-sass-json-importer@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/node-sass-json-importer/-/node-sass-json-importer-3.2.0.tgz#9cfe2355035d5437b7c2ecb535450bf6acde8195" - dependencies: - is-there "^4.0.0" - json5 "0.5.1" - lodash "^3.10.1" - -node-sass@4.9.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.0.tgz#d1b8aa855d98ed684d6848db929a20771cc2ae52" - 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" - lodash.mergewith "^4.6.0" - meow "^3.7.0" - mkdirp "^0.5.1" - nan "^2.10.0" - node-gyp "^3.3.1" - npmlog "^4.0.0" - request "~2.79.0" - sass-graph "^2.2.4" - stdout-stream "^1.4.0" - "true-case-path" "^1.0.2" - -node-status-codes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" - -nomnom@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7" - dependencies: - chalk "~0.4.0" - underscore "~1.6.0" - -"nopt@2 || 3", nopt@~3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - dependencies: - abbrev "1" - -nopt@4.0.1, nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - 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.0, normalize-path@^2.0.1, normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - -normalize-url@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" - dependencies: - prepend-http "^2.0.0" - query-string "^5.0.1" - sort-keys "^2.0.0" - -normalize-url@^1.4.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -normalize-wheel@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz#aec886affdb045070d856447df62ecf86146ec45" - -now-and-later@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.0.tgz#bc61cbb456d79cb32207ce47ca05136ff2e7d6ee" - dependencies: - once "^1.3.2" - -npm-bundled@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" - -npm-packlist@^1.1.6: - version "1.1.10" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-run-path@^2.0.0, npm-run-path@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - dependencies: - path-key "^2.0.0" - -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -nprogress@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" - -nth-check@^1.0.1, nth-check@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" - dependencies: - boolbase "~1.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -nwsapi@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.3.tgz#3f4010d6c943f34018d3dfb5f2fbc0de90476959" - -oauth-sign@~0.8.1, oauth-sign@~0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - -oauth@0.9.15: - version "0.9.15" - resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" - -object-assign-deep@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/object-assign-deep/-/object-assign-deep-0.4.0.tgz#43505d3679abb9686ab359b97ac14cc837a9d143" - -object-assign@4.X, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -object-assign@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" - -object-assign@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-keys@^1.0.11, object-keys@^1.0.8: - version "1.0.11" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - dependencies: - isobject "^3.0.0" - -object.assign@^4.0.1, object.assign@^4.0.4: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.defaults@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" - dependencies: - array-each "^1.0.1" - array-slice "^1.0.0" - for-own "^1.0.0" - isobject "^3.0.0" - -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" - -object.map@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" - dependencies: - for-own "^1.0.0" - make-iterator "^1.0.0" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -object.pick@^1.2.0, object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - dependencies: - isobject "^3.0.1" - -object.values@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.6.1" - function-bind "^1.1.0" - has "^1.0.1" - -on-build-webpack@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/on-build-webpack/-/on-build-webpack-0.1.0.tgz#a287c0e17766e6141926e5f2cbb0d8bb53b76814" - -on-finished@^2.1.0, on-finished@^2.3.0, on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - dependencies: - ee-first "1.1.1" - -once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -once@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - dependencies: - wrappy "1" - -onetime@^1.0.0: - version "1.1.0" - resolved "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - dependencies: - mimic-fn "^1.0.0" - -only@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" - -ono@^2.0.1: - version "2.2.5" - resolved "https://registry.yarnpkg.com/ono/-/ono-2.2.5.tgz#daf09488b51174da7a7e4275dfab31b438ffa0e3" - -ono@^4.0.2: - version "4.0.5" - resolved "https://registry.yarnpkg.com/ono/-/ono-4.0.5.tgz#bc62740493a5c1c08b2c21e60cbb0e5c56ab7de2" - dependencies: - format-util "^1.0.3" - -opencollective@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1" - dependencies: - babel-polyfill "6.23.0" - chalk "1.1.3" - inquirer "3.0.6" - minimist "1.2.0" - node-fetch "1.6.3" - opn "4.0.2" - -opn@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" - dependencies: - object-assign "^4.0.1" - pinkie-promise "^2.0.0" - -optionator@^0.8.1, 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" - -optipng-bin@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-3.1.4.tgz#95d34f2c488704f6fd70606bfea0c659f1d95d84" - dependencies: - bin-build "^2.0.0" - bin-wrapper "^3.0.0" - logalot "^2.0.0" - -ora@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" - dependencies: - chalk "^1.1.1" - cli-cursor "^1.0.2" - cli-spinners "^0.1.2" - object-assign "^4.0.1" - -orchestrator@^0.3.0: - version "0.3.8" - resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" - dependencies: - end-of-stream "~0.1.5" - sequencify "~0.0.7" - stream-consume "~0.1.0" - -ordered-read-streams@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" - -ordered-read-streams@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" - dependencies: - is-stream "^1.0.1" - readable-stream "^2.0.1" - -ordered-read-streams@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" - dependencies: - readable-stream "^2.0.1" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - -os-filter-obj@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-1.0.3.tgz#5915330d90eced557d2d938a31c6dd214d9c63ad" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - dependencies: - lcid "^1.0.0" - -os-locale@^2.0.0, os-locale@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - -os-shim@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" - -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -os-utils@0.0.14: - version "0.0.14" - resolved "https://registry.yarnpkg.com/os-utils/-/os-utils-0.0.14.tgz#29e511697b1982b8c627722175fe39797ef64156" - -osenv@0, osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - -p-cancelable@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" - -p-each-series@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" - dependencies: - p-reduce "^1.0.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - -p-is-promise@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" - -p-lazy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-lazy/-/p-lazy-1.0.0.tgz#ec53c802f2ee3ac28f166cc82d0b2b02de27a835" - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - dependencies: - p-try "^1.0.0" - -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" - -p-map@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" - -p-pipe@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9" - -p-reduce@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" - -p-timeout@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" - dependencies: - p-finally "^1.0.0" - -p-timeout@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" - dependencies: - p-finally "^1.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - -pako@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" - -parallel-transform@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" - dependencies: - cyclist "~0.2.2" - inherits "^2.0.3" - readable-stream "^2.1.5" - -param-case@2.1.x: - version "2.1.1" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" - dependencies: - no-case "^2.2.0" - -parse-asn1@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" - dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - -parse-filepath@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" - dependencies: - is-absolute "^1.0.0" - map-cache "^0.2.0" - path-root "^0.1.1" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-json@^2.1.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" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - -parse5@*, parse5@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.0.0.tgz#4d02710d44f3c3846197a11e205d4ef17842b81a" - -parse5@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - -parseurl@^1.3.0, parseurl@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - -passthrough-counter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/passthrough-counter/-/passthrough-counter-1.0.0.tgz#1967d9e66da572b5c023c787db112a387ab166fa" - -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - 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.1, path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: - 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, path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - -path-root-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" - -path-root@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" - dependencies: - path-root-regex "^0.1.0" - -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-to-regexp@^1.1.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" - dependencies: - isarray "0.0.1" - -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" - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - dependencies: - pify "^2.0.0" - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - dependencies: - pify "^3.0.0" - -pbkdf2@^3.0.3: - version "3.0.16" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - -pify@^2.0.0, pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - dependencies: - find-up "^2.1.0" - -plugin-error@1.0.1, plugin-error@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" - dependencies: - ansi-colors "^1.0.1" - arr-diff "^4.0.0" - arr-union "^3.1.0" - extend-shallow "^3.0.2" - -plugin-error@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" - dependencies: - ansi-cyan "^0.1.1" - ansi-red "^0.1.1" - arr-diff "^1.0.1" - arr-union "^2.0.1" - extend-shallow "^1.1.2" - -plur@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" - dependencies: - irregular-plurals "^1.0.0" - -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - -pngjs@^3.3.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.3.tgz#85173703bde3edac8998757b96e5821d0966a21b" - -popper.js@^1.12.9: - version "1.14.3" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.3.tgz#1438f98d046acf7b4d78cd502bf418ac64d4f095" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - -postcss-calc@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" - dependencies: - postcss "^5.0.2" - postcss-message-helpers "^2.0.0" - reduce-css-calc "^1.2.6" - -postcss-colormin@^2.1.8: - version "2.2.2" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" - dependencies: - colormin "^1.0.5" - postcss "^5.0.13" - postcss-value-parser "^3.2.3" - -postcss-convert-values@^2.3.4: - version "2.6.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" - dependencies: - postcss "^5.0.11" - postcss-value-parser "^3.1.2" - -postcss-discard-comments@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" - dependencies: - postcss "^5.0.14" - -postcss-discard-duplicates@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" - dependencies: - postcss "^5.0.4" - -postcss-discard-empty@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" - dependencies: - postcss "^5.0.14" - -postcss-discard-overridden@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" - dependencies: - postcss "^5.0.16" - -postcss-discard-unused@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" - dependencies: - postcss "^5.0.14" - uniqs "^2.0.0" - -postcss-filter-plugins@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" - dependencies: - postcss "^5.0.4" - -postcss-merge-idents@^2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" - dependencies: - has "^1.0.1" - postcss "^5.0.10" - postcss-value-parser "^3.1.1" - -postcss-merge-longhand@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" - dependencies: - postcss "^5.0.4" - -postcss-merge-rules@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" - dependencies: - browserslist "^1.5.2" - caniuse-api "^1.5.2" - postcss "^5.0.4" - postcss-selector-parser "^2.2.2" - vendors "^1.0.0" - -postcss-message-helpers@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" - -postcss-minify-font-values@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" - dependencies: - object-assign "^4.0.1" - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-minify-gradients@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" - dependencies: - postcss "^5.0.12" - postcss-value-parser "^3.3.0" - -postcss-minify-params@^1.0.4: - version "1.2.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.2" - postcss-value-parser "^3.0.2" - uniqs "^2.0.0" - -postcss-minify-selectors@^2.0.4: - version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" - dependencies: - alphanum-sort "^1.0.2" - has "^1.0.1" - postcss "^5.0.14" - postcss-selector-parser "^2.0.0" - -postcss-modules-extract-imports@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" - dependencies: - postcss "^6.0.1" - -postcss-modules-local-by-default@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" - dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" - -postcss-modules-scope@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" - dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" - -postcss-modules-values@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" - dependencies: - icss-replace-symbols "^1.1.0" - postcss "^6.0.1" - -postcss-normalize-charset@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" - dependencies: - postcss "^5.0.5" - -postcss-normalize-url@^3.0.7: - version "3.0.8" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^1.4.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - -postcss-ordered-values@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.1" - -postcss-reduce-idents@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-reduce-initial@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" - dependencies: - postcss "^5.0.4" - -postcss-reduce-transforms@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" - dependencies: - has "^1.0.1" - postcss "^5.0.8" - postcss-value-parser "^3.0.1" - -postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" - dependencies: - dot-prop "^4.1.1" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-svgo@^2.1.1: - version "2.1.6" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" - dependencies: - is-svg "^2.0.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - svgo "^0.7.0" - -postcss-unique-selectors@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" - -postcss-zindex@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" - dependencies: - has "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: - version "5.2.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" - dependencies: - chalk "^1.1.3" - js-base64 "^2.1.9" - source-map "^0.5.6" - supports-color "^3.2.3" - -postcss@^6.0.1, postcss@^6.0.20: - version "6.0.22" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.22.tgz#e23b78314905c3b90cbd61702121e7a78848f2a3" - dependencies: - chalk "^2.4.1" - source-map "^0.6.1" - supports-color "^5.4.0" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - -prepend-http@^1.0.0, prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - -prettier@^1.12.1, prettier@^1.13.0: - version "1.13.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.5.tgz#7ae2076998c8edce79d63834e9b7b09fead6bfd0" - -pretty-bytes@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9" - -pretty-hrtime@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" - -pretty@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5" - dependencies: - condense-newlines "^0.2.1" - extend-shallow "^2.0.1" - js-beautify "^1.6.12" - -prettyjson@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prettyjson/-/prettyjson-1.2.1.tgz#fcffab41d19cab4dfae5e575e64246619b12d289" - dependencies: - colors "^1.1.2" - minimist "^1.2.0" - -printj@~1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" - -private@^0.1.6, private@^0.1.8, private@~0.1.5: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - -process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - -progress-bar-webpack-plugin@1.11.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/progress-bar-webpack-plugin/-/progress-bar-webpack-plugin-1.11.0.tgz#4f801288443c55ec029b20cbfdcbf3e1dc17f852" - dependencies: - chalk "^1.1.1" - object.assign "^4.0.1" - progress "^1.1.8" - -progress@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" - -progress@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" - -prominence@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/prominence/-/prominence-0.2.0.tgz#38704264981ddf65e5b00b0b5cfce6e53348f2b2" - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - -promise-sequential@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/promise-sequential/-/promise-sequential-1.1.1.tgz#f79e8950ef86e7a7a85bf320452643592f6d2fb2" - -promise@^7.0.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - dependencies: - asap "~2.0.3" - -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - -proxy-addr@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" - dependencies: - forwarded "~0.1.2" - ipaddr.js "1.6.0" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - -pseudomap@^1.0.1, pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - -psl@^1.1.24: - version "1.1.28" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" - -public-encrypt@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - -pug-attrs@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.3.tgz#a3095f970e64151f7bdad957eef55fb5d7905d15" - dependencies: - constantinople "^3.0.1" - js-stringify "^1.0.1" - pug-runtime "^2.0.4" - -pug-code-gen@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.1.tgz#0951ec83225d74d8cfc476a7f99a259b5f7d050c" - dependencies: - constantinople "^3.0.1" - doctypes "^1.1.0" - js-stringify "^1.0.1" - pug-attrs "^2.0.3" - pug-error "^1.3.2" - pug-runtime "^2.0.4" - void-elements "^2.0.1" - with "^5.0.0" - -pug-error@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.2.tgz#53ae7d9d29bb03cf564493a026109f54c47f5f26" - -pug-filters@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.0.tgz#27165555bc04c236e4aa2b0366246dfa021b626e" - dependencies: - clean-css "^4.1.11" - constantinople "^3.0.1" - jstransformer "1.0.0" - pug-error "^1.3.2" - pug-walk "^1.1.7" - resolve "^1.1.6" - uglify-js "^2.6.1" - -pug-lexer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.0.0.tgz#210c18457ef2e1760242740c5e647bd794cec278" - dependencies: - character-parser "^2.1.1" - is-expression "^3.0.0" - pug-error "^1.3.2" - -pug-linker@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.5.tgz#9e9a7ae4005682d027deeb96b000f88eeb83a02f" - dependencies: - pug-error "^1.3.2" - pug-walk "^1.1.7" - -pug-load@^2.0.11: - version "2.0.11" - resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.11.tgz#e648e57ed113fe2c1f45d57858ea2bad6bc01527" - dependencies: - object-assign "^4.1.0" - pug-walk "^1.1.7" - -pug-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.0.tgz#e394ad9b3fca93123940aff885c06e44ab7e68e4" - dependencies: - pug-error "^1.3.2" - token-stream "0.0.1" - -pug-runtime@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.4.tgz#e178e1bda68ab2e8c0acfc9bced2c54fd88ceb58" - -pug-strip-comments@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz#f1559592206edc6f85310dacf4afb48a025af59f" - dependencies: - pug-error "^1.3.2" - -pug-walk@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.7.tgz#c00d5c5128bac5806bec15d2b7e7cdabe42531f3" - -pug@2.0.3, pug@^2.0.0-beta3, pug@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.3.tgz#71cba82537c95a5eab7ed04696e4221f53aa878e" - dependencies: - pug-code-gen "^2.0.1" - pug-filters "^3.1.0" - pug-lexer "^4.0.0" - pug-linker "^3.0.5" - pug-load "^2.0.11" - pug-parser "^5.0.0" - pug-runtime "^2.0.4" - pug-strip-comments "^1.0.3" - -pump@^2.0.0, pump@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3, pumpify@^1.3.5: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - -punycode@2.1.1, punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - -punycode@^1.2.4, punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -q@0.9.7: - version "0.9.7" - resolved "https://registry.yarnpkg.com/q/-/q-0.9.7.tgz#4de2e6cb3b29088c9e4cbc03bf9d42fb96ce2f75" - -q@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" - -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - -qrcode@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.2.0.tgz#330d24313fbf8d429a806091af9525250239e44a" - dependencies: - can-promise "^0.0.1" - dijkstrajs "^1.0.1" - isarray "^2.0.1" - pngjs "^3.3.0" - yargs "^8.0.2" - -qs@6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" - -qs@6.5.2, qs@^6.4.0, qs@^6.5.2, qs@~6.5.1: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - -qs@~6.3.0: - version "6.3.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" - -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - -randomatic@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - -rangestr@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/rangestr/-/rangestr-0.0.1.tgz#f72ff9246f10f2a7d7c16e14616f617be2c2635a" - -ratelimiter@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ratelimiter/-/ratelimiter-3.0.3.tgz#6dbca58b05422f2a08e224d4ba3a0cfb86c30966" - -raw-body@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" - dependencies: - bytes "3.0.0" - http-errors "1.6.2" - iconv-lite "0.4.19" - unpipe "1.0.0" - -raw-body@2.3.3, raw-body@^2.2.0, raw-body@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" - dependencies: - bytes "3.0.0" - http-errors "1.6.3" - iconv-lite "0.4.23" - unpipe "1.0.0" - -rc@^1.1.2, rc@^1.1.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -read-all-stream@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" - dependencies: - pinkie-promise "^2.0.0" - readable-stream "^2.0.0" - -read-chunk@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-2.1.0.tgz#6a04c0928005ed9d42e1a6ac5600e19cbc7ff655" - dependencies: - pify "^3.0.0" - safe-buffer "^5.1.1" - -read-installed@~4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" - dependencies: - debuglog "^1.0.1" - read-package-json "^2.0.0" - readdir-scoped-modules "^1.0.0" - semver "2 || 3 || 4 || 5" - slide "~1.1.3" - util-extend "^1.0.1" - optionalDependencies: - graceful-fs "^4.1.2" - -read-package-json@^2.0.0: - version "2.0.13" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a" - dependencies: - glob "^7.1.1" - json-parse-better-errors "^1.0.1" - normalize-package-data "^2.0.0" - slash "^1.0.0" - optionalDependencies: - graceful-fs "^4.1.2" - -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-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - dependencies: - find-up "^2.0.0" - read-pkg "^3.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" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@1.1.x, readable-stream@~1.1.9: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@2.2.7: - version "2.2.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.7.tgz#07057acbe2467b22042d36f98c5ad507054e95b1" - 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" - -"readable-stream@>=1.0.33-1 <1.1.0-0": - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readdir-scoped-modules@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" - dependencies: - debuglog "^1.0.1" - dezalgo "^1.0.0" - graceful-fs "^4.1.2" - once "^1.3.0" - -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" - readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" - -recaptcha-promise@0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/recaptcha-promise/-/recaptcha-promise-0.1.3.tgz#7d3d66d045a53674054ebdfa1684e0609ef5d912" - dependencies: - bluebird "^3.4.1" - request "^2.73.0" - -recast@^0.12.5: - version "0.12.9" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.12.9.tgz#e8e52bdb9691af462ccbd7c15d5a5113647a15f1" - dependencies: - ast-types "0.10.1" - core-js "^2.4.1" - esprima "~4.0.0" - private "~0.1.5" - source-map "~0.6.1" - -recast@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.15.0.tgz#b8c8bfdda245e1580c0a4d9fc25d4e820bf57208" - dependencies: - ast-types "0.11.5" - esprima "~4.0.0" - private "~0.1.5" - source-map "~0.6.1" - -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" - -reconnecting-websocket@3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/reconnecting-websocket/-/reconnecting-websocket-3.2.2.tgz#8097514e926e9855e03c39e76efa2e3d1f371bee" - -recursive-iterator@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/recursive-iterator/-/recursive-iterator-2.0.3.tgz#d0e0d2c7e7a83109d73091cf043fc509e5a76dc3" - -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" - -redis-commands@^1.2.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.3.5.tgz#4495889414f1e886261180b1442e7295602d83a2" - -redis-parser@^2.0.0, redis-parser@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b" - -redis@2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/redis/-/redis-2.8.0.tgz#202288e3f58c49f6079d97af7a10e1303ae14b02" - dependencies: - double-ended-queue "^2.1.0-0" - redis-commands "^1.2.0" - redis-parser "^2.6.0" - -redis@^0.12.1: - version "0.12.1" - resolved "https://registry.yarnpkg.com/redis/-/redis-0.12.1.tgz#64df76ad0fc8acebaebd2a0645e8a48fac49185e" - -redis@~2.6.0-2: - version "2.6.5" - resolved "https://registry.yarnpkg.com/redis/-/redis-2.6.5.tgz#87c1eff4a489f94b70871f3d08b6988f23a95687" - dependencies: - double-ended-queue "^2.1.0-0" - redis-commands "^1.2.0" - redis-parser "^2.0.0" - -reds@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/reds/-/reds-0.2.5.tgz#38a767f7663cd749036848697d82c74fd29bc01f" - dependencies: - natural "^0.2.0" - redis "^0.12.1" - -reduce-css-calc@^1.2.6: - version "1.3.0" - resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" - dependencies: - balanced-match "^0.4.2" - math-expression-evaluator "^1.2.14" - reduce-function-call "^1.0.1" - -reduce-function-call@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" - dependencies: - balanced-match "^0.4.2" - -regenerate@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - -regenerator-runtime@^0.10.0: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - dependencies: - is-equal-shallow "^0.1.3" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpp@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" - -regexpu-core@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - dependencies: - jsesc "~0.5.0" - -relateurl@0.2.x: - version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - -remove-bom-buffer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" - dependencies: - is-buffer "^1.1.5" - is-utf8 "^0.2.1" - -remove-bom-stream@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523" - dependencies: - remove-bom-buffer "^3.0.0" - safe-buffer "^5.1.0" - through2 "^2.0.3" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^1.5.2, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -replace-ext@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" - -replace-ext@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" - -replacestream@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/replacestream/-/replacestream-4.0.3.tgz#3ee5798092be364b1cdb1484308492cb3dff2f36" - dependencies: - escape-string-regexp "^1.0.3" - object-assign "^4.0.1" - readable-stream "^2.0.2" - -request-promise-core@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" - dependencies: - lodash "^4.13.1" - -request-promise-native@1.0.5, request-promise-native@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" - dependencies: - request-promise-core "1.1.1" - stealthy-require "^1.1.0" - tough-cookie ">=2.3.3" - -request@2.85.0: - version "2.85.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - hawk "~6.0.2" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - stringstream "~0.0.5" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - -request@2.87.0, request@^2.73.0, request@^2.83.0: - version "2.87.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - -"request@>=2.9.0 <2.82.0": - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - -request@~2.79.0: - version "2.79.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.11.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~2.0.6" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - qs "~6.3.0" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "~0.4.1" - uuid "^3.0.0" - -require-all@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/require-all/-/require-all-2.2.0.tgz#b4420c233ac0282d0ff49b277fb880a8b5de0894" - -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.3: - 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" - -require_optional@^1.0.1, require_optional@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" - dependencies: - resolve-from "^2.0.0" - semver "^5.1.0" - -resize-observer-polyfill@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.0.tgz#660ff1d9712a2382baa2cad450a4716209f9ca69" - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - dependencies: - resolve-from "^3.0.0" - -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - -resolve-from@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - -resolve-options@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" - dependencies: - value-or-function "^3.0.0" - -resolve-path@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" - dependencies: - http-errors "~1.6.2" - path-is-absolute "1.0.1" - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2: - version "1.8.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.0.tgz#a7f2ac27b78480ecc09c83782741d9f26e4f0c3e" - dependencies: - path-parse "^1.0.5" - -responselike@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - dependencies: - lowercase-keys "^1.0.0" - -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" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - -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, rimraf@2.6.2, rimraf@^2.2.6, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - dependencies: - glob "^7.0.5" - -rimraf@~2.2.6: - version "2.2.8" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rndstr@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rndstr/-/rndstr-1.0.0.tgz#77e66fa8f9b4836853fdd91e50719591bb67d349" - dependencies: - rangestr "0.0.1" - seedrandom "2.4.2" - -rsvp@^4.7.0: - version "4.8.2" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.2.tgz#9d5647108735784eb13418cdddb56f75b919d722" - -run-async@^2.0.0, run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - dependencies: - is-promise "^2.1.0" - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - dependencies: - aproba "^1.1.1" - -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - -rx@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" - -rxjs@^5.5.2: - version "5.5.11" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.11.tgz#f733027ca43e3bec6b994473be4ab98ad43ced87" - dependencies: - symbol-observable "1.0.1" - -rxjs@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.1.tgz#246cebec189a6cbc143a3ef9f62d6f4c91813ca1" - dependencies: - tslib "^1.9.0" - -s-age@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/s-age/-/s-age-1.1.2.tgz#c0cf15233ccc93f41de92ea42c36d957977d1ea2" - -safe-buffer@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - -sass-graph@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" - dependencies: - glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^7.0.0" - -sass-loader@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.0.1.tgz#fd937259ccba3a9cfe0d5f8a98746d48adfcc261" - dependencies: - clone-deep "^2.0.1" - loader-utils "^1.0.1" - lodash.tail "^4.1.1" - neo-async "^2.5.0" - pify "^3.0.0" - -sax@0.5.x: - version "0.5.8" - resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" - -sax@^1.2.4, sax@~1.2.1, sax@~1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - -schema-utils@^0.4.3, schema-utils@^0.4.4, schema-utils@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" - dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - -scoped-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/scoped-regex/-/scoped-regex-1.0.0.tgz#a346bb1acd4207ae70bd7c0c7ca9e566b6baddb8" - -scss-tokenizer@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" - dependencies: - js-base64 "^2.1.8" - source-map "^0.4.2" - -seedrandom@2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.2.tgz#18d78c41287d13aff8eadb29e235938b248aa9ff" - -seedrandom@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.3.tgz#2438504dad33917314bff18ac4d794f16d6aaecc" - -seek-bzip@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" - dependencies: - commander "~2.8.1" - -semver-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9" - -semver-truncate@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8" - dependencies: - semver "^5.3.0" - -"semver@2 || 3 || 4 || 5", semver@5.5.0, semver@^5.0.1, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - -semver@^4.0.3, semver@^4.1.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - -semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - -send@0.16.2: - version "0.16.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.6.2" - mime "1.4.1" - ms "2.0.0" - on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.4.0" - -sequencify@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" - -serialize-javascript@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" - -serve-static@1.13.2: - version "1.13.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.2" - send "0.16.2" - -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" - -set-immediate-shim@^1.0.0, set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - -setprototypeof@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shallow-clone@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571" - dependencies: - is-extendable "^0.1.1" - kind-of "^5.0.0" - mixin-object "^2.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - -shell-quote@*: - version "1.6.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" - dependencies: - array-filter "~0.0.0" - array-map "~0.0.0" - array-reduce "~0.0.0" - jsonify "~0.0.0" - -shelljs@^0.8.0: - version "0.8.2" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.2.tgz#345b7df7763f4c2340d584abb532c5f752ca9e35" - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -shvl@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/shvl/-/shvl-1.3.1.tgz#6c20a17b4a20b08e9f8cab60c50a92229fcc176e" - -sigmund@^1.0.1, sigmund@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -single-line-log@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364" - dependencies: - string-width "^1.0.1" - -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" - -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - dependencies: - is-fullwidth-code-point "^2.0.0" - -slide@^1.1.5, slide@~1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - -sntp@2.x.x: - version "2.1.0" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" - dependencies: - hoek "4.x.x" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - dependencies: - is-plain-obj "^1.0.0" - -sort-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" - dependencies: - is-plain-obj "^1.0.0" - -sortablejs@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.7.0.tgz#80a2b2370abd568e1cec8c271131ef30a904fa28" - -source-list-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" - -source-list-map@~0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" - -source-map-resolve@^0.5.0, source-map-resolve@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - dependencies: - source-map "^0.5.6" - -source-map-support@^0.5.3: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - -source-map@0.1.x, source-map@^0.1.38: - version "0.1.43" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" - dependencies: - amdefine ">=0.0.4" - -source-map@0.5.x, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - -source-map@^0.4.2, source-map@~0.4.1: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - dependencies: - amdefine ">=0.0.4" - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - -sparkles@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" - -spawn-sync@^1.0.15: - version "1.0.15" - resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" - dependencies: - concat-stream "^1.4.7" - os-shim "^0.1.2" - -spdx-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/spdx-compare/-/spdx-compare-1.0.0.tgz#2c55f117362078d7409e6d7b08ce70a857cd3ed7" - dependencies: - array-find-index "^1.0.2" - spdx-expression-parse "^3.0.0" - spdx-ranges "^2.0.0" - -spdx-correct@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-1.0.5.tgz#9d21ac4da4bdb71d060fb74e5a67531d032cbba6" - -spdx-exceptions@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" - -spdx-license-ids@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" - -spdx-ranges@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/spdx-ranges/-/spdx-ranges-2.0.0.tgz#257686798e5edb41d45c1aba3d3f1bb47af8d5ec" - -spdx-satisfies@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/spdx-satisfies/-/spdx-satisfies-4.0.0.tgz#ebc79eec88b68ac75618e2e5ee94fbc347587552" - dependencies: - spdx-compare "^1.0.0" - spdx-expression-parse "^3.0.0" - spdx-ranges "^2.0.0" - -spdx@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/spdx/-/spdx-0.5.1.tgz#d36c275088b48d75a9046cd44a838ce4b5339998" - dependencies: - spdx-exceptions "^1.0.0" - spdx-license-ids "^1.0.0" - -speakeasy@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/speakeasy/-/speakeasy-2.0.0.tgz#85c91a071b09a5cb8642590d983566165f57613a" - dependencies: - base32.js "0.0.1" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -squeak@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/squeak/-/squeak-1.3.0.tgz#33045037b64388b567674b84322a6521073916c3" - dependencies: - chalk "^1.0.0" - console-stream "^0.1.1" - lpad-align "^1.0.1" - -sshpk@^1.7.0: - version "1.14.2" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - safer-buffer "^2.0.2" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jsbn "~0.1.0" - tweetnacl "~0.14.0" - -ssri@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" - dependencies: - safe-buffer "^5.1.1" - -stable@~0.1.6: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - -stat-mode@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2", statuses@^1.0.0, statuses@^1.2.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - -statuses@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - -stdout-stream@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" - dependencies: - readable-stream "^2.0.1" - -stealthy-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - -stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-combiner2@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" - dependencies: - duplexer2 "~0.1.0" - readable-stream "^2.0.2" - -stream-consume@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48" - -stream-each@^1.1.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - -streamsearch@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - -string-template@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" - -string-width@^1.0.1, string-width@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string_decoder@^1.0.0, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - dependencies: - safe-buffer "~5.1.0" - -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.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - dependencies: - safe-buffer "~5.1.0" - -stringstream@~0.0.4, stringstream@~0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" - -strip-bom-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" - dependencies: - first-chunk-stream "^1.0.0" - strip-bom "^2.0.0" - -strip-bom-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz#f87db5ef2613f6968aa545abfe1ec728b6a829ca" - dependencies: - first-chunk-stream "^2.0.0" - strip-bom "^2.0.0" - -strip-bom-string@1.X: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" - -strip-bom@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" - dependencies: - first-chunk-stream "^1.0.0" - is-utf8 "^0.2.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-dirs@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-1.1.1.tgz#960bbd1287844f3975a4558aa103a8255e2456a0" - dependencies: - chalk "^1.0.0" - get-stdin "^4.0.1" - is-absolute "^0.1.5" - is-natural-number "^2.0.0" - minimist "^1.1.0" - sum-up "^1.0.1" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - -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" - -strip-outer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" - dependencies: - escape-string-regexp "^1.0.2" - -style-loader@0.21.0: - version "0.21.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.21.0.tgz#68c52e5eb2afc9ca92b6274be277ee59aea3a852" - dependencies: - loader-utils "^1.1.0" - schema-utils "^0.4.5" - -stylus-loader@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-3.0.2.tgz#27a706420b05a38e038e7cacb153578d450513c6" - dependencies: - loader-utils "^1.0.2" - lodash.clonedeep "^4.5.0" - when "~3.6.x" - -stylus@0.54.5, stylus@^0.54.0, stylus@~0.54.5: - version "0.54.5" - resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79" - dependencies: - css-parse "1.7.x" - debug "*" - glob "7.0.x" - mkdirp "0.5.x" - sax "0.5.x" - source-map "0.1.x" - -sum-up@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" - dependencies: - chalk "^1.0.0" - -summaly@2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/summaly/-/summaly-2.0.6.tgz#559561e05c267f01e7199a296dd650a994b19053" - dependencies: - cheerio-httpcli "0.7.2" - debug "3.1.0" - escape-regexp "0.0.1" - html-entities "1.2.1" - request "2.85.0" - request-promise-native "1.0.5" - require-all "2.2.0" - trace-redirect "1.0.6" - -supports-color@5.4.0, supports-color@^5.2.0, supports-color@^5.3.0, supports-color@^5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - dependencies: - has-flag "^3.0.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -supports-color@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - dependencies: - has-flag "^1.0.0" - -svgo@^0.7.0: - version "0.7.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" - dependencies: - coa "~1.0.1" - colors "~1.1.2" - csso "~2.3.1" - js-yaml "~3.7.0" - mkdirp "~0.5.1" - sax "~1.2.1" - whet.extend "~0.9.9" - -svgo@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.0.5.tgz#7040364c062a0538abacff4401cea6a26a7a389a" - dependencies: - coa "~2.0.1" - colors "~1.1.2" - css-select "~1.3.0-rc0" - css-select-base-adapter "~0.1.0" - css-tree "1.0.0-alpha25" - css-url-regex "^1.1.0" - csso "^3.5.0" - js-yaml "~3.10.0" - mkdirp "~0.5.1" - object.values "^1.0.4" - sax "~1.2.4" - stable "~0.1.6" - unquote "~1.1.1" - util.promisify "~1.0.0" - -swagger-jsdoc@1.9.7: - version "1.9.7" - resolved "https://registry.yarnpkg.com/swagger-jsdoc/-/swagger-jsdoc-1.9.7.tgz#7a761d4d7ef4a54bf457cea5c67ec316bb82f8b9" - dependencies: - chokidar "^1.7.0" - commander "^2.11.0" - doctrine "^2.0.0" - glob "^7.1.2" - js-yaml "^3.8.4" - recursive-iterator "^2.0.3" - swagger-parser "^3.4.1" - -swagger-methods@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/swagger-methods/-/swagger-methods-1.0.4.tgz#2c5b844f4a22ab2f5e773f98193c28e386b1c37e" - -swagger-parser@^3.4.1: - version "3.4.2" - resolved "https://registry.yarnpkg.com/swagger-parser/-/swagger-parser-3.4.2.tgz#244d67d6eeed08c00acb5d95950d5aefbd6185a3" - dependencies: - call-me-maybe "^1.0.1" - debug "^3.0.0" - es6-promise "^4.1.1" - json-schema-ref-parser "^1.4.1" - ono "^4.0.2" - swagger-methods "^1.0.0" - swagger-schema-official "2.0.0-bab6bed" - z-schema "^3.16.1" - -swagger-schema-official@2.0.0-bab6bed: - version "2.0.0-bab6bed" - resolved "https://registry.yarnpkg.com/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz#70070468d6d2977ca5237b2e519ca7d06a2ea3fd" - -"sylvester@>= 0.0.12", "sylvester@>= 0.0.8": - version "0.0.21" - resolved "https://registry.yarnpkg.com/sylvester/-/sylvester-0.0.21.tgz#2987b1ce2bd2f38b0dce2a34388884bfa4400ea7" - -symbol-observable@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" - -symbol-observable@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - -symbol-tree@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" - -syuilo-password-strength@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/syuilo-password-strength/-/syuilo-password-strength-0.0.1.tgz#08f71a8f0ecb77db649f3d9a6424510d9d945f52" - -table@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" - dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" - -tapable@^1.0.0, tapable@^1.0.0-beta.5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" - -tar-stream@^1.1.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395" - dependencies: - bl "^1.0.0" - buffer-alloc "^1.1.0" - end-of-stream "^1.0.0" - fs-constants "^1.0.0" - readable-stream "^2.3.0" - to-buffer "^1.1.0" - xtend "^4.0.0" - -tar@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" - -tar@^4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" - dependencies: - chownr "^1.0.1" - fs-minipass "^1.2.5" - minipass "^2.3.3" - minizlib "^1.1.0" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.2" - -tcp-port-used@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-0.1.2.tgz#9450e8768c83b416fd4d1a6a9449eeccbf496c29" - dependencies: - debug "0.7.4" - is2 "0.0.9" - q "0.9.7" - -temp-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - -temp@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" - dependencies: - os-tmpdir "^1.0.0" - rimraf "~2.2.6" - -tempfile@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2" - dependencies: - os-tmpdir "^1.0.0" - uuid "^2.0.1" - -tempfile@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265" - dependencies: - temp-dir "^1.0.0" - uuid "^3.0.1" - -text-table@^0.2.0, text-table@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - -textarea-caret@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/textarea-caret/-/textarea-caret-3.1.0.tgz#5d5a35bb035fd06b2ff0e25d5359e97f2655087f" - -textextensions@2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286" - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.0" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" - dependencies: - any-promise "^1.0.0" - -throttle-debounce@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz#51853da37be68a155cb6e827b3514a3c422e89cd" - -through2-concurrent@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/through2-concurrent/-/through2-concurrent-1.1.1.tgz#11cb4ea4c9e31bca6e4c1e6dba48d1c728c3524b" - dependencies: - through2 "^2.0.0" - -through2-filter@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" - dependencies: - through2 "~2.0.0" - xtend "~4.0.0" - -through2@2.X, through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - -through2@^0.6.0, through2@^0.6.1: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through@^2.3.6, through@~2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -tildify@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" - dependencies: - os-homedir "^1.0.0" - -time-stamp@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - -timed-out@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" - -timed-out@^4.0.0, timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - -timers-browserify@^2.0.4: - version "2.0.10" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" - dependencies: - setimmediate "^1.0.4" - -timers-ext@^0.1.2: - version "0.1.5" - resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.5.tgz#77147dd4e76b660c2abb8785db96574cbbd12922" - dependencies: - es5-ext "~0.10.14" - next-tick "1" - -tmp@0.0.33, tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - dependencies: - os-tmpdir "~1.0.2" - -to-absolute-glob@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" - dependencies: - extend-shallow "^2.0.1" - -to-absolute-glob@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" - dependencies: - is-absolute "^1.0.0" - is-negated-glob "^1.0.0" - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - -to-buffer@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -to-through@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" - dependencies: - through2 "^2.0.3" - -token-stream@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a" - -tough-cookie@>=2.3.3, tough-cookie@^2.3.3: - version "2.4.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.2.tgz#aa9133154518b494efab98a58247bfc38818c00c" - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - -tough-cookie@~2.3.0, tough-cookie@~2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" - dependencies: - punycode "^1.4.1" - -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - dependencies: - punycode "^2.1.0" - -trace-redirect@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/trace-redirect/-/trace-redirect-1.0.6.tgz#ac629b5bf8247d30dde5a35fe9811b811075b504" - -treeify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - -trim-repeated@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" - dependencies: - escape-string-regexp "^1.0.2" - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - -"true-case-path@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" - dependencies: - glob "^6.0.4" - -tryit@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" - -ts-loader@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-4.3.0.tgz#4e3ba172783d1256d3a23bdfadde011a795fae9e" - dependencies: - chalk "^2.3.0" - enhanced-resolve "^4.0.0" - loader-utils "^1.0.2" - micromatch "^3.1.4" - semver "^5.0.1" - -ts-node@6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-6.0.4.tgz#245af3a8cdf3baa1121893fe12b9a54ee297c4c5" - dependencies: - arrify "^1.0.0" - chalk "^2.3.0" - diff "^3.1.0" - make-error "^1.1.1" - minimist "^1.2.0" - mkdirp "^0.5.1" - source-map-support "^0.5.3" - yn "^2.0.0" - -tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: - version "1.9.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.2.tgz#8be0cc9a1f6dc7727c38deb16c2ebd1a2892988e" - -tslint@5.10.0: - version "5.10.0" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.10.0.tgz#11e26bccb88afa02dd0d9956cae3d4540b5f54c3" - dependencies: - babel-code-frame "^6.22.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^3.2.0" - glob "^7.1.1" - js-yaml "^3.7.0" - minimatch "^3.0.4" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.8.0" - tsutils "^2.12.1" - -tsutils@^2.12.1: - version "2.27.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.27.1.tgz#ab0276ac23664f36ce8fd4414daec4aebf4373ee" - dependencies: - tslib "^1.8.1" - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - -tunnel-agent@^0.4.0, tunnel-agent@~0.4.1: - version "0.4.3" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -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.5.5, type-is@^1.6.14, type-is@^1.6.16, type-is@^1.6.4, type-is@~1.6.15, type-is@~1.6.16: - version "1.6.16" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" - dependencies: - media-typer "0.3.0" - mime-types "~2.1.18" - -type-of@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/type-of/-/type-of-2.0.1.tgz#e72a1741896568e9f628378d816d6912f7f23972" - -typedarray-to-buffer@^3.1.2: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - dependencies: - is-typedarray "^1.0.0" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - -typescript-eslint-parser@15.0.0: - version "15.0.0" - resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-15.0.0.tgz#882fd3d7aabffbab0a7f98d2a59fb9a989c2b37f" - dependencies: - lodash.unescape "4.0.1" - semver "5.5.0" - -typescript@2.8.3: - version "2.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170" - -uglify-es@3.3.9, uglify-es@^3.3.4: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - dependencies: - commander "~2.13.0" - source-map "~0.6.1" - -uglify-js@3.3.x: - version "3.3.28" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.28.tgz#0efb9a13850e11303361c1051f64d2ec68d9be06" - dependencies: - commander "~2.15.0" - source-map "~0.6.1" - -uglify-js@^2.6.1, uglify-js@^2.7.0: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-js@^3.0.5: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.0.tgz#796762282b5b5f0eafe7d5c8c708d1d7bd5ba11d" - dependencies: - commander "~2.15.0" - source-map "~0.6.1" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - -uglifyjs-webpack-plugin@^1.2.4: - version "1.2.5" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz#2ef8387c8f1a903ec5e44fa36f9f3cbdcea67641" - dependencies: - cacache "^10.0.4" - find-cache-dir "^1.0.0" - schema-utils "^0.4.5" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - uglify-es "^3.3.4" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" - -unc-path-regex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - -underscore@>=1.3.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" - -underscore@~1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" - -union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^0.4.3" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - -unique-filename@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" - dependencies: - imurmurhash "^0.1.4" - -unique-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" - -unique-stream@^2.0.2: - version "2.2.1" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" - dependencies: - json-stable-stringify "^1.0.0" - through2-filter "^2.0.0" - -universalify@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -untildify@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" - -unzip-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" - -upath@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" - -upper-case@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" - -uri-js@^4.2.1: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - dependencies: - punycode "^2.1.0" - -urijs@^1.19.0: - version "1.19.1" - resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.1.tgz#5b0ff530c0cbde8386f6342235ba5ca6e995d25a" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - -url-loader@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.0.1.tgz#61bc53f1f184d7343da2728a1289ef8722ea45ee" - dependencies: - loader-utils "^1.1.0" - mime "^2.0.3" - schema-utils "^0.4.3" - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - dependencies: - prepend-http "^1.0.1" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - dependencies: - prepend-http "^2.0.0" - -url-regex@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724" - dependencies: - ip-regex "^1.0.1" - -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -urlsafe-base64@^1.0.0, urlsafe-base64@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/urlsafe-base64/-/urlsafe-base64-1.0.0.tgz#23f89069a6c62f46cf3a1d3b00169cefb90be0c6" - -use@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" - dependencies: - kind-of "^6.0.2" - -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -util-extend@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" - -util.promisify@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - dependencies: - inherits "2.0.1" - -util@^0.10.3: - version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" - dependencies: - inherits "2.0.3" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - -uuid@3.2.1, uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" - -uuid@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" - -v-animate-css@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/v-animate-css/-/v-animate-css-0.0.2.tgz#61f233b641de5ab544ab50bc5450c747030e3bde" - -v8-compile-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz#526492e35fc616864284700b7043e01baee09f0a" - -v8flags@^2.0.2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - dependencies: - user-home "^1.1.1" - -vali-date@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" - -valid-url@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" - -validate-npm-package-license@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -validator@^10.0.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-10.3.0.tgz#157a8c0981858cff381f59aabcdb8f83b57317cc" - -value-or-function@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" - -vary@^1.0.0, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - -vendors@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -vinyl-assign@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/vinyl-assign/-/vinyl-assign-1.2.1.tgz#4d198891b5515911d771a8cd9c5480a46a074a45" - dependencies: - object-assign "^4.0.1" - readable-stream "^2.0.0" - -vinyl-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/vinyl-file/-/vinyl-file-2.0.0.tgz#a7ebf5ffbefda1b7d18d140fcb07b223efb6751a" - dependencies: - graceful-fs "^4.1.2" - pify "^2.3.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - strip-bom-stream "^2.0.0" - vinyl "^1.1.0" - -vinyl-fs@^0.3.0: - version "0.3.14" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" - dependencies: - defaults "^1.0.0" - glob-stream "^3.1.5" - glob-watcher "^0.0.6" - graceful-fs "^3.0.0" - mkdirp "^0.5.0" - strip-bom "^1.0.0" - through2 "^0.6.1" - vinyl "^0.4.0" - -vinyl-fs@^2.2.0: - version "2.4.4" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239" - dependencies: - duplexify "^3.2.0" - glob-stream "^5.3.2" - graceful-fs "^4.0.0" - gulp-sourcemaps "1.6.0" - is-valid-glob "^0.3.0" - lazystream "^1.0.0" - lodash.isequal "^4.0.0" - merge-stream "^1.0.0" - mkdirp "^0.5.0" - object-assign "^4.0.0" - readable-stream "^2.0.4" - strip-bom "^2.0.0" - strip-bom-stream "^1.0.0" - through2 "^2.0.0" - through2-filter "^2.0.0" - vali-date "^1.0.0" - vinyl "^1.0.0" - -vinyl-fs@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" - dependencies: - fs-mkdirp-stream "^1.0.0" - glob-stream "^6.1.0" - graceful-fs "^4.0.0" - is-valid-glob "^1.0.0" - lazystream "^1.0.0" - lead "^1.0.0" - object.assign "^4.0.4" - pumpify "^1.3.5" - readable-stream "^2.3.3" - remove-bom-buffer "^3.0.0" - remove-bom-stream "^1.2.0" - resolve-options "^1.1.0" - through2 "^2.0.0" - to-through "^2.0.0" - value-or-function "^3.0.0" - vinyl "^2.0.0" - vinyl-sourcemap "^1.1.0" - -vinyl-sourcemap@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" - dependencies: - append-buffer "^1.0.2" - convert-source-map "^1.5.0" - graceful-fs "^4.1.6" - normalize-path "^2.1.1" - now-and-later "^2.0.0" - remove-bom-buffer "^3.0.0" - vinyl "^2.0.0" - -vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" - dependencies: - source-map "^0.5.1" - -vinyl@^0.4.0, vinyl@^0.4.3: - version "0.4.6" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" - dependencies: - clone "^0.2.0" - clone-stats "^0.0.1" - -vinyl@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -vinyl@^1.0.0, vinyl@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -vinyl@^2.0.0, vinyl@^2.0.1, vinyl@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c" - dependencies: - clone "^2.1.1" - clone-buffer "^1.0.0" - clone-stats "^1.0.0" - cloneable-readable "^1.0.0" - remove-trailing-separator "^1.0.1" - replace-ext "^1.0.0" - -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - dependencies: - indexof "0.0.1" - -void-elements@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" - -vue-cropperjs@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/vue-cropperjs/-/vue-cropperjs-2.2.0.tgz#cd8f00ee01914e86f114ee8aa3f7354e3c76a8fc" - dependencies: - cropperjs "^1.1.3" - -vue-eslint-parser@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1" - dependencies: - debug "^3.1.0" - eslint-scope "^3.7.1" - eslint-visitor-keys "^1.0.0" - espree "^3.5.2" - esquery "^1.0.0" - lodash "^4.17.4" - -vue-functional-data-merge@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/vue-functional-data-merge/-/vue-functional-data-merge-2.0.6.tgz#f08055adfb92458debcf2ad10c3aa712277f7fc2" - -vue-hot-reload-api@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz#97976142405d13d8efae154749e88c4e358cf926" - -vue-js-modal@1.3.13: - version "1.3.13" - resolved "https://registry.yarnpkg.com/vue-js-modal/-/vue-js-modal-1.3.13.tgz#1718c3182a94a03e03422db50c60229bbbd53f18" - -vue-json-tree-view@2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/vue-json-tree-view/-/vue-json-tree-view-2.1.4.tgz#b6f8ae2ba2eec4eec5b6f53b90fa187054cad79b" - dependencies: - lodash "^4.17.4" - vue "^2.5.16" - -vue-loader@15.2.1: - version "15.2.1" - resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.2.1.tgz#89a13b6b7dec63614729c73b1b46a571a69bb20e" - dependencies: - "@vue/component-compiler-utils" "^1.2.1" - hash-sum "^1.0.2" - loader-utils "^1.1.0" - vue-hot-reload-api "^2.3.0" - vue-style-loader "^4.1.0" - -vue-router@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.0.1.tgz#d9b05ad9c7420ba0f626d6500d693e60092cc1e9" - -vue-style-loader@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.0.tgz#7588bd778e2c9f8d87bfc3c5a4a039638da7a863" - dependencies: - hash-sum "^1.0.2" - loader-utils "^1.0.2" - -vue-template-compiler@2.5.16: - version "2.5.16" - resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.16.tgz#93b48570e56c720cdf3f051cc15287c26fbd04cb" - dependencies: - de-indent "^1.0.2" - he "^1.1.0" - -vue-template-es2015-compiler@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz#dc42697133302ce3017524356a6c61b7b69b4a18" - -vue@2.5.16, vue@^2.5.16: - version "2.5.16" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.16.tgz#07edb75e8412aaeed871ebafa99f4672584a0085" - -vuedraggable@2.16.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/vuedraggable/-/vuedraggable-2.16.0.tgz#52127081a2adb3de5fabd214d404ff3eee63575a" - dependencies: - sortablejs "^1.7.0" - -vuex-persistedstate@^2.5.4: - version "2.5.4" - resolved "https://registry.yarnpkg.com/vuex-persistedstate/-/vuex-persistedstate-2.5.4.tgz#a19710ad7f9a08cea4e65fc585924d9fdac7384a" - dependencies: - deepmerge "^2.1.0" - shvl "^1.3.0" - -vuex@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.0.1.tgz#e761352ebe0af537d4bb755a9b9dc4be3df7efd2" - -w3c-hr-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - dependencies: - browser-process-hrtime "^0.1.2" - -ware@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ware/-/ware-1.3.0.tgz#d1b14f39d2e2cb4ab8c4098f756fe4b164e473d4" - dependencies: - wrap-fn "^0.1.0" - -watchpack@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - dependencies: - chokidar "^2.0.2" - graceful-fs "^4.1.2" - neo-async "^2.5.0" - -web-push@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/web-push/-/web-push-3.3.1.tgz#6d49517b927ffb97241a719d2f7f9014de130f09" - dependencies: - asn1.js "^5.0.0" - http_ece "1.0.5" - https-proxy-agent "^2.2.1" - jws "^3.1.3" - minimist "^1.2.0" - urlsafe-base64 "^1.0.0" - -webassemblyjs@1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webassemblyjs/-/webassemblyjs-1.4.3.tgz#0591893efb8fbde74498251cbe4b2d83df9239cb" - dependencies: - "@webassemblyjs/ast" "1.4.3" - "@webassemblyjs/validation" "1.4.3" - "@webassemblyjs/wasm-parser" "1.4.3" - "@webassemblyjs/wast-parser" "1.4.3" - long "^3.2.0" - -webfinger.js@2.6.6: - version "2.6.6" - resolved "https://registry.yarnpkg.com/webfinger.js/-/webfinger.js-2.6.6.tgz#52ebdc85da8c8fb6beb690e8e32594c99d2ff4ae" - dependencies: - xhr2 "^0.1.4" - -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - -webpack-addons@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/webpack-addons/-/webpack-addons-1.1.5.tgz#2b178dfe873fb6e75e40a819fa5c26e4a9bc837a" - dependencies: - jscodeshift "^0.4.0" - -webpack-cli@2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-2.1.4.tgz#cab81e79249127384fb69b2fdfe2055f9c771b76" - dependencies: - chalk "^2.4.1" - cross-spawn "^6.0.5" - diff "^3.5.0" - enhanced-resolve "^4.0.0" - envinfo "^5.7.0" - glob-all "^3.1.0" - global-modules "^1.0.0" - got "^8.3.1" - import-local "^1.0.0" - inquirer "^5.2.0" - interpret "^1.1.0" - jscodeshift "^0.5.0" - listr "^0.14.1" - loader-utils "^1.1.0" - lodash "^4.17.10" - log-symbols "^2.2.0" - mkdirp "^0.5.1" - p-each-series "^1.0.0" - p-lazy "^1.0.0" - prettier "^1.12.1" - supports-color "^5.4.0" - v8-compile-cache "^2.0.0" - webpack-addons "^1.1.5" - yargs "^11.1.0" - yeoman-environment "^2.1.1" - yeoman-generator "^2.0.5" - -webpack-core@~0.6.0: - version "0.6.9" - resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2" - dependencies: - source-list-map "~0.1.7" - source-map "~0.4.1" - -webpack-sources@^1.0.1, webpack-sources@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.9.1.tgz#fa7bd738b17fd7f09f37da461b2f5c16c6565f34" - dependencies: - "@webassemblyjs/ast" "1.4.3" - "@webassemblyjs/wasm-edit" "1.4.3" - "@webassemblyjs/wasm-parser" "1.4.3" - acorn "^5.0.0" - acorn-dynamic-import "^3.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chrome-trace-event "^0.1.1" - enhanced-resolve "^4.0.0" - eslint-scope "^3.7.1" - json-parse-better-errors "^1.0.2" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - micromatch "^3.1.8" - mkdirp "~0.5.0" - neo-async "^2.5.0" - node-libs-browser "^2.0.0" - schema-utils "^0.4.4" - tapable "^1.0.0" - uglifyjs-webpack-plugin "^1.2.4" - watchpack "^1.5.0" - webpack-sources "^1.0.1" - -websocket@1.0.26: - version "1.0.26" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.26.tgz#a03a01299849c35268c83044aa919c6374be8194" - dependencies: - debug "^2.2.0" - nan "^2.3.3" - typedarray-to-buffer "^3.1.2" - yaeti "^0.0.6" - -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" - dependencies: - iconv-lite "0.4.19" - -whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" - -whatwg-url@^6.4.0, whatwg-url@^6.4.1: - version "6.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -when@^3.7.7: - version "3.7.8" - resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" - -when@~3.6.x: - version "3.6.4" - resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" - -whet.extend@~0.9.9: - version "0.9.9" - resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" - -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - -which@1, which@^1.2.14, which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - dependencies: - string-width "^1.0.2 || 2" - -window-or-global@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/window-or-global/-/window-or-global-1.0.1.tgz#dbe45ba2a291aabc56d62cf66c45b7fa322946de" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - -with@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe" - dependencies: - acorn "^3.1.0" - acorn-globals "^3.0.0" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - -worker-farm@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" - dependencies: - errno "~0.1.7" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrap-fn@^0.1.0: - version "0.1.5" - resolved "https://registry.yarnpkg.com/wrap-fn/-/wrap-fn-0.1.5.tgz#f21b6e41016ff4a7e31720dbc63a09016bdf9845" - dependencies: - co "3.1.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -write-file-atomic@^1.2.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - slide "^1.1.5" - -write-file-atomic@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write-json-file@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f" - dependencies: - detect-indent "^5.0.0" - graceful-fs "^4.1.2" - make-dir "^1.0.0" - pify "^3.0.0" - sort-keys "^2.0.0" - write-file-atomic "^2.0.0" - -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" - -ws@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.0.tgz#9fd95e3ac7c76f6ae8bcc868a0e3f11f1290c33e" - dependencies: - async-limiter "~1.0.0" - -ws@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289" - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - -xev@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/xev/-/xev-2.0.1.tgz#24484173a22115bc8a990ef5d4d5129695b827a7" - -xhr2@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f" - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - -y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - -yaeti@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" - -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-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" - dependencies: - camelcase "^3.0.0" - -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" - dependencies: - camelcase "^4.1.0" - -yargs-parser@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" - dependencies: - camelcase "^4.1.0" - -yargs-parser@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" - dependencies: - camelcase "^4.1.0" - -yargs@^10.0.3: - version "10.1.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^8.1.0" - -yargs@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" - -yargs@^4.0.0: - 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@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - 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.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^5.0.0" - -yargs@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" - dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" - -yargs@~1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.2.6.tgz#9c7b4a82fd5d595b2bf17ab6dcc43135432fe34b" - dependencies: - minimist "^0.1.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - -yauzl@^2.2.1: - version "2.9.2" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.9.2.tgz#4fb1bc7ae1fc2f57037b54af6acc8fe1031c5b77" - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - -yeoman-environment@^2.0.5, yeoman-environment@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-2.2.0.tgz#6c0ee93a8d962a9f6dbc5ad4e90ae7ab34875393" - dependencies: - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^3.1.0" - diff "^3.3.1" - escape-string-regexp "^1.0.2" - globby "^8.0.1" - grouped-queue "^0.3.3" - inquirer "^5.2.0" - is-scoped "^1.0.0" - lodash "^4.17.10" - log-symbols "^2.1.0" - mem-fs "^1.1.0" - strip-ansi "^4.0.0" - text-table "^0.2.0" - untildify "^3.0.2" - -yeoman-generator@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/yeoman-generator/-/yeoman-generator-2.0.5.tgz#57b0b3474701293cc9ec965288f3400b00887c81" - dependencies: - async "^2.6.0" - chalk "^2.3.0" - cli-table "^0.3.1" - cross-spawn "^6.0.5" - dargs "^5.1.0" - dateformat "^3.0.3" - debug "^3.1.0" - detect-conflict "^1.0.0" - error "^7.0.2" - find-up "^2.1.0" - github-username "^4.0.0" - istextorbinary "^2.2.1" - lodash "^4.17.10" - make-dir "^1.1.0" - mem-fs-editor "^4.0.0" - minimist "^1.2.0" - pretty-bytes "^4.0.2" - read-chunk "^2.1.0" - read-pkg-up "^3.0.0" - rimraf "^2.6.2" - run-async "^2.0.0" - shelljs "^0.8.0" - text-table "^0.2.0" - through2 "^2.0.0" - yeoman-environment "^2.0.5" - -yn@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" - -z-schema@^3.16.1: - version "3.22.0" - resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-3.22.0.tgz#e1326063cb438f348c648350770258ff5e20a22b" - dependencies: - lodash.get "^4.0.0" - lodash.isequal "^4.0.0" - validator "^10.0.0" - optionalDependencies: - commander "^2.7.1" +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@fortawesome/fontawesome-free-brands@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-brands/-/fontawesome-free-brands-5.0.2.tgz#a1cc602eec40a379a3dd8a44c78b31110dd3d3d3" + +"@fortawesome/fontawesome-free-regular@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-regular/-/fontawesome-free-regular-5.0.2.tgz#429af86bed14689f87648e6322983c65c782c017" + +"@fortawesome/fontawesome-free-solid@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-solid/-/fontawesome-free-solid-5.0.2.tgz#090ce2c59dd5ec76983f3da8a43e1ab0321b42d5" + +"@fortawesome/fontawesome@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome/-/fontawesome-1.0.1.tgz#8ac60e1e7b437889baf9c9d6e3a61ef3b637170d" + +"@gulp-sourcemaps/identity-map@1.X": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz#cfa23bc5840f9104ce32a65e74db7e7a974bbee1" + dependencies: + acorn "^5.0.3" + css "^2.2.1" + normalize-path "^2.1.1" + source-map "^0.5.6" + through2 "^2.0.3" + +"@gulp-sourcemaps/map-sources@1.X": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda" + dependencies: + normalize-path "^2.0.1" + through2 "^2.0.3" + +"@koa/cors@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@koa/cors/-/cors-2.2.1.tgz#c06a1c34d787e3cee79c0d4c20e8952d1b6d75c5" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.0.1": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz#50c1e2260ac0ed9439a181de3725a0168d59c48a" + +"@prezzemolo/rap@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@prezzemolo/rap/-/rap-0.1.2.tgz#01f8a60bb61de33822fc632563fb8b23e574854e" + +"@prezzemolo/zip@0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@prezzemolo/zip/-/zip-0.0.3.tgz#6532d4bcd77c6a95e3a90ca5388a09b532a1f8e4" + +"@samverschueren/stream-to-observable@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" + dependencies: + any-observable "^0.3.0" + +"@sindresorhus/is@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" + +"@types/accepts@*": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" + dependencies: + "@types/node" "*" + +"@types/babel-types@*", "@types/babel-types@^7.0.0": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.3.tgz#9dc5316090ad99cd2679051ab21a5676c90a2bcc" + +"@types/babylon@^6.16.2": + version "6.16.3" + resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.3.tgz#c2937813a89fcb5e79a00062fc4a8b143e7237bb" + dependencies: + "@types/babel-types" "*" + +"@types/bcryptjs@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.1.tgz#7fb63922b5b106edacdcfe084cd38850f78aacfc" + +"@types/body-parser@*": + version "1.17.0" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bson@*": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/bson/-/bson-1.0.8.tgz#6ad272b3f049e9598ec33aed09cf56d8946b75f1" + dependencies: + "@types/node" "*" + +"@types/caseless@*": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.1.tgz#9794c69c8385d0192acc471a540d1f8e0d16218a" + +"@types/cheerio@^0.22.5": + version "0.22.7" + resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.7.tgz#4a92eafedfb2b9f4437d3a4410006d81114c66ce" + +"@types/clean-css@*": + version "3.4.30" + resolved "https://registry.yarnpkg.com/@types/clean-css/-/clean-css-3.4.30.tgz#0052c136f5248002428e3638b37de4a39818641d" + +"@types/connect@*": + version "3.4.32" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" + dependencies: + "@types/node" "*" + +"@types/cookies@*": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.1.tgz#f9f204bd6767d389eea3b87609e30c090c77a540" + dependencies: + "@types/connect" "*" + "@types/express" "*" + "@types/keygrip" "*" + "@types/node" "*" + +"@types/debug@0.0.30": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-0.0.30.tgz#dc1e40f7af3b9c815013a7860e6252f6352a84df" + +"@types/deep-equal@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/deep-equal/-/deep-equal-1.0.1.tgz#71cfabb247c22bcc16d536111f50c0ed12476b03" + +"@types/elasticsearch@5.0.23": + version "5.0.23" + resolved "https://registry.yarnpkg.com/@types/elasticsearch/-/elasticsearch-5.0.23.tgz#235622772a7c7f3ccedd0dc9769dfcfe20eed1ec" + +"@types/events@*": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" + +"@types/express-serve-static-core@*": + version "4.16.0" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz#fdfe777594ddc1fe8eb8eccce52e261b496e43e7" + dependencies: + "@types/events" "*" + "@types/node" "*" + "@types/range-parser" "*" + +"@types/express@*": + version "4.16.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.0.tgz#6d8bc42ccaa6f35cf29a2b7c3333cb47b5a32a19" + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/serve-static" "*" + +"@types/fancy-log@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@types/fancy-log/-/fancy-log-1.3.0.tgz#a61ab476e5e628cd07a846330df53b85e05c8ce0" + +"@types/form-data@*": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.2.1.tgz#ee2b3b8eaa11c0938289953606b745b738c54b1e" + dependencies: + "@types/node" "*" + +"@types/glob@*": + version "5.0.35" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.35.tgz#1ae151c802cece940443b5ac246925c85189f32a" + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/gm@1.18.0": + version "1.18.0" + resolved "https://registry.yarnpkg.com/@types/gm/-/gm-1.18.0.tgz#49be90ff74286fcdc23b00f13d3699e6dfaceef2" + dependencies: + "@types/node" "*" + +"@types/gulp-htmlmin@1.3.32": + version "1.3.32" + resolved "https://registry.yarnpkg.com/@types/gulp-htmlmin/-/gulp-htmlmin-1.3.32.tgz#342baec649f285c7cbd78dfcf54dd17c388bde2b" + dependencies: + "@types/html-minifier" "*" + "@types/node" "*" + +"@types/gulp-mocha@0.0.32": + version "0.0.32" + resolved "https://registry.yarnpkg.com/@types/gulp-mocha/-/gulp-mocha-0.0.32.tgz#dbc425e804a8354236c31ab23406222a8ab9bdaf" + dependencies: + "@types/mocha" "*" + "@types/node" "*" + +"@types/gulp-rename@0.0.33": + version "0.0.33" + resolved "https://registry.yarnpkg.com/@types/gulp-rename/-/gulp-rename-0.0.33.tgz#38d146e97786569f74f5391a1b1f9b5198674b6c" + dependencies: + "@types/node" "*" + +"@types/gulp-replace@0.0.31": + version "0.0.31" + resolved "https://registry.yarnpkg.com/@types/gulp-replace/-/gulp-replace-0.0.31.tgz#87c3ac90b437694c58d68d1da677fcaff38b25ff" + dependencies: + "@types/node" "*" + +"@types/gulp-uglify@3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/gulp-uglify/-/gulp-uglify-3.0.5.tgz#ddcbbb6bd15a84b8a6c5e2218c2efba98102d135" + dependencies: + "@types/node" "*" + "@types/uglify-js" "^2" + +"@types/gulp-util@3.0.34": + version "3.0.34" + resolved "https://registry.yarnpkg.com/@types/gulp-util/-/gulp-util-3.0.34.tgz#d1291ebf706d93f46eb8df11344bbfd96247697e" + dependencies: + "@types/node" "*" + "@types/through2" "*" + "@types/vinyl" "*" + chalk "^2.2.0" + +"@types/gulp@3.8.36": + version "3.8.36" + resolved "https://registry.yarnpkg.com/@types/gulp/-/gulp-3.8.36.tgz#11eaf583bf0534669b4ffa9bfed51557faa00a4c" + dependencies: + "@types/node" "*" + "@types/orchestrator" "*" + "@types/vinyl" "*" + +"@types/html-minifier@*": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@types/html-minifier/-/html-minifier-3.5.2.tgz#f897a13d847a774e9b6fd91497e9b0e0ead71c35" + dependencies: + "@types/clean-css" "*" + "@types/relateurl" "*" + "@types/uglify-js" "*" + +"@types/http-assert@*": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.3.0.tgz#5e932606153da28e1d04f9043f4912cf61fd55dd" + +"@types/inquirer@0.0.41": + version "0.0.41" + resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-0.0.41.tgz#0c33027dcd0b0dde234e22afa454f2c75d8b30d2" + dependencies: + "@types/rx" "*" + "@types/through" "*" + +"@types/is-root@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/is-root/-/is-root-1.0.0.tgz#1cf41787243a8f030eb737a9aaf08b071e4f2453" + +"@types/is-url@1.2.28": + version "1.2.28" + resolved "https://registry.yarnpkg.com/@types/is-url/-/is-url-1.2.28.tgz#914dabd50546d9b0142806e42c72bc7c2b7e0787" + +"@types/js-yaml@3.11.1": + version "3.11.1" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.11.1.tgz#ac5bab26be5f9c6f74b6b23420f2cfa5a7a6ba40" + +"@types/keygrip@*": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.1.tgz#ff540462d2fb4d0a88441ceaf27d287b01c3d878" + +"@types/koa-bodyparser@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/koa-bodyparser/-/koa-bodyparser-4.2.0.tgz#04febc567f3d3dd40e3d1a0e095cdf7b07c4d7ce" + dependencies: + "@types/koa" "*" + +"@types/koa-compose@*": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.2.tgz#dc106e000bbf92a3ac900f756df47344887ee847" + +"@types/koa-compress@2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@types/koa-compress/-/koa-compress-2.0.8.tgz#426a2fac419aff7d1a7d87fd78203bf0d26a94fb" + dependencies: + "@types/koa" "*" + "@types/node" "*" + +"@types/koa-favicon@2.0.19": + version "2.0.19" + resolved "https://registry.yarnpkg.com/@types/koa-favicon/-/koa-favicon-2.0.19.tgz#a1b584fd64c99f16710633272292bf7d4b0ca1fa" + dependencies: + "@types/koa" "*" + +"@types/koa-logger@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/koa-logger/-/koa-logger-3.1.0.tgz#133acdbc56d87b5a559cab25528b087381a8fc0d" + dependencies: + "@types/koa" "*" + +"@types/koa-mount@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/koa-mount/-/koa-mount-3.0.1.tgz#2c068d1696b173c62c316158210c4316c4401f57" + dependencies: + "@types/koa" "*" + +"@types/koa-multer@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/koa-multer/-/koa-multer-1.0.0.tgz#f449f399ac3f80c05753452f000e8694ceec4249" + dependencies: + "@types/koa" "*" + +"@types/koa-router@7.0.28": + version "7.0.28" + resolved "https://registry.yarnpkg.com/@types/koa-router/-/koa-router-7.0.28.tgz#67487c862a831099aed8864a8996bfa7e989edc0" + dependencies: + "@types/koa" "*" + +"@types/koa-send@4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@types/koa-send/-/koa-send-4.1.1.tgz#88f57cbe0343c8204903f9096d8ff6b98ec3296f" + dependencies: + "@types/koa" "*" + +"@types/koa-views@2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/koa-views/-/koa-views-2.0.3.tgz#38fc1f3027503acba73a93fe06678813f306779b" + dependencies: + "@types/koa" "*" + +"@types/koa@*": + version "2.0.46" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.0.46.tgz#24bc3cd405d10fcde81f876cd8285b44d4ddc3e9" + dependencies: + "@types/accepts" "*" + "@types/cookies" "*" + "@types/events" "*" + "@types/http-assert" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/koa@2.0.45": + version "2.0.45" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.0.45.tgz#133cbda6cc8d12b73434b5d9663898c833f80aa2" + dependencies: + "@types/accepts" "*" + "@types/cookies" "*" + "@types/events" "*" + "@types/http-assert" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/koa__cors@2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@types/koa__cors/-/koa__cors-2.2.2.tgz#03d7cf3b076d5dfab8a5444ac6c5df5173147de8" + dependencies: + "@types/koa" "*" + +"@types/kue@0.11.8": + version "0.11.8" + resolved "https://registry.yarnpkg.com/@types/kue/-/kue-0.11.8.tgz#820f5e3db6025f0411e0942cd3ccab461a060c90" + dependencies: + "@types/express" "*" + "@types/node" "*" + "@types/redis" "*" + +"@types/license-checker@15.0.0": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@types/license-checker/-/license-checker-15.0.0.tgz#685d69e2cf61ffd862320434601f51c85e28bba1" + +"@types/mime@*": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b" + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + +"@types/mkdirp@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" + dependencies: + "@types/node" "*" + +"@types/mocha@*": + version "5.2.2" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.2.tgz#202d2b8fe1364c5b617b439b26a54f0e75eac0a7" + +"@types/mocha@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.0.tgz#b3c8e69f038835db1a7fdc0b3d879fc50506e29e" + +"@types/mongodb@3.0.18": + version "3.0.18" + resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.0.18.tgz#e5775ba9c15bf1601e57ada52d9fcbc6d6095d18" + dependencies: + "@types/bson" "*" + "@types/events" "*" + "@types/node" "*" + +"@types/ms@0.7.30": + version "0.7.30" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.30.tgz#f6c38b7ecbbf698b0bbd138315a0f0f18954f85f" + +"@types/node@*": + version "10.3.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.3.3.tgz#8798d9e39af2fa604f715ee6a6b19796528e46c3" + +"@types/node@10.1.2": + version "10.1.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.1.2.tgz#1b928a0baa408fc8ae3ac012cc81375addc147c6" + +"@types/node@^8.0.47": + version "8.10.20" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.20.tgz#fe674ea52e13950ab10954433a7824438aabbcac" + +"@types/nopt@3.0.29": + version "3.0.29" + resolved "https://registry.yarnpkg.com/@types/nopt/-/nopt-3.0.29.tgz#f19df3db4c97ee1459a2740028320a71d70964ce" + +"@types/orchestrator@*": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@types/orchestrator/-/orchestrator-0.3.2.tgz#cd15c6cea978a32b98e5054239cbcc78e55671f1" + dependencies: + "@types/node" "*" + "@types/q" "*" + +"@types/parse5@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-3.0.0.tgz#b63305718d82af42a9e5da79c56ecfc1f32e32c0" + dependencies: + parse5 "*" + +"@types/pug@2.0.4", "@types/pug@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.4.tgz#8772fcd0418e3cd2cc171555d73007415051f4b2" + +"@types/q@*": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.0.tgz#87567ea1206935405e51c03635b6cbf3a01f7bc4" + +"@types/qrcode@0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@types/qrcode/-/qrcode-0.8.1.tgz#5776cb5da299cfa7cee2610f59997acad90ad38d" + dependencies: + "@types/node" "*" + +"@types/range-parser@*": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.2.tgz#fa8e1ad1d474688a757140c91de6dace6f4abc8d" + +"@types/ratelimiter@2.1.28": + version "2.1.28" + resolved "https://registry.yarnpkg.com/@types/ratelimiter/-/ratelimiter-2.1.28.tgz#cf6371e6d9b1d236e3f0b25889a6d52aed2e0e22" + dependencies: + "@types/redis" "*" + +"@types/redis@*", "@types/redis@2.8.6": + version "2.8.6" + resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.6.tgz#3674d07a13ad76bccda4c37dc3909e4e95757e7e" + dependencies: + "@types/events" "*" + "@types/node" "*" + +"@types/relateurl@*": + version "0.2.28" + resolved "https://registry.yarnpkg.com/@types/relateurl/-/relateurl-0.2.28.tgz#6bda7db8653fa62643f5ee69e9f69c11a392e3a6" + +"@types/request-promise-native@1.0.14": + version "1.0.14" + resolved "https://registry.yarnpkg.com/@types/request-promise-native/-/request-promise-native-1.0.14.tgz#20f2ba136e6f29c2ea745c60767738d434793d31" + dependencies: + "@types/request" "*" + +"@types/request@*": + version "2.47.1" + resolved "https://registry.yarnpkg.com/@types/request/-/request-2.47.1.tgz#25410d3afbdac04c91a94ad9efc9824100735824" + dependencies: + "@types/caseless" "*" + "@types/form-data" "*" + "@types/node" "*" + "@types/tough-cookie" "*" + +"@types/request@2.47.0": + version "2.47.0" + resolved "https://registry.yarnpkg.com/@types/request/-/request-2.47.0.tgz#76a666cee4cb85dcffea6cd4645227926d9e114e" + dependencies: + "@types/caseless" "*" + "@types/form-data" "*" + "@types/node" "*" + "@types/tough-cookie" "*" + +"@types/rimraf@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.2.tgz#7f0fc3cf0ff0ad2a99bb723ae1764f30acaf8b6e" + dependencies: + "@types/glob" "*" + "@types/node" "*" + +"@types/rx-core-binding@*": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/rx-core-binding/-/rx-core-binding-4.0.4.tgz#d969d32f15a62b89e2862c17b3ee78fe329818d3" + dependencies: + "@types/rx-core" "*" + +"@types/rx-core@*": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/rx-core/-/rx-core-4.0.3.tgz#0b3354b1238cedbe2b74f6326f139dbc7a591d60" + +"@types/rx-lite-aggregates@*": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/rx-lite-aggregates/-/rx-lite-aggregates-4.0.3.tgz#6efb2b7f3d5f07183a1cb2bd4b1371d7073384c2" + dependencies: + "@types/rx-lite" "*" + +"@types/rx-lite-async@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/rx-lite-async/-/rx-lite-async-4.0.2.tgz#27fbf0caeff029f41e2d2aae638b05e91ceb600c" + dependencies: + "@types/rx-lite" "*" + +"@types/rx-lite-backpressure@*": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/rx-lite-backpressure/-/rx-lite-backpressure-4.0.3.tgz#05abb19bdf87cc740196c355e5d0b37bb50b5d56" + dependencies: + "@types/rx-lite" "*" + +"@types/rx-lite-coincidence@*": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/rx-lite-coincidence/-/rx-lite-coincidence-4.0.3.tgz#80bd69acc4054a15cdc1638e2dc8843498cd85c0" + dependencies: + "@types/rx-lite" "*" + +"@types/rx-lite-experimental@*": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/rx-lite-experimental/-/rx-lite-experimental-4.0.1.tgz#c532f5cbdf3f2c15da16ded8930d1b2984023cbd" + dependencies: + "@types/rx-lite" "*" + +"@types/rx-lite-joinpatterns@*": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/rx-lite-joinpatterns/-/rx-lite-joinpatterns-4.0.1.tgz#f70fe370518a8432f29158cc92ffb56b4e4afc3e" + dependencies: + "@types/rx-lite" "*" + +"@types/rx-lite-testing@*": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/rx-lite-testing/-/rx-lite-testing-4.0.1.tgz#21b19d11f4dfd6ffef5a9d1648e9c8879bfe21e9" + dependencies: + "@types/rx-lite-virtualtime" "*" + +"@types/rx-lite-time@*": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/rx-lite-time/-/rx-lite-time-4.0.3.tgz#0eda65474570237598f3448b845d2696f2dbb1c4" + dependencies: + "@types/rx-lite" "*" + +"@types/rx-lite-virtualtime@*": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/rx-lite-virtualtime/-/rx-lite-virtualtime-4.0.3.tgz#4b30cacd0fe2e53af29f04f7438584c7d3959537" + dependencies: + "@types/rx-lite" "*" + +"@types/rx-lite@*": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/rx-lite/-/rx-lite-4.0.5.tgz#b3581525dff69423798daa9a0d33c1e66a5e8c4c" + dependencies: + "@types/rx-core" "*" + "@types/rx-core-binding" "*" + +"@types/rx@*": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@types/rx/-/rx-4.1.1.tgz#598fc94a56baed975f194574e0f572fd8e627a48" + dependencies: + "@types/rx-core" "*" + "@types/rx-core-binding" "*" + "@types/rx-lite" "*" + "@types/rx-lite-aggregates" "*" + "@types/rx-lite-async" "*" + "@types/rx-lite-backpressure" "*" + "@types/rx-lite-coincidence" "*" + "@types/rx-lite-experimental" "*" + "@types/rx-lite-joinpatterns" "*" + "@types/rx-lite-testing" "*" + "@types/rx-lite-time" "*" + "@types/rx-lite-virtualtime" "*" + +"@types/seedrandom@2.4.27": + version "2.4.27" + resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-2.4.27.tgz#9db563937dd86915f69092bc43259d2f48578e41" + +"@types/serve-static@*": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" + dependencies: + "@types/express-serve-static-core" "*" + "@types/mime" "*" + +"@types/single-line-log@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@types/single-line-log/-/single-line-log-1.1.0.tgz#7e6fc4e8e785f5f5ab11157418df2684a21ed971" + +"@types/speakeasy@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/speakeasy/-/speakeasy-2.0.2.tgz#153ec3636eea0562209b0a2f1fdf8b479286919b" + +"@types/tapable@*": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.2.tgz#e13182e1b69871a422d7863e11a4a6f5b814a4bd" + +"@types/through2@*": + version "2.0.33" + resolved "https://registry.yarnpkg.com/@types/through2/-/through2-2.0.33.tgz#1ff2e88a100dfb5b140e7bb98791f1194400d131" + dependencies: + "@types/node" "*" + +"@types/through@*": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.29.tgz#72943aac922e179339c651fa34a4428a4d722f93" + dependencies: + "@types/node" "*" + +"@types/tmp@0.0.33": + version "0.0.33" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d" + +"@types/tough-cookie@*": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.3.tgz#7f226d67d654ec9070e755f46daebf014628e9d9" + +"@types/uglify-js@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.2.tgz#f30c75458d18e8ee885c792c04adcb78a13bc286" + dependencies: + source-map "^0.6.1" + +"@types/uglify-js@^2": + version "2.6.31" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-2.6.31.tgz#c694755eeb6a1bb9f8f321f3ec37cc22ca4c4f6b" + dependencies: + source-map "^0.6.1" + +"@types/uuid@3.4.3": + version "3.4.3" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.3.tgz#121ace265f5569ce40f4f6d0ff78a338c732a754" + dependencies: + "@types/node" "*" + +"@types/vinyl@*": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/vinyl/-/vinyl-2.0.2.tgz#4f3b8dae8f5828d3800ef709b0cff488ee852de3" + dependencies: + "@types/node" "*" + +"@types/webpack-stream@3.2.10": + version "3.2.10" + resolved "https://registry.yarnpkg.com/@types/webpack-stream/-/webpack-stream-3.2.10.tgz#eed8389a60d9928b357aa6d13599428d2c4889e7" + dependencies: + "@types/node" "*" + "@types/webpack" "*" + +"@types/webpack@*", "@types/webpack@4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.4.0.tgz#c0551b772be241d786c0548812dd75a932f8efb4" + dependencies: + "@types/node" "*" + "@types/tapable" "*" + "@types/uglify-js" "*" + source-map "^0.6.0" + +"@types/websocket@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-0.0.39.tgz#aa971e24f9c1455fe2a57ee3e69c7d395016b12a" + dependencies: + "@types/events" "*" + "@types/node" "*" + +"@types/ws@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-5.1.1.tgz#4adc1f1a5e92e7e0e95658fb35c7eab1bc52f4ac" + dependencies: + "@types/events" "*" + "@types/node" "*" + +"@vue/component-compiler-utils@^1.2.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-1.3.1.tgz#686f0b913d59590ae327b2a1cb4b6d9b931bbe0e" + dependencies: + consolidate "^0.15.1" + hash-sum "^1.0.2" + lru-cache "^4.1.2" + merge-source-map "^1.1.0" + postcss "^6.0.20" + postcss-selector-parser "^3.1.1" + prettier "^1.13.0" + source-map "^0.5.6" + vue-template-es2015-compiler "^1.6.0" + +"@webassemblyjs/ast@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.4.3.tgz#3b3f6fced944d8660273347533e6d4d315b5934a" + dependencies: + "@webassemblyjs/helper-wasm-bytecode" "1.4.3" + "@webassemblyjs/wast-parser" "1.4.3" + debug "^3.1.0" + webassemblyjs "1.4.3" + +"@webassemblyjs/floating-point-hex-parser@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.4.3.tgz#f5aee4c376a717c74264d7bacada981e7e44faad" + +"@webassemblyjs/helper-buffer@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.4.3.tgz#0434b55958519bf503697d3824857b1dea80b729" + dependencies: + debug "^3.1.0" + +"@webassemblyjs/helper-code-frame@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.4.3.tgz#f1349ca3e01a8e29ee2098c770773ef97af43641" + dependencies: + "@webassemblyjs/wast-printer" "1.4.3" + +"@webassemblyjs/helper-fsm@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.4.3.tgz#65a921db48fb43e868f17b27497870bdcae22b79" + +"@webassemblyjs/helper-wasm-bytecode@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.4.3.tgz#0e5b4b5418e33f8a26e940b7809862828c3721a5" + +"@webassemblyjs/helper-wasm-section@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.4.3.tgz#9ceedd53a3f152c3412e072887ade668d0b1acbf" + dependencies: + "@webassemblyjs/ast" "1.4.3" + "@webassemblyjs/helper-buffer" "1.4.3" + "@webassemblyjs/helper-wasm-bytecode" "1.4.3" + "@webassemblyjs/wasm-gen" "1.4.3" + debug "^3.1.0" + +"@webassemblyjs/leb128@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.4.3.tgz#5a5e5949dbb5adfe3ae95664d0439927ac557fb8" + dependencies: + leb "^0.3.0" + +"@webassemblyjs/validation@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/validation/-/validation-1.4.3.tgz#9e66c9b3079d7bbcf2070c1bf52a54af2a09aac9" + dependencies: + "@webassemblyjs/ast" "1.4.3" + +"@webassemblyjs/wasm-edit@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.4.3.tgz#87febd565e0ffb5ae25f6495bb3958d17aa0a779" + dependencies: + "@webassemblyjs/ast" "1.4.3" + "@webassemblyjs/helper-buffer" "1.4.3" + "@webassemblyjs/helper-wasm-bytecode" "1.4.3" + "@webassemblyjs/helper-wasm-section" "1.4.3" + "@webassemblyjs/wasm-gen" "1.4.3" + "@webassemblyjs/wasm-opt" "1.4.3" + "@webassemblyjs/wasm-parser" "1.4.3" + "@webassemblyjs/wast-printer" "1.4.3" + debug "^3.1.0" + +"@webassemblyjs/wasm-gen@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.4.3.tgz#8553164d0154a6be8f74d653d7ab355f73240aa4" + dependencies: + "@webassemblyjs/ast" "1.4.3" + "@webassemblyjs/helper-wasm-bytecode" "1.4.3" + "@webassemblyjs/leb128" "1.4.3" + +"@webassemblyjs/wasm-opt@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.4.3.tgz#26c7a23bfb136aa405b1d3410e63408ec60894b8" + dependencies: + "@webassemblyjs/ast" "1.4.3" + "@webassemblyjs/helper-buffer" "1.4.3" + "@webassemblyjs/wasm-gen" "1.4.3" + "@webassemblyjs/wasm-parser" "1.4.3" + debug "^3.1.0" + +"@webassemblyjs/wasm-parser@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.4.3.tgz#7ddd3e408f8542647ed612019cfb780830993698" + dependencies: + "@webassemblyjs/ast" "1.4.3" + "@webassemblyjs/helper-wasm-bytecode" "1.4.3" + "@webassemblyjs/leb128" "1.4.3" + "@webassemblyjs/wasm-parser" "1.4.3" + webassemblyjs "1.4.3" + +"@webassemblyjs/wast-parser@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.4.3.tgz#3250402e2c5ed53dbe2233c9de1fe1f9f0d51745" + dependencies: + "@webassemblyjs/ast" "1.4.3" + "@webassemblyjs/floating-point-hex-parser" "1.4.3" + "@webassemblyjs/helper-code-frame" "1.4.3" + "@webassemblyjs/helper-fsm" "1.4.3" + long "^3.2.0" + webassemblyjs "1.4.3" + +"@webassemblyjs/wast-printer@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.4.3.tgz#3d59aa8d0252d6814a3ef4e6d2a34c9ded3904e0" + dependencies: + "@webassemblyjs/ast" "1.4.3" + "@webassemblyjs/wast-parser" "1.4.3" + long "^3.2.0" + +abab@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +accepts@^1.2.2, accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + +accord@^0.26.3: + version "0.26.4" + resolved "https://registry.yarnpkg.com/accord/-/accord-0.26.4.tgz#fc4c8d3ebab406a07cb28819b859651c44a92e80" + dependencies: + convert-source-map "^1.2.0" + glob "^7.0.5" + indx "^0.2.3" + lodash.clone "^4.3.2" + lodash.defaults "^4.0.1" + lodash.flatten "^4.2.0" + lodash.merge "^4.4.0" + lodash.partialright "^4.1.4" + lodash.pick "^4.2.1" + lodash.uniq "^4.3.0" + resolve "^1.1.7" + semver "^5.3.0" + uglify-js "^2.7.0" + when "^3.7.7" + +acorn-dynamic-import@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" + dependencies: + acorn "^5.0.0" + +acorn-globals@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + dependencies: + acorn "^4.0.4" + +acorn-globals@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" + dependencies: + acorn "^5.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@5.X, acorn@^5.0.0, acorn@^5.0.3, acorn@^5.3.0, acorn@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" + +acorn@^3.0.4, acorn@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^4.0.4, acorn@~4.0.2: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + +agent-base@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.0.tgz#9838b5c3392b962bad031e6a4c5e1024abec45ce" + dependencies: + es6-promisify "^5.0.0" + +agentkeepalive@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.4.1.tgz#aa95aebc3a749bca5ed53e3880a09f5235b48f0c" + dependencies: + humanize-ms "^1.2.1" + +ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + +ajv-keywords@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" + +ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ajv@^6.1.0: + version "6.5.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.1.tgz#88ebc1263c7133937d108b80c5572e64e1d9322d" + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.1" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +animejs@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/animejs/-/animejs-2.2.0.tgz#35eefdfc535b81949c9cb06f0b3e60c02e6fdc80" + +ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + dependencies: + ansi-wrap "^0.1.0" + +ansi-cyan@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" + dependencies: + ansi-wrap "0.1.0" + +ansi-escapes@^1.0.0, ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-escapes@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" + +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + dependencies: + ansi-wrap "0.1.0" + +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + dependencies: + ansi-wrap "0.1.0" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + +ansi-styles@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" + +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + +any-observable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" + +any-promise@^1.0.0, any-promise@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +"apparatus@>= 0.0.9": + version "0.0.10" + resolved "https://registry.yarnpkg.com/apparatus/-/apparatus-0.0.10.tgz#81ea756772ada77863db54ceee8202c109bdca3e" + dependencies: + sylvester ">= 0.0.8" + +append-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" + dependencies: + buffer-equal "^1.0.0" + +append-field@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/append-field/-/append-field-0.1.0.tgz#6ddc58fa083c7bc545d3c5995b2830cc2366d44a" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +archive-type@^3.0.0, archive-type@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-3.2.0.tgz#9cd9c006957ebe95fadad5bd6098942a813737f6" + dependencies: + file-type "^3.1.0" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" + dependencies: + arr-flatten "^1.0.1" + array-slice "^0.2.3" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +arr-union@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + +array-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + +array-find-index@^1.0.1, array-find-index@^1.0.2: + 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-map@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + +array-parallel@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/array-parallel/-/array-parallel-0.1.3.tgz#8f785308926ed5aa478c47e64d1b334b6c0c947d" + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + +array-series@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/array-series/-/array-series-0.1.5.tgz#df5d37bfc5c2ef0755e2aa4f92feae7d4b5a972f" + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + +array-slice@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" + +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.0, array-uniq@^1.0.1, array-uniq@^1.0.2: + 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" + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asap@^2.0.0, asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1.js@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.0.1.tgz#7668b56416953f0ce3421adbb3893ace59c96f59" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + +ast-types@0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.10.1.tgz#f52fca9715579a14f841d67d7f8d25432ab6a3dd" + +ast-types@0.11.5: + version "0.11.5" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.5.tgz#9890825d660c03c28339f315e9fa0a360e31ec28" + +async-each-series@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-1.1.0.tgz#f42fd8155d38f21a5b8ea07c28e063ed1700b138" + +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-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + +async-validator@~1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.8.2.tgz#b77597226e96242f8d531c0d46ae295f62422ba4" + dependencies: + babel-runtime "6.x" + +async@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.5.0, async@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + dependencies: + lodash "^4.17.10" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +atob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" + +autoprefixer@^6.3.1: + version "6.7.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" + dependencies: + browserslist "^1.7.6" + caniuse-db "^1.0.30000634" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^5.2.16" + postcss-value-parser "^3.2.3" + +autosize@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/autosize/-/autosize-4.0.2.tgz#073cfd07c8bf45da4b9fd153437f5bafbba1e4c9" + +autwh@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/autwh/-/autwh-0.1.0.tgz#24a5300923309d105133401a2568f9c8ab7d7e03" + dependencies: + oauth "0.9.15" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.2.1, aws4@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" + +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-bindify-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-explode-class@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" + dependencies: + babel-helper-bindify-decorators "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-vue-jsx-merge-props@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-async-generators@^6.5.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + +babel-plugin-syntax-class-constructor-call@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" + +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + +babel-plugin-syntax-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-export-extensions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" + +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-generator-functions@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-generators "^6.5.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-class-constructor-call@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" + dependencies: + babel-plugin-syntax-class-constructor-call "^6.18.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-class-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" + dependencies: + babel-helper-function-name "^6.24.1" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" + dependencies: + babel-helper-explode-class "^6.24.1" + babel-plugin-syntax-decorators "^6.13.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-export-extensions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" + dependencies: + babel-plugin-syntax-export-extensions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-flow-strip-types@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-regenerator@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-preset-es2015@^6.9.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-preset-stage-1@^6.5.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" + dependencies: + babel-plugin-transform-class-constructor-call "^6.24.1" + babel-plugin-transform-export-extensions "^6.22.0" + babel-preset-stage-2 "^6.24.1" + +babel-preset-stage-2@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-plugin-transform-class-properties "^6.24.1" + babel-plugin-transform-decorators "^6.24.1" + babel-preset-stage-3 "^6.24.1" + +babel-preset-stage-3@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-generator-functions "^6.24.1" + babel-plugin-transform-async-to-generator "^6.24.1" + babel-plugin-transform-exponentiation-operator "^6.24.1" + babel-plugin-transform-object-rest-spread "^6.22.0" + +babel-register@^6.26.0, babel-register@^6.9.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@6.x, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.17.3, babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + +babylon@^7.0.0-beta.47: + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.47.tgz#6d1fa44f0abec41ab7c780481e62fd9aafbdea80" + +balanced-match@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base32.js@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/base32.js/-/base32.js-0.0.1.tgz#d045736a57b1f6c139f0c7df42518a84e91bb2ba" + +base64-js@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +bcryptjs@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" + +beeper@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + +bin-build@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-2.2.0.tgz#11f8dd61f70ffcfa2bdcaa5b46f5e8fedd4221cc" + dependencies: + archive-type "^3.0.1" + decompress "^3.0.0" + download "^4.1.2" + exec-series "^1.0.0" + rimraf "^2.2.6" + tempfile "^1.0.0" + url-regex "^3.0.0" + +bin-check@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-2.0.0.tgz#86f8e6f4253893df60dc316957f5af02acb05930" + dependencies: + executable "^1.0.0" + +bin-version-check@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-2.1.0.tgz#e4e5df290b9069f7d111324031efc13fdd11a5b0" + dependencies: + bin-version "^1.0.0" + minimist "^1.1.0" + semver "^4.0.3" + semver-truncate "^1.0.0" + +bin-version@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-1.0.4.tgz#9eb498ee6fd76f7ab9a7c160436f89579435d78e" + dependencies: + find-versions "^1.0.0" + +bin-wrapper@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-3.0.2.tgz#67d3306262e4b1a5f2f88ee23464f6a655677aeb" + dependencies: + bin-check "^2.0.0" + bin-version-check "^2.1.0" + download "^4.0.0" + each-async "^1.1.1" + lazy-req "^1.0.0" + os-filter-obj "^1.0.0" + +binary-extensions@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + +binaryextensions@2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935" + +bl@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.0.5, bluebird@^3.1.1, bluebird@^3.4.1, bluebird@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + +body-parser@1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.1" + http-errors "~1.6.2" + iconv-lite "0.4.19" + on-finished "~2.3.0" + qs "6.5.1" + raw-body "2.3.2" + type-is "~1.6.15" + +body-parser@^1.12.2: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + +bootstrap-vue@2.0.0-rc.6: + version "2.0.0-rc.6" + resolved "https://registry.yarnpkg.com/bootstrap-vue/-/bootstrap-vue-2.0.0-rc.6.tgz#12d0a241414f1efd647e8b14a88c51707c920c86" + dependencies: + bootstrap "^4.0.0" + lodash.get "^4.4.2" + lodash.startcase "^4.4.0" + opencollective "^1.0.3" + popper.js "^1.12.9" + vue-functional-data-merge "^2.0.5" + +bootstrap@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.1.1.tgz#3aec85000fa619085da8d2e4983dfd67cf2114cb" + +brace-expansion@^1.0.0, brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.0, braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + +browser-process-hrtime@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.1.tgz#3343124db6d7ad53e26a8826318712bdc8450f9c" + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + dependencies: + pako "~1.0.5" + +browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: + version "1.7.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" + dependencies: + caniuse-db "^1.0.30000639" + electron-to-chromium "^1.2.7" + +bson@~1.0.4: + version "1.0.9" + resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.9.tgz#12319f8323b1254739b7c6bef8d3e89ae05a2f57" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + +buffer-alloc@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + +buffer-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + +buffer-from@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-0.1.2.tgz#15f4b9bcef012044df31142c14333caf6e0260d0" + +buffer-from@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" + +buffer-shims@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +buffer-to-vinyl@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz#00f15faee3ab7a1dda2cde6d9121bffdd07b2262" + dependencies: + file-type "^3.1.0" + readable-stream "^2.0.2" + uuid "^2.0.1" + vinyl "^1.0.0" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + +buffer@^4.3.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +bufferstreams@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-1.1.3.tgz#a8515ac024fa90e8fa7d58c11b13dea1f28abe72" + dependencies: + readable-stream "^2.0.2" + +builtin-modules@^1.0.0, builtin-modules@^1.1.1: + 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" + +busboy@^0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" + dependencies: + dicer "0.2.5" + readable-stream "1.1.x" + +bytes@3.0.0, bytes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + +bytes@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.5.0.tgz#4c9423ea2d252c270c41b2bdefeff9bb6b62c06a" + +cacache@^10.0.4: + version "10.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^2.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^5.2.4" + unique-filename "^1.1.0" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cacheable-request@^2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" + dependencies: + clone-response "1.0.2" + get-stream "3.0.0" + http-cache-semantics "3.8.1" + keyv "3.0.0" + lowercase-keys "1.0.0" + normalize-url "2.0.1" + responselike "1.0.2" + +cafy@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/cafy/-/cafy-8.0.0.tgz#8f6ce8556d64ee145c5cdc79b5b68f7fc57ee46f" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + +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" + +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +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" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +can-promise@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/can-promise/-/can-promise-0.0.1.tgz#7a7597ad801fb14c8b22341dfec314b6bd6ad8d3" + dependencies: + window-or-global "^1.0.1" + +caniuse-api@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" + dependencies: + browserslist "^1.3.6" + caniuse-db "^1.0.30000529" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: + version "1.0.30000856" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000856.tgz#fbebb99abe15a5654fc7747ebb5315bdfde3358f" + +capture-stack-trace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +caw@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/caw/-/caw-1.2.0.tgz#ffb226fe7efc547288dc62ee3e97073c212d1034" + dependencies: + get-proxy "^1.0.1" + is-obj "^1.0.0" + object-assign "^3.0.0" + tunnel-agent "^0.4.0" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" + dependencies: + ansi-styles "^3.2.0" + escape-string-regexp "^1.0.5" + supports-color "^5.2.0" + +chalk@2.4.1, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.2.0, chalk@^2.3.0, chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" + dependencies: + ansi-styles "~1.0.0" + has-color "~0.1.0" + strip-ansi "~0.1.0" + +character-parser@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" + dependencies: + is-regex "^1.0.3" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + +cheerio-httpcli@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cheerio-httpcli/-/cheerio-httpcli-0.7.2.tgz#346d41b0f00f01aaa2da8d5e7efb3f806fb277a3" + dependencies: + "@types/cheerio" "^0.22.5" + "@types/node" "^8.0.47" + async "^2.5.0" + cheerio "^0.22.0" + colors "^1.1.2" + foreach "^2.0.5" + he "^1.1.1" + iconv-lite "^0.4.19" + jschardet "^1.6.0" + object-assign "^4.1.1" + os-locale "^2.1.0" + prettyjson "^1.2.1" + request "^2.83.0" + require-uncached "^1.0.3" + rsvp "^4.7.0" + spawn-sync "^1.0.15" + tough-cookie "^2.3.3" + type-of "^2.0.1" + valid-url "^1.0.9" + yargs "^10.0.3" + +cheerio@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash.assignin "^4.0.9" + lodash.bind "^4.1.4" + lodash.defaults "^4.0.1" + lodash.filter "^4.4.0" + lodash.flatten "^4.2.0" + lodash.foreach "^4.3.0" + lodash.map "^4.4.0" + lodash.merge "^4.4.0" + lodash.pick "^4.2.1" + lodash.reduce "^4.4.0" + lodash.reject "^4.4.0" + lodash.some "^4.4.0" + +chokidar@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +chokidar@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176" + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^2.1.1" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + upath "^1.0.0" + optionalDependencies: + fsevents "^1.1.2" + +chownr@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + +chrome-trace-event@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-0.1.3.tgz#d395af2d31c87b90a716c831fe326f69768ec084" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + +clap@^1.0.9: + version "1.2.3" + resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" + dependencies: + chalk "^1.1.3" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-css@4.1.x, clean-css@^4.1.11: + version "4.1.11" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a" + dependencies: + source-map "0.5.x" + +cli-cursor@^1.0.2: + 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-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-spinners@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" + +cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + dependencies: + slice-ansi "0.0.4" + string-width "^1.0.1" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + 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" + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + +clone-deep@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" + dependencies: + for-own "^1.0.0" + is-plain-object "^2.0.4" + kind-of "^6.0.0" + shallow-clone "^1.0.0" + +clone-response@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + dependencies: + mimic-response "^1.0.0" + +clone-stats@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + +clone@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + +clone@^1.0.0, clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + +clone@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" + +cloneable-readable@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65" + dependencies: + inherits "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" + +co-body@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/co-body/-/co-body-5.2.0.tgz#5a0a658c46029131e0e3a306f67647302f71c124" + dependencies: + inflation "^2.0.0" + qs "^6.4.0" + raw-body "^2.2.0" + type-is "^1.6.14" + +co-body@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.0.0.tgz#965b9337d7f5655480787471f4237664820827e3" + dependencies: + inflation "^2.0.0" + qs "^6.5.2" + raw-body "^2.3.3" + type-is "^1.6.16" + +co@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +coa@~1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" + dependencies: + q "^1.1.2" + +coa@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.1.tgz#f3f8b0b15073e35d70263fb1042cb2c023db38af" + dependencies: + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.3.0, color-convert@^1.9.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" + dependencies: + color-name "1.1.1" + +color-name@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" + +color-name@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +color-string@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" + dependencies: + color-name "^1.0.0" + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + +color@^0.11.0: + version "0.11.4" + resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" + dependencies: + clone "^1.0.2" + color-convert "^1.3.0" + color-string "^0.3.0" + +colormin@^1.0.5: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" + dependencies: + color "^0.11.0" + css-color-names "0.0.4" + has "^1.0.1" + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +colors@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.0.tgz#5f20c9fef6945cb1134260aab33bfbdc8295e04e" + +colors@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +commander@2.15.1, commander@2.15.x, commander@^2.11.0, commander@^2.12.1, commander@^2.7.1, commander@^2.9.0, commander@~2.15.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + +commander@~2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" + dependencies: + graceful-readlink ">= 1.0.0" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +compressible@^2.0.0: + version "2.0.14" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7" + dependencies: + mime-db ">= 1.34.0 < 2" + +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.4.6, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +condense-newlines@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/condense-newlines/-/condense-newlines-0.2.1.tgz#3de985553139475d32502c83b02f60684d24c55f" + dependencies: + extend-shallow "^2.0.1" + is-whitespace "^0.3.0" + kind-of "^3.0.2" + +config-chain@~1.1.5: + version "1.1.11" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2" + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +console-stream@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44" + +consolidate@^0.15.0, consolidate@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" + dependencies: + bluebird "^3.1.1" + +constantinople@^3.0.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647" + dependencies: + "@types/babel-types" "^7.0.0" + "@types/babylon" "^6.16.2" + babel-types "^6.26.0" + babylon "^6.18.0" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + +content-disposition@0.5.2, content-disposition@~0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-type@^1.0.0, content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + +convert-source-map@1.X, convert-source-map@^1.1.1, convert-source-map@^1.2.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +cookies@~0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.7.1.tgz#7c8a615f5481c61ab9f16c833731bcb8f663b99b" + dependencies: + depd "~1.1.1" + keygrip "~1.0.2" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + +copy-to@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5" + +core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0: + version "2.5.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + +core-util-is@1.0.2, 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" + +crc-32@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.1.0" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-error-class@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cropperjs@^1.1.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cropperjs/-/cropperjs-1.4.0.tgz#e9851559c590d148a10c17c36cdc8126acf01a2e" + +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.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-color-names@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + +css-loader@0.28.11: + version "0.28.11" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7" + dependencies: + babel-code-frame "^6.26.0" + css-selector-tokenizer "^0.7.0" + cssnano "^3.10.0" + icss-utils "^2.1.0" + loader-utils "^1.0.2" + lodash.camelcase "^4.3.0" + object-assign "^4.1.1" + postcss "^5.0.6" + postcss-modules-extract-imports "^1.2.0" + postcss-modules-local-by-default "^1.2.0" + postcss-modules-scope "^1.1.0" + postcss-modules-values "^1.3.0" + postcss-value-parser "^3.3.0" + source-list-map "^2.0.0" + +css-parse@1.7.x: + version "1.7.0" + resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b" + +css-select-base-adapter@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz#0102b3d14630df86c3eb9fa9f5456270106cf990" + +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-select@~1.3.0-rc0: + version "1.3.0-rc0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.3.0-rc0.tgz#6f93196aaae737666ea1036a8cb14a8fcb7a9231" + dependencies: + boolbase "^1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "^1.0.1" + +css-selector-tokenizer@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" + dependencies: + cssesc "^0.1.0" + fastparse "^1.1.1" + regexpu-core "^1.0.0" + +css-tree@1.0.0-alpha.29: + version "1.0.0-alpha.29" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-tree@1.0.0-alpha25: + version "1.0.0-alpha25" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha25.tgz#1bbfabfbf6eeef4f01d9108ff2edd0be2fe35597" + dependencies: + mdn-data "^1.0.0" + source-map "^0.5.3" + +css-url-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec" + +css-what@2.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" + +css@2.X, css@^2.2.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.3.tgz#f861f4ba61e79bedc962aa548e5780fd95cbc6be" + dependencies: + inherits "^2.0.1" + source-map "^0.1.38" + source-map-resolve "^0.5.1" + urix "^0.1.0" + +cssesc@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" + +cssnano@^3.0.0, cssnano@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" + dependencies: + autoprefixer "^6.3.1" + decamelize "^1.1.2" + defined "^1.0.0" + has "^1.0.1" + object-assign "^4.0.1" + postcss "^5.0.14" + postcss-calc "^5.2.0" + postcss-colormin "^2.1.8" + postcss-convert-values "^2.3.4" + postcss-discard-comments "^2.0.4" + postcss-discard-duplicates "^2.0.1" + postcss-discard-empty "^2.0.1" + postcss-discard-overridden "^0.1.1" + postcss-discard-unused "^2.2.1" + postcss-filter-plugins "^2.0.0" + postcss-merge-idents "^2.1.5" + postcss-merge-longhand "^2.0.1" + postcss-merge-rules "^2.0.3" + postcss-minify-font-values "^1.0.2" + postcss-minify-gradients "^1.0.1" + postcss-minify-params "^1.0.4" + postcss-minify-selectors "^2.0.4" + postcss-normalize-charset "^1.1.0" + postcss-normalize-url "^3.0.7" + postcss-ordered-values "^2.1.0" + postcss-reduce-idents "^2.2.2" + postcss-reduce-initial "^1.0.0" + postcss-reduce-transforms "^1.0.3" + postcss-svgo "^2.1.1" + postcss-unique-selectors "^2.0.2" + postcss-value-parser "^3.2.3" + postcss-zindex "^2.0.1" + +csso@^3.5.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" + dependencies: + css-tree "1.0.0-alpha.29" + +csso@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" + dependencies: + clap "^1.0.9" + source-map "^0.5.3" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.3.1 < 0.4.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.3.1.tgz#6da9b4cff1bc5d716e6e5fe8e04fcb1b50a49adf" + dependencies: + cssom "0.3.x" + +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" + +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +dargs@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" + dependencies: + abab "^1.0.4" + whatwg-mimetype "^2.0.0" + whatwg-url "^6.4.0" + +date-fns@^1.27.2: + version "1.29.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + +dateformat@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" + +dateformat@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" + +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + +debug-fabulous@1.X: + version "1.1.0" + resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-1.1.0.tgz#af8a08632465224ef4174a9f06308c3c2a1ebc8e" + dependencies: + debug "3.X" + memoizee "0.4.X" + object-assign "4.X" + +debug@*, debug@3.1.0, debug@3.X, debug@^3.0.0, debug@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +debug@0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" + +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.1, debug@^2.6.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +debuglog@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + +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" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + +decompress-response@^3.2.0, decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + dependencies: + mimic-response "^1.0.0" + +decompress-tar@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-3.1.0.tgz#217c789f9b94450efaadc5c5e537978fc333c466" + dependencies: + is-tar "^1.0.0" + object-assign "^2.0.0" + strip-dirs "^1.0.0" + tar-stream "^1.1.1" + through2 "^0.6.1" + vinyl "^0.4.3" + +decompress-tarbz2@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz#8b23935681355f9f189d87256a0f8bdd96d9666d" + dependencies: + is-bzip2 "^1.0.0" + object-assign "^2.0.0" + seek-bzip "^1.0.3" + strip-dirs "^1.0.0" + tar-stream "^1.1.1" + through2 "^0.6.1" + vinyl "^0.4.3" + +decompress-targz@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-3.1.0.tgz#b2c13df98166268991b715d6447f642e9696f5a0" + dependencies: + is-gzip "^1.0.0" + object-assign "^2.0.0" + strip-dirs "^1.0.0" + tar-stream "^1.1.1" + through2 "^0.6.1" + vinyl "^0.4.3" + +decompress-unzip@^3.0.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-3.4.0.tgz#61475b4152066bbe3fee12f9d629d15fe6478eeb" + dependencies: + is-zip "^1.0.0" + read-all-stream "^3.0.0" + stat-mode "^0.2.0" + strip-dirs "^1.0.0" + through2 "^2.0.0" + vinyl "^1.0.0" + yauzl "^2.2.1" + +decompress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/decompress/-/decompress-3.0.0.tgz#af1dd50d06e3bfc432461d37de11b38c0d991bed" + dependencies: + buffer-to-vinyl "^1.0.0" + concat-stream "^1.4.6" + decompress-tar "^3.0.0" + decompress-tarbz2 "^3.0.0" + decompress-targz "^3.0.0" + decompress-unzip "^3.0.0" + stream-combiner2 "^1.1.1" + vinyl-assign "^1.0.1" + vinyl-fs "^2.2.0" + +deep-equal@1.0.1, deep-equal@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + +deep-extend@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + +deep-is@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.2.tgz#9ced65ea0bc0b09f42a6d79c1b1903f9d913cc18" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +deepcopy@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/deepcopy/-/deepcopy-0.6.3.tgz#634780f2f8656ab771af8fa8431ed1ccee55c7b0" + +deepmerge@^1.2.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753" + +deepmerge@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.1.1.tgz#e862b4e45ea0555072bf51e7fd0d9845170ae768" + +defaults@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + +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" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + +depd@^1.1.0, depd@~1.1.1, depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + +deprecated@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@^1.0.3, destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-conflict@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/detect-conflict/-/detect-conflict-1.0.1.tgz#088657a66a961c05019db7c4230883b1c6b4176e" + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +detect-newline@2.X: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + +dezalgo@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + dependencies: + asap "^2.0.0" + wrappy "1" + +dicer@0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" + dependencies: + readable-stream "1.1.x" + streamsearch "0.1.2" + +diff@3.5.0, diff@^3.1.0, diff@^3.2.0, diff@^3.3.1, diff@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dijkstrajs@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.1.tgz#d3cd81221e3ea40742cfcde556d4e99e98ddc71b" + +dir-glob@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + +diskusage@0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/diskusage/-/diskusage-0.2.4.tgz#e956f7a1051e0c6a1af706154efe620a2ee432ec" + dependencies: + nan "^2.5.0" + +doctrine@^2.0.0, doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + dependencies: + esutils "^2.0.2" + +doctypes@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" + +dom-serializer@0, dom-serializer@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + +domelementtype@1, domelementtype@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + +domexception@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + dependencies: + webidl-conversions "^4.0.2" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + dependencies: + domelementtype "1" + +dompurify@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-1.0.4.tgz#b0655d07856c1ef76fd27ae18e8ab1174ed18819" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + dependencies: + is-obj "^1.0.0" + +double-ended-queue@^2.1.0-0: + version "2.1.0-0" + resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c" + +download@^4.0.0, download@^4.1.2: + version "4.4.3" + resolved "https://registry.yarnpkg.com/download/-/download-4.4.3.tgz#aa55fdad392d95d4b68e8c2be03e0c2aa21ba9ac" + dependencies: + caw "^1.0.1" + concat-stream "^1.4.7" + each-async "^1.0.0" + filenamify "^1.0.1" + got "^5.0.0" + gulp-decompress "^1.2.0" + gulp-rename "^1.2.0" + is-url "^1.2.0" + object-assign "^4.0.1" + read-all-stream "^3.0.0" + readable-stream "^2.0.2" + stream-combiner2 "^1.1.1" + vinyl "^1.0.0" + vinyl-fs "^2.2.0" + ware "^1.2.0" + +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + dependencies: + readable-stream "~1.1.9" + +duplexer2@^0.1.4, duplexer2@~0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + dependencies: + readable-stream "^2.0.2" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + +duplexify@^3.2.0, duplexify@^3.4.2, duplexify@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +each-async@^1.0.0, each-async@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/each-async/-/each-async-1.1.1.tgz#dee5229bdf0ab6ba2012a395e1b869abf8813473" + dependencies: + onetime "^1.0.0" + set-immediate-shim "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ecdsa-sig-formatter@1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz#1c595000f04a8897dfb85000892a0f4c33af86c3" + dependencies: + safe-buffer "^5.0.1" + +editions@^1.3.3: + version "1.3.4" + resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" + +editorconfig@^0.13.2: + version "0.13.3" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.13.3.tgz#e5219e587951d60958fd94ea9a9a008cdeff1b34" + dependencies: + bluebird "^3.0.5" + commander "^2.9.0" + lru-cache "^3.2.0" + semver "^5.1.0" + sigmund "^1.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +ejs@^2.5.9: + version "2.6.1" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" + +elasticsearch@15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/elasticsearch/-/elasticsearch-15.0.0.tgz#d888ceb858bba30221b68698d72c54bdcfdf2fba" + dependencies: + agentkeepalive "^3.4.1" + chalk "^1.0.0" + lodash "^4.17.10" + +electron-to-chromium@^1.2.7: + version "1.3.48" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz#d3b0d8593814044e092ece2108fc3ac9aea4b900" + +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + +element-ui@2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/element-ui/-/element-ui-2.3.9.tgz#0c5996e74b375f2665d703c68bdb3269ae9269e0" + dependencies: + async-validator "~1.8.1" + babel-helper-vue-jsx-merge-props "^2.0.0" + deepmerge "^1.2.0" + normalize-wheel "^1.0.1" + resize-observer-polyfill "^1.5.0" + throttle-debounce "^1.0.1" + +elliptic@^6.0.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emojilib@2.2.12: + version "2.2.12" + resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.2.12.tgz#29481fa5521ac5ed97a5cc0503901c3435d523fa" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + dependencies: + once "^1.4.0" + +end-of-stream@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" + dependencies: + once "~1.3.0" + +enhanced-resolve@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz#e34a6eaa790f62fccd71d93959f56b2b432db10a" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +entities@^1.1.1, entities@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + +envinfo@^5.7.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-5.10.0.tgz#503a9774ae15b93ea68bdfae2ccd6306624ea6df" + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +error-inject@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" + +error@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" + dependencies: + string-template "~0.2.1" + xtend "~4.0.0" + +es-abstract@^1.5.1, es-abstract@^1.6.1: + version "1.12.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + +es5-ext@^0.10.14, es5-ext@^0.10.30, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2: + version "0.10.45" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz#0bfdf7b473da5919d5adf3bd25ceb754fccc3653" + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "1" + +es6-iterator@^2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.2.1.tgz#ec56233868032909207170c39448e24449dd1fc4" + +es6-promise@^3.0.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + +es6-promise@^4.0.3, es6-promise@^4.1.1: + version "4.2.4" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + dependencies: + es6-promise "^4.0.3" + +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.2: + 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.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-regexp@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/escape-regexp/-/escape-regexp-0.0.1.tgz#f44bda12d45bbdf9cb7f862ee7e4827b3dd32254" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, 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" + +escodegen@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.10.0.tgz#f647395de22519fbd0d928ffcf1d17e0dec2603e" + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-plugin-vue@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-4.5.0.tgz#09d6597f4849e31a3846c2c395fccf17685b69c3" + dependencies: + vue-eslint-parser "^2.0.3" + +eslint-scope@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + +eslint@4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" + dependencies: + ajv "^5.3.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.4" + esquery "^1.0.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.0.1" + ignore "^3.3.3" + imurmurhash "^0.1.4" + inquirer "^3.0.6" + is-resolvable "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^1.0.1" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "4.0.2" + text-table "~0.2.0" + +espree@^3.5.2, espree@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + dependencies: + acorn "^5.5.0" + acorn-jsx "^3.0.0" + +esprima@^2.6.0: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esprima@^4.0.0, esprima@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +esquery@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.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" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + +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@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + +events@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exec-buffer@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/exec-buffer/-/exec-buffer-3.2.0.tgz#b1686dbd904c7cf982e652c1f5a79b1e5573082b" + dependencies: + execa "^0.7.0" + p-finally "^1.0.0" + pify "^3.0.0" + rimraf "^2.5.4" + tempfile "^2.0.0" + +exec-series@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/exec-series/-/exec-series-1.0.3.tgz#6d257a9beac482a872c7783bc8615839fc77143a" + dependencies: + async-each-series "^1.1.0" + object-assign "^4.1.0" + +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +executable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/executable/-/executable-1.1.0.tgz#877980e9112f3391066da37265de7ad8434ab4d9" + dependencies: + meow "^3.1.0" + +exif-js@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/exif-js/-/exif-js-2.3.0.tgz#9d10819bf571f873813e7640241255ab9ce1a814" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + +exit-on-epipe@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + dependencies: + homedir-polyfill "^1.0.1" + +express@^4.12.2: + version "4.16.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.2" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.3" + qs "6.5.1" + range-parser "~1.2.0" + safe-buffer "5.1.1" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" + dependencies: + kind-of "^1.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-1.3.0.tgz#d1516fb0ff5624d2ebf9123ea1dac5a1994004f8" + +extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +external-editor@^2.0.1, external-editor@^2.0.4, external-editor@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +fancy-log@1.3.2, fancy-log@^1.1.0, fancy-log@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + time-stamp "^1.0.0" + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + +fast-glob@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.2.tgz#71723338ac9b4e0e2fff1d6748a2a13d5ed352bf" + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.0.1" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.1" + micromatch "^3.1.10" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fastparse@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + dependencies: + pend "~1.2.0" + +figures@^1.3.5, figures@^1.7.0: + 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" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +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" + +file-loader@1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8" + dependencies: + loader-utils "^1.0.2" + schema-utils "^0.4.5" + +file-type@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.0.0.tgz#6e4bccc741187f4113334a4e4a4ef84d54d7cc1e" + +file-type@^3.1.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + +file-type@^4.1.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +filename-reserved-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4" + +filenamify@^1.0.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5" + dependencies: + filename-reserved-regex "^1.0.0" + strip-outer "^1.0.0" + trim-repeated "^1.0.0" + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^2.0.0" + +find-index@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^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" + +find-versions@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-1.2.1.tgz#cbde9f12e38575a0af1be1b9a2c5d5fd8f186b62" + dependencies: + array-uniq "^1.0.0" + get-stdin "^4.0.1" + meow "^3.5.0" + semver-regex "^1.0.0" + +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +fined@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" + dependencies: + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" + parse-filepath "^1.0.1" + +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + +first-chunk-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70" + dependencies: + readable-stream "^2.0.2" + +flagged-respawn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.0.tgz#4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7" + +flat-cache@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +flatten@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" + +flow-parser@^0.*: + version "0.74.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.74.0.tgz#4acc8f55bdce5fa4da43c72c28ef8a9600ace87c" + +flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.4" + +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + dependencies: + for-in "^1.0.1" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +form-data@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" + +format-util@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.3.tgz#032dca4a116262a12c43f4c3ec8566416c5b2d95" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2, fresh@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + +from2@^2.1.0, from2@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + +fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + dependencies: + minipass "^2.2.1" + +fs-mkdirp-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" + dependencies: + graceful-fs "^4.1.11" + through2 "^2.0.3" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0, fsevents@^1.1.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +fstream@^1.0.0, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +fuckadblock@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/fuckadblock/-/fuckadblock-3.2.1.tgz#17fa3237a5e15c86613406b911e608191a3e62e2" + +function-bind@^1.1.0, function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" + dependencies: + globule "~0.1.0" + +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + 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" + +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-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-paths@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/get-paths/-/get-paths-0.0.2.tgz#a9c27b1a8d006c931a4f26fcf7d1546e3ad71bea" + dependencies: + fs-extra "^4.0.2" + +get-proxy@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-1.1.0.tgz#894854491bc591b0f147d7ae570f5c678b7256eb" + dependencies: + rc "^1.1.2" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +get-stream@3.0.0, get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +gh-got@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gh-got/-/gh-got-6.0.0.tgz#d74353004c6ec466647520a10bd46f7299d268d0" + dependencies: + got "^7.0.0" + is-plain-obj "^1.1.0" + +gifsicle@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-3.0.4.tgz#f45cb5ed10165b665dc929e0e9328b6c821dfa3b" + dependencies: + bin-build "^2.0.0" + bin-wrapper "^3.0.0" + logalot "^2.0.0" + +github-username@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/github-username/-/github-username-4.1.0.tgz#cbe280041883206da4212ae9e4b5f169c30bf417" + dependencies: + gh-got "^6.0.0" + +glob-all@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-all/-/glob-all-3.1.0.tgz#8913ddfb5ee1ac7812656241b03d5217c64b02ab" + dependencies: + glob "^7.0.5" + yargs "~1.2.6" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob-parent@^3.0.0, glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-stream@^3.1.5: + version "3.1.18" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" + dependencies: + glob "^4.3.1" + glob2base "^0.0.12" + minimatch "^2.0.1" + ordered-read-streams "^0.1.0" + through2 "^0.6.1" + unique-stream "^1.0.0" + +glob-stream@^5.3.2: + version "5.3.5" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" + dependencies: + extend "^3.0.0" + glob "^5.0.3" + glob-parent "^3.0.0" + micromatch "^2.3.7" + ordered-read-streams "^0.3.0" + through2 "^0.6.0" + to-absolute-glob "^0.1.1" + unique-stream "^2.0.2" + +glob-stream@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" + dependencies: + extend "^3.0.0" + glob "^7.1.1" + glob-parent "^3.1.0" + is-negated-glob "^1.0.0" + ordered-read-streams "^1.0.0" + pumpify "^1.3.5" + readable-stream "^2.1.5" + remove-trailing-separator "^1.0.1" + to-absolute-glob "^2.0.0" + unique-stream "^2.0.2" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + +glob-watcher@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" + dependencies: + gaze "^0.5.1" + +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + dependencies: + find-index "^0.1.1" + +glob@7.0.x: + 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" + +glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^4.3.1: + version "4.5.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "^2.0.1" + once "^1.3.0" + +glob@^5.0.3: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@~3.1.21: + version "3.1.21" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" + dependencies: + graceful-fs "~1.2.0" + inherits "1" + minimatch "~0.2.11" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^11.0.1: + version "11.5.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +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" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^8.0.0, globby@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50" + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +globule@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + +globule@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" + dependencies: + glob "~3.1.21" + lodash "~1.0.1" + minimatch "~0.2.11" + +glogg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810" + dependencies: + sparkles "^1.0.0" + +gm@1.23.1: + version "1.23.1" + resolved "https://registry.yarnpkg.com/gm/-/gm-1.23.1.tgz#2edeeb958084d0f8ea7988e5d995b1c7dfc14777" + dependencies: + array-parallel "~0.1.3" + array-series "~0.1.5" + cross-spawn "^4.0.0" + debug "^3.1.0" + +got@^5.0.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" + dependencies: + create-error-class "^3.0.1" + duplexer2 "^0.1.4" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + node-status-codes "^1.0.0" + object-assign "^4.0.1" + parse-json "^2.1.0" + pinkie-promise "^2.0.0" + read-all-stream "^3.0.0" + readable-stream "^2.0.5" + timed-out "^3.0.0" + unzip-response "^1.0.2" + url-parse-lax "^1.0.0" + +got@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" + dependencies: + decompress-response "^3.2.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-plain-obj "^1.1.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + p-cancelable "^0.3.0" + p-timeout "^1.1.1" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + url-parse-lax "^1.0.0" + url-to-options "^1.0.1" + +got@^8.3.1: + version "8.3.1" + resolved "https://registry.yarnpkg.com/got/-/got-8.3.1.tgz#093324403d4d955f5a16a7a8d39955d055ae10ed" + dependencies: + "@sindresorhus/is" "^0.7.0" + cacheable-request "^2.1.1" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + into-stream "^3.1.0" + is-retry-allowed "^1.1.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + mimic-response "^1.0.0" + p-cancelable "^0.4.0" + p-timeout "^2.0.1" + pify "^3.0.0" + safe-buffer "^5.1.1" + timed-out "^4.0.1" + url-parse-lax "^3.0.0" + url-to-options "^1.0.1" + +graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +graceful-fs@^3.0.0: + version "3.0.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + dependencies: + natives "^1.1.0" + +graceful-fs@~1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +grouped-queue@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/grouped-queue/-/grouped-queue-0.3.3.tgz#c167d2a5319c5a0e0964ef6a25b7c2df8996c85c" + dependencies: + lodash "^4.17.2" + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + +gulp-cssnano@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/gulp-cssnano/-/gulp-cssnano-2.1.3.tgz#02007e2817af09b3688482b430ad7db807aebf72" + dependencies: + buffer-from "^1.0.0" + cssnano "^3.0.0" + object-assign "^4.0.1" + plugin-error "^1.0.1" + vinyl-sourcemaps-apply "^0.2.1" + +gulp-decompress@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gulp-decompress/-/gulp-decompress-1.2.0.tgz#8eeb65a5e015f8ed8532cafe28454960626f0dc7" + dependencies: + archive-type "^3.0.0" + decompress "^3.0.0" + gulp-util "^3.0.1" + readable-stream "^2.0.2" + +gulp-htmlmin@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/gulp-htmlmin/-/gulp-htmlmin-4.0.0.tgz#266feaed83588838aedda3666f67d057ec120313" + dependencies: + bufferstreams "^1.1.0" + html-minifier "^3.0.3" + plugin-error "^0.1.2" + readable-stream "^2.0.2" + tryit "^1.0.1" + +gulp-imagemin@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/gulp-imagemin/-/gulp-imagemin-4.1.0.tgz#5ce347f1d1706fed3cc8f1777ca9094a583b50b7" + dependencies: + chalk "^2.1.0" + fancy-log "^1.3.2" + imagemin "^5.3.1" + plugin-error "^0.1.2" + plur "^2.1.2" + pretty-bytes "^4.0.2" + through2-concurrent "^1.1.1" + optionalDependencies: + imagemin-gifsicle "^5.2.0" + imagemin-jpegtran "^5.0.2" + imagemin-optipng "^5.2.1" + imagemin-svgo "^6.0.0" + +gulp-mocha@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gulp-mocha/-/gulp-mocha-6.0.0.tgz#80f32bc705ce30747f355ddb8ccd96a1c73bef13" + dependencies: + dargs "^5.1.0" + execa "^0.10.0" + mocha "^5.2.0" + npm-run-path "^2.0.2" + plugin-error "^1.0.1" + supports-color "^5.4.0" + through2 "^2.0.3" + +gulp-pug@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/gulp-pug/-/gulp-pug-4.0.1.tgz#5c5bb38303a5a565add8b200e292b4a076cf2efa" + dependencies: + "@types/pug" "^2.0.4" + fancy-log "^1.3.2" + plugin-error "^1.0.1" + pug "^2.0.3" + replace-ext "^1.0.0" + through2 "^2.0.3" + +gulp-rename@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.3.tgz#37b75298e9d3e6c0fe9ac4eac13ce3be5434646b" + +gulp-rename@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.3.0.tgz#2e789d8f563ab0c924eeb62967576f37ff4cb826" + +gulp-replace@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulp-replace/-/gulp-replace-1.0.0.tgz#b32bd61654d97b8d78430a67b3e8ce067b7c9143" + dependencies: + istextorbinary "2.2.1" + readable-stream "^2.0.1" + replacestream "^4.0.0" + +gulp-sourcemaps@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c" + dependencies: + convert-source-map "^1.1.1" + graceful-fs "^4.1.2" + strip-bom "^2.0.0" + through2 "^2.0.0" + vinyl "^1.0.0" + +gulp-sourcemaps@2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.6.4.tgz#cbb2008450b1bcce6cd23bf98337be751bf6e30a" + dependencies: + "@gulp-sourcemaps/identity-map" "1.X" + "@gulp-sourcemaps/map-sources" "1.X" + acorn "5.X" + convert-source-map "1.X" + css "2.X" + debug-fabulous "1.X" + detect-newline "2.X" + graceful-fs "4.X" + source-map "~0.6.0" + strip-bom-string "1.X" + through2 "2.X" + +gulp-stylus@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/gulp-stylus/-/gulp-stylus-2.7.0.tgz#f3e932626004927b75ea27ff5c1d3b0ba0b7cbb1" + dependencies: + accord "^0.26.3" + lodash.assign "^3.2.0" + plugin-error "^0.1.2" + replace-ext "0.0.1" + stylus "^0.54.0" + through2 "^2.0.0" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-tslint@8.1.3: + version "8.1.3" + resolved "https://registry.yarnpkg.com/gulp-tslint/-/gulp-tslint-8.1.3.tgz#a89ed144038ae861ee7bfea9528272d126a93da1" + dependencies: + "@types/fancy-log" "1.3.0" + chalk "2.3.1" + fancy-log "1.3.2" + map-stream "~0.0.7" + plugin-error "1.0.1" + through "~2.3.8" + +gulp-typescript@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/gulp-typescript/-/gulp-typescript-4.0.2.tgz#80bb9e376e7aa87b763a6ad5fe054a5d078da1e6" + dependencies: + ansi-colors "^1.0.1" + plugin-error "^0.1.2" + source-map "^0.6.1" + through2 "^2.0.3" + vinyl "^2.1.0" + vinyl-fs "^3.0.0" + +gulp-uglify@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.0.tgz#0df0331d72a0d302e3e37e109485dddf33c6d1ca" + dependencies: + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash "^4.13.1" + make-error-cause "^1.1.1" + through2 "^2.0.0" + uglify-js "^3.0.5" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-util@3.0.8, gulp-util@^3.0.0, gulp-util@^3.0.1: + version "3.0.8" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^2.0.0" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulp@3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" + dependencies: + archy "^1.0.0" + chalk "^1.0.0" + deprecated "^0.0.1" + gulp-util "^3.0.0" + interpret "^1.0.0" + liftoff "^2.1.0" + minimist "^1.1.0" + orchestrator "^0.3.0" + pretty-hrtime "^1.0.0" + semver "^4.1.0" + tildify "^1.0.0" + v8flags "^2.0.2" + vinyl-fs "^0.3.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + dependencies: + glogg "^1.0.0" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +hard-source-webpack-plugin@0.6.10: + version "0.6.10" + resolved "https://registry.yarnpkg.com/hard-source-webpack-plugin/-/hard-source-webpack-plugin-0.6.10.tgz#bae18a97c12150d31fa9d5e40625c65b0b10034d" + dependencies: + lodash "^4.15.0" + mkdirp "^0.5.1" + node-object-hash "^1.2.0" + rimraf "^2.6.2" + tapable "^1.0.0-beta.5" + webpack-core "~0.6.0" + webpack-sources "^1.0.1" + write-json-file "^2.3.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-color@~0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + dependencies: + sparkles "^1.0.0" + +has-symbol-support-x@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + +has-to-string-tag-x@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" + dependencies: + has-symbol-support-x "^1.4.1" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash-sum@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.4.tgz#8b50e1f35d51bd01e5ed9ece4dbe3549ccfa0a3c" + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.0" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + +he@1.1.1, he@1.1.x, he@^1.1.0, he@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + +highlight.js@9.12.0: + version "9.12.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +hoek@4.x.x: + version "4.2.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.6.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" + +html-comment-regex@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + dependencies: + whatwg-encoding "^1.0.1" + +html-entities@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + +html-minifier@3.5.16, html-minifier@^3.0.3: + version "3.5.16" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.16.tgz#39f5aabaf78bdfc057fe67334226efd7f3851175" + dependencies: + camel-case "3.0.x" + clean-css "4.1.x" + commander "2.15.x" + he "1.1.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.3.x" + +htmlparser2@^3.9.1: + version "3.9.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" + dependencies: + domelementtype "^1.3.0" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^2.0.2" + +http-assert@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.3.0.tgz#a31a5cf88c873ecbb5796907d4d6f132e8c01e4a" + dependencies: + deep-equal "~1.0.1" + http-errors "~1.6.1" + +http-cache-semantics@3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + +http-errors@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-errors@1.6.3, http-errors@^1.2.8, http-errors@^1.3.1, http-errors@^1.6.1, http-errors@~1.6.1, http-errors@~1.6.2, http-errors@~1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-signature@1.2.0, http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http_ece@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/http_ece/-/http_ece-1.0.5.tgz#b60660faaf14215102d1493ea720dcd92b53372f" + dependencies: + urlsafe-base64 "~1.0.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + +https-proxy-agent@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" + dependencies: + agent-base "^4.1.0" + debug "^3.1.0" + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + dependencies: + ms "^2.0.0" + +humanize-number@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/humanize-number/-/humanize-number-0.0.2.tgz#11c0af6a471643633588588048f1799541489c18" + +iconv-lite@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +iconv-lite@0.4.23, iconv-lite@^0.4.17, iconv-lite@^0.4.19, iconv-lite@^0.4.4, iconv-lite@~0.4.13: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + +icss-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" + dependencies: + postcss "^6.0.1" + +ieee754@^1.1.4: + version "1.1.12" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + dependencies: + minimatch "^3.0.4" + +ignore@^3.3.3, ignore@^3.3.5: + version "3.3.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b" + +imagemin-gifsicle@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/imagemin-gifsicle/-/imagemin-gifsicle-5.2.0.tgz#3781524c457612ef04916af34241a2b42bfcb40a" + dependencies: + exec-buffer "^3.0.0" + gifsicle "^3.0.0" + is-gif "^1.0.0" + +imagemin-jpegtran@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/imagemin-jpegtran/-/imagemin-jpegtran-5.0.2.tgz#e6882263b8f7916fddb800640cf75d2e970d2ad6" + dependencies: + exec-buffer "^3.0.0" + is-jpg "^1.0.0" + jpegtran-bin "^3.0.0" + +imagemin-optipng@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz#d22da412c09f5ff00a4339960b98a88b1dbe8695" + dependencies: + exec-buffer "^3.0.0" + is-png "^1.0.0" + optipng-bin "^3.0.0" + +imagemin-svgo@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/imagemin-svgo/-/imagemin-svgo-6.0.0.tgz#2dd8c82946be42a8e2cbcae3c5bf007bc2b8b9e8" + dependencies: + buffer-from "^0.1.1" + is-svg "^2.0.0" + svgo "^1.0.0" + +imagemin@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/imagemin/-/imagemin-5.3.1.tgz#f19c2eee1e71ba6c6558c515f9fc96680189a6d4" + dependencies: + file-type "^4.1.0" + globby "^6.1.0" + make-dir "^1.0.0" + p-pipe "^1.1.0" + pify "^2.3.0" + replace-ext "^1.0.0" + +import-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" + dependencies: + pkg-dir "^2.0.0" + resolve-cwd "^2.0.0" + +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" + dependencies: + repeating "^2.0.0" + +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +indx@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/indx/-/indx-0.2.3.tgz#15dcf56ee9cf65c0234c513c27fbd580e70fbc50" + +inflation@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@^1.3.4, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + +inquirer@3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347" + dependencies: + ansi-escapes "^1.1.0" + chalk "^1.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.1" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx "^4.1.0" + string-width "^2.0.0" + strip-ansi "^3.0.0" + through "^2.3.6" + +inquirer@5.2.0, inquirer@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.1.0" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^5.5.2" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +interpret@^1.0.0, interpret@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" + +into-stream@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" + dependencies: + from2 "^2.1.1" + p-is-promise "^1.1.0" + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +ip-regex@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" + +ipaddr.js@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b" + +irregular-plurals@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.4.0.tgz#2ca9b033651111855412f16be5d77c62a458a766" + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + +is-absolute@^0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f" + dependencies: + is-relative "^0.1.0" + +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + +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" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +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-bzip2@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-bzip2/-/is-bzip2-1.0.0.tgz#5ee58eaa5a2e9c80e21407bedf23ae5ac091b3fc" + +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-expression@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz#39acaa6be7fd1f3471dc42c7416e61c24317ac9f" + dependencies: + acorn "~4.0.2" + object-assign "^4.0.1" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + 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-generator-function@^1.0.3: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" + +is-gif@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-gif/-/is-gif-1.0.0.tgz#a6d2ae98893007bffa97a1d8c01d63205832097e" + +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" + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + dependencies: + is-extglob "^2.1.1" + +is-gzip@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" + +is-jpg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-1.0.1.tgz#296d57fdd99ce010434a7283e346ab9a1035e975" + +is-my-ip-valid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" + +is-my-json-valid@^2.12.4: + version "2.17.2" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz#6b2103a288e94ef3de5cf15d29dd85fc4b78d65c" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + is-my-ip-valid "^1.0.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-natural-number@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-2.1.1.tgz#7d4c5728377ef386c3e194a9911bf57c6dc335e7" + +is-negated-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" + +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-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + +is-observable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" + dependencies: + symbol-observable "^1.1.0" + +is-odd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" + dependencies: + is-number "^4.0.0" + +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.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + dependencies: + path-is-inside "^1.0.1" + +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + +is-png@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-png/-/is-png-1.1.0.tgz#d574b12bf275c0350455570b0e5b57ab062077ce" + +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" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-promise@^2.0.0, is-promise@^2.1, is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-regex@^1.0.3, is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-relative@^0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82" + +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + dependencies: + is-unc-path "^1.0.0" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + +is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + +is-root@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.0.0.tgz#838d1e82318144e5a6f77819d90207645acc7019" + +is-scoped@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-scoped/-/is-scoped-1.0.0.tgz#449ca98299e713038256289ecb2b540dc437cb30" + dependencies: + scoped-regex "^1.0.0" + +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-svg@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + +is-tar@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-tar/-/is-tar-1.0.0.tgz#2f6b2e1792c1f5bb36519acaa9d65c0d26fe853d" + +is-there@^4.0.0: + version "4.4.3" + resolved "https://registry.yarnpkg.com/is-there/-/is-there-4.4.3.tgz#a2c49366c6a487f719dbcad80cbde21248d2c18d" + +is-typedarray@^1.0.0, is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + dependencies: + unc-path-regex "^0.1.2" + +is-url@1.2.4, is-url@^1.2.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + +is-utf8@^0.2.0, is-utf8@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-valid-glob@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" + +is-valid-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" + +is-whitespace@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f" + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + +is-zip@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-zip/-/is-zip-1.0.0.tgz#47b0a8ff4d38a76431ccfd99a8e15a4c86ba2325" + +is2@0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/is2/-/is2-0.0.9.tgz#119556d1d1651a41ba105af803267c80b299f629" + dependencies: + deep-is "0.1.2" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +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" + +isarray@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7" + +isbinaryfile@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istextorbinary@2.2.1, istextorbinary@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.2.1.tgz#a5231a08ef6dd22b268d0895084cf8d58b5bec53" + dependencies: + binaryextensions "2" + editions "^1.3.3" + textextensions "2" + +isurl@^1.0.0-alpha5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" + dependencies: + has-to-string-tag-x "^1.2.0" + is-object "^1.0.1" + +jpegtran-bin@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz#f60ecf4ae999c0bdad2e9fbcdf2b6f0981e7a29b" + dependencies: + bin-build "^2.0.0" + bin-wrapper "^3.0.0" + logalot "^2.0.0" + +js-base64@^2.1.8, js-base64@^2.1.9: + version "2.4.5" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.5.tgz#e293cd3c7c82f070d700fc7a1ca0a2e69f101f92" + +js-beautify@^1.6.12: + version "1.7.5" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.7.5.tgz#69d9651ef60dbb649f65527b53674950138a7919" + dependencies: + config-chain "~1.1.5" + editorconfig "^0.13.2" + mkdirp "~0.5.0" + nopt "~3.0.1" + +js-stringify@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" + +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@3.11.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.4.6, js-yaml@^3.7.0, js-yaml@^3.8.4, js-yaml@^3.9.1: + version "3.12.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@~3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jschardet@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.6.0.tgz#c7d1a71edcff2839db2f9ec30fc5d5ebd3c1a678" + +jscodeshift@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.4.1.tgz#da91a1c2eccfa03a3387a21d39948e251ced444a" + dependencies: + async "^1.5.0" + babel-plugin-transform-flow-strip-types "^6.8.0" + babel-preset-es2015 "^6.9.0" + babel-preset-stage-1 "^6.5.0" + babel-register "^6.9.0" + babylon "^6.17.3" + colors "^1.1.2" + flow-parser "^0.*" + lodash "^4.13.1" + micromatch "^2.3.7" + node-dir "0.1.8" + nomnom "^1.8.1" + recast "^0.12.5" + temp "^0.8.1" + write-file-atomic "^1.2.0" + +jscodeshift@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.5.1.tgz#4af6a721648be8638ae1464a190342da52960c33" + dependencies: + babel-plugin-transform-flow-strip-types "^6.8.0" + babel-preset-es2015 "^6.9.0" + babel-preset-stage-1 "^6.5.0" + babel-register "^6.9.0" + babylon "^7.0.0-beta.47" + colors "^1.1.2" + flow-parser "^0.*" + lodash "^4.13.1" + micromatch "^2.3.7" + neo-async "^2.5.0" + node-dir "0.1.8" + nomnom "^1.8.1" + recast "^0.15.0" + temp "^0.8.1" + write-file-atomic "^1.2.0" + +jsdom@11.11.0: + version "11.11.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.11.0.tgz#df486efad41aee96c59ad7a190e2449c7eb1110e" + dependencies: + abab "^1.0.4" + acorn "^5.3.0" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.3.1 < 0.4.0" + data-urls "^1.0.0" + domexception "^1.0.0" + escodegen "^1.9.0" + html-encoding-sniffer "^1.0.2" + left-pad "^1.2.0" + nwsapi "^2.0.0" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.83.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.3" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^4.0.0" + xml-name-validator "^3.0.0" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + +json-schema-ref-parser@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-1.4.1.tgz#c0c2e438bf0796723b02451bae8bc7dd0b37fed0" + dependencies: + call-me-maybe "^1.0.1" + debug "^2.2.0" + es6-promise "^3.0.2" + js-yaml "^3.4.6" + ono "^2.0.1" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + +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-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + +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: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@0.5.1, json5@^0.5.0, json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + optionalDependencies: + graceful-fs "^4.1.6" + +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.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jstransformer@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" + dependencies: + is-promise "^2.0.0" + promise "^7.0.1" + +jwa@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.6.tgz#87240e76c9808dbde18783cf2264ef4929ee50e6" + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.10" + safe-buffer "^5.0.1" + +jws@^3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.5.tgz#80d12d05b293d1e841e7cb8b4e69e561adcf834f" + dependencies: + jwa "^1.1.5" + safe-buffer "^5.0.1" + +keygrip@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.2.tgz#ad3297c557069dea8bcfe7a4fa491b75c5ddeb91" + +keyv@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" + dependencies: + json-buffer "3.0.0" + +kind-of@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + +koa-bodyparser@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-4.2.1.tgz#4d7dacb5e6db1106649b595d9e5ccb158b6f3b29" + dependencies: + co-body "^6.0.0" + copy-to "^2.0.1" + +koa-compose@^3.0.0, koa-compose@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" + dependencies: + any-promise "^1.1.0" + +koa-compose@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" + +koa-compress@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/koa-compress/-/koa-compress-3.0.0.tgz#3194059c215cbc24e59bbc84c2c7453a4c88564f" + dependencies: + bytes "^3.0.0" + compressible "^2.0.0" + koa-is-json "^1.0.0" + statuses "^1.0.0" + +koa-convert@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0" + dependencies: + co "^4.6.0" + koa-compose "^3.0.0" + +koa-favicon@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/koa-favicon/-/koa-favicon-2.0.1.tgz#cfae363e5fd00bd5dd67c1150fbef31e0b5d6f4d" + dependencies: + mz "^2.7.0" + +koa-is-json@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/koa-is-json/-/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14" + +koa-json-body@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/koa-json-body/-/koa-json-body-5.3.0.tgz#64aad3f400adfb81df54b63f7a5eb38bad62d980" + dependencies: + co-body "^5.0.0" + +koa-logger@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/koa-logger/-/koa-logger-3.2.0.tgz#8aef64d8b848fb6253a9b31aa708d0e05141f0e6" + dependencies: + bytes "^2.5.0" + chalk "^1.1.3" + humanize-number "0.0.2" + passthrough-counter "^1.0.0" + +koa-mount@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/koa-mount/-/koa-mount-3.0.0.tgz#08cab3b83d31442ed8b7e75c54b1abeb922ec197" + dependencies: + debug "^2.6.1" + koa-compose "^3.2.1" + +koa-multer@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/koa-multer/-/koa-multer-1.0.2.tgz#d38f7ffd1db97b1aad33e7774732f000ebd67259" + dependencies: + multer "1.3.0" + +koa-router@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/koa-router/-/koa-router-7.4.0.tgz#aee1f7adc02d5cb31d7d67465c9eacc825e8c5e0" + dependencies: + debug "^3.1.0" + http-errors "^1.3.1" + koa-compose "^3.0.0" + methods "^1.0.1" + path-to-regexp "^1.1.1" + urijs "^1.19.0" + +koa-send@4.1.3, koa-send@^4.0.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/koa-send/-/koa-send-4.1.3.tgz#0822207bbf5253a414c8f1765ebc29fa41353cb6" + dependencies: + debug "^2.6.3" + http-errors "^1.6.1" + mz "^2.6.0" + resolve-path "^1.4.0" + +koa-slow@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/koa-slow/-/koa-slow-2.1.0.tgz#39007ca628c620f2b307b90dbf423d7a0c9be971" + dependencies: + lodash.isregexp "3.0.5" + q "1.4.1" + +koa-views@6.1.4: + version "6.1.4" + resolved "https://registry.yarnpkg.com/koa-views/-/koa-views-6.1.4.tgz#595eb683ca17d8dfaa1d100b42ba4e34c762154d" + dependencies: + consolidate "^0.15.0" + debug "^3.1.0" + get-paths "^0.0.2" + koa-send "^4.0.0" + mz "^2.4.0" + pretty "^2.0.0" + +koa@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/koa/-/koa-2.5.1.tgz#79f8b95f8d72d04fe9a58a8da5ebd6d341103f9c" + dependencies: + accepts "^1.2.2" + content-disposition "~0.5.0" + content-type "^1.0.0" + cookies "~0.7.0" + debug "*" + delegates "^1.0.0" + depd "^1.1.0" + destroy "^1.0.3" + error-inject "~1.0.0" + escape-html "~1.0.1" + fresh "^0.5.2" + http-assert "^1.1.0" + http-errors "^1.2.8" + is-generator-function "^1.0.3" + koa-compose "^4.0.0" + koa-convert "^1.2.0" + koa-is-json "^1.0.0" + mime-types "^2.0.7" + on-finished "^2.1.0" + only "0.0.2" + parseurl "^1.3.0" + statuses "^1.2.0" + type-is "^1.5.5" + vary "^1.0.0" + +kue@0.11.6: + version "0.11.6" + resolved "https://registry.yarnpkg.com/kue/-/kue-0.11.6.tgz#5b76916bcedd56636a107861471c63c94611860a" + dependencies: + body-parser "^1.12.2" + express "^4.12.2" + lodash "^4.0.0" + nib "~1.1.2" + node-redis-warlock "~0.2.0" + pug "^2.0.0-beta3" + redis "~2.6.0-2" + stylus "~0.54.5" + yargs "^4.0.0" + optionalDependencies: + reds "^0.2.5" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lazy-req@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac" + +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + dependencies: + readable-stream "^2.0.5" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +lead@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" + dependencies: + flush-write-stream "^1.0.2" + +leb@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/leb/-/leb-0.3.0.tgz#32bee9fad168328d6aea8522d833f4180eed1da3" + +left-pad@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + +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" + +license-checker@20.0.0: + version "20.0.0" + resolved "https://registry.yarnpkg.com/license-checker/-/license-checker-20.0.0.tgz#29b338ba7f4e841b850cc59ddd393dbc8927f375" + dependencies: + chalk "^2.4.1" + debug "^3.1.0" + mkdirp "^0.5.1" + nopt "^4.0.1" + read-installed "~4.0.3" + semver "^5.5.0" + spdx "^0.5.1" + spdx-correct "^3.0.0" + spdx-satisfies "^4.0.0" + strip-ansi "^4.0.0" + treeify "^1.1.0" + +liftoff@^2.1.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" + dependencies: + extend "^3.0.0" + findup-sync "^2.0.0" + fined "^1.0.1" + flagged-respawn "^1.0.0" + is-plain-object "^2.0.4" + object.map "^1.0.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + +listr-update-renderer@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz#344d980da2ca2e8b145ba305908f32ae3f4cc8a7" + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^1.0.2" + strip-ansi "^3.0.1" + +listr-verbose-renderer@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35" + dependencies: + chalk "^1.1.3" + cli-cursor "^1.0.2" + date-fns "^1.27.2" + figures "^1.7.0" + +listr@^0.14.1: + version "0.14.1" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.1.tgz#8a7afa4a7135cee4c921d128e0b7dfc6e522d43d" + dependencies: + "@samverschueren/stream-to-observable" "^0.3.0" + cli-truncate "^0.2.1" + figures "^1.7.0" + indent-string "^2.1.0" + is-observable "^1.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.4.0" + listr-verbose-renderer "^0.4.0" + log-symbols "^1.0.2" + log-update "^1.0.2" + ora "^0.2.3" + p-map "^1.1.1" + rxjs "^6.1.0" + strip-ansi "^3.0.1" + +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" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + +loader-utils@1.1.0, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + +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._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +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@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +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.assignin@^4.0.9: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + +lodash.bind@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + +lodash.clone@^4.3.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" + +lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + +lodash.defaults@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + dependencies: + lodash._root "^3.0.0" + +lodash.filter@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + +lodash.foreach@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + +lodash.get@^4.0.0, lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isequal@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + +lodash.isregexp@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/lodash.isregexp/-/lodash.isregexp-3.0.5.tgz#e0f596242f2fa228a840086b6c8ad82e4b71fd2d" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.map@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + +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@^4.4.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" + +lodash.mergewith@^4.6.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" + +lodash.partialright@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.partialright/-/lodash.partialright-4.2.1.tgz#0130d80e83363264d40074f329b8a3e7a8a1cc4b" + +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + +lodash.reduce@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" + +lodash.reject@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.some@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + +lodash.startcase@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" + +lodash.tail@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + +lodash.uniq@^4.3.0, lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + +lodash@^3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.3.0, lodash@~4.17.10: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + +lodash@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" + +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + dependencies: + chalk "^1.0.0" + +log-symbols@^2.1.0, log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + dependencies: + chalk "^2.0.1" + +log-update@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" + dependencies: + ansi-escapes "^1.0.0" + cli-cursor "^1.0.2" + +logalot@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/logalot/-/logalot-2.1.0.tgz#5f8e8c90d304edf12530951a5554abb8c5e3f552" + dependencies: + figures "^1.3.5" + squeak "^1.0.0" + +long@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" + +longest@^1.0.0, longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + 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" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + +lowercase-keys@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + +lpad-align@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/lpad-align/-/lpad-align-1.1.2.tgz#21f600ac1c3095c3c6e497ee67271ee08481fe9e" + dependencies: + get-stdin "^4.0.1" + indent-string "^2.1.0" + longest "^1.0.0" + meow "^3.3.0" + +lru-cache@2, lru-cache@^2.5.0: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +lru-cache@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee" + dependencies: + pseudomap "^1.0.1" + +lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-queue@0.1: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" + dependencies: + es5-ext "~0.10.2" + +make-dir@^1.0.0, make-dir@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + dependencies: + pify "^3.0.0" + +make-error-cause@^1.1.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d" + dependencies: + make-error "^1.2.0" + +make-error@^1.1.1, make-error@^1.2.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535" + +make-iterator@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" + dependencies: + kind-of "^6.0.2" + +map-cache@^0.2.0, map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +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" + +map-stream@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8" + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + +math-expression-evaluator@^1.2.14: + version "1.2.17" + resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" + +math-random@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" + +md5.js@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +mdn-data@^1.0.0, mdn-data@~1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" + +mecab-async@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/mecab-async/-/mecab-async-0.1.2.tgz#69efb838729216709597a57da2df03922f9b593a" + dependencies: + shell-quote "*" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +mem-fs-editor@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/mem-fs-editor/-/mem-fs-editor-4.0.2.tgz#55a79b1e824da631254c4c95ba6366602c77af90" + dependencies: + commondir "^1.0.1" + deep-extend "^0.5.1" + ejs "^2.5.9" + glob "^7.0.3" + globby "^8.0.0" + isbinaryfile "^3.0.2" + mkdirp "^0.5.0" + multimatch "^2.0.0" + rimraf "^2.2.8" + through2 "^2.0.0" + vinyl "^2.0.1" + +mem-fs@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/mem-fs/-/mem-fs-1.1.3.tgz#b8ae8d2e3fcb6f5d3f9165c12d4551a065d989cc" + dependencies: + through2 "^2.0.0" + vinyl "^1.1.0" + vinyl-file "^2.0.0" + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + +memoizee@0.4.X: + version "0.4.12" + resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.12.tgz#780e99a219c50c549be6d0fc61765080975c58fb" + dependencies: + d "1" + es5-ext "^0.10.30" + es6-weak-map "^2.0.2" + event-emitter "^0.3.5" + is-promise "^2.1" + lru-queue "0.1" + next-tick "1" + timers-ext "^0.1.2" + +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.1.0, meow@^3.3.0, meow@^3.5.0, 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" + +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + dependencies: + source-map "^0.6.1" + +merge-stream@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + dependencies: + readable-stream "^2.0.1" + +merge2@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.2.tgz#03212e3da8d86c4d8523cebd6318193414f94e34" + +methods@^1.0.1, methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.1.5, micromatch@^2.3.7: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +"mime-db@>= 1.34.0 < 2": + version "1.34.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.34.0.tgz#452d0ecff5c30346a6dc1e64b1eaee0d3719ff9a" + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + +mime-types@^2.0.7, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + dependencies: + mime-db "~1.33.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + +mime@^2.0.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + +mimic-response@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimatch@^2.0.1: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + dependencies: + brace-expansion "^1.0.0" + +minimatch@~0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" + +minipass@^2.2.1, minipass@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" + dependencies: + minipass "^2.2.1" + +mississippi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^2.0.1" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mocha@5.2.0, mocha@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" + dependencies: + browser-stdout "1.3.1" + commander "2.15.1" + debug "3.1.0" + diff "3.5.0" + escape-string-regexp "1.0.5" + glob "7.1.2" + growl "1.10.5" + he "1.1.1" + minimatch "3.0.4" + mkdirp "0.5.1" + supports-color "5.4.0" + +moji@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/moji/-/moji-0.5.1.tgz#088eecd1c22c8f31a240adcf9c95e54f33eb54fb" + dependencies: + object-assign "^3.0.0" + +mongodb-core@2.1.19: + version "2.1.19" + resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.1.19.tgz#00fbd5e5a3573763b9171cfd844e60a8f2a3a18b" + dependencies: + bson "~1.0.4" + require_optional "~1.0.0" + +mongodb-core@3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-3.0.9.tgz#8327410c88811013fb3e4ac7c4c670f324349be1" + dependencies: + bson "~1.0.4" + require_optional "^1.0.1" + +mongodb@3.0.10: + version "3.0.10" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.0.10.tgz#f948cb9595adcbfcad7444f6b24a040b653b23e8" + dependencies: + mongodb-core "3.0.9" + +mongodb@^2.1.18: + version "2.2.35" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.2.35.tgz#cd1b5af8a9463e3f9a787fa5b3d05565579730f9" + dependencies: + es6-promise "3.2.1" + mongodb-core "2.1.19" + readable-stream "2.2.7" + +monk-middleware-cast-ids@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/monk-middleware-cast-ids/-/monk-middleware-cast-ids-0.2.1.tgz#40c40e5a6cb33ccedc289220943275ee8861c529" + +monk-middleware-fields@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/monk-middleware-fields/-/monk-middleware-fields-0.2.0.tgz#ff637af35f5948879ccb2be15a91360911bea6c1" + +monk-middleware-handle-callback@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/monk-middleware-handle-callback/-/monk-middleware-handle-callback-0.2.2.tgz#47de6cc1248726c72a2be0c81bc4e68310c32146" + +monk-middleware-options@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/monk-middleware-options/-/monk-middleware-options-0.2.1.tgz#58dae1c518d46636ebdff506fadfc773bb442886" + +monk-middleware-query@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/monk-middleware-query/-/monk-middleware-query-0.2.0.tgz#a926c677d4a5620c62151b0a56d0c0c151675874" + +monk-middleware-wait-for-connection@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/monk-middleware-wait-for-connection/-/monk-middleware-wait-for-connection-0.2.0.tgz#312958d30e588b57d09754dd7c97b4843316835a" + +monk@6.0.6: + version "6.0.6" + resolved "https://registry.yarnpkg.com/monk/-/monk-6.0.6.tgz#2ff1cd57f001bba0fea73d1eea3952a7d35450c5" + dependencies: + debug "*" + mongodb "^2.1.18" + monk-middleware-cast-ids "^0.2.1" + monk-middleware-fields "^0.2.0" + monk-middleware-handle-callback "^0.2.0" + monk-middleware-options "^0.2.1" + monk-middleware-query "^0.2.0" + monk-middleware-wait-for-connection "^0.2.0" + object-assign "^4.1.1" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +ms@2.1.1, ms@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + +multer@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/multer/-/multer-1.3.0.tgz#092b2670f6846fa4914965efc8cf94c20fec6cd2" + dependencies: + append-field "^0.1.0" + busboy "^0.2.11" + concat-stream "^1.5.0" + mkdirp "^0.5.1" + object-assign "^3.0.0" + on-finished "^2.3.0" + type-is "^1.6.4" + xtend "^4.0.0" + +multimatch@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" + dependencies: + array-differ "^1.0.0" + array-union "^1.0.1" + arrify "^1.0.0" + minimatch "^3.0.0" + +multipipe@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + dependencies: + duplexer2 "0.0.2" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +mz@^2.4.0, mz@^2.6.0, mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nan@2.10.0, nan@^2.10.0, nan@^2.3.3, nan@^2.5.0, nan@^2.9.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + +nanomatch@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-odd "^2.0.0" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natives@^1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.4.tgz#2f0f224fc9a7dd53407c7667c84cf8dbe773de58" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +natural@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/natural/-/natural-0.2.1.tgz#1eb5156a9d90b4591949e20e94ebc77bb2339eda" + dependencies: + apparatus ">= 0.0.9" + sylvester ">= 0.0.12" + underscore ">=1.3.1" + +needle@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +neo-async@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" + +next-tick@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + +nib@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/nib/-/nib-1.1.2.tgz#6a69ede4081b95c0def8be024a4c8ae0c2cbb6c7" + dependencies: + stylus "0.54.5" + +nice-try@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + dependencies: + lower-case "^1.1.1" + +node-dir@0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.8.tgz#55fb8deb699070707fb67f91a460f0448294c77d" + +node-fetch@1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-gyp@^3.3.1: + version "3.7.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.7.0.tgz#789478e8f6c45e277aa014f3e28f958f286f9203" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request ">=2.9.0 <2.82.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-libs-browser@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.0" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + +node-object-hash@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/node-object-hash/-/node-object-hash-1.4.1.tgz#de968492e20c493b8bbc25ad2ee828265fd60934" + +node-pre-gyp@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46" + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.0" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.1.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-redis-scripty@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/node-redis-scripty/-/node-redis-scripty-0.0.5.tgz#4bf2d365ab6dab202cc08b7ac63f8f55aadc9625" + dependencies: + extend "^1.2.1" + lru-cache "^2.5.0" + +node-redis-warlock@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/node-redis-warlock/-/node-redis-warlock-0.2.0.tgz#56395b994c828e8e32f6aae53b93b6edfcd97990" + dependencies: + node-redis-scripty "0.0.5" + uuid "^2.0.1" + +node-sass-json-importer@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/node-sass-json-importer/-/node-sass-json-importer-3.2.0.tgz#9cfe2355035d5437b7c2ecb535450bf6acde8195" + dependencies: + is-there "^4.0.0" + json5 "0.5.1" + lodash "^3.10.1" + +node-sass@4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.0.tgz#d1b8aa855d98ed684d6848db929a20771cc2ae52" + 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" + lodash.mergewith "^4.6.0" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.10.0" + node-gyp "^3.3.1" + npmlog "^4.0.0" + request "~2.79.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +node-status-codes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" + +nomnom@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7" + dependencies: + chalk "~0.4.0" + underscore "~1.6.0" + +"nopt@2 || 3", nopt@~3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +nopt@4.0.1, nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + 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.0, normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + +normalize-url@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" + dependencies: + prepend-http "^2.0.0" + query-string "^5.0.1" + sort-keys "^2.0.0" + +normalize-url@^1.4.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +normalize-wheel@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz#aec886affdb045070d856447df62ecf86146ec45" + +now-and-later@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.0.tgz#bc61cbb456d79cb32207ce47ca05136ff2e7d6ee" + dependencies: + once "^1.3.2" + +npm-bundled@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + +npm-packlist@^1.1.6: + version "1.1.10" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0, npm-run-path@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nprogress@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + +nth-check@^1.0.1, nth-check@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" + dependencies: + boolbase "~1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +nwsapi@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.3.tgz#3f4010d6c943f34018d3dfb5f2fbc0de90476959" + +oauth-sign@~0.8.1, oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +oauth@0.9.15: + version "0.9.15" + resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" + +object-assign-deep@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-assign-deep/-/object-assign-deep-0.4.0.tgz#43505d3679abb9686ab359b97ac14cc837a9d143" + +object-assign@4.X, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-assign@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.11, object-keys@^1.0.8: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + +object.assign@^4.0.1, object.assign@^4.0.4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.defaults@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.map@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.2.0, object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + +object.values@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.6.1" + function-bind "^1.1.0" + has "^1.0.1" + +on-build-webpack@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/on-build-webpack/-/on-build-webpack-0.1.0.tgz#a287c0e17766e6141926e5f2cbb0d8bb53b76814" + +on-finished@^2.1.0, on-finished@^2.3.0, on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +onetime@^1.0.0: + version "1.1.0" + resolved "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +only@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" + +ono@^2.0.1: + version "2.2.5" + resolved "https://registry.yarnpkg.com/ono/-/ono-2.2.5.tgz#daf09488b51174da7a7e4275dfab31b438ffa0e3" + +ono@^4.0.2: + version "4.0.5" + resolved "https://registry.yarnpkg.com/ono/-/ono-4.0.5.tgz#bc62740493a5c1c08b2c21e60cbb0e5c56ab7de2" + dependencies: + format-util "^1.0.3" + +opencollective@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1" + dependencies: + babel-polyfill "6.23.0" + chalk "1.1.3" + inquirer "3.0.6" + minimist "1.2.0" + node-fetch "1.6.3" + opn "4.0.2" + +opn@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + +optionator@^0.8.1, 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" + +optipng-bin@^3.0.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-3.1.4.tgz#95d34f2c488704f6fd70606bfea0c659f1d95d84" + dependencies: + bin-build "^2.0.0" + bin-wrapper "^3.0.0" + logalot "^2.0.0" + +ora@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" + dependencies: + chalk "^1.1.1" + cli-cursor "^1.0.2" + cli-spinners "^0.1.2" + object-assign "^4.0.1" + +orchestrator@^0.3.0: + version "0.3.8" + resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" + dependencies: + end-of-stream "~0.1.5" + sequencify "~0.0.7" + stream-consume "~0.1.0" + +ordered-read-streams@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" + +ordered-read-streams@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" + dependencies: + is-stream "^1.0.1" + readable-stream "^2.0.1" + +ordered-read-streams@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" + dependencies: + readable-stream "^2.0.1" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + +os-filter-obj@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-1.0.3.tgz#5915330d90eced557d2d938a31c6dd214d9c63ad" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-locale@^2.0.0, os-locale@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-shim@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +os-utils@0.0.14: + version "0.0.14" + resolved "https://registry.yarnpkg.com/os-utils/-/os-utils-0.0.14.tgz#29e511697b1982b8c627722175fe39797ef64156" + +osenv@0, osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-cancelable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" + +p-cancelable@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + dependencies: + p-reduce "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-is-promise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + +p-lazy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-lazy/-/p-lazy-1.0.0.tgz#ec53c802f2ee3ac28f166cc82d0b2b02de27a835" + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + dependencies: + p-try "^1.0.0" + +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" + +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + +p-pipe@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9" + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + +p-timeout@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" + dependencies: + p-finally "^1.0.0" + +p-timeout@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" + dependencies: + p-finally "^1.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + +pako@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@2.1.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + dependencies: + no-case "^2.2.0" + +parse-asn1@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + +parse-filepath@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.1.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" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + +parse5@*, parse5@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.0.0.tgz#4d02710d44f3c3846197a11e205d4ef17842b81a" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + +parseurl@^1.3.0, parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + +passthrough-counter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passthrough-counter/-/passthrough-counter-1.0.0.tgz#1967d9e66da572b5c023c787db112a387ab166fa" + +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + 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.1, path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + 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, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + dependencies: + path-root-regex "^0.1.0" + +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-to-regexp@^1.1.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + dependencies: + isarray "0.0.1" + +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" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + dependencies: + pify "^3.0.0" + +pbkdf2@^3.0.3: + version "3.0.16" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + +plugin-error@1.0.1, plugin-error@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" + dependencies: + ansi-colors "^1.0.1" + arr-diff "^4.0.0" + arr-union "^3.1.0" + extend-shallow "^3.0.2" + +plugin-error@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" + dependencies: + ansi-cyan "^0.1.1" + ansi-red "^0.1.1" + arr-diff "^1.0.1" + arr-union "^2.0.1" + extend-shallow "^1.1.2" + +plur@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" + dependencies: + irregular-plurals "^1.0.0" + +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + +pngjs@^3.3.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.3.tgz#85173703bde3edac8998757b96e5821d0966a21b" + +popper.js@^1.12.9: + version "1.14.3" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.3.tgz#1438f98d046acf7b4d78cd502bf418ac64d4f095" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + +postcss-calc@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" + dependencies: + postcss "^5.0.2" + postcss-message-helpers "^2.0.0" + reduce-css-calc "^1.2.6" + +postcss-colormin@^2.1.8: + version "2.2.2" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" + dependencies: + colormin "^1.0.5" + postcss "^5.0.13" + postcss-value-parser "^3.2.3" + +postcss-convert-values@^2.3.4: + version "2.6.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" + dependencies: + postcss "^5.0.11" + postcss-value-parser "^3.1.2" + +postcss-discard-comments@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" + dependencies: + postcss "^5.0.14" + +postcss-discard-duplicates@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" + dependencies: + postcss "^5.0.4" + +postcss-discard-empty@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" + dependencies: + postcss "^5.0.14" + +postcss-discard-overridden@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" + dependencies: + postcss "^5.0.16" + +postcss-discard-unused@^2.2.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" + dependencies: + postcss "^5.0.14" + uniqs "^2.0.0" + +postcss-filter-plugins@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" + dependencies: + postcss "^5.0.4" + +postcss-merge-idents@^2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" + dependencies: + has "^1.0.1" + postcss "^5.0.10" + postcss-value-parser "^3.1.1" + +postcss-merge-longhand@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" + dependencies: + postcss "^5.0.4" + +postcss-merge-rules@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" + dependencies: + browserslist "^1.5.2" + caniuse-api "^1.5.2" + postcss "^5.0.4" + postcss-selector-parser "^2.2.2" + vendors "^1.0.0" + +postcss-message-helpers@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" + +postcss-minify-font-values@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" + dependencies: + object-assign "^4.0.1" + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-minify-gradients@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" + dependencies: + postcss "^5.0.12" + postcss-value-parser "^3.3.0" + +postcss-minify-params@^1.0.4: + version "1.2.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.2" + postcss-value-parser "^3.0.2" + uniqs "^2.0.0" + +postcss-minify-selectors@^2.0.4: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" + dependencies: + alphanum-sort "^1.0.2" + has "^1.0.1" + postcss "^5.0.14" + postcss-selector-parser "^2.0.0" + +postcss-modules-extract-imports@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" + dependencies: + postcss "^6.0.1" + +postcss-modules-local-by-default@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-scope@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-values@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + +postcss-normalize-charset@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" + dependencies: + postcss "^5.0.5" + +postcss-normalize-url@^3.0.7: + version "3.0.8" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^1.4.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + +postcss-ordered-values@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.1" + +postcss-reduce-idents@^2.2.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-reduce-initial@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" + dependencies: + postcss "^5.0.4" + +postcss-reduce-transforms@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" + dependencies: + has "^1.0.1" + postcss "^5.0.8" + postcss-value-parser "^3.0.1" + +postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" + dependencies: + dot-prop "^4.1.1" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^2.1.1: + version "2.1.6" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" + dependencies: + is-svg "^2.0.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + svgo "^0.7.0" + +postcss-unique-selectors@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + +postcss-zindex@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" + dependencies: + has "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: + version "5.2.18" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^6.0.1, postcss@^6.0.20: + version "6.0.22" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.22.tgz#e23b78314905c3b90cbd61702121e7a78848f2a3" + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.0, prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +prettier@^1.12.1, prettier@^1.13.0: + version "1.13.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.5.tgz#7ae2076998c8edce79d63834e9b7b09fead6bfd0" + +pretty-bytes@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9" + +pretty-hrtime@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + +pretty@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5" + dependencies: + condense-newlines "^0.2.1" + extend-shallow "^2.0.1" + js-beautify "^1.6.12" + +prettyjson@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prettyjson/-/prettyjson-1.2.1.tgz#fcffab41d19cab4dfae5e575e64246619b12d289" + dependencies: + colors "^1.1.2" + minimist "^1.2.0" + +printj@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" + +private@^0.1.6, private@^0.1.8, private@~0.1.5: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + +progress-bar-webpack-plugin@1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/progress-bar-webpack-plugin/-/progress-bar-webpack-plugin-1.11.0.tgz#4f801288443c55ec029b20cbfdcbf3e1dc17f852" + dependencies: + chalk "^1.1.1" + object.assign "^4.0.1" + progress "^1.1.8" + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + +prominence@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/prominence/-/prominence-0.2.0.tgz#38704264981ddf65e5b00b0b5cfce6e53348f2b2" + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + +promise-sequential@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/promise-sequential/-/promise-sequential-1.1.1.tgz#f79e8950ef86e7a7a85bf320452643592f6d2fb2" + +promise@^7.0.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + +proxy-addr@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.6.0" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + +pseudomap@^1.0.1, pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +psl@^1.1.24: + version "1.1.28" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" + +public-encrypt@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + +pug-attrs@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.3.tgz#a3095f970e64151f7bdad957eef55fb5d7905d15" + dependencies: + constantinople "^3.0.1" + js-stringify "^1.0.1" + pug-runtime "^2.0.4" + +pug-code-gen@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.1.tgz#0951ec83225d74d8cfc476a7f99a259b5f7d050c" + dependencies: + constantinople "^3.0.1" + doctypes "^1.1.0" + js-stringify "^1.0.1" + pug-attrs "^2.0.3" + pug-error "^1.3.2" + pug-runtime "^2.0.4" + void-elements "^2.0.1" + with "^5.0.0" + +pug-error@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.2.tgz#53ae7d9d29bb03cf564493a026109f54c47f5f26" + +pug-filters@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.0.tgz#27165555bc04c236e4aa2b0366246dfa021b626e" + dependencies: + clean-css "^4.1.11" + constantinople "^3.0.1" + jstransformer "1.0.0" + pug-error "^1.3.2" + pug-walk "^1.1.7" + resolve "^1.1.6" + uglify-js "^2.6.1" + +pug-lexer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.0.0.tgz#210c18457ef2e1760242740c5e647bd794cec278" + dependencies: + character-parser "^2.1.1" + is-expression "^3.0.0" + pug-error "^1.3.2" + +pug-linker@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.5.tgz#9e9a7ae4005682d027deeb96b000f88eeb83a02f" + dependencies: + pug-error "^1.3.2" + pug-walk "^1.1.7" + +pug-load@^2.0.11: + version "2.0.11" + resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.11.tgz#e648e57ed113fe2c1f45d57858ea2bad6bc01527" + dependencies: + object-assign "^4.1.0" + pug-walk "^1.1.7" + +pug-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.0.tgz#e394ad9b3fca93123940aff885c06e44ab7e68e4" + dependencies: + pug-error "^1.3.2" + token-stream "0.0.1" + +pug-runtime@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.4.tgz#e178e1bda68ab2e8c0acfc9bced2c54fd88ceb58" + +pug-strip-comments@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz#f1559592206edc6f85310dacf4afb48a025af59f" + dependencies: + pug-error "^1.3.2" + +pug-walk@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.7.tgz#c00d5c5128bac5806bec15d2b7e7cdabe42531f3" + +pug@2.0.3, pug@^2.0.0-beta3, pug@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.3.tgz#71cba82537c95a5eab7ed04696e4221f53aa878e" + dependencies: + pug-code-gen "^2.0.1" + pug-filters "^3.1.0" + pug-lexer "^4.0.0" + pug-linker "^3.0.5" + pug-load "^2.0.11" + pug-parser "^5.0.0" + pug-runtime "^2.0.4" + pug-strip-comments "^1.0.3" + +pump@^2.0.0, pump@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3, pumpify@^1.3.5: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +punycode@2.1.1, punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +q@0.9.7: + version "0.9.7" + resolved "https://registry.yarnpkg.com/q/-/q-0.9.7.tgz#4de2e6cb3b29088c9e4cbc03bf9d42fb96ce2f75" + +q@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + +qrcode@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.2.0.tgz#330d24313fbf8d429a806091af9525250239e44a" + dependencies: + can-promise "^0.0.1" + dijkstrajs "^1.0.1" + isarray "^2.0.1" + pngjs "^3.3.0" + yargs "^8.0.2" + +qs@6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +qs@6.5.2, qs@^6.4.0, qs@^6.5.2, qs@~6.5.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + +qs@~6.3.0: + version "6.3.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +query-string@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +randomatic@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +rangestr@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/rangestr/-/rangestr-0.0.1.tgz#f72ff9246f10f2a7d7c16e14616f617be2c2635a" + +ratelimiter@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ratelimiter/-/ratelimiter-3.0.3.tgz#6dbca58b05422f2a08e224d4ba3a0cfb86c30966" + +raw-body@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + dependencies: + bytes "3.0.0" + http-errors "1.6.2" + iconv-lite "0.4.19" + unpipe "1.0.0" + +raw-body@2.3.3, raw-body@^2.2.0, raw-body@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + +rc@^1.1.2, rc@^1.1.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-all-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" + dependencies: + pinkie-promise "^2.0.0" + readable-stream "^2.0.0" + +read-chunk@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-2.1.0.tgz#6a04c0928005ed9d42e1a6ac5600e19cbc7ff655" + dependencies: + pify "^3.0.0" + safe-buffer "^5.1.1" + +read-installed@~4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" + dependencies: + debuglog "^1.0.1" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + semver "2 || 3 || 4 || 5" + slide "~1.1.3" + util-extend "^1.0.1" + optionalDependencies: + graceful-fs "^4.1.2" + +read-package-json@^2.0.0: + version "2.0.13" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a" + dependencies: + glob "^7.1.1" + json-parse-better-errors "^1.0.1" + normalize-package-data "^2.0.0" + slash "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.2" + +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-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + dependencies: + find-up "^2.0.0" + read-pkg "^3.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" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@1.1.x, readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@2.2.7: + version "2.2.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.7.tgz#07057acbe2467b22042d36f98c5ad507054e95b1" + 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" + +"readable-stream@>=1.0.33-1 <1.1.0-0": + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdir-scoped-modules@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + graceful-fs "^4.1.2" + once "^1.3.0" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +recaptcha-promise@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/recaptcha-promise/-/recaptcha-promise-0.1.3.tgz#7d3d66d045a53674054ebdfa1684e0609ef5d912" + dependencies: + bluebird "^3.4.1" + request "^2.73.0" + +recast@^0.12.5: + version "0.12.9" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.12.9.tgz#e8e52bdb9691af462ccbd7c15d5a5113647a15f1" + dependencies: + ast-types "0.10.1" + core-js "^2.4.1" + esprima "~4.0.0" + private "~0.1.5" + source-map "~0.6.1" + +recast@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.15.0.tgz#b8c8bfdda245e1580c0a4d9fc25d4e820bf57208" + dependencies: + ast-types "0.11.5" + esprima "~4.0.0" + private "~0.1.5" + source-map "~0.6.1" + +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" + +reconnecting-websocket@3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/reconnecting-websocket/-/reconnecting-websocket-3.2.2.tgz#8097514e926e9855e03c39e76efa2e3d1f371bee" + +recursive-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/recursive-iterator/-/recursive-iterator-2.0.3.tgz#d0e0d2c7e7a83109d73091cf043fc509e5a76dc3" + +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" + +redis-commands@^1.2.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.3.5.tgz#4495889414f1e886261180b1442e7295602d83a2" + +redis-parser@^2.0.0, redis-parser@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b" + +redis@2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/redis/-/redis-2.8.0.tgz#202288e3f58c49f6079d97af7a10e1303ae14b02" + dependencies: + double-ended-queue "^2.1.0-0" + redis-commands "^1.2.0" + redis-parser "^2.6.0" + +redis@^0.12.1: + version "0.12.1" + resolved "https://registry.yarnpkg.com/redis/-/redis-0.12.1.tgz#64df76ad0fc8acebaebd2a0645e8a48fac49185e" + +redis@~2.6.0-2: + version "2.6.5" + resolved "https://registry.yarnpkg.com/redis/-/redis-2.6.5.tgz#87c1eff4a489f94b70871f3d08b6988f23a95687" + dependencies: + double-ended-queue "^2.1.0-0" + redis-commands "^1.2.0" + redis-parser "^2.0.0" + +reds@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/reds/-/reds-0.2.5.tgz#38a767f7663cd749036848697d82c74fd29bc01f" + dependencies: + natural "^0.2.0" + redis "^0.12.1" + +reduce-css-calc@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + dependencies: + balanced-match "^0.4.2" + math-expression-evaluator "^1.2.14" + reduce-function-call "^1.0.1" + +reduce-function-call@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" + dependencies: + balanced-match "^0.4.2" + +regenerate@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + +regenerator-runtime@^0.10.0: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" + +regexpu-core@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +relateurl@0.2.x: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + +remove-bom-buffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" + dependencies: + is-buffer "^1.1.5" + is-utf8 "^0.2.1" + +remove-bom-stream@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523" + dependencies: + remove-bom-buffer "^3.0.0" + safe-buffer "^5.1.0" + through2 "^2.0.3" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + +replace-ext@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + +replacestream@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/replacestream/-/replacestream-4.0.3.tgz#3ee5798092be364b1cdb1484308492cb3dff2f36" + dependencies: + escape-string-regexp "^1.0.3" + object-assign "^4.0.1" + readable-stream "^2.0.2" + +request-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + dependencies: + lodash "^4.13.1" + +request-promise-native@1.0.5, request-promise-native@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.3" + +request@2.85.0: + version "2.85.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +request@2.87.0, request@^2.73.0, request@^2.83.0: + version "2.87.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +"request@>=2.9.0 <2.82.0": + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +request@~2.79.0: + version "2.79.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + qs "~6.3.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + uuid "^3.0.0" + +require-all@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/require-all/-/require-all-2.2.0.tgz#b4420c233ac0282d0ff49b277fb880a8b5de0894" + +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.3: + 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" + +require_optional@^1.0.1, require_optional@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" + dependencies: + resolve-from "^2.0.0" + semver "^5.1.0" + +resize-observer-polyfill@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.0.tgz#660ff1d9712a2382baa2cad450a4716209f9ca69" + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + dependencies: + resolve-from "^3.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve-from@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + +resolve-options@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" + dependencies: + value-or-function "^3.0.0" + +resolve-path@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" + dependencies: + http-errors "~1.6.2" + path-is-absolute "1.0.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2: + version "1.8.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.0.tgz#a7f2ac27b78480ecc09c83782741d9f26e4f0c3e" + dependencies: + path-parse "^1.0.5" + +responselike@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + dependencies: + lowercase-keys "^1.0.0" + +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" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + +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, rimraf@2.6.2, rimraf@^2.2.6, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +rimraf@~2.2.6: + version "2.2.8" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rndstr@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rndstr/-/rndstr-1.0.0.tgz#77e66fa8f9b4836853fdd91e50719591bb67d349" + dependencies: + rangestr "0.0.1" + seedrandom "2.4.2" + +rsvp@^4.7.0: + version "4.8.2" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.2.tgz#9d5647108735784eb13418cdddb56f75b919d722" + +run-async@^2.0.0, run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + dependencies: + aproba "^1.1.1" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +rx@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + +rxjs@^5.5.2: + version "5.5.11" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.11.tgz#f733027ca43e3bec6b994473be4ab98ad43ced87" + dependencies: + symbol-observable "1.0.1" + +rxjs@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.1.tgz#246cebec189a6cbc143a3ef9f62d6f4c91813ca1" + dependencies: + tslib "^1.9.0" + +s-age@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/s-age/-/s-age-1.1.2.tgz#c0cf15233ccc93f41de92ea42c36d957977d1ea2" + +safe-buffer@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + +sass-graph@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +sass-loader@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.0.1.tgz#fd937259ccba3a9cfe0d5f8a98746d48adfcc261" + dependencies: + clone-deep "^2.0.1" + loader-utils "^1.0.1" + lodash.tail "^4.1.1" + neo-async "^2.5.0" + pify "^3.0.0" + +sax@0.5.x: + version "0.5.8" + resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" + +sax@^1.2.4, sax@~1.2.1, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +schema-utils@^0.4.3, schema-utils@^0.4.4, schema-utils@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +scoped-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/scoped-regex/-/scoped-regex-1.0.0.tgz#a346bb1acd4207ae70bd7c0c7ca9e566b6baddb8" + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +seedrandom@2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.2.tgz#18d78c41287d13aff8eadb29e235938b248aa9ff" + +seedrandom@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.3.tgz#2438504dad33917314bff18ac4d794f16d6aaecc" + +seek-bzip@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" + dependencies: + commander "~2.8.1" + +semver-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9" + +semver-truncate@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8" + dependencies: + semver "^5.3.0" + +"semver@2 || 3 || 4 || 5", semver@5.5.0, semver@^5.0.1, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + +semver@^4.0.3, semver@^4.1.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + +sequencify@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" + +serialize-javascript@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +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" + +set-immediate-shim@^1.0.0, set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571" + dependencies: + is-extendable "^0.1.1" + kind-of "^5.0.0" + mixin-object "^2.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shell-quote@*: + version "1.6.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + +shelljs@^0.8.0: + version "0.8.2" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.2.tgz#345b7df7763f4c2340d584abb532c5f752ca9e35" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +shvl@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/shvl/-/shvl-1.3.1.tgz#6c20a17b4a20b08e9f8cab60c50a92229fcc176e" + +sigmund@^1.0.1, sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +single-line-log@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364" + dependencies: + string-width "^1.0.1" + +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" + +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + dependencies: + is-fullwidth-code-point "^2.0.0" + +slide@^1.1.5, slide@~1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + dependencies: + hoek "4.x.x" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + dependencies: + is-plain-obj "^1.0.0" + +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + dependencies: + is-plain-obj "^1.0.0" + +sortablejs@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.7.0.tgz#80a2b2370abd568e1cec8c271131ef30a904fa28" + +source-list-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + +source-list-map@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + +source-map-support@^0.5.3: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + +source-map@0.1.x, source-map@^0.1.38: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + dependencies: + amdefine ">=0.0.4" + +source-map@0.5.x, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +source-map@^0.4.2, source-map@~0.4.1: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +sparkles@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" + +spawn-sync@^1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" + dependencies: + concat-stream "^1.4.7" + os-shim "^0.1.2" + +spdx-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/spdx-compare/-/spdx-compare-1.0.0.tgz#2c55f117362078d7409e6d7b08ce70a857cd3ed7" + dependencies: + array-find-index "^1.0.2" + spdx-expression-parse "^3.0.0" + spdx-ranges "^2.0.0" + +spdx-correct@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-1.0.5.tgz#9d21ac4da4bdb71d060fb74e5a67531d032cbba6" + +spdx-exceptions@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +spdx-license-ids@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" + +spdx-ranges@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/spdx-ranges/-/spdx-ranges-2.0.0.tgz#257686798e5edb41d45c1aba3d3f1bb47af8d5ec" + +spdx-satisfies@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/spdx-satisfies/-/spdx-satisfies-4.0.0.tgz#ebc79eec88b68ac75618e2e5ee94fbc347587552" + dependencies: + spdx-compare "^1.0.0" + spdx-expression-parse "^3.0.0" + spdx-ranges "^2.0.0" + +spdx@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/spdx/-/spdx-0.5.1.tgz#d36c275088b48d75a9046cd44a838ce4b5339998" + dependencies: + spdx-exceptions "^1.0.0" + spdx-license-ids "^1.0.0" + +speakeasy@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/speakeasy/-/speakeasy-2.0.0.tgz#85c91a071b09a5cb8642590d983566165f57613a" + dependencies: + base32.js "0.0.1" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +squeak@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/squeak/-/squeak-1.3.0.tgz#33045037b64388b567674b84322a6521073916c3" + dependencies: + chalk "^1.0.0" + console-stream "^0.1.1" + lpad-align "^1.0.1" + +sshpk@^1.7.0: + version "1.14.2" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + safer-buffer "^2.0.2" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +ssri@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" + dependencies: + safe-buffer "^5.1.1" + +stable@~0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + +stat-mode@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2", statuses@^1.0.0, statuses@^1.2.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + +stdout-stream@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" + dependencies: + readable-stream "^2.0.1" + +stealthy-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + +stream-browserify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-combiner2@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" + dependencies: + duplexer2 "~0.1.0" + readable-stream "^2.0.2" + +stream-consume@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48" + +stream-each@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +streamsearch@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + +string-template@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@^1.0.0, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + dependencies: + safe-buffer "~5.1.0" + +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.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.4, stringstream@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" + +strip-bom-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" + dependencies: + first-chunk-stream "^1.0.0" + strip-bom "^2.0.0" + +strip-bom-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz#f87db5ef2613f6968aa545abfe1ec728b6a829ca" + dependencies: + first-chunk-stream "^2.0.0" + strip-bom "^2.0.0" + +strip-bom-string@1.X: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + +strip-bom@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" + dependencies: + first-chunk-stream "^1.0.0" + is-utf8 "^0.2.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-dirs@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-1.1.1.tgz#960bbd1287844f3975a4558aa103a8255e2456a0" + dependencies: + chalk "^1.0.0" + get-stdin "^4.0.1" + is-absolute "^0.1.5" + is-natural-number "^2.0.0" + minimist "^1.1.0" + sum-up "^1.0.1" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +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" + +strip-outer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" + dependencies: + escape-string-regexp "^1.0.2" + +style-loader@0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.21.0.tgz#68c52e5eb2afc9ca92b6274be277ee59aea3a852" + dependencies: + loader-utils "^1.1.0" + schema-utils "^0.4.5" + +stylus-loader@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-3.0.2.tgz#27a706420b05a38e038e7cacb153578d450513c6" + dependencies: + loader-utils "^1.0.2" + lodash.clonedeep "^4.5.0" + when "~3.6.x" + +stylus@0.54.5, stylus@^0.54.0, stylus@~0.54.5: + version "0.54.5" + resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79" + dependencies: + css-parse "1.7.x" + debug "*" + glob "7.0.x" + mkdirp "0.5.x" + sax "0.5.x" + source-map "0.1.x" + +sum-up@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" + dependencies: + chalk "^1.0.0" + +summaly@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/summaly/-/summaly-2.0.6.tgz#559561e05c267f01e7199a296dd650a994b19053" + dependencies: + cheerio-httpcli "0.7.2" + debug "3.1.0" + escape-regexp "0.0.1" + html-entities "1.2.1" + request "2.85.0" + request-promise-native "1.0.5" + require-all "2.2.0" + trace-redirect "1.0.6" + +supports-color@5.4.0, supports-color@^5.2.0, supports-color@^5.3.0, supports-color@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + dependencies: + has-flag "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +svgo@^0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" + dependencies: + coa "~1.0.1" + colors "~1.1.2" + csso "~2.3.1" + js-yaml "~3.7.0" + mkdirp "~0.5.1" + sax "~1.2.1" + whet.extend "~0.9.9" + +svgo@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.0.5.tgz#7040364c062a0538abacff4401cea6a26a7a389a" + dependencies: + coa "~2.0.1" + colors "~1.1.2" + css-select "~1.3.0-rc0" + css-select-base-adapter "~0.1.0" + css-tree "1.0.0-alpha25" + css-url-regex "^1.1.0" + csso "^3.5.0" + js-yaml "~3.10.0" + mkdirp "~0.5.1" + object.values "^1.0.4" + sax "~1.2.4" + stable "~0.1.6" + unquote "~1.1.1" + util.promisify "~1.0.0" + +swagger-jsdoc@1.9.7: + version "1.9.7" + resolved "https://registry.yarnpkg.com/swagger-jsdoc/-/swagger-jsdoc-1.9.7.tgz#7a761d4d7ef4a54bf457cea5c67ec316bb82f8b9" + dependencies: + chokidar "^1.7.0" + commander "^2.11.0" + doctrine "^2.0.0" + glob "^7.1.2" + js-yaml "^3.8.4" + recursive-iterator "^2.0.3" + swagger-parser "^3.4.1" + +swagger-methods@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/swagger-methods/-/swagger-methods-1.0.4.tgz#2c5b844f4a22ab2f5e773f98193c28e386b1c37e" + +swagger-parser@^3.4.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/swagger-parser/-/swagger-parser-3.4.2.tgz#244d67d6eeed08c00acb5d95950d5aefbd6185a3" + dependencies: + call-me-maybe "^1.0.1" + debug "^3.0.0" + es6-promise "^4.1.1" + json-schema-ref-parser "^1.4.1" + ono "^4.0.2" + swagger-methods "^1.0.0" + swagger-schema-official "2.0.0-bab6bed" + z-schema "^3.16.1" + +swagger-schema-official@2.0.0-bab6bed: + version "2.0.0-bab6bed" + resolved "https://registry.yarnpkg.com/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz#70070468d6d2977ca5237b2e519ca7d06a2ea3fd" + +"sylvester@>= 0.0.12", "sylvester@>= 0.0.8": + version "0.0.21" + resolved "https://registry.yarnpkg.com/sylvester/-/sylvester-0.0.21.tgz#2987b1ce2bd2f38b0dce2a34388884bfa4400ea7" + +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + +symbol-observable@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + +symbol-tree@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + +syuilo-password-strength@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/syuilo-password-strength/-/syuilo-password-strength-0.0.1.tgz#08f71a8f0ecb77db649f3d9a6424510d9d945f52" + +table@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + dependencies: + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + +tapable@^1.0.0, tapable@^1.0.0-beta.5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" + +tar-stream@^1.1.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395" + dependencies: + bl "^1.0.0" + buffer-alloc "^1.1.0" + end-of-stream "^1.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.0" + xtend "^4.0.0" + +tar@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +tar@^4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" + dependencies: + chownr "^1.0.1" + fs-minipass "^1.2.5" + minipass "^2.3.3" + minizlib "^1.1.0" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +tcp-port-used@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-0.1.2.tgz#9450e8768c83b416fd4d1a6a9449eeccbf496c29" + dependencies: + debug "0.7.4" + is2 "0.0.9" + q "0.9.7" + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + +temp@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + dependencies: + os-tmpdir "^1.0.0" + rimraf "~2.2.6" + +tempfile@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2" + dependencies: + os-tmpdir "^1.0.0" + uuid "^2.0.1" + +tempfile@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265" + dependencies: + temp-dir "^1.0.0" + uuid "^3.0.1" + +text-table@^0.2.0, text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +textarea-caret@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/textarea-caret/-/textarea-caret-3.1.0.tgz#5d5a35bb035fd06b2ff0e25d5359e97f2655087f" + +textextensions@2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286" + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.0" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" + dependencies: + any-promise "^1.0.0" + +throttle-debounce@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz#51853da37be68a155cb6e827b3514a3c422e89cd" + +through2-concurrent@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/through2-concurrent/-/through2-concurrent-1.1.1.tgz#11cb4ea4c9e31bca6e4c1e6dba48d1c728c3524b" + dependencies: + through2 "^2.0.0" + +through2-filter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2@2.X, through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through2@^0.6.0, through2@^0.6.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through@^2.3.6, through@~2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +tildify@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + dependencies: + os-homedir "^1.0.0" + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + +timed-out@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" + +timed-out@^4.0.0, timed-out@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + +timers-browserify@^2.0.4: + version "2.0.10" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + dependencies: + setimmediate "^1.0.4" + +timers-ext@^0.1.2: + version "0.1.5" + resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.5.tgz#77147dd4e76b660c2abb8785db96574cbbd12922" + dependencies: + es5-ext "~0.10.14" + next-tick "1" + +tmp@0.0.33, tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + +to-absolute-glob@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" + dependencies: + extend-shallow "^2.0.1" + +to-absolute-glob@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" + dependencies: + is-absolute "^1.0.0" + is-negated-glob "^1.0.0" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + +to-buffer@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +to-through@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" + dependencies: + through2 "^2.0.3" + +token-stream@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a" + +tough-cookie@>=2.3.3, tough-cookie@^2.3.3: + version "2.4.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.2.tgz#aa9133154518b494efab98a58247bfc38818c00c" + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +tough-cookie@~2.3.0, tough-cookie@~2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + dependencies: + punycode "^1.4.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + dependencies: + punycode "^2.1.0" + +trace-redirect@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/trace-redirect/-/trace-redirect-1.0.6.tgz#ac629b5bf8247d30dde5a35fe9811b811075b504" + +treeify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-repeated@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" + dependencies: + escape-string-regexp "^1.0.2" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +"true-case-path@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" + dependencies: + glob "^6.0.4" + +tryit@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" + +ts-loader@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-4.3.0.tgz#4e3ba172783d1256d3a23bdfadde011a795fae9e" + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^3.1.4" + semver "^5.0.1" + +ts-node@6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-6.0.4.tgz#245af3a8cdf3baa1121893fe12b9a54ee297c4c5" + dependencies: + arrify "^1.0.0" + chalk "^2.3.0" + diff "^3.1.0" + make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map-support "^0.5.3" + yn "^2.0.0" + +tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.2.tgz#8be0cc9a1f6dc7727c38deb16c2ebd1a2892988e" + +tslint@5.10.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.10.0.tgz#11e26bccb88afa02dd0d9956cae3d4540b5f54c3" + dependencies: + babel-code-frame "^6.22.0" + builtin-modules "^1.1.1" + chalk "^2.3.0" + commander "^2.12.1" + diff "^3.2.0" + glob "^7.1.1" + js-yaml "^3.7.0" + minimatch "^3.0.4" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.8.0" + tsutils "^2.12.1" + +tsutils@^2.12.1: + version "2.27.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.27.1.tgz#ab0276ac23664f36ce8fd4414daec4aebf4373ee" + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + +tunnel-agent@^0.4.0, tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +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.5.5, type-is@^1.6.14, type-is@^1.6.16, type-is@^1.6.4, type-is@~1.6.15, type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + +type-of@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/type-of/-/type-of-2.0.1.tgz#e72a1741896568e9f628378d816d6912f7f23972" + +typedarray-to-buffer@^3.1.2: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +typescript-eslint-parser@15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-15.0.0.tgz#882fd3d7aabffbab0a7f98d2a59fb9a989c2b37f" + dependencies: + lodash.unescape "4.0.1" + semver "5.5.0" + +typescript@2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170" + +uglify-es@3.3.9, uglify-es@^3.3.4: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + +uglify-js@3.3.x: + version "3.3.28" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.28.tgz#0efb9a13850e11303361c1051f64d2ec68d9be06" + dependencies: + commander "~2.15.0" + source-map "~0.6.1" + +uglify-js@^2.6.1, uglify-js@^2.7.0: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-js@^3.0.5: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.0.tgz#796762282b5b5f0eafe7d5c8c708d1d7bd5ba11d" + dependencies: + commander "~2.15.0" + source-map "~0.6.1" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uglifyjs-webpack-plugin@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz#2ef8387c8f1a903ec5e44fa36f9f3cbdcea67641" + dependencies: + cacache "^10.0.4" + find-cache-dir "^1.0.0" + schema-utils "^0.4.5" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + uglify-es "^3.3.4" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + +underscore@>=1.3.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" + +underscore@~1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + +unique-filename@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" + dependencies: + imurmurhash "^0.1.4" + +unique-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" + +unique-stream@^2.0.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" + dependencies: + json-stable-stringify "^1.0.0" + through2-filter "^2.0.0" + +universalify@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +untildify@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" + +unzip-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" + +upath@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + +uri-js@^4.2.1: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + dependencies: + punycode "^2.1.0" + +urijs@^1.19.0: + version "1.19.1" + resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.1.tgz#5b0ff530c0cbde8386f6342235ba5ca6e995d25a" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +url-loader@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.0.1.tgz#61bc53f1f184d7343da2728a1289ef8722ea45ee" + dependencies: + loader-utils "^1.1.0" + mime "^2.0.3" + schema-utils "^0.4.3" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + dependencies: + prepend-http "^2.0.0" + +url-regex@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724" + dependencies: + ip-regex "^1.0.1" + +url-to-options@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +urlsafe-base64@^1.0.0, urlsafe-base64@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/urlsafe-base64/-/urlsafe-base64-1.0.0.tgz#23f89069a6c62f46cf3a1d3b00169cefb90be0c6" + +use@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" + dependencies: + kind-of "^6.0.2" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util-extend@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" + +util.promisify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +util@^0.10.3: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + dependencies: + inherits "2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + +uuid@3.2.1, uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + +uuid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +v-animate-css@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/v-animate-css/-/v-animate-css-0.0.2.tgz#61f233b641de5ab544ab50bc5450c747030e3bde" + +v8-compile-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz#526492e35fc616864284700b7043e01baee09f0a" + +v8flags@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +vali-date@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" + +valid-url@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" + +validate-npm-package-license@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validator@^10.0.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-10.3.0.tgz#157a8c0981858cff381f59aabcdb8f83b57317cc" + +value-or-function@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" + +vary@^1.0.0, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + +vendors@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vinyl-assign@^1.0.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/vinyl-assign/-/vinyl-assign-1.2.1.tgz#4d198891b5515911d771a8cd9c5480a46a074a45" + dependencies: + object-assign "^4.0.1" + readable-stream "^2.0.0" + +vinyl-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/vinyl-file/-/vinyl-file-2.0.0.tgz#a7ebf5ffbefda1b7d18d140fcb07b223efb6751a" + dependencies: + graceful-fs "^4.1.2" + pify "^2.3.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + strip-bom-stream "^2.0.0" + vinyl "^1.1.0" + +vinyl-fs@^0.3.0: + version "0.3.14" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" + dependencies: + defaults "^1.0.0" + glob-stream "^3.1.5" + glob-watcher "^0.0.6" + graceful-fs "^3.0.0" + mkdirp "^0.5.0" + strip-bom "^1.0.0" + through2 "^0.6.1" + vinyl "^0.4.0" + +vinyl-fs@^2.2.0: + version "2.4.4" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239" + dependencies: + duplexify "^3.2.0" + glob-stream "^5.3.2" + graceful-fs "^4.0.0" + gulp-sourcemaps "1.6.0" + is-valid-glob "^0.3.0" + lazystream "^1.0.0" + lodash.isequal "^4.0.0" + merge-stream "^1.0.0" + mkdirp "^0.5.0" + object-assign "^4.0.0" + readable-stream "^2.0.4" + strip-bom "^2.0.0" + strip-bom-stream "^1.0.0" + through2 "^2.0.0" + through2-filter "^2.0.0" + vali-date "^1.0.0" + vinyl "^1.0.0" + +vinyl-fs@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" + dependencies: + fs-mkdirp-stream "^1.0.0" + glob-stream "^6.1.0" + graceful-fs "^4.0.0" + is-valid-glob "^1.0.0" + lazystream "^1.0.0" + lead "^1.0.0" + object.assign "^4.0.4" + pumpify "^1.3.5" + readable-stream "^2.3.3" + remove-bom-buffer "^3.0.0" + remove-bom-stream "^1.2.0" + resolve-options "^1.1.0" + through2 "^2.0.0" + to-through "^2.0.0" + value-or-function "^3.0.0" + vinyl "^2.0.0" + vinyl-sourcemap "^1.1.0" + +vinyl-sourcemap@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" + dependencies: + append-buffer "^1.0.2" + convert-source-map "^1.5.0" + graceful-fs "^4.1.6" + normalize-path "^2.1.1" + now-and-later "^2.0.0" + remove-bom-buffer "^3.0.0" + vinyl "^2.0.0" + +vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" + dependencies: + source-map "^0.5.1" + +vinyl@^0.4.0, vinyl@^0.4.3: + version "0.4.6" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" + dependencies: + clone "^0.2.0" + clone-stats "^0.0.1" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^1.0.0, vinyl@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^2.0.0, vinyl@^2.0.1, vinyl@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c" + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + +void-elements@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + +vue-cropperjs@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/vue-cropperjs/-/vue-cropperjs-2.2.0.tgz#cd8f00ee01914e86f114ee8aa3f7354e3c76a8fc" + dependencies: + cropperjs "^1.1.3" + +vue-eslint-parser@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1" + dependencies: + debug "^3.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.2" + esquery "^1.0.0" + lodash "^4.17.4" + +vue-functional-data-merge@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/vue-functional-data-merge/-/vue-functional-data-merge-2.0.6.tgz#f08055adfb92458debcf2ad10c3aa712277f7fc2" + +vue-hot-reload-api@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz#97976142405d13d8efae154749e88c4e358cf926" + +vue-js-modal@1.3.13: + version "1.3.13" + resolved "https://registry.yarnpkg.com/vue-js-modal/-/vue-js-modal-1.3.13.tgz#1718c3182a94a03e03422db50c60229bbbd53f18" + +vue-json-tree-view@2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/vue-json-tree-view/-/vue-json-tree-view-2.1.4.tgz#b6f8ae2ba2eec4eec5b6f53b90fa187054cad79b" + dependencies: + lodash "^4.17.4" + vue "^2.5.16" + +vue-loader@15.2.1: + version "15.2.1" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.2.1.tgz#89a13b6b7dec63614729c73b1b46a571a69bb20e" + dependencies: + "@vue/component-compiler-utils" "^1.2.1" + hash-sum "^1.0.2" + loader-utils "^1.1.0" + vue-hot-reload-api "^2.3.0" + vue-style-loader "^4.1.0" + +vue-router@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.0.1.tgz#d9b05ad9c7420ba0f626d6500d693e60092cc1e9" + +vue-style-loader@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.0.tgz#7588bd778e2c9f8d87bfc3c5a4a039638da7a863" + dependencies: + hash-sum "^1.0.2" + loader-utils "^1.0.2" + +vue-template-compiler@2.5.16: + version "2.5.16" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.16.tgz#93b48570e56c720cdf3f051cc15287c26fbd04cb" + dependencies: + de-indent "^1.0.2" + he "^1.1.0" + +vue-template-es2015-compiler@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz#dc42697133302ce3017524356a6c61b7b69b4a18" + +vue@2.5.16, vue@^2.5.16: + version "2.5.16" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.16.tgz#07edb75e8412aaeed871ebafa99f4672584a0085" + +vuedraggable@2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/vuedraggable/-/vuedraggable-2.16.0.tgz#52127081a2adb3de5fabd214d404ff3eee63575a" + dependencies: + sortablejs "^1.7.0" + +vuex-persistedstate@^2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/vuex-persistedstate/-/vuex-persistedstate-2.5.4.tgz#a19710ad7f9a08cea4e65fc585924d9fdac7384a" + dependencies: + deepmerge "^2.1.0" + shvl "^1.3.0" + +vuex@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.0.1.tgz#e761352ebe0af537d4bb755a9b9dc4be3df7efd2" + +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + dependencies: + browser-process-hrtime "^0.1.2" + +ware@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ware/-/ware-1.3.0.tgz#d1b14f39d2e2cb4ab8c4098f756fe4b164e473d4" + dependencies: + wrap-fn "^0.1.0" + +watchpack@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +web-push@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/web-push/-/web-push-3.3.1.tgz#6d49517b927ffb97241a719d2f7f9014de130f09" + dependencies: + asn1.js "^5.0.0" + http_ece "1.0.5" + https-proxy-agent "^2.2.1" + jws "^3.1.3" + minimist "^1.2.0" + urlsafe-base64 "^1.0.0" + +webassemblyjs@1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webassemblyjs/-/webassemblyjs-1.4.3.tgz#0591893efb8fbde74498251cbe4b2d83df9239cb" + dependencies: + "@webassemblyjs/ast" "1.4.3" + "@webassemblyjs/validation" "1.4.3" + "@webassemblyjs/wasm-parser" "1.4.3" + "@webassemblyjs/wast-parser" "1.4.3" + long "^3.2.0" + +webfinger.js@2.6.6: + version "2.6.6" + resolved "https://registry.yarnpkg.com/webfinger.js/-/webfinger.js-2.6.6.tgz#52ebdc85da8c8fb6beb690e8e32594c99d2ff4ae" + dependencies: + xhr2 "^0.1.4" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + +webpack-addons@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/webpack-addons/-/webpack-addons-1.1.5.tgz#2b178dfe873fb6e75e40a819fa5c26e4a9bc837a" + dependencies: + jscodeshift "^0.4.0" + +webpack-cli@2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-2.1.4.tgz#cab81e79249127384fb69b2fdfe2055f9c771b76" + dependencies: + chalk "^2.4.1" + cross-spawn "^6.0.5" + diff "^3.5.0" + enhanced-resolve "^4.0.0" + envinfo "^5.7.0" + glob-all "^3.1.0" + global-modules "^1.0.0" + got "^8.3.1" + import-local "^1.0.0" + inquirer "^5.2.0" + interpret "^1.1.0" + jscodeshift "^0.5.0" + listr "^0.14.1" + loader-utils "^1.1.0" + lodash "^4.17.10" + log-symbols "^2.2.0" + mkdirp "^0.5.1" + p-each-series "^1.0.0" + p-lazy "^1.0.0" + prettier "^1.12.1" + supports-color "^5.4.0" + v8-compile-cache "^2.0.0" + webpack-addons "^1.1.5" + yargs "^11.1.0" + yeoman-environment "^2.1.1" + yeoman-generator "^2.0.5" + +webpack-core@~0.6.0: + version "0.6.9" + resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2" + dependencies: + source-list-map "~0.1.7" + source-map "~0.4.1" + +webpack-sources@^1.0.1, webpack-sources@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@4.9.1: + version "4.9.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.9.1.tgz#fa7bd738b17fd7f09f37da461b2f5c16c6565f34" + dependencies: + "@webassemblyjs/ast" "1.4.3" + "@webassemblyjs/wasm-edit" "1.4.3" + "@webassemblyjs/wasm-parser" "1.4.3" + acorn "^5.0.0" + acorn-dynamic-import "^3.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chrome-trace-event "^0.1.1" + enhanced-resolve "^4.0.0" + eslint-scope "^3.7.1" + json-parse-better-errors "^1.0.2" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + micromatch "^3.1.8" + mkdirp "~0.5.0" + neo-async "^2.5.0" + node-libs-browser "^2.0.0" + schema-utils "^0.4.4" + tapable "^1.0.0" + uglifyjs-webpack-plugin "^1.2.4" + watchpack "^1.5.0" + webpack-sources "^1.0.1" + +websocket@1.0.26: + version "1.0.26" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.26.tgz#a03a01299849c35268c83044aa919c6374be8194" + dependencies: + debug "^2.2.0" + nan "^2.3.3" + typedarray-to-buffer "^3.1.2" + yaeti "^0.0.6" + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" + dependencies: + iconv-lite "0.4.19" + +whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" + +whatwg-url@^6.4.0, whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +when@^3.7.7: + version "3.7.8" + resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" + +when@~3.6.x: + version "3.6.4" + resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" + +whet.extend@~0.9.9: + version "0.9.9" + resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + +which@1, which@^1.2.14, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + dependencies: + string-width "^1.0.2 || 2" + +window-or-global@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/window-or-global/-/window-or-global-1.0.1.tgz#dbe45ba2a291aabc56d62cf66c45b7fa322946de" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +window-size@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" + +with@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe" + dependencies: + acorn "^3.1.0" + acorn-globals "^3.0.0" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +worker-farm@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" + dependencies: + errno "~0.1.7" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-fn@^0.1.0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/wrap-fn/-/wrap-fn-0.1.5.tgz#f21b6e41016ff4a7e31720dbc63a09016bdf9845" + dependencies: + co "3.1.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^1.2.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write-file-atomic@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-json-file@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f" + dependencies: + detect-indent "^5.0.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + pify "^3.0.0" + sort-keys "^2.0.0" + write-file-atomic "^2.0.0" + +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" + +ws@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.0.tgz#9fd95e3ac7c76f6ae8bcc868a0e3f11f1290c33e" + dependencies: + async-limiter "~1.0.0" + +ws@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289" + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + +xev@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/xev/-/xev-2.0.1.tgz#24484173a22115bc8a990ef5d4d5129695b827a7" + +xhr2@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + +yaeti@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + +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-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + dependencies: + camelcase "^3.0.0" + +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + dependencies: + camelcase "^4.1.0" + +yargs-parser@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" + dependencies: + camelcase "^4.1.0" + +yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + dependencies: + camelcase "^4.1.0" + +yargs@^10.0.3: + version "10.1.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^8.1.0" + +yargs@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^9.0.2" + +yargs@^4.0.0: + 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@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + 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.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yargs@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" + +yargs@~1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.2.6.tgz#9c7b4a82fd5d595b2bf17ab6dcc43135432fe34b" + dependencies: + minimist "^0.1.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yauzl@^2.2.1: + version "2.9.2" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.9.2.tgz#4fb1bc7ae1fc2f57037b54af6acc8fe1031c5b77" + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yeoman-environment@^2.0.5, yeoman-environment@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-2.2.0.tgz#6c0ee93a8d962a9f6dbc5ad4e90ae7ab34875393" + dependencies: + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^3.1.0" + diff "^3.3.1" + escape-string-regexp "^1.0.2" + globby "^8.0.1" + grouped-queue "^0.3.3" + inquirer "^5.2.0" + is-scoped "^1.0.0" + lodash "^4.17.10" + log-symbols "^2.1.0" + mem-fs "^1.1.0" + strip-ansi "^4.0.0" + text-table "^0.2.0" + untildify "^3.0.2" + +yeoman-generator@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/yeoman-generator/-/yeoman-generator-2.0.5.tgz#57b0b3474701293cc9ec965288f3400b00887c81" + dependencies: + async "^2.6.0" + chalk "^2.3.0" + cli-table "^0.3.1" + cross-spawn "^6.0.5" + dargs "^5.1.0" + dateformat "^3.0.3" + debug "^3.1.0" + detect-conflict "^1.0.0" + error "^7.0.2" + find-up "^2.1.0" + github-username "^4.0.0" + istextorbinary "^2.2.1" + lodash "^4.17.10" + make-dir "^1.1.0" + mem-fs-editor "^4.0.0" + minimist "^1.2.0" + pretty-bytes "^4.0.2" + read-chunk "^2.1.0" + read-pkg-up "^3.0.0" + rimraf "^2.6.2" + run-async "^2.0.0" + shelljs "^0.8.0" + text-table "^0.2.0" + through2 "^2.0.0" + yeoman-environment "^2.0.5" + +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" + +z-schema@^3.16.1: + version "3.22.0" + resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-3.22.0.tgz#e1326063cb438f348c648350770258ff5e20a22b" + dependencies: + lodash.get "^4.0.0" + lodash.isequal "^4.0.0" + validator "^10.0.0" + optionalDependencies: + commander "^2.7.1" From cd8bfca29ce05f283c14bc0172b5dbe2c18a358c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 16 Jun 2018 13:10:17 +0900 Subject: [PATCH 331/369] =?UTF-8?q?npm=20install=20--only=3Ddev=20?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=81=AE=E3=81=8C=E6=97=A2=E5=AD=98=E3=81=AE?= =?UTF-8?q?=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1=E3=83=B3=E3=83=88=E3=81=A8?= =?UTF-8?q?=E4=BA=92=E6=8F=9B=E6=80=A7=E3=81=8C=E7=84=A1=E3=81=84=E3=81=9F?= =?UTF-8?q?=E3=82=81=E6=88=BB=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 72cbc7356b..a830ba8fd0 100644 --- a/package.json +++ b/package.json @@ -86,9 +86,8 @@ "webfinger.js": "2.6.6", "websocket": "1.0.26", "ws": "5.2.0", - "xev": "2.0.1" - }, - "devDependencies": { + "xev": "2.0.1", + "@prezzemolo/zip": "0.0.3", "@types/bcryptjs": "2.4.1", "@types/debug": "0.0.30", From 9cac293efc5433f6a2efc7ec7ae3f5244bcfbd0d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 16 Jun 2018 15:23:03 +0900 Subject: [PATCH 332/369] #1708 --- src/models/note.ts | 3 ++- src/server/api/endpoints/hashtags/trend.ts | 20 +++++++++---------- .../api/endpoints/notes/search_by_tag.ts | 2 +- src/services/note/create.ts | 1 + 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/models/note.ts b/src/models/note.ts index 461bb405a0..21ec2b3857 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -16,7 +16,7 @@ import Following from './following'; const Note = db.get<INote>('notes'); Note.createIndex('uri', { sparse: true, unique: true }); Note.createIndex('userId'); -Note.createIndex('tags', { sparse: true }); +Note.createIndex('tagsLower'); Note.createIndex({ createdAt: -1 }); @@ -40,6 +40,7 @@ export type INote = { poll: any; // todo text: string; tags: string[]; + tagsLower: string[]; cw: string; userId: mongo.ObjectID; appId: mongo.ObjectID; diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts index df7addab98..947dd6e448 100644 --- a/src/server/api/endpoints/hashtags/trend.ts +++ b/src/server/api/endpoints/hashtags/trend.ts @@ -7,7 +7,7 @@ import Note from '../../../../models/note'; const rangeA = 1000 * 60 * 30; // 30分 const rangeB = 1000 * 60 * 120; // 2時間 -const coefficient = 1.5; // 「n倍」の部分 +const coefficient = 1.25; // 「n倍」の部分 const requiredUsers = 3; // 最低何人がそのタグを投稿している必要があるか const max = 5; @@ -22,20 +22,20 @@ module.exports = () => new Promise(async (res, rej) => { createdAt: { $gt: new Date(Date.now() - rangeA) }, - tags: { + tagsLower: { $exists: true, $ne: [] } } }, { - $unwind: '$tags' + $unwind: '$tagsLower' }, { $group: { - _id: { tags: '$tags', userId: '$userId' } + _id: { tag: '$tagsLower', userId: '$userId' } } }]) as Array<{ _id: { - tags: string; + tag: string; userId: any; } }>; @@ -49,12 +49,12 @@ module.exports = () => new Promise(async (res, rej) => { // カウント data.map(x => x._id).forEach(x => { - const i = tags.findIndex(tag => tag.name == x.tags); + const i = tags.findIndex(tag => tag.name == x.tag); if (i != -1) { tags[i].count++; } else { tags.push({ - name: x.tags, + name: x.tag, count: 1 }); } @@ -66,7 +66,7 @@ module.exports = () => new Promise(async (res, rej) => { //#region 2. 1で取得したそれぞれのタグについて、「直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上」かどうかを判定する const hotsPromises = limitedTags.map(async tag => { const passedCount = (await Note.distinct('userId', { - tags: tag.name, + tagsLower: tag.name, createdAt: { $lt: new Date(Date.now() - rangeA), $gt: new Date(Date.now() - rangeB) @@ -108,7 +108,7 @@ module.exports = () => new Promise(async (res, rej) => { for (let i = 0; i < range; i++) { countPromises.push(Promise.all(hots.map(tag => Note.distinct('userId', { - tags: tag, + tagsLower: tag, createdAt: { $lt: new Date(Date.now() - (interval * i)), $gt: new Date(Date.now() - (interval * (i + 1))) @@ -119,7 +119,7 @@ module.exports = () => new Promise(async (res, rej) => { const countsLog = await Promise.all(countPromises); const totalCounts: any = await Promise.all(hots.map(tag => Note.distinct('userId', { - tags: tag, + tagsLower: tag, createdAt: { $gt: new Date(Date.now() - (interval * range)) } diff --git a/src/server/api/endpoints/notes/search_by_tag.ts b/src/server/api/endpoints/notes/search_by_tag.ts index 4cf070f4ce..1eb4cde49c 100644 --- a/src/server/api/endpoints/notes/search_by_tag.ts +++ b/src/server/api/endpoints/notes/search_by_tag.ts @@ -101,7 +101,7 @@ async function search( let q: any = { $and: [{ - tags: tag + tagsLower: tag.toLowerCase() }] }; diff --git a/src/services/note/create.ts b/src/services/note/create.ts index b21bfa316e..98415b8971 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -130,6 +130,7 @@ export default async (user: IUser, data: { poll: data.poll, cw: data.cw == null ? null : data.cw, tags, + tagsLower: tags.map(tag => tag.toLowerCase()), userId: user._id, viaMobile: data.viaMobile, geo: data.geo || null, From 792632d7263e963e45d5d10e8128635334278430 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 16 Jun 2018 15:23:44 +0900 Subject: [PATCH 333/369] 3.0.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a830ba8fd0..fac4383d96 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "3.0.0", + "version": "3.0.1", "clientVersion": "1.0.6517", "codename": "nighthike", "main": "./built/index.js", From 555a0f276cfabfc5288bb76bdf1274cf9e7fb8d4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 16 Jun 2018 18:42:49 +0900 Subject: [PATCH 334/369] MisskeyShare --- package.json | 1 - .../app/desktop/api/choose-drive-file.ts | 2 +- src/client/app/desktop/script.ts | 2 + .../desktop/views/components/post-form.vue | 48 +++++++++++---- src/client/app/desktop/views/pages/share.vue | 58 +++++++++++++++++++ src/client/app/mobile/script.ts | 2 + .../app/mobile/views/components/index.ts | 2 + .../app/mobile/views/components/post-form.vue | 30 +++++++++- src/client/app/mobile/views/pages/share.vue | 56 ++++++++++++++++++ 9 files changed, 185 insertions(+), 16 deletions(-) create mode 100644 src/client/app/desktop/views/pages/share.vue create mode 100644 src/client/app/mobile/views/pages/share.vue diff --git a/package.json b/package.json index fac4383d96..ca6f0387fa 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,6 @@ "websocket": "1.0.26", "ws": "5.2.0", "xev": "2.0.1", - "@prezzemolo/zip": "0.0.3", "@types/bcryptjs": "2.4.1", "@types/debug": "0.0.30", diff --git a/src/client/app/desktop/api/choose-drive-file.ts b/src/client/app/desktop/api/choose-drive-file.ts index 3d0004b741..a362a1289b 100644 --- a/src/client/app/desktop/api/choose-drive-file.ts +++ b/src/client/app/desktop/api/choose-drive-file.ts @@ -21,7 +21,7 @@ export default (os: OS) => opts => { res(file); }; - window.open(url + '/selectdrive', + window.open(url + `/selectdrive?multiple=${o.multiple}`, 'choose_drive_window', 'height=500, width=800'); } diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts index 8b1623ce45..076d532d6d 100644 --- a/src/client/app/desktop/script.ts +++ b/src/client/app/desktop/script.ts @@ -35,6 +35,7 @@ import MkNote from './views/pages/note.vue'; import MkSearch from './views/pages/search.vue'; import MkTag from './views/pages/tag.vue'; import MkOthello from './views/pages/othello.vue'; +import MkShare from './views/pages/share.vue'; /** * init @@ -62,6 +63,7 @@ init(async (launch) => { { path: '/selectdrive', component: MkSelectDrive }, { path: '/search', component: MkSearch }, { path: '/tags/:tag', component: MkTag }, + { path: '/share', component: MkShare }, { path: '/othello', component: MkOthello }, { path: '/othello/:game', component: MkOthello }, { path: '/@:user', component: MkUser }, diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index a0670a084e..33f2288e06 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -58,7 +58,25 @@ export default Vue.extend({ MkVisibilityChooser }, - props: ['reply', 'renote'], + props: { + reply: { + type: Object, + required: false + }, + renote: { + type: Object, + required: false + }, + initialText: { + type: String, + required: false + }, + instant: { + type: Boolean, + required: false, + default: false + } + }, data() { return { @@ -118,6 +136,10 @@ export default Vue.extend({ }, mounted() { + if (this.initialText) { + this.text = this.initialText; + } + if (this.reply && this.reply.user.host != null) { this.text = `@${this.reply.user.username}@${this.reply.user.host} `; } @@ -141,17 +163,19 @@ export default Vue.extend({ this.$nextTick(() => { // 書きかけの投稿を復元 - const draft = JSON.parse(localStorage.getItem('drafts') || '{}')[this.draftId]; - if (draft) { - this.text = draft.data.text; - this.files = draft.data.files; - if (draft.data.poll) { - this.poll = true; - this.$nextTick(() => { - (this.$refs.poll as any).set(draft.data.poll); - }); + if (!this.instant) { + const draft = JSON.parse(localStorage.getItem('drafts') || '{}')[this.draftId]; + if (draft) { + this.text = draft.data.text; + this.files = draft.data.files; + if (draft.data.poll) { + this.poll = true; + this.$nextTick(() => { + (this.$refs.poll as any).set(draft.data.poll); + }); + } + this.$emit('change-attached-media', this.files); } - this.$emit('change-attached-media', this.files); } this.$nextTick(() => this.watch()); @@ -349,6 +373,8 @@ export default Vue.extend({ }, saveDraft() { + if (this.instant) return; + const data = JSON.parse(localStorage.getItem('drafts') || '{}'); data[this.draftId] = { diff --git a/src/client/app/desktop/views/pages/share.vue b/src/client/app/desktop/views/pages/share.vue new file mode 100644 index 0000000000..e60434074a --- /dev/null +++ b/src/client/app/desktop/views/pages/share.vue @@ -0,0 +1,58 @@ +<template> +<div class="pptjhabgjtt7kwskbfv4y3uml6fpuhmr"> + <h1>Misskeyで共有</h1> + <div> + <mk-signin v-if="!$store.getters.isSignedIn"/> + <mk-post-form v-else-if="!posted" :initial-text="text" :instant="true" @posted="posted = true"/> + <p v-if="posted" class="posted">%fa:check%</p> + </div> + <button v-if="posted" class="ui button" @click="close">閉じる</button> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; + +export default Vue.extend({ + data() { + return { + posted: false, + text: new URLSearchParams(location.search).get('text') + }; + }, + methods: { + close() { + window.close(); + } + } +}); +</script> + +<style lang="stylus" scoped> +.pptjhabgjtt7kwskbfv4y3uml6fpuhmr + padding 16px + + > h1 + margin 0 0 8px 0 + color #555 + font-size 20px + text-align center + + > div + max-width 500px + margin 0 auto + background #fff + border solid 1px rgba(#000, 0.1) + border-radius 6px + overflow hidden + + > .posted + display block + margin 0 + padding 64px + text-align center + + > button + display block + margin 16px auto +</style> diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts index 8ee078d621..1572fd73ed 100644 --- a/src/client/app/mobile/script.ts +++ b/src/client/app/mobile/script.ts @@ -37,6 +37,7 @@ import MkUserList from './views/pages/user-list.vue'; import MkSettings from './views/pages/settings.vue'; import MkOthello from './views/pages/othello.vue'; import MkTag from './views/pages/tag.vue'; +import MkShare from './views/pages/share.vue'; /** * init @@ -73,6 +74,7 @@ init((launch) => { { path: '/selectdrive', component: MkSelectDrive }, { path: '/search', component: MkSearch }, { path: '/tags/:tag', component: MkTag }, + { path: '/share', component: MkShare }, { path: '/othello', name: 'othello', component: MkOthello }, { path: '/othello/:game', component: MkOthello }, { path: '/@:user', component: MkUser }, diff --git a/src/client/app/mobile/views/components/index.ts b/src/client/app/mobile/views/components/index.ts index 5ed8427b05..38c130ecbf 100644 --- a/src/client/app/mobile/views/components/index.ts +++ b/src/client/app/mobile/views/components/index.ts @@ -22,6 +22,7 @@ import userTimeline from './user-timeline.vue'; import userListTimeline from './user-list-timeline.vue'; import activity from './activity.vue'; import widgetContainer from './widget-container.vue'; +import postForm from './post-form.vue'; Vue.component('mk-ui', ui); Vue.component('mk-note', note); @@ -45,3 +46,4 @@ Vue.component('mk-user-timeline', userTimeline); Vue.component('mk-user-list-timeline', userListTimeline); Vue.component('mk-activity', activity); Vue.component('mk-widget-container', widgetContainer); +Vue.component('mk-post-form', postForm); diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index 88853fa236..62fa185085 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -54,7 +54,25 @@ export default Vue.extend({ MkVisibilityChooser }, - props: ['reply', 'renote'], + props: { + reply: { + type: Object, + required: false + }, + renote: { + type: Object, + required: false + }, + initialText: { + type: String, + required: false + }, + instant: { + type: Boolean, + required: false, + default: false + } + }, data() { return { @@ -112,6 +130,10 @@ export default Vue.extend({ }, mounted() { + if (this.initialText) { + this.text = this.initialText; + } + if (this.reply && this.reply.user.host != null) { this.text = `@${this.reply.user.username}@${this.reply.user.host} `; } @@ -252,8 +274,10 @@ export default Vue.extend({ visibleUserIds: this.visibility == 'specified' ? this.visibleUsers.map(u => u.id) : undefined, viaMobile: viaMobile }).then(data => { - this.$emit('note'); - this.$destroy(); + this.$emit('posted'); + this.$nextTick(() => { + this.$destroy(); + }); }).catch(err => { this.posting = false; }); diff --git a/src/client/app/mobile/views/pages/share.vue b/src/client/app/mobile/views/pages/share.vue new file mode 100644 index 0000000000..c69498007d --- /dev/null +++ b/src/client/app/mobile/views/pages/share.vue @@ -0,0 +1,56 @@ +<template> +<div class="azibmfpleajagva420swmu4c3r7ni7iw"> + <h1>Misskeyで共有</h1> + <div> + <mk-signin v-if="!$store.getters.isSignedIn"/> + <mk-post-form v-else-if="!posted" :initial-text="text" :instant="true" @posted="posted = true"/> + <p v-if="posted" class="posted">%fa:check%</p> + </div> + <ui-button class="close" v-if="posted" @click="close">閉じる</ui-button> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; + +export default Vue.extend({ + data() { + return { + posted: false, + text: new URLSearchParams(location.search).get('text') + }; + }, + methods: { + close() { + window.close(); + } + } +}); +</script> + +<style lang="stylus" scoped> +.azibmfpleajagva420swmu4c3r7ni7iw + > h1 + margin 8px 0 + color #555 + font-size 20px + text-align center + + > div + max-width 500px + margin 0 auto + + > .posted + display block + margin 0 auto + padding 64px + text-align center + background #fff + border-radius 6px + width calc(100% - 32px) + + > .close + display block + margin 16px auto + width calc(100% - 32px) +</style> From e55a254353b608795386ae5efe1104f1177e6fd6 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 16 Jun 2018 18:43:25 +0900 Subject: [PATCH 335/369] 3.1.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ca6f0387fa..af404da5e9 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "3.0.1", - "clientVersion": "1.0.6517", + "version": "3.1.0", + "clientVersion": "1.0.6526", "codename": "nighthike", "main": "./built/index.js", "private": true, From 80d1ee75433e1c0e166e343c8e9a98c47ace2db2 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 16 Jun 2018 19:45:29 +0900 Subject: [PATCH 336/369] Fix bug --- src/client/app/mobile/api/post.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/mobile/api/post.ts b/src/client/app/mobile/api/post.ts index 0634c52642..15b2f6b691 100644 --- a/src/client/app/mobile/api/post.ts +++ b/src/client/app/mobile/api/post.ts @@ -18,7 +18,7 @@ export default (os) => (opts) => { } }).$mount(); vm.$once('cancel', recover); - vm.$once('note', recover); + vm.$once('posted', recover); document.body.appendChild(vm.$el); (vm as any).focus(); }; From f6d9a7e7c3fa6bd6a6251c0ccd3fc941324ff8fb Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 16 Jun 2018 19:45:47 +0900 Subject: [PATCH 337/369] 3.1.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index af404da5e9..c5092e6f19 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "3.1.0", - "clientVersion": "1.0.6526", + "version": "3.1.1", + "clientVersion": "1.0.6528", "codename": "nighthike", "main": "./built/index.js", "private": true, From f336241576d2a49cf15b3e255fc142597a8f9951 Mon Sep 17 00:00:00 2001 From: Tosuke <tasukeprg@gmail.com> Date: Sat, 16 Jun 2018 19:45:49 +0900 Subject: [PATCH 338/369] improve web app manifest --- src/client/assets/manifest.json | 40 ++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/src/client/assets/manifest.json b/src/client/assets/manifest.json index a0f6745b01..25be82fdc6 100644 --- a/src/client/assets/manifest.json +++ b/src/client/assets/manifest.json @@ -4,11 +4,39 @@ "start_url": "/", "display": "standalone", "background_color": "#313a42", - "icons": { - "16": "/assets/favicon/16.png", - "32": "/assets/favicon/32.png", - "64": "/assets/favicon/64.png", - "128": "/assets/favicon/128.png", - "256": "/assets/favicon/256.png" + "icons": [ + { + "src": "/assets/favicon/16.png", + "size": "16x16", + "type": "image/png" + }, + { + "src": "/assets/favicon/32.png", + "size": "32x32", + "type": "image/png" + }, + { + "src": "/assets/favicon/64.png", + "size": "64x64", + "type": "image/png" + }, + { + "src": "/assets/favicon/128.png", + "size": "128x128", + "type": "image/png" + }, + { + "src": "/assets/favicon/192.png", + "size": "192x192", + "type": "image/png" + }, + { + "src": "/assets/favicon/256.png", + "size": "256x256", + "type": "image/png" + } + ], + "share_target": { + "url_template": "share?text={title}%20-%20{text}%20-%20{url}" } } From d150b10b3e466c6153649354c445cd842b71c38d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 17 Jun 2018 06:57:50 +0900 Subject: [PATCH 339/369] Update default home widgets --- src/client/app/desktop/views/components/home.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index 8774aada63..ba48ce24e8 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -84,7 +84,7 @@ const defaultDesktopHomeWidgets = { 'calendar', 'activity', 'rss', - 'trends', + 'hashtags', 'photo-stream', 'version' ], From 03f20599ba9d192b0c7de391af5d23b63168f18e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 17 Jun 2018 07:39:51 +0900 Subject: [PATCH 340/369] Add missing semicolon --- src/remote/activitypub/renderer/note.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts index 39335a7cca..06956fd23f 100644 --- a/src/remote/activitypub/renderer/note.ts +++ b/src/remote/activitypub/renderer/note.ts @@ -56,7 +56,7 @@ export default async function renderNote(note: INote, dive = true) { const hashtagTags = (note.tags || []).map(renderHashtag); const mentionTags = (note.mentionedRemoteUsers || []).map(renderMention); - const tag = hashtagTags.concat(mentionTags) + const tag = hashtagTags.concat(mentionTags); return { id: `${config.url}/notes/${note._id}`, From 1ef66c962a1cea81dee4f5db32cd011feac7de44 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 17 Jun 2018 08:10:54 +0900 Subject: [PATCH 341/369] reversi :white_flower: :100: --- locales/de.yml | 2 +- locales/en.yml | 4 +- locales/es.yml | 2 +- locales/fr.yml | 2 +- locales/it.yml | 2 +- locales/ja.yml | 2 +- locales/ko.yml | 2 +- locales/pl.yml | 2 +- locales/pt.yml | 2 +- locales/ru.yml | 2 +- locales/zh.yml | 2 +- .../common/scripts/compose-notification.ts | 2 +- .../{othello-game.ts => reversi-game.ts} | 4 +- .../streaming/{othello.ts => reversi.ts} | 8 +-- .../app/common/views/components/index.ts | 4 +- .../{othello.game.vue => reversi.game.vue} | 14 ++-- ...ello.gameroom.vue => reversi.gameroom.vue} | 8 +-- .../{othello.room.vue => reversi.room.vue} | 2 +- .../components/{othello.vue => reversi.vue} | 34 +++++----- src/client/app/desktop/script.ts | 10 +-- .../desktop/views/components/game-window.vue | 6 +- .../views/components/ui.header.nav.vue | 12 ++-- .../views/pages/{othello.vue => reversi.vue} | 6 +- src/client/app/mios.ts | 8 +-- src/client/app/mobile/script.ts | 6 +- .../app/mobile/views/components/ui.header.vue | 12 ++-- .../app/mobile/views/components/ui.nav.vue | 14 ++-- .../views/pages/{othello.vue => reversi.vue} | 10 +-- ...{othello-put-me.mp3 => reversi-put-me.mp3} | Bin ...thello-put-you.mp3 => reversi-put-you.mp3} | Bin src/config/types.ts | 2 +- .../{othello-game.ts => reversi-game.ts} | 12 ++-- ...thello-matching.ts => reversi-matching.ts} | 4 +- src/publishers/stream.ts | 12 ++-- src/{othello => reversi}/ai/back.ts | 14 ++-- src/{othello => reversi}/ai/front.ts | 34 +++++----- src/{othello => reversi}/ai/index.ts | 0 src/{othello => reversi}/core.ts | 4 +- src/{othello => reversi}/maps.ts | 2 +- src/server/api/endpoints.ts | 10 +-- .../endpoints/{othello => reversi}/games.ts | 4 +- .../{othello => reversi}/games/show.ts | 8 +-- .../{othello => reversi}/invitations.ts | 2 +- .../endpoints/{othello => reversi}/match.ts | 18 ++--- .../{othello => reversi}/match/cancel.ts | 2 +- .../{othello-game.ts => reversi-game.ts} | 64 +++++++++--------- .../api/stream/{othello.ts => reversi.ts} | 8 +-- src/server/api/streaming.ts | 10 +-- 48 files changed, 197 insertions(+), 197 deletions(-) rename src/client/app/common/scripts/streaming/{othello-game.ts => reversi-game.ts} (66%) rename src/client/app/common/scripts/streaming/{othello.ts => reversi.ts} (66%) rename src/client/app/common/views/components/{othello.game.vue => reversi.game.vue} (95%) rename src/client/app/common/views/components/{othello.gameroom.vue => reversi.gameroom.vue} (75%) rename src/client/app/common/views/components/{othello.room.vue => reversi.room.vue} (99%) rename src/client/app/common/views/components/{othello.vue => reversi.vue} (85%) rename src/client/app/desktop/views/pages/{othello.vue => reversi.vue} (80%) rename src/client/app/mobile/views/pages/{othello.vue => reversi.vue} (71%) rename src/client/assets/{othello-put-me.mp3 => reversi-put-me.mp3} (100%) rename src/client/assets/{othello-put-you.mp3 => reversi-put-you.mp3} (100%) rename src/models/{othello-game.ts => reversi-game.ts} (89%) rename src/models/{othello-matching.ts => reversi-matching.ts} (90%) rename src/{othello => reversi}/ai/back.ts (97%) rename src/{othello => reversi}/ai/front.ts (83%) rename src/{othello => reversi}/ai/index.ts (100%) rename src/{othello => reversi}/core.ts (99%) rename src/{othello => reversi}/maps.ts (99%) rename src/server/api/endpoints/{othello => reversi}/games.ts (92%) rename src/server/api/endpoints/{othello => reversi}/games/show.ts (75%) rename src/server/api/endpoints/{othello => reversi}/invitations.ts (94%) rename src/server/api/endpoints/{othello => reversi}/match.ts (77%) rename src/server/api/endpoints/{othello => reversi}/match/cancel.ts (68%) rename src/server/api/stream/{othello-game.ts => reversi-game.ts} (78%) rename src/server/api/stream/{othello.ts => reversi.ts} (77%) diff --git a/locales/de.yml b/locales/de.yml index 0a53d74651..dd6deed0f2 100644 --- a/locales/de.yml +++ b/locales/de.yml @@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue: refresh: "Mehr" close: "Schließen" desktop/views/components/game-window.vue: - game: "Othello" + game: "Reversi" desktop/views/components/home.vue: done: "Verbunden" add-widget: "Widget hinzufügen:" diff --git a/locales/en.yml b/locales/en.yml index 9d2e2e76be..4a452dc129 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue: refresh: "More" close: "Close" desktop/views/components/game-window.vue: - game: "Othello" + game: "Reversi" desktop/views/components/home.vue: done: "Submit" add-widget: "Add widget:" @@ -549,7 +549,7 @@ desktop/views/components/ui.header.nav.vue: home: "Home" deck: "Deck" messaging: "Messages" - game: "Play Othello" + game: "Play Reversi" desktop/views/components/ui.header.notifications.vue: title: "Notifications" desktop/views/components/ui.header.post.vue: diff --git a/locales/es.yml b/locales/es.yml index 4d6b348658..add3258292 100644 --- a/locales/es.yml +++ b/locales/es.yml @@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue: refresh: "もっと見る" close: "閉じる" desktop/views/components/game-window.vue: - game: "オセロ" + game: "リバーシ" desktop/views/components/home.vue: done: "完了" add-widget: "ウィジェットを追加:" diff --git a/locales/fr.yml b/locales/fr.yml index e618a876c5..0af534bc61 100644 --- a/locales/fr.yml +++ b/locales/fr.yml @@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue: refresh: "Plus" close: "Fermer" desktop/views/components/game-window.vue: - game: "Othello" + game: "Reversi" desktop/views/components/home.vue: done: "Envoyer" add-widget: "Ajouter un widget" diff --git a/locales/it.yml b/locales/it.yml index 4d6b348658..add3258292 100644 --- a/locales/it.yml +++ b/locales/it.yml @@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue: refresh: "もっと見る" close: "閉じる" desktop/views/components/game-window.vue: - game: "オセロ" + game: "リバーシ" desktop/views/components/home.vue: done: "完了" add-widget: "ウィジェットを追加:" diff --git a/locales/ja.yml b/locales/ja.yml index 86b16adaad..29decefe68 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -384,7 +384,7 @@ desktop/views/components/friends-maker.vue: close: "閉じる" desktop/views/components/game-window.vue: - game: "オセロ" + game: "リバーシ" desktop/views/components/home.vue: done: "完了" diff --git a/locales/ko.yml b/locales/ko.yml index 4d6b348658..add3258292 100644 --- a/locales/ko.yml +++ b/locales/ko.yml @@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue: refresh: "もっと見る" close: "閉じる" desktop/views/components/game-window.vue: - game: "オセロ" + game: "リバーシ" desktop/views/components/home.vue: done: "完了" add-widget: "ウィジェットを追加:" diff --git a/locales/pl.yml b/locales/pl.yml index 7c0d41e693..8febac051c 100644 --- a/locales/pl.yml +++ b/locales/pl.yml @@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue: refresh: "Więcej" close: "Zamknij" desktop/views/components/game-window.vue: - game: "Othello" + game: "Reversi" desktop/views/components/home.vue: done: "Wyślij" add-widget: "Dodaj widżet:" diff --git a/locales/pt.yml b/locales/pt.yml index 141209396f..a195c4d9b5 100644 --- a/locales/pt.yml +++ b/locales/pt.yml @@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue: refresh: "もっと見る" close: "閉じる" desktop/views/components/game-window.vue: - game: "オセロ" + game: "リバーシ" desktop/views/components/home.vue: done: "完了" add-widget: "ウィジェットを追加:" diff --git a/locales/ru.yml b/locales/ru.yml index 57d9f905d0..05992e9310 100644 --- a/locales/ru.yml +++ b/locales/ru.yml @@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue: refresh: "もっと見る" close: "閉じる" desktop/views/components/game-window.vue: - game: "オセロ" + game: "リバーシ" desktop/views/components/home.vue: done: "完了" add-widget: "ウィジェットを追加:" diff --git a/locales/zh.yml b/locales/zh.yml index 655d7e9fe6..cec6ff64a7 100644 --- a/locales/zh.yml +++ b/locales/zh.yml @@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue: refresh: "もっと見る" close: "閉じる" desktop/views/components/game-window.vue: - game: "オセロ" + game: "リバーシ" desktop/views/components/home.vue: done: "完了" add-widget: "ウィジェットを追加:" diff --git a/src/client/app/common/scripts/compose-notification.ts b/src/client/app/common/scripts/compose-notification.ts index c19b1c5ad0..cc28f75998 100644 --- a/src/client/app/common/scripts/compose-notification.ts +++ b/src/client/app/common/scripts/compose-notification.ts @@ -55,7 +55,7 @@ export default function(type, data): Notification { icon: data.user.avatarUrl + '?thumbnail&size=64' }; - case 'othello_invited': + case 'reversi_invited': return { title: '対局への招待があります', body: `${getUserName(data.parent)}さんから`, diff --git a/src/client/app/common/scripts/streaming/othello-game.ts b/src/client/app/common/scripts/streaming/reversi-game.ts similarity index 66% rename from src/client/app/common/scripts/streaming/othello-game.ts rename to src/client/app/common/scripts/streaming/reversi-game.ts index 9e36f647bb..5638b3013f 100644 --- a/src/client/app/common/scripts/streaming/othello-game.ts +++ b/src/client/app/common/scripts/streaming/reversi-game.ts @@ -1,9 +1,9 @@ import Stream from './stream'; import MiOS from '../../../mios'; -export class OthelloGameStream extends Stream { +export class ReversiGameStream extends Stream { constructor(os: MiOS, me, game) { - super(os, 'othello-game', { + super(os, 'reversi-game', { i: me ? me.token : null, game: game.id }); diff --git a/src/client/app/common/scripts/streaming/othello.ts b/src/client/app/common/scripts/streaming/reversi.ts similarity index 66% rename from src/client/app/common/scripts/streaming/othello.ts rename to src/client/app/common/scripts/streaming/reversi.ts index 8f4f217e39..2e4395f0f1 100644 --- a/src/client/app/common/scripts/streaming/othello.ts +++ b/src/client/app/common/scripts/streaming/reversi.ts @@ -2,15 +2,15 @@ import StreamManager from './stream-manager'; import Stream from './stream'; import MiOS from '../../../mios'; -export class OthelloStream extends Stream { +export class ReversiStream extends Stream { constructor(os: MiOS, me) { - super(os, 'othello', { + super(os, 'reversi', { i: me.token }); } } -export class OthelloStreamManager extends StreamManager<OthelloStream> { +export class ReversiStreamManager extends StreamManager<ReversiStream> { private me; private os: MiOS; @@ -23,7 +23,7 @@ export class OthelloStreamManager extends StreamManager<OthelloStream> { public getConnection() { if (this.connection == null) { - this.connection = new OthelloStream(this.os, this.me); + this.connection = new ReversiStream(this.os, this.me); } return this.connection; diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts index b91008f718..5b2fa084fb 100644 --- a/src/client/app/common/views/components/index.ts +++ b/src/client/app/common/views/components/index.ts @@ -27,7 +27,7 @@ import urlPreview from './url-preview.vue'; import twitterSetting from './twitter-setting.vue'; import fileTypeIcon from './file-type-icon.vue'; import Switch from './switch.vue'; -import Othello from './othello.vue'; +import Reversi from './reversi.vue'; import welcomeTimeline from './welcome-timeline.vue'; import uiInput from './ui/input.vue'; import uiButton from './ui/button.vue'; @@ -65,7 +65,7 @@ Vue.component('mk-url-preview', urlPreview); Vue.component('mk-twitter-setting', twitterSetting); Vue.component('mk-file-type-icon', fileTypeIcon); Vue.component('mk-switch', Switch); -Vue.component('mk-othello', Othello); +Vue.component('mk-reversi', Reversi); Vue.component('mk-welcome-timeline', welcomeTimeline); Vue.component('ui-input', uiInput); Vue.component('ui-button', uiButton); diff --git a/src/client/app/common/views/components/othello.game.vue b/src/client/app/common/views/components/reversi.game.vue similarity index 95% rename from src/client/app/common/views/components/othello.game.vue rename to src/client/app/common/views/components/reversi.game.vue index 4c63bd18b8..dc79c95bb8 100644 --- a/src/client/app/common/views/components/othello.game.vue +++ b/src/client/app/common/views/components/reversi.game.vue @@ -43,7 +43,7 @@ <script lang="ts"> import Vue from 'vue'; import * as CRC32 from 'crc-32'; -import Othello, { Color } from '../../../../../othello/core'; +import Reversi, { Color } from '../../../../../reversi/core'; import { url } from '../../../config'; export default Vue.extend({ @@ -52,7 +52,7 @@ export default Vue.extend({ data() { return { game: null, - o: null as Othello, + o: null as Reversi, logs: [], logPos: 0, pollingClock: null @@ -98,7 +98,7 @@ export default Vue.extend({ watch: { logPos(v) { if (!this.game.isEnded) return; - this.o = new Othello(this.game.settings.map, { + this.o = new Reversi(this.game.settings.map, { isLlotheo: this.game.settings.isLlotheo, canPutEverywhere: this.game.settings.canPutEverywhere, loopedBoard: this.game.settings.loopedBoard @@ -115,7 +115,7 @@ export default Vue.extend({ created() { this.game = this.initGame; - this.o = new Othello(this.game.settings.map, { + this.o = new Reversi(this.game.settings.map, { isLlotheo: this.game.settings.isLlotheo, canPutEverywhere: this.game.settings.canPutEverywhere, loopedBoard: this.game.settings.loopedBoard @@ -163,7 +163,7 @@ export default Vue.extend({ // サウンドを再生する if (this.$store.state.device.enableSounds) { - const sound = new Audio(`${url}/assets/othello-put-me.mp3`); + const sound = new Audio(`${url}/assets/reversi-put-me.mp3`); sound.volume = this.$store.state.device.soundVolume; sound.play(); } @@ -187,7 +187,7 @@ export default Vue.extend({ // サウンドを再生する if (this.$store.state.device.enableSounds && x.color != this.myColor) { - const sound = new Audio(`${url}/assets/othello-put-you.mp3`); + const sound = new Audio(`${url}/assets/reversi-put-you.mp3`); sound.volume = this.$store.state.device.soundVolume; sound.play(); } @@ -213,7 +213,7 @@ export default Vue.extend({ onRescue(game) { this.game = game; - this.o = new Othello(this.game.settings.map, { + this.o = new Reversi(this.game.settings.map, { isLlotheo: this.game.settings.isLlotheo, canPutEverywhere: this.game.settings.canPutEverywhere, loopedBoard: this.game.settings.loopedBoard diff --git a/src/client/app/common/views/components/othello.gameroom.vue b/src/client/app/common/views/components/reversi.gameroom.vue similarity index 75% rename from src/client/app/common/views/components/othello.gameroom.vue rename to src/client/app/common/views/components/reversi.gameroom.vue index 2dbd04ce49..7ce0112451 100644 --- a/src/client/app/common/views/components/othello.gameroom.vue +++ b/src/client/app/common/views/components/reversi.gameroom.vue @@ -7,9 +7,9 @@ <script lang="ts"> import Vue from 'vue'; -import XGame from './othello.game.vue'; -import XRoom from './othello.room.vue'; -import { OthelloGameStream } from '../../scripts/streaming/othello-game'; +import XGame from './reversi.game.vue'; +import XRoom from './reversi.room.vue'; +import { ReversiGameStream } from '../../scripts/streaming/reversi-game'; export default Vue.extend({ components: { @@ -25,7 +25,7 @@ export default Vue.extend({ }, created() { this.g = this.game; - this.connection = new OthelloGameStream((this as any).os, this.$store.state.i, this.game); + this.connection = new ReversiGameStream((this as any).os, this.$store.state.i, this.game); this.connection.on('started', this.onStarted); }, beforeDestroy() { diff --git a/src/client/app/common/views/components/othello.room.vue b/src/client/app/common/views/components/reversi.room.vue similarity index 99% rename from src/client/app/common/views/components/othello.room.vue rename to src/client/app/common/views/components/reversi.room.vue index dcf41f2e04..5074845758 100644 --- a/src/client/app/common/views/components/othello.room.vue +++ b/src/client/app/common/views/components/reversi.room.vue @@ -94,7 +94,7 @@ <script lang="ts"> import Vue from 'vue'; -import * as maps from '../../../../../othello/maps'; +import * as maps from '../../../../../reversi/maps'; export default Vue.extend({ props: ['game', 'connection'], diff --git a/src/client/app/common/views/components/othello.vue b/src/client/app/common/views/components/reversi.vue similarity index 85% rename from src/client/app/common/views/components/othello.vue rename to src/client/app/common/views/components/reversi.vue index a0971c45b4..e4d7740bde 100644 --- a/src/client/app/common/views/components/othello.vue +++ b/src/client/app/common/views/components/reversi.vue @@ -1,5 +1,5 @@ <template> -<div class="mk-othello"> +<div class="mk-reversi"> <div v-if="game"> <x-gameroom :game="game"/> </div> @@ -11,14 +11,14 @@ </div> <div class="index" v-else> <h1>Misskey %fa:circle%thell%fa:circle R%</h1> - <p>他のMisskeyユーザーとオセロで対戦しよう</p> + <p>他のMisskeyユーザーとリバーシで対戦しよう</p> <div class="play"> <el-button round>フリーマッチ(準備中)</el-button> <el-button type="primary" round @click="match">指名</el-button> <details> <summary>遊び方</summary> <div> - <p>オセロは、相手と交互に石をボードに置いてゆき、相手の石を挟んでひっくり返しながら、最終的に残った石が多い方が勝ちというボードゲームです。</p> + <p>リバーシは、相手と交互に石をボードに置いてゆき、相手の石を挟んでひっくり返しながら、最終的に残った石が多い方が勝ちというボードゲームです。</p> <dl> <dt><b>フリーマッチ</b></dt> <dd>ランダムなユーザーと対戦するモードです。</dd> @@ -39,7 +39,7 @@ </section> <section v-if="myGames.length > 0"> <h2>自分の対局</h2> - <a class="game" v-for="g in myGames" tabindex="-1" @click.prevent="go(g)" :href="`/othello/${g.id}`"> + <a class="game" v-for="g in myGames" tabindex="-1" @click.prevent="go(g)" :href="`/reversi/${g.id}`"> <mk-avatar class="avatar" :user="g.user1"/> <mk-avatar class="avatar" :user="g.user2"/> <span><b>{{ g.user1.name }}</b> vs <b>{{ g.user2.name }}</b></span> @@ -48,7 +48,7 @@ </section> <section v-if="games.length > 0"> <h2>みんなの対局</h2> - <a class="game" v-for="g in games" tabindex="-1" @click.prevent="go(g)" :href="`/othello/${g.id}`"> + <a class="game" v-for="g in games" tabindex="-1" @click.prevent="go(g)" :href="`/reversi/${g.id}`"> <mk-avatar class="avatar" :user="g.user1"/> <mk-avatar class="avatar" :user="g.user2"/> <span><b>{{ g.user1.name }}</b> vs <b>{{ g.user2.name }}</b></span> @@ -61,7 +61,7 @@ <script lang="ts"> import Vue from 'vue'; -import XGameroom from './othello.gameroom.vue'; +import XGameroom from './reversi.gameroom.vue'; export default Vue.extend({ components: { @@ -93,24 +93,24 @@ export default Vue.extend({ } }, mounted() { - this.connection = (this as any).os.streams.othelloStream.getConnection(); - this.connectionId = (this as any).os.streams.othelloStream.use(); + this.connection = (this as any).os.streams.reversiStream.getConnection(); + this.connectionId = (this as any).os.streams.reversiStream.use(); this.connection.on('matched', this.onMatched); this.connection.on('invited', this.onInvited); - (this as any).api('othello/games', { + (this as any).api('reversi/games', { my: true }).then(games => { this.myGames = games; }); - (this as any).api('othello/games').then(games => { + (this as any).api('reversi/games').then(games => { this.games = games; this.gamesFetching = false; }); - (this as any).api('othello/invitations').then(invitations => { + (this as any).api('reversi/invitations').then(invitations => { this.invitations = this.invitations.concat(invitations); }); @@ -126,13 +126,13 @@ export default Vue.extend({ beforeDestroy() { this.connection.off('matched', this.onMatched); this.connection.off('invited', this.onInvited); - (this as any).os.streams.othelloStream.dispose(this.connectionId); + (this as any).os.streams.reversiStream.dispose(this.connectionId); clearInterval(this.pingClock); }, methods: { go(game) { - (this as any).api('othello/games/show', { + (this as any).api('reversi/games/show', { gameId: game.id }).then(game => { this.matching = null; @@ -146,7 +146,7 @@ export default Vue.extend({ (this as any).api('users/show', { username }).then(user => { - (this as any).api('othello/match', { + (this as any).api('reversi/match', { userId: user.id }).then(res => { if (res == null) { @@ -160,10 +160,10 @@ export default Vue.extend({ }, cancel() { this.matching = null; - (this as any).api('othello/match/cancel'); + (this as any).api('reversi/match/cancel'); }, accept(invitation) { - (this as any).api('othello/match', { + (this as any).api('reversi/match', { userId: invitation.parent.id }).then(game => { if (game) { @@ -186,7 +186,7 @@ export default Vue.extend({ <style lang="stylus" scoped> @import '~const.styl' -.mk-othello +.mk-reversi color #677f84 background #fff diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts index 076d532d6d..201ab0a83d 100644 --- a/src/client/app/desktop/script.ts +++ b/src/client/app/desktop/script.ts @@ -34,7 +34,7 @@ import MkMessagingRoom from './views/pages/messaging-room.vue'; import MkNote from './views/pages/note.vue'; import MkSearch from './views/pages/search.vue'; import MkTag from './views/pages/tag.vue'; -import MkOthello from './views/pages/othello.vue'; +import MkReversi from './views/pages/reversi.vue'; import MkShare from './views/pages/share.vue'; /** @@ -64,8 +64,8 @@ init(async (launch) => { { path: '/search', component: MkSearch }, { path: '/tags/:tag', component: MkTag }, { path: '/share', component: MkShare }, - { path: '/othello', component: MkOthello }, - { path: '/othello/:game', component: MkOthello }, + { path: '/reversi', component: MkReversi }, + { path: '/reversi/:game', component: MkReversi }, { path: '/@:user', component: MkUser }, { path: '/notes/:note', component: MkNote } ] @@ -166,8 +166,8 @@ function registerNotifications(stream: HomeStreamManager) { setTimeout(n.close.bind(n), 7000); }); - connection.on('othello_invited', matching => { - const _n = composeNotification('othello_invited', matching); + connection.on('reversi_invited', matching => { + const _n = composeNotification('reversi_invited', matching); const n = new Notification(_n.title, { body: _n.body, icon: _n.icon diff --git a/src/client/app/desktop/views/components/game-window.vue b/src/client/app/desktop/views/components/game-window.vue index c3c0f90075..7c6cb9cd40 100644 --- a/src/client/app/desktop/views/components/game-window.vue +++ b/src/client/app/desktop/views/components/game-window.vue @@ -1,7 +1,7 @@ <template> <mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="$destroy"> <span slot="header" :class="$style.header">%fa:gamepad%%i18n:@game%</span> - <mk-othello :class="$style.content" @gamed="g => game = g"/> + <mk-reversi :class="$style.content" @gamed="g => game = g"/> </mk-window> </template> @@ -18,8 +18,8 @@ export default Vue.extend({ computed: { popout(): string { return this.game - ? `${url}/othello/${this.game.id}` - : `${url}/othello`; + ? `${url}/reversi/${this.game.id}` + : `${url}/reversi`; } } }); diff --git a/src/client/app/desktop/views/components/ui.header.nav.vue b/src/client/app/desktop/views/components/ui.header.nav.vue index fe2637cec3..42211b57fe 100644 --- a/src/client/app/desktop/views/components/ui.header.nav.vue +++ b/src/client/app/desktop/views/components/ui.header.nav.vue @@ -56,23 +56,23 @@ export default Vue.extend({ this.connection = (this as any).os.stream.getConnection(); this.connectionId = (this as any).os.stream.use(); - this.connection.on('othello_invited', this.onOthelloInvited); - this.connection.on('othello_no_invites', this.onOthelloNoInvites); + this.connection.on('reversi_invited', this.onReversiInvited); + this.connection.on('reversi_no_invites', this.onReversiNoInvites); } }, beforeDestroy() { if (this.$store.getters.isSignedIn) { - this.connection.off('othello_invited', this.onOthelloInvited); - this.connection.off('othello_no_invites', this.onOthelloNoInvites); + this.connection.off('reversi_invited', this.onReversiInvited); + this.connection.off('reversi_no_invites', this.onReversiNoInvites); (this as any).os.stream.dispose(this.connectionId); } }, methods: { - onOthelloInvited() { + onReversiInvited() { this.hasGameInvitations = true; }, - onOthelloNoInvites() { + onReversiNoInvites() { this.hasGameInvitations = false; }, diff --git a/src/client/app/desktop/views/pages/othello.vue b/src/client/app/desktop/views/pages/reversi.vue similarity index 80% rename from src/client/app/desktop/views/pages/othello.vue rename to src/client/app/desktop/views/pages/reversi.vue index 0d8e987dd9..098fc41f1c 100644 --- a/src/client/app/desktop/views/pages/othello.vue +++ b/src/client/app/desktop/views/pages/reversi.vue @@ -1,6 +1,6 @@ <template> <component :is="ui ? 'mk-ui' : 'div'"> - <mk-othello v-if="!fetching" :init-game="game" @gamed="onGamed"/> + <mk-reversi v-if="!fetching" :init-game="game" @gamed="onGamed"/> </component> </template> @@ -33,7 +33,7 @@ export default Vue.extend({ Progress.start(); this.fetching = true; - (this as any).api('othello/games/show', { + (this as any).api('reversi/games/show', { gameId: this.$route.params.game }).then(game => { this.game = game; @@ -43,7 +43,7 @@ export default Vue.extend({ }); }, onGamed(game) { - history.pushState(null, null, '/othello/' + game.id); + history.pushState(null, null, '/reversi/' + game.id); } } }); diff --git a/src/client/app/mios.ts b/src/client/app/mios.ts index ba3f967a23..9a8d19adbd 100644 --- a/src/client/app/mios.ts +++ b/src/client/app/mios.ts @@ -11,7 +11,7 @@ import { DriveStreamManager } from './common/scripts/streaming/drive'; import { ServerStatsStreamManager } from './common/scripts/streaming/server-stats'; import { NotesStatsStreamManager } from './common/scripts/streaming/notes-stats'; import { MessagingIndexStreamManager } from './common/scripts/streaming/messaging-index'; -import { OthelloStreamManager } from './common/scripts/streaming/othello'; +import { ReversiStreamManager } from './common/scripts/streaming/reversi'; import Err from './common/views/components/connect-failed.vue'; import { LocalTimelineStreamManager } from './common/scripts/streaming/local-timeline'; @@ -108,7 +108,7 @@ export default class MiOS extends EventEmitter { serverStatsStream: ServerStatsStreamManager; notesStatsStream: NotesStatsStreamManager; messagingIndexStream: MessagingIndexStreamManager; - othelloStream: OthelloStreamManager; + reversiStream: ReversiStreamManager; } = { localTimelineStream: null, globalTimelineStream: null, @@ -116,7 +116,7 @@ export default class MiOS extends EventEmitter { serverStatsStream: null, notesStatsStream: null, messagingIndexStream: null, - othelloStream: null + reversiStream: null }; /** @@ -233,7 +233,7 @@ export default class MiOS extends EventEmitter { this.streams.globalTimelineStream = new GlobalTimelineStreamManager(this, this.store.state.i); this.streams.driveStream = new DriveStreamManager(this, this.store.state.i); this.streams.messagingIndexStream = new MessagingIndexStreamManager(this, this.store.state.i); - this.streams.othelloStream = new OthelloStreamManager(this, this.store.state.i); + this.streams.reversiStream = new ReversiStreamManager(this, this.store.state.i); }); //#endregion diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts index 1572fd73ed..cc0a8331ba 100644 --- a/src/client/app/mobile/script.ts +++ b/src/client/app/mobile/script.ts @@ -35,7 +35,7 @@ import MkFavorites from './views/pages/favorites.vue'; import MkUserLists from './views/pages/user-lists.vue'; import MkUserList from './views/pages/user-list.vue'; import MkSettings from './views/pages/settings.vue'; -import MkOthello from './views/pages/othello.vue'; +import MkReversi from './views/pages/reversi.vue'; import MkTag from './views/pages/tag.vue'; import MkShare from './views/pages/share.vue'; @@ -75,8 +75,8 @@ init((launch) => { { path: '/search', component: MkSearch }, { path: '/tags/:tag', component: MkTag }, { path: '/share', component: MkShare }, - { path: '/othello', name: 'othello', component: MkOthello }, - { path: '/othello/:game', component: MkOthello }, + { path: '/reversi', name: 'reversi', component: MkReversi }, + { path: '/reversi/:game', component: MkReversi }, { path: '/@:user', component: MkUser }, { path: '/@:user/followers', component: MkFollowers }, { path: '/@:user/following', component: MkFollowing }, diff --git a/src/client/app/mobile/views/components/ui.header.vue b/src/client/app/mobile/views/components/ui.header.vue index c72b15fb8b..c1ee70d105 100644 --- a/src/client/app/mobile/views/components/ui.header.vue +++ b/src/client/app/mobile/views/components/ui.header.vue @@ -45,8 +45,8 @@ export default Vue.extend({ this.connection = (this as any).os.stream.getConnection(); this.connectionId = (this as any).os.stream.use(); - this.connection.on('othello_invited', this.onOthelloInvited); - this.connection.on('othello_no_invites', this.onOthelloNoInvites); + this.connection.on('reversi_invited', this.onReversiInvited); + this.connection.on('reversi_no_invites', this.onReversiNoInvites); const ago = (new Date().getTime() - new Date(this.$store.state.i.lastUsedAt).getTime()) / 1000; const isHisasiburi = ago >= 3600; @@ -98,16 +98,16 @@ export default Vue.extend({ }, beforeDestroy() { if (this.$store.getters.isSignedIn) { - this.connection.off('othello_invited', this.onOthelloInvited); - this.connection.off('othello_no_invites', this.onOthelloNoInvites); + this.connection.off('reversi_invited', this.onReversiInvited); + this.connection.off('reversi_no_invites', this.onReversiNoInvites); (this as any).os.stream.dispose(this.connectionId); } }, methods: { - onOthelloInvited() { + onReversiInvited() { this.hasGameInvitation = true; }, - onOthelloNoInvites() { + onReversiNoInvites() { this.hasGameInvitation = false; } } diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue index 80f60e4232..bb7a2f558c 100644 --- a/src/client/app/mobile/views/components/ui.nav.vue +++ b/src/client/app/mobile/views/components/ui.nav.vue @@ -19,7 +19,7 @@ <li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotification">%fa:circle%</template>%fa:angle-right%</router-link></li> <li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessage">%fa:circle%</template>%fa:angle-right%</router-link></li> <li v-if="$store.getters.isSignedIn && $store.state.i.isLocked"><router-link to="/i/received-follow-requests" :data-active="$route.name == 'received-follow-requests'">%fa:R envelope%%i18n:@follow-requests%<template v-if="$store.getters.isSignedIn && $store.state.i.pendingReceivedFollowRequestsCount">%fa:circle%</template>%fa:angle-right%</router-link></li> - <li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%%i18n:@game%<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li> + <li><router-link to="/reversi" :data-active="$route.name == 'reversi'">%fa:gamepad%%i18n:@game%<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li> </ul> <ul> <li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:R calendar-alt%%i18n:@widgets%%fa:angle-right%</router-link></li> @@ -66,14 +66,14 @@ export default Vue.extend({ this.connection = (this as any).os.stream.getConnection(); this.connectionId = (this as any).os.stream.use(); - this.connection.on('othello_invited', this.onOthelloInvited); - this.connection.on('othello_no_invites', this.onOthelloNoInvites); + this.connection.on('reversi_invited', this.onReversiInvited); + this.connection.on('reversi_no_invites', this.onReversiNoInvites); } }, beforeDestroy() { if (this.$store.getters.isSignedIn) { - this.connection.off('othello_invited', this.onOthelloInvited); - this.connection.off('othello_no_invites', this.onOthelloNoInvites); + this.connection.off('reversi_invited', this.onReversiInvited); + this.connection.off('reversi_no_invites', this.onReversiNoInvites); (this as any).os.stream.dispose(this.connectionId); } }, @@ -83,10 +83,10 @@ export default Vue.extend({ if (query == null || query == '') return; this.$router.push('/search?q=' + encodeURIComponent(query)); }, - onOthelloInvited() { + onReversiInvited() { this.hasGameInvitation = true; }, - onOthelloNoInvites() { + onReversiNoInvites() { this.hasGameInvitation = false; }, dark() { diff --git a/src/client/app/mobile/views/pages/othello.vue b/src/client/app/mobile/views/pages/reversi.vue similarity index 71% rename from src/client/app/mobile/views/pages/othello.vue rename to src/client/app/mobile/views/pages/reversi.vue index e04e583c20..e2f0db6d87 100644 --- a/src/client/app/mobile/views/pages/othello.vue +++ b/src/client/app/mobile/views/pages/reversi.vue @@ -1,7 +1,7 @@ <template> <mk-ui> - <span slot="header">%fa:gamepad%オセロ</span> - <mk-othello v-if="!fetching" :init-game="game" @gamed="onGamed"/> + <span slot="header">%fa:gamepad%リバーシ</span> + <mk-reversi v-if="!fetching" :init-game="game" @gamed="onGamed"/> </mk-ui> </template> @@ -23,7 +23,7 @@ export default Vue.extend({ this.fetch(); }, mounted() { - document.title = 'Misskey オセロ'; + document.title = 'Misskey リバーシ'; document.documentElement.style.background = '#fff'; }, methods: { @@ -33,7 +33,7 @@ export default Vue.extend({ Progress.start(); this.fetching = true; - (this as any).api('othello/games/show', { + (this as any).api('reversi/games/show', { gameId: this.$route.params.game }).then(game => { this.game = game; @@ -43,7 +43,7 @@ export default Vue.extend({ }); }, onGamed(game) { - history.pushState(null, null, '/othello/' + game.id); + history.pushState(null, null, '/reversi/' + game.id); } } }); diff --git a/src/client/assets/othello-put-me.mp3 b/src/client/assets/reversi-put-me.mp3 similarity index 100% rename from src/client/assets/othello-put-me.mp3 rename to src/client/assets/reversi-put-me.mp3 diff --git a/src/client/assets/othello-put-you.mp3 b/src/client/assets/reversi-put-you.mp3 similarity index 100% rename from src/client/assets/othello-put-you.mp3 rename to src/client/assets/reversi-put-you.mp3 diff --git a/src/config/types.ts b/src/config/types.ts index 62f63d4a3c..49eeac508b 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -60,7 +60,7 @@ export type Source = { hook_secret: string; username: string; }; - othello_ai?: { + reversi_ai?: { id: string; i: string; }; diff --git a/src/models/othello-game.ts b/src/models/reversi-game.ts similarity index 89% rename from src/models/othello-game.ts rename to src/models/reversi-game.ts index 1dd375d2e5..16b9ab0d4e 100644 --- a/src/models/othello-game.ts +++ b/src/models/reversi-game.ts @@ -3,10 +3,10 @@ import * as deepcopy from 'deepcopy'; import db from '../db/mongodb'; import { IUser, pack as packUser } from './user'; -const OthelloGame = db.get<IOthelloGame>('othelloGames'); -export default OthelloGame; +const ReversiGame = db.get<IReversiGame>('reversiGames'); +export default ReversiGame; -export interface IOthelloGame { +export interface IReversiGame { _id: mongo.ObjectID; createdAt: Date; startedAt: Date; @@ -45,7 +45,7 @@ export interface IOthelloGame { } /** - * Pack an othello game for API response + * Pack an reversi game for API response */ export const pack = ( game: any, @@ -62,11 +62,11 @@ export const pack = ( // Populate the game if 'game' is ID if (mongo.ObjectID.prototype.isPrototypeOf(game)) { - _game = await OthelloGame.findOne({ + _game = await ReversiGame.findOne({ _id: game }); } else if (typeof game === 'string') { - _game = await OthelloGame.findOne({ + _game = await ReversiGame.findOne({ _id: new mongo.ObjectID(game) }); } else { diff --git a/src/models/othello-matching.ts b/src/models/reversi-matching.ts similarity index 90% rename from src/models/othello-matching.ts rename to src/models/reversi-matching.ts index 0efba3ae5d..5efa5d76ad 100644 --- a/src/models/othello-matching.ts +++ b/src/models/reversi-matching.ts @@ -3,7 +3,7 @@ import * as deepcopy from 'deepcopy'; import db from '../db/mongodb'; import { IUser, pack as packUser } from './user'; -const Matching = db.get<IMatching>('othelloMatchings'); +const Matching = db.get<IMatching>('reversiMatchings'); export default Matching; export interface IMatching { @@ -14,7 +14,7 @@ export interface IMatching { } /** - * Pack an othello matching for API response + * Pack an reversi matching for API response */ export const pack = ( matching: any, diff --git a/src/publishers/stream.ts b/src/publishers/stream.ts index 58a6ef49aa..b573b65a65 100644 --- a/src/publishers/stream.ts +++ b/src/publishers/stream.ts @@ -37,12 +37,12 @@ class MisskeyEvent { this.publish(`messaging-index-stream:${userId}`, type, typeof value === 'undefined' ? null : value); } - public publishOthelloStream(userId: ID, type: string, value?: any): void { - this.publish(`othello-stream:${userId}`, type, typeof value === 'undefined' ? null : value); + public publishReversiStream(userId: ID, type: string, value?: any): void { + this.publish(`reversi-stream:${userId}`, type, typeof value === 'undefined' ? null : value); } - public publishOthelloGameStream(gameId: ID, type: string, value?: any): void { - this.publish(`othello-game-stream:${gameId}`, type, typeof value === 'undefined' ? null : value); + public publishReversiGameStream(gameId: ID, type: string, value?: any): void { + this.publish(`reversi-game-stream:${gameId}`, type, typeof value === 'undefined' ? null : value); } public publishLocalTimelineStream(note: any): void { @@ -73,5 +73,5 @@ export const publishUserListStream = ev.publishUserListStream.bind(ev); export const publishNoteStream = ev.publishNoteStream.bind(ev); export const publishMessagingStream = ev.publishMessagingStream.bind(ev); export const publishMessagingIndexStream = ev.publishMessagingIndexStream.bind(ev); -export const publishOthelloStream = ev.publishOthelloStream.bind(ev); -export const publishOthelloGameStream = ev.publishOthelloGameStream.bind(ev); +export const publishReversiStream = ev.publishReversiStream.bind(ev); +export const publishReversiGameStream = ev.publishReversiGameStream.bind(ev); diff --git a/src/othello/ai/back.ts b/src/reversi/ai/back.ts similarity index 97% rename from src/othello/ai/back.ts rename to src/reversi/ai/back.ts index e4d0cfdd33..42f1a0f4b8 100644 --- a/src/othello/ai/back.ts +++ b/src/reversi/ai/back.ts @@ -7,7 +7,7 @@ */ import * as request from 'request-promise-native'; -import Othello, { Color } from '../core'; +import Reversi, { Color } from '../core'; import conf from '../../config'; import getUserName from '../../renderers/get-user-name'; @@ -17,12 +17,12 @@ let form; /** * BotアカウントのユーザーID */ -const id = conf.othello_ai.id; +const id = conf.reversi_ai.id; /** * BotアカウントのAPIキー */ -const i = conf.othello_ai.i; +const i = conf.reversi_ai.i; let note; @@ -44,7 +44,7 @@ process.on('message', async msg => { //#region TLに投稿する const game = msg.body; - const url = `${conf.url}/othello/${game.id}`; + const url = `${conf.url}/reversi/${game.id}`; const user = game.user1Id == id ? game.user2 : game.user1; const isSettai = form[0].value === 0; const text = isSettai @@ -100,7 +100,7 @@ process.on('message', async msg => { } }); -let o: Othello; +let o: Reversi; let botColor: Color; // 各マスの強さ @@ -113,8 +113,8 @@ let cellWeights; function onGameStarted(g) { game = g; - // オセロエンジン初期化 - o = new Othello(game.settings.map, { + // リバーシエンジン初期化 + o = new Reversi(game.settings.map, { isLlotheo: game.settings.isLlotheo, canPutEverywhere: game.settings.canPutEverywhere, loopedBoard: game.settings.loopedBoard diff --git a/src/othello/ai/front.ts b/src/reversi/ai/front.ts similarity index 83% rename from src/othello/ai/front.ts rename to src/reversi/ai/front.ts index ff74b7216e..25ee43225a 100644 --- a/src/othello/ai/front.ts +++ b/src/reversi/ai/front.ts @@ -17,12 +17,12 @@ import conf from '../../config'; /** * BotアカウントのAPIキー */ -const i = conf.othello_ai.i; +const i = conf.reversi_ai.i; /** * BotアカウントのユーザーID */ -const id = conf.othello_ai.id; +const id = conf.reversi_ai.id; //////////////////////////////////////////////////////////////// @@ -59,7 +59,7 @@ homeStream.on('message', message => { }); if (note.text) { - if (note.text.indexOf('オセロ') > -1) { + if (note.text.indexOf('リバーシ') > -1) { request.post(`${conf.api_url}/notes/create`, { json: { i, replyId: note.id, @@ -76,7 +76,7 @@ homeStream.on('message', message => { if (msg.type == 'messaging_message') { const message = msg.body; if (message.text) { - if (message.text.indexOf('オセロ') > -1) { + if (message.text.indexOf('リバーシ') > -1) { request.post(`${conf.api_url}/messaging/messages/create`, { json: { i, userId: message.userId, @@ -92,7 +92,7 @@ homeStream.on('message', message => { // ユーザーを対局に誘う function invite(userId) { - request.post(`${conf.api_url}/othello/match`, { + request.post(`${conf.api_url}/reversi/match`, { json: { i, userId: userId } @@ -100,21 +100,21 @@ function invite(userId) { } /** - * オセロストリーム + * リバーシストリーム */ -const othelloStream = new ReconnectingWebSocket(`${conf.ws_url}/othello?i=${i}`, undefined, { +const reversiStream = new ReconnectingWebSocket(`${conf.ws_url}/reversi?i=${i}`, undefined, { constructor: WebSocket }); -othelloStream.on('open', () => { - console.log('othello stream opened'); +reversiStream.on('open', () => { + console.log('reversi stream opened'); }); -othelloStream.on('close', () => { - console.log('othello stream closed'); +reversiStream.on('close', () => { + console.log('reversi stream closed'); }); -othelloStream.on('message', message => { +reversiStream.on('message', message => { const msg = JSON.parse(message.toString()); // 招待されたとき @@ -134,12 +134,12 @@ othelloStream.on('message', message => { */ function gameStart(game) { // ゲームストリームに接続 - const gw = new ReconnectingWebSocket(`${conf.ws_url}/othello-game?i=${i}&game=${game.id}`, undefined, { + const gw = new ReconnectingWebSocket(`${conf.ws_url}/reversi-game?i=${i}&game=${game.id}`, undefined, { constructor: WebSocket }); gw.on('open', () => { - console.log('othello game stream opened'); + console.log('reversi game stream opened'); // フォーム const form = [{ @@ -210,19 +210,19 @@ function gameStart(game) { }); gw.on('close', () => { - console.log('othello game stream closed'); + console.log('reversi game stream closed'); }); } /** - * オセロの対局に招待されたとき + * リバーシの対局に招待されたとき * @param inviter 誘ってきたユーザー */ async function onInviteMe(inviter) { console.log(`Someone invited me: @${inviter.username}`); // 承認 - const game = await request.post(`${conf.api_url}/othello/match`, { + const game = await request.post(`${conf.api_url}/reversi/match`, { json: { i, userId: inviter.id diff --git a/src/othello/ai/index.ts b/src/reversi/ai/index.ts similarity index 100% rename from src/othello/ai/index.ts rename to src/reversi/ai/index.ts diff --git a/src/othello/core.ts b/src/reversi/core.ts similarity index 99% rename from src/othello/core.ts rename to src/reversi/core.ts index 217066d375..f1f9de1486 100644 --- a/src/othello/core.ts +++ b/src/reversi/core.ts @@ -37,9 +37,9 @@ export type Undo = { }; /** - * オセロエンジン + * リバーシエンジン */ -export default class Othello { +export default class Reversi { public map: MapPixel[]; public mapWidth: number; public mapHeight: number; diff --git a/src/othello/maps.ts b/src/reversi/maps.ts similarity index 99% rename from src/othello/maps.ts rename to src/reversi/maps.ts index 68e5a446f1..f55cb1d516 100644 --- a/src/othello/maps.ts +++ b/src/reversi/maps.ts @@ -892,7 +892,7 @@ export const test4: Map = { ] }; -// https://misskey.xyz/othello/5aaabf7fe126e10b5216ea09 64 +// https://misskey.xyz/reversi/5aaabf7fe126e10b5216ea09 64 export const test5: Map = { name: 'Test5', category: 'Test', diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts index 5f0a020d6f..a5d13b0237 100644 --- a/src/server/api/endpoints.ts +++ b/src/server/api/endpoints.ts @@ -245,27 +245,27 @@ const endpoints: Endpoint[] = [ }, { - name: 'othello/match', + name: 'reversi/match', withCredential: true }, { - name: 'othello/match/cancel', + name: 'reversi/match/cancel', withCredential: true }, { - name: 'othello/invitations', + name: 'reversi/invitations', withCredential: true }, { - name: 'othello/games', + name: 'reversi/games', withCredential: true }, { - name: 'othello/games/show' + name: 'reversi/games/show' }, { diff --git a/src/server/api/endpoints/othello/games.ts b/src/server/api/endpoints/reversi/games.ts similarity index 92% rename from src/server/api/endpoints/othello/games.ts rename to src/server/api/endpoints/reversi/games.ts index 2320a34b04..9d879ecf23 100644 --- a/src/server/api/endpoints/othello/games.ts +++ b/src/server/api/endpoints/reversi/games.ts @@ -1,5 +1,5 @@ import $ from 'cafy'; import ID from '../../../../cafy-id'; -import OthelloGame, { pack } from '../../../../models/othello-game'; +import ReversiGame, { pack } from '../../../../models/reversi-game'; module.exports = (params, user) => new Promise(async (res, rej) => { // Get 'my' parameter @@ -50,7 +50,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => { } // Fetch games - const games = await OthelloGame.find(q, { + const games = await ReversiGame.find(q, { sort, limit }); diff --git a/src/server/api/endpoints/othello/games/show.ts b/src/server/api/endpoints/reversi/games/show.ts similarity index 75% rename from src/server/api/endpoints/othello/games/show.ts rename to src/server/api/endpoints/reversi/games/show.ts index 6b2f5ce137..f32eb23513 100644 --- a/src/server/api/endpoints/othello/games/show.ts +++ b/src/server/api/endpoints/reversi/games/show.ts @@ -1,19 +1,19 @@ import $ from 'cafy'; import ID from '../../../../../cafy-id'; -import OthelloGame, { pack } from '../../../../../models/othello-game'; -import Othello from '../../../../../othello/core'; +import ReversiGame, { pack } from '../../../../../models/reversi-game'; +import Reversi from '../../../../../reversi/core'; module.exports = (params, user) => new Promise(async (res, rej) => { // Get 'gameId' parameter const [gameId, gameIdErr] = $.type(ID).get(params.gameId); if (gameIdErr) return rej('invalid gameId param'); - const game = await OthelloGame.findOne({ _id: gameId }); + const game = await ReversiGame.findOne({ _id: gameId }); if (game == null) { return rej('game not found'); } - const o = new Othello(game.settings.map, { + const o = new Reversi(game.settings.map, { isLlotheo: game.settings.isLlotheo, canPutEverywhere: game.settings.canPutEverywhere, loopedBoard: game.settings.loopedBoard diff --git a/src/server/api/endpoints/othello/invitations.ts b/src/server/api/endpoints/reversi/invitations.ts similarity index 94% rename from src/server/api/endpoints/othello/invitations.ts rename to src/server/api/endpoints/reversi/invitations.ts index 4761537614..fc487205a9 100644 --- a/src/server/api/endpoints/othello/invitations.ts +++ b/src/server/api/endpoints/reversi/invitations.ts @@ -1,4 +1,4 @@ -import Matching, { pack as packMatching } from '../../../../models/othello-matching'; +import Matching, { pack as packMatching } from '../../../../models/reversi-matching'; module.exports = (params, user) => new Promise(async (res, rej) => { // Find session diff --git a/src/server/api/endpoints/othello/match.ts b/src/server/api/endpoints/reversi/match.ts similarity index 77% rename from src/server/api/endpoints/othello/match.ts rename to src/server/api/endpoints/reversi/match.ts index e70e579755..5a699ddbae 100644 --- a/src/server/api/endpoints/othello/match.ts +++ b/src/server/api/endpoints/reversi/match.ts @@ -1,9 +1,9 @@ import $ from 'cafy'; import ID from '../../../../cafy-id'; -import Matching, { pack as packMatching } from '../../../../models/othello-matching'; -import OthelloGame, { pack as packGame } from '../../../../models/othello-game'; +import Matching, { pack as packMatching } from '../../../../models/reversi-matching'; +import ReversiGame, { pack as packGame } from '../../../../models/reversi-game'; import User from '../../../../models/user'; -import publishUserStream, { publishOthelloStream } from '../../../../publishers/stream'; -import { eighteight } from '../../../../othello/maps'; +import publishUserStream, { publishReversiStream } from '../../../../publishers/stream'; +import { eighteight } from '../../../../reversi/maps'; module.exports = (params, user) => new Promise(async (res, rej) => { // Get 'userId' parameter @@ -28,7 +28,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => { }); // Create game - const game = await OthelloGame.insert({ + const game = await ReversiGame.insert({ createdAt: new Date(), user1Id: exist.parentId, user2Id: user._id, @@ -47,14 +47,14 @@ module.exports = (params, user) => new Promise(async (res, rej) => { // Reponse res(await packGame(game, user)); - publishOthelloStream(exist.parentId, 'matched', await packGame(game, exist.parentId)); + publishReversiStream(exist.parentId, 'matched', await packGame(game, exist.parentId)); const other = await Matching.count({ childId: user._id }); if (other == 0) { - publishUserStream(user._id, 'othello_no_invites'); + publishUserStream(user._id, 'reversi_no_invites'); } } else { // Fetch child @@ -88,8 +88,8 @@ module.exports = (params, user) => new Promise(async (res, rej) => { const packed = await packMatching(matching, child); // 招待 - publishOthelloStream(child._id, 'invited', packed); + publishReversiStream(child._id, 'invited', packed); - publishUserStream(child._id, 'othello_invited', packed); + publishUserStream(child._id, 'reversi_invited', packed); } }); diff --git a/src/server/api/endpoints/othello/match/cancel.ts b/src/server/api/endpoints/reversi/match/cancel.ts similarity index 68% rename from src/server/api/endpoints/othello/match/cancel.ts rename to src/server/api/endpoints/reversi/match/cancel.ts index 562e691061..bc8a4cd640 100644 --- a/src/server/api/endpoints/othello/match/cancel.ts +++ b/src/server/api/endpoints/reversi/match/cancel.ts @@ -1,4 +1,4 @@ -import Matching from '../../../../../models/othello-matching'; +import Matching from '../../../../../models/reversi-matching'; module.exports = (params, user) => new Promise(async (res, rej) => { await Matching.remove({ diff --git a/src/server/api/stream/othello-game.ts b/src/server/api/stream/reversi-game.ts similarity index 78% rename from src/server/api/stream/othello-game.ts rename to src/server/api/stream/reversi-game.ts index 841e542610..63d9b220b0 100644 --- a/src/server/api/stream/othello-game.ts +++ b/src/server/api/stream/reversi-game.ts @@ -1,10 +1,10 @@ import * as websocket from 'websocket'; import * as redis from 'redis'; import * as CRC32 from 'crc-32'; -import OthelloGame, { pack } from '../../../models/othello-game'; -import { publishOthelloGameStream } from '../../../publishers/stream'; -import Othello from '../../../othello/core'; -import * as maps from '../../../othello/maps'; +import ReversiGame, { pack } from '../../../models/reversi-game'; +import { publishReversiGameStream } from '../../../publishers/stream'; +import Reversi from '../../../reversi/core'; +import * as maps from '../../../reversi/maps'; import { ParsedUrlQuery } from 'querystring'; export default function(request: websocket.request, connection: websocket.connection, subscriber: redis.RedisClient, user?: any): void { @@ -12,7 +12,7 @@ export default function(request: websocket.request, connection: websocket.connec const gameId = q.game; // Subscribe game stream - subscriber.subscribe(`misskey:othello-game-stream:${gameId}`); + subscriber.subscribe(`misskey:reversi-game-stream:${gameId}`); subscriber.on('message', (_, data) => { connection.send(data); }); @@ -62,24 +62,24 @@ export default function(request: websocket.request, connection: websocket.connec }); async function updateSettings(settings) { - const game = await OthelloGame.findOne({ _id: gameId }); + const game = await ReversiGame.findOne({ _id: gameId }); if (game.isStarted) return; if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) return; if (game.user1Id.equals(user._id) && game.user1Accepted) return; if (game.user2Id.equals(user._id) && game.user2Accepted) return; - await OthelloGame.update({ _id: gameId }, { + await ReversiGame.update({ _id: gameId }, { $set: { settings } }); - publishOthelloGameStream(gameId, 'update-settings', settings); + publishReversiGameStream(gameId, 'update-settings', settings); } async function initForm(form) { - const game = await OthelloGame.findOne({ _id: gameId }); + const game = await ReversiGame.findOne({ _id: gameId }); if (game.isStarted) return; if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) return; @@ -90,18 +90,18 @@ export default function(request: websocket.request, connection: websocket.connec form2: form }; - await OthelloGame.update({ _id: gameId }, { + await ReversiGame.update({ _id: gameId }, { $set: set }); - publishOthelloGameStream(gameId, 'init-form', { + publishReversiGameStream(gameId, 'init-form', { userId: user._id, form }); } async function updateForm(id, value) { - const game = await OthelloGame.findOne({ _id: gameId }); + const game = await ReversiGame.findOne({ _id: gameId }); if (game.isStarted) return; if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) return; @@ -120,11 +120,11 @@ export default function(request: websocket.request, connection: websocket.connec form1: form }; - await OthelloGame.update({ _id: gameId }, { + await ReversiGame.update({ _id: gameId }, { $set: set }); - publishOthelloGameStream(gameId, 'update-form', { + publishReversiGameStream(gameId, 'update-form', { userId: user._id, id, value @@ -133,40 +133,40 @@ export default function(request: websocket.request, connection: websocket.connec async function message(message) { message.id = Math.random(); - publishOthelloGameStream(gameId, 'message', { + publishReversiGameStream(gameId, 'message', { userId: user._id, message }); } async function accept(accept: boolean) { - const game = await OthelloGame.findOne({ _id: gameId }); + const game = await ReversiGame.findOne({ _id: gameId }); if (game.isStarted) return; let bothAccepted = false; if (game.user1Id.equals(user._id)) { - await OthelloGame.update({ _id: gameId }, { + await ReversiGame.update({ _id: gameId }, { $set: { user1Accepted: accept } }); - publishOthelloGameStream(gameId, 'change-accepts', { + publishReversiGameStream(gameId, 'change-accepts', { user1: accept, user2: game.user2Accepted }); if (accept && game.user2Accepted) bothAccepted = true; } else if (game.user2Id.equals(user._id)) { - await OthelloGame.update({ _id: gameId }, { + await ReversiGame.update({ _id: gameId }, { $set: { user2Accepted: accept } }); - publishOthelloGameStream(gameId, 'change-accepts', { + publishReversiGameStream(gameId, 'change-accepts', { user1: game.user1Accepted, user2: accept }); @@ -179,7 +179,7 @@ export default function(request: websocket.request, connection: websocket.connec if (bothAccepted) { // 3秒後、まだacceptされていたらゲーム開始 setTimeout(async () => { - const freshGame = await OthelloGame.findOne({ _id: gameId }); + const freshGame = await ReversiGame.findOne({ _id: gameId }); if (freshGame == null || freshGame.isStarted || freshGame.isEnded) return; if (!freshGame.user1Accepted || !freshGame.user2Accepted) return; @@ -198,7 +198,7 @@ export default function(request: websocket.request, connection: websocket.connec const map = freshGame.settings.map != null ? freshGame.settings.map : getRandomMap(); - await OthelloGame.update({ _id: gameId }, { + await ReversiGame.update({ _id: gameId }, { $set: { startedAt: new Date(), isStarted: true, @@ -208,7 +208,7 @@ export default function(request: websocket.request, connection: websocket.connec }); //#region 盤面に最初から石がないなどして始まった瞬間に勝敗が決定する場合があるのでその処理 - const o = new Othello(map, { + const o = new Reversi(map, { isLlotheo: freshGame.settings.isLlotheo, canPutEverywhere: freshGame.settings.canPutEverywhere, loopedBoard: freshGame.settings.loopedBoard @@ -224,7 +224,7 @@ export default function(request: websocket.request, connection: websocket.connec winner = null; } - await OthelloGame.update({ + await ReversiGame.update({ _id: gameId }, { $set: { @@ -233,27 +233,27 @@ export default function(request: websocket.request, connection: websocket.connec } }); - publishOthelloGameStream(gameId, 'ended', { + publishReversiGameStream(gameId, 'ended', { winnerId: winner, game: await pack(gameId, user) }); } //#endregion - publishOthelloGameStream(gameId, 'started', await pack(gameId, user)); + publishReversiGameStream(gameId, 'started', await pack(gameId, user)); }, 3000); } } // 石を打つ async function set(pos) { - const game = await OthelloGame.findOne({ _id: gameId }); + const game = await ReversiGame.findOne({ _id: gameId }); if (!game.isStarted) return; if (game.isEnded) return; if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) return; - const o = new Othello(game.settings.map, { + const o = new Reversi(game.settings.map, { isLlotheo: game.settings.isLlotheo, canPutEverywhere: game.settings.canPutEverywhere, loopedBoard: game.settings.loopedBoard @@ -290,7 +290,7 @@ export default function(request: websocket.request, connection: websocket.connec const crc32 = CRC32.str(game.logs.map(x => x.pos.toString()).join('') + pos.toString()); - await OthelloGame.update({ + await ReversiGame.update({ _id: gameId }, { $set: { @@ -303,12 +303,12 @@ export default function(request: websocket.request, connection: websocket.connec } }); - publishOthelloGameStream(gameId, 'set', Object.assign(log, { + publishReversiGameStream(gameId, 'set', Object.assign(log, { next: o.turn })); if (o.isEnded) { - publishOthelloGameStream(gameId, 'ended', { + publishReversiGameStream(gameId, 'ended', { winnerId: winner, game: await pack(gameId, user) }); @@ -316,7 +316,7 @@ export default function(request: websocket.request, connection: websocket.connec } async function check(crc32) { - const game = await OthelloGame.findOne({ _id: gameId }); + const game = await ReversiGame.findOne({ _id: gameId }); if (!game.isStarted) return; diff --git a/src/server/api/stream/othello.ts b/src/server/api/stream/reversi.ts similarity index 77% rename from src/server/api/stream/othello.ts rename to src/server/api/stream/reversi.ts index fa62b05836..35c6167364 100644 --- a/src/server/api/stream/othello.ts +++ b/src/server/api/stream/reversi.ts @@ -1,12 +1,12 @@ import * as mongo from 'mongodb'; import * as websocket from 'websocket'; import * as redis from 'redis'; -import Matching, { pack } from '../../../models/othello-matching'; +import Matching, { pack } from '../../../models/reversi-matching'; import publishUserStream from '../../../publishers/stream'; export default function(request: websocket.request, connection: websocket.connection, subscriber: redis.RedisClient, user: any): void { - // Subscribe othello stream - subscriber.subscribe(`misskey:othello-stream:${user._id}`); + // Subscribe reversi stream + subscriber.subscribe(`misskey:reversi-stream:${user._id}`); subscriber.on('message', (_, data) => { connection.send(data); }); @@ -22,7 +22,7 @@ export default function(request: websocket.request, connection: websocket.connec childId: new mongo.ObjectID(msg.id) }); if (matching == null) return; - publishUserStream(matching.childId, 'othello_invited', await pack(matching, matching.childId)); + publishUserStream(matching.childId, 'reversi_invited', await pack(matching, matching.childId)); break; } }); diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts index 2d4cfc108f..a3e4ed6f85 100644 --- a/src/server/api/streaming.ts +++ b/src/server/api/streaming.ts @@ -10,8 +10,8 @@ import userListStream from './stream/user-list'; import driveStream from './stream/drive'; import messagingStream from './stream/messaging'; import messagingIndexStream from './stream/messaging-index'; -import othelloGameStream from './stream/othello-game'; -import othelloStream from './stream/othello'; +import reversiGameStream from './stream/reversi-game'; +import reversiStream from './stream/reversi'; import serverStatsStream from './stream/server-stats'; import notesStatsStream from './stream/notes-stats'; import requestsStream from './stream/requests'; @@ -56,8 +56,8 @@ module.exports = (server: http.Server) => { const q = request.resourceURL.query as ParsedUrlQuery; const [user, app] = await authenticate(q.i as string); - if (request.resourceURL.pathname === '/othello-game') { - othelloGameStream(request, connection, subscriber, user); + if (request.resourceURL.pathname === '/reversi-game') { + reversiGameStream(request, connection, subscriber, user); return; } @@ -75,7 +75,7 @@ module.exports = (server: http.Server) => { request.resourceURL.pathname === '/drive' ? driveStream : request.resourceURL.pathname === '/messaging' ? messagingStream : request.resourceURL.pathname === '/messaging-index' ? messagingIndexStream : - request.resourceURL.pathname === '/othello' ? othelloStream : + request.resourceURL.pathname === '/reversi' ? reversiStream : null; if (channel !== null) { From 11cf82c6a43285bade1e574a5e8294075993f45f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 17 Jun 2018 08:15:57 +0900 Subject: [PATCH 342/369] 4.0.0 --- CHANGELOG.md | 11 +++++++++++ package.json | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 614d50d0ff..a06780b108 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,17 @@ ChangeLog ========= +4.0.0 +----- + +オセロがリバーシに変更されました。 + +### Migration + +MongoDBの、`othelloGames`と`othelloMatchings`コレクションをそれぞれ`reversiGames`と`reversiMatchings`にリネームしてください。 + +You need to rename `othelloGames` and `othelloMatchings` MongoDB collections to `reversiGames` and `reversiMatchings`. + 3.0.0 ----- diff --git a/package.json b/package.json index c5092e6f19..bd5dc8e84f 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "3.1.1", - "clientVersion": "1.0.6528", + "version": "4.0.0", + "clientVersion": "1.0.6535", "codename": "nighthike", "main": "./built/index.js", "private": true, From 2acaca858290c26616603452f6364f7a35d20396 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Sun, 17 Jun 2018 08:20:22 +0900 Subject: [PATCH 343/369] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a06780b108..7978ea43ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ ChangeLog ========= +破壊的変更のみ記載。 + +This document only describes breaking changes. + 4.0.0 ----- From 69a3efd5347defc177e3ef37995e405c87f5037f Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Sun, 17 Jun 2018 08:20:56 +0900 Subject: [PATCH 344/369] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7978ea43ce..0c3340aca4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ChangeLog 破壊的変更のみ記載。 -This document only describes breaking changes. +This document describes breaking changes only. 4.0.0 ----- From e4e65a4cd53cd0eabe3158987e71b6c73ae0c06c Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Sun, 17 Jun 2018 08:23:46 +0900 Subject: [PATCH 345/369] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c3340aca4..5c0214ff9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ This document describes breaking changes only. オセロがリバーシに変更されました。 +Othello is now Reversi. + ### Migration MongoDBの、`othelloGames`と`othelloMatchings`コレクションをそれぞれ`reversiGames`と`reversiMatchings`にリネームしてください。 From 2fcebdd2813a5019eceaf290c4bdfa4e47f65a92 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 17 Jun 2018 11:23:18 +0900 Subject: [PATCH 346/369] cors --- package.json | 118 ++++++++++++++++++++-------------------- src/server/api/index.ts | 2 + 2 files changed, 61 insertions(+), 59 deletions(-) diff --git a/package.json b/package.json index bd5dc8e84f..fc61e99b81 100644 --- a/package.json +++ b/package.json @@ -29,64 +29,6 @@ "@fortawesome/fontawesome-free-solid": "5.0.2", "@koa/cors": "2.2.1", "@prezzemolo/rap": "0.1.2", - "autwh": "0.1.0", - "bcryptjs": "2.4.3", - "cafy": "8.0.0", - "chalk": "2.4.1", - "crc-32": "1.2.0", - "debug": "3.1.0", - "deepcopy": "0.6.3", - "diskusage": "0.2.4", - "elasticsearch": "15.0.0", - "emojilib": "2.2.12", - "escape-regexp": "0.0.1", - "file-type": "8.0.0", - "gm": "1.23.1", - "http-signature": "1.2.0", - "is-root": "2.0.0", - "is-url": "1.2.4", - "js-yaml": "3.11.0", - "jsdom": "11.11.0", - "koa": "2.5.1", - "koa-bodyparser": "4.2.1", - "koa-compress": "3.0.0", - "koa-favicon": "2.0.1", - "koa-json-body": "5.3.0", - "koa-logger": "3.2.0", - "koa-mount": "3.0.0", - "koa-multer": "1.0.2", - "koa-router": "7.4.0", - "koa-send": "4.1.3", - "koa-slow": "2.1.0", - "koa-views": "6.1.4", - "kue": "0.11.6", - "mongodb": "3.0.10", - "monk": "6.0.6", - "ms": "2.1.1", - "nopt": "4.0.1", - "os-utils": "0.0.14", - "parse5": "5.0.0", - "prominence": "0.2.0", - "promise-sequential": "1.1.1", - "punycode": "2.1.1", - "qrcode": "1.2.0", - "ratelimiter": "3.0.3", - "recaptcha-promise": "0.1.3", - "reconnecting-websocket": "3.2.2", - "redis": "2.8.0", - "request": "2.87.0", - "request-promise-native": "1.0.5", - "rndstr": "1.0.0", - "speakeasy": "2.0.0", - "summaly": "2.0.6", - "tcp-port-used": "0.1.2", - "tmp": "0.0.33", - "uuid": "3.2.1", - "web-push": "3.3.1", - "webfinger.js": "2.6.6", - "websocket": "1.0.26", - "ws": "5.2.0", - "xev": "2.0.1", "@prezzemolo/zip": "0.0.3", "@types/bcryptjs": "2.4.1", "@types/debug": "0.0.30", @@ -142,17 +84,30 @@ "@types/ws": "5.1.1", "animejs": "2.2.0", "autosize": "4.0.2", + "autwh": "0.1.0", + "bcryptjs": "2.4.3", "bootstrap-vue": "2.0.0-rc.6", + "cafy": "8.0.0", + "chalk": "2.4.1", + "crc-32": "1.2.0", "css-loader": "0.28.11", + "debug": "3.1.0", "deep-equal": "1.0.1", + "deepcopy": "0.6.3", + "diskusage": "0.2.4", "dompurify": "1.0.4", + "elasticsearch": "15.0.0", "element-ui": "2.3.9", + "emojilib": "2.2.12", + "escape-regexp": "0.0.1", "eslint": "4.19.1", "eslint-plugin-vue": "4.5.0", "eventemitter3": "3.1.0", "exif-js": "2.3.0", "file-loader": "1.1.11", + "file-type": "8.0.0", "fuckadblock": "3.2.1", + "gm": "1.23.1", "gulp": "3.9.1", "gulp-cssnano": "2.1.3", "gulp-htmlmin": "4.0.0", @@ -170,32 +125,71 @@ "hard-source-webpack-plugin": "0.6.10", "highlight.js": "9.12.0", "html-minifier": "3.5.16", + "http-signature": "1.2.0", "inquirer": "5.2.0", + "is-root": "2.0.0", + "is-url": "1.2.4", + "js-yaml": "3.11.0", + "jsdom": "11.11.0", + "koa": "2.5.1", + "koa-bodyparser": "4.2.1", + "koa-compress": "3.0.0", + "koa-favicon": "2.0.1", + "koa-json-body": "5.3.0", + "koa-logger": "3.2.0", + "koa-mount": "3.0.0", + "koa-multer": "1.0.2", + "koa-router": "7.4.0", + "koa-send": "4.1.3", + "koa-slow": "2.1.0", + "koa-views": "6.1.4", + "kue": "0.11.6", "license-checker": "20.0.0", "loader-utils": "1.1.0", "mecab-async": "0.1.2", "mkdirp": "0.5.1", "mocha": "5.2.0", "moji": "0.5.1", + "mongodb": "3.0.10", + "monk": "6.0.6", + "ms": "2.1.1", "nan": "2.10.0", "node-sass": "4.9.0", "node-sass-json-importer": "3.2.0", + "nopt": "4.0.1", "nprogress": "0.2.0", "object-assign-deep": "0.4.0", "on-build-webpack": "0.1.0", + "os-utils": "0.0.14", + "parse5": "5.0.0", "progress-bar-webpack-plugin": "1.11.0", + "prominence": "0.2.0", + "promise-sequential": "1.1.1", "pug": "2.0.3", + "punycode": "2.1.1", + "qrcode": "1.2.0", + "ratelimiter": "3.0.3", + "recaptcha-promise": "0.1.3", + "reconnecting-websocket": "3.2.2", + "redis": "2.8.0", + "request": "2.87.0", + "request-promise-native": "1.0.5", "rimraf": "2.6.2", + "rndstr": "1.0.0", "s-age": "1.1.2", "sass-loader": "7.0.1", "seedrandom": "2.4.3", "single-line-log": "1.1.2", + "speakeasy": "2.0.0", "style-loader": "0.21.0", "stylus": "0.54.5", "stylus-loader": "3.0.2", + "summaly": "2.0.6", "swagger-jsdoc": "1.9.7", "syuilo-password-strength": "0.0.1", + "tcp-port-used": "0.1.2", "textarea-caret": "3.1.0", + "tmp": "0.0.33", "ts-loader": "4.3.0", "ts-node": "6.0.4", "tslint": "5.10.0", @@ -203,6 +197,7 @@ "typescript-eslint-parser": "15.0.0", "uglify-es": "3.3.9", "url-loader": "1.0.1", + "uuid": "3.2.1", "v-animate-css": "0.0.2", "vue": "2.5.16", "vue-cropperjs": "2.2.0", @@ -214,7 +209,12 @@ "vuedraggable": "2.16.0", "vuex": "3.0.1", "vuex-persistedstate": "^2.5.4", + "web-push": "3.3.1", + "webfinger.js": "2.6.6", "webpack": "4.9.1", - "webpack-cli": "2.1.4" + "webpack-cli": "2.1.4", + "websocket": "1.0.26", + "ws": "5.2.0", + "xev": "2.0.1" } } diff --git a/src/server/api/index.ts b/src/server/api/index.ts index 009c99acae..23203d9147 100644 --- a/src/server/api/index.ts +++ b/src/server/api/index.ts @@ -6,6 +6,7 @@ import * as Koa from 'koa'; import * as Router from 'koa-router'; import * as multer from 'koa-multer'; import * as bodyParser from 'koa-bodyparser'; +const cors = require('@koa/cors'); import endpoints from './endpoints'; @@ -13,6 +14,7 @@ const handler = require('./api-handler').default; // Init app const app = new Koa(); +app.use(cors()); app.use(bodyParser({ // リクエストが multipart/form-data でない限りはJSONだと見なす detectJSON: ctx => !ctx.is('multipart/form-data') From 750c0d7df27eeab4caf0133cd3ba338940828533 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 17 Jun 2018 11:27:20 +0900 Subject: [PATCH 347/369] Use wildcard --- src/server/api/index.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/server/api/index.ts b/src/server/api/index.ts index 23203d9147..c39911c35f 100644 --- a/src/server/api/index.ts +++ b/src/server/api/index.ts @@ -14,7 +14,11 @@ const handler = require('./api-handler').default; // Init app const app = new Koa(); -app.use(cors()); + +app.use(cors({ + origin: '*' +})); + app.use(bodyParser({ // リクエストが multipart/form-data でない限りはJSONだと見なす detectJSON: ctx => !ctx.is('multipart/form-data') From 73f5bf69e80d551d2e86b868bb465bd158d16359 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 17 Jun 2018 11:33:24 +0900 Subject: [PATCH 348/369] 4.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fc61e99b81..a5aceeef81 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "4.0.0", + "version": "4.1.0", "clientVersion": "1.0.6535", "codename": "nighthike", "main": "./built/index.js", From 0460cdedd7a3c05915185547ea0996c09669fea6 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 17 Jun 2018 11:42:23 +0900 Subject: [PATCH 349/369] =?UTF-8?q?input=E3=81=AEsuffix=E3=81=8C=E3=81=AF?= =?UTF-8?q?=E3=81=BF=E5=87=BA=E3=81=99=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 ++-- src/client/app/common/views/components/ui/input.vue | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a5aceeef81..9cbbab1984 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "4.1.0", - "clientVersion": "1.0.6535", + "version": "4.1.1", + "clientVersion": "1.0.6542", "codename": "nighthike", "main": "./built/index.js", "private": true, diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue index 0d11c14131..ce28bfb12a 100644 --- a/src/client/app/common/views/components/ui/input.vue +++ b/src/client/app/common/views/components/ui/input.vue @@ -289,6 +289,10 @@ root(isDark, fill) > * display block min-width 16px + max-width 150px + overflow hidden + white-space nowrap + text-overflow ellipsis > .prefix left 0 From 77013f982de34c99c1ea787888bcd7d690b8364c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 17 Jun 2018 13:52:52 +0900 Subject: [PATCH 350/369] Fiox bug --- src/client/app/desktop/views/pages/deck/deck.widgets-column.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue index 05e7f88a25..15397232e0 100644 --- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue @@ -116,6 +116,8 @@ export default Vue.extend({ data: {} } }); + + this.widgetAdderSelected = null; }, removeWidget(widget) { From e5468713acfad73dbd8043a2a4afc8178aa45b97 Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Sun, 17 Jun 2018 14:11:31 +0900 Subject: [PATCH 351/369] maybe Support CW in ActivityPub --- src/remote/activitypub/models/note.ts | 1 + src/remote/activitypub/renderer/note.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/remote/activitypub/models/note.ts b/src/remote/activitypub/models/note.ts index 91e700ef6f..974fce433b 100644 --- a/src/remote/activitypub/models/note.ts +++ b/src/remote/activitypub/models/note.ts @@ -170,6 +170,7 @@ export async function createNote(value: any, resolver?: Resolver, silent = false media, reply, renote: undefined, + cw: note.summary, text: text, viaMobile: false, geo: undefined, diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts index a05c12b388..4c531da970 100644 --- a/src/remote/activitypub/renderer/note.ts +++ b/src/remote/activitypub/renderer/note.ts @@ -49,6 +49,7 @@ export default async function renderNote(note: INote, dive = true) { id: `${config.url}/notes/${note._id}`, type: 'Note', attributedTo, + summary: note.cw, content: toHtml(note), published: note.createdAt.toISOString(), to: 'https://www.w3.org/ns/activitystreams#Public', From 4991fb27698baa20a80a766d2e30e91720d2e0f9 Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Sun, 17 Jun 2018 14:29:07 +0900 Subject: [PATCH 352/369] Fix #1700 --- src/models/note.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/models/note.ts b/src/models/note.ts index 21ec2b3857..83e85f8498 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -343,6 +343,10 @@ export const pack = async ( _note.mediaIds = []; _note.text = null; _note.poll = null; + _note.cw = null; + _note.tags = []; + _note.tagsLower = []; + _note.geo = null; _note.isHidden = true; } From f0fec654ff4c533f16a4f2e9e30d19d102f94a63 Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Sun, 17 Jun 2018 15:58:23 +0900 Subject: [PATCH 353/369] fix #1726 --- src/remote/activitypub/misc/get-note-html.ts | 2 +- src/text/html.ts | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/remote/activitypub/misc/get-note-html.ts b/src/remote/activitypub/misc/get-note-html.ts index 5bca4eed62..33dd381689 100644 --- a/src/remote/activitypub/misc/get-note-html.ts +++ b/src/remote/activitypub/misc/get-note-html.ts @@ -6,7 +6,7 @@ import config from '../../../config'; export default function(note: INote) { if (note.text == null) return null; - let html = toHtml(parse(note.text)); + let html = toHtml(parse(note.text), note.mentionedRemoteUsers); if (note.poll != null) { const url = `${config.url}/notes/${note._id}`; diff --git a/src/text/html.ts b/src/text/html.ts index 70b341689a..a51406ca85 100644 --- a/src/text/html.ts +++ b/src/text/html.ts @@ -1,8 +1,9 @@ import { lib as emojilib } from 'emojilib'; import { JSDOM } from 'jsdom'; import config from '../config'; +import { INote } from '../models/note'; -const handlers = { +const handlers: {[key: string]: (window: any, token: any, mentionedRemoteUsers: INote["mentionedRemoteUsers"]) => void} = { bold({ document }, { bold }) { const b = document.createElement('b'); b.textContent = bold; @@ -44,9 +45,10 @@ const handlers = { document.body.appendChild(a); }, - mention({ document }, { content }) { + mention({ document }, { content, username, host }, mentionedRemoteUsers) { const a = document.createElement('a'); - a.href = `${config.url}/${content}`; + const remoteUserInfo = mentionedRemoteUsers.find(remoteUser => remoteUser.username === username && remoteUser.host === host); + a.href = remoteUserInfo ? remoteUserInfo.uri : `${config.url}/${content}`; a.textContent = content; document.body.appendChild(a); }, @@ -88,11 +90,11 @@ const handlers = { } }; -export default tokens => { +export default (tokens, mentionedRemoteUsers: INote["mentionedRemoteUsers"] = []) => { const { window } = new JSDOM(''); for (const token of tokens) { - handlers[token.type](window, token); + handlers[token.type](window, token, mentionedRemoteUsers); } return `<p>${window.document.body.innerHTML}</p>`; From d692bb3c523ce237d240177efc471170bbe1b3a4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 17 Jun 2018 16:40:18 +0900 Subject: [PATCH 354/369] Improve user search --- src/server/api/endpoints/users/search.ts | 1 + .../api/endpoints/users/search_by_username.ts | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/server/api/endpoints/users/search.ts b/src/server/api/endpoints/users/search.ts index cfbdc337bf..95b9e4f4bb 100644 --- a/src/server/api/endpoints/users/search.ts +++ b/src/server/api/endpoints/users/search.ts @@ -40,6 +40,7 @@ async function byNative(res, rej, me, query, offset, max) { // Search users const users = await User .find({ + host: null, $or: [{ usernameLower: new RegExp(escapedQuery.replace('@', '').toLowerCase()) }, { diff --git a/src/server/api/endpoints/users/search_by_username.ts b/src/server/api/endpoints/users/search_by_username.ts index 5927d00faf..7c9fbba0fa 100644 --- a/src/server/api/endpoints/users/search_by_username.ts +++ b/src/server/api/endpoints/users/search_by_username.ts @@ -20,15 +20,27 @@ module.exports = (params, me) => new Promise(async (res, rej) => { const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) return rej('invalid limit param'); - const users = await User + let users = await User .find({ + host: null, usernameLower: new RegExp(query.toLowerCase()) }, { limit: limit, skip: offset }); + if (users.length < limit) { + const remoteUsers = await User + .find({ + host: { $ne: null }, + usernameLower: new RegExp(query.toLowerCase()) + }, { + limit: limit - users.length + }); + + users = users.concat(remoteUsers); + } + // Serialize - res(await Promise.all(users.map(async user => - await pack(user, me, { detail: true })))); + res(await Promise.all(users.map(user => pack(user, me, { detail: true })))); }); From 20549bfdf0a5214dfb627a4ec07ef042e43f263b Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Sun, 17 Jun 2018 16:45:01 +0900 Subject: [PATCH 355/369] Fix #1729 --- src/remote/activitypub/renderer/mention.ts | 13 ++++++------- src/remote/activitypub/renderer/note.ts | 13 +++++++++++-- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/remote/activitypub/renderer/mention.ts b/src/remote/activitypub/renderer/mention.ts index 4cba7d6a94..95cae52aa2 100644 --- a/src/remote/activitypub/renderer/mention.ts +++ b/src/remote/activitypub/renderer/mention.ts @@ -1,9 +1,8 @@ -export default (mention: { - uri: string; - username: string; - host: string; -}) => ({ +import { IUser, isRemoteUser } from "../../../models/user"; +import config from "../../../config"; + +export default (mention: IUser) => ({ type: 'Mention', - href: mention.uri, - name: `@${mention.username}@${mention.host}` + href: isRemoteUser(mention) ? mention.uri : `${config.url}/@${mention.username}`, + name: isRemoteUser(mention) ? `@${mention.username}@${mention.host}` : `@${mention.username}`, }); diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts index aba0dc809a..f9e559d307 100644 --- a/src/remote/activitypub/renderer/note.ts +++ b/src/remote/activitypub/renderer/note.ts @@ -54,9 +54,18 @@ export default async function renderNote(note: INote, dive = true) { ? [`${attributedTo}/followers`].concat(mentions) : []; + const mentionUsers = await User.find({ + _id: { + $in: note.mentions + } + }); + const hashtagTags = (note.tags || []).map(renderHashtag); - const mentionTags = (note.mentionedRemoteUsers || []).map(renderMention); - const tag = hashtagTags.concat(mentionTags); + const mentionTags = mentionUsers.map(renderMention); + const tag = [ + ...hashtagTags, + ...mentionTags, + ]; return { id: `${config.url}/notes/${note._id}`, From 0ca5237139cc24797a91df09d82bab788d4cf160 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 17 Jun 2018 16:47:37 +0900 Subject: [PATCH 356/369] Send servicewroker script --- src/server/web/index.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/server/web/index.ts b/src/server/web/index.ts index 5ce040d083..d38d9165d4 100644 --- a/src/server/web/index.ts +++ b/src/server/web/index.ts @@ -66,9 +66,11 @@ router.get('/apple-touch-icon.png', async ctx => { }); // ServiceWroker -//router.get(/^\/sw\.(.+?)\.js$/, async ctx => { -// await send(ctx, `${client}/assets/sw.${ctx.params[0]}.js`); -//}); +router.get(/^\/sw\.(.+?)\.js$/, async ctx => { + await send(ctx, `/assets/sw.${ctx.params[0]}.js`, { + root: client + }); +}); // Manifest router.get('/manifest.json', async ctx => { From 8f84dd610c385ada33c1b2e1b1696fb5da47250c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 17 Jun 2018 16:55:55 +0900 Subject: [PATCH 357/369] Use ' --- src/text/html.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/text/html.ts b/src/text/html.ts index a51406ca85..b55d9b80a7 100644 --- a/src/text/html.ts +++ b/src/text/html.ts @@ -90,7 +90,7 @@ const handlers: {[key: string]: (window: any, token: any, mentionedRemoteUsers: } }; -export default (tokens, mentionedRemoteUsers: INote["mentionedRemoteUsers"] = []) => { +export default (tokens, mentionedRemoteUsers: INote['mentionedRemoteUsers'] = []) => { const { window } = new JSDOM(''); for (const token of tokens) { From 7275a48102503f007bb38a9bd69812247fb7bf30 Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Sun, 17 Jun 2018 17:11:05 +0900 Subject: [PATCH 358/369] Fix #1731 --- src/server/activitypub.ts | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/src/server/activitypub.ts b/src/server/activitypub.ts index c846e28c07..f406328dcb 100644 --- a/src/server/activitypub.ts +++ b/src/server/activitypub.ts @@ -7,7 +7,7 @@ const httpSignature = require('http-signature'); import { createHttp } from '../queue'; import pack from '../remote/activitypub/renderer'; import Note from '../models/note'; -import User, { isLocalUser, ILocalUser } from '../models/user'; +import User, { isLocalUser, ILocalUser, IUser } from '../models/user'; import renderNote from '../remote/activitypub/renderer/note'; import renderKey from '../remote/activitypub/renderer/key'; import renderPerson from '../remote/activitypub/renderer/person'; @@ -41,17 +41,18 @@ function inbox(ctx: Koa.Context) { ctx.status = 202; } +function isActivityPubReq(ctx: Router.IRouterContext) { + const accepted = ctx.accepts('html', 'application/activity+json', 'application/ld+json'); + return ['application/activity+json', 'application/ld+json'].includes(accepted as string); +} + // inbox router.post('/inbox', json(), inbox); router.post('/users/:user/inbox', json(), inbox); // note router.get('/notes/:note', async (ctx, next) => { - const accepted = ctx.accepts('html', 'application/activity+json', 'application/ld+json'); - if (!['application/activity+json', 'application/ld+json'].includes(accepted as string)) { - await next(); - return; - } + if (!isActivityPubReq(ctx)) return await next(); const note = await Note.findOne({ _id: new mongo.ObjectID(ctx.params.note) @@ -112,6 +113,15 @@ router.get('/users/:user/publickey', async ctx => { }); // user +function userInfo(ctx: Router.IRouterContext, user: IUser) { + if (user === null) { + ctx.status = 404; + return; + } + + ctx.body = pack(renderPerson(user as ILocalUser)); +} + router.get('/users/:user', async ctx => { const userId = new mongo.ObjectID(ctx.params.user); @@ -120,12 +130,18 @@ router.get('/users/:user', async ctx => { host: null }); - if (user === null) { - ctx.status = 404; - return; - } + userInfo(ctx, user); +}); - ctx.body = pack(renderPerson(user as ILocalUser)); +router.get('/@:user', async (ctx, next) => { + if (!isActivityPubReq(ctx)) return await next(); + + const user = await User.findOne({ + usernameLower: ctx.params.user.toLowerCase(), + host: null + }); + + userInfo(ctx, user); }); // follow form From 5773a5bfa6fd167dc3d4ce594647687488b8680d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 17 Jun 2018 17:15:03 +0900 Subject: [PATCH 359/369] Refactor --- src/remote/activitypub/renderer/note.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts index f9e559d307..556054fa93 100644 --- a/src/remote/activitypub/renderer/note.ts +++ b/src/remote/activitypub/renderer/note.ts @@ -54,14 +54,14 @@ export default async function renderNote(note: INote, dive = true) { ? [`${attributedTo}/followers`].concat(mentions) : []; - const mentionUsers = await User.find({ + const mentionedUsers = await User.find({ _id: { $in: note.mentions } }); - const hashtagTags = (note.tags || []).map(renderHashtag); - const mentionTags = mentionUsers.map(renderMention); + const hashtagTags = (note.tags || []).map(tag => renderHashtag(tag)); + const mentionTags = mentionedUsers.map(u => renderMention(u)); const tag = [ ...hashtagTags, ...mentionTags, From 1f1ed2da4c87120fc0018d47c51e6571e4ad3b84 Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Sun, 17 Jun 2018 17:21:16 +0900 Subject: [PATCH 360/369] minor fix --- src/server/activitypub.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/server/activitypub.ts b/src/server/activitypub.ts index f406328dcb..1fbc621e91 100644 --- a/src/server/activitypub.ts +++ b/src/server/activitypub.ts @@ -1,5 +1,4 @@ import * as mongo from 'mongodb'; -import * as Koa from 'koa'; import * as Router from 'koa-router'; const json = require('koa-json-body'); const httpSignature = require('http-signature'); @@ -20,7 +19,7 @@ const router = new Router(); //#region Routing -function inbox(ctx: Koa.Context) { +function inbox(ctx: Router.IRouterContext) { let signature; ctx.req.headers.authorization = 'Signature ' + ctx.req.headers.signature; From a34cc47a11d5fffa4e4e4817d9d8f4d741cc3ead Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Sun, 17 Jun 2018 17:43:54 +0900 Subject: [PATCH 361/369] tsconfig.json noImplicitAny: true --- tsconfig.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index c407d554ee..125a0c0943 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "allowJs": true, "noEmitOnError": false, - "noImplicitAny": false, + "noImplicitAny": true, "noImplicitReturns": true, "noUnusedParameters": false, "noUnusedLocals": true, @@ -14,7 +14,7 @@ "removeComments": false, "noLib": false, "strict": true, - "strictNullChecks": false + "strictNullChecks": false }, "compileOnSave": false, "include": [ From 71da205ab781bca3ef0d2a6ddfdcdb2a2eca2817 Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Sun, 17 Jun 2018 17:45:59 +0900 Subject: [PATCH 362/369] fix --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 125a0c0943..76221c282a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,7 @@ "removeComments": false, "noLib": false, "strict": true, - "strictNullChecks": false + "strictNullChecks": false }, "compileOnSave": false, "include": [ From f19075c50a4247d234b9e28ba48d35ac8d6316d2 Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Sun, 17 Jun 2018 17:57:50 +0900 Subject: [PATCH 363/369] upgrade font-awesome packages --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 9cbbab1984..bf49a6599f 100644 --- a/package.json +++ b/package.json @@ -23,10 +23,10 @@ "format": "gulp format" }, "dependencies": { - "@fortawesome/fontawesome": "1.0.1", - "@fortawesome/fontawesome-free-brands": "5.0.2", - "@fortawesome/fontawesome-free-regular": "5.0.2", - "@fortawesome/fontawesome-free-solid": "5.0.2", + "@fortawesome/fontawesome": "1.1.8", + "@fortawesome/fontawesome-free-brands": "5.0.13", + "@fortawesome/fontawesome-free-regular": "5.0.13", + "@fortawesome/fontawesome-free-solid": "5.0.13", "@koa/cors": "2.2.1", "@prezzemolo/rap": "0.1.2", "@prezzemolo/zip": "0.0.3", From 871f8867023804e8685f405c95cebae76b955e24 Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Sun, 17 Jun 2018 19:09:24 +0900 Subject: [PATCH 364/369] build:ts success --- gulpfile.ts | 4 ++-- locales/index.ts | 14 ++++++++++--- src/build/fa.ts | 16 +++++++-------- src/build/i18n.ts | 21 ++++++++++--------- src/client/docs/api/gulpfile.ts | 19 ++++++++++------- src/client/docs/gulpfile.ts | 4 ++-- src/client/docs/vars.ts | 2 +- yarn.lock | 36 ++++++++++++++++++++++----------- 8 files changed, 72 insertions(+), 44 deletions(-) diff --git a/gulpfile.ts b/gulpfile.ts index fa1155878c..49a80879d2 100644 --- a/gulpfile.ts +++ b/gulpfile.ts @@ -8,12 +8,12 @@ import * as gutil from 'gulp-util'; import * as ts from 'gulp-typescript'; const sourcemaps = require('gulp-sourcemaps'); import tslint from 'gulp-tslint'; -import cssnano = require('gulp-cssnano'); +const cssnano = require('gulp-cssnano'); import * as uglifyComposer from 'gulp-uglify/composer'; import pug = require('gulp-pug'); import * as rimraf from 'rimraf'; import chalk from 'chalk'; -import imagemin = require('gulp-imagemin'); +const imagemin = require('gulp-imagemin'); import * as rename from 'gulp-rename'; import * as mocha from 'gulp-mocha'; import * as replace from 'gulp-replace'; diff --git a/locales/index.ts b/locales/index.ts index 319d178e0a..3b4f76b06a 100644 --- a/locales/index.ts +++ b/locales/index.ts @@ -5,12 +5,16 @@ import * as fs from 'fs'; import * as yaml from 'js-yaml'; -const loadLang = lang => yaml.safeLoad( - fs.readFileSync(`./locales/${lang}.yml`, 'utf-8')); +export type LangKey = 'de' | 'en' | 'fr' | 'ja' | 'pl'; +export type LocaleObjectChildren = LocaleObject | string | undefined; +export type LocaleObject = {[key: string]: LocaleObjectChildren }; + +const loadLang = (lang: LangKey) => yaml.safeLoad( + fs.readFileSync(`./locales/${lang}.yml`, 'utf-8')) as LocaleObject; const native = loadLang('ja'); -const langs = { +const langs: {[key in LangKey]: LocaleObject} = { 'de': loadLang('de'), 'en': loadLang('en'), 'fr': loadLang('fr'), @@ -23,4 +27,8 @@ Object.entries(langs).map(([, locale]) => { locale = Object.assign({}, native, locale); }); +export function isAvailableLanguage(lang: string): lang is LangKey { + return lang in langs; +} + export default langs; diff --git a/src/build/fa.ts b/src/build/fa.ts index 111c19ae66..077bb51e6d 100644 --- a/src/build/fa.ts +++ b/src/build/fa.ts @@ -3,18 +3,18 @@ */ import * as fontawesome from '@fortawesome/fontawesome'; -import * as regular from '@fortawesome/fontawesome-free-regular'; -import * as solid from '@fortawesome/fontawesome-free-solid'; -import * as brands from '@fortawesome/fontawesome-free-brands'; +import regular from '@fortawesome/fontawesome-free-regular'; +import solid from '@fortawesome/fontawesome-free-solid'; +import brands from '@fortawesome/fontawesome-free-brands'; fontawesome.library.add(regular, solid, brands); export const pattern = /%fa:(.+?)%/g; -export const replacement = (match, key) => { +export const replacement = (match: string, key: string) => { const args = key.split(' '); let prefix = 'fas'; - const classes = []; + const classes: string[] = []; let transform = ''; let name; @@ -34,12 +34,12 @@ export const replacement = (match, key) => { } }); - const icon = fontawesome.icon({ prefix, iconName: name }, { - classes: classes + const icon = fontawesome.icon({ prefix, iconName: name } as fontawesome.IconLookup, { + classes: classes, + transform: fontawesome.parse.transform(transform) }); if (icon) { - icon.transform = fontawesome.parse.transform(transform); return `<i data-fa class="${name}">${icon.html[0]}</i>`; } else { console.warn(`'${name}' not found in fa`); diff --git a/src/build/i18n.ts b/src/build/i18n.ts index 35854055d0..308ff0da00 100644 --- a/src/build/i18n.ts +++ b/src/build/i18n.ts @@ -2,7 +2,7 @@ * Replace i18n texts */ -import locale from '../../locales'; +import locale, { isAvailableLanguage, LocaleObject, LocaleObjectChildren } from '../../locales'; export default class Replacer { private lang: string; @@ -16,19 +16,19 @@ export default class Replacer { this.replacement = this.replacement.bind(this); } - private get(path: string, key: string) { - const texts = locale[this.lang]; - - if (texts == null) { + private get(path: string, key: string): string { + if (!isAvailableLanguage(this.lang)) { console.warn(`lang '${this.lang}' is not supported`); return key; // Fallback } - let text = texts; + const texts = locale[this.lang]; + + let text: LocaleObjectChildren = texts; if (path) { if (text.hasOwnProperty(path)) { - text = text[path]; + text = text[path] as LocaleObject; } else { console.warn(`path '${path}' not found in '${this.lang}'`); return key; // Fallback @@ -38,7 +38,7 @@ export default class Replacer { // Check the key existance const error = key.split('.').some(k => { if (text.hasOwnProperty(k)) { - text = text[k]; + text = (text as LocaleObject)[k]; return false; } else { return true; @@ -48,12 +48,15 @@ export default class Replacer { if (error) { console.warn(`key '${key}' not found in '${path}' of '${this.lang}'`); return key; // Fallback + } else if (typeof text !== "string") { + console.warn(`key '${key}' is not string in '${path}' of '${this.lang}'`); + return key; // Fallback } else { return text; } } - public replacement(match, key) { + public replacement(match: string, key: string) { let path = null; if (key.indexOf('|') != -1) { diff --git a/src/client/docs/api/gulpfile.ts b/src/client/docs/api/gulpfile.ts index 9980ede231..0eb8b88287 100644 --- a/src/client/docs/api/gulpfile.ts +++ b/src/client/docs/api/gulpfile.ts @@ -19,9 +19,10 @@ import generateVars from '../vars'; const langs = Object.keys(locales); -const kebab = string => string.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/\s+/g, '-').toLowerCase(); +const kebab = (string: string) => string.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/\s+/g, '-').toLowerCase(); -const parseParam = param => { +// WIP type +const parseParam = (param: any) => { const id = param.type.match(/^id\((.+?)\)|^id/); const entity = param.type.match(/^entity\((.+?)\)/); const isObject = /^object/.test(param.type); @@ -57,7 +58,7 @@ const parseParam = param => { return param; }; -const sortParams = params => { +const sortParams = (params: Array<{name: string}>) => { params.sort((a, b) => { if (a.name < b.name) return -1; @@ -68,14 +69,15 @@ const sortParams = params => { return params; }; -const extractDefs = params => { - let defs = []; +// WIP type +const extractDefs = (params: any[]) => { + let defs: any[] = []; params.forEach(param => { if (param.def) { defs.push({ name: param.defName, - params: sortParams(param.def.map(p => parseParam(p))) + params: sortParams(param.def.map((p: any) => parseParam(p))) }); const childDefs = extractDefs(param.def); @@ -109,8 +111,10 @@ gulp.task('doc:api:endpoints', async () => { path: ep.endpoint }, desc: ep.desc, + // @ts-ignore params: sortParams(ep.params.map(p => parseParam(p))), paramDefs: extractDefs(ep.params), + // @ts-ignore res: ep.res ? sortParams(ep.res.map(p => parseParam(p))) : null, resDefs: ep.res ? extractDefs(ep.res) : null, }; @@ -155,7 +159,8 @@ gulp.task('doc:api:entities', async () => { const vars = { name: entity.name, desc: entity.desc, - props: sortParams(entity.props.map(p => parseParam(p))), + // WIP type + props: sortParams(entity.props.map((p: any) => parseParam(p))), propDefs: extractDefs(entity.props), }; langs.forEach(lang => { diff --git a/src/client/docs/gulpfile.ts b/src/client/docs/gulpfile.ts index 56bf6188c8..4683a04659 100644 --- a/src/client/docs/gulpfile.ts +++ b/src/client/docs/gulpfile.ts @@ -8,8 +8,8 @@ import * as glob from 'glob'; import * as gulp from 'gulp'; import * as pug from 'pug'; import * as mkdirp from 'mkdirp'; -import stylus = require('gulp-stylus'); -import cssnano = require('gulp-cssnano'); +const stylus = require('gulp-stylus'); +const cssnano = require('gulp-cssnano'); import I18nReplacer from '../../build/i18n'; import fa from '../../build/fa'; diff --git a/src/client/docs/vars.ts b/src/client/docs/vars.ts index 32b961aaa9..93082767e3 100644 --- a/src/client/docs/vars.ts +++ b/src/client/docs/vars.ts @@ -38,7 +38,7 @@ export default async function(): Promise<{ [key: string]: any }> { vars['docs'][name]['title'][lang] = fs.readFileSync(x, 'utf-8').match(/^h1 (.+?)\r?\n/)[1]; }); - vars['kebab'] = string => string.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/\s+/g, '-').toLowerCase(); + vars['kebab'] = (string: string) => string.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/\s+/g, '-').toLowerCase(); vars['config'] = config; diff --git a/yarn.lock b/yarn.lock index a99e498628..8b12a99c95 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,21 +2,33 @@ # yarn lockfile v1 -"@fortawesome/fontawesome-free-brands@5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-brands/-/fontawesome-free-brands-5.0.2.tgz#a1cc602eec40a379a3dd8a44c78b31110dd3d3d3" +"@fortawesome/fontawesome-common-types@^0.1.7": + version "0.1.7" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.1.7.tgz#4336c4b06d0b5608ff1215464b66fcf9f4795284" -"@fortawesome/fontawesome-free-regular@5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-regular/-/fontawesome-free-regular-5.0.2.tgz#429af86bed14689f87648e6322983c65c782c017" +"@fortawesome/fontawesome-free-brands@5.0.13": + version "5.0.13" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-brands/-/fontawesome-free-brands-5.0.13.tgz#4d15ff4e1e862d5e4a4df3654f8e8acbd47e9c09" + dependencies: + "@fortawesome/fontawesome-common-types" "^0.1.7" -"@fortawesome/fontawesome-free-solid@5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-solid/-/fontawesome-free-solid-5.0.2.tgz#090ce2c59dd5ec76983f3da8a43e1ab0321b42d5" +"@fortawesome/fontawesome-free-regular@5.0.13": + version "5.0.13" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-regular/-/fontawesome-free-regular-5.0.13.tgz#eb78c30184e3f456a423a1dcfa0f682f7b50de4a" + dependencies: + "@fortawesome/fontawesome-common-types" "^0.1.7" -"@fortawesome/fontawesome@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome/-/fontawesome-1.0.1.tgz#8ac60e1e7b437889baf9c9d6e3a61ef3b637170d" +"@fortawesome/fontawesome-free-solid@5.0.13": + version "5.0.13" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-solid/-/fontawesome-free-solid-5.0.13.tgz#24b61aaf471a9d34a5364b052d64a516285ba894" + dependencies: + "@fortawesome/fontawesome-common-types" "^0.1.7" + +"@fortawesome/fontawesome@1.1.8": + version "1.1.8" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome/-/fontawesome-1.1.8.tgz#75fe66a60f95508160bb16bd781ad7d89b280f5b" + dependencies: + "@fortawesome/fontawesome-common-types" "^0.1.7" "@gulp-sourcemaps/identity-map@1.X": version "1.0.1" From 8c40917cc2762a498cd2d35a4f4f69b01de3d672 Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Sun, 17 Jun 2018 19:55:39 +0900 Subject: [PATCH 365/369] [noImplicitAny: true] src/text --- package.json | 3 ++ src/text/html.ts | 5 +-- src/text/parse/core/syntax-highlighter.ts | 13 ++++++-- src/text/parse/elements/bold.ts | 12 +++++-- src/text/parse/elements/code.ts | 13 ++++++-- src/text/parse/elements/emoji.ts | 12 +++++-- src/text/parse/elements/hashtag.ts | 12 +++++-- src/text/parse/elements/inline-code.ts | 13 ++++++-- src/text/parse/elements/link.ts | 14 ++++++-- src/text/parse/elements/mention.ts | 13 ++++++-- src/text/parse/elements/quote.ts | 12 +++++-- src/text/parse/elements/search.ts | 10 ++++-- src/text/parse/elements/title.ts | 12 +++++-- src/text/parse/elements/url.ts | 12 +++++-- src/text/parse/index.ts | 39 +++++++++++++++++++---- yarn.lock | 15 +++++++++ 16 files changed, 166 insertions(+), 44 deletions(-) diff --git a/package.json b/package.json index bf49a6599f..2b81b03693 100644 --- a/package.json +++ b/package.json @@ -216,5 +216,8 @@ "websocket": "1.0.26", "ws": "5.2.0", "xev": "2.0.1" + }, + "devDependencies": { + "@types/jsdom": "11.0.5" } } diff --git a/src/text/html.ts b/src/text/html.ts index b55d9b80a7..41adb2e7f7 100644 --- a/src/text/html.ts +++ b/src/text/html.ts @@ -1,7 +1,8 @@ -import { lib as emojilib } from 'emojilib'; +const { lib: emojilib } = require('emojilib'); import { JSDOM } from 'jsdom'; import config from '../config'; import { INote } from '../models/note'; +import { TextElement } from './parse'; const handlers: {[key: string]: (window: any, token: any, mentionedRemoteUsers: INote["mentionedRemoteUsers"]) => void} = { bold({ document }, { bold }) { @@ -90,7 +91,7 @@ const handlers: {[key: string]: (window: any, token: any, mentionedRemoteUsers: } }; -export default (tokens, mentionedRemoteUsers: INote['mentionedRemoteUsers'] = []) => { +export default (tokens: TextElement[], mentionedRemoteUsers: INote['mentionedRemoteUsers'] = []) => { const { window } = new JSDOM(''); for (const token of tokens) { diff --git a/src/text/parse/core/syntax-highlighter.ts b/src/text/parse/core/syntax-highlighter.ts index c0396b1fc6..3fb7a3b73d 100644 --- a/src/text/parse/core/syntax-highlighter.ts +++ b/src/text/parse/core/syntax-highlighter.ts @@ -1,4 +1,4 @@ -function escape(text) { +function escape(text: string) { return text .replace(/>/g, '>') .replace(/</g, '<'); @@ -110,7 +110,14 @@ const symbols = [ '?' ]; -const elements = [ +type Token = { + html: string + next: number +}; + +type Element = (code: string, i: number, source: string) => (Token | null); + +const elements: Element[] = [ // comment code => { if (code.substr(0, 2) != '//') return null; @@ -305,7 +312,7 @@ export default (source: string, lang?: string) => { let i = 0; - function push(token) { + function push(token: Token) { html += token.html; code = code.substr(token.next); i += token.next; diff --git a/src/text/parse/elements/bold.ts b/src/text/parse/elements/bold.ts index ce25764457..0566ace8b7 100644 --- a/src/text/parse/elements/bold.ts +++ b/src/text/parse/elements/bold.ts @@ -2,7 +2,13 @@ * Bold */ -module.exports = text => { +export type TextElementBold = { + type: "bold" + content: string + bold: string +}; + +export default function(text: string) { const match = text.match(/^\*\*(.+?)\*\*/); if (!match) return null; const bold = match[0]; @@ -10,5 +16,5 @@ module.exports = text => { type: 'bold', content: bold, bold: bold.substr(2, bold.length - 4) - }; -}; + } as TextElementBold; +} diff --git a/src/text/parse/elements/code.ts b/src/text/parse/elements/code.ts index 4821e95fe2..de87aa410b 100644 --- a/src/text/parse/elements/code.ts +++ b/src/text/parse/elements/code.ts @@ -4,7 +4,14 @@ import genHtml from '../core/syntax-highlighter'; -module.exports = text => { +export type TextElementCode = { + type: "code" + content: string + code: string + html: string +}; + +export default function(text: string) { const match = text.match(/^```([\s\S]+?)```/); if (!match) return null; const code = match[0]; @@ -13,5 +20,5 @@ module.exports = text => { content: code, code: code.substr(3, code.length - 6).trim(), html: genHtml(code.substr(3, code.length - 6).trim()) - }; -}; + } as TextElementCode; +} diff --git a/src/text/parse/elements/emoji.ts b/src/text/parse/elements/emoji.ts index e24231a223..d0eed88965 100644 --- a/src/text/parse/elements/emoji.ts +++ b/src/text/parse/elements/emoji.ts @@ -2,7 +2,13 @@ * Emoji */ -module.exports = text => { +export type TextElementEmoji = { + type: "emoji" + content: string + emoji: string +}; + +export default function(text: string) { const match = text.match(/^:[a-zA-Z0-9+-_]+:/); if (!match) return null; const emoji = match[0]; @@ -10,5 +16,5 @@ module.exports = text => { type: 'emoji', content: emoji, emoji: emoji.substr(1, emoji.length - 2) - }; -}; + } as TextElementEmoji; +} diff --git a/src/text/parse/elements/hashtag.ts b/src/text/parse/elements/hashtag.ts index ee57b140b8..cde0c2b224 100644 --- a/src/text/parse/elements/hashtag.ts +++ b/src/text/parse/elements/hashtag.ts @@ -2,7 +2,13 @@ * Hashtag */ -module.exports = (text, i) => { +export type TextElementHashtag = { + type: "hashtag" + content: string + hashtag: string +}; + +export default function(text: string, i: number) { if (!(/^\s#[^\s]+/.test(text) || (i == 0 && /^#[^\s]+/.test(text)))) return null; const isHead = text[0] == '#'; const hashtag = text.match(/^\s?#[^\s]+/)[0]; @@ -15,5 +21,5 @@ module.exports = (text, i) => { content: isHead ? hashtag : hashtag.substr(1), hashtag: isHead ? hashtag.substr(1) : hashtag.substr(2) }); - return res; -}; + return res as TextElementHashtag[]; +} diff --git a/src/text/parse/elements/inline-code.ts b/src/text/parse/elements/inline-code.ts index 9f9ef51a2b..bcb0bca0ad 100644 --- a/src/text/parse/elements/inline-code.ts +++ b/src/text/parse/elements/inline-code.ts @@ -4,7 +4,14 @@ import genHtml from '../core/syntax-highlighter'; -module.exports = text => { +export type TextElementInlineCode = { + type: "inline-code" + content: string + code: string + html: string +}; + +export default function(text: string) { const match = text.match(/^`(.+?)`/); if (!match) return null; const code = match[0]; @@ -13,5 +20,5 @@ module.exports = text => { content: code, code: code.substr(1, code.length - 2).trim(), html: genHtml(code.substr(1, code.length - 2).trim()) - }; -}; + } as TextElementInlineCode; +} diff --git a/src/text/parse/elements/link.ts b/src/text/parse/elements/link.ts index 35563ddc3d..7e0d6f5cf8 100644 --- a/src/text/parse/elements/link.ts +++ b/src/text/parse/elements/link.ts @@ -2,7 +2,15 @@ * Link */ -module.exports = text => { +export type TextElementLink = { + type: "link" + content: string + title: string + url: string + silent: boolean +}; + +export default function(text: string) { const match = text.match(/^\??\[([^\[\]]+?)\]\((https?:\/\/[\w\/:%#@\$&\?!\(\)\[\]~\.=\+\-]+?)\)/); if (!match) return null; const silent = text[0] == '?'; @@ -15,5 +23,5 @@ module.exports = text => { title: title, url: url, silent: silent - }; -}; + } as TextElementLink; +} diff --git a/src/text/parse/elements/mention.ts b/src/text/parse/elements/mention.ts index 2ad2788300..a4140458d4 100644 --- a/src/text/parse/elements/mention.ts +++ b/src/text/parse/elements/mention.ts @@ -3,7 +3,14 @@ */ import parseAcct from '../../../acct/parse'; -module.exports = text => { +export type TextElementMention = { + type: "mention" + content: string + username: string + host: string +}; + +export default function(text: string) { const match = text.match(/^@[a-z0-9_]+(?:@[a-z0-9\.\-]+[a-z0-9])?/i); if (!match) return null; const mention = match[0]; @@ -13,5 +20,5 @@ module.exports = text => { content: mention, username, host - }; -}; + } as TextElementMention; +} diff --git a/src/text/parse/elements/quote.ts b/src/text/parse/elements/quote.ts index cc8cfffdc4..56de561f3f 100644 --- a/src/text/parse/elements/quote.ts +++ b/src/text/parse/elements/quote.ts @@ -2,7 +2,13 @@ * Quoted text */ -module.exports = text => { +export type TextElementQuote = { + type: "quote" + content: string + quote: string +}; + +export default function(text: string) { const match = text.match(/^"([\s\S]+?)\n"/); if (!match) return null; const quote = match[0]; @@ -10,5 +16,5 @@ module.exports = text => { type: 'quote', content: quote, quote: quote.substr(1, quote.length - 2).trim(), - }; -}; + } as TextElementQuote; +} diff --git a/src/text/parse/elements/search.ts b/src/text/parse/elements/search.ts index 12ee8ecbb8..4bd19ee3fa 100644 --- a/src/text/parse/elements/search.ts +++ b/src/text/parse/elements/search.ts @@ -2,7 +2,13 @@ * Search */ -module.exports = text => { +export type TextElementSearch = { + type: "search" + content: string + query: string +}; + +export default function(text: string) { const match = text.match(/^(.+?) 検索(\n|$)/); if (!match) return null; return { @@ -10,4 +16,4 @@ module.exports = text => { content: match[0], query: match[1] }; -}; +} diff --git a/src/text/parse/elements/title.ts b/src/text/parse/elements/title.ts index 9f4708f5d6..11b3abc61b 100644 --- a/src/text/parse/elements/title.ts +++ b/src/text/parse/elements/title.ts @@ -2,7 +2,13 @@ * Title */ -module.exports = text => { +export type TextElementTitle = { + type: "title" + content: string + title: string +}; + +export default function(text: string) { const match = text.match(/^【(.+?)】\n/); if (!match) return null; const title = match[0]; @@ -10,5 +16,5 @@ module.exports = text => { type: 'title', content: title, title: title.substr(1, title.length - 3) - }; -}; + } as TextElementTitle; +} diff --git a/src/text/parse/elements/url.ts b/src/text/parse/elements/url.ts index 1003aff9c3..bbc27b4fd7 100644 --- a/src/text/parse/elements/url.ts +++ b/src/text/parse/elements/url.ts @@ -2,7 +2,13 @@ * URL */ -module.exports = text => { +export type TextElementUrl = { + type: "url" + content: string + url: string +}; + +export default function(text: string) { const match = text.match(/^https?:\/\/[\w\/:%#@\$&\?!\(\)\[\]~\.=\+\-]+/); if (!match) return null; const url = match[0]; @@ -10,5 +16,5 @@ module.exports = text => { type: 'url', content: url, url: url - }; -}; + } as TextElementUrl; +} diff --git a/src/text/parse/index.ts b/src/text/parse/index.ts index cfddd9f615..ccfef44591 100644 --- a/src/text/parse/index.ts +++ b/src/text/parse/index.ts @@ -2,6 +2,18 @@ * Misskey Text Analyzer */ +import { TextElementBold } from "./elements/bold"; +import { TextElementCode } from "./elements/code"; +import { TextElementEmoji } from "./elements/emoji"; +import { TextElementHashtag } from "./elements/hashtag"; +import { TextElementInlineCode } from "./elements/inline-code"; +import { TextElementLink } from "./elements/link"; +import { TextElementMention } from "./elements/mention"; +import { TextElementQuote } from "./elements/quote"; +import { TextElementSearch } from "./elements/search"; +import { TextElementTitle } from "./elements/title"; +import { TextElementUrl } from "./elements/url"; + const elements = [ require('./elements/bold'), require('./elements/title'), @@ -14,17 +26,31 @@ const elements = [ require('./elements/quote'), require('./elements/emoji'), require('./elements/search') -]; +].map(element => element.default as TextElementProcessor); -export default (source: string): any[] => { +export type TextElement = {type: "text", content: string} + | TextElementBold + | TextElementCode + | TextElementEmoji + | TextElementHashtag + | TextElementInlineCode + | TextElementLink + | TextElementMention + | TextElementQuote + | TextElementSearch + | TextElementTitle + | TextElementUrl; +export type TextElementProcessor = (text: string, i: number) => TextElement | TextElement[]; + +export default (source: string): TextElement[] => { if (source == '') { return null; } - const tokens = []; + const tokens: TextElement[] = []; - function push(token) { + function push(token: TextElement) { if (token != null) { tokens.push(token); source = source.substr(token.content.length); @@ -59,9 +85,8 @@ export default (source: string): any[] => { } // テキストを纏める - tokens[0] = [tokens[0]]; return tokens.reduce((a, b) => { - if (a[a.length - 1].type == 'text' && b.type == 'text') { + if (a.length && a[a.length - 1].type == 'text' && b.type == 'text') { const tail = a.pop(); return a.concat({ type: 'text', @@ -70,5 +95,5 @@ export default (source: string): any[] => { } else { return a.concat(b); } - }); + }, [] as TextElement[]); }; diff --git a/yarn.lock b/yarn.lock index 8b12a99c95..e4a53091e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -277,6 +277,15 @@ version "3.11.1" resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.11.1.tgz#ac5bab26be5f9c6f74b6b23420f2cfa5a7a6ba40" +"@types/jsdom@11.0.5": + version "11.0.5" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-11.0.5.tgz#b12fffc73eb3731b218e9665a50f023b6b84b5cb" + dependencies: + "@types/events" "*" + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^3.0.2" + "@types/keygrip@*": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.1.tgz#ff540462d2fb4d0a88441ceaf27d287b01c3d878" @@ -8221,6 +8230,12 @@ parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" +parse5@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" + dependencies: + "@types/node" "*" + parseurl@^1.3.0, parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" From 9d65415fdc4cab84945040f59cae3047077d8fc7 Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Sun, 17 Jun 2018 19:59:02 +0900 Subject: [PATCH 366/369] [noImplicitAny: true] src/services/note --- src/services/note/create.ts | 4 ++-- src/services/note/reaction/create.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/services/note/create.ts b/src/services/note/create.ts index 98415b8971..ef03c4e044 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -33,7 +33,7 @@ class NotificationManager { reason: Reason; }> = []; - constructor(user, note) { + constructor(user: IUser, note: any) { this.user = user; this.note = note; } @@ -451,7 +451,7 @@ export default async (user: IUser, data: { // $ne: note._id // } //}); - const existRenote = null; + const existRenote: INote | null = null; //#endregion if (!existRenote) { diff --git a/src/services/note/reaction/create.ts b/src/services/note/reaction/create.ts index 123c091c85..5b30bb5e15 100644 --- a/src/services/note/reaction/create.ts +++ b/src/services/note/reaction/create.ts @@ -36,7 +36,7 @@ export default async (user: IUser, note: INote, reaction: string) => new Promise res(); - const inc = {}; + const inc: {[key: string]: number} = {}; inc[`reactionCounts.${reaction}`] = 1; // Increment reactions count From daa409cd8285633427ffb3a89d3296824365e918 Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Sun, 17 Jun 2018 20:04:19 +0900 Subject: [PATCH 367/369] [noImplicitAny: true] src/services/drive --- package.json | 1 + src/services/drive/add-file.ts | 8 ++++---- src/services/drive/upload-from-url.ts | 4 +++- yarn.lock | 6 ++++++ 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 2b81b03693..6691723386 100644 --- a/package.json +++ b/package.json @@ -218,6 +218,7 @@ "xev": "2.0.1" }, "devDependencies": { + "@types/file-type": "5.2.1", "@types/jsdom": "11.0.5" } } diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts index d7f71e8665..4167df0662 100644 --- a/src/services/drive/add-file.ts +++ b/src/services/drive/add-file.ts @@ -7,7 +7,7 @@ import * as crypto from 'crypto'; import * as _gm from 'gm'; import * as debug from 'debug'; import fileType = require('file-type'); -import prominence = require('prominence'); +const prominence = require('prominence'); import DriveFile, { IMetadata, getDriveFileBucket, IDriveFile } from '../../models/drive-file'; import DriveFolder from '../../models/drive-folder'; @@ -33,7 +33,7 @@ const writeChunks = (name: string, readable: stream.Readable, type: string, meta readable.pipe(writeStream); })); -const writeThumbnailChunks = (name: string, readable: stream.Readable, originalId) => +const writeThumbnailChunks = (name: string, readable: stream.Readable, originalId: mongodb.ObjectID) => getDriveFileThumbnailBucket() .then(bucket => new Promise((resolve, reject) => { const writeStream = bucket.openUploadStream(name, { @@ -89,7 +89,7 @@ export default async function( const calcHash = new Promise<string>((res, rej) => { const readable = fs.createReadStream(path); const hash = crypto.createHash('md5'); - const chunks = []; + const chunks: Buffer[] = []; readable .on('error', rej) .pipe(hash) @@ -201,7 +201,7 @@ export default async function( return driveFolder; }; - const properties = {}; + const properties: {[key: string]: any} = {}; let propPromises: Array<Promise<void>> = []; diff --git a/src/services/drive/upload-from-url.ts b/src/services/drive/upload-from-url.ts index e216ca603d..f83d57d415 100644 --- a/src/services/drive/upload-from-url.ts +++ b/src/services/drive/upload-from-url.ts @@ -8,10 +8,12 @@ import * as request from 'request'; import { IDriveFile, validateFileName } from '../../models/drive-file'; import create from './add-file'; import config from '../../config'; +import { IUser } from '../../models/user'; +import * as mongodb from "mongodb"; const log = debug('misskey:drive:upload-from-url'); -export default async (url: string, user, folderId = null, uri: string = null): Promise<IDriveFile> => { +export default async (url: string, user: IUser, folderId: mongodb.ObjectID = null, uri: string = null): Promise<IDriveFile> => { log(`REQUESTED: ${url}`); let name = URL.parse(url).pathname.split('/').pop(); diff --git a/yarn.lock b/yarn.lock index e4a53091e5..cb6a4a6221 100644 --- a/yarn.lock +++ b/yarn.lock @@ -176,6 +176,12 @@ version "1.3.0" resolved "https://registry.yarnpkg.com/@types/fancy-log/-/fancy-log-1.3.0.tgz#a61ab476e5e628cd07a846330df53b85e05c8ce0" +"@types/file-type@5.2.1": + version "5.2.1" + resolved "https://registry.yarnpkg.com/@types/file-type/-/file-type-5.2.1.tgz#e7af49e08187b6b7598509c5e416669d25fa3461" + dependencies: + "@types/node" "*" + "@types/form-data@*": version "2.2.1" resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.2.1.tgz#ee2b3b8eaa11c0938289953606b745b738c54b1e" From 80e5645a84cc60d76f79c48a3d565fb66ad88643 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 18 Jun 2018 09:54:53 +0900 Subject: [PATCH 368/369] wip --- locales/index.ts | 5 +- src/acct/parse.ts | 2 +- src/acct/render.ts | 4 +- src/build/i18n.ts | 4 +- src/cafy-id.ts | 4 +- src/daemons/hashtags-stats-child.ts | 60 --- src/daemons/hashtags-stats.ts | 20 - src/daemons/notes-stats.ts | 2 +- src/daemons/server-stats.ts | 4 +- src/db/mongodb.ts | 2 +- src/index.ts | 4 +- src/models/app.ts | 2 +- src/models/auth-session.ts | 2 +- src/models/drive-file.ts | 2 +- src/models/drive-folder.ts | 2 +- src/models/favorite.ts | 2 +- src/models/follow-request.ts | 2 +- src/models/messaging-message.ts | 2 +- src/models/note-reaction.ts | 2 +- src/models/note.ts | 10 +- src/models/notification.ts | 2 +- src/models/reversi-game.ts | 2 +- src/models/reversi-matching.ts | 2 +- src/models/signin.ts | 2 +- src/models/user-list.ts | 2 +- src/models/user.ts | 10 +- .../renderer/ordered-collection.ts | 2 +- src/remote/activitypub/renderer/reject.ts | 2 +- src/remote/activitypub/request.ts | 4 +- src/remote/webfinger.ts | 4 +- src/reversi/ai/back.ts | 377 --------------- src/reversi/ai/front.ts | 233 ---------- src/reversi/ai/index.ts | 1 - src/reversi/core.ts | 4 +- src/server/api/bot/core.ts | 439 ------------------ src/server/api/bot/interfaces/line.ts | 238 ---------- src/server/api/common/get-host-lower.ts | 2 +- src/server/api/endpoints/aggregation/posts.ts | 5 +- src/server/api/endpoints/aggregation/users.ts | 5 +- .../endpoints/aggregation/users/activity.ts | 15 +- .../endpoints/aggregation/users/followers.ts | 2 +- .../endpoints/aggregation/users/following.ts | 2 +- .../api/endpoints/aggregation/users/post.ts | 15 +- .../endpoints/aggregation/users/reaction.ts | 12 +- src/server/api/endpoints/app/create.ts | 10 +- .../api/endpoints/app/name_id/available.ts | 2 +- src/server/api/endpoints/app/show.ts | 8 +- src/server/api/endpoints/auth/accept.ts | 10 +- .../api/endpoints/auth/session/generate.ts | 2 +- src/server/api/endpoints/auth/session/show.ts | 10 +- .../api/endpoints/auth/session/userkey.ts | 2 +- src/server/api/endpoints/drive.ts | 3 +- src/server/api/endpoints/drive/files.ts | 6 +- .../api/endpoints/drive/files/create.ts | 6 +- .../api/endpoints/drive/files/delete.ts | 3 +- src/server/api/endpoints/drive/files/find.ts | 6 +- src/server/api/endpoints/drive/files/show.ts | 6 +- .../api/endpoints/drive/files/update.ts | 6 +- src/server/api/endpoints/drive/folders.ts | 2 +- .../api/endpoints/drive/folders/create.ts | 6 +- .../api/endpoints/drive/folders/find.ts | 6 +- .../api/endpoints/drive/folders/show.ts | 6 +- .../api/endpoints/drive/folders/update.ts | 8 +- src/server/api/endpoints/drive/stream.ts | 6 +- src/server/api/endpoints/following/create.ts | 7 +- src/server/api/endpoints/following/delete.ts | 7 +- .../endpoints/following/requests/accept.ts | 4 +- .../endpoints/following/requests/cancel.ts | 4 +- .../api/endpoints/following/requests/list.ts | 3 +- .../endpoints/following/requests/reject.ts | 4 +- src/server/api/endpoints/following/stalk.ts | 3 +- src/server/api/endpoints/following/unstalk.ts | 3 +- src/server/api/endpoints/hashtags/trend.ts | 5 +- src/server/api/endpoints/i.ts | 8 +- src/server/api/endpoints/i/2fa/done.ts | 7 +- src/server/api/endpoints/i/2fa/register.ts | 7 +- src/server/api/endpoints/i/2fa/unregister.ts | 7 +- src/server/api/endpoints/i/authorized_apps.ts | 6 +- src/server/api/endpoints/i/change_password.ts | 7 +- src/server/api/endpoints/i/favorites.ts | 6 +- src/server/api/endpoints/i/notifications.ts | 6 +- src/server/api/endpoints/i/pin.ts | 7 +- .../api/endpoints/i/regenerate_token.ts | 7 +- src/server/api/endpoints/i/signin_history.ts | 6 +- src/server/api/endpoints/i/update.ts | 8 +- .../api/endpoints/i/update_client_setting.ts | 9 +- src/server/api/endpoints/i/update_home.ts | 4 +- .../api/endpoints/i/update_mobile_home.ts | 4 +- src/server/api/endpoints/i/update_widget.ts | 12 +- src/server/api/endpoints/messaging/history.ts | 6 +- .../api/endpoints/messaging/messages.ts | 4 +- .../endpoints/messaging/messages/create.ts | 7 +- src/server/api/endpoints/meta.ts | 2 +- src/server/api/endpoints/mute/create.ts | 7 +- src/server/api/endpoints/mute/delete.ts | 7 +- src/server/api/endpoints/mute/list.ts | 7 +- src/server/api/endpoints/my/apps.ts | 6 +- src/server/api/endpoints/notes.ts | 2 +- .../api/endpoints/notes/conversation.ts | 12 +- src/server/api/endpoints/notes/create.ts | 11 +- src/server/api/endpoints/notes/delete.ts | 3 +- .../api/endpoints/notes/favorites/create.ts | 6 +- .../api/endpoints/notes/favorites/delete.ts | 6 +- .../api/endpoints/notes/global-timeline.ts | 6 +- .../api/endpoints/notes/local-timeline.ts | 6 +- src/server/api/endpoints/notes/mentions.ts | 10 +- .../endpoints/notes/polls/recommendation.ts | 6 +- src/server/api/endpoints/notes/polls/vote.ts | 19 +- src/server/api/endpoints/notes/reactions.ts | 10 +- .../api/endpoints/notes/reactions/create.ts | 6 +- .../api/endpoints/notes/reactions/delete.ts | 8 +- src/server/api/endpoints/notes/replies.ts | 3 +- src/server/api/endpoints/notes/reposts.ts | 10 +- src/server/api/endpoints/notes/search.ts | 364 --------------- .../api/endpoints/notes/search_by_tag.ts | 26 +- src/server/api/endpoints/notes/show.ts | 10 +- src/server/api/endpoints/notes/timeline.ts | 6 +- src/server/api/endpoints/notes/trend.ts | 10 +- .../api/endpoints/notes/user-list-timeline.ts | 6 +- .../notifications/mark_as_read_all.ts | 4 +- src/server/api/endpoints/reversi/games.ts | 3 +- .../api/endpoints/reversi/games/show.ts | 3 +- .../api/endpoints/reversi/invitations.ts | 3 +- src/server/api/endpoints/reversi/match.ts | 4 +- .../api/endpoints/reversi/match/cancel.ts | 3 +- src/server/api/endpoints/sw/register.ts | 6 +- .../api/endpoints/username/available.ts | 8 +- src/server/api/endpoints/users.ts | 7 +- src/server/api/endpoints/users/followers.ts | 7 +- src/server/api/endpoints/users/following.ts | 11 +- .../users/get_frequently_replied_users.ts | 9 +- .../api/endpoints/users/lists/create.ts | 6 +- src/server/api/endpoints/users/lists/list.ts | 3 +- src/server/api/endpoints/users/lists/push.ts | 4 +- src/server/api/endpoints/users/lists/show.ts | 3 +- src/server/api/endpoints/users/notes.ts | 7 +- .../api/endpoints/users/recommendation.ts | 11 +- src/server/api/endpoints/users/search.ts | 73 +-- .../api/endpoints/users/search_by_username.ts | 7 +- src/server/api/endpoints/users/show.ts | 9 +- src/server/api/private/signup.ts | 2 +- src/server/api/service/github.ts | 4 +- src/server/api/stream/notes-stats.ts | 2 +- src/server/api/stream/requests.ts | 19 - src/server/api/stream/reversi-game.ts | 14 +- src/server/api/stream/server-stats.ts | 2 +- src/server/api/streaming.ts | 6 - src/server/index.ts | 2 +- webpack.config.ts | 19 +- webpack/i18n.ts | 2 +- 150 files changed, 305 insertions(+), 2334 deletions(-) delete mode 100644 src/daemons/hashtags-stats-child.ts delete mode 100644 src/daemons/hashtags-stats.ts delete mode 100644 src/reversi/ai/back.ts delete mode 100644 src/reversi/ai/front.ts delete mode 100644 src/reversi/ai/index.ts delete mode 100644 src/server/api/bot/core.ts delete mode 100644 src/server/api/bot/interfaces/line.ts delete mode 100644 src/server/api/endpoints/notes/search.ts delete mode 100644 src/server/api/stream/requests.ts diff --git a/locales/index.ts b/locales/index.ts index 3b4f76b06a..2ae84f30ae 100644 --- a/locales/index.ts +++ b/locales/index.ts @@ -6,15 +6,14 @@ import * as fs from 'fs'; import * as yaml from 'js-yaml'; export type LangKey = 'de' | 'en' | 'fr' | 'ja' | 'pl'; -export type LocaleObjectChildren = LocaleObject | string | undefined; -export type LocaleObject = {[key: string]: LocaleObjectChildren }; +export type LocaleObject = { [key: string]: any }; const loadLang = (lang: LangKey) => yaml.safeLoad( fs.readFileSync(`./locales/${lang}.yml`, 'utf-8')) as LocaleObject; const native = loadLang('ja'); -const langs: {[key in LangKey]: LocaleObject} = { +const langs: { [key: string]: LocaleObject } = { 'de': loadLang('de'), 'en': loadLang('en'), 'fr': loadLang('fr'), diff --git a/src/acct/parse.ts b/src/acct/parse.ts index ef1f55405d..0c00fccef6 100644 --- a/src/acct/parse.ts +++ b/src/acct/parse.ts @@ -1,4 +1,4 @@ -export default acct => { +export default (acct: string) => { const splitted = acct.split('@', 2); return { username: splitted[0], host: splitted[1] || null }; }; diff --git a/src/acct/render.ts b/src/acct/render.ts index 9afb03d88b..191034361d 100644 --- a/src/acct/render.ts +++ b/src/acct/render.ts @@ -1,3 +1,5 @@ -export default user => { +import { IUser } from "../models/user"; + +export default (user: IUser) => { return user.host === null ? user.username : `${user.username}@${user.host}`; }; diff --git a/src/build/i18n.ts b/src/build/i18n.ts index 308ff0da00..f7602dfd17 100644 --- a/src/build/i18n.ts +++ b/src/build/i18n.ts @@ -2,7 +2,7 @@ * Replace i18n texts */ -import locale, { isAvailableLanguage, LocaleObject, LocaleObjectChildren } from '../../locales'; +import locale, { isAvailableLanguage, LocaleObject } from '../../locales'; export default class Replacer { private lang: string; @@ -24,7 +24,7 @@ export default class Replacer { const texts = locale[this.lang]; - let text: LocaleObjectChildren = texts; + let text = texts; if (path) { if (text.hasOwnProperty(path)) { diff --git a/src/cafy-id.ts b/src/cafy-id.ts index 310b1eb20b..dac0f97bd2 100644 --- a/src/cafy-id.ts +++ b/src/cafy-id.ts @@ -1,8 +1,8 @@ import * as mongo from 'mongodb'; import { Query } from 'cafy'; -export const isAnId = x => mongo.ObjectID.isValid(x); -export const isNotAnId = x => !isAnId(x); +export const isAnId = (x: any) => mongo.ObjectID.isValid(x); +export const isNotAnId = (x: any) => !isAnId(x); /** * ID diff --git a/src/daemons/hashtags-stats-child.ts b/src/daemons/hashtags-stats-child.ts deleted file mode 100644 index 3f7f4d6e9e..0000000000 --- a/src/daemons/hashtags-stats-child.ts +++ /dev/null @@ -1,60 +0,0 @@ -import Note from '../models/note'; - -// 10分 -const interval = 1000 * 60 * 10; - -async function tick() { - const res = await Note.aggregate([{ - $match: { - createdAt: { - $gt: new Date(Date.now() - interval) - }, - tags: { - $exists: true, - $ne: [] - } - } - }, { - $unwind: '$tags' - }, { - $group: { - _id: '$tags', - count: { - $sum: 1 - } - } - }, { - $group: { - _id: null, - tags: { - $push: { - tag: '$_id', - count: '$count' - } - } - } - }, { - $project: { - _id: false, - tags: true - } - }]) as { - tags: Array<{ - tag: string; - count: number; - }> - }; - - const stats = res.tags - .sort((a, b) => a.count - b.count) - .map(tag => [tag.tag, tag.count]) - .slice(0, 10); - - console.log(stats); - - process.send(stats); -} - -tick(); - -setInterval(tick, interval); diff --git a/src/daemons/hashtags-stats.ts b/src/daemons/hashtags-stats.ts deleted file mode 100644 index 5ed028ac33..0000000000 --- a/src/daemons/hashtags-stats.ts +++ /dev/null @@ -1,20 +0,0 @@ -import * as childProcess from 'child_process'; -import Xev from 'xev'; - -const ev = new Xev(); - -export default function() { - const log = []; - - const p = childProcess.fork(__dirname + '/hashtags-stats-child.js'); - - p.on('message', stats => { - ev.emit('hashtagsStats', stats); - log.push(stats); - if (log.length > 30) log.shift(); - }); - - ev.on('requestHashTagsStatsLog', id => { - ev.emit('hashtagsStatsLog:' + id, log); - }); -} diff --git a/src/daemons/notes-stats.ts b/src/daemons/notes-stats.ts index 3094c34af0..021e6d64a7 100644 --- a/src/daemons/notes-stats.ts +++ b/src/daemons/notes-stats.ts @@ -4,7 +4,7 @@ import Xev from 'xev'; const ev = new Xev(); export default function() { - const log = []; + const log: any[] = []; const p = childProcess.fork(__dirname + '/notes-stats-child.js'); diff --git a/src/daemons/server-stats.ts b/src/daemons/server-stats.ts index 1403402508..5c793c6624 100644 --- a/src/daemons/server-stats.ts +++ b/src/daemons/server-stats.ts @@ -11,14 +11,14 @@ const interval = 1000; * Report server stats regularly */ export default function() { - const log = []; + const log: any[] = []; ev.on('requestServerStatsLog', id => { ev.emit('serverStatsLog:' + id, log); }); async function tick() { - osUtils.cpuUsage(cpuUsage => { + osUtils.cpuUsage((cpuUsage: number) => { const disk = diskusage.checkSync(os.platform() == 'win32' ? 'c:' : '/'); const stats = { cpu_usage: cpuUsage, diff --git a/src/db/mongodb.ts b/src/db/mongodb.ts index 05bb72bfde..0df87ea3a4 100644 --- a/src/db/mongodb.ts +++ b/src/db/mongodb.ts @@ -27,7 +27,7 @@ const nativeDbConn = async (): Promise<mongodb.Db> => { if (mdb) return mdb; const db = await ((): Promise<mongodb.Db> => new Promise((resolve, reject) => { - (mongodb as any).MongoClient.connect(uri, (e, client) => { + (mongodb as any).MongoClient.connect(uri, (e: Error, client: any) => { if (e) return reject(e); resolve(client.db(config.mongodb.db)); }); diff --git a/src/index.ts b/src/index.ts index 35cf5a243b..c89252dfc2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -60,7 +60,7 @@ function main() { /** * Init master process */ -async function masterMain(opt) { +async function masterMain(opt: any) { let config: Config; try { @@ -91,7 +91,7 @@ async function masterMain(opt) { /** * Init worker process */ -async function workerMain(opt) { +async function workerMain(opt: any) { if (!opt['only-processor']) { // start server await require('./server').default(); diff --git a/src/models/app.ts b/src/models/app.ts index 7926f2fac2..8dc7fe01d9 100644 --- a/src/models/app.ts +++ b/src/models/app.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import * as deepcopy from 'deepcopy'; +const deepcopy = require('deepcopy'); import AccessToken from './access-token'; import db from '../db/mongodb'; import config from '../config'; diff --git a/src/models/auth-session.ts b/src/models/auth-session.ts index 219b1a4c8b..3d2c9ee3c1 100644 --- a/src/models/auth-session.ts +++ b/src/models/auth-session.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import * as deepcopy from 'deepcopy'; +const deepcopy = require('deepcopy'); import db from '../db/mongodb'; import { pack as packApp } from './app'; diff --git a/src/models/drive-file.ts b/src/models/drive-file.ts index bb98c11a93..2bdf38f484 100644 --- a/src/models/drive-file.ts +++ b/src/models/drive-file.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import * as deepcopy from 'deepcopy'; +const deepcopy = require('deepcopy'); import { pack as packFolder } from './drive-folder'; import config from '../config'; import monkDb, { nativeDbConn } from '../db/mongodb'; diff --git a/src/models/drive-folder.ts b/src/models/drive-folder.ts index cafb9cdf13..def519fade 100644 --- a/src/models/drive-folder.ts +++ b/src/models/drive-folder.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import * as deepcopy from 'deepcopy'; +const deepcopy = require('deepcopy'); import db from '../db/mongodb'; import DriveFile from './drive-file'; diff --git a/src/models/favorite.ts b/src/models/favorite.ts index 45417212e3..b2d2fc93e8 100644 --- a/src/models/favorite.ts +++ b/src/models/favorite.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import * as deepcopy from 'deepcopy'; +const deepcopy = require('deepcopy'); import db from '../db/mongodb'; import { pack as packNote } from './note'; diff --git a/src/models/follow-request.ts b/src/models/follow-request.ts index eea5d1c535..fdb20011f4 100644 --- a/src/models/follow-request.ts +++ b/src/models/follow-request.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import * as deepcopy from 'deepcopy'; +const deepcopy = require('deepcopy'); import db from '../db/mongodb'; import { pack as packUser } from './user'; diff --git a/src/models/messaging-message.ts b/src/models/messaging-message.ts index ad2d1657e6..f46abd506d 100644 --- a/src/models/messaging-message.ts +++ b/src/models/messaging-message.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import * as deepcopy from 'deepcopy'; +const deepcopy = require('deepcopy'); import { pack as packUser } from './user'; import { pack as packFile } from './drive-file'; import db from '../db/mongodb'; diff --git a/src/models/note-reaction.ts b/src/models/note-reaction.ts index e5e108c017..915dc0cf91 100644 --- a/src/models/note-reaction.ts +++ b/src/models/note-reaction.ts @@ -1,6 +1,6 @@ import * as mongo from 'mongodb'; import $ from 'cafy'; -import * as deepcopy from 'deepcopy'; +const deepcopy = require('deepcopy'); import db from '../db/mongodb'; import Reaction from './note-reaction'; import { pack as packUser } from './user'; diff --git a/src/models/note.ts b/src/models/note.ts index 83e85f8498..83cd93353b 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import * as deepcopy from 'deepcopy'; +const deepcopy = require('deepcopy'); import rap from '@prezzemolo/rap'; import db from '../db/mongodb'; import { IUser, pack as packUser } from './user'; @@ -37,7 +37,11 @@ export type INote = { mediaIds: mongo.ObjectID[]; replyId: mongo.ObjectID; renoteId: mongo.ObjectID; - poll: any; // todo + poll: { + choices: Array<{ + id: number; + }> + }; text: string; tags: string[]; tagsLower: string[]; @@ -304,7 +308,7 @@ export const pack = async ( if (vote != null) { const myChoice = poll.choices - .filter(c => c.id == vote.choice)[0]; + .filter((c: any) => c.id == vote.choice)[0]; myChoice.isVoted = true; } diff --git a/src/models/notification.ts b/src/models/notification.ts index 875c6952b5..097e3e691f 100644 --- a/src/models/notification.ts +++ b/src/models/notification.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import * as deepcopy from 'deepcopy'; +const deepcopy = require('deepcopy'); import db from '../db/mongodb'; import { IUser, pack as packUser } from './user'; import { pack as packNote } from './note'; diff --git a/src/models/reversi-game.ts b/src/models/reversi-game.ts index 16b9ab0d4e..cf497f0568 100644 --- a/src/models/reversi-game.ts +++ b/src/models/reversi-game.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import * as deepcopy from 'deepcopy'; +const deepcopy = require('deepcopy'); import db from '../db/mongodb'; import { IUser, pack as packUser } from './user'; diff --git a/src/models/reversi-matching.ts b/src/models/reversi-matching.ts index 5efa5d76ad..90227bd121 100644 --- a/src/models/reversi-matching.ts +++ b/src/models/reversi-matching.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import * as deepcopy from 'deepcopy'; +const deepcopy = require('deepcopy'); import db from '../db/mongodb'; import { IUser, pack as packUser } from './user'; diff --git a/src/models/signin.ts b/src/models/signin.ts index d8b05c0e30..55485d8667 100644 --- a/src/models/signin.ts +++ b/src/models/signin.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import * as deepcopy from 'deepcopy'; +const deepcopy = require('deepcopy'); import db from '../db/mongodb'; const Signin = db.get<ISignin>('signin'); diff --git a/src/models/user-list.ts b/src/models/user-list.ts index 4cf1de61a4..5cfa7e4dfc 100644 --- a/src/models/user-list.ts +++ b/src/models/user-list.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import * as deepcopy from 'deepcopy'; +const deepcopy = require('deepcopy'); import db from '../db/mongodb'; const UserList = db.get<IUserList>('userList'); diff --git a/src/models/user.ts b/src/models/user.ts index f0620a6cfd..942faeeff4 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import * as deepcopy from 'deepcopy'; +const deepcopy = require('deepcopy'); import sequential = require('promise-sequential'); import rap from '@prezzemolo/rap'; import db from '../db/mongodb'; @@ -153,14 +153,6 @@ export function isValidBirthday(birthday: string): boolean { } //#endregion -export function init(user): IUser { - user._id = new mongo.ObjectID(user._id); - user.avatarId = new mongo.ObjectID(user.avatarId); - user.bannerId = new mongo.ObjectID(user.bannerId); - user.pinnedNoteId = new mongo.ObjectID(user.pinnedNoteId); - return user; -} - /** * Userを物理削除します */ diff --git a/src/remote/activitypub/renderer/ordered-collection.ts b/src/remote/activitypub/renderer/ordered-collection.ts index 2ca0f77354..9d543b1e1b 100644 --- a/src/remote/activitypub/renderer/ordered-collection.ts +++ b/src/remote/activitypub/renderer/ordered-collection.ts @@ -1,4 +1,4 @@ -export default (id, totalItems, orderedItems) => ({ +export default (id: string, totalItems: any, orderedItems: any) => ({ id, type: 'OrderedCollection', totalItems, diff --git a/src/remote/activitypub/renderer/reject.ts b/src/remote/activitypub/renderer/reject.ts index 29c998a6b4..2464486c2f 100644 --- a/src/remote/activitypub/renderer/reject.ts +++ b/src/remote/activitypub/renderer/reject.ts @@ -1,4 +1,4 @@ -export default object => ({ +export default (object: any) => ({ type: 'Reject', object }); diff --git a/src/remote/activitypub/request.ts b/src/remote/activitypub/request.ts index e6861fdb3e..e2b600ae2e 100644 --- a/src/remote/activitypub/request.ts +++ b/src/remote/activitypub/request.ts @@ -1,5 +1,5 @@ import { request } from 'https'; -import { sign } from 'http-signature'; +const { sign } = require('http-signature'); import { URL } from 'url'; import * as debug from 'debug'; @@ -8,7 +8,7 @@ import { ILocalUser } from '../../models/user'; const log = debug('misskey:activitypub:deliver'); -export default (user: ILocalUser, url: string, object) => new Promise((resolve, reject) => { +export default (user: ILocalUser, url: string, object: any) => new Promise((resolve, reject) => { log(`--> ${url}`); const { protocol, hostname, port, pathname, search } = new URL(url); diff --git a/src/remote/webfinger.ts b/src/remote/webfinger.ts index 4f1ff231c0..cba09379a1 100644 --- a/src/remote/webfinger.ts +++ b/src/remote/webfinger.ts @@ -12,8 +12,8 @@ type IWebFinger = { subject: string; }; -export default async function resolve(query): Promise<IWebFinger> { - return await new Promise((res, rej) => webFinger.lookup(query, (error, result) => { +export default async function resolve(query: any): Promise<IWebFinger> { + return await new Promise((res, rej) => webFinger.lookup(query, (error: Error, result: any) => { if (error) { return rej(error); } diff --git a/src/reversi/ai/back.ts b/src/reversi/ai/back.ts deleted file mode 100644 index 42f1a0f4b8..0000000000 --- a/src/reversi/ai/back.ts +++ /dev/null @@ -1,377 +0,0 @@ -/** - * -AI- - * Botのバックエンド(思考を担当) - * - * 対話と思考を同じプロセスで行うと、思考時間が長引いたときにストリームから - * 切断されてしまうので、別々のプロセスで行うようにします - */ - -import * as request from 'request-promise-native'; -import Reversi, { Color } from '../core'; -import conf from '../../config'; -import getUserName from '../../renderers/get-user-name'; - -let game; -let form; - -/** - * BotアカウントのユーザーID - */ -const id = conf.reversi_ai.id; - -/** - * BotアカウントのAPIキー - */ -const i = conf.reversi_ai.i; - -let note; - -process.on('message', async msg => { - // 親プロセスからデータをもらう - if (msg.type == '_init_') { - game = msg.game; - form = msg.form; - } - - // フォームが更新されたとき - if (msg.type == 'update-form') { - form.find(i => i.id == msg.body.id).value = msg.body.value; - } - - // ゲームが始まったとき - if (msg.type == 'started') { - onGameStarted(msg.body); - - //#region TLに投稿する - const game = msg.body; - const url = `${conf.url}/reversi/${game.id}`; - const user = game.user1Id == id ? game.user2 : game.user1; - const isSettai = form[0].value === 0; - const text = isSettai - ? `?[${getUserName(user)}](${conf.url}/@${user.username})さんの接待を始めました!` - : `対局を?[${getUserName(user)}](${conf.url}/@${user.username})さんと始めました! (強さ${form[0].value})`; - - const res = await request.post(`${conf.api_url}/notes/create`, { - json: { i, - text: `${text}\n→[観戦する](${url})` - } - }); - - note = res.createdNote; - //#endregion - } - - // ゲームが終了したとき - if (msg.type == 'ended') { - // ストリームから切断 - process.send({ - type: 'close' - }); - - //#region TLに投稿する - const user = game.user1Id == id ? game.user2 : game.user1; - const isSettai = form[0].value === 0; - const text = isSettai - ? msg.body.winnerId === null - ? `?[${getUserName(user)}](${conf.url}/@${user.username})さんに接待で引き分けました...` - : msg.body.winnerId == id - ? `?[${getUserName(user)}](${conf.url}/@${user.username})さんに接待で勝ってしまいました...` - : `?[${getUserName(user)}](${conf.url}/@${user.username})さんに接待で負けてあげました♪` - : msg.body.winnerId === null - ? `?[${getUserName(user)}](${conf.url}/@${user.username})さんと引き分けました~` - : msg.body.winnerId == id - ? `?[${getUserName(user)}](${conf.url}/@${user.username})さんに勝ちました♪` - : `?[${getUserName(user)}](${conf.url}/@${user.username})さんに負けました...`; - - await request.post(`${conf.api_url}/notes/create`, { - json: { i, - renoteId: note.id, - text: text - } - }); - //#endregion - - process.exit(); - } - - // 打たれたとき - if (msg.type == 'set') { - onSet(msg.body); - } -}); - -let o: Reversi; -let botColor: Color; - -// 各マスの強さ -let cellWeights; - -/** - * ゲーム開始時 - * @param g ゲーム情報 - */ -function onGameStarted(g) { - game = g; - - // リバーシエンジン初期化 - o = new Reversi(game.settings.map, { - isLlotheo: game.settings.isLlotheo, - canPutEverywhere: game.settings.canPutEverywhere, - loopedBoard: game.settings.loopedBoard - }); - - // 各マスの価値を計算しておく - cellWeights = o.map.map((pix, i) => { - if (pix == 'null') return 0; - const [x, y] = o.transformPosToXy(i); - let count = 0; - const get = (x, y) => { - if (x < 0 || y < 0 || x >= o.mapWidth || y >= o.mapHeight) return 'null'; - return o.mapDataGet(o.transformXyToPos(x, y)); - }; - - if (get(x , y - 1) == 'null') count++; - if (get(x + 1, y - 1) == 'null') count++; - if (get(x + 1, y ) == 'null') count++; - if (get(x + 1, y + 1) == 'null') count++; - if (get(x , y + 1) == 'null') count++; - if (get(x - 1, y + 1) == 'null') count++; - if (get(x - 1, y ) == 'null') count++; - if (get(x - 1, y - 1) == 'null') count++; - //return Math.pow(count, 3); - return count >= 4 ? 1 : 0; - }); - - botColor = game.user1Id == id && game.black == 1 || game.user2Id == id && game.black == 2; - - if (botColor) { - think(); - } -} - -function onSet(x) { - o.put(x.color, x.pos); - - if (x.next === botColor) { - think(); - } -} - -const db = {}; - -function think() { - console.log('Thinking...'); - console.time('think'); - - const isSettai = form[0].value === 0; - - // 接待モードのときは、全力(5手先読みくらい)で負けるようにする - const maxDepth = isSettai ? 5 : form[0].value; - - /** - * Botにとってある局面がどれだけ有利か取得する - */ - function staticEval() { - let score = o.canPutSomewhere(botColor).length; - - cellWeights.forEach((weight, i) => { - // 係数 - const coefficient = 30; - weight = weight * coefficient; - - const stone = o.board[i]; - if (stone === botColor) { - // TODO: 価値のあるマスに設置されている自分の石に縦か横に接するマスは価値があると判断する - score += weight; - } else if (stone !== null) { - score -= weight; - } - }); - - // ロセオならスコアを反転 - if (game.settings.isLlotheo) score = -score; - - // 接待ならスコアを反転 - if (isSettai) score = -score; - - return score; - } - - /** - * αβ法での探索 - */ - const dive = (pos: number, alpha = -Infinity, beta = Infinity, depth = 0): number => { - // 試し打ち - o.put(o.turn, pos); - - const key = o.board.toString(); - let cache = db[key]; - if (cache) { - if (alpha >= cache.upper) { - o.undo(); - return cache.upper; - } - if (beta <= cache.lower) { - o.undo(); - return cache.lower; - } - alpha = Math.max(alpha, cache.lower); - beta = Math.min(beta, cache.upper); - } else { - cache = { - upper: Infinity, - lower: -Infinity - }; - } - - const isBotTurn = o.turn === botColor; - - // 勝った - if (o.turn === null) { - const winner = o.winner; - - // 勝つことによる基本スコア - const base = 10000; - - let score; - - if (game.settings.isLlotheo) { - // 勝ちは勝ちでも、より自分の石を少なくした方が美しい勝ちだと判定する - score = o.winner ? base - (o.blackCount * 100) : base - (o.whiteCount * 100); - } else { - // 勝ちは勝ちでも、より相手の石を少なくした方が美しい勝ちだと判定する - score = o.winner ? base + (o.blackCount * 100) : base + (o.whiteCount * 100); - } - - // 巻き戻し - o.undo(); - - // 接待なら自分が負けた方が高スコア - return isSettai - ? winner !== botColor ? score : -score - : winner === botColor ? score : -score; - } - - if (depth === maxDepth) { - // 静的に評価 - const score = staticEval(); - - // 巻き戻し - o.undo(); - - return score; - } else { - const cans = o.canPutSomewhere(o.turn); - - let value = isBotTurn ? -Infinity : Infinity; - let a = alpha; - let b = beta; - - // 次のターンのプレイヤーにとって最も良い手を取得 - for (const p of cans) { - if (isBotTurn) { - const score = dive(p, a, beta, depth + 1); - value = Math.max(value, score); - a = Math.max(a, value); - if (value >= beta) break; - } else { - const score = dive(p, alpha, b, depth + 1); - value = Math.min(value, score); - b = Math.min(b, value); - if (value <= alpha) break; - } - } - - // 巻き戻し - o.undo(); - - if (value <= alpha) { - cache.upper = value; - } else if (value >= beta) { - cache.lower = value; - } else { - cache.upper = value; - cache.lower = value; - } - - db[key] = cache; - - return value; - } - }; - - /** - * αβ法での探索(キャッシュ無し)(デバッグ用) - */ - const dive2 = (pos: number, alpha = -Infinity, beta = Infinity, depth = 0): number => { - // 試し打ち - o.put(o.turn, pos); - - const isBotTurn = o.turn === botColor; - - // 勝った - if (o.turn === null) { - const winner = o.winner; - - // 勝つことによる基本スコア - const base = 10000; - - let score; - - if (game.settings.isLlotheo) { - // 勝ちは勝ちでも、より自分の石を少なくした方が美しい勝ちだと判定する - score = o.winner ? base - (o.blackCount * 100) : base - (o.whiteCount * 100); - } else { - // 勝ちは勝ちでも、より相手の石を少なくした方が美しい勝ちだと判定する - score = o.winner ? base + (o.blackCount * 100) : base + (o.whiteCount * 100); - } - - // 巻き戻し - o.undo(); - - // 接待なら自分が負けた方が高スコア - return isSettai - ? winner !== botColor ? score : -score - : winner === botColor ? score : -score; - } - - if (depth === maxDepth) { - // 静的に評価 - const score = staticEval(); - - // 巻き戻し - o.undo(); - - return score; - } else { - const cans = o.canPutSomewhere(o.turn); - - // 次のターンのプレイヤーにとって最も良い手を取得 - for (const p of cans) { - if (isBotTurn) { - alpha = Math.max(alpha, dive2(p, alpha, beta, depth + 1)); - } else { - beta = Math.min(beta, dive2(p, alpha, beta, depth + 1)); - } - if (alpha >= beta) break; - } - - // 巻き戻し - o.undo(); - - return isBotTurn ? alpha : beta; - } - }; - - const cans = o.canPutSomewhere(botColor); - const scores = cans.map(p => dive(p)); - const pos = cans[scores.indexOf(Math.max(...scores))]; - - console.log('Thinked:', pos); - console.timeEnd('think'); - - process.send({ - type: 'put', - pos - }); -} diff --git a/src/reversi/ai/front.ts b/src/reversi/ai/front.ts deleted file mode 100644 index 25ee43225a..0000000000 --- a/src/reversi/ai/front.ts +++ /dev/null @@ -1,233 +0,0 @@ -/** - * -AI- - * Botのフロントエンド(ストリームとの対話を担当) - * - * 対話と思考を同じプロセスで行うと、思考時間が長引いたときにストリームから - * 切断されてしまうので、別々のプロセスで行うようにします - */ - -import * as childProcess from 'child_process'; -const WebSocket = require('ws'); -import * as ReconnectingWebSocket from 'reconnecting-websocket'; -import * as request from 'request-promise-native'; -import conf from '../../config'; - -// 設定 //////////////////////////////////////////////////////// - -/** - * BotアカウントのAPIキー - */ -const i = conf.reversi_ai.i; - -/** - * BotアカウントのユーザーID - */ -const id = conf.reversi_ai.id; - -//////////////////////////////////////////////////////////////// - -/** - * ホームストリーム - */ -const homeStream = new ReconnectingWebSocket(`${conf.ws_url}/?i=${i}`, undefined, { - constructor: WebSocket -}); - -homeStream.on('open', () => { - console.log('home stream opened'); -}); - -homeStream.on('close', () => { - console.log('home stream closed'); -}); - -homeStream.on('message', message => { - const msg = JSON.parse(message.toString()); - - // タイムライン上でなんか言われたまたは返信されたとき - if (msg.type == 'mention' || msg.type == 'reply') { - const note = msg.body; - - if (note.userId == id) return; - - // リアクションする - request.post(`${conf.api_url}/notes/reactions/create`, { - json: { i, - noteId: note.id, - reaction: 'love' - } - }); - - if (note.text) { - if (note.text.indexOf('リバーシ') > -1) { - request.post(`${conf.api_url}/notes/create`, { - json: { i, - replyId: note.id, - text: '良いですよ~' - } - }); - - invite(note.userId); - } - } - } - - // メッセージでなんか言われたとき - if (msg.type == 'messaging_message') { - const message = msg.body; - if (message.text) { - if (message.text.indexOf('リバーシ') > -1) { - request.post(`${conf.api_url}/messaging/messages/create`, { - json: { i, - userId: message.userId, - text: '良いですよ~' - } - }); - - invite(message.userId); - } - } - } -}); - -// ユーザーを対局に誘う -function invite(userId) { - request.post(`${conf.api_url}/reversi/match`, { - json: { i, - userId: userId - } - }); -} - -/** - * リバーシストリーム - */ -const reversiStream = new ReconnectingWebSocket(`${conf.ws_url}/reversi?i=${i}`, undefined, { - constructor: WebSocket -}); - -reversiStream.on('open', () => { - console.log('reversi stream opened'); -}); - -reversiStream.on('close', () => { - console.log('reversi stream closed'); -}); - -reversiStream.on('message', message => { - const msg = JSON.parse(message.toString()); - - // 招待されたとき - if (msg.type == 'invited') { - onInviteMe(msg.body.parent); - } - - // マッチしたとき - if (msg.type == 'matched') { - gameStart(msg.body); - } -}); - -/** - * ゲーム開始 - * @param game ゲーム情報 - */ -function gameStart(game) { - // ゲームストリームに接続 - const gw = new ReconnectingWebSocket(`${conf.ws_url}/reversi-game?i=${i}&game=${game.id}`, undefined, { - constructor: WebSocket - }); - - gw.on('open', () => { - console.log('reversi game stream opened'); - - // フォーム - const form = [{ - id: 'strength', - type: 'radio', - label: '強さ', - value: 2, - items: [{ - label: '接待', - value: 0 - }, { - label: '弱', - value: 1 - }, { - label: '中', - value: 2 - }, { - label: '強', - value: 3 - }, { - label: '最強', - value: 5 - }] - }]; - - //#region バックエンドプロセス開始 - const ai = childProcess.fork(__dirname + '/back.js'); - - // バックエンドプロセスに情報を渡す - ai.send({ - type: '_init_', - game, - form - }); - - ai.on('message', msg => { - if (msg.type == 'put') { - gw.send(JSON.stringify({ - type: 'set', - pos: msg.pos - })); - } else if (msg.type == 'close') { - gw.close(); - } - }); - - // ゲームストリームから情報が流れてきたらそのままバックエンドプロセスに伝える - gw.on('message', message => { - const msg = JSON.parse(message.toString()); - ai.send(msg); - }); - //#endregion - - // フォーム初期化 - setTimeout(() => { - gw.send(JSON.stringify({ - type: 'init-form', - body: form - })); - }, 1000); - - // どんな設定内容の対局でも受け入れる - setTimeout(() => { - gw.send(JSON.stringify({ - type: 'accept' - })); - }, 2000); - }); - - gw.on('close', () => { - console.log('reversi game stream closed'); - }); -} - -/** - * リバーシの対局に招待されたとき - * @param inviter 誘ってきたユーザー - */ -async function onInviteMe(inviter) { - console.log(`Someone invited me: @${inviter.username}`); - - // 承認 - const game = await request.post(`${conf.api_url}/reversi/match`, { - json: { - i, - userId: inviter.id - } - }); - - gameStart(game); -} diff --git a/src/reversi/ai/index.ts b/src/reversi/ai/index.ts deleted file mode 100644 index 5cd1db82da..0000000000 --- a/src/reversi/ai/index.ts +++ /dev/null @@ -1 +0,0 @@ -require('./front'); diff --git a/src/reversi/core.ts b/src/reversi/core.ts index f1f9de1486..37f62a43d5 100644 --- a/src/reversi/core.ts +++ b/src/reversi/core.ts @@ -203,7 +203,7 @@ export default class Reversi { * 打つことができる場所を取得します */ public canPutSomewhere(color: Color): number[] { - const result = []; + const result: number[] = []; this.board.forEach((x, i) => { if (this.canPut(color, i)) result.push(i); @@ -239,7 +239,7 @@ export default class Reversi { const enemyColor = !color; // ひっくり返せる石(の位置)リスト - let stones = []; + let stones: number[] = []; const initPos = pos; diff --git a/src/server/api/bot/core.ts b/src/server/api/bot/core.ts deleted file mode 100644 index d41af48057..0000000000 --- a/src/server/api/bot/core.ts +++ /dev/null @@ -1,439 +0,0 @@ -import * as EventEmitter from 'events'; -import * as bcrypt from 'bcryptjs'; - -import User, { IUser, init as initUser, ILocalUser } from '../../../models/user'; - -import getNoteSummary from '../../../renderers/get-note-summary'; -import getUserName from '../../../renderers/get-user-name'; -import getUserSummary from '../../../renderers/get-user-summary'; -import parseAcct from '../../../acct/parse'; -import getNotificationSummary from '../../../renderers/get-notification-summary'; - -const hmm = [ - '?', - 'ふぅ~む...?', - 'ちょっと何言ってるかわからないです', - '「ヘルプ」と言うと利用可能な操作が確認できますよ' -]; - -/** - * Botの頭脳 - */ -export default class BotCore extends EventEmitter { - public user: IUser = null; - - private context: Context = null; - - constructor(user?: IUser) { - super(); - - this.user = user; - } - - public clearContext() { - this.setContext(null); - } - - public setContext(context: Context) { - this.context = context; - this.emit('updated'); - - if (context) { - context.on('updated', () => { - this.emit('updated'); - }); - } - } - - public export() { - return { - user: this.user, - context: this.context ? this.context.export() : null - }; - } - - protected _import(data) { - this.user = data.user ? initUser(data.user) : null; - this.setContext(data.context ? Context.import(this, data.context) : null); - } - - public static import(data) { - const bot = new BotCore(); - bot._import(data); - return bot; - } - - public async q(query: string): Promise<string> { - if (this.context != null) { - return await this.context.q(query); - } - - if (/^@[a-zA-Z0-9_]+$/.test(query)) { - return await this.showUserCommand(query); - } - - switch (query) { - case 'ping': - return 'PONG'; - - case 'help': - case 'ヘルプ': - return '利用可能なコマンド一覧です:\n' + - 'help: これです\n' + - 'me: アカウント情報を見ます\n' + - 'login, signin: サインインします\n' + - 'logout, signout: サインアウトします\n' + - 'note: 投稿します\n' + - 'tl: タイムラインを見ます\n' + - 'no: 通知を見ます\n' + - '@<ユーザー名>: ユーザーを表示します\n' + - '\n' + - 'タイムラインや通知を見た後、「次」というとさらに遡ることができます。'; - - case 'me': - return this.user ? `${getUserName(this.user)}としてサインインしています。\n\n${getUserSummary(this.user)}` : 'サインインしていません'; - - case 'login': - case 'signin': - case 'ログイン': - case 'サインイン': - if (this.user != null) return '既にサインインしていますよ!'; - this.setContext(new SigninContext(this)); - return await this.context.greet(); - - case 'logout': - case 'signout': - case 'ログアウト': - case 'サインアウト': - if (this.user == null) return '今はサインインしてないですよ!'; - this.signout(); - return 'ご利用ありがとうございました <3'; - - case 'note': - case '投稿': - if (this.user == null) return 'まずサインインしてください。'; - this.setContext(new NoteContext(this)); - return await this.context.greet(); - - case 'tl': - case 'タイムライン': - if (this.user == null) return 'まずサインインしてください。'; - this.setContext(new TlContext(this)); - return await this.context.greet(); - - case 'no': - case 'notifications': - case '通知': - if (this.user == null) return 'まずサインインしてください。'; - this.setContext(new NotificationsContext(this)); - return await this.context.greet(); - - case 'guessing-game': - case '数当てゲーム': - this.setContext(new GuessingGameContext(this)); - return await this.context.greet(); - - default: - return hmm[Math.floor(Math.random() * hmm.length)]; - } - } - - public signin(user: IUser) { - this.user = user; - this.emit('signin', user); - this.emit('updated'); - } - - public signout() { - const user = this.user; - this.user = null; - this.emit('signout', user); - this.emit('updated'); - } - - public async refreshUser() { - this.user = await User.findOne({ - _id: this.user._id - }, { - fields: { - data: false - } - }); - - this.emit('updated'); - } - - public async showUserCommand(q: string): Promise<string> { - try { - const user = await require('../endpoints/users/show')(parseAcct(q.substr(1)), this.user); - - const text = getUserSummary(user); - - return text; - } catch (e) { - return `問題が発生したようです...: ${e}`; - } - } -} - -abstract class Context extends EventEmitter { - protected bot: BotCore; - - public abstract async greet(): Promise<string>; - public abstract async q(query: string): Promise<string>; - public abstract export(): any; - - constructor(bot: BotCore) { - super(); - this.bot = bot; - } - - public static import(bot: BotCore, data: any) { - if (data.type == 'guessing-game') return GuessingGameContext.import(bot, data.content); - if (data.type == 'note') return NoteContext.import(bot, data.content); - if (data.type == 'tl') return TlContext.import(bot, data.content); - if (data.type == 'notifications') return NotificationsContext.import(bot, data.content); - if (data.type == 'signin') return SigninContext.import(bot, data.content); - return null; - } -} - -class SigninContext extends Context { - private temporaryUser: ILocalUser = null; - - public async greet(): Promise<string> { - return 'まずユーザー名を教えてください:'; - } - - public async q(query: string): Promise<string> { - if (this.temporaryUser == null) { - // Fetch user - const user = await User.findOne({ - usernameLower: query.toLowerCase(), - host: null - }, { - fields: { - data: false - } - }) as ILocalUser; - - if (user === null) { - return `${query}というユーザーは存在しませんでした... もう一度教えてください:`; - } else { - this.temporaryUser = user; - this.emit('updated'); - return `パスワードを教えてください:`; - } - } else { - // Compare password - const same = await bcrypt.compare(query, this.temporaryUser.password); - - if (same) { - this.bot.signin(this.temporaryUser); - this.bot.clearContext(); - return `${getUserName(this.temporaryUser)}さん、おかえりなさい!`; - } else { - return `パスワードが違います... もう一度教えてください:`; - } - } - } - - public export() { - return { - type: 'signin', - content: { - temporaryUser: this.temporaryUser - } - }; - } - - public static import(bot: BotCore, data: any) { - const context = new SigninContext(bot); - context.temporaryUser = data.temporaryUser; - return context; - } -} - -class NoteContext extends Context { - public async greet(): Promise<string> { - return '内容:'; - } - - public async q(query: string): Promise<string> { - await require('../endpoints/notes/create')({ - text: query - }, this.bot.user); - this.bot.clearContext(); - return '投稿しましたよ!'; - } - - public export() { - return { - type: 'note' - }; - } - - public static import(bot: BotCore, data: any) { - const context = new NoteContext(bot); - return context; - } -} - -class TlContext extends Context { - private next: string = null; - - public async greet(): Promise<string> { - return await this.getTl(); - } - - public async q(query: string): Promise<string> { - if (query == '次') { - return await this.getTl(); - } else { - this.bot.clearContext(); - return await this.bot.q(query); - } - } - - private async getTl() { - const tl = await require('../endpoints/notes/timeline')({ - limit: 5, - untilId: this.next ? this.next : undefined - }, this.bot.user); - - if (tl.length > 0) { - this.next = tl[tl.length - 1].id; - this.emit('updated'); - - const text = tl - .map(note => `${getUserName(note.user)}\n「${getNoteSummary(note)}」`) - .join('\n-----\n'); - - return text; - } else { - return 'タイムラインに表示するものがありません...'; - } - } - - public export() { - return { - type: 'tl', - content: { - next: this.next, - } - }; - } - - public static import(bot: BotCore, data: any) { - const context = new TlContext(bot); - context.next = data.next; - return context; - } -} - -class NotificationsContext extends Context { - private next: string = null; - - public async greet(): Promise<string> { - return await this.getNotifications(); - } - - public async q(query: string): Promise<string> { - if (query == '次') { - return await this.getNotifications(); - } else { - this.bot.clearContext(); - return await this.bot.q(query); - } - } - - private async getNotifications() { - const notifications = await require('../endpoints/i/notifications')({ - limit: 5, - untilId: this.next ? this.next : undefined - }, this.bot.user); - - if (notifications.length > 0) { - this.next = notifications[notifications.length - 1].id; - this.emit('updated'); - - const text = notifications - .map(notification => getNotificationSummary(notification)) - .join('\n-----\n'); - - return text; - } else { - return '通知はありません'; - } - } - - public export() { - return { - type: 'notifications', - content: { - next: this.next, - } - }; - } - - public static import(bot: BotCore, data: any) { - const context = new NotificationsContext(bot); - context.next = data.next; - return context; - } -} - -class GuessingGameContext extends Context { - private secret: number; - private history: number[] = []; - - public async greet(): Promise<string> { - this.secret = Math.floor(Math.random() * 100); - this.emit('updated'); - return '0~100の秘密の数を当ててみてください:'; - } - - public async q(query: string): Promise<string> { - if (query == 'やめる') { - this.bot.clearContext(); - return 'やめました。'; - } - - const guess = parseInt(query, 10); - - if (isNaN(guess)) { - return '整数で推測してください。「やめる」と言うとゲームをやめます。'; - } - - const firsttime = this.history.indexOf(guess) === -1; - - this.history.push(guess); - this.emit('updated'); - - if (this.secret < guess) { - return firsttime ? `${guess}よりも小さいですね` : `もう一度言いますが${guess}より小さいですよ`; - } else if (this.secret > guess) { - return firsttime ? `${guess}よりも大きいですね` : `もう一度言いますが${guess}より大きいですよ`; - } else { - this.bot.clearContext(); - return `正解です🎉 (${this.history.length}回目で当てました)`; - } - } - - public export() { - return { - type: 'guessing-game', - content: { - secret: this.secret, - history: this.history - } - }; - } - - public static import(bot: BotCore, data: any) { - const context = new GuessingGameContext(bot); - context.secret = data.secret; - context.history = data.history; - return context; - } -} diff --git a/src/server/api/bot/interfaces/line.ts b/src/server/api/bot/interfaces/line.ts deleted file mode 100644 index 733315391d..0000000000 --- a/src/server/api/bot/interfaces/line.ts +++ /dev/null @@ -1,238 +0,0 @@ -import * as EventEmitter from 'events'; -import * as Router from 'koa-router'; -import * as request from 'request'; -import * as crypto from 'crypto'; -import User from '../../../../models/user'; -import config from '../../../../config'; -import BotCore from '../core'; -import _redis from '../../../../db/redis'; -import prominence = require('prominence'); -import getAcct from '../../../../acct/render'; -import parseAcct from '../../../../acct/parse'; -import getNoteSummary from '../../../../renderers/get-note-summary'; -import getUserName from '../../../../renderers/get-user-name'; - -const redis = prominence(_redis); - -// SEE: https://developers.line.me/media/messaging-api/messages/sticker_list.pdf -const stickers = [ - '297', - '298', - '299', - '300', - '301', - '302', - '303', - '304', - '305', - '306', - '307' -]; - -class LineBot extends BotCore { - private replyToken: string; - - private reply(messages: any[]) { - request.post({ - url: 'https://api.line.me/v2/bot/message/reply', - headers: { - 'Authorization': `Bearer ${config.line_bot.channel_access_token}` - }, - json: { - replyToken: this.replyToken, - messages: messages - } - }, (err, res, body) => { - if (err) { - console.error(err); - return; - } - }); - } - - public async react(ev: any): Promise<void> { - this.replyToken = ev.replyToken; - - switch (ev.type) { - // メッセージ - case 'message': - switch (ev.message.type) { - // テキスト - case 'text': - const res = await this.q(ev.message.text); - if (res == null) return; - // 返信 - this.reply([{ - type: 'text', - text: res - }]); - break; - - // スタンプ - case 'sticker': - // スタンプで返信 - this.reply([{ - type: 'sticker', - packageId: '4', - stickerId: stickers[Math.floor(Math.random() * stickers.length)] - }]); - break; - } - break; - - // noteback - case 'noteback': - const data = ev.noteback.data; - const cmd = data.split('|')[0]; - const arg = data.split('|')[1]; - switch (cmd) { - case 'showtl': - this.showUserTimelineNoteback(arg); - break; - } - break; - } - } - - public static import(data) { - const bot = new LineBot(); - bot._import(data); - return bot; - } - - public async showUserCommand(q: string) { - const user = await require('../../endpoints/users/show')(parseAcct(q.substr(1)), this.user); - - const acct = getAcct(user); - const actions = []; - - actions.push({ - type: 'noteback', - label: 'タイムラインを見る', - data: `showtl|${user.id}` - }); - - if (user.twitter) { - actions.push({ - type: 'uri', - label: 'Twitterアカウントを見る', - uri: `https://twitter.com/${user.twitter.screenName}` - }); - } - - actions.push({ - type: 'uri', - label: 'Webで見る', - uri: `${config.url}/@${acct}` - }); - - this.reply([{ - type: 'template', - altText: await super.showUserCommand(q), - template: { - type: 'buttons', - thumbnailImageUrl: `${user.avatarUrl}?thumbnail&size=1024`, - title: `${getUserName(user)} (@${acct})`, - text: user.description || '(no description)', - actions: actions - } - }]); - - return null; - } - - public async showUserTimelineNoteback(userId: string) { - const tl = await require('../../endpoints/users/notes')({ - userId: userId, - limit: 5 - }, this.user); - - const text = `${getUserName(tl[0].user)}さんのタイムラインはこちらです:\n\n` + tl - .map(note => getNoteSummary(note)) - .join('\n-----\n'); - - this.reply([{ - type: 'text', - text: text - }]); - } -} - -const handler = new EventEmitter(); - -handler.on('event', async (ev) => { - - const sourceId = ev.source.userId; - const sessionId = `line-bot-sessions:${sourceId}`; - - const session = await redis.get(sessionId); - let bot: LineBot; - - if (session == null) { - const user = await User.findOne({ - host: null, - 'line': { - userId: sourceId - } - }); - - bot = new LineBot(user); - - bot.on('signin', user => { - User.update(user._id, { - $set: { - 'line': { - userId: sourceId - } - } - }); - }); - - bot.on('signout', user => { - User.update(user._id, { - $set: { - 'line': { - userId: null - } - } - }); - }); - - redis.set(sessionId, JSON.stringify(bot.export())); - } else { - bot = LineBot.import(JSON.parse(session)); - } - - bot.on('updated', () => { - redis.set(sessionId, JSON.stringify(bot.export())); - }); - - if (session != null) bot.refreshUser(); - - bot.react(ev); -}); - -// Init router -const router = new Router(); - -if (config.line_bot) { - router.post('/hooks/line', ctx => { - const sig1 = ctx.headers['x-line-signature']; - - const hash = crypto.createHmac('SHA256', config.line_bot.channel_secret) - .update(ctx.request.rawBody); - - const sig2 = hash.digest('base64'); - - // シグネチャ比較 - if (sig1 === sig2) { - ctx.request.body.events.forEach(ev => { - handler.emit('event', ev); - }); - } else { - ctx.status = 400; - } - }); -} - -module.exports = router; diff --git a/src/server/api/common/get-host-lower.ts b/src/server/api/common/get-host-lower.ts index 550c233001..92704b4aa9 100644 --- a/src/server/api/common/get-host-lower.ts +++ b/src/server/api/common/get-host-lower.ts @@ -1,5 +1,5 @@ import { toUnicode } from 'punycode'; -export default host => { +export default (host: string) => { return toUnicode(host).toLowerCase(); }; diff --git a/src/server/api/endpoints/aggregation/posts.ts b/src/server/api/endpoints/aggregation/posts.ts index d348cadae9..9ada9cd3f5 100644 --- a/src/server/api/endpoints/aggregation/posts.ts +++ b/src/server/api/endpoints/aggregation/posts.ts @@ -1,13 +1,10 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import Note from '../../../../models/note'; /** * Aggregate notes */ -module.exports = params => new Promise(async (res, rej) => { +module.exports = (params: any) => new Promise(async (res, rej) => { // Get 'limit' parameter const [limit = 365, limitErr] = $.num.optional().range(1, 365).get(params.limit); if (limitErr) return rej('invalid limit param'); diff --git a/src/server/api/endpoints/aggregation/users.ts b/src/server/api/endpoints/aggregation/users.ts index b116c1454b..c084404d0a 100644 --- a/src/server/api/endpoints/aggregation/users.ts +++ b/src/server/api/endpoints/aggregation/users.ts @@ -1,13 +1,10 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import User from '../../../../models/user'; /** * Aggregate users */ -module.exports = params => new Promise(async (res, rej) => { +module.exports = (params: any) => new Promise(async (res, rej) => { // Get 'limit' parameter const [limit = 365, limitErr] = $.num.optional().range(1, 365).get(params.limit); if (limitErr) return rej('invalid limit param'); diff --git a/src/server/api/endpoints/aggregation/users/activity.ts b/src/server/api/endpoints/aggregation/users/activity.ts index 9109487ac6..d4c716d65b 100644 --- a/src/server/api/endpoints/aggregation/users/activity.ts +++ b/src/server/api/endpoints/aggregation/users/activity.ts @@ -1,6 +1,3 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import User from '../../../../../models/user'; import Note from '../../../../../models/note'; @@ -10,7 +7,7 @@ import Note from '../../../../../models/note'; /** * Aggregate activity of a user */ -module.exports = (params) => new Promise(async (res, rej) => { +module.exports = (params: any) => new Promise(async (res, rej) => { // Get 'limit' parameter const [limit = 365, limitErr] = $.num.optional().range(1, 365).get(params.limit); if (limitErr) return rej('invalid limit param'); @@ -73,13 +70,13 @@ module.exports = (params) => new Promise(async (res, rej) => { } } ]); - datas.forEach(data => { + datas.forEach((data: any) => { data.date = data._id; delete data._id; - data.notes = (data.data.filter(x => x.type == 'note')[0] || { count: 0 }).count; - data.renotes = (data.data.filter(x => x.type == 'renote')[0] || { count: 0 }).count; - data.replies = (data.data.filter(x => x.type == 'reply')[0] || { count: 0 }).count; + data.notes = (data.data.filter((x: any) => x.type == 'note')[0] || { count: 0 }).count; + data.renotes = (data.data.filter((x: any) => x.type == 'renote')[0] || { count: 0 }).count; + data.replies = (data.data.filter((x: any) => x.type == 'reply')[0] || { count: 0 }).count; delete data.data; }); @@ -89,7 +86,7 @@ module.exports = (params) => new Promise(async (res, rej) => { for (let i = 0; i < limit; i++) { const day = new Date(new Date().setDate(new Date().getDate() - i)); - const data = datas.filter(d => + const data = datas.filter((d: any) => d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate() )[0]; diff --git a/src/server/api/endpoints/aggregation/users/followers.ts b/src/server/api/endpoints/aggregation/users/followers.ts index dfcaf8462f..847f376079 100644 --- a/src/server/api/endpoints/aggregation/users/followers.ts +++ b/src/server/api/endpoints/aggregation/users/followers.ts @@ -8,7 +8,7 @@ import FollowedLog from '../../../../../models/followed-log'; /** * Aggregate followers of a user */ -module.exports = (params) => new Promise(async (res, rej) => { +module.exports = (params: any) => new Promise(async (res, rej) => { // Get 'userId' parameter const [userId, userIdErr] = $.type(ID).get(params.userId); if (userIdErr) return rej('invalid userId param'); diff --git a/src/server/api/endpoints/aggregation/users/following.ts b/src/server/api/endpoints/aggregation/users/following.ts index 5f826fd71c..6c52752f98 100644 --- a/src/server/api/endpoints/aggregation/users/following.ts +++ b/src/server/api/endpoints/aggregation/users/following.ts @@ -8,7 +8,7 @@ import FollowingLog from '../../../../../models/following-log'; /** * Aggregate following of a user */ -module.exports = (params) => new Promise(async (res, rej) => { +module.exports = (params: any) => new Promise(async (res, rej) => { // Get 'userId' parameter const [userId, userIdErr] = $.type(ID).get(params.userId); if (userIdErr) return rej('invalid userId param'); diff --git a/src/server/api/endpoints/aggregation/users/post.ts b/src/server/api/endpoints/aggregation/users/post.ts index 11f9ef14cd..28ba1482bf 100644 --- a/src/server/api/endpoints/aggregation/users/post.ts +++ b/src/server/api/endpoints/aggregation/users/post.ts @@ -1,6 +1,3 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import User from '../../../../../models/user'; import Note from '../../../../../models/note'; @@ -8,7 +5,7 @@ import Note from '../../../../../models/note'; /** * Aggregate note of a user */ -module.exports = (params) => new Promise(async (res, rej) => { +module.exports = (params: any) => new Promise(async (res, rej) => { // Get 'userId' parameter const [userId, userIdErr] = $.type(ID).get(params.userId); if (userIdErr) return rej('invalid userId param'); @@ -67,13 +64,13 @@ module.exports = (params) => new Promise(async (res, rej) => { } } ]); - datas.forEach(data => { + datas.forEach((data: any) => { data.date = data._id; delete data._id; - data.notes = (data.data.filter(x => x.type == 'note')[0] || { count: 0 }).count; - data.renotes = (data.data.filter(x => x.type == 'renote')[0] || { count: 0 }).count; - data.replies = (data.data.filter(x => x.type == 'reply')[0] || { count: 0 }).count; + data.notes = (data.data.filter((x: any) => x.type == 'note')[0] || { count: 0 }).count; + data.renotes = (data.data.filter((x: any) => x.type == 'renote')[0] || { count: 0 }).count; + data.replies = (data.data.filter((x: any) => x.type == 'reply')[0] || { count: 0 }).count; delete data.data; }); @@ -83,7 +80,7 @@ module.exports = (params) => new Promise(async (res, rej) => { for (let i = 0; i < 30; i++) { const day = new Date(new Date().setDate(new Date().getDate() - i)); - const data = datas.filter(d => + const data = datas.filter((d: any) => d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate() )[0]; diff --git a/src/server/api/endpoints/aggregation/users/reaction.ts b/src/server/api/endpoints/aggregation/users/reaction.ts index 2de2840258..adb5acfb4e 100644 --- a/src/server/api/endpoints/aggregation/users/reaction.ts +++ b/src/server/api/endpoints/aggregation/users/reaction.ts @@ -1,17 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import User from '../../../../../models/user'; import Reaction from '../../../../../models/note-reaction'; /** * Aggregate reaction of a user - * - * @param {any} params - * @return {Promise<any>} */ -module.exports = (params) => new Promise(async (res, rej) => { +module.exports = (params: any) => new Promise(async (res, rej) => { // Get 'userId' parameter const [userId, userIdErr] = $.type(ID).get(params.userId); if (userIdErr) return rej('invalid userId param'); @@ -48,7 +42,7 @@ module.exports = (params) => new Promise(async (res, rej) => { }} ]); - datas.forEach(data => { + datas.forEach((data: any) => { data.date = data._id; delete data._id; }); @@ -58,7 +52,7 @@ module.exports = (params) => new Promise(async (res, rej) => { for (let i = 0; i < 30; i++) { const day = new Date(new Date().setDate(new Date().getDate() - i)); - const data = datas.filter(d => + const data = datas.filter((d: any) => d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate() )[0]; diff --git a/src/server/api/endpoints/app/create.ts b/src/server/api/endpoints/app/create.ts index 553bd2381a..c7bc91a079 100644 --- a/src/server/api/endpoints/app/create.ts +++ b/src/server/api/endpoints/app/create.ts @@ -1,9 +1,7 @@ -/** - * Module dependencies - */ import rndstr from 'rndstr'; import $ from 'cafy'; import App, { isValidNameId, pack } from '../../../../models/app'; +import { ILocalUser } from '../../../../models/user'; /** * @swagger @@ -60,12 +58,8 @@ import App, { isValidNameId, pack } from '../../../../models/app'; /** * Create an app - * - * @param {any} params - * @param {any} user - * @return {Promise<any>} */ -module.exports = async (params, user) => new Promise(async (res, rej) => { +module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'nameId' parameter const [nameId, nameIdErr] = $.str.pipe(isValidNameId).get(params.nameId); if (nameIdErr) return rej('invalid nameId param'); diff --git a/src/server/api/endpoints/app/name_id/available.ts b/src/server/api/endpoints/app/name_id/available.ts index 135bb7d2b4..58101a7e6a 100644 --- a/src/server/api/endpoints/app/name_id/available.ts +++ b/src/server/api/endpoints/app/name_id/available.ts @@ -40,7 +40,7 @@ import { isValidNameId } from '../../../../../models/app'; * @param {any} params * @return {Promise<any>} */ -module.exports = async (params) => new Promise(async (res, rej) => { +module.exports = async (params: any) => new Promise(async (res, rej) => { // Get 'nameId' parameter const [nameId, nameIdErr] = $.str.pipe(isValidNameId).get(params.nameId); if (nameIdErr) return rej('invalid nameId param'); diff --git a/src/server/api/endpoints/app/show.ts b/src/server/api/endpoints/app/show.ts index 8d742ab182..2b98a3f142 100644 --- a/src/server/api/endpoints/app/show.ts +++ b/src/server/api/endpoints/app/show.ts @@ -1,8 +1,6 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; -import App, { pack } from '../../../../models/app'; +import App, { pack, IApp } from '../../../../models/app'; +import { ILocalUser } from '../../../../models/user'; /** * @swagger @@ -37,7 +35,7 @@ import App, { pack } from '../../../../models/app'; /** * Show an app */ -module.exports = (params, user, app) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser, app: IApp) => new Promise(async (res, rej) => { const isSecure = user != null && app == null; // Get 'appId' parameter diff --git a/src/server/api/endpoints/auth/accept.ts b/src/server/api/endpoints/auth/accept.ts index 695fbb0803..fc6cbc473d 100644 --- a/src/server/api/endpoints/auth/accept.ts +++ b/src/server/api/endpoints/auth/accept.ts @@ -1,12 +1,10 @@ -/** - * Module dependencies - */ import rndstr from 'rndstr'; const crypto = require('crypto'); import $ from 'cafy'; import App from '../../../../models/app'; import AuthSess from '../../../../models/auth-session'; import AccessToken from '../../../../models/access-token'; +import { ILocalUser } from '../../../../models/user'; /** * @swagger @@ -33,12 +31,8 @@ import AccessToken from '../../../../models/access-token'; /** * Accept - * - * @param {any} params - * @param {any} user - * @return {Promise<any>} */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'token' parameter const [token, tokenErr] = $.str.get(params.token); if (tokenErr) return rej('invalid token param'); diff --git a/src/server/api/endpoints/auth/session/generate.ts b/src/server/api/endpoints/auth/session/generate.ts index d649a8d902..5a4d99ff3b 100644 --- a/src/server/api/endpoints/auth/session/generate.ts +++ b/src/server/api/endpoints/auth/session/generate.ts @@ -44,7 +44,7 @@ import config from '../../../../../config'; * @param {any} params * @return {Promise<any>} */ -module.exports = (params) => new Promise(async (res, rej) => { +module.exports = (params: any) => new Promise(async (res, rej) => { // Get 'appSecret' parameter const [appSecret, appSecretErr] = $.str.get(params.appSecret); if (appSecretErr) return rej('invalid appSecret param'); diff --git a/src/server/api/endpoints/auth/session/show.ts b/src/server/api/endpoints/auth/session/show.ts index 434cc264a0..3d3b6bbf61 100644 --- a/src/server/api/endpoints/auth/session/show.ts +++ b/src/server/api/endpoints/auth/session/show.ts @@ -1,8 +1,6 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import AuthSess, { pack } from '../../../../../models/auth-session'; +import { ILocalUser } from '../../../../../models/user'; /** * @swagger @@ -46,12 +44,8 @@ import AuthSess, { pack } from '../../../../../models/auth-session'; /** * Show a session - * - * @param {any} params - * @param {any} user - * @return {Promise<any>} */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'token' parameter const [token, tokenErr] = $.str.get(params.token); if (tokenErr) return rej('invalid token param'); diff --git a/src/server/api/endpoints/auth/session/userkey.ts b/src/server/api/endpoints/auth/session/userkey.ts index 3026b477f1..3ea48fbe34 100644 --- a/src/server/api/endpoints/auth/session/userkey.ts +++ b/src/server/api/endpoints/auth/session/userkey.ts @@ -49,7 +49,7 @@ import { pack } from '../../../../../models/user'; * @param {any} params * @return {Promise<any>} */ -module.exports = (params) => new Promise(async (res, rej) => { +module.exports = (params: any) => new Promise(async (res, rej) => { // Get 'appSecret' parameter const [appSecret, appSecretErr] = $.str.get(params.appSecret); if (appSecretErr) return rej('invalid appSecret param'); diff --git a/src/server/api/endpoints/drive.ts b/src/server/api/endpoints/drive.ts index 26944dbc15..9caad273c8 100644 --- a/src/server/api/endpoints/drive.ts +++ b/src/server/api/endpoints/drive.ts @@ -1,9 +1,10 @@ import DriveFile from '../../../models/drive-file'; +import { ILocalUser } from '../../../models/user'; /** * Get drive information */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Calculate drive usage const usage = await DriveFile .aggregate([{ diff --git a/src/server/api/endpoints/drive/files.ts b/src/server/api/endpoints/drive/files.ts index 0f0e3d65a8..efce750747 100644 --- a/src/server/api/endpoints/drive/files.ts +++ b/src/server/api/endpoints/drive/files.ts @@ -1,13 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import DriveFile, { pack } from '../../../../models/drive-file'; +import { ILocalUser } from '../../../../models/user'; /** * Get drive files */ -module.exports = async (params, user, app) => { +module.exports = async (params: any, user: ILocalUser) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) throw 'invalid limit param'; diff --git a/src/server/api/endpoints/drive/files/create.ts b/src/server/api/endpoints/drive/files/create.ts index dd748d6bba..db2626af09 100644 --- a/src/server/api/endpoints/drive/files/create.ts +++ b/src/server/api/endpoints/drive/files/create.ts @@ -1,15 +1,13 @@ -/** - * Module dependencies - */ import * as fs from 'fs'; import $ from 'cafy'; import ID from '../../../../../cafy-id'; import { validateFileName, pack } from '../../../../../models/drive-file'; import create from '../../../../../services/drive/add-file'; +import { ILocalUser } from '../../../../../models/user'; /** * Create a file */ -module.exports = async (file, params, user): Promise<any> => { +module.exports = async (file: any, params: any, user: ILocalUser): Promise<any> => { if (file == null) { throw 'file is required'; } diff --git a/src/server/api/endpoints/drive/files/delete.ts b/src/server/api/endpoints/drive/files/delete.ts index a722b4e825..17eb0eb4b9 100644 --- a/src/server/api/endpoints/drive/files/delete.ts +++ b/src/server/api/endpoints/drive/files/delete.ts @@ -2,11 +2,12 @@ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import DriveFile from '../../../../../models/drive-file'; import del from '../../../../../services/drive/delete-file'; import { publishDriveStream } from '../../../../../publishers/stream'; +import { ILocalUser } from '../../../../../models/user'; /** * Delete a file */ -module.exports = async (params, user) => { +module.exports = async (params: any, user: ILocalUser) => { // Get 'fileId' parameter const [fileId, fileIdErr] = $.type(ID).get(params.fileId); if (fileIdErr) throw 'invalid fileId param'; diff --git a/src/server/api/endpoints/drive/files/find.ts b/src/server/api/endpoints/drive/files/find.ts index 98165990fe..75ab91f0a1 100644 --- a/src/server/api/endpoints/drive/files/find.ts +++ b/src/server/api/endpoints/drive/files/find.ts @@ -1,13 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import DriveFile, { pack } from '../../../../../models/drive-file'; +import { ILocalUser } from '../../../../../models/user'; /** * Find a file(s) */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'name' parameter const [name, nameErr] = $.str.get(params.name); if (nameErr) return rej('invalid name param'); diff --git a/src/server/api/endpoints/drive/files/show.ts b/src/server/api/endpoints/drive/files/show.ts index c7efda7ab0..e7dca486c5 100644 --- a/src/server/api/endpoints/drive/files/show.ts +++ b/src/server/api/endpoints/drive/files/show.ts @@ -1,13 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import DriveFile, { pack } from '../../../../../models/drive-file'; +import { ILocalUser } from '../../../../../models/user'; /** * Show a file */ -module.exports = async (params, user) => { +module.exports = async (params: any, user: ILocalUser) => { // Get 'fileId' parameter const [fileId, fileIdErr] = $.type(ID).get(params.fileId); if (fileIdErr) throw 'invalid fileId param'; diff --git a/src/server/api/endpoints/drive/files/update.ts b/src/server/api/endpoints/drive/files/update.ts index 12fa8e025d..825683b214 100644 --- a/src/server/api/endpoints/drive/files/update.ts +++ b/src/server/api/endpoints/drive/files/update.ts @@ -1,15 +1,13 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import DriveFolder from '../../../../../models/drive-folder'; import DriveFile, { validateFileName, pack } from '../../../../../models/drive-file'; import { publishDriveStream } from '../../../../../publishers/stream'; +import { ILocalUser } from '../../../../../models/user'; /** * Update a file */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'fileId' parameter const [fileId, fileIdErr] = $.type(ID).get(params.fileId); if (fileIdErr) return rej('invalid fileId param'); diff --git a/src/server/api/endpoints/drive/folders.ts b/src/server/api/endpoints/drive/folders.ts index bc6c50eb99..fac9780325 100644 --- a/src/server/api/endpoints/drive/folders.ts +++ b/src/server/api/endpoints/drive/folders.ts @@ -7,7 +7,7 @@ import DriveFolder, { pack } from '../../../../models/drive-folder'; /** * Get drive folders */ -module.exports = (params, user, app) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser, app: IApp) => new Promise(async (res, rej) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) return rej('invalid limit param'); diff --git a/src/server/api/endpoints/drive/folders/create.ts b/src/server/api/endpoints/drive/folders/create.ts index 62e3b6f6e8..8f06b0f668 100644 --- a/src/server/api/endpoints/drive/folders/create.ts +++ b/src/server/api/endpoints/drive/folders/create.ts @@ -1,14 +1,12 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import DriveFolder, { isValidFolderName, pack } from '../../../../../models/drive-folder'; import { publishDriveStream } from '../../../../../publishers/stream'; +import { ILocalUser } from '../../../../../models/user'; /** * Create drive folder */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'name' parameter const [name = '無題のフォルダー', nameErr] = $.str.optional().pipe(isValidFolderName).get(params.name); if (nameErr) return rej('invalid name param'); diff --git a/src/server/api/endpoints/drive/folders/find.ts b/src/server/api/endpoints/drive/folders/find.ts index 9703d9e99d..b3238b5c32 100644 --- a/src/server/api/endpoints/drive/folders/find.ts +++ b/src/server/api/endpoints/drive/folders/find.ts @@ -1,13 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import DriveFolder, { pack } from '../../../../../models/drive-folder'; +import { ILocalUser } from '../../../../../models/user'; /** * Find a folder(s) */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'name' parameter const [name, nameErr] = $.str.get(params.name); if (nameErr) return rej('invalid name param'); diff --git a/src/server/api/endpoints/drive/folders/show.ts b/src/server/api/endpoints/drive/folders/show.ts index 44f1889001..c9b4930a76 100644 --- a/src/server/api/endpoints/drive/folders/show.ts +++ b/src/server/api/endpoints/drive/folders/show.ts @@ -1,13 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import DriveFolder, { pack } from '../../../../../models/drive-folder'; +import { ILocalUser } from '../../../../../models/user'; /** * Show a folder */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'folderId' parameter const [folderId, folderIdErr] = $.type(ID).get(params.folderId); if (folderIdErr) return rej('invalid folderId param'); diff --git a/src/server/api/endpoints/drive/folders/update.ts b/src/server/api/endpoints/drive/folders/update.ts index e24d8a14cd..f126c09f5b 100644 --- a/src/server/api/endpoints/drive/folders/update.ts +++ b/src/server/api/endpoints/drive/folders/update.ts @@ -1,14 +1,12 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import DriveFolder, { isValidFolderName, pack } from '../../../../../models/drive-folder'; import { publishDriveStream } from '../../../../../publishers/stream'; +import { ILocalUser } from '../../../../../models/user'; /** * Update a folder */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'folderId' parameter const [folderId, folderIdErr] = $.type(ID).get(params.folderId); if (folderIdErr) return rej('invalid folderId param'); @@ -48,7 +46,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => { } // Check if the circular reference will occur - async function checkCircle(folderId) { + async function checkCircle(folderId: any): Promise<boolean> { // Fetch folder const folder2 = await DriveFolder.findOne({ _id: folderId diff --git a/src/server/api/endpoints/drive/stream.ts b/src/server/api/endpoints/drive/stream.ts index 8cb3a99b42..515f74645a 100644 --- a/src/server/api/endpoints/drive/stream.ts +++ b/src/server/api/endpoints/drive/stream.ts @@ -1,13 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import DriveFile, { pack } from '../../../../models/drive-file'; +import { ILocalUser } from '../../../../models/user'; /** * Get drive stream */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) return rej('invalid limit param'); diff --git a/src/server/api/endpoints/following/create.ts b/src/server/api/endpoints/following/create.ts index b9610658d1..3e45b8da53 100644 --- a/src/server/api/endpoints/following/create.ts +++ b/src/server/api/endpoints/following/create.ts @@ -1,15 +1,12 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; -import User, { pack } from '../../../../models/user'; +import User, { pack, ILocalUser } from '../../../../models/user'; import Following from '../../../../models/following'; import create from '../../../../services/following/create'; /** * Follow a user */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { const follower = user; // Get 'userId' parameter diff --git a/src/server/api/endpoints/following/delete.ts b/src/server/api/endpoints/following/delete.ts index 4fcdaf5a82..0af8813cf9 100644 --- a/src/server/api/endpoints/following/delete.ts +++ b/src/server/api/endpoints/following/delete.ts @@ -1,15 +1,12 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; -import User, { pack } from '../../../../models/user'; +import User, { pack, ILocalUser } from '../../../../models/user'; import Following from '../../../../models/following'; import deleteFollowing from '../../../../services/following/delete'; /** * Unfollow a user */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { const follower = user; // Get 'userId' parameter diff --git a/src/server/api/endpoints/following/requests/accept.ts b/src/server/api/endpoints/following/requests/accept.ts index 705d3b161a..a09e32e4d9 100644 --- a/src/server/api/endpoints/following/requests/accept.ts +++ b/src/server/api/endpoints/following/requests/accept.ts @@ -1,11 +1,11 @@ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import acceptFollowRequest from '../../../../../services/following/requests/accept'; -import User from '../../../../../models/user'; +import User, { ILocalUser } from '../../../../../models/user'; /** * Accept a follow request */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'userId' parameter const [followerId, followerIdErr] = $.type(ID).get(params.userId); if (followerIdErr) return rej('invalid userId param'); diff --git a/src/server/api/endpoints/following/requests/cancel.ts b/src/server/api/endpoints/following/requests/cancel.ts index 388a54890b..f2a40854c2 100644 --- a/src/server/api/endpoints/following/requests/cancel.ts +++ b/src/server/api/endpoints/following/requests/cancel.ts @@ -1,11 +1,11 @@ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import cancelFollowRequest from '../../../../../services/following/requests/cancel'; -import User, { pack } from '../../../../../models/user'; +import User, { pack, ILocalUser } from '../../../../../models/user'; /** * Cancel a follow request */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'userId' parameter const [followeeId, followeeIdErr] = $.type(ID).get(params.userId); if (followeeIdErr) return rej('invalid userId param'); diff --git a/src/server/api/endpoints/following/requests/list.ts b/src/server/api/endpoints/following/requests/list.ts index e8364335d1..287c5a8e46 100644 --- a/src/server/api/endpoints/following/requests/list.ts +++ b/src/server/api/endpoints/following/requests/list.ts @@ -1,10 +1,11 @@ //import $ from 'cafy'; import ID from '../../../../../cafy-id'; import FollowRequest, { pack } from '../../../../../models/follow-request'; +import { ILocalUser } from '../../../../../models/user'; /** * Get all pending received follow requests */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { const reqs = await FollowRequest.find({ followeeId: user._id }); diff --git a/src/server/api/endpoints/following/requests/reject.ts b/src/server/api/endpoints/following/requests/reject.ts index 1cfb562b55..69dddf1355 100644 --- a/src/server/api/endpoints/following/requests/reject.ts +++ b/src/server/api/endpoints/following/requests/reject.ts @@ -1,11 +1,11 @@ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import rejectFollowRequest from '../../../../../services/following/requests/reject'; -import User from '../../../../../models/user'; +import User, { ILocalUser } from '../../../../../models/user'; /** * Reject a follow request */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'userId' parameter const [followerId, followerIdErr] = $.type(ID).get(params.userId); if (followerIdErr) return rej('invalid userId param'); diff --git a/src/server/api/endpoints/following/stalk.ts b/src/server/api/endpoints/following/stalk.ts index f0bc8cbdfc..b9d19d57b4 100644 --- a/src/server/api/endpoints/following/stalk.ts +++ b/src/server/api/endpoints/following/stalk.ts @@ -1,10 +1,11 @@ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Following from '../../../../models/following'; +import { ILocalUser } from '../../../../models/user'; /** * Stalk a user */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { const follower = user; // Get 'userId' parameter diff --git a/src/server/api/endpoints/following/unstalk.ts b/src/server/api/endpoints/following/unstalk.ts index 0d0a018c34..255f22ca1f 100644 --- a/src/server/api/endpoints/following/unstalk.ts +++ b/src/server/api/endpoints/following/unstalk.ts @@ -1,10 +1,11 @@ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Following from '../../../../models/following'; +import { ILocalUser } from '../../../../models/user'; /** * Unstalk a user */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { const follower = user; // Get 'userId' parameter diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts index 947dd6e448..17af9d6a9a 100644 --- a/src/server/api/endpoints/hashtags/trend.ts +++ b/src/server/api/endpoints/hashtags/trend.ts @@ -45,7 +45,10 @@ module.exports = () => new Promise(async (res, rej) => { return res([]); } - const tags = []; + const tags: Array<{ + name: string; + count: number; + }> = []; // カウント data.map(x => x._id).forEach(x => { diff --git a/src/server/api/endpoints/i.ts b/src/server/api/endpoints/i.ts index 379c3c4d88..5c769a02fd 100644 --- a/src/server/api/endpoints/i.ts +++ b/src/server/api/endpoints/i.ts @@ -1,12 +1,10 @@ -/** - * Module dependencies - */ -import User, { pack } from '../../../models/user'; +import User, { pack, ILocalUser } from '../../../models/user'; +import { IApp } from '../../../models/app'; /** * Show myself */ -module.exports = (params, user, app) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser, app: IApp) => new Promise(async (res, rej) => { const isSecure = user != null && app == null; // Serialize diff --git a/src/server/api/endpoints/i/2fa/done.ts b/src/server/api/endpoints/i/2fa/done.ts index 1a2706aa84..61f13c4c61 100644 --- a/src/server/api/endpoints/i/2fa/done.ts +++ b/src/server/api/endpoints/i/2fa/done.ts @@ -1,11 +1,8 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import * as speakeasy from 'speakeasy'; -import User from '../../../../../models/user'; +import User, { ILocalUser } from '../../../../../models/user'; -module.exports = async (params, user) => new Promise(async (res, rej) => { +module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'token' parameter const [token, tokenErr] = $.str.get(params.token); if (tokenErr) return rej('invalid token param'); diff --git a/src/server/api/endpoints/i/2fa/register.ts b/src/server/api/endpoints/i/2fa/register.ts index d314e1a280..d05892c84b 100644 --- a/src/server/api/endpoints/i/2fa/register.ts +++ b/src/server/api/endpoints/i/2fa/register.ts @@ -1,14 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import * as bcrypt from 'bcryptjs'; import * as speakeasy from 'speakeasy'; import * as QRCode from 'qrcode'; -import User from '../../../../../models/user'; +import User, { ILocalUser } from '../../../../../models/user'; import config from '../../../../../config'; -module.exports = async (params, user) => new Promise(async (res, rej) => { +module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'password' parameter const [password, passwordErr] = $.str.get(params.password); if (passwordErr) return rej('invalid password param'); diff --git a/src/server/api/endpoints/i/2fa/unregister.ts b/src/server/api/endpoints/i/2fa/unregister.ts index 336a3564ab..fc197cb1e4 100644 --- a/src/server/api/endpoints/i/2fa/unregister.ts +++ b/src/server/api/endpoints/i/2fa/unregister.ts @@ -1,11 +1,8 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import * as bcrypt from 'bcryptjs'; -import User from '../../../../../models/user'; +import User, { ILocalUser } from '../../../../../models/user'; -module.exports = async (params, user) => new Promise(async (res, rej) => { +module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'password' parameter const [password, passwordErr] = $.str.get(params.password); if (passwordErr) return rej('invalid password param'); diff --git a/src/server/api/endpoints/i/authorized_apps.ts b/src/server/api/endpoints/i/authorized_apps.ts index d15bd67bf2..cfc93c1518 100644 --- a/src/server/api/endpoints/i/authorized_apps.ts +++ b/src/server/api/endpoints/i/authorized_apps.ts @@ -1,14 +1,12 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import AccessToken from '../../../../models/access-token'; import { pack } from '../../../../models/app'; +import { ILocalUser } from '../../../../models/user'; /** * Get authorized apps of my account */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) return rej('invalid limit param'); diff --git a/src/server/api/endpoints/i/change_password.ts b/src/server/api/endpoints/i/change_password.ts index a1a1a43406..9851fa895a 100644 --- a/src/server/api/endpoints/i/change_password.ts +++ b/src/server/api/endpoints/i/change_password.ts @@ -1,14 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import * as bcrypt from 'bcryptjs'; -import User from '../../../../models/user'; +import User, { ILocalUser } from '../../../../models/user'; /** * Change password */ -module.exports = async (params, user) => new Promise(async (res, rej) => { +module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'currentPasword' parameter const [currentPassword, currentPasswordErr] = $.str.get(params.currentPasword); if (currentPasswordErr) return rej('invalid currentPasword param'); diff --git a/src/server/api/endpoints/i/favorites.ts b/src/server/api/endpoints/i/favorites.ts index 23517baaff..dc343afaed 100644 --- a/src/server/api/endpoints/i/favorites.ts +++ b/src/server/api/endpoints/i/favorites.ts @@ -1,13 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Favorite, { pack } from '../../../../models/favorite'; +import { ILocalUser } from '../../../../models/user'; /** * Get favorited notes */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) return rej('invalid limit param'); diff --git a/src/server/api/endpoints/i/notifications.ts b/src/server/api/endpoints/i/notifications.ts index ba9c47508c..ce283fe48f 100644 --- a/src/server/api/endpoints/i/notifications.ts +++ b/src/server/api/endpoints/i/notifications.ts @@ -1,17 +1,15 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Notification from '../../../../models/notification'; import Mute from '../../../../models/mute'; import { pack } from '../../../../models/notification'; import { getFriendIds } from '../../common/get-friends'; import read from '../../common/read-notification'; +import { ILocalUser } from '../../../../models/user'; /** * Get notifications */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'following' parameter const [following = false, followingError] = $.bool.optional().get(params.following); diff --git a/src/server/api/endpoints/i/pin.ts b/src/server/api/endpoints/i/pin.ts index 423f0ac4ae..7f4a45e1f5 100644 --- a/src/server/api/endpoints/i/pin.ts +++ b/src/server/api/endpoints/i/pin.ts @@ -1,15 +1,12 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; -import User from '../../../../models/user'; +import User, { ILocalUser } from '../../../../models/user'; import Note from '../../../../models/note'; import { pack } from '../../../../models/user'; /** * Pin note */ -module.exports = async (params, user) => new Promise(async (res, rej) => { +module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'noteId' parameter const [noteId, noteIdErr] = $.type(ID).get(params.noteId); if (noteIdErr) return rej('invalid noteId param'); diff --git a/src/server/api/endpoints/i/regenerate_token.ts b/src/server/api/endpoints/i/regenerate_token.ts index 6e1e571297..3ffab5428e 100644 --- a/src/server/api/endpoints/i/regenerate_token.ts +++ b/src/server/api/endpoints/i/regenerate_token.ts @@ -1,16 +1,13 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import * as bcrypt from 'bcryptjs'; -import User from '../../../../models/user'; +import User, { ILocalUser } from '../../../../models/user'; import event from '../../../../publishers/stream'; import generateUserToken from '../../common/generate-native-user-token'; /** * Regenerate native token */ -module.exports = async (params, user) => new Promise(async (res, rej) => { +module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'password' parameter const [password, passwordErr] = $.str.get(params.password); if (passwordErr) return rej('invalid password param'); diff --git a/src/server/api/endpoints/i/signin_history.ts b/src/server/api/endpoints/i/signin_history.ts index 63a74b41b1..4ab9881f34 100644 --- a/src/server/api/endpoints/i/signin_history.ts +++ b/src/server/api/endpoints/i/signin_history.ts @@ -1,13 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Signin, { pack } from '../../../../models/signin'; +import { ILocalUser } from '../../../../models/user'; /** * Get signin history of my account */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) return rej('invalid limit param'); diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 1a1da997c9..57b050ebc4 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -1,16 +1,14 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; -import User, { isValidName, isValidDescription, isValidLocation, isValidBirthday, pack } from '../../../../models/user'; +import User, { isValidName, isValidDescription, isValidLocation, isValidBirthday, pack, ILocalUser } from '../../../../models/user'; import event from '../../../../publishers/stream'; import DriveFile from '../../../../models/drive-file'; import acceptAllFollowRequests from '../../../../services/following/requests/accept-all'; +import { IApp } from '../../../../models/app'; /** * Update myself */ -module.exports = async (params, user, app) => new Promise(async (res, rej) => { +module.exports = async (params: any, user: ILocalUser, app: IApp) => new Promise(async (res, rej) => { const isSecure = user != null && app == null; const updates = {} as any; diff --git a/src/server/api/endpoints/i/update_client_setting.ts b/src/server/api/endpoints/i/update_client_setting.ts index e91d7565fd..6d6e8ed24a 100644 --- a/src/server/api/endpoints/i/update_client_setting.ts +++ b/src/server/api/endpoints/i/update_client_setting.ts @@ -1,14 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; -import User from '../../../../models/user'; +import User, { ILocalUser } from '../../../../models/user'; import event from '../../../../publishers/stream'; /** * Update myself */ -module.exports = async (params, user) => new Promise(async (res, rej) => { +module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'name' parameter const [name, nameErr] = $.str.get(params.name); if (nameErr) return rej('invalid name param'); @@ -17,7 +14,7 @@ module.exports = async (params, user) => new Promise(async (res, rej) => { const [value, valueErr] = $.any.nullable().get(params.value); if (valueErr) return rej('invalid value param'); - const x = {}; + const x: any = {}; x[`clientSettings.${name}`] = value; await User.update(user._id, { diff --git a/src/server/api/endpoints/i/update_home.ts b/src/server/api/endpoints/i/update_home.ts index 48f6dbbb7a..511a647d88 100644 --- a/src/server/api/endpoints/i/update_home.ts +++ b/src/server/api/endpoints/i/update_home.ts @@ -1,8 +1,8 @@ import $ from 'cafy'; -import User from '../../../../models/user'; +import User, { ILocalUser } from '../../../../models/user'; import event from '../../../../publishers/stream'; -module.exports = async (params, user) => new Promise(async (res, rej) => { +module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'home' parameter const [home, homeErr] = $.arr( $.obj.strict() diff --git a/src/server/api/endpoints/i/update_mobile_home.ts b/src/server/api/endpoints/i/update_mobile_home.ts index d285a0a72d..b1f25624fd 100644 --- a/src/server/api/endpoints/i/update_mobile_home.ts +++ b/src/server/api/endpoints/i/update_mobile_home.ts @@ -1,8 +1,8 @@ import $ from 'cafy'; -import User from '../../../../models/user'; +import User, { ILocalUser } from '../../../../models/user'; import event from '../../../../publishers/stream'; -module.exports = async (params, user) => new Promise(async (res, rej) => { +module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'home' parameter const [home, homeErr] = $.arr( $.obj.strict() diff --git a/src/server/api/endpoints/i/update_widget.ts b/src/server/api/endpoints/i/update_widget.ts index b37761bde1..82bb04d1f4 100644 --- a/src/server/api/endpoints/i/update_widget.ts +++ b/src/server/api/endpoints/i/update_widget.ts @@ -1,8 +1,8 @@ import $ from 'cafy'; -import User from '../../../../models/user'; +import User, { ILocalUser } from '../../../../models/user'; import event from '../../../../publishers/stream'; -module.exports = async (params, user) => new Promise(async (res, rej) => { +module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'id' parameter const [id, idErr] = $.str.get(params.id); if (idErr) return rej('invalid id param'); @@ -18,7 +18,7 @@ module.exports = async (params, user) => new Promise(async (res, rej) => { //#region Desktop home if (widget == null && user.clientSettings.home) { const desktopHome = user.clientSettings.home; - widget = desktopHome.find(w => w.id == id); + widget = desktopHome.find((w: any) => w.id == id); if (widget) { widget.data = data; @@ -34,7 +34,7 @@ module.exports = async (params, user) => new Promise(async (res, rej) => { //#region Mobile home if (widget == null && user.clientSettings.mobileHome) { const mobileHome = user.clientSettings.mobileHome; - widget = mobileHome.find(w => w.id == id); + widget = mobileHome.find((w: any) => w.id == id); if (widget) { widget.data = data; @@ -50,8 +50,8 @@ module.exports = async (params, user) => new Promise(async (res, rej) => { //#region Deck if (widget == null && user.clientSettings.deck && user.clientSettings.deck.columns) { const deck = user.clientSettings.deck; - deck.columns.filter(c => c.type == 'widgets').forEach(c => { - c.widgets.forEach(w => { + deck.columns.filter((c: any) => c.type == 'widgets').forEach((c: any) => { + c.widgets.forEach((w: any) => { if (w.id == id) widget = w; }); }); diff --git a/src/server/api/endpoints/messaging/history.ts b/src/server/api/endpoints/messaging/history.ts index ec97642f17..713ba9dd7f 100644 --- a/src/server/api/endpoints/messaging/history.ts +++ b/src/server/api/endpoints/messaging/history.ts @@ -1,15 +1,13 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import History from '../../../../models/messaging-history'; import Mute from '../../../../models/mute'; import { pack } from '../../../../models/messaging-message'; +import { ILocalUser } from '../../../../models/user'; /** * Show messaging history */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) return rej('invalid limit param'); diff --git a/src/server/api/endpoints/messaging/messages.ts b/src/server/api/endpoints/messaging/messages.ts index 9c3a48334b..3eb20ec06b 100644 --- a/src/server/api/endpoints/messaging/messages.ts +++ b/src/server/api/endpoints/messaging/messages.ts @@ -1,13 +1,13 @@ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Message from '../../../../models/messaging-message'; -import User from '../../../../models/user'; +import User, { ILocalUser } from '../../../../models/user'; import { pack } from '../../../../models/messaging-message'; import read from '../../common/read-messaging-message'; /** * Get messages */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'userId' parameter const [recipientId, recipientIdErr] = $.type(ID).get(params.userId); if (recipientIdErr) return rej('invalid userId param'); diff --git a/src/server/api/endpoints/messaging/messages/create.ts b/src/server/api/endpoints/messaging/messages/create.ts index 41238de1e1..b3e4f6a8cd 100644 --- a/src/server/api/endpoints/messaging/messages/create.ts +++ b/src/server/api/endpoints/messaging/messages/create.ts @@ -1,11 +1,8 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import Message from '../../../../../models/messaging-message'; import { isValidText } from '../../../../../models/messaging-message'; import History from '../../../../../models/messaging-history'; -import User from '../../../../../models/user'; +import User, { ILocalUser } from '../../../../../models/user'; import Mute from '../../../../../models/mute'; import DriveFile from '../../../../../models/drive-file'; import { pack } from '../../../../../models/messaging-message'; @@ -17,7 +14,7 @@ import config from '../../../../../config'; /** * Create a message */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'userId' parameter const [recipientId, recipientIdErr] = $.type(ID).get(params.userId); if (recipientIdErr) return rej('invalid userId param'); diff --git a/src/server/api/endpoints/meta.ts b/src/server/api/endpoints/meta.ts index 0e9ecf47df..ce460d0b8b 100644 --- a/src/server/api/endpoints/meta.ts +++ b/src/server/api/endpoints/meta.ts @@ -38,7 +38,7 @@ const client = require('../../../../built/client/meta.json'); /** * Show core info */ -module.exports = (params) => new Promise(async (res, rej) => { +module.exports = (params: any) => new Promise(async (res, rej) => { const meta: any = (await Meta.findOne()) || {}; res({ diff --git a/src/server/api/endpoints/mute/create.ts b/src/server/api/endpoints/mute/create.ts index 534020c671..415745e2c3 100644 --- a/src/server/api/endpoints/mute/create.ts +++ b/src/server/api/endpoints/mute/create.ts @@ -1,14 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; -import User from '../../../../models/user'; +import User, { ILocalUser } from '../../../../models/user'; import Mute from '../../../../models/mute'; /** * Mute a user */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { const muter = user; // Get 'userId' parameter diff --git a/src/server/api/endpoints/mute/delete.ts b/src/server/api/endpoints/mute/delete.ts index 949aff64ba..2d1d286585 100644 --- a/src/server/api/endpoints/mute/delete.ts +++ b/src/server/api/endpoints/mute/delete.ts @@ -1,14 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; -import User from '../../../../models/user'; +import User, { ILocalUser } from '../../../../models/user'; import Mute from '../../../../models/mute'; /** * Unmute a user */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { const muter = user; // Get 'userId' parameter diff --git a/src/server/api/endpoints/mute/list.ts b/src/server/api/endpoints/mute/list.ts index cf89f7e959..8b0171be33 100644 --- a/src/server/api/endpoints/mute/list.ts +++ b/src/server/api/endpoints/mute/list.ts @@ -1,15 +1,12 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Mute from '../../../../models/mute'; -import { pack } from '../../../../models/user'; +import { pack, ILocalUser } from '../../../../models/user'; import { getFriendIds } from '../../common/get-friends'; /** * Get muted users of a user */ -module.exports = (params, me) => new Promise(async (res, rej) => { +module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => { // Get 'iknow' parameter const [iknow = false, iknowErr] = $.bool.optional().get(params.iknow); if (iknowErr) return rej('invalid iknow param'); diff --git a/src/server/api/endpoints/my/apps.ts b/src/server/api/endpoints/my/apps.ts index 086e0b8965..7687afd0c7 100644 --- a/src/server/api/endpoints/my/apps.ts +++ b/src/server/api/endpoints/my/apps.ts @@ -1,13 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import App, { pack } from '../../../../models/app'; +import { ILocalUser } from '../../../../models/user'; /** * Get my apps */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) return rej('invalid limit param'); diff --git a/src/server/api/endpoints/notes.ts b/src/server/api/endpoints/notes.ts index e6fe80ac8a..5554e53aa4 100644 --- a/src/server/api/endpoints/notes.ts +++ b/src/server/api/endpoints/notes.ts @@ -7,7 +7,7 @@ import Note, { pack } from '../../../models/note'; /** * Get all notes */ -module.exports = (params) => new Promise(async (res, rej) => { +module.exports = (params: any) => new Promise(async (res, rej) => { // Get 'local' parameter const [local, localErr] = $.bool.optional().get(params.local); if (localErr) return rej('invalid local param'); diff --git a/src/server/api/endpoints/notes/conversation.ts b/src/server/api/endpoints/notes/conversation.ts index 02f7229ccf..b2bc6a2e72 100644 --- a/src/server/api/endpoints/notes/conversation.ts +++ b/src/server/api/endpoints/notes/conversation.ts @@ -1,13 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; -import Note, { pack } from '../../../../models/note'; +import Note, { pack, INote } from '../../../../models/note'; +import { ILocalUser } from '../../../../models/user'; /** * Show conversation of a note */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'noteId' parameter const [noteId, noteIdErr] = $.type(ID).get(params.noteId); if (noteIdErr) return rej('invalid noteId param'); @@ -29,10 +27,10 @@ module.exports = (params, user) => new Promise(async (res, rej) => { return rej('note not found'); } - const conversation = []; + const conversation: INote[] = []; let i = 0; - async function get(id) { + async function get(id: any) { i++; const p = await Note.findOne({ _id: id }); diff --git a/src/server/api/endpoints/notes/create.ts b/src/server/api/endpoints/notes/create.ts index 446764e1d6..64f3b5ce26 100644 --- a/src/server/api/endpoints/notes/create.ts +++ b/src/server/api/endpoints/notes/create.ts @@ -1,9 +1,6 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Note, { INote, isValidText, isValidCw, pack } from '../../../../models/note'; -import User, { ILocalUser } from '../../../../models/user'; +import User, { ILocalUser, IUser } from '../../../../models/user'; import DriveFile from '../../../../models/drive-file'; import create from '../../../../services/note/create'; import { IApp } from '../../../../models/app'; @@ -11,7 +8,7 @@ import { IApp } from '../../../../models/app'; /** * Create a note */ -module.exports = (params, user: ILocalUser, app: IApp) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser, app: IApp) => new Promise(async (res, rej) => { // Get 'visibility' parameter const [visibility = 'public', visibilityErr] = $.str.optional().or(['public', 'home', 'followers', 'specified', 'private']).get(params.visibility); if (visibilityErr) return rej('invalid visibility'); @@ -20,7 +17,7 @@ module.exports = (params, user: ILocalUser, app: IApp) => new Promise(async (res const [visibleUserIds, visibleUserIdsErr] = $.arr($.type(ID)).optional().unique().min(1).get(params.visibleUserIds); if (visibleUserIdsErr) return rej('invalid visibleUserIds'); - let visibleUsers = []; + let visibleUsers: IUser[] = []; if (visibleUserIds !== undefined) { visibleUsers = await Promise.all(visibleUserIds.map(id => User.findOne({ _id: id @@ -132,7 +129,7 @@ module.exports = (params, user: ILocalUser, app: IApp) => new Promise(async (res if (pollErr) return rej('invalid poll'); if (poll) { - (poll as any).choices = (poll as any).choices.map((choice, i) => ({ + (poll as any).choices = (poll as any).choices.map((choice: string, i: number) => ({ id: i, // IDを付与 text: choice.trim(), votes: 0 diff --git a/src/server/api/endpoints/notes/delete.ts b/src/server/api/endpoints/notes/delete.ts index 9bbb1541d6..70bcdbaab9 100644 --- a/src/server/api/endpoints/notes/delete.ts +++ b/src/server/api/endpoints/notes/delete.ts @@ -1,11 +1,12 @@ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Note from '../../../../models/note'; import deleteNote from '../../../../services/note/delete'; +import { ILocalUser } from '../../../../models/user'; /** * Delete a note */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'noteId' parameter const [noteId, noteIdErr] = $.type(ID).get(params.noteId); if (noteIdErr) return rej('invalid noteId param'); diff --git a/src/server/api/endpoints/notes/favorites/create.ts b/src/server/api/endpoints/notes/favorites/create.ts index 6832b52f75..23f7ac5f8d 100644 --- a/src/server/api/endpoints/notes/favorites/create.ts +++ b/src/server/api/endpoints/notes/favorites/create.ts @@ -1,14 +1,12 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import Favorite from '../../../../../models/favorite'; import Note from '../../../../../models/note'; +import { ILocalUser } from '../../../../../models/user'; /** * Favorite a note */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'noteId' parameter const [noteId, noteIdErr] = $.type(ID).get(params.noteId); if (noteIdErr) return rej('invalid noteId param'); diff --git a/src/server/api/endpoints/notes/favorites/delete.ts b/src/server/api/endpoints/notes/favorites/delete.ts index 07112dae15..7d2d2b4cb5 100644 --- a/src/server/api/endpoints/notes/favorites/delete.ts +++ b/src/server/api/endpoints/notes/favorites/delete.ts @@ -1,14 +1,12 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import Favorite from '../../../../../models/favorite'; import Note from '../../../../../models/note'; +import { ILocalUser } from '../../../../../models/user'; /** * Unfavorite a note */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'noteId' parameter const [noteId, noteIdErr] = $.type(ID).get(params.noteId); if (noteIdErr) return rej('invalid noteId param'); diff --git a/src/server/api/endpoints/notes/global-timeline.ts b/src/server/api/endpoints/notes/global-timeline.ts index 2d4f2b6368..24ffdbcba7 100644 --- a/src/server/api/endpoints/notes/global-timeline.ts +++ b/src/server/api/endpoints/notes/global-timeline.ts @@ -1,15 +1,13 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Note from '../../../../models/note'; import Mute from '../../../../models/mute'; import { pack } from '../../../../models/note'; +import { ILocalUser } from '../../../../models/user'; /** * Get timeline of global */ -module.exports = async (params, user) => { +module.exports = async (params: any, user: ILocalUser) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) throw 'invalid limit param'; diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts index 734cc9af0a..48490638d2 100644 --- a/src/server/api/endpoints/notes/local-timeline.ts +++ b/src/server/api/endpoints/notes/local-timeline.ts @@ -1,15 +1,13 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Note from '../../../../models/note'; import Mute from '../../../../models/mute'; import { pack } from '../../../../models/note'; +import { ILocalUser } from '../../../../models/user'; /** * Get timeline of local */ -module.exports = async (params, user) => { +module.exports = async (params: any, user: ILocalUser) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) throw 'invalid limit param'; diff --git a/src/server/api/endpoints/notes/mentions.ts b/src/server/api/endpoints/notes/mentions.ts index 163a6b4866..45511603af 100644 --- a/src/server/api/endpoints/notes/mentions.ts +++ b/src/server/api/endpoints/notes/mentions.ts @@ -1,19 +1,13 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Note from '../../../../models/note'; import { getFriendIds } from '../../common/get-friends'; import { pack } from '../../../../models/note'; +import { ILocalUser } from '../../../../models/user'; /** * Get mentions of myself - * - * @param {any} params - * @param {any} user - * @return {Promise<any>} */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'following' parameter const [following = false, followingError] = $.bool.optional().get(params.following); diff --git a/src/server/api/endpoints/notes/polls/recommendation.ts b/src/server/api/endpoints/notes/polls/recommendation.ts index a272378d19..640140c3d1 100644 --- a/src/server/api/endpoints/notes/polls/recommendation.ts +++ b/src/server/api/endpoints/notes/polls/recommendation.ts @@ -1,14 +1,12 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import Vote from '../../../../../models/poll-vote'; import Note, { pack } from '../../../../../models/note'; +import { ILocalUser } from '../../../../../models/user'; /** * Get recommended polls */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) return rej('invalid limit param'); diff --git a/src/server/api/endpoints/notes/polls/vote.ts b/src/server/api/endpoints/notes/polls/vote.ts index f8f4515308..72ac6bb202 100644 --- a/src/server/api/endpoints/notes/polls/vote.ts +++ b/src/server/api/endpoints/notes/polls/vote.ts @@ -1,6 +1,3 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import Vote from '../../../../../models/poll-vote'; import Note from '../../../../../models/note'; @@ -8,11 +5,12 @@ import Watching from '../../../../../models/note-watching'; import watch from '../../../../../services/note/watch'; import { publishNoteStream } from '../../../../../publishers/stream'; import notify from '../../../../../publishers/notify'; +import { ILocalUser } from '../../../../../models/user'; /** * Vote poll of a note */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'noteId' parameter const [noteId, noteIdErr] = $.type(ID).get(params.noteId); if (noteIdErr) return rej('invalid noteId param'); @@ -58,8 +56,8 @@ module.exports = (params, user) => new Promise(async (res, rej) => { // Send response res(); - const inc = {}; - inc[`poll.choices.${findWithAttr(note.poll.choices, 'id', choice)}.votes`] = 1; + const inc: any = {}; + inc[`poll.choices.${note.poll.choices.findIndex(c => c.id == choice)}.votes`] = 1; // Increment votes count await Note.update({ _id: note._id }, { @@ -100,12 +98,3 @@ module.exports = (params, user) => new Promise(async (res, rej) => { watch(user._id, note); } }); - -function findWithAttr(array, attr, value) { - for (let i = 0; i < array.length; i += 1) { - if (array[i][attr] === value) { - return i; - } - } - return -1; -} diff --git a/src/server/api/endpoints/notes/reactions.ts b/src/server/api/endpoints/notes/reactions.ts index 4ad952a7a1..d3b2d43432 100644 --- a/src/server/api/endpoints/notes/reactions.ts +++ b/src/server/api/endpoints/notes/reactions.ts @@ -1,18 +1,12 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Note from '../../../../models/note'; import Reaction, { pack } from '../../../../models/note-reaction'; +import { ILocalUser } from '../../../../models/user'; /** * Show reactions of a note - * - * @param {any} params - * @param {any} user - * @return {Promise<any>} */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'noteId' parameter const [noteId, noteIdErr] = $.type(ID).get(params.noteId); if (noteIdErr) return rej('invalid noteId param'); diff --git a/src/server/api/endpoints/notes/reactions/create.ts b/src/server/api/endpoints/notes/reactions/create.ts index 21757cb427..33e457e308 100644 --- a/src/server/api/endpoints/notes/reactions/create.ts +++ b/src/server/api/endpoints/notes/reactions/create.ts @@ -1,15 +1,13 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import Note from '../../../../../models/note'; import create from '../../../../../services/note/reaction/create'; import { validateReaction } from '../../../../../models/note-reaction'; +import { ILocalUser } from '../../../../../models/user'; /** * React to a note */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'noteId' parameter const [noteId, noteIdErr] = $.type(ID).get(params.noteId); if (noteIdErr) return rej('invalid noteId param'); diff --git a/src/server/api/endpoints/notes/reactions/delete.ts b/src/server/api/endpoints/notes/reactions/delete.ts index afb8629112..1f2d662511 100644 --- a/src/server/api/endpoints/notes/reactions/delete.ts +++ b/src/server/api/endpoints/notes/reactions/delete.ts @@ -1,14 +1,12 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import Reaction from '../../../../../models/note-reaction'; import Note from '../../../../../models/note'; +import { ILocalUser } from '../../../../../models/user'; /** * Unreact to a note */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'noteId' parameter const [noteId, noteIdErr] = $.type(ID).get(params.noteId); if (noteIdErr) return rej('invalid noteId param'); @@ -45,7 +43,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => { // Send response res(); - const dec = {}; + const dec: any = {}; dec[`reactionCounts.${exist.reaction}`] = -1; // Decrement reactions count diff --git a/src/server/api/endpoints/notes/replies.ts b/src/server/api/endpoints/notes/replies.ts index 608027f6b1..4aaf1d322b 100644 --- a/src/server/api/endpoints/notes/replies.ts +++ b/src/server/api/endpoints/notes/replies.ts @@ -1,10 +1,11 @@ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Note, { pack } from '../../../../models/note'; +import { ILocalUser } from '../../../../models/user'; /** * Get replies of a note */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'noteId' parameter const [noteId, noteIdErr] = $.type(ID).get(params.noteId); if (noteIdErr) return rej('invalid noteId param'); diff --git a/src/server/api/endpoints/notes/reposts.ts b/src/server/api/endpoints/notes/reposts.ts index 3098211b61..ea3f174e1a 100644 --- a/src/server/api/endpoints/notes/reposts.ts +++ b/src/server/api/endpoints/notes/reposts.ts @@ -1,17 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Note, { pack } from '../../../../models/note'; +import { ILocalUser } from '../../../../models/user'; /** * Show a renotes of a note - * - * @param {any} params - * @param {any} user - * @return {Promise<any>} */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'noteId' parameter const [noteId, noteIdErr] = $.type(ID).get(params.noteId); if (noteIdErr) return rej('invalid noteId param'); diff --git a/src/server/api/endpoints/notes/search.ts b/src/server/api/endpoints/notes/search.ts deleted file mode 100644 index 9705dcfd6e..0000000000 --- a/src/server/api/endpoints/notes/search.ts +++ /dev/null @@ -1,364 +0,0 @@ -/** - * Module dependencies - */ -import $ from 'cafy'; import ID from '../../../../cafy-id'; -const escapeRegexp = require('escape-regexp'); -import Note from '../../../../models/note'; -import User from '../../../../models/user'; -import Mute from '../../../../models/mute'; -import { getFriendIds } from '../../common/get-friends'; -import { pack } from '../../../../models/note'; - -/** - * Search a note - * - * @param {any} params - * @param {any} me - * @return {Promise<any>} - */ -module.exports = (params, me) => new Promise(async (res, rej) => { - // Get 'text' parameter - const [text, textError] = $.str.optional().get(params.text); - if (textError) return rej('invalid text param'); - - // Get 'includeUserIds' parameter - const [includeUserIds = [], includeUserIdsErr] = $.arr($.type(ID)).optional().get(params.includeUserIds); - if (includeUserIdsErr) return rej('invalid includeUserIds param'); - - // Get 'excludeUserIds' parameter - const [excludeUserIds = [], excludeUserIdsErr] = $.arr($.type(ID)).optional().get(params.excludeUserIds); - if (excludeUserIdsErr) return rej('invalid excludeUserIds param'); - - // Get 'includeUserUsernames' parameter - const [includeUserUsernames = [], includeUserUsernamesErr] = $.arr($.str).optional().get(params.includeUserUsernames); - if (includeUserUsernamesErr) return rej('invalid includeUserUsernames param'); - - // Get 'excludeUserUsernames' parameter - const [excludeUserUsernames = [], excludeUserUsernamesErr] = $.arr($.str).optional().get(params.excludeUserUsernames); - if (excludeUserUsernamesErr) return rej('invalid excludeUserUsernames param'); - - // Get 'following' parameter - const [following = null, followingErr] = $.bool.optional().nullable().get(params.following); - if (followingErr) return rej('invalid following param'); - - // Get 'mute' parameter - const [mute = 'mute_all', muteErr] = $.str.optional().get(params.mute); - if (muteErr) return rej('invalid mute param'); - - // Get 'reply' parameter - const [reply = null, replyErr] = $.bool.optional().nullable().get(params.reply); - if (replyErr) return rej('invalid reply param'); - - // Get 'renote' parameter - const [renote = null, renoteErr] = $.bool.optional().nullable().get(params.renote); - if (renoteErr) return rej('invalid renote param'); - - // Get 'media' parameter - const [media = null, mediaErr] = $.bool.optional().nullable().get(params.media); - if (mediaErr) return rej('invalid media param'); - - // Get 'poll' parameter - const [poll = null, pollErr] = $.bool.optional().nullable().get(params.poll); - if (pollErr) return rej('invalid poll param'); - - // Get 'sinceDate' parameter - const [sinceDate, sinceDateErr] = $.num.optional().get(params.sinceDate); - if (sinceDateErr) throw 'invalid sinceDate param'; - - // Get 'untilDate' parameter - const [untilDate, untilDateErr] = $.num.optional().get(params.untilDate); - if (untilDateErr) throw 'invalid untilDate param'; - - // Get 'offset' parameter - const [offset = 0, offsetErr] = $.num.optional().min(0).get(params.offset); - if (offsetErr) return rej('invalid offset param'); - - // Get 'limit' parameter - const [limit = 10, limitErr] = $.num.optional().range(1, 30).get(params.limit); - if (limitErr) return rej('invalid limit param'); - - let includeUsers = includeUserIds; - if (includeUserUsernames != null) { - const ids = (await Promise.all(includeUserUsernames.map(async (username) => { - const _user = await User.findOne({ - usernameLower: username.toLowerCase() - }); - return _user ? _user._id : null; - }))).filter(id => id != null); - includeUsers = includeUsers.concat(ids); - } - - let excludeUsers = excludeUserIds; - if (excludeUserUsernames != null) { - const ids = (await Promise.all(excludeUserUsernames.map(async (username) => { - const _user = await User.findOne({ - usernameLower: username.toLowerCase() - }); - return _user ? _user._id : null; - }))).filter(id => id != null); - excludeUsers = excludeUsers.concat(ids); - } - - search(res, rej, me, text, includeUsers, excludeUsers, following, - mute, reply, renote, media, poll, sinceDate, untilDate, offset, limit); -}); - -async function search( - res, rej, me, text, includeUserIds, excludeUserIds, following, - mute, reply, renote, media, poll, sinceDate, untilDate, offset, max) { - - let q: any = { - $and: [] - }; - - const push = x => q.$and.push(x); - - if (text) { - // 完全一致検索 - if (/"""(.+?)"""/.test(text)) { - const x = text.match(/"""(.+?)"""/)[1]; - push({ - text: x - }); - } else { - const tags = text.split(' ').filter(x => x[0] == '#'); - if (tags) { - push({ - $and: tags.map(x => ({ - tags: x - })) - }); - } - - push({ - $and: text.split(' ').map(x => ({ - // キーワードが-で始まる場合そのキーワードを除外する - text: x[0] == '-' ? { - $not: new RegExp(escapeRegexp(x.substr(1))) - } : new RegExp(escapeRegexp(x)) - })) - }); - } - } - - if (includeUserIds && includeUserIds.length != 0) { - push({ - userId: { - $in: includeUserIds - } - }); - } else if (excludeUserIds && excludeUserIds.length != 0) { - push({ - userId: { - $nin: excludeUserIds - } - }); - } - - if (following != null && me != null) { - const ids = await getFriendIds(me._id, false); - push({ - userId: following ? { - $in: ids - } : { - $nin: ids.concat(me._id) - } - }); - } - - if (me != null) { - const mutes = await Mute.find({ - muterId: me._id, - deletedAt: { $exists: false } - }); - const mutedUserIds = mutes.map(m => m.muteeId); - - switch (mute) { - case 'mute_all': - push({ - userId: { - $nin: mutedUserIds - }, - '_reply.userId': { - $nin: mutedUserIds - }, - '_renote.userId': { - $nin: mutedUserIds - } - }); - break; - case 'mute_related': - push({ - '_reply.userId': { - $nin: mutedUserIds - }, - '_renote.userId': { - $nin: mutedUserIds - } - }); - break; - case 'mute_direct': - push({ - userId: { - $nin: mutedUserIds - } - }); - break; - case 'direct_only': - push({ - userId: { - $in: mutedUserIds - } - }); - break; - case 'related_only': - push({ - $or: [{ - '_reply.userId': { - $in: mutedUserIds - } - }, { - '_renote.userId': { - $in: mutedUserIds - } - }] - }); - break; - case 'all_only': - push({ - $or: [{ - userId: { - $in: mutedUserIds - } - }, { - '_reply.userId': { - $in: mutedUserIds - } - }, { - '_renote.userId': { - $in: mutedUserIds - } - }] - }); - break; - } - } - - if (reply != null) { - if (reply) { - push({ - replyId: { - $exists: true, - $ne: null - } - }); - } else { - push({ - $or: [{ - replyId: { - $exists: false - } - }, { - replyId: null - }] - }); - } - } - - if (renote != null) { - if (renote) { - push({ - renoteId: { - $exists: true, - $ne: null - } - }); - } else { - push({ - $or: [{ - renoteId: { - $exists: false - } - }, { - renoteId: null - }] - }); - } - } - - if (media != null) { - if (media) { - push({ - mediaIds: { - $exists: true, - $ne: null - } - }); - } else { - push({ - $or: [{ - mediaIds: { - $exists: false - } - }, { - mediaIds: null - }] - }); - } - } - - if (poll != null) { - if (poll) { - push({ - poll: { - $exists: true, - $ne: null - } - }); - } else { - push({ - $or: [{ - poll: { - $exists: false - } - }, { - poll: null - }] - }); - } - } - - if (sinceDate) { - push({ - createdAt: { - $gt: new Date(sinceDate) - } - }); - } - - if (untilDate) { - push({ - createdAt: { - $lt: new Date(untilDate) - } - }); - } - - if (q.$and.length == 0) { - q = {}; - } - - // Search notes - const notes = await Note - .find(q, { - sort: { - _id: -1 - }, - limit: max, - skip: offset - }); - - // Serialize - res(await Promise.all(notes.map(async note => - await pack(note, me)))); -} diff --git a/src/server/api/endpoints/notes/search_by_tag.ts b/src/server/api/endpoints/notes/search_by_tag.ts index 1eb4cde49c..9be7cfffb6 100644 --- a/src/server/api/endpoints/notes/search_by_tag.ts +++ b/src/server/api/endpoints/notes/search_by_tag.ts @@ -1,6 +1,6 @@ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Note from '../../../../models/note'; -import User from '../../../../models/user'; +import User, { ILocalUser } from '../../../../models/user'; import Mute from '../../../../models/mute'; import { getFriendIds } from '../../common/get-friends'; import { pack } from '../../../../models/note'; @@ -8,7 +8,7 @@ import { pack } from '../../../../models/note'; /** * Search notes by tag */ -module.exports = (params, me) => new Promise(async (res, rej) => { +module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => { // Get 'tag' parameter const [tag, tagError] = $.str.get(params.tag); if (tagError) return rej('invalid tag param'); @@ -69,7 +69,6 @@ module.exports = (params, me) => new Promise(async (res, rej) => { const [limit = 10, limitErr] = $.num.optional().range(1, 30).get(params.limit); if (limitErr) return rej('invalid limit param'); - let includeUsers = includeUserIds; if (includeUserUsernames != null) { const ids = (await Promise.all(includeUserUsernames.map(async (username) => { const _user = await User.findOne({ @@ -77,10 +76,10 @@ module.exports = (params, me) => new Promise(async (res, rej) => { }); return _user ? _user._id : null; }))).filter(id => id != null); - includeUsers = includeUsers.concat(ids); + + ids.forEach(id => includeUserIds.push(id)); } - let excludeUsers = excludeUserIds; if (excludeUserUsernames != null) { const ids = (await Promise.all(excludeUserUsernames.map(async (username) => { const _user = await User.findOne({ @@ -88,24 +87,17 @@ module.exports = (params, me) => new Promise(async (res, rej) => { }); return _user ? _user._id : null; }))).filter(id => id != null); - excludeUsers = excludeUsers.concat(ids); + + ids.forEach(id => excludeUserIds.push(id)); } - search(res, rej, me, tag, includeUsers, excludeUsers, following, - mute, reply, renote, media, poll, sinceDate, untilDate, offset, limit); -}); - -async function search( - res, rej, me, tag, includeUserIds, excludeUserIds, following, - mute, reply, renote, media, poll, sinceDate, untilDate, offset, max) { - let q: any = { $and: [{ tagsLower: tag.toLowerCase() }] }; - const push = x => q.$and.push(x); + const push = (x: any) => q.$and.push(x); if (includeUserIds && includeUserIds.length != 0) { push({ @@ -320,10 +312,10 @@ async function search( sort: { _id: -1 }, - limit: max, + limit: limit, skip: offset }); // Serialize res(await Promise.all(notes.map(note => pack(note, me)))); -} +}); diff --git a/src/server/api/endpoints/notes/show.ts b/src/server/api/endpoints/notes/show.ts index 78dc55a703..1ba7145996 100644 --- a/src/server/api/endpoints/notes/show.ts +++ b/src/server/api/endpoints/notes/show.ts @@ -1,17 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Note, { pack } from '../../../../models/note'; +import { ILocalUser } from '../../../../models/user'; /** * Show a note - * - * @param {any} params - * @param {any} user - * @return {Promise<any>} */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'noteId' parameter const [noteId, noteIdErr] = $.type(ID).get(params.noteId); if (noteIdErr) return rej('invalid noteId param'); diff --git a/src/server/api/endpoints/notes/timeline.ts b/src/server/api/endpoints/notes/timeline.ts index f1d741d5ee..18c0acd379 100644 --- a/src/server/api/endpoints/notes/timeline.ts +++ b/src/server/api/endpoints/notes/timeline.ts @@ -1,16 +1,14 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Note from '../../../../models/note'; import Mute from '../../../../models/mute'; import { getFriends } from '../../common/get-friends'; import { pack } from '../../../../models/note'; +import { ILocalUser } from '../../../../models/user'; /** * Get timeline of myself */ -module.exports = async (params, user, app) => { +module.exports = async (params: any, user: ILocalUser) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) throw 'invalid limit param'; diff --git a/src/server/api/endpoints/notes/trend.ts b/src/server/api/endpoints/notes/trend.ts index 4735bec51e..9c0a1bb112 100644 --- a/src/server/api/endpoints/notes/trend.ts +++ b/src/server/api/endpoints/notes/trend.ts @@ -1,18 +1,12 @@ -/** - * Module dependencies - */ const ms = require('ms'); import $ from 'cafy'; import Note, { pack } from '../../../../models/note'; +import { ILocalUser } from '../../../../models/user'; /** * Get trend notes - * - * @param {any} params - * @param {any} user - * @return {Promise<any>} */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) return rej('invalid limit param'); diff --git a/src/server/api/endpoints/notes/user-list-timeline.ts b/src/server/api/endpoints/notes/user-list-timeline.ts index a74a5141f9..8aa800b712 100644 --- a/src/server/api/endpoints/notes/user-list-timeline.ts +++ b/src/server/api/endpoints/notes/user-list-timeline.ts @@ -1,16 +1,14 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Note from '../../../../models/note'; import Mute from '../../../../models/mute'; import { pack } from '../../../../models/note'; import UserList from '../../../../models/user-list'; +import { ILocalUser } from '../../../../models/user'; /** * Get timeline of a user list */ -module.exports = async (params, user, app) => { +module.exports = async (params: any, user: ILocalUser) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) throw 'invalid limit param'; diff --git a/src/server/api/endpoints/notifications/mark_as_read_all.ts b/src/server/api/endpoints/notifications/mark_as_read_all.ts index 7a48ca3e62..faaaf65a2d 100644 --- a/src/server/api/endpoints/notifications/mark_as_read_all.ts +++ b/src/server/api/endpoints/notifications/mark_as_read_all.ts @@ -1,11 +1,11 @@ import Notification from '../../../../models/notification'; import event from '../../../../publishers/stream'; -import User from '../../../../models/user'; +import User, { ILocalUser } from '../../../../models/user'; /** * Mark as read all notifications */ -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Update documents await Notification.update({ notifieeId: user._id, diff --git a/src/server/api/endpoints/reversi/games.ts b/src/server/api/endpoints/reversi/games.ts index 9d879ecf23..1455f191f7 100644 --- a/src/server/api/endpoints/reversi/games.ts +++ b/src/server/api/endpoints/reversi/games.ts @@ -1,7 +1,8 @@ import $ from 'cafy'; import ID from '../../../../cafy-id'; import ReversiGame, { pack } from '../../../../models/reversi-game'; +import { ILocalUser } from '../../../../models/user'; -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'my' parameter const [my = false, myErr] = $.bool.optional().get(params.my); if (myErr) return rej('invalid my param'); diff --git a/src/server/api/endpoints/reversi/games/show.ts b/src/server/api/endpoints/reversi/games/show.ts index f32eb23513..d70ee547a2 100644 --- a/src/server/api/endpoints/reversi/games/show.ts +++ b/src/server/api/endpoints/reversi/games/show.ts @@ -1,8 +1,9 @@ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import ReversiGame, { pack } from '../../../../../models/reversi-game'; import Reversi from '../../../../../reversi/core'; +import { ILocalUser } from '../../../../../models/user'; -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'gameId' parameter const [gameId, gameIdErr] = $.type(ID).get(params.gameId); if (gameIdErr) return rej('invalid gameId param'); diff --git a/src/server/api/endpoints/reversi/invitations.ts b/src/server/api/endpoints/reversi/invitations.ts index fc487205a9..d7727071ae 100644 --- a/src/server/api/endpoints/reversi/invitations.ts +++ b/src/server/api/endpoints/reversi/invitations.ts @@ -1,6 +1,7 @@ import Matching, { pack as packMatching } from '../../../../models/reversi-matching'; +import { ILocalUser } from '../../../../models/user'; -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Find session const invitations = await Matching.find({ childId: user._id diff --git a/src/server/api/endpoints/reversi/match.ts b/src/server/api/endpoints/reversi/match.ts index 5a699ddbae..907df7cf43 100644 --- a/src/server/api/endpoints/reversi/match.ts +++ b/src/server/api/endpoints/reversi/match.ts @@ -1,11 +1,11 @@ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Matching, { pack as packMatching } from '../../../../models/reversi-matching'; import ReversiGame, { pack as packGame } from '../../../../models/reversi-game'; -import User from '../../../../models/user'; +import User, { ILocalUser } from '../../../../models/user'; import publishUserStream, { publishReversiStream } from '../../../../publishers/stream'; import { eighteight } from '../../../../reversi/maps'; -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'userId' parameter const [childId, childIdErr] = $.type(ID).get(params.userId); if (childIdErr) return rej('invalid userId param'); diff --git a/src/server/api/endpoints/reversi/match/cancel.ts b/src/server/api/endpoints/reversi/match/cancel.ts index bc8a4cd640..1c9c799dbe 100644 --- a/src/server/api/endpoints/reversi/match/cancel.ts +++ b/src/server/api/endpoints/reversi/match/cancel.ts @@ -1,6 +1,7 @@ import Matching from '../../../../../models/reversi-matching'; +import { ILocalUser } from '../../../../../models/user'; -module.exports = (params, user) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { await Matching.remove({ parentId: user._id }); diff --git a/src/server/api/endpoints/sw/register.ts b/src/server/api/endpoints/sw/register.ts index b22a8b08ef..f04a77fa4d 100644 --- a/src/server/api/endpoints/sw/register.ts +++ b/src/server/api/endpoints/sw/register.ts @@ -1,13 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import Subscription from '../../../../models/sw-subscription'; +import { ILocalUser } from '../../../../models/user'; /** * subscribe service worker */ -module.exports = async (params, user, app) => new Promise(async (res, rej) => { +module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'endpoint' parameter const [endpoint, endpointErr] = $.str.get(params.endpoint); if (endpointErr) return rej('invalid endpoint param'); diff --git a/src/server/api/endpoints/username/available.ts b/src/server/api/endpoints/username/available.ts index b11bec4e58..aad3adc514 100644 --- a/src/server/api/endpoints/username/available.ts +++ b/src/server/api/endpoints/username/available.ts @@ -1,17 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import User from '../../../../models/user'; import { validateUsername } from '../../../../models/user'; /** * Check available username - * - * @param {any} params - * @return {Promise<any>} */ -module.exports = async (params) => new Promise(async (res, rej) => { +module.exports = async (params: any) => new Promise(async (res, rej) => { // Get 'username' parameter const [username, usernameError] = $.str.pipe(validateUsername).get(params.username); if (usernameError) return rej('invalid username param'); diff --git a/src/server/api/endpoints/users.ts b/src/server/api/endpoints/users.ts index eb581cb7e6..b8df6f3ecf 100644 --- a/src/server/api/endpoints/users.ts +++ b/src/server/api/endpoints/users.ts @@ -1,13 +1,10 @@ -/** - * Module dependencies - */ import $ from 'cafy'; -import User, { pack } from '../../../models/user'; +import User, { pack, ILocalUser } from '../../../models/user'; /** * Lists all users */ -module.exports = (params, me) => new Promise(async (res, rej) => { +module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) return rej('invalid limit param'); diff --git a/src/server/api/endpoints/users/followers.ts b/src/server/api/endpoints/users/followers.ts index 810cd7341b..53133ee969 100644 --- a/src/server/api/endpoints/users/followers.ts +++ b/src/server/api/endpoints/users/followers.ts @@ -1,8 +1,5 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; -import User from '../../../../models/user'; +import User, { ILocalUser } from '../../../../models/user'; import Following from '../../../../models/following'; import { pack } from '../../../../models/user'; import { getFriendIds } from '../../common/get-friends'; @@ -10,7 +7,7 @@ import { getFriendIds } from '../../common/get-friends'; /** * Get followers of a user */ -module.exports = (params, me) => new Promise(async (res, rej) => { +module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => { // Get 'userId' parameter const [userId, userIdErr] = $.type(ID).get(params.userId); if (userIdErr) return rej('invalid userId param'); diff --git a/src/server/api/endpoints/users/following.ts b/src/server/api/endpoints/users/following.ts index 3373b9d632..2061200198 100644 --- a/src/server/api/endpoints/users/following.ts +++ b/src/server/api/endpoints/users/following.ts @@ -1,20 +1,13 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; -import User from '../../../../models/user'; +import User, { ILocalUser } from '../../../../models/user'; import Following from '../../../../models/following'; import { pack } from '../../../../models/user'; import { getFriendIds } from '../../common/get-friends'; /** * Get following users of a user - * - * @param {any} params - * @param {any} me - * @return {Promise<any>} */ -module.exports = (params, me) => new Promise(async (res, rej) => { +module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => { // Get 'userId' parameter const [userId, userIdErr] = $.type(ID).get(params.userId); if (userIdErr) return rej('invalid userId param'); diff --git a/src/server/api/endpoints/users/get_frequently_replied_users.ts b/src/server/api/endpoints/users/get_frequently_replied_users.ts index 64d737a06b..ba8779d334 100644 --- a/src/server/api/endpoints/users/get_frequently_replied_users.ts +++ b/src/server/api/endpoints/users/get_frequently_replied_users.ts @@ -1,11 +1,8 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import Note from '../../../../models/note'; -import User, { pack } from '../../../../models/user'; +import User, { pack, ILocalUser } from '../../../../models/user'; -module.exports = (params, me) => new Promise(async (res, rej) => { +module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => { // Get 'userId' parameter const [userId, userIdErr] = $.type(ID).get(params.userId); if (userIdErr) return rej('invalid userId param'); @@ -64,7 +61,7 @@ module.exports = (params, me) => new Promise(async (res, rej) => { } }); - const repliedUsers = {}; + const repliedUsers: any = {}; // Extract replies from recent notes replyTargetNotes.forEach(note => { diff --git a/src/server/api/endpoints/users/lists/create.ts b/src/server/api/endpoints/users/lists/create.ts index 100a78b872..cdd1a0d813 100644 --- a/src/server/api/endpoints/users/lists/create.ts +++ b/src/server/api/endpoints/users/lists/create.ts @@ -1,13 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import UserList, { pack } from '../../../../../models/user-list'; +import { ILocalUser } from '../../../../../models/user'; /** * Create a user list */ -module.exports = async (params, user) => new Promise(async (res, rej) => { +module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'title' parameter const [title, titleErr] = $.str.range(1, 100).get(params.title); if (titleErr) return rej('invalid title param'); diff --git a/src/server/api/endpoints/users/lists/list.ts b/src/server/api/endpoints/users/lists/list.ts index d19339a1f5..bf8391d863 100644 --- a/src/server/api/endpoints/users/lists/list.ts +++ b/src/server/api/endpoints/users/lists/list.ts @@ -1,9 +1,10 @@ import UserList, { pack } from '../../../../../models/user-list'; +import { ILocalUser } from '../../../../../models/user'; /** * Add a user to a user list */ -module.exports = async (params, me) => new Promise(async (res, rej) => { +module.exports = async (params: any, me: ILocalUser) => new Promise(async (res, rej) => { // Fetch lists const userLists = await UserList.find({ userId: me._id, diff --git a/src/server/api/endpoints/users/lists/push.ts b/src/server/api/endpoints/users/lists/push.ts index da5a9a134c..d8a3b3c9aa 100644 --- a/src/server/api/endpoints/users/lists/push.ts +++ b/src/server/api/endpoints/users/lists/push.ts @@ -1,6 +1,6 @@ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import UserList from '../../../../../models/user-list'; -import User, { pack as packUser, isRemoteUser, getGhost } from '../../../../../models/user'; +import User, { pack as packUser, isRemoteUser, getGhost, ILocalUser } from '../../../../../models/user'; import { publishUserListStream } from '../../../../../publishers/stream'; import ap from '../../../../../remote/activitypub/renderer'; import renderFollow from '../../../../../remote/activitypub/renderer/follow'; @@ -9,7 +9,7 @@ import { deliver } from '../../../../../queue'; /** * Add a user to a user list */ -module.exports = async (params, me) => new Promise(async (res, rej) => { +module.exports = async (params: any, me: ILocalUser) => new Promise(async (res, rej) => { // Get 'listId' parameter const [listId, listIdErr] = $.type(ID).get(params.listId); if (listIdErr) return rej('invalid listId param'); diff --git a/src/server/api/endpoints/users/lists/show.ts b/src/server/api/endpoints/users/lists/show.ts index 16cb3382fd..e4ae239613 100644 --- a/src/server/api/endpoints/users/lists/show.ts +++ b/src/server/api/endpoints/users/lists/show.ts @@ -1,10 +1,11 @@ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import UserList, { pack } from '../../../../../models/user-list'; +import { ILocalUser } from '../../../../../models/user'; /** * Show a user list */ -module.exports = async (params, me) => new Promise(async (res, rej) => { +module.exports = async (params: any, me: ILocalUser) => new Promise(async (res, rej) => { // Get 'listId' parameter const [listId, listIdErr] = $.type(ID).get(params.listId); if (listIdErr) return rej('invalid listId param'); diff --git a/src/server/api/endpoints/users/notes.ts b/src/server/api/endpoints/users/notes.ts index 061c363d0f..222a8d950a 100644 --- a/src/server/api/endpoints/users/notes.ts +++ b/src/server/api/endpoints/users/notes.ts @@ -1,15 +1,12 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import getHostLower from '../../common/get-host-lower'; import Note, { pack } from '../../../../models/note'; -import User from '../../../../models/user'; +import User, { ILocalUser } from '../../../../models/user'; /** * Get notes of a user */ -module.exports = (params, me) => new Promise(async (res, rej) => { +module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => { // Get 'userId' parameter const [userId, userIdErr] = $.type(ID).optional().get(params.userId); if (userIdErr) return rej('invalid userId param'); diff --git a/src/server/api/endpoints/users/recommendation.ts b/src/server/api/endpoints/users/recommendation.ts index 23821a552f..1d0d889f11 100644 --- a/src/server/api/endpoints/users/recommendation.ts +++ b/src/server/api/endpoints/users/recommendation.ts @@ -1,20 +1,13 @@ -/** - * Module dependencies - */ const ms = require('ms'); import $ from 'cafy'; -import User, { pack } from '../../../../models/user'; +import User, { pack, ILocalUser } from '../../../../models/user'; import { getFriendIds } from '../../common/get-friends'; import Mute from '../../../../models/mute'; /** * Get recommended users - * - * @param {any} params - * @param {any} me - * @return {Promise<any>} */ -module.exports = (params, me) => new Promise(async (res, rej) => { +module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) return rej('invalid limit param'); diff --git a/src/server/api/endpoints/users/search.ts b/src/server/api/endpoints/users/search.ts index 95b9e4f4bb..e29c8d32f1 100644 --- a/src/server/api/endpoints/users/search.ts +++ b/src/server/api/endpoints/users/search.ts @@ -1,40 +1,19 @@ -/** - * Module dependencies - */ -import * as mongo from 'mongodb'; import $ from 'cafy'; -import User, { pack } from '../../../../models/user'; -import config from '../../../../config'; +import User, { pack, ILocalUser } from '../../../../models/user'; const escapeRegexp = require('escape-regexp'); /** * Search a user - * - * @param {any} params - * @param {any} me - * @return {Promise<any>} */ -module.exports = (params, me) => new Promise(async (res, rej) => { +module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => { // Get 'query' parameter const [query, queryError] = $.str.pipe(x => x != '').get(params.query); if (queryError) return rej('invalid query param'); - // Get 'offset' parameter - const [offset = 0, offsetErr] = $.num.optional().min(0).get(params.offset); - if (offsetErr) return rej('invalid offset param'); - // Get 'max' parameter const [max = 10, maxErr] = $.num.optional().range(1, 30).get(params.max); if (maxErr) return rej('invalid max param'); - // If Elasticsearch is available, search by $ - // If not, search by MongoDB - (config.elasticsearch.enable ? byElasticsearch : byNative) - (res, rej, me, query, offset, max); -}); - -// Search by MongoDB -async function byNative(res, rej, me, query, offset, max) { const escapedQuery = escapeRegexp(query); // Search users @@ -51,49 +30,5 @@ async function byNative(res, rej, me, query, offset, max) { }); // Serialize - res(await Promise.all(users.map(async user => - await pack(user, me, { detail: true })))); -} - -// Search by Elasticsearch -async function byElasticsearch(res, rej, me, query, offset, max) { - const es = require('../../db/elasticsearch'); - - es.search({ - index: 'misskey', - type: 'user', - body: { - size: max, - from: offset, - query: { - simple_query_string: { - fields: ['username', 'name', 'bio'], - query: query, - default_operator: 'and' - } - } - } - }, async (error, response) => { - if (error) { - console.error(error); - return res(500); - } - - if (response.hits.total === 0) { - return res([]); - } - - const hits = response.hits.hits.map(hit => new mongo.ObjectID(hit._id)); - - const users = await User - .find({ - _id: { - $in: hits - } - }); - - // Serialize - res(await Promise.all(users.map(async user => - await pack(user, me, { detail: true })))); - }); -} + res(await Promise.all(users.map(user => pack(user, me, { detail: true })))); +}); diff --git a/src/server/api/endpoints/users/search_by_username.ts b/src/server/api/endpoints/users/search_by_username.ts index 7c9fbba0fa..937f9af589 100644 --- a/src/server/api/endpoints/users/search_by_username.ts +++ b/src/server/api/endpoints/users/search_by_username.ts @@ -1,13 +1,10 @@ -/** - * Module dependencies - */ import $ from 'cafy'; -import User, { pack } from '../../../../models/user'; +import User, { pack, ILocalUser } from '../../../../models/user'; /** * Search a user by username */ -module.exports = (params, me) => new Promise(async (res, rej) => { +module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => { // Get 'query' parameter const [query, queryError] = $.str.get(params.query); if (queryError) return rej('invalid query param'); diff --git a/src/server/api/endpoints/users/show.ts b/src/server/api/endpoints/users/show.ts index b8c6ff25c4..bf7e2a2312 100644 --- a/src/server/api/endpoints/users/show.ts +++ b/src/server/api/endpoints/users/show.ts @@ -1,8 +1,5 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; -import User, { pack } from '../../../../models/user'; +import User, { pack, ILocalUser } from '../../../../models/user'; import resolveRemoteUser from '../../../../remote/resolve-user'; const cursorOption = { fields: { data: false } }; @@ -10,7 +7,7 @@ const cursorOption = { fields: { data: false } }; /** * Show user(s) */ -module.exports = (params, me) => new Promise(async (res, rej) => { +module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => { let user; // Get 'userId' parameter @@ -49,7 +46,7 @@ module.exports = (params, me) => new Promise(async (res, rej) => { return rej('failed to resolve remote user'); } } else { - const q = userId !== undefined + const q: any = userId !== undefined ? { _id: userId } : { usernameLower: username.toLowerCase(), host: null }; diff --git a/src/server/api/private/signup.ts b/src/server/api/private/signup.ts index fee899b374..cb47d400b0 100644 --- a/src/server/api/private/signup.ts +++ b/src/server/api/private/signup.ts @@ -1,7 +1,7 @@ import * as Koa from 'koa'; import * as bcrypt from 'bcryptjs'; import { generate as generateKeypair } from '../../../crypto_key'; -import recaptcha = require('recaptcha-promise'); +const recaptcha = require('recaptcha-promise'); import User, { IUser, validateUsername, validatePassword, pack } from '../../../models/user'; import generateUserToken from '../common/generate-native-user-token'; import config from '../../../config'; diff --git a/src/server/api/service/github.ts b/src/server/api/service/github.ts index da33648a16..9024740a96 100644 --- a/src/server/api/service/github.ts +++ b/src/server/api/service/github.ts @@ -11,7 +11,7 @@ const handler = new EventEmitter(); let bot: IUser; -const post = async text => { +const post = async (text: string) => { if (bot == null) { const account = await User.findOne({ usernameLower: config.github_bot.username.toLowerCase() @@ -90,7 +90,7 @@ handler.on('push', event => { case 'refs/heads/master': const pusher = event.pusher; const compare = event.compare; - const commits = event.commits; + const commits: any[] = event.commits; post([ `Pushed by **${pusher.name}** with ?[${commits.length} commit${commits.length > 1 ? 's' : ''}](${compare}):`, commits.reverse().map(commit => `・[?[${commit.id.substr(0, 7)}](${commit.url})] ${commit.message.split('\n')[0]}`).join('\n'), diff --git a/src/server/api/stream/notes-stats.ts b/src/server/api/stream/notes-stats.ts index 739b325848..ab00620018 100644 --- a/src/server/api/stream/notes-stats.ts +++ b/src/server/api/stream/notes-stats.ts @@ -4,7 +4,7 @@ import Xev from 'xev'; const ev = new Xev(); export default function(request: websocket.request, connection: websocket.connection): void { - const onStats = stats => { + const onStats = (stats: any) => { connection.send(JSON.stringify({ type: 'stats', body: stats diff --git a/src/server/api/stream/requests.ts b/src/server/api/stream/requests.ts deleted file mode 100644 index d7bb5e6c5c..0000000000 --- a/src/server/api/stream/requests.ts +++ /dev/null @@ -1,19 +0,0 @@ -import * as websocket from 'websocket'; -import Xev from 'xev'; - -const ev = new Xev(); - -export default function(request: websocket.request, connection: websocket.connection): void { - const onRequest = request => { - connection.send(JSON.stringify({ - type: 'request', - body: request - })); - }; - - ev.addListener('request', onRequest); - - connection.on('close', () => { - ev.removeListener('request', onRequest); - }); -} diff --git a/src/server/api/stream/reversi-game.ts b/src/server/api/stream/reversi-game.ts index 63d9b220b0..ea8a9741d2 100644 --- a/src/server/api/stream/reversi-game.ts +++ b/src/server/api/stream/reversi-game.ts @@ -61,7 +61,7 @@ export default function(request: websocket.request, connection: websocket.connec } }); - async function updateSettings(settings) { + async function updateSettings(settings: any) { const game = await ReversiGame.findOne({ _id: gameId }); if (game.isStarted) return; @@ -78,7 +78,7 @@ export default function(request: websocket.request, connection: websocket.connec publishReversiGameStream(gameId, 'update-settings', settings); } - async function initForm(form) { + async function initForm(form: any) { const game = await ReversiGame.findOne({ _id: gameId }); if (game.isStarted) return; @@ -100,7 +100,7 @@ export default function(request: websocket.request, connection: websocket.connec }); } - async function updateForm(id, value) { + async function updateForm(id: string, value: any) { const game = await ReversiGame.findOne({ _id: gameId }); if (game.isStarted) return; @@ -108,7 +108,7 @@ export default function(request: websocket.request, connection: websocket.connec const form = game.user1Id.equals(user._id) ? game.form2 : game.form1; - const item = form.find(i => i.id == id); + const item = form.find((i: any) => i.id == id); if (item == null) return; @@ -131,7 +131,7 @@ export default function(request: websocket.request, connection: websocket.connec }); } - async function message(message) { + async function message(message: any) { message.id = Math.random(); publishReversiGameStream(gameId, 'message', { userId: user._id, @@ -246,7 +246,7 @@ export default function(request: websocket.request, connection: websocket.connec } // 石を打つ - async function set(pos) { + async function set(pos: number) { const game = await ReversiGame.findOne({ _id: gameId }); if (!game.isStarted) return; @@ -315,7 +315,7 @@ export default function(request: websocket.request, connection: websocket.connec } } - async function check(crc32) { + async function check(crc32: string) { const game = await ReversiGame.findOne({ _id: gameId }); if (!game.isStarted) return; diff --git a/src/server/api/stream/server-stats.ts b/src/server/api/stream/server-stats.ts index 342170a21e..2a058de6c3 100644 --- a/src/server/api/stream/server-stats.ts +++ b/src/server/api/stream/server-stats.ts @@ -4,7 +4,7 @@ import Xev from 'xev'; const ev = new Xev(); export default function(request: websocket.request, connection: websocket.connection): void { - const onStats = stats => { + const onStats = (stats: any) => { connection.send(JSON.stringify({ type: 'stats', body: stats diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts index a3e4ed6f85..81adff0b58 100644 --- a/src/server/api/streaming.ts +++ b/src/server/api/streaming.ts @@ -14,7 +14,6 @@ import reversiGameStream from './stream/reversi-game'; import reversiStream from './stream/reversi'; import serverStatsStream from './stream/server-stats'; import notesStatsStream from './stream/notes-stats'; -import requestsStream from './stream/requests'; import { ParsedUrlQuery } from 'querystring'; import authenticate from './authenticate'; @@ -39,11 +38,6 @@ module.exports = (server: http.Server) => { return; } - if (request.resourceURL.pathname === '/requests') { - requestsStream(request, connection); - return; - } - // Connect to Redis const subscriber = redis.createClient( config.redis.port, config.redis.host); diff --git a/src/server/index.ts b/src/server/index.ts index fc3d252e10..f1fcf58c8d 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -62,7 +62,7 @@ app.use(mount(require('./web'))); function createServer() { if (config.https) { - const certs = {}; + const certs: any = {}; Object.keys(config.https).forEach(k => { certs[k] = fs.readFileSync(config.https[k]); }); diff --git a/webpack.config.ts b/webpack.config.ts index 480f5d4a7a..3c426ebb49 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -6,7 +6,7 @@ import * as fs from 'fs'; import * as webpack from 'webpack'; import chalk from 'chalk'; const { VueLoaderPlugin } = require('vue-loader'); -import jsonImporter from 'node-sass-json-importer'; +const jsonImporter = require('node-sass-json-importer'); const minifyHtml = require('html-minifier').minify; const WebpackOnBuildPlugin = require('on-build-webpack'); //const HardSourceWebpackPlugin = require('hard-source-webpack-plugin'); @@ -24,10 +24,17 @@ const meta = require('./package.json'); const version = meta.clientVersion; const codename = meta.codename; +declare var global: { + faReplacement: typeof faReplacement; + collapseSpacesReplacement: any; + base64replacement: any; + i18nReplacement: typeof i18nReplacement; +}; + //#region Replacer definitions global['faReplacement'] = faReplacement; -global['collapseSpacesReplacement'] = html => { +global['collapseSpacesReplacement'] = (html: string) => { return minifyHtml(html, { collapseWhitespace: true, collapseInlineTagWhitespace: true, @@ -35,7 +42,7 @@ global['collapseSpacesReplacement'] = html => { }).replace(/\t/g, ''); }; -global['base64replacement'] = (_, key) => { +global['base64replacement'] = (_: any, key: string) => { return fs.readFileSync(__dirname + '/src/client/' + key, 'base64'); }; @@ -89,10 +96,10 @@ const consts = { _WELCOME_BG_URL_: config.welcome_bg_url }; -const _consts = {}; +const _consts: { [ key: string ]: any } = {}; Object.keys(consts).forEach(key => { - _consts[key] = JSON.stringify(consts[key]); + _consts[key] = JSON.stringify((consts as any)[key]); }); //#endregion @@ -106,7 +113,7 @@ const plugins = [ new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify(isProduction ? 'production' : 'development') }), - new WebpackOnBuildPlugin(stats => { + new WebpackOnBuildPlugin((stats: any) => { fs.writeFileSync('./built/client/meta.json', JSON.stringify({ version }), 'utf-8'); diff --git a/webpack/i18n.ts b/webpack/i18n.ts index e2cce060e8..f73af72584 100644 --- a/webpack/i18n.ts +++ b/webpack/i18n.ts @@ -4,7 +4,7 @@ export const pattern = /%i18n:([a-z0-9_\-@\.]+?)%/g; -export const replacement = (ctx, match, key) => { +export const replacement = (ctx: any, _: any, key: string) => { const client = '/src/client/app/'; let name = null; From e66d7babc5ae477d7a60628e5599f9c390426c81 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 18 Jun 2018 14:28:43 +0900 Subject: [PATCH 369/369] yatta --- src/acct/render.ts | 2 +- src/build/i18n.ts | 2 +- src/models/note.ts | 4 ++-- src/models/user.ts | 2 +- src/parse-opt.ts | 2 +- src/publishers/push-sw.ts | 4 ++-- src/queue/index.ts | 4 ++-- src/queue/processors/http/deliver.ts | 2 +- src/queue/processors/http/index.ts | 4 ++-- src/queue/processors/http/process-inbox.ts | 8 +++---- src/remote/activitypub/kernel/accept/index.ts | 4 ++-- .../activitypub/kernel/announce/index.ts | 4 ++-- .../activitypub/kernel/announce/note.ts | 4 ++-- src/remote/activitypub/kernel/create/image.ts | 2 +- src/remote/activitypub/kernel/create/note.ts | 2 +- src/remote/activitypub/kernel/delete/index.ts | 3 ++- src/remote/activitypub/kernel/reject/index.ts | 4 ++-- src/remote/activitypub/kernel/undo/index.ts | 4 ++-- src/remote/activitypub/misc/get-note-html.ts | 2 +- src/remote/activitypub/models/image.ts | 2 +- src/remote/activitypub/models/note.ts | 24 +++++++++---------- src/remote/activitypub/renderer/accept.ts | 2 +- src/remote/activitypub/renderer/announce.ts | 2 +- src/remote/activitypub/renderer/create.ts | 2 +- src/remote/activitypub/renderer/delete.ts | 2 +- src/remote/activitypub/renderer/document.ts | 7 +++--- src/remote/activitypub/renderer/image.ts | 5 ++-- src/remote/activitypub/renderer/like.ts | 3 ++- src/remote/activitypub/renderer/mention.ts | 4 ++-- src/remote/activitypub/renderer/note.ts | 6 ++--- src/remote/activitypub/renderer/person.ts | 4 ++-- src/remote/activitypub/renderer/undo.ts | 2 +- src/remote/activitypub/resolver.ts | 4 ++-- src/remote/resolve-user.ts | 2 +- src/server/api/endpoints/aggregation/posts.ts | 10 ++++---- .../endpoints/drive/files/upload_from_url.ts | 3 ++- src/server/api/endpoints/drive/folders.ts | 6 ++--- src/services/drive/delete-file.ts | 2 +- src/services/drive/upload-from-url.ts | 2 +- src/services/following/requests/accept-all.ts | 4 ++-- src/services/following/requests/accept.ts | 10 ++++---- src/services/following/requests/cancel.ts | 4 ++-- src/services/following/requests/reject.ts | 4 ++-- src/text/html.ts | 2 +- src/text/parse/elements/bold.ts | 2 +- src/text/parse/elements/code.ts | 2 +- src/text/parse/elements/emoji.ts | 2 +- src/text/parse/elements/hashtag.ts | 2 +- src/text/parse/elements/inline-code.ts | 2 +- src/text/parse/elements/link.ts | 2 +- src/text/parse/elements/mention.ts | 2 +- src/text/parse/elements/quote.ts | 2 +- src/text/parse/elements/search.ts | 2 +- src/text/parse/elements/title.ts | 2 +- src/text/parse/elements/url.ts | 2 +- src/text/parse/index.ts | 24 +++++++++---------- 56 files changed, 115 insertions(+), 112 deletions(-) diff --git a/src/acct/render.ts b/src/acct/render.ts index 191034361d..c29bfb4764 100644 --- a/src/acct/render.ts +++ b/src/acct/render.ts @@ -1,4 +1,4 @@ -import { IUser } from "../models/user"; +import { IUser } from '../models/user'; export default (user: IUser) => { return user.host === null ? user.username : `${user.username}@${user.host}`; diff --git a/src/build/i18n.ts b/src/build/i18n.ts index f7602dfd17..dc48251c95 100644 --- a/src/build/i18n.ts +++ b/src/build/i18n.ts @@ -48,7 +48,7 @@ export default class Replacer { if (error) { console.warn(`key '${key}' not found in '${path}' of '${this.lang}'`); return key; // Fallback - } else if (typeof text !== "string") { + } else if (typeof text !== 'string') { console.warn(`key '${key}' is not string in '${path}' of '${this.lang}'`); return key; // Fallback } else { diff --git a/src/models/note.ts b/src/models/note.ts index 83cd93353b..af6f6f7c01 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -220,7 +220,7 @@ export const pack = async ( hide = false; } else { // 指定されているかどうか - const specified = _note.visibleUserIds.some(id => id.equals(meId)); + const specified = _note.visibleUserIds.some((id: mongo.ObjectID) => id.equals(meId)); if (specified) { hide = false; @@ -272,7 +272,7 @@ export const pack = async ( } // Populate media - _note.media = hide ? [] : Promise.all(_note.mediaIds.map(fileId => + _note.media = hide ? [] : Promise.all(_note.mediaIds.map((fileId: mongo.ObjectID) => packFile(fileId) )); diff --git a/src/models/user.ts b/src/models/user.ts index 942faeeff4..0d1be439e9 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -1,6 +1,6 @@ import * as mongo from 'mongodb'; const deepcopy = require('deepcopy'); -import sequential = require('promise-sequential'); +const sequential = require('promise-sequential'); import rap from '@prezzemolo/rap'; import db from '../db/mongodb'; import Note, { pack as packNote, deleteNote } from './note'; diff --git a/src/parse-opt.ts b/src/parse-opt.ts index 031b1a6fe2..29e5959c3e 100644 --- a/src/parse-opt.ts +++ b/src/parse-opt.ts @@ -1,6 +1,6 @@ import * as nopt from 'nopt'; -export default (vector, index) => { +export default (vector: any, index: any) => { const parsed = nopt({ 'only-processor': Boolean, 'only-server': Boolean diff --git a/src/publishers/push-sw.ts b/src/publishers/push-sw.ts index aab91df62f..b0b4701155 100644 --- a/src/publishers/push-sw.ts +++ b/src/publishers/push-sw.ts @@ -11,7 +11,7 @@ if (config.sw) { config.sw.private_key); } -export default async function(userId: mongo.ObjectID | string, type, body?) { +export default async function(userId: mongo.ObjectID | string, type: string, body?: any) { if (!config.sw) return; if (typeof userId === 'string') { @@ -34,7 +34,7 @@ export default async function(userId: mongo.ObjectID | string, type, body?) { push.sendNotification(pushSubscription, JSON.stringify({ type, body - })).catch(err => { + })).catch((err: any) => { //console.log(err.statusCode); //console.log(err.headers); //console.log(err.body); diff --git a/src/queue/index.ts b/src/queue/index.ts index 3f82b30b35..1efd6e54ef 100644 --- a/src/queue/index.ts +++ b/src/queue/index.ts @@ -12,7 +12,7 @@ const queue = createQueue({ } }); -export function createHttp(data) { +export function createHttp(data: any) { return queue .create('http', data) .removeOnComplete(true) @@ -21,7 +21,7 @@ export function createHttp(data) { .backoff({ delay: 16384, type: 'exponential' }); } -export function deliver(user: ILocalUser, content, to) { +export function deliver(user: ILocalUser, content: any, to: any) { createHttp({ title: 'deliver', type: 'deliver', diff --git a/src/queue/processors/http/deliver.ts b/src/queue/processors/http/deliver.ts index 2c4bbe9bf0..946d2f65bd 100644 --- a/src/queue/processors/http/deliver.ts +++ b/src/queue/processors/http/deliver.ts @@ -2,7 +2,7 @@ import * as kue from 'kue'; import request from '../../../remote/activitypub/request'; -export default async (job: kue.Job, done): Promise<void> => { +export default async (job: kue.Job, done: any): Promise<void> => { try { await request(job.data.user, job.data.to, job.data.content); done(); diff --git a/src/queue/processors/http/index.ts b/src/queue/processors/http/index.ts index 6f8d1dbc2b..156be42250 100644 --- a/src/queue/processors/http/index.ts +++ b/src/queue/processors/http/index.ts @@ -1,12 +1,12 @@ import deliver from './deliver'; import processInbox from './process-inbox'; -const handlers = { +const handlers: any = { deliver, processInbox, }; -export default (job, done) => { +export default (job: any, done: any) => { const handler = handlers[job.data.type]; if (handler) { diff --git a/src/queue/processors/http/process-inbox.ts b/src/queue/processors/http/process-inbox.ts index dfafe64a78..0da442aefb 100644 --- a/src/queue/processors/http/process-inbox.ts +++ b/src/queue/processors/http/process-inbox.ts @@ -10,7 +10,7 @@ import { resolvePerson } from '../../../remote/activitypub/models/person'; const log = debug('misskey:queue:inbox'); // ユーザーのinboxにアクティビティが届いた時の処理 -export default async (job: kue.Job, done): Promise<void> => { +export default async (job: kue.Job, done: any): Promise<void> => { const signature = job.data.signature; const activity = job.data.activity; @@ -22,7 +22,7 @@ export default async (job: kue.Job, done): Promise<void> => { //#endregion const keyIdLower = signature.keyId.toLowerCase(); - let user; + let user: IRemoteUser; if (keyIdLower.startsWith('acct:')) { const { username, host } = parseAcct(keyIdLower.slice('acct:'.length)); @@ -36,7 +36,7 @@ export default async (job: kue.Job, done): Promise<void> => { // アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する if (user === null) { - user = await resolvePerson(activity.actor); + user = await resolvePerson(activity.actor) as IRemoteUser; } } else { user = await User.findOne({ @@ -46,7 +46,7 @@ export default async (job: kue.Job, done): Promise<void> => { // アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する if (user === null) { - user = await resolvePerson(signature.keyId); + user = await resolvePerson(signature.keyId) as IRemoteUser; } } diff --git a/src/remote/activitypub/kernel/accept/index.ts b/src/remote/activitypub/kernel/accept/index.ts index 2f9d646d14..572a254d9a 100644 --- a/src/remote/activitypub/kernel/accept/index.ts +++ b/src/remote/activitypub/kernel/accept/index.ts @@ -3,7 +3,7 @@ import * as debug from 'debug'; import Resolver from '../../resolver'; import { IRemoteUser } from '../../../../models/user'; import acceptFollow from './follow'; -import { IAccept } from '../../type'; +import { IAccept, IFollow } from '../../type'; const log = debug('misskey:activitypub'); @@ -25,7 +25,7 @@ export default async (actor: IRemoteUser, activity: IAccept): Promise<void> => { switch (object.type) { case 'Follow': - acceptFollow(actor, object); + acceptFollow(actor, object as IFollow); break; default: diff --git a/src/remote/activitypub/kernel/announce/index.ts b/src/remote/activitypub/kernel/announce/index.ts index a2cf2d5762..612b5dee84 100644 --- a/src/remote/activitypub/kernel/announce/index.ts +++ b/src/remote/activitypub/kernel/announce/index.ts @@ -3,7 +3,7 @@ import * as debug from 'debug'; import Resolver from '../../resolver'; import { IRemoteUser } from '../../../../models/user'; import announceNote from './note'; -import { IAnnounce } from '../../type'; +import { IAnnounce, INote } from '../../type'; const log = debug('misskey:activitypub'); @@ -25,7 +25,7 @@ export default async (actor: IRemoteUser, activity: IAnnounce): Promise<void> => switch (object.type) { case 'Note': - announceNote(resolver, actor, activity, object); + announceNote(resolver, actor, activity, object as INote); break; default: diff --git a/src/remote/activitypub/kernel/announce/note.ts b/src/remote/activitypub/kernel/announce/note.ts index e258567389..7aa6aa5707 100644 --- a/src/remote/activitypub/kernel/announce/note.ts +++ b/src/remote/activitypub/kernel/announce/note.ts @@ -2,7 +2,7 @@ import * as debug from 'debug'; import Resolver from '../../resolver'; import post from '../../../../services/note/create'; -import { IRemoteUser } from '../../../../models/user'; +import { IRemoteUser, IUser } from '../../../../models/user'; import { IAnnounce, INote } from '../../type'; import { fetchNote, resolveNote } from '../../models/note'; import { resolvePerson } from '../../models/person'; @@ -36,7 +36,7 @@ export default async function(resolver: Resolver, actor: IRemoteUser, activity: //#region Visibility let visibility = 'public'; - let visibleUsers = []; + let visibleUsers: IUser[] = []; if (!note.to.includes('https://www.w3.org/ns/activitystreams#Public')) { if (note.cc.includes('https://www.w3.org/ns/activitystreams#Public')) { visibility = 'home'; diff --git a/src/remote/activitypub/kernel/create/image.ts b/src/remote/activitypub/kernel/create/image.ts index 2a55522220..9c19abbcc4 100644 --- a/src/remote/activitypub/kernel/create/image.ts +++ b/src/remote/activitypub/kernel/create/image.ts @@ -1,6 +1,6 @@ import { IRemoteUser } from '../../../../models/user'; import { createImage } from '../../models/image'; -export default async function(actor: IRemoteUser, image): Promise<void> { +export default async function(actor: IRemoteUser, image: any): Promise<void> { await createImage(image.url, actor); } diff --git a/src/remote/activitypub/kernel/create/note.ts b/src/remote/activitypub/kernel/create/note.ts index ed9fb6e54c..0f874b9fbf 100644 --- a/src/remote/activitypub/kernel/create/note.ts +++ b/src/remote/activitypub/kernel/create/note.ts @@ -5,7 +5,7 @@ import { createNote, fetchNote } from '../../models/note'; /** * 投稿作成アクティビティを捌きます */ -export default async function(resolver: Resolver, actor: IRemoteUser, note, silent = false): Promise<void> { +export default async function(resolver: Resolver, actor: IRemoteUser, note: any, silent = false): Promise<void> { const exist = await fetchNote(note); if (exist == null) { await createNote(note); diff --git a/src/remote/activitypub/kernel/delete/index.ts b/src/remote/activitypub/kernel/delete/index.ts index 10b47dc4ca..5d7a23584f 100644 --- a/src/remote/activitypub/kernel/delete/index.ts +++ b/src/remote/activitypub/kernel/delete/index.ts @@ -2,11 +2,12 @@ import Resolver from '../../resolver'; import deleteNote from './note'; import Note from '../../../../models/note'; import { IRemoteUser } from '../../../../models/user'; +import { IDelete } from '../../type'; /** * 削除アクティビティを捌きます */ -export default async (actor: IRemoteUser, activity): Promise<void> => { +export default async (actor: IRemoteUser, activity: IDelete): Promise<void> => { if ('actor' in activity && actor.uri !== activity.actor) { throw new Error('invalid actor'); } diff --git a/src/remote/activitypub/kernel/reject/index.ts b/src/remote/activitypub/kernel/reject/index.ts index a82c3fd61e..d89985c238 100644 --- a/src/remote/activitypub/kernel/reject/index.ts +++ b/src/remote/activitypub/kernel/reject/index.ts @@ -3,7 +3,7 @@ import * as debug from 'debug'; import Resolver from '../../resolver'; import { IRemoteUser } from '../../../../models/user'; import rejectFollow from './follow'; -import { IReject } from '../../type'; +import { IReject, IFollow } from '../../type'; const log = debug('misskey:activitypub'); @@ -25,7 +25,7 @@ export default async (actor: IRemoteUser, activity: IReject): Promise<void> => { switch (object.type) { case 'Follow': - rejectFollow(actor, object); + rejectFollow(actor, object as IFollow); break; default: diff --git a/src/remote/activitypub/kernel/undo/index.ts b/src/remote/activitypub/kernel/undo/index.ts index 71f547aeb9..5d9535403b 100644 --- a/src/remote/activitypub/kernel/undo/index.ts +++ b/src/remote/activitypub/kernel/undo/index.ts @@ -1,7 +1,7 @@ import * as debug from 'debug'; import { IRemoteUser } from '../../../../models/user'; -import { IUndo } from '../../type'; +import { IUndo, IFollow } from '../../type'; import unfollow from './follow'; import Resolver from '../../resolver'; @@ -29,7 +29,7 @@ export default async (actor: IRemoteUser, activity: IUndo): Promise<void> => { switch (object.type) { case 'Follow': - unfollow(actor, object); + unfollow(actor, object as IFollow); break; } diff --git a/src/remote/activitypub/misc/get-note-html.ts b/src/remote/activitypub/misc/get-note-html.ts index 33dd381689..0ceecdd00b 100644 --- a/src/remote/activitypub/misc/get-note-html.ts +++ b/src/remote/activitypub/misc/get-note-html.ts @@ -1,4 +1,4 @@ -import { INote } from "../../../models/note"; +import { INote } from '../../../models/note'; import toHtml from '../../../text/html'; import parse from '../../../text/parse'; import config from '../../../config'; diff --git a/src/remote/activitypub/models/image.ts b/src/remote/activitypub/models/image.ts index 0d5a690c6c..fb17a7c9e5 100644 --- a/src/remote/activitypub/models/image.ts +++ b/src/remote/activitypub/models/image.ts @@ -10,7 +10,7 @@ const log = debug('misskey:activitypub'); /** * Imageを作成します。 */ -export async function createImage(actor: IRemoteUser, value): Promise<IDriveFile> { +export async function createImage(actor: IRemoteUser, value: any): Promise<IDriveFile> { // 投稿者が凍結されていたらスキップ if (actor.isSuspended) { return null; diff --git a/src/remote/activitypub/models/note.ts b/src/remote/activitypub/models/note.ts index 974fce433b..b0fe045e6d 100644 --- a/src/remote/activitypub/models/note.ts +++ b/src/remote/activitypub/models/note.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import * as parse5 from 'parse5'; +const parse5 = require('parse5'); import * as debug from 'debug'; import config from '../../../config'; @@ -9,30 +9,30 @@ import post from '../../../services/note/create'; import { INote as INoteActivityStreamsObject, IObject } from '../type'; import { resolvePerson, updatePerson } from './person'; import { resolveImage } from './image'; -import { IRemoteUser } from '../../../models/user'; +import { IRemoteUser, IUser } from '../../../models/user'; const log = debug('misskey:activitypub'); function parse(html: string): string { - const dom = parse5.parseFragment(html) as parse5.AST.Default.Document; + const dom = parse5.parseFragment(html); let text = ''; - dom.childNodes.forEach(n => analyze(n)); + dom.childNodes.forEach((n: any) => analyze(n)); return text.trim(); - function getText(node) { + function getText(node: any) { if (node.nodeName == '#text') return node.value; if (node.childNodes) { - return node.childNodes.map(n => getText(n)).join(''); + return node.childNodes.map((n: any) => getText(n)).join(''); } return ''; } - function analyze(node) { + function analyze(node: any) { switch (node.nodeName) { case '#text': text += node.value; @@ -51,7 +51,7 @@ function parse(html: string): string { if (part.length == 2) { //#region ホスト名部分が省略されているので復元する - const href = new URL(node.attrs.find(x => x.name == 'href').value); + const href = new URL(node.attrs.find((x: any) => x.name == 'href').value); const acct = txt + '@' + href.hostname; text += acct; break; @@ -63,20 +63,20 @@ function parse(html: string): string { } if (node.childNodes) { - node.childNodes.forEach(n => analyze(n)); + node.childNodes.forEach((n: any) => analyze(n)); } break; case 'p': text += '\n\n'; if (node.childNodes) { - node.childNodes.forEach(n => analyze(n)); + node.childNodes.forEach((n: any) => analyze(n)); } break; default: if (node.childNodes) { - node.childNodes.forEach(n => analyze(n)); + node.childNodes.forEach((n: any) => analyze(n)); } break; } @@ -135,7 +135,7 @@ export async function createNote(value: any, resolver?: Resolver, silent = false //#region Visibility let visibility = 'public'; - let visibleUsers = []; + let visibleUsers: IUser[] = []; if (!note.to.includes('https://www.w3.org/ns/activitystreams#Public')) { if (note.cc.includes('https://www.w3.org/ns/activitystreams#Public')) { visibility = 'home'; diff --git a/src/remote/activitypub/renderer/accept.ts b/src/remote/activitypub/renderer/accept.ts index 00c76883a9..76326285fd 100644 --- a/src/remote/activitypub/renderer/accept.ts +++ b/src/remote/activitypub/renderer/accept.ts @@ -1,4 +1,4 @@ -export default object => ({ +export default (object: any) => ({ type: 'Accept', object }); diff --git a/src/remote/activitypub/renderer/announce.ts b/src/remote/activitypub/renderer/announce.ts index 8e4b3d26a6..8c3ff9f113 100644 --- a/src/remote/activitypub/renderer/announce.ts +++ b/src/remote/activitypub/renderer/announce.ts @@ -1,4 +1,4 @@ -export default object => ({ +export default (object: any) => ({ type: 'Announce', object }); diff --git a/src/remote/activitypub/renderer/create.ts b/src/remote/activitypub/renderer/create.ts index de411e1951..b8bf98a655 100644 --- a/src/remote/activitypub/renderer/create.ts +++ b/src/remote/activitypub/renderer/create.ts @@ -1,4 +1,4 @@ -export default object => ({ +export default (object: any) => ({ type: 'Create', object }); diff --git a/src/remote/activitypub/renderer/delete.ts b/src/remote/activitypub/renderer/delete.ts index d15cb447e6..f468a22e24 100644 --- a/src/remote/activitypub/renderer/delete.ts +++ b/src/remote/activitypub/renderer/delete.ts @@ -1,4 +1,4 @@ -export default object => ({ +export default (object: any) => ({ type: 'Delete', object }); diff --git a/src/remote/activitypub/renderer/document.ts b/src/remote/activitypub/renderer/document.ts index 91a9f7df38..1985c6bc8b 100644 --- a/src/remote/activitypub/renderer/document.ts +++ b/src/remote/activitypub/renderer/document.ts @@ -1,7 +1,8 @@ import config from '../../../config'; +import { IDriveFile } from '../../../models/drive-file'; -export default ({ _id, contentType }) => ({ +export default (file: IDriveFile) => ({ type: 'Document', - mediaType: contentType, - url: `${config.drive_url}/${_id}` + mediaType: file.contentType, + url: `${config.drive_url}/${file._id}` }); diff --git a/src/remote/activitypub/renderer/image.ts b/src/remote/activitypub/renderer/image.ts index d671a57e7c..cf91ce3a0c 100644 --- a/src/remote/activitypub/renderer/image.ts +++ b/src/remote/activitypub/renderer/image.ts @@ -1,6 +1,7 @@ import config from '../../../config'; +import { IDriveFile } from '../../../models/drive-file'; -export default ({ _id }) => ({ +export default (fileId: IDriveFile['_id']) => ({ type: 'Image', - url: `${config.drive_url}/${_id}` + url: `${config.drive_url}/${fileId}` }); diff --git a/src/remote/activitypub/renderer/like.ts b/src/remote/activitypub/renderer/like.ts index 33e1341a20..523cb4f1ad 100644 --- a/src/remote/activitypub/renderer/like.ts +++ b/src/remote/activitypub/renderer/like.ts @@ -1,7 +1,8 @@ import config from '../../../config'; import { ILocalUser } from '../../../models/user'; +import { INote } from '../../../models/note'; -export default (user: ILocalUser, note, reaction: string) => ({ +export default (user: ILocalUser, note: INote, reaction: string) => ({ type: 'Like', actor: `${config.url}/users/${user._id}`, object: note.uri ? note.uri : `${config.url}/notes/${note._id}`, diff --git a/src/remote/activitypub/renderer/mention.ts b/src/remote/activitypub/renderer/mention.ts index 95cae52aa2..8d12e6d8bf 100644 --- a/src/remote/activitypub/renderer/mention.ts +++ b/src/remote/activitypub/renderer/mention.ts @@ -1,5 +1,5 @@ -import { IUser, isRemoteUser } from "../../../models/user"; -import config from "../../../config"; +import { IUser, isRemoteUser } from '../../../models/user'; +import config from '../../../config'; export default (mention: IUser) => ({ type: 'Mention', diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts index 556054fa93..b908f8bb1e 100644 --- a/src/remote/activitypub/renderer/note.ts +++ b/src/remote/activitypub/renderer/note.ts @@ -2,13 +2,13 @@ import renderDocument from './document'; import renderHashtag from './hashtag'; import renderMention from './mention'; import config from '../../../config'; -import DriveFile from '../../../models/drive-file'; +import DriveFile, { IDriveFile } from '../../../models/drive-file'; import Note, { INote } from '../../../models/note'; import User from '../../../models/user'; import toHtml from '../misc/get-note-html'; -export default async function renderNote(note: INote, dive = true) { - const promisedFiles = note.mediaIds +export default async function renderNote(note: INote, dive = true): Promise<any> { + const promisedFiles: Promise<IDriveFile[]> = note.mediaIds ? DriveFile.find({ _id: { $in: note.mediaIds } }) : Promise.resolve([]); diff --git a/src/remote/activitypub/renderer/person.ts b/src/remote/activitypub/renderer/person.ts index b2ac885f46..8825c56c25 100644 --- a/src/remote/activitypub/renderer/person.ts +++ b/src/remote/activitypub/renderer/person.ts @@ -16,8 +16,8 @@ export default (user: ILocalUser) => { preferredUsername: user.username, name: user.name, summary: user.description, - icon: user.avatarId && renderImage({ _id: user.avatarId }), - image: user.bannerId && renderImage({ _id: user.bannerId }), + icon: user.avatarId && renderImage(user.avatarId), + image: user.bannerId && renderImage(user.bannerId), manuallyApprovesFollowers: user.isLocked, publicKey: renderKey(user) }; diff --git a/src/remote/activitypub/renderer/undo.ts b/src/remote/activitypub/renderer/undo.ts index f38e224b60..4498409a57 100644 --- a/src/remote/activitypub/renderer/undo.ts +++ b/src/remote/activitypub/renderer/undo.ts @@ -1,4 +1,4 @@ -export default object => ({ +export default (object: any) => ({ type: 'Undo', object }); diff --git a/src/remote/activitypub/resolver.ts b/src/remote/activitypub/resolver.ts index f405ff10c3..0b053ca774 100644 --- a/src/remote/activitypub/resolver.ts +++ b/src/remote/activitypub/resolver.ts @@ -12,7 +12,7 @@ export default class Resolver { this.history = new Set(); } - public async resolveCollection(value) { + public async resolveCollection(value: any) { const collection = typeof value === 'string' ? await this.resolve(value) : value; @@ -33,7 +33,7 @@ export default class Resolver { return collection; } - public async resolve(value): Promise<IObject> { + public async resolve(value: any): Promise<IObject> { if (value == null) { throw new Error('resolvee is null (or undefined)'); } diff --git a/src/remote/resolve-user.ts b/src/remote/resolve-user.ts index c612a8c949..1e8fc5d750 100644 --- a/src/remote/resolve-user.ts +++ b/src/remote/resolve-user.ts @@ -4,7 +4,7 @@ import webFinger from './webfinger'; import config from '../config'; import { createPerson } from './activitypub/models/person'; -export default async (username, _host, option?): Promise<IUser> => { +export default async (username: string, _host: string, option?: any): Promise<IUser> => { const usernameLower = username.toLowerCase(); if (_host == null) { diff --git a/src/server/api/endpoints/aggregation/posts.ts b/src/server/api/endpoints/aggregation/posts.ts index 9ada9cd3f5..48e344312d 100644 --- a/src/server/api/endpoints/aggregation/posts.ts +++ b/src/server/api/endpoints/aggregation/posts.ts @@ -49,13 +49,13 @@ module.exports = (params: any) => new Promise(async (res, rej) => { } } ]); - datas.forEach(data => { + datas.forEach((data: any) => { data.date = data._id; delete data._id; - data.notes = (data.data.filter(x => x.type == 'note')[0] || { count: 0 }).count; - data.renotes = (data.data.filter(x => x.type == 'renote')[0] || { count: 0 }).count; - data.replies = (data.data.filter(x => x.type == 'reply')[0] || { count: 0 }).count; + data.notes = (data.data.filter((x: any) => x.type == 'note')[0] || { count: 0 }).count; + data.renotes = (data.data.filter((x: any) => x.type == 'renote')[0] || { count: 0 }).count; + data.replies = (data.data.filter((x: any) => x.type == 'reply')[0] || { count: 0 }).count; delete data.data; }); @@ -65,7 +65,7 @@ module.exports = (params: any) => new Promise(async (res, rej) => { for (let i = 0; i < limit; i++) { const day = new Date(new Date().setDate(new Date().getDate() - i)); - const data = datas.filter(d => + const data = datas.filter((d: any) => d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate() )[0]; diff --git a/src/server/api/endpoints/drive/files/upload_from_url.ts b/src/server/api/endpoints/drive/files/upload_from_url.ts index c012f0d3c9..cb617d851f 100644 --- a/src/server/api/endpoints/drive/files/upload_from_url.ts +++ b/src/server/api/endpoints/drive/files/upload_from_url.ts @@ -4,11 +4,12 @@ import $ from 'cafy'; import ID from '../../../../../cafy-id'; import { pack } from '../../../../../models/drive-file'; import uploadFromUrl from '../../../../../services/drive/upload-from-url'; +import { ILocalUser } from '../../../../../models/user'; /** * Create a file from a URL */ -module.exports = async (params, user): Promise<any> => { +module.exports = async (params: any, user: ILocalUser): Promise<any> => { // Get 'url' parameter // TODO: Validate this url const [url, urlErr] = $.str.get(params.url); diff --git a/src/server/api/endpoints/drive/folders.ts b/src/server/api/endpoints/drive/folders.ts index fac9780325..3413778950 100644 --- a/src/server/api/endpoints/drive/folders.ts +++ b/src/server/api/endpoints/drive/folders.ts @@ -1,13 +1,11 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../../cafy-id'; import DriveFolder, { pack } from '../../../../models/drive-folder'; +import { ILocalUser } from '../../../../models/user'; /** * Get drive folders */ -module.exports = (params: any, user: ILocalUser, app: IApp) => new Promise(async (res, rej) => { +module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => { // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); if (limitErr) return rej('invalid limit param'); diff --git a/src/services/drive/delete-file.ts b/src/services/drive/delete-file.ts index a8ed13bd77..4ac60439b7 100644 --- a/src/services/drive/delete-file.ts +++ b/src/services/drive/delete-file.ts @@ -1,4 +1,4 @@ -import DriveFile, { DriveFileChunk, IDriveFile } from "../../models/drive-file"; +import DriveFile, { DriveFileChunk, IDriveFile } from '../../models/drive-file'; import DriveFileThumbnail, { DriveFileThumbnailChunk } from '../../models/drive-file-thumbnail'; export default async function(file: IDriveFile, isExpired = false) { diff --git a/src/services/drive/upload-from-url.ts b/src/services/drive/upload-from-url.ts index f83d57d415..73d9b1123a 100644 --- a/src/services/drive/upload-from-url.ts +++ b/src/services/drive/upload-from-url.ts @@ -9,7 +9,7 @@ import { IDriveFile, validateFileName } from '../../models/drive-file'; import create from './add-file'; import config from '../../config'; import { IUser } from '../../models/user'; -import * as mongodb from "mongodb"; +import * as mongodb from 'mongodb'; const log = debug('misskey:drive:upload-from-url'); diff --git a/src/services/following/requests/accept-all.ts b/src/services/following/requests/accept-all.ts index 9708d9e658..45da004988 100644 --- a/src/services/following/requests/accept-all.ts +++ b/src/services/following/requests/accept-all.ts @@ -1,5 +1,5 @@ -import User, { IUser } from "../../../models/user"; -import FollowRequest from "../../../models/follow-request"; +import User, { IUser } from '../../../models/user'; +import FollowRequest from '../../../models/follow-request'; import accept from './accept'; /** diff --git a/src/services/following/requests/accept.ts b/src/services/following/requests/accept.ts index 1b89cdb981..2eaccbbd36 100644 --- a/src/services/following/requests/accept.ts +++ b/src/services/following/requests/accept.ts @@ -1,12 +1,12 @@ -import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from "../../../models/user"; -import FollowRequest from "../../../models/follow-request"; +import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from '../../../models/user'; +import FollowRequest from '../../../models/follow-request'; import pack from '../../../remote/activitypub/renderer'; import renderFollow from '../../../remote/activitypub/renderer/follow'; import renderAccept from '../../../remote/activitypub/renderer/accept'; import { deliver } from '../../../queue'; -import Following from "../../../models/following"; -import FollowingLog from "../../../models/following-log"; -import FollowedLog from "../../../models/followed-log"; +import Following from '../../../models/following'; +import FollowingLog from '../../../models/following-log'; +import FollowedLog from '../../../models/followed-log'; import event from '../../../publishers/stream'; export default async function(followee: IUser, follower: IUser) { diff --git a/src/services/following/requests/cancel.ts b/src/services/following/requests/cancel.ts index 50c95de0eb..7e9dc5630f 100644 --- a/src/services/following/requests/cancel.ts +++ b/src/services/following/requests/cancel.ts @@ -1,5 +1,5 @@ -import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from "../../../models/user"; -import FollowRequest from "../../../models/follow-request"; +import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from '../../../models/user'; +import FollowRequest from '../../../models/follow-request'; import pack from '../../../remote/activitypub/renderer'; import renderFollow from '../../../remote/activitypub/renderer/follow'; import renderUndo from '../../../remote/activitypub/renderer/undo'; diff --git a/src/services/following/requests/reject.ts b/src/services/following/requests/reject.ts index acd419d0ee..affcd2ef5a 100644 --- a/src/services/following/requests/reject.ts +++ b/src/services/following/requests/reject.ts @@ -1,5 +1,5 @@ -import User, { IUser, isRemoteUser, ILocalUser } from "../../../models/user"; -import FollowRequest from "../../../models/follow-request"; +import User, { IUser, isRemoteUser, ILocalUser } from '../../../models/user'; +import FollowRequest from '../../../models/follow-request'; import pack from '../../../remote/activitypub/renderer'; import renderFollow from '../../../remote/activitypub/renderer/follow'; import renderReject from '../../../remote/activitypub/renderer/reject'; diff --git a/src/text/html.ts b/src/text/html.ts index 41adb2e7f7..64208af88b 100644 --- a/src/text/html.ts +++ b/src/text/html.ts @@ -4,7 +4,7 @@ import config from '../config'; import { INote } from '../models/note'; import { TextElement } from './parse'; -const handlers: {[key: string]: (window: any, token: any, mentionedRemoteUsers: INote["mentionedRemoteUsers"]) => void} = { +const handlers: { [key: string]: (window: any, token: any, mentionedRemoteUsers: INote['mentionedRemoteUsers']) => void } = { bold({ document }, { bold }) { const b = document.createElement('b'); b.textContent = bold; diff --git a/src/text/parse/elements/bold.ts b/src/text/parse/elements/bold.ts index 0566ace8b7..cf615cd3cc 100644 --- a/src/text/parse/elements/bold.ts +++ b/src/text/parse/elements/bold.ts @@ -3,7 +3,7 @@ */ export type TextElementBold = { - type: "bold" + type: 'bold' content: string bold: string }; diff --git a/src/text/parse/elements/code.ts b/src/text/parse/elements/code.ts index de87aa410b..f48e945048 100644 --- a/src/text/parse/elements/code.ts +++ b/src/text/parse/elements/code.ts @@ -5,7 +5,7 @@ import genHtml from '../core/syntax-highlighter'; export type TextElementCode = { - type: "code" + type: 'code' content: string code: string html: string diff --git a/src/text/parse/elements/emoji.ts b/src/text/parse/elements/emoji.ts index d0eed88965..83d3effef5 100644 --- a/src/text/parse/elements/emoji.ts +++ b/src/text/parse/elements/emoji.ts @@ -3,7 +3,7 @@ */ export type TextElementEmoji = { - type: "emoji" + type: 'emoji' content: string emoji: string }; diff --git a/src/text/parse/elements/hashtag.ts b/src/text/parse/elements/hashtag.ts index cde0c2b224..129041774f 100644 --- a/src/text/parse/elements/hashtag.ts +++ b/src/text/parse/elements/hashtag.ts @@ -3,7 +3,7 @@ */ export type TextElementHashtag = { - type: "hashtag" + type: 'hashtag' content: string hashtag: string }; diff --git a/src/text/parse/elements/inline-code.ts b/src/text/parse/elements/inline-code.ts index bcb0bca0ad..1dd5affa51 100644 --- a/src/text/parse/elements/inline-code.ts +++ b/src/text/parse/elements/inline-code.ts @@ -5,7 +5,7 @@ import genHtml from '../core/syntax-highlighter'; export type TextElementInlineCode = { - type: "inline-code" + type: 'inline-code' content: string code: string html: string diff --git a/src/text/parse/elements/link.ts b/src/text/parse/elements/link.ts index 7e0d6f5cf8..b353aebc5c 100644 --- a/src/text/parse/elements/link.ts +++ b/src/text/parse/elements/link.ts @@ -3,7 +3,7 @@ */ export type TextElementLink = { - type: "link" + type: 'link' content: string title: string url: string diff --git a/src/text/parse/elements/mention.ts b/src/text/parse/elements/mention.ts index a4140458d4..eda60b530a 100644 --- a/src/text/parse/elements/mention.ts +++ b/src/text/parse/elements/mention.ts @@ -4,7 +4,7 @@ import parseAcct from '../../../acct/parse'; export type TextElementMention = { - type: "mention" + type: 'mention' content: string username: string host: string diff --git a/src/text/parse/elements/quote.ts b/src/text/parse/elements/quote.ts index 56de561f3f..bef9ad4988 100644 --- a/src/text/parse/elements/quote.ts +++ b/src/text/parse/elements/quote.ts @@ -3,7 +3,7 @@ */ export type TextElementQuote = { - type: "quote" + type: 'quote' content: string quote: string }; diff --git a/src/text/parse/elements/search.ts b/src/text/parse/elements/search.ts index 4bd19ee3fa..e5d9b9f0c2 100644 --- a/src/text/parse/elements/search.ts +++ b/src/text/parse/elements/search.ts @@ -3,7 +3,7 @@ */ export type TextElementSearch = { - type: "search" + type: 'search' content: string query: string }; diff --git a/src/text/parse/elements/title.ts b/src/text/parse/elements/title.ts index 11b3abc61b..b89739a7c5 100644 --- a/src/text/parse/elements/title.ts +++ b/src/text/parse/elements/title.ts @@ -3,7 +3,7 @@ */ export type TextElementTitle = { - type: "title" + type: 'title' content: string title: string }; diff --git a/src/text/parse/elements/url.ts b/src/text/parse/elements/url.ts index bbc27b4fd7..78b9b1f2f1 100644 --- a/src/text/parse/elements/url.ts +++ b/src/text/parse/elements/url.ts @@ -3,7 +3,7 @@ */ export type TextElementUrl = { - type: "url" + type: 'url' content: string url: string }; diff --git a/src/text/parse/index.ts b/src/text/parse/index.ts index ccfef44591..2b6a459b1e 100644 --- a/src/text/parse/index.ts +++ b/src/text/parse/index.ts @@ -2,17 +2,17 @@ * Misskey Text Analyzer */ -import { TextElementBold } from "./elements/bold"; -import { TextElementCode } from "./elements/code"; -import { TextElementEmoji } from "./elements/emoji"; -import { TextElementHashtag } from "./elements/hashtag"; -import { TextElementInlineCode } from "./elements/inline-code"; -import { TextElementLink } from "./elements/link"; -import { TextElementMention } from "./elements/mention"; -import { TextElementQuote } from "./elements/quote"; -import { TextElementSearch } from "./elements/search"; -import { TextElementTitle } from "./elements/title"; -import { TextElementUrl } from "./elements/url"; +import { TextElementBold } from './elements/bold'; +import { TextElementCode } from './elements/code'; +import { TextElementEmoji } from './elements/emoji'; +import { TextElementHashtag } from './elements/hashtag'; +import { TextElementInlineCode } from './elements/inline-code'; +import { TextElementLink } from './elements/link'; +import { TextElementMention } from './elements/mention'; +import { TextElementQuote } from './elements/quote'; +import { TextElementSearch } from './elements/search'; +import { TextElementTitle } from './elements/title'; +import { TextElementUrl } from './elements/url'; const elements = [ require('./elements/bold'), @@ -28,7 +28,7 @@ const elements = [ require('./elements/search') ].map(element => element.default as TextElementProcessor); -export type TextElement = {type: "text", content: string} +export type TextElement = { type: 'text', content: string } | TextElementBold | TextElementCode | TextElementEmoji