├── .npmrc
├── packages
├── server
│ ├── .gitignore
│ ├── src
│ │ ├── declaration.d.ts
│ │ ├── router
│ │ │ ├── metadata.ts
│ │ │ ├── index.ts
│ │ │ └── comment.ts
│ │ ├── db
│ │ │ └── schema.ts
│ │ └── index.ts
│ ├── .npmrc
│ ├── package.json
│ └── tsconfig.json
└── web
│ ├── .npmrc
│ ├── .browserslistrc
│ ├── public
│ ├── favicon.ico
│ └── index.html
│ ├── babel.config.js
│ ├── src
│ ├── shims-vue.d.ts
│ ├── assets
│ │ ├── groceries.png
│ │ ├── README.md
│ │ ├── util.ts
│ │ ├── docs
│ │ │ ├── guide.md
│ │ │ └── installation.md
│ │ ├── shlex.ts
│ │ ├── template.ts
│ │ └── make-html.ts
│ ├── plugins
│ │ └── buefy.ts
│ ├── declaration.d.ts
│ ├── shims-tsx.d.ts
│ ├── App.vue
│ ├── main.ts
│ ├── views
│ │ ├── MarkdownDoc.vue
│ │ ├── NotFound.vue
│ │ └── Comment.vue
│ ├── store
│ │ └── index.ts
│ ├── router
│ │ └── index.ts
│ ├── layouts
│ │ └── web.vue
│ └── components
│ │ ├── MainEditor.vue
│ │ ├── Entry.vue
│ │ └── SimpleMde.vue
│ ├── vue.config.js
│ ├── .gitignore
│ ├── tsconfig.json
│ └── package.json
├── .eslintignore
├── cors.json
├── .dockerignore
├── .eslintrc.js
├── robo.yml
├── Dockerfile
├── package.json
├── README.md
├── LICENSE
├── docs
├── guide.md
└── installation.md
├── .gitignore
├── tsconfig.json
└── yarn.lock
/.npmrc:
--------------------------------------------------------------------------------
1 | engine-strict=true
--------------------------------------------------------------------------------
/packages/server/.gitignore:
--------------------------------------------------------------------------------
1 | /public/
--------------------------------------------------------------------------------
/packages/server/src/declaration.d.ts:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/packages/web/.npmrc:
--------------------------------------------------------------------------------
1 | engine-strict=true
--------------------------------------------------------------------------------
/packages/server/.npmrc:
--------------------------------------------------------------------------------
1 | engine-strict=true
--------------------------------------------------------------------------------
/packages/web/.browserslistrc:
--------------------------------------------------------------------------------
1 | > 1%
2 | last 2 versions
3 | not dead
4 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | *.*
2 | !*.js
3 | !*.ts
4 | !*.vue
5 | node_modules
6 | dist
7 | lib
--------------------------------------------------------------------------------
/cors.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "origin": ["*"],
4 | "method": ["GET"],
5 | "maxAgeSeconds": 3600
6 | }
7 | ]
--------------------------------------------------------------------------------
/packages/web/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/patarapolw/aloud/master/packages/web/public/favicon.ico
--------------------------------------------------------------------------------
/packages/web/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [
3 | '@vue/cli-plugin-babel/preset'
4 | ]
5 | }
6 |
--------------------------------------------------------------------------------
/packages/web/src/shims-vue.d.ts:
--------------------------------------------------------------------------------
1 | declare module '*.vue' {
2 | import Vue from 'vue'
3 | export default Vue
4 | }
5 |
--------------------------------------------------------------------------------
/packages/web/src/assets/groceries.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/patarapolw/aloud/master/packages/web/src/assets/groceries.png
--------------------------------------------------------------------------------
/packages/web/src/plugins/buefy.ts:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import Buefy from 'buefy'
3 | import 'buefy/dist/buefy.css'
4 |
5 | Vue.use(Buefy, {
6 | defaultIconPack: 'fas'
7 | })
8 |
--------------------------------------------------------------------------------
/packages/web/src/declaration.d.ts:
--------------------------------------------------------------------------------
1 | declare module 'markdown-it-emoji'
2 | declare module 'markdown-it-imsize'
3 | declare module 'markdown-it-container'
4 | declare module 'punycode'
5 |
6 | declare module '*.md' {
7 | const s: string
8 | export default s
9 | }
10 |
--------------------------------------------------------------------------------
/packages/web/vue.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | chainWebpack: config => {
3 | config.module
4 | .rule('markdown')
5 | .test(/\.md$/)
6 | .use('raw-loader')
7 | .loader('raw-loader')
8 |
9 | // config.resolve.set('symlinks', process.env.NODE_ENV !== 'development')
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/packages/web/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /dist
4 |
5 | # local env files
6 | .env.local
7 | .env.*.local
8 |
9 | # Log files
10 | npm-debug.log*
11 | yarn-debug.log*
12 | yarn-error.log*
13 |
14 | # Editor directories and files
15 | .idea
16 | .vscode
17 | *.suo
18 | *.ntvs*
19 | *.njsproj
20 | *.sln
21 | *.sw?
22 |
23 | # Markdown
24 | /tmp/
25 |
--------------------------------------------------------------------------------
/packages/web/src/shims-tsx.d.ts:
--------------------------------------------------------------------------------
1 | import Vue, { VNode } from 'vue'
2 |
3 | declare global {
4 | namespace JSX {
5 | // tslint:disable no-empty-interface
6 | interface Element extends VNode {}
7 | // tslint:disable no-empty-interface
8 | interface ElementClass extends Vue {}
9 | interface IntrinsicElements {
10 | [elem: string]: any
11 | }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/.dockerignore:
--------------------------------------------------------------------------------
1 | # Ignore everything
2 | **
3 |
4 | # Allow files and directories
5 | !/packages/server/src
6 | !/packages/server/package.json
7 | !/packages/server/yarn.lock
8 | !/packages/server/tsconfig.json
9 |
10 | !/packages/web/public
11 | !/packages/web/src
12 | !/packages/web/.browserslistrc
13 | !/packages/web/babel.config.js
14 | !/packages/web/package.json
15 | !/packages/web/yarn.lock
16 | !/packages/web/tsconfig.json
17 | !/packages/web/vue.config.js
18 |
--------------------------------------------------------------------------------
/packages/web/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 | #App
3 | component(v-if="layout" :is="layout")
4 | router-view
5 | router-view(v-else)
6 |
7 |
8 |
19 |
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | env: {
3 | browser: true,
4 | es6: true,
5 | node: true
6 | },
7 | extends: [
8 | 'plugin:vue/essential',
9 | 'standard'
10 | ],
11 | globals: {
12 | Atomics: 'readonly',
13 | SharedArrayBuffer: 'readonly'
14 | },
15 | parserOptions: {
16 | ecmaVersion: 11,
17 | parser: '@typescript-eslint/parser',
18 | sourceType: 'module'
19 | },
20 | plugins: [
21 | 'vue',
22 | '@typescript-eslint'
23 | ],
24 | rules: {
25 | 'no-unused-vars': 0
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/robo.yml:
--------------------------------------------------------------------------------
1 | # Commands
2 |
3 | docker-build:
4 | command: |
5 | docker build -t {{.docker.tag}} .
6 | docker-start:
7 | command: |
8 | docker run \
9 | -p 8080:8080 \
10 | -e SECRET -e FIREBASE_SDK -e FIREBASE_CONFIG -e MONGO_URI -e ALOUD_SITE \
11 | {{.docker.tag}}
12 | docker-deploy:
13 | command: |
14 | docker push {{.docker.tag}}
15 | dev:
16 | command: |
17 | npx concurrently \
18 | 'cd packages/server && npm run dev' \
19 | 'cd packages/web && npm run dev'
20 |
21 | ##########
22 | # Settings
23 |
24 | variables:
25 | docker:
26 | tag: gcr.io/$PROJECT_ID/aloud
27 |
--------------------------------------------------------------------------------
/packages/web/src/main.ts:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import App from './App.vue'
3 | import router from './router'
4 | import store from './store'
5 | import firebase from 'firebase/app'
6 |
7 | import 'firebase/analytics'
8 | import 'firebase/auth'
9 | import 'simplemde/dist/simplemde.min.css'
10 | import './plugins/buefy'
11 |
12 | Vue.config.productionTip = false
13 |
14 | // @ts-ignore
15 | firebase.initializeApp(window.FIREBASE_CONFIG)
16 | firebase.auth().onAuthStateChanged((user) => {
17 | store.commit('setUser', user)
18 | })
19 |
20 | new Vue({
21 | router,
22 | store,
23 | render: h => h(App)
24 | }).$mount('#app')
25 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:12-alpine AS web
2 | RUN apk add yarn
3 | RUN apk add git
4 | RUN mkdir -p /app
5 | WORKDIR /app
6 | COPY packages/web/package.json packages/web/yarn.lock /app/
7 | RUN yarn
8 | COPY packages/web /app
9 | RUN yarn build
10 |
11 | FROM node:12-alpine
12 | RUN apk add yarn
13 | RUN apk add jq
14 | RUN mkdir -p /app
15 | WORKDIR /app
16 | COPY packages/server/package.json packages/server/yarn.lock /app/
17 | RUN yarn
18 | COPY packages/server /app
19 | RUN yarn build
20 | RUN yarn remove $(cat package.json | jq -r '.devDependencies | keys | join(" ")')
21 | COPY --from=web /app/dist /app/public
22 | EXPOSE 8080
23 | CMD [ "yarn", "start" ]
24 |
--------------------------------------------------------------------------------
/packages/web/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "esnext",
4 | "module": "esnext",
5 | "strict": true,
6 | "jsx": "preserve",
7 | "importHelpers": true,
8 | "moduleResolution": "node",
9 | "experimentalDecorators": true,
10 | "esModuleInterop": true,
11 | "allowSyntheticDefaultImports": true,
12 | "sourceMap": true,
13 | "baseUrl": ".",
14 | "types": [
15 | "webpack-env"
16 | ],
17 | "paths": {
18 | "@/*": [
19 | "src/*"
20 | ]
21 | },
22 | "lib": [
23 | "esnext",
24 | "dom",
25 | "dom.iterable",
26 | "scripthost"
27 | ]
28 | },
29 | "include": [
30 | "src/**/*.ts",
31 | "src/**/*.tsx",
32 | "src/**/*.vue",
33 | "tests/**/*.ts",
34 | "tests/**/*.tsx"
35 | ],
36 | "exclude": [
37 | "node_modules"
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/packages/web/src/views/MarkdownDoc.vue:
--------------------------------------------------------------------------------
1 |
2 | .card(style="margin: 1rem")
3 | .card-content.content(v-html="html")
4 |
5 |
6 |
32 |
--------------------------------------------------------------------------------
/packages/server/src/router/metadata.ts:
--------------------------------------------------------------------------------
1 | import axios from 'axios'
2 | import domino from 'domino'
3 | // @ts-ignore
4 | import { getMetadata } from 'page-metadata-parser'
5 | import { FastifyInstance } from 'fastify'
6 |
7 | export default (f: FastifyInstance, _: any, next: () => void) => {
8 | f.get('/', {
9 | schema: {
10 | tags: ['metadata'],
11 | summary: 'Get page metadata for SEO and link building purpose',
12 | querystring: {
13 | type: 'object',
14 | required: ['url'],
15 | properties: {
16 | url: { type: 'string' }
17 | }
18 | }
19 | }
20 | }, async (req) => {
21 | const { url } = req.query
22 |
23 | if (!url) {
24 | throw new Error('No URL is found')
25 | }
26 |
27 | const r = await axios.get(url, {
28 | transformResponse: (d) => d
29 | })
30 |
31 | const doc = domino.createWindow(r.data).document
32 | return getMetadata(doc, url)
33 | })
34 |
35 | next()
36 | }
37 |
--------------------------------------------------------------------------------
/packages/web/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Aloud - Let your voice be heard.
9 |
10 |
11 |
12 |
13 |
14 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "aloud",
3 | "description": "A self-hosted commenting engine",
4 | "private": true,
5 | "devDependencies": {
6 | "@typescript-eslint/eslint-plugin": "^3.0.0",
7 | "@typescript-eslint/parser": "^3.0.0",
8 | "eslint": "^7.1.0",
9 | "eslint-config-standard": "^14.1.1",
10 | "eslint-plugin-import": "^2.20.2",
11 | "eslint-plugin-node": "^11.1.0",
12 | "eslint-plugin-promise": "^4.2.1",
13 | "eslint-plugin-standard": "^4.0.1",
14 | "eslint-plugin-vue": "^6.2.2",
15 | "typescript": "^3.9.3"
16 | },
17 | "repository": {
18 | "type": "git",
19 | "url": "git+https://github.com/patarapolw/aloud.git"
20 | },
21 | "keywords": [],
22 | "author": "",
23 | "license": "ISC",
24 | "bugs": {
25 | "url": "https://github.com/patarapolw/aloud/issues"
26 | },
27 | "homepage": "https://github.com/patarapolw/aloud#readme",
28 | "engines": {
29 | "yarn": "1.x",
30 | "npm": "please-use-yarn",
31 | "node": "12.x"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Aloud
2 |
3 | > Aloud your commenting system on your personal web server.
4 |
5 | This project is powered by [MongoDB](https://www.mongodb.com) and [Firebase](https://firebase.google.com).
6 |
7 | ## Features
8 |
9 | This project uses [Markdown-it](https://markdown-it.github.io/) to parse Markdown for additional security.
10 |
11 | Other than standard features, some of the features (from plugins) are
12 |
13 | - parseImgDimensions ``
14 | - emoji :smile: :100:
15 | - simpleLineBreaks
16 |
17 | For more, see [Markdown Guide](/docs/guide.md).
18 |
19 | I also extended with LiquidJS, see [github:patarapolw/aloud:packages/web/src/assets/template.ts](https://github.com/patarapolw/aloud/blob/master/packages/web/src/assets/template.ts).
20 |
21 | ## Troubleshooting
22 |
23 | Profile images are powered by [Gravatar](https://gravatar.com/). Try upload an avatar there, if your image isn't shown.
24 |
25 | ## Installation
26 |
27 | See [Installation Guide](/docs/installation.md).
28 |
29 | ## Demo
30 |
31 | See
32 |
--------------------------------------------------------------------------------
/packages/web/src/assets/README.md:
--------------------------------------------------------------------------------
1 | # Aloud
2 |
3 | > Aloud your commenting system on your personal web server.
4 |
5 | This project is powered by [MongoDB](https://www.mongodb.com) and [Firebase](https://firebase.google.com).
6 |
7 | ## Features
8 |
9 | This project uses [Markdown-it](https://markdown-it.github.io/) to parse Markdown for additional security.
10 |
11 | Other than standard features, some of the features (from plugins) are
12 |
13 | - parseImgDimensions ``
14 | - emoji :smile: :100:
15 | - simpleLineBreaks
16 |
17 | For more, see [Markdown Guide](/guide).
18 |
19 | I also extended with LiquidJS, see [github:patarapolw/aloud:packages/web/src/assets/template.ts](https://github.com/patarapolw/aloud/blob/master/packages/web/src/assets/template.ts).
20 |
21 | ## Troubleshooting
22 |
23 | Profile images are powered by [Gravatar](https://gravatar.com/). Try upload an avatar there, if your image isn't shown.
24 |
25 | ## Installation
26 |
27 | See [Installation Guide](/installation).
28 |
29 | ## Demo
30 |
31 | See
32 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Pacharapol Withayasakpunt
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/packages/server/src/db/schema.ts:
--------------------------------------------------------------------------------
1 | import { prop, getModelForClass, setGlobalOptions, Severity } from '@typegoose/typegoose'
2 | import { nanoid } from 'nanoid'
3 | import mongoose from 'mongoose'
4 |
5 | setGlobalOptions({ options: { allowMixed: Severity.ALLOW } })
6 |
7 | class Entry {
8 | @prop({ default: () => nanoid() }) _id!: string
9 | @prop({ index: true, required: true }) url!: string
10 | @prop({ default: '' }) content!: string
11 | @prop({ index: true, default: () => new Date() }) createdAt!: Date
12 | @prop({ default: () => ({}) }) createdBy!: {
13 | displayName?: string
14 | email?: string
15 | }
16 |
17 | @prop({ index: true, required: true }) path!: string
18 | @prop({
19 | default: () => ({
20 | 'thumb-up': []
21 | })
22 | }) like!: {
23 | 'thumb-up': string[] // email
24 | }
25 | }
26 |
27 | export const EntryModel = getModelForClass(Entry, { schemaOptions: { collection: 'entry' } })
28 |
29 | export async function initDatabase (mongoUri: string) {
30 | await mongoose.connect(mongoUri, {
31 | useNewUrlParser: true,
32 | useUnifiedTopology: true,
33 | useCreateIndex: true,
34 | useFindAndModify: false
35 | })
36 | }
37 |
--------------------------------------------------------------------------------
/packages/web/src/store/index.ts:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import Vuex from 'vuex'
3 | import { User } from 'firebase/app'
4 | import axios from 'axios'
5 |
6 | Vue.use(Vuex)
7 |
8 | export default new Vuex.Store({
9 | state: {
10 | user: null as User | null
11 | },
12 | mutations: {
13 | setUser (state, user) {
14 | // state.user = JSON.parse(JSON.stringify(user))
15 | state.user = user
16 | }
17 | },
18 | actions: {
19 | async getApi ({ state }, url) {
20 | const api = axios.create({
21 | transformResponse: [
22 | (d) => {
23 | try {
24 | return JSON.parse(d)
25 | } catch (_) {}
26 | return d
27 | }
28 | ],
29 | headers: {
30 | 'X-Aloud-Url': url
31 | }
32 | })
33 |
34 | if (state.user) {
35 | api.defaults.headers.Authorization = `Bearer ${await state.user.getIdToken()}`
36 | }
37 |
38 | api.interceptors.response.use((r) => {
39 | if (r.data.error) {
40 | return Promise.reject(new Error(r.data.error))
41 | }
42 |
43 | return r
44 | })
45 |
46 | return api
47 | }
48 | }
49 | })
50 |
--------------------------------------------------------------------------------
/packages/server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "server",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "node lib/index.js",
8 | "dev": "ts-node-dev src/index.ts",
9 | "build": "tsc",
10 | "test": "echo \"Error: no test specified\" && exit 1"
11 | },
12 | "keywords": [],
13 | "author": "",
14 | "license": "ISC",
15 | "dependencies": {
16 | "@typegoose/typegoose": "^7.1.3",
17 | "axios": "^0.19.2",
18 | "domino": "^2.1.5",
19 | "escape-string-regexp": "^4.0.0",
20 | "fastify": "^2.14.1",
21 | "fastify-cookie": "^3.6.1",
22 | "fastify-helmet": "^3.0.2",
23 | "fastify-oas": "^2.7.0",
24 | "fastify-session": "^4.0.0",
25 | "fastify-static": "^2.7.0",
26 | "firebase-admin": "^8.12.1",
27 | "handlebars": "^4.7.6",
28 | "mongoose": "^5.9.15",
29 | "nanoid": "^3.1.9",
30 | "page-metadata-parser": "^1.1.4",
31 | "point-of-view": "^3.8.0"
32 | },
33 | "devDependencies": {
34 | "@types/mongoose": "^5.7.21",
35 | "@types/nanoid": "^2.1.0",
36 | "fastify-cors": "^3.0.3",
37 | "pino-pretty": "^4.0.0",
38 | "ts-node-dev": "^1.0.0-pre.44",
39 | "typescript": "^3.9.3"
40 | },
41 | "engines": {
42 | "yarn": "1.x",
43 | "npm": "please-use-yarn",
44 | "node": "12.x"
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/packages/web/src/views/NotFound.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
Whoops!
5 | Clumsy us, we were unable to find the page you were looking for
6 |
7 |
![]()
8 |
11 |
12 |
13 |
14 |
68 |
--------------------------------------------------------------------------------
/packages/web/src/router/index.ts:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import VueRouter from 'vue-router'
3 |
4 | Vue.use(VueRouter)
5 |
6 | const registeredLayouts = [
7 | 'web'
8 | ]
9 |
10 | registeredLayouts.map((layout) => {
11 | Vue.component(`${layout}-layout`, () => import(`@/layouts/${layout}.vue`))
12 | })
13 |
14 | const router = new VueRouter({
15 | mode: 'history',
16 | base: process.env.BASE_URL,
17 | routes: [
18 | {
19 | path: '/comment',
20 | component: () => import('@/views/Comment.vue')
21 | },
22 | {
23 | path: '/installation',
24 | component: () => import('@/views/MarkdownDoc.vue'),
25 | props: {
26 | getMd: async () => (await import('@/assets/docs/installation.md')).default
27 | },
28 | meta: {
29 | layout: 'web'
30 | }
31 | },
32 | {
33 | path: '/guide',
34 | component: () => import('@/views/MarkdownDoc.vue'),
35 | props: {
36 | getMd: async () => (await import('@/assets/docs/guide.md')).default
37 | },
38 | meta: {
39 | layout: 'web'
40 | }
41 | },
42 | {
43 | path: '/',
44 | component: () => import('@/views/MarkdownDoc.vue'),
45 | props: {
46 | getMd: async () => (await import('@/assets/README.md')).default
47 | },
48 | meta: {
49 | layout: 'web'
50 | }
51 | },
52 | {
53 | path: '*',
54 | component: () => import('@/views/NotFound.vue')
55 | }
56 | ]
57 | })
58 |
59 | export default router
60 |
--------------------------------------------------------------------------------
/docs/guide.md:
--------------------------------------------------------------------------------
1 | # Markdown Guide
2 |
3 | ## Emphasis
4 |
5 | **bold**
6 | *italics*
7 | ~~strikethrough~~
8 |
9 | ## Headers
10 |
11 | # Big header
12 | ## Medium header
13 | ### Small header
14 | #### Tiny header
15 |
16 | ## Lists
17 |
18 | * Generic list item
19 | * Generic list item
20 | * Generic list item
21 |
22 | 1. Numbered list item
23 | 2. Numbered list item
24 | 3. Numbered list item
25 |
26 | ## Links
27 |
28 | [Text to display](http://www.example.com)
29 |
30 | ## Emojis
31 |
32 | this is a :smile: smile emoji
33 |
34 | this is a :smile: smile emoji
35 |
36 | A complete list of available emojis can be found [here](https://github.com/showdownjs/showdown/wiki/emojis).
37 |
38 | ## Quotes
39 |
40 | > This is a quote.
41 | > It can span multiple lines!
42 |
43 | ## Images
44 |
45 | 
46 |
47 | Need to upload images? Simply paste the image, and the link will be autogenerated.
48 |
49 | ## Tables
50 |
51 | | Column 1 | Column 2 | Column 3 |
52 | | -------- | -------- | -------- |
53 | | John | Doe | Male |
54 | | Mary | Smith | Female |
55 |
56 | Or without aligning the columns...
57 |
58 | | Column 1 | Column 2 | Column 3 |
59 | | -------- | -------- | -------- |
60 | | John | Doe | Male |
61 | | Mary | Smith | Female |
62 |
63 | ## Displaying code
64 |
65 | `var example = "hello!";`
66 |
67 | Or spanning multiple lines...
68 |
69 | ```js
70 | var example = "hello!";
71 | alert(example);
72 | ```
73 |
--------------------------------------------------------------------------------
/packages/web/src/assets/util.ts:
--------------------------------------------------------------------------------
1 | import SparkMD5 from 'spark-md5'
2 |
3 | export const lit = (segs: TemplateStringsArray, ...parts: string[]) =>
4 | segs.map((s, i) => `${s}${parts[i]}`).join('')
5 |
6 | /**
7 | *
8 | * @param {string} [email]
9 | * @param {number} [size]
10 | */
11 | export function getGravatarUrl (email: string, size = 96) {
12 | return `https://www.gravatar.com/avatar/${
13 | email ? SparkMD5.hash(email.trim().toLocaleLowerCase()) : '0'
14 | }?s=${size}&d=mp`
15 | }
16 |
17 | export function deepMerge (target: any, input: any) {
18 | const t = getType(target)
19 | if (t === getType(input)) {
20 | if (t === 'record') {
21 | for (const [k, v] of Object.entries(input)) {
22 | const vT = getType(v)
23 | if (['record', 'array'].includes(vT)) {
24 | deepMerge(target[k], v)
25 | } else {
26 | target[k] = v
27 | }
28 | }
29 | } else if (t === 'array') {
30 | ;(input as any[]).map((v, i) => {
31 | const vT = getType(v)
32 | if (['record', 'array'].includes(vT)) {
33 | deepMerge(target[i], v)
34 | } else {
35 | target[i] = v
36 | }
37 | })
38 | }
39 | }
40 | }
41 |
42 | export function getType (a: any) {
43 | const t = typeof a
44 | if (t === 'object') {
45 | if (!a) {
46 | return 'null'
47 | } else if (Array.isArray(a)) {
48 | return 'array'
49 | } else if (a.toString() === '[object Object]') {
50 | return 'record'
51 | } else {
52 | return a.toString()
53 | }
54 | }
55 | return t
56 | }
57 |
--------------------------------------------------------------------------------
/packages/web/src/assets/docs/guide.md:
--------------------------------------------------------------------------------
1 | # Markdown Guide
2 |
3 | ## Emphasis
4 |
5 | **bold**
6 | *italics*
7 | ~~strikethrough~~
8 |
9 | ## Headers
10 |
11 | # Big header
12 | ## Medium header
13 | ### Small header
14 | #### Tiny header
15 |
16 | ## Lists
17 |
18 | * Generic list item
19 | * Generic list item
20 | * Generic list item
21 |
22 | 1. Numbered list item
23 | 2. Numbered list item
24 | 3. Numbered list item
25 |
26 | ## Links
27 |
28 | [Text to display](http://www.example.com)
29 |
30 | ## Emojis
31 |
32 | this is a :smile: smile emoji
33 |
34 | this is a :smile: smile emoji
35 |
36 | A complete list of available emojis can be found [here](https://github.com/showdownjs/showdown/wiki/emojis).
37 |
38 | ## Quotes
39 |
40 | > This is a quote.
41 | > It can span multiple lines!
42 |
43 | ## Images
44 |
45 | 
46 |
47 | Need to upload images? Simply paste the image, and the link will be autogenerated.
48 |
49 | ## Tables
50 |
51 | | Column 1 | Column 2 | Column 3 |
52 | | -------- | -------- | -------- |
53 | | John | Doe | Male |
54 | | Mary | Smith | Female |
55 |
56 | Or without aligning the columns...
57 |
58 | | Column 1 | Column 2 | Column 3 |
59 | | -------- | -------- | -------- |
60 | | John | Doe | Male |
61 | | Mary | Smith | Female |
62 |
63 | ## Displaying code
64 |
65 | `var example = "hello!";`
66 |
67 | Or spanning multiple lines...
68 |
69 | ```js
70 | var example = "hello!";
71 | alert(example);
72 | ```
73 |
--------------------------------------------------------------------------------
/packages/web/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "web",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "vue-cli-service build --mode=development --watch --dest ../server/public",
7 | "build": "vue-cli-service build"
8 | },
9 | "dependencies": {
10 | "axios": "^0.19.2",
11 | "buefy": "^0.8.19",
12 | "core-js": "^3.6.4",
13 | "firebase": "^7.14.5",
14 | "firebaseui": "^4.5.0",
15 | "he": "^1.2.0",
16 | "highlight.js": "^10.0.3",
17 | "highlightjs-vue": "github:patarapolw/highlightjs-vue",
18 | "humanize-duration": "^3.23.0",
19 | "liquidjs": "^9.12.0",
20 | "markdown-it": "^11.0.0",
21 | "markdown-it-container": "^2.0.0",
22 | "markdown-it-emoji": "^1.4.0",
23 | "markdown-it-imsize": "github:JRileyH/markdown-it-imsize",
24 | "simplemde": "^1.11.2",
25 | "spark-md5": "^3.0.1",
26 | "vue": "^2.6.11",
27 | "vue-class-component": "^7.2.3",
28 | "vue-click-outside": "^1.1.0",
29 | "vue-property-decorator": "^8.4.1",
30 | "vue-router": "^3.1.6",
31 | "vuex": "^3.1.3"
32 | },
33 | "devDependencies": {
34 | "@types/he": "^1.1.1",
35 | "@types/humanize-duration": "^3.18.0",
36 | "@types/markdown-it": "^10.0.1",
37 | "@types/simplemde": "^1.11.7",
38 | "@types/spark-md5": "^3.0.2",
39 | "@vue/cli-plugin-babel": "~4.3.0",
40 | "@vue/cli-plugin-router": "~4.3.0",
41 | "@vue/cli-plugin-typescript": "~4.3.0",
42 | "@vue/cli-plugin-vuex": "~4.3.0",
43 | "@vue/cli-service": "~4.3.0",
44 | "pug": "^2.0.4",
45 | "pug-plain-loader": "^1.0.0",
46 | "raw-loader": "^4.0.1",
47 | "sass": "^1.26.3",
48 | "sass-loader": "^8.0.2",
49 | "typescript": "~3.8.3",
50 | "vue-template-compiler": "^2.6.11"
51 | },
52 | "engines": {
53 | "yarn": "1.x",
54 | "npm": "please-use-yarn",
55 | "node": "12.x"
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/packages/server/src/index.ts:
--------------------------------------------------------------------------------
1 | import path from 'path'
2 |
3 | import fastify from 'fastify'
4 | import fastifyStatic from 'fastify-static'
5 | import helmet from 'fastify-helmet'
6 | import pointOfView from 'point-of-view'
7 |
8 | import router from './router'
9 | import { initDatabase } from './db/schema'
10 |
11 | (async () => {
12 | await initDatabase(process.env.MONGO_URI!)
13 |
14 | const app = fastify({
15 | logger: {
16 | prettyPrint: process.env.NODE_ENV === 'development'
17 | }
18 | })
19 |
20 | const port = parseInt(process.env.PORT || '8080')
21 |
22 | app.register(helmet, {
23 | frameguard: false,
24 | contentSecurityPolicy: {
25 | directives: {
26 | 'frame-ancestors': ['"self"', ...process.env.ALOUD_SITE!.split(',')]
27 | }
28 | }
29 | })
30 |
31 | if (process.env.NODE_ENV === 'development') {
32 | app.register(require('fastify-cors'))
33 | app.addHook('preHandler', async (req) => {
34 | if (req.body) {
35 | req.log.info({ body: req.body }, 'body')
36 | }
37 | })
38 | }
39 |
40 | app.register(router, { prefix: '/api' })
41 |
42 | app.register(pointOfView, {
43 | engine: {
44 | handlebars: require('handlebars')
45 | },
46 | defaultContext: {
47 | firebaseConfig: process.env.FIREBASE_CONFIG,
48 | baseUrl: process.env.BASE_URL
49 | },
50 | // @ts-ignore
51 | root: path.resolve('public')
52 | })
53 |
54 | app.register(fastifyStatic, {
55 | root: path.resolve('public')
56 | })
57 |
58 | app.get('/', (_, reply) => {
59 | reply.view('index.html')
60 | })
61 |
62 | app.get('*.html', (_, reply) => {
63 | reply.view('index.html')
64 | })
65 |
66 | app.setNotFoundHandler((_, reply) => {
67 | reply.view('index.html')
68 | })
69 |
70 | app.listen(port, process.env.NODE_ENV === 'development' ? 'localhost' : '0.0.0.0', (err) => {
71 | if (err) {
72 | throw err
73 | }
74 |
75 | console.log(`Go to http://localhost:${port}`)
76 | })
77 | })().catch(console.error)
78 |
--------------------------------------------------------------------------------
/packages/web/src/assets/shlex.ts:
--------------------------------------------------------------------------------
1 | export interface ISplitOptions {
2 | brackets: [string, string][]
3 | split: string
4 | escape: string
5 | keepBrace?: boolean
6 | }
7 |
8 | export const defaultSplitOptions: ISplitOptions = {
9 | brackets: [
10 | ['"', '"'],
11 | ["'", "'"]
12 | ],
13 | split: ' ',
14 | escape: '\\'
15 | }
16 |
17 | /**
18 | *
19 | * @param ss
20 | * @param options
21 | *
22 | * ```js
23 | * > split('')
24 | * []
25 | * > split('a:b "c:d e:f"')
26 | * ['a:b', 'c:d e:f']
27 | * > split('a "b c" "d e"')
28 | * ['a', 'b c', 'd e']
29 | * ```
30 | */
31 | export function split (
32 | ss: string,
33 | options: ISplitOptions = defaultSplitOptions
34 | ) {
35 | const bracketStack = {
36 | data: [] as string[],
37 | push (c: string) {
38 | this.data.push(c)
39 | },
40 | pop () {
41 | return this.data.pop()
42 | },
43 | peek () {
44 | return this.data.length > 0 ? this.data[this.data.length - 1] : undefined
45 | }
46 | }
47 | const tokenStack = {
48 | data: [] as string[],
49 | currentChars: [] as string[],
50 | addChar (c: string) {
51 | this.currentChars.push(c)
52 | },
53 | flush () {
54 | const d = this.currentChars.join('')
55 | if (d) {
56 | this.data.push(d)
57 | }
58 | this.currentChars = []
59 | }
60 | }
61 |
62 | let prev = ''
63 | ss.split('').map((c) => {
64 | if (prev === options.escape) {
65 | tokenStack.addChar(c)
66 | } else {
67 | let canAddChar = true
68 |
69 | for (const [op, cl] of options.brackets) {
70 | if (c === cl) {
71 | if (bracketStack.peek() === op) {
72 | bracketStack.pop()
73 | canAddChar = false
74 | break
75 | }
76 | }
77 |
78 | if (c === op) {
79 | bracketStack.push(c)
80 | canAddChar = false
81 | break
82 | }
83 | }
84 |
85 | if (c === options.split && !bracketStack.peek()) {
86 | tokenStack.flush()
87 | } else if (options.keepBrace || canAddChar) {
88 | tokenStack.addChar(c)
89 | }
90 | }
91 |
92 | prev = c
93 | })
94 |
95 | tokenStack.flush()
96 |
97 | return tokenStack.data.map((s) => s.trim()).filter((s) => s)
98 | }
99 |
--------------------------------------------------------------------------------
/docs/installation.md:
--------------------------------------------------------------------------------
1 | # Installation
2 |
3 | ## Deploying the backend
4 |
5 | You will need both
6 |
7 | - Firebase,
8 | - Auth and Storage enabled
9 | - CORS enabled for Storage, by running `gsutil cors set cors.json gs://[BUCKET_NAME]`
10 | - MongoDB
11 |
12 | And several environment variables
13 |
14 | ```sh
15 | BASE_URL='https://'
16 | SECRET='' # I use https://randomkeygen.com/
17 | PROJECT_ID=
18 | MONGO_URI= # You might use MongoDB Atlas
19 | ALOUD_SITE= # Comma-separated allowed blog origins.
20 | # // (double forward slash) for schema and / (single forward slash) for pathname.
21 | FIREBASE_SDK= # For firebase-admin.
22 | FIREBASE_CONFIG= # For firebase client, although you will also need this in server-side.
23 | # You might convert JSON and module.exports to envvar string by running
24 | # `node -e 'console.log(JSON.stringify(require("./")))'`
25 | ```
26 |
27 | For deployment, I myself use Docker on Google Cloud Run.
28 |
29 | ```sh
30 | docker run \
31 | -p 8080:8080 \
32 | -e SECRET -e FIREBASE_SDK -e FIREBASE_CONFIG -e MONGO_URI -e ALOUD_SITE \
33 | patarapolw/aloud
34 |
35 | # Or, build it yourself
36 | robo docker-build # Build the docker
37 | robo docker-deploy # Deploy the docker
38 | ```
39 |
40 | ## Running in development
41 |
42 | I use [`robo.yml`](https://github.com/tj/robo) and [concurrently](https://github.com/kimmobrunfeldt/concurrently).
43 |
44 | ```sh
45 | cd packages/server && yarn && cd -
46 | cd packages/web && yarn && cd -
47 | robo dev
48 | ```
49 |
50 | Of course, you can also use `robo docker-build && robo docker-start`, to simulate production like environment.
51 |
52 | ## Adding comments to the frontend
53 |
54 | It is as simple as adding an IFrame,
55 |
56 | ```html
57 |
62 | ```
63 |
64 | However, it won't account for proper IFrame height. A way to solve this is to add,
65 |
66 | ```js
67 | setScrollHeight (evt: any) {
68 | if (evt.origin === "") {
69 | commentElement.style.height = `${evt.data.scrollHeight}px`
70 | }
71 | }
72 |
73 | if (window.addEventListener) {
74 | window.addEventListener('message', (evt) => {
75 | setScrollHeight(evt)
76 | }, false)
77 | } else {
78 | window.attachEvent('onmessage', (evt) => {
79 | setScrollHeight(evt)
80 | })
81 | }
82 | ```
83 |
--------------------------------------------------------------------------------
/packages/web/src/assets/docs/installation.md:
--------------------------------------------------------------------------------
1 | # Installation
2 |
3 | ## Deploying the backend
4 |
5 | You will need both
6 |
7 | - Firebase,
8 | - Auth and Storage enabled
9 | - CORS enabled for Storage, by running `gsutil cors set cors.json gs://[BUCKET_NAME]`
10 | - MongoDB
11 |
12 | And several environment variables
13 |
14 | ```sh
15 | BASE_URL='https://'
16 | SECRET='' # I use https://randomkeygen.com/
17 | PROJECT_ID=
18 | MONGO_URI= # You might use MongoDB Atlas
19 | ALOUD_SITE= # Comma-separated allowed blog origins.
20 | # // (double forward slash) for schema and / (single forward slash) for pathname.
21 | FIREBASE_SDK= # For firebase-admin.
22 | FIREBASE_CONFIG= # For firebase client, although you will also need this in server-side.
23 | # You might convert JSON and module.exports to envvar string by running
24 | # `node -e 'console.log(JSON.stringify(require("./")))'`
25 | ```
26 |
27 | For deployment, I myself use Docker on Google Cloud Run.
28 |
29 | ```sh
30 | docker run \
31 | -p 8080:8080 \
32 | -e SECRET -e FIREBASE_SDK -e FIREBASE_CONFIG -e MONGO_URI -e ALOUD_SITE \
33 | patarapolw/aloud
34 |
35 | # Or, build it yourself
36 | robo docker-build # Build the docker
37 | robo docker-deploy # Deploy the docker
38 | ```
39 |
40 | ## Running in development
41 |
42 | I use [`robo.yml`](https://github.com/tj/robo) and [concurrently](https://github.com/kimmobrunfeldt/concurrently).
43 |
44 | ```sh
45 | cd packages/server && yarn && cd -
46 | cd packages/web && yarn && cd -
47 | robo dev
48 | ```
49 |
50 | Of course, you can also use `robo docker-build && robo docker-start`, to simulate production like environment.
51 |
52 | ## Adding comments to the frontend
53 |
54 | It is as simple as adding an IFrame,
55 |
56 | ```html
57 |
62 | ```
63 |
64 | However, it won't account for proper IFrame height. A way to solve this is to add,
65 |
66 | ```js
67 | setScrollHeight (evt: any) {
68 | if (evt.origin === "") {
69 | commentElement.style.height = `${evt.data.scrollHeight}px`
70 | }
71 | }
72 |
73 | if (window.addEventListener) {
74 | window.addEventListener('message', (evt) => {
75 | setScrollHeight(evt)
76 | }, false)
77 | } else {
78 | window.attachEvent('onmessage', (evt) => {
79 | setScrollHeight(evt)
80 | })
81 | }
82 | ```
83 |
--------------------------------------------------------------------------------
/packages/server/src/router/index.ts:
--------------------------------------------------------------------------------
1 | import { FastifyInstance } from 'fastify'
2 | import swagger from 'fastify-oas'
3 | import fSession from 'fastify-session'
4 | import fCoookie from 'fastify-cookie'
5 | import admin from 'firebase-admin'
6 |
7 | import commentRouter from './comment'
8 | import metadataRouter from './metadata'
9 |
10 | const router = (f: FastifyInstance, _: any, next: () => void) => {
11 | admin.initializeApp({
12 | credential: admin.credential.cert(JSON.parse(process.env.FIREBASE_SDK!)),
13 | databaseURL: JSON.parse(process.env.FIREBASE_CONFIG!).databaseURL
14 | })
15 |
16 | f.register(swagger, {
17 | routePrefix: '/doc',
18 | swagger: {
19 | info: {
20 | title: 'Aloud API',
21 | description: 'Aloud commenting Swagger API',
22 | version: '0.1.0'
23 | },
24 | consumes: ['application/json'],
25 | produces: ['application/json'],
26 | servers: [
27 | {
28 | url: process.env.BASE_URL,
29 | description: 'Online server'
30 | },
31 | {
32 | url: 'http://localhost:8080',
33 | description: 'Local server'
34 | }
35 | ],
36 | components: {
37 | securitySchemes: {
38 | // BasicAuth: {
39 | // type: 'http',
40 | // scheme: 'basic'
41 | // },
42 | BearerAuth: {
43 | type: 'http',
44 | scheme: 'bearer'
45 | }
46 | }
47 | }
48 | },
49 | exposeRoute: true
50 | })
51 |
52 | f.register(fCoookie)
53 | f.register(fSession, { secret: process.env.SECRET! })
54 |
55 | f.addHook('preHandler', async (req) => {
56 | if (req.req.url && req.req.url.startsWith('/api/doc')) {
57 | return
58 | }
59 |
60 | const url = req.headers['x-aloud-url']
61 | const bearerAuth = async (auth: string) => {
62 | const m = /^Bearer (.+)$/.exec(auth)
63 |
64 | if (!m) {
65 | return false
66 | }
67 |
68 | const ticket = await admin.auth().verifyIdToken(m[1], true)
69 | req.session.user = {
70 | email: ticket.email,
71 | displayName: (ticket as any).name || undefined
72 | }
73 |
74 | return !!req.session.user
75 | }
76 |
77 | await bearerAuth(req.headers.authorization)
78 |
79 | req.log.info({ user: req.session.user, url }, 'auth')
80 | })
81 |
82 | f.register(commentRouter, { prefix: '/comment' })
83 | f.register(metadataRouter, { prefix: '/metadata' })
84 | next()
85 | }
86 |
87 | export default router
88 |
--------------------------------------------------------------------------------
/packages/web/src/views/Comment.vue:
--------------------------------------------------------------------------------
1 |
2 | .container(style="margin-bottom: 50px;")
3 | MainEditor(@post="onPost" @render="onRender")
4 | Entry(v-for="it in entries" :key="it.id + Math.random().toString(36)" :entry="it" source="_root" :depth="0"
5 | @render="onRender" @delete="onDelete(it)")
6 |
7 |
8 |
97 |
98 |
107 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | # Created by https://www.gitignore.io/api/macos,node
3 | # Edit at https://www.gitignore.io/?templates=macos,node
4 |
5 | ### macOS ###
6 | # General
7 | .DS_Store
8 | .AppleDouble
9 | .LSOverride
10 |
11 | # Icon must end with two \r
12 | Icon
13 |
14 | # Thumbnails
15 | ._*
16 |
17 | # Files that might appear in the root of a volume
18 | .DocumentRevisions-V100
19 | .fseventsd
20 | .Spotlight-V100
21 | .TemporaryItems
22 | .Trashes
23 | .VolumeIcon.icns
24 | .com.apple.timemachine.donotpresent
25 |
26 | # Directories potentially created on remote AFP share
27 | .AppleDB
28 | .AppleDesktop
29 | Network Trash Folder
30 | Temporary Items
31 | .apdisk
32 |
33 | ### Node ###
34 | # Logs
35 | logs
36 | *.log
37 | npm-debug.log*
38 | yarn-debug.log*
39 | yarn-error.log*
40 | lerna-debug.log*
41 |
42 | # Diagnostic reports (https://nodejs.org/api/report.html)
43 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
44 |
45 | # Runtime data
46 | pids
47 | *.pid
48 | *.seed
49 | *.pid.lock
50 |
51 | # Directory for instrumented libs generated by jscoverage/JSCover
52 | lib-cov
53 |
54 | # Coverage directory used by tools like istanbul
55 | coverage
56 | *.lcov
57 |
58 | # nyc test coverage
59 | .nyc_output
60 |
61 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
62 | .grunt
63 |
64 | # Bower dependency directory (https://bower.io/)
65 | bower_components
66 |
67 | # node-waf configuration
68 | .lock-wscript
69 |
70 | # Compiled binary addons (https://nodejs.org/api/addons.html)
71 | build/Release
72 |
73 | # Dependency directories
74 | node_modules/
75 | jspm_packages/
76 |
77 | # TypeScript v1 declaration files
78 | typings/
79 |
80 | # TypeScript cache
81 | *.tsbuildinfo
82 |
83 | # Optional npm cache directory
84 | .npm
85 |
86 | # Optional eslint cache
87 | .eslintcache
88 |
89 | # Optional REPL history
90 | .node_repl_history
91 |
92 | # Output of 'npm pack'
93 | *.tgz
94 |
95 | # Yarn Integrity file
96 | .yarn-integrity
97 |
98 | # dotenv environment variables file
99 | .env
100 | .env.test
101 |
102 | # parcel-bundler cache (https://parceljs.org/)
103 | .cache
104 |
105 | # next.js build output
106 | .next
107 |
108 | # nuxt.js build output
109 | .nuxt
110 |
111 | # rollup.js default build output
112 | dist/
113 |
114 | # Uncomment the public line if your project uses Gatsby
115 | # https://nextjs.org/blog/next-9-1#public-directory-support
116 | # https://create-react-app.dev/docs/using-the-public-folder/#docsNav
117 | # public
118 |
119 | # Storybook build outputs
120 | .out
121 | .storybook-out
122 |
123 | # vuepress build output
124 | .vuepress/dist
125 |
126 | # Serverless directories
127 | .serverless/
128 |
129 | # FuseBox cache
130 | .fusebox/
131 |
132 | # DynamoDB Local files
133 | .dynamodb/
134 |
135 | # Temporary folders
136 | tmp/
137 | temp/
138 |
139 | # End of https://www.gitignore.io/api/macos,node
140 |
141 | .env.*
142 | aloud.config.js
143 | firebase.*
144 |
--------------------------------------------------------------------------------
/packages/web/src/layouts/web.vue:
--------------------------------------------------------------------------------
1 |
2 | div
3 | nav.navbar.header.has-shadow.is-primary(role="navigation" aria-label="main navigation")
4 | .navbar-brand
5 | a.navbar-item(href="/")
6 | strong(style="margin-right: 1rem;") Aloud
7 | | A self-hosted commenting engine
8 | .navbar-burger
9 | span
10 | span
11 | span
12 | section.main-content.columns
13 | aside.column.is-2.section
14 | p.menu-label.is-hidden-touch
15 | | General
16 | ul.menu-list
17 | li(v-for="(item, key) of items" :key="key")
18 | router-link(v-if="item.to" :to="item.to" exact-active-class="is-active")
19 | b-icon(:icon="item.icon" :pack="item.iconPack" style="margin-right: 0.5rem;")
20 | | {{ item.title }}
21 | a(v-else :href="item.url" target="_blank" rel="noopener")
22 | b-icon(:icon="item.icon" :pack="item.iconPack" style="margin-right: 0.5rem;")
23 | | {{ item.title }}
24 | .container.column.is-10
25 | slot
26 | .container(style="text-align: center;")
27 | iframe.comment-iframe(ref="comment"
28 | :src="commentUrl" frameborder="0" sandbox="allow-scripts allow-popups allow-same-origin")
29 |
30 |
31 |
94 |
95 |
108 |
--------------------------------------------------------------------------------
/packages/web/src/assets/template.ts:
--------------------------------------------------------------------------------
1 | import { Liquid } from 'liquidjs'
2 | import axios from 'axios'
3 | import he from 'he'
4 |
5 | import { split } from './shlex'
6 |
7 | export const liquid = new Liquid()
8 |
9 | liquid.registerTag('link', {
10 | parse (token) {
11 | this.href = token
12 | },
13 | async render () {
14 | const meta = (
15 | await axios.get('/api/metadata', {
16 | params: {
17 | q: this.href
18 | }
19 | })
20 | ).data
21 |
22 | const img = `
23 |
`
31 |
32 | const innerHTML = `${
33 | meta.image
34 | ? `
35 | ${img}
38 |
`
39 | : ''
40 | }
41 |
42 | ${
43 | meta.title
44 | ? `
${he.encode(
45 | meta.title
46 | )}
`
47 | : `${he.encode(
48 | meta.url
49 | )}
`
50 | }
51 | ${he.encode(meta.description || '')}
52 | `
53 |
54 | return `
55 |
62 | ${innerHTML}
63 | `
64 | }
65 | })
66 |
67 | liquid.registerTag('youtube', {
68 | parse (token) {
69 | this.href = split(token.args)[0]
70 | },
71 | render () {
72 | return this.href
73 | ? `
74 | `
80 | : ''
81 | }
82 | })
83 |
84 | liquid.registerTag('speak', {
85 | parse (token) {
86 | const [href, str] = split(token.args)
87 | this.word = href
88 | this.lang = str || 'zh'
89 | },
90 | render () {
91 | const href = `https://speak-btn.now.sh/btn?q=${encodeURIComponent(
92 | this.word
93 | )}&lang=${encodeURIComponent(this.lang)}`
94 |
95 | return this.word
96 | ? `
97 | `
102 | : ''
103 | }
104 | })
105 |
--------------------------------------------------------------------------------
/packages/web/src/assets/make-html.ts:
--------------------------------------------------------------------------------
1 | import SparkMD5 from 'spark-md5'
2 | // import { unescapeAll } from 'markdown-it/lib/common/utils'
3 | import emoji from 'markdown-it-emoji'
4 | import imsize from 'markdown-it-imsize'
5 | import mdContainer from 'markdown-it-container'
6 | import MarkdownIt from 'markdown-it'
7 | import hljs from 'highlight.js'
8 | import hljsDefineVue from 'highlightjs-vue'
9 | import { liquid } from './template'
10 | import 'highlight.js/styles/default.css'
11 |
12 | hljsDefineVue(hljs)
13 |
14 | export class MakeHtml {
15 | md: MarkdownIt
16 | html = ''
17 | id: string
18 |
19 | constructor (id?: string) {
20 | this.id = id
21 | ? `el__${SparkMD5.hash(id)}`
22 | : `el__${Math.random()
23 | .toString(36)
24 | .substr(2)}`
25 | this.md = MarkdownIt({
26 | breaks: true
27 | })
28 | // .use((md) => {
29 | // const { fence } = md.renderer.rules
30 |
31 | // md.renderer.rules.fence = (tokens, idx, options, env, slf) => {
32 | // const token = tokens[idx]
33 | // const info = token.info ? unescapeAll(token.info).trim() : ''
34 | // const content = token.content
35 |
36 | // if (info === 'css parsed') {
37 | // return this._makeCss(content)
38 | // } else if (info === 'yaml link') {
39 | // return this._makeLink(yaml.safeLoad(content))
40 | // }
41 |
42 | // return fence!(tokens, idx, options, env, slf)
43 | // }
44 | // return md
45 | // })
46 | .use(emoji)
47 | .use(imsize)
48 | .use(mdContainer, 'spoiler', {
49 | validate: (params: string) => {
50 | return params.trim().match(/^spoiler(?:\s+(.*))?$/)
51 | },
52 | render: (tokens: any[], idx: number) => {
53 | const m = tokens[idx].info.trim().match(/^spoiler(?:\s+(.*))?$/)
54 |
55 | if (tokens[idx].nesting === 1) {
56 | // opening tag
57 | return (
58 | '' +
59 | this.md.utils.escapeHtml(m[1] || 'Spoiler') +
60 | '
\n'
61 | )
62 | } else {
63 | // closing tag
64 | return ' \n'
65 | }
66 | }
67 | })
68 | }
69 |
70 | /**
71 | *
72 | * @param {string} s
73 | */
74 | async parse (s: string) {
75 | if (typeof window !== 'undefined') {
76 | const html = this.md.render(s)
77 | const div = document.createElement('div')
78 | div.innerHTML = await this._prerender(html)
79 | return this._postrender(div).innerHTML
80 | }
81 | return ''
82 | }
83 |
84 | private _prerender (s: string) {
85 | return liquid.parseAndRender(s)
86 | }
87 |
88 | private _postrender (dom: HTMLElement) {
89 | dom.querySelectorAll('iframe').forEach((el) => {
90 | const w = el.width
91 | const h = el.height
92 |
93 | const style = getComputedStyle(el)
94 |
95 | el.style.width = el.style.width || style.width || (w ? `${w}px` : '')
96 | el.style.height = el.style.height || style.height || (h ? `${h}px` : '')
97 | })
98 |
99 | dom.querySelectorAll('pre code').forEach((el) => {
100 | hljs.highlightBlock(el)
101 | })
102 |
103 | return dom
104 | }
105 | }
106 |
--------------------------------------------------------------------------------
/packages/web/src/components/MainEditor.vue:
--------------------------------------------------------------------------------
1 |
2 | article.media
3 | figure.media-left(style="text-align: center; position: relative;" ref="figure")
4 | .popup(ref="login" v-show="isLoggingIn")
5 | p.image.avatar(style="margin-top: 1rem;")
6 | b-tooltip(v-if="user" :label="'Logged in as ' + (user.displayName || 'Anonymous') + '. Click to logout'" position="is-right")
7 | img.is-rounded.cursor-pointer(:src="getGravatarUrl(user.email)" :alt="user.given_name"
8 | @click="doLogout" role="button")
9 | b-tooltip(v-else label="Click to login" position="is-right")
10 | img.is-rounded.cursor-pointer(:src="getGravatarUrl()"
11 | @click="isLoggingIn = true" role="button")
12 | .media-content
13 | .toggleable-editor-main
14 | SimpleMde(
15 | v-if="user"
16 | v-model="currentValue"
17 | @init="$emit('render')")
18 | b-input(v-else type="textarea" disabled placeholder="Please login to comment.")
19 | .buttons(style="margin-left: 1rem;")
20 | b-button.is-success(:disabled="!user || !currentValue" @click="doPost") Post Comment
21 |
22 |
23 |
107 |
108 |
132 |
--------------------------------------------------------------------------------
/packages/server/src/router/comment.ts:
--------------------------------------------------------------------------------
1 | import { FastifyInstance } from 'fastify'
2 | import escapeStringRegexp from 'escape-string-regexp'
3 | import { EntryModel } from '../db/schema'
4 |
5 | export default (f: FastifyInstance, _: any, next: () => void) => {
6 | f.get('/', {
7 | schema: {
8 | tags: ['comment'],
9 | summary: 'Query for comments',
10 | querystring: {
11 | type: 'object',
12 | required: ['path', 'offset'],
13 | properties: {
14 | path: { type: 'string' },
15 | offset: { type: 'integer' }
16 | }
17 | },
18 | response: {
19 | 200: {
20 | type: 'object',
21 | properties: {
22 | data: { type: 'array', items: {} },
23 | count: { type: 'integer' }
24 | }
25 | }
26 | }
27 | }
28 | }, async (req, reply) => {
29 | const url = req.headers['x-aloud-url']
30 | if (!url) {
31 | return reply.status(401).send()
32 | }
33 |
34 | const { path, offset } = req.query
35 |
36 | const [rData, rCount] = await Promise.all([
37 | EntryModel.aggregate([
38 | {
39 | $match: {
40 | url,
41 | path
42 | }
43 | },
44 | {
45 | $sort: {
46 | createdAt: -1
47 | }
48 | },
49 | {
50 | $skip: offset
51 | },
52 | {
53 | $limit: 5
54 | }
55 | ]),
56 | EntryModel.countDocuments({
57 | url,
58 | path
59 | })
60 | ])
61 |
62 | return {
63 | data: rData,
64 | count: rCount
65 | }
66 | })
67 |
68 | f.put('/', {
69 | schema: {
70 | tags: ['comment'],
71 | summary: 'Create comment',
72 | body: {
73 | type: 'object',
74 | required: ['content', 'path'],
75 | properties: {
76 | content: { type: 'string' },
77 | path: { type: 'string' }
78 | }
79 | },
80 | response: {
81 | 200: {
82 | type: 'object',
83 | properties: {
84 | id: { type: 'string' }
85 | }
86 | }
87 | }
88 | }
89 | }, async (req, reply) => {
90 | const url = req.headers['x-aloud-url']
91 | if (!req.session.user || !url) {
92 | return reply.status(401).send()
93 | }
94 |
95 | const { content, path } = req.body
96 | const { user } = req.session
97 |
98 | const el = await EntryModel.create({
99 | content,
100 | path,
101 | createdBy: {
102 | displayName: user.displayName || undefined,
103 | email: user.email || undefined
104 | },
105 | url
106 | })
107 |
108 | return {
109 | id: el._id
110 | }
111 | })
112 |
113 | f.patch('/', {
114 | schema: {
115 | tags: ['comment'],
116 | summary: 'Update comment',
117 | querystring: {
118 | type: 'object',
119 | required: ['id'],
120 | properties: {
121 | id: { type: 'string' }
122 | }
123 | },
124 | body: {
125 | type: 'object',
126 | properties: {
127 | like: { type: 'object' },
128 | content: { type: 'string' }
129 | }
130 | }
131 | }
132 | }, async (req, reply) => {
133 | if (!req.session.user) {
134 | reply.status(401).send()
135 | return
136 | }
137 |
138 | const { id } = req.query
139 | const { like, content } = req.body
140 | const $set = JSON.parse(JSON.stringify({ like, content }))
141 |
142 | await EntryModel.updateOne({ _id: id }, { $set })
143 |
144 | reply.status(201).send()
145 | })
146 |
147 | f.delete('/', {
148 | schema: {
149 | tags: ['comment'],
150 | summary: 'Delete comment',
151 | querystring: {
152 | type: 'object',
153 | required: ['id', 'path'],
154 | properties: {
155 | id: { type: 'string' },
156 | path: { type: 'string' }
157 | }
158 | }
159 | }
160 | }, async (req, reply) => {
161 | const url = req.headers['x-aloud-url']
162 | if (!req.session.user || !url) {
163 | reply.status(401).send()
164 | return
165 | }
166 |
167 | const { id, path } = req.query
168 | await Promise.all([
169 | EntryModel.deleteOne({ _id: id }),
170 | EntryModel.deleteMany({
171 | url,
172 | path: {
173 | $regex: new RegExp(
174 | `(^${escapeStringRegexp(path)}/|^${escapeStringRegexp(
175 | path
176 | )}$)`
177 | )
178 | }
179 | })
180 | ])
181 |
182 | reply.status(201).send()
183 | })
184 |
185 | next()
186 | }
187 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */
4 |
5 | /* Basic Options */
6 | // "incremental": true, /* Enable incremental compilation */
7 | "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
8 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
9 | // "lib": [], /* Specify library files to be included in the compilation. */
10 | // "allowJs": true, /* Allow javascript files to be compiled. */
11 | // "checkJs": true, /* Report errors in .js files. */
12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
13 | // "declaration": true, /* Generates corresponding '.d.ts' file. */
14 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
15 | // "sourceMap": true, /* Generates corresponding '.map' file. */
16 | // "outFile": "./", /* Concatenate and emit output to single file. */
17 | // "outDir": "./", /* Redirect output structure to the directory. */
18 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
19 | // "composite": true, /* Enable project compilation */
20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
21 | // "removeComments": true, /* Do not emit comments to output. */
22 | // "noEmit": true, /* Do not emit outputs. */
23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */
24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
26 |
27 | /* Strict Type-Checking Options */
28 | "strict": true, /* Enable all strict type-checking options. */
29 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
30 | // "strictNullChecks": true, /* Enable strict null checks. */
31 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */
32 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
33 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
34 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
35 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
36 |
37 | /* Additional Checks */
38 | // "noUnusedLocals": true, /* Report errors on unused locals. */
39 | // "noUnusedParameters": true, /* Report errors on unused parameters. */
40 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
41 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
42 |
43 | /* Module Resolution Options */
44 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
45 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
46 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
47 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
48 | // "typeRoots": [], /* List of folders to include type definitions from. */
49 | // "types": [], /* Type declaration files to be included in compilation. */
50 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
51 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
52 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
53 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
54 |
55 | /* Source Map Options */
56 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
57 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
58 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
59 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
60 |
61 | /* Experimental Options */
62 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
63 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
64 |
65 | /* Advanced Options */
66 | "skipLibCheck": true, /* Skip type checking of declaration files. */
67 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/packages/server/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */
4 |
5 | /* Basic Options */
6 | // "incremental": true, /* Enable incremental compilation */
7 | "target": "esnext", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
8 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
9 | // "lib": [], /* Specify library files to be included in the compilation. */
10 | "allowJs": true, /* Allow javascript files to be compiled. */
11 | // "checkJs": true, /* Report errors in .js files. */
12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
13 | // "declaration": true, /* Generates corresponding '.d.ts' file. */
14 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
15 | // "sourceMap": true, /* Generates corresponding '.map' file. */
16 | // "outFile": "./", /* Concatenate and emit output to single file. */
17 | "outDir": "./lib", /* Redirect output structure to the directory. */
18 | "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
19 | // "composite": true, /* Enable project compilation */
20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
21 | // "removeComments": true, /* Do not emit comments to output. */
22 | // "noEmit": true, /* Do not emit outputs. */
23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */
24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
26 |
27 | /* Strict Type-Checking Options */
28 | "strict": true, /* Enable all strict type-checking options. */
29 | "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
30 | "strictNullChecks": true, /* Enable strict null checks. */
31 | "strictFunctionTypes": true, /* Enable strict checking of function types. */
32 | "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
33 | "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
34 | "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
35 | "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
36 |
37 | /* Additional Checks */
38 | "noUnusedLocals": true, /* Report errors on unused locals. */
39 | "noUnusedParameters": true, /* Report errors on unused parameters. */
40 | "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
41 | "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
42 |
43 | /* Module Resolution Options */
44 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
45 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
46 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
47 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
48 | // "typeRoots": [], /* List of folders to include type definitions from. */
49 | // "types": [], /* Type declaration files to be included in compilation. */
50 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
51 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
52 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
53 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
54 |
55 | /* Source Map Options */
56 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
57 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
58 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
59 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
60 |
61 | /* Experimental Options */
62 | "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
63 | "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
64 |
65 | /* Advanced Options */
66 | "skipLibCheck": true, /* Skip type checking of declaration files. */
67 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
68 | },
69 | "exclude": [
70 | "public"
71 | ]
72 | }
73 |
--------------------------------------------------------------------------------
/packages/web/src/components/Entry.vue:
--------------------------------------------------------------------------------
1 |
2 | section
3 | article.media(style="margin-top: 1rem;")
4 | figure.media-left(style="text-align: center;")
5 | p.image.avatar
6 | img.is-rounded(:src="(entry && entry.createdBy) ? getGravatarUrl(entry.createdBy.email) : getGravatarUrl(email)")
7 | .media-content(style="display: flex; flex-direction: column;")
8 | div(style="min-height: 50px; flex-grow: 1")
9 | .content(v-if="!modelIsEdit" v-html="html")
10 | SimpleMde.reply-editor(v-else v-model="value" @init="$emit('render')")
11 | small
12 | span.footer-block(v-if="canLike")
13 | a(role="button" @click="toggleLike" v-if="isYours(entry)")
14 | | {{entry.like['thumb-up'].includes(email) ? 'Unlike' : 'Like'}}
15 | span(v-if="entry.like['thumb-up'].length > 0")
16 | b-icon(icon="thumbs-up" size="is-small" style="margin-left: 0.5rem;")
17 | span {{entry.like['thumb-up'].length}}
18 | span.footer-block(v-if="entry && user")
19 | a(role="button" @click="doReply") Reply
20 | span.footer-block(v-if="!entry || (entry && isYours(entry))")
21 | a(role="button" @click="toggleEdit") {{modelIsEdit ? 'Post' : 'Edit'}}
22 | span.footer-block(v-if="!entry || (entry && isYours(entry))")
23 | a(role="button" @click="doDelete") Delete
24 | span.footer-block(v-if="entry") Posted by {{nickname(entry) || 'Anonymous'}}
25 | span.footer-block(v-if="entry") {{ pastDuration }} ago
26 | section(v-if="depth < 3")
27 | entry(v-if="hasReply" :source="path" :is-edit="true"
28 | @delete="hasReply = false" @render="$emit('render')" @post="onPost")
29 | entry(v-for="it in subcomments" :key="it._id" :source="path"
30 | :entry="it" @render="$emit('render')" @delete="onDelete(it)")
31 | section(v-if="depth >= 3")
32 | entry(v-if="hasReply" :source="path" :is-edit="true"
33 | @delete="hasReply = false" @render="$emit('render')" @post="onPost")
34 | entry(v-for="it in subcomments" :key="it._id" :source="path"
35 | :entry="it" @render="$emit('render')" @delete="onDelete(it)")
36 |
37 |
38 |
230 |
231 |
244 |
--------------------------------------------------------------------------------
/packages/web/src/components/SimpleMde.vue:
--------------------------------------------------------------------------------
1 |
2 | .vue-simplemde
3 | textarea.vue-simplemde-textarea(:value="modelVal" @input="handleInput($event.target.value)")
4 |
5 |
6 |
297 |
298 |
312 |
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@babel/code-frame@^7.0.0":
6 | version "7.10.1"
7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff"
8 | integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==
9 | dependencies:
10 | "@babel/highlight" "^7.10.1"
11 |
12 | "@babel/helper-validator-identifier@^7.10.1":
13 | version "7.10.1"
14 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5"
15 | integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==
16 |
17 | "@babel/highlight@^7.10.1":
18 | version "7.10.1"
19 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.1.tgz#841d098ba613ba1a427a2b383d79e35552c38ae0"
20 | integrity sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==
21 | dependencies:
22 | "@babel/helper-validator-identifier" "^7.10.1"
23 | chalk "^2.0.0"
24 | js-tokens "^4.0.0"
25 |
26 | "@types/color-name@^1.1.1":
27 | version "1.1.1"
28 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
29 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
30 |
31 | "@types/eslint-visitor-keys@^1.0.0":
32 | version "1.0.0"
33 | resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d"
34 | integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==
35 |
36 | "@types/json-schema@^7.0.3":
37 | version "7.0.4"
38 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339"
39 | integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==
40 |
41 | "@typescript-eslint/eslint-plugin@^3.0.0":
42 | version "3.1.0"
43 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.1.0.tgz#4ac00ecca3bbea740c577f1843bc54fa69c3def2"
44 | integrity sha512-D52KwdgkjYc+fmTZKW7CZpH5ZBJREJKZXRrveMiRCmlzZ+Rw9wRVJ1JAmHQ9b/+Ehy1ZeaylofDB9wwXUt83wg==
45 | dependencies:
46 | "@typescript-eslint/experimental-utils" "3.1.0"
47 | functional-red-black-tree "^1.0.1"
48 | regexpp "^3.0.0"
49 | semver "^7.3.2"
50 | tsutils "^3.17.1"
51 |
52 | "@typescript-eslint/experimental-utils@3.1.0":
53 | version "3.1.0"
54 | resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.1.0.tgz#2d5dba7c2ac2a3da3bfa3f461ff64de38587a872"
55 | integrity sha512-Zf8JVC2K1svqPIk1CB/ehCiWPaERJBBokbMfNTNRczCbQSlQXaXtO/7OfYz9wZaecNvdSvVADt6/XQuIxhC79w==
56 | dependencies:
57 | "@types/json-schema" "^7.0.3"
58 | "@typescript-eslint/typescript-estree" "3.1.0"
59 | eslint-scope "^5.0.0"
60 | eslint-utils "^2.0.0"
61 |
62 | "@typescript-eslint/parser@^3.0.0":
63 | version "3.1.0"
64 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.1.0.tgz#9c02ba5d88ad2355672f39e6cd4176f172dd47f8"
65 | integrity sha512-NcDSJK8qTA2tPfyGiPes9HtVKLbksmuYjlgGAUs7Ld2K0swdWibnCq9IJx9kJN8JJdgUJSorFiGaPHBgH81F/Q==
66 | dependencies:
67 | "@types/eslint-visitor-keys" "^1.0.0"
68 | "@typescript-eslint/experimental-utils" "3.1.0"
69 | "@typescript-eslint/typescript-estree" "3.1.0"
70 | eslint-visitor-keys "^1.1.0"
71 |
72 | "@typescript-eslint/typescript-estree@3.1.0":
73 | version "3.1.0"
74 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.1.0.tgz#eaff52d31e615e05b894f8b9d2c3d8af152a5dd2"
75 | integrity sha512-+4nfYauqeQvK55PgFrmBWFVYb6IskLyOosYEmhH3mSVhfBp9AIJnjExdgDmKWoOBHRcPM8Ihfm2BFpZf0euUZQ==
76 | dependencies:
77 | debug "^4.1.1"
78 | eslint-visitor-keys "^1.1.0"
79 | glob "^7.1.6"
80 | is-glob "^4.0.1"
81 | lodash "^4.17.15"
82 | semver "^7.3.2"
83 | tsutils "^3.17.1"
84 |
85 | acorn-jsx@^5.2.0:
86 | version "5.2.0"
87 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe"
88 | integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==
89 |
90 | acorn@^7.1.1:
91 | version "7.2.0"
92 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz#17ea7e40d7c8640ff54a694c889c26f31704effe"
93 | integrity sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==
94 |
95 | ajv@^6.10.0, ajv@^6.10.2:
96 | version "6.12.2"
97 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd"
98 | integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==
99 | dependencies:
100 | fast-deep-equal "^3.1.1"
101 | fast-json-stable-stringify "^2.0.0"
102 | json-schema-traverse "^0.4.1"
103 | uri-js "^4.2.2"
104 |
105 | ansi-escapes@^4.2.1:
106 | version "4.3.1"
107 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61"
108 | integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==
109 | dependencies:
110 | type-fest "^0.11.0"
111 |
112 | ansi-regex@^4.1.0:
113 | version "4.1.0"
114 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
115 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
116 |
117 | ansi-regex@^5.0.0:
118 | version "5.0.0"
119 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
120 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
121 |
122 | ansi-styles@^3.2.0, ansi-styles@^3.2.1:
123 | version "3.2.1"
124 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
125 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
126 | dependencies:
127 | color-convert "^1.9.0"
128 |
129 | ansi-styles@^4.1.0:
130 | version "4.2.1"
131 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
132 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
133 | dependencies:
134 | "@types/color-name" "^1.1.1"
135 | color-convert "^2.0.1"
136 |
137 | argparse@^1.0.7:
138 | version "1.0.10"
139 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
140 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
141 | dependencies:
142 | sprintf-js "~1.0.2"
143 |
144 | array-includes@^3.0.3:
145 | version "3.1.1"
146 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348"
147 | integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==
148 | dependencies:
149 | define-properties "^1.1.3"
150 | es-abstract "^1.17.0"
151 | is-string "^1.0.5"
152 |
153 | array.prototype.flat@^1.2.1:
154 | version "1.2.3"
155 | resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b"
156 | integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==
157 | dependencies:
158 | define-properties "^1.1.3"
159 | es-abstract "^1.17.0-next.1"
160 |
161 | astral-regex@^1.0.0:
162 | version "1.0.0"
163 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
164 | integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
165 |
166 | balanced-match@^1.0.0:
167 | version "1.0.0"
168 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
169 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
170 |
171 | brace-expansion@^1.1.7:
172 | version "1.1.11"
173 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
174 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
175 | dependencies:
176 | balanced-match "^1.0.0"
177 | concat-map "0.0.1"
178 |
179 | callsites@^3.0.0:
180 | version "3.1.0"
181 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
182 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
183 |
184 | chalk@^2.0.0:
185 | version "2.4.2"
186 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
187 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
188 | dependencies:
189 | ansi-styles "^3.2.1"
190 | escape-string-regexp "^1.0.5"
191 | supports-color "^5.3.0"
192 |
193 | chalk@^3.0.0:
194 | version "3.0.0"
195 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
196 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
197 | dependencies:
198 | ansi-styles "^4.1.0"
199 | supports-color "^7.1.0"
200 |
201 | chalk@^4.0.0:
202 | version "4.0.0"
203 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72"
204 | integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==
205 | dependencies:
206 | ansi-styles "^4.1.0"
207 | supports-color "^7.1.0"
208 |
209 | chardet@^0.7.0:
210 | version "0.7.0"
211 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
212 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
213 |
214 | cli-cursor@^3.1.0:
215 | version "3.1.0"
216 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
217 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
218 | dependencies:
219 | restore-cursor "^3.1.0"
220 |
221 | cli-width@^2.0.0:
222 | version "2.2.1"
223 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48"
224 | integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==
225 |
226 | color-convert@^1.9.0:
227 | version "1.9.3"
228 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
229 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
230 | dependencies:
231 | color-name "1.1.3"
232 |
233 | color-convert@^2.0.1:
234 | version "2.0.1"
235 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
236 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
237 | dependencies:
238 | color-name "~1.1.4"
239 |
240 | color-name@1.1.3:
241 | version "1.1.3"
242 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
243 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
244 |
245 | color-name@~1.1.4:
246 | version "1.1.4"
247 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
248 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
249 |
250 | concat-map@0.0.1:
251 | version "0.0.1"
252 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
253 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
254 |
255 | contains-path@^0.1.0:
256 | version "0.1.0"
257 | resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
258 | integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=
259 |
260 | cross-spawn@^7.0.2:
261 | version "7.0.3"
262 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
263 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
264 | dependencies:
265 | path-key "^3.1.0"
266 | shebang-command "^2.0.0"
267 | which "^2.0.1"
268 |
269 | debug@^2.6.9:
270 | version "2.6.9"
271 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
272 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
273 | dependencies:
274 | ms "2.0.0"
275 |
276 | debug@^4.0.1, debug@^4.1.1:
277 | version "4.1.1"
278 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
279 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
280 | dependencies:
281 | ms "^2.1.1"
282 |
283 | deep-is@^0.1.3:
284 | version "0.1.3"
285 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
286 | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
287 |
288 | define-properties@^1.1.2, define-properties@^1.1.3:
289 | version "1.1.3"
290 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
291 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
292 | dependencies:
293 | object-keys "^1.0.12"
294 |
295 | doctrine@1.5.0:
296 | version "1.5.0"
297 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
298 | integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
299 | dependencies:
300 | esutils "^2.0.2"
301 | isarray "^1.0.0"
302 |
303 | doctrine@^3.0.0:
304 | version "3.0.0"
305 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
306 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
307 | dependencies:
308 | esutils "^2.0.2"
309 |
310 | emoji-regex@^7.0.1:
311 | version "7.0.3"
312 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
313 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
314 |
315 | emoji-regex@^8.0.0:
316 | version "8.0.0"
317 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
318 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
319 |
320 | error-ex@^1.2.0:
321 | version "1.3.2"
322 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
323 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
324 | dependencies:
325 | is-arrayish "^0.2.1"
326 |
327 | es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5:
328 | version "1.17.5"
329 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9"
330 | integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==
331 | dependencies:
332 | es-to-primitive "^1.2.1"
333 | function-bind "^1.1.1"
334 | has "^1.0.3"
335 | has-symbols "^1.0.1"
336 | is-callable "^1.1.5"
337 | is-regex "^1.0.5"
338 | object-inspect "^1.7.0"
339 | object-keys "^1.1.1"
340 | object.assign "^4.1.0"
341 | string.prototype.trimleft "^2.1.1"
342 | string.prototype.trimright "^2.1.1"
343 |
344 | es-to-primitive@^1.2.1:
345 | version "1.2.1"
346 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
347 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
348 | dependencies:
349 | is-callable "^1.1.4"
350 | is-date-object "^1.0.1"
351 | is-symbol "^1.0.2"
352 |
353 | escape-string-regexp@^1.0.5:
354 | version "1.0.5"
355 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
356 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
357 |
358 | eslint-config-standard@^14.1.1:
359 | version "14.1.1"
360 | resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea"
361 | integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==
362 |
363 | eslint-import-resolver-node@^0.3.2:
364 | version "0.3.3"
365 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404"
366 | integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==
367 | dependencies:
368 | debug "^2.6.9"
369 | resolve "^1.13.1"
370 |
371 | eslint-module-utils@^2.4.1:
372 | version "2.6.0"
373 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6"
374 | integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==
375 | dependencies:
376 | debug "^2.6.9"
377 | pkg-dir "^2.0.0"
378 |
379 | eslint-plugin-es@^3.0.0:
380 | version "3.0.1"
381 | resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893"
382 | integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==
383 | dependencies:
384 | eslint-utils "^2.0.0"
385 | regexpp "^3.0.0"
386 |
387 | eslint-plugin-import@^2.20.2:
388 | version "2.20.2"
389 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz#91fc3807ce08be4837141272c8b99073906e588d"
390 | integrity sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==
391 | dependencies:
392 | array-includes "^3.0.3"
393 | array.prototype.flat "^1.2.1"
394 | contains-path "^0.1.0"
395 | debug "^2.6.9"
396 | doctrine "1.5.0"
397 | eslint-import-resolver-node "^0.3.2"
398 | eslint-module-utils "^2.4.1"
399 | has "^1.0.3"
400 | minimatch "^3.0.4"
401 | object.values "^1.1.0"
402 | read-pkg-up "^2.0.0"
403 | resolve "^1.12.0"
404 |
405 | eslint-plugin-node@^11.1.0:
406 | version "11.1.0"
407 | resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d"
408 | integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==
409 | dependencies:
410 | eslint-plugin-es "^3.0.0"
411 | eslint-utils "^2.0.0"
412 | ignore "^5.1.1"
413 | minimatch "^3.0.4"
414 | resolve "^1.10.1"
415 | semver "^6.1.0"
416 |
417 | eslint-plugin-promise@^4.2.1:
418 | version "4.2.1"
419 | resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a"
420 | integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==
421 |
422 | eslint-plugin-standard@^4.0.1:
423 | version "4.0.1"
424 | resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4"
425 | integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==
426 |
427 | eslint-plugin-vue@^6.2.2:
428 | version "6.2.2"
429 | resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz#27fecd9a3a24789b0f111ecdd540a9e56198e0fe"
430 | integrity sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==
431 | dependencies:
432 | natural-compare "^1.4.0"
433 | semver "^5.6.0"
434 | vue-eslint-parser "^7.0.0"
435 |
436 | eslint-scope@^5.0.0:
437 | version "5.0.0"
438 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9"
439 | integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==
440 | dependencies:
441 | esrecurse "^4.1.0"
442 | estraverse "^4.1.1"
443 |
444 | eslint-utils@^2.0.0:
445 | version "2.0.0"
446 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd"
447 | integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==
448 | dependencies:
449 | eslint-visitor-keys "^1.1.0"
450 |
451 | eslint-visitor-keys@^1.1.0:
452 | version "1.1.0"
453 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
454 | integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
455 |
456 | eslint@^7.1.0:
457 | version "7.1.0"
458 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.1.0.tgz#d9a1df25e5b7859b0a3d86bb05f0940ab676a851"
459 | integrity sha512-DfS3b8iHMK5z/YLSme8K5cge168I8j8o1uiVmFCgnnjxZQbCGyraF8bMl7Ju4yfBmCuxD7shOF7eqGkcuIHfsA==
460 | dependencies:
461 | "@babel/code-frame" "^7.0.0"
462 | ajv "^6.10.0"
463 | chalk "^4.0.0"
464 | cross-spawn "^7.0.2"
465 | debug "^4.0.1"
466 | doctrine "^3.0.0"
467 | eslint-scope "^5.0.0"
468 | eslint-utils "^2.0.0"
469 | eslint-visitor-keys "^1.1.0"
470 | espree "^7.0.0"
471 | esquery "^1.2.0"
472 | esutils "^2.0.2"
473 | file-entry-cache "^5.0.1"
474 | functional-red-black-tree "^1.0.1"
475 | glob-parent "^5.0.0"
476 | globals "^12.1.0"
477 | ignore "^4.0.6"
478 | import-fresh "^3.0.0"
479 | imurmurhash "^0.1.4"
480 | inquirer "^7.0.0"
481 | is-glob "^4.0.0"
482 | js-yaml "^3.13.1"
483 | json-stable-stringify-without-jsonify "^1.0.1"
484 | levn "^0.4.1"
485 | lodash "^4.17.14"
486 | minimatch "^3.0.4"
487 | natural-compare "^1.4.0"
488 | optionator "^0.9.1"
489 | progress "^2.0.0"
490 | regexpp "^3.1.0"
491 | semver "^7.2.1"
492 | strip-ansi "^6.0.0"
493 | strip-json-comments "^3.1.0"
494 | table "^5.2.3"
495 | text-table "^0.2.0"
496 | v8-compile-cache "^2.0.3"
497 |
498 | espree@^6.2.1:
499 | version "6.2.1"
500 | resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a"
501 | integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==
502 | dependencies:
503 | acorn "^7.1.1"
504 | acorn-jsx "^5.2.0"
505 | eslint-visitor-keys "^1.1.0"
506 |
507 | espree@^7.0.0:
508 | version "7.0.0"
509 | resolved "https://registry.yarnpkg.com/espree/-/espree-7.0.0.tgz#8a7a60f218e69f120a842dc24c5a88aa7748a74e"
510 | integrity sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw==
511 | dependencies:
512 | acorn "^7.1.1"
513 | acorn-jsx "^5.2.0"
514 | eslint-visitor-keys "^1.1.0"
515 |
516 | esprima@^4.0.0:
517 | version "4.0.1"
518 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
519 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
520 |
521 | esquery@^1.0.1, esquery@^1.2.0:
522 | version "1.3.1"
523 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
524 | integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
525 | dependencies:
526 | estraverse "^5.1.0"
527 |
528 | esrecurse@^4.1.0:
529 | version "4.2.1"
530 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
531 | integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==
532 | dependencies:
533 | estraverse "^4.1.0"
534 |
535 | estraverse@^4.1.0, estraverse@^4.1.1:
536 | version "4.3.0"
537 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
538 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
539 |
540 | estraverse@^5.1.0:
541 | version "5.1.0"
542 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642"
543 | integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==
544 |
545 | esutils@^2.0.2:
546 | version "2.0.3"
547 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
548 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
549 |
550 | external-editor@^3.0.3:
551 | version "3.1.0"
552 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
553 | integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
554 | dependencies:
555 | chardet "^0.7.0"
556 | iconv-lite "^0.4.24"
557 | tmp "^0.0.33"
558 |
559 | fast-deep-equal@^3.1.1:
560 | version "3.1.1"
561 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4"
562 | integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==
563 |
564 | fast-json-stable-stringify@^2.0.0:
565 | version "2.1.0"
566 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
567 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
568 |
569 | fast-levenshtein@^2.0.6:
570 | version "2.0.6"
571 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
572 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
573 |
574 | figures@^3.0.0:
575 | version "3.2.0"
576 | resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
577 | integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
578 | dependencies:
579 | escape-string-regexp "^1.0.5"
580 |
581 | file-entry-cache@^5.0.1:
582 | version "5.0.1"
583 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
584 | integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
585 | dependencies:
586 | flat-cache "^2.0.1"
587 |
588 | find-up@^2.0.0, find-up@^2.1.0:
589 | version "2.1.0"
590 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
591 | integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
592 | dependencies:
593 | locate-path "^2.0.0"
594 |
595 | flat-cache@^2.0.1:
596 | version "2.0.1"
597 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
598 | integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
599 | dependencies:
600 | flatted "^2.0.0"
601 | rimraf "2.6.3"
602 | write "1.0.3"
603 |
604 | flatted@^2.0.0:
605 | version "2.0.2"
606 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
607 | integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
608 |
609 | fs.realpath@^1.0.0:
610 | version "1.0.0"
611 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
612 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
613 |
614 | function-bind@^1.1.1:
615 | version "1.1.1"
616 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
617 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
618 |
619 | functional-red-black-tree@^1.0.1:
620 | version "1.0.1"
621 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
622 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
623 |
624 | glob-parent@^5.0.0:
625 | version "5.1.1"
626 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
627 | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
628 | dependencies:
629 | is-glob "^4.0.1"
630 |
631 | glob@^7.1.3, glob@^7.1.6:
632 | version "7.1.6"
633 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
634 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
635 | dependencies:
636 | fs.realpath "^1.0.0"
637 | inflight "^1.0.4"
638 | inherits "2"
639 | minimatch "^3.0.4"
640 | once "^1.3.0"
641 | path-is-absolute "^1.0.0"
642 |
643 | globals@^12.1.0:
644 | version "12.4.0"
645 | resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8"
646 | integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==
647 | dependencies:
648 | type-fest "^0.8.1"
649 |
650 | graceful-fs@^4.1.2:
651 | version "4.2.4"
652 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
653 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
654 |
655 | has-flag@^3.0.0:
656 | version "3.0.0"
657 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
658 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
659 |
660 | has-flag@^4.0.0:
661 | version "4.0.0"
662 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
663 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
664 |
665 | has-symbols@^1.0.0, has-symbols@^1.0.1:
666 | version "1.0.1"
667 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
668 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
669 |
670 | has@^1.0.3:
671 | version "1.0.3"
672 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
673 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
674 | dependencies:
675 | function-bind "^1.1.1"
676 |
677 | hosted-git-info@^2.1.4:
678 | version "2.8.8"
679 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
680 | integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==
681 |
682 | iconv-lite@^0.4.24:
683 | version "0.4.24"
684 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
685 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
686 | dependencies:
687 | safer-buffer ">= 2.1.2 < 3"
688 |
689 | ignore@^4.0.6:
690 | version "4.0.6"
691 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
692 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
693 |
694 | ignore@^5.1.1:
695 | version "5.1.8"
696 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
697 | integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
698 |
699 | import-fresh@^3.0.0:
700 | version "3.2.1"
701 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
702 | integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==
703 | dependencies:
704 | parent-module "^1.0.0"
705 | resolve-from "^4.0.0"
706 |
707 | imurmurhash@^0.1.4:
708 | version "0.1.4"
709 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
710 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
711 |
712 | inflight@^1.0.4:
713 | version "1.0.6"
714 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
715 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
716 | dependencies:
717 | once "^1.3.0"
718 | wrappy "1"
719 |
720 | inherits@2:
721 | version "2.0.4"
722 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
723 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
724 |
725 | inquirer@^7.0.0:
726 | version "7.1.0"
727 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29"
728 | integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==
729 | dependencies:
730 | ansi-escapes "^4.2.1"
731 | chalk "^3.0.0"
732 | cli-cursor "^3.1.0"
733 | cli-width "^2.0.0"
734 | external-editor "^3.0.3"
735 | figures "^3.0.0"
736 | lodash "^4.17.15"
737 | mute-stream "0.0.8"
738 | run-async "^2.4.0"
739 | rxjs "^6.5.3"
740 | string-width "^4.1.0"
741 | strip-ansi "^6.0.0"
742 | through "^2.3.6"
743 |
744 | is-arrayish@^0.2.1:
745 | version "0.2.1"
746 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
747 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
748 |
749 | is-callable@^1.1.4, is-callable@^1.1.5:
750 | version "1.2.0"
751 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb"
752 | integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==
753 |
754 | is-date-object@^1.0.1:
755 | version "1.0.2"
756 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
757 | integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
758 |
759 | is-extglob@^2.1.1:
760 | version "2.1.1"
761 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
762 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
763 |
764 | is-fullwidth-code-point@^2.0.0:
765 | version "2.0.0"
766 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
767 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
768 |
769 | is-fullwidth-code-point@^3.0.0:
770 | version "3.0.0"
771 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
772 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
773 |
774 | is-glob@^4.0.0, is-glob@^4.0.1:
775 | version "4.0.1"
776 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
777 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
778 | dependencies:
779 | is-extglob "^2.1.1"
780 |
781 | is-regex@^1.0.5:
782 | version "1.0.5"
783 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
784 | integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
785 | dependencies:
786 | has "^1.0.3"
787 |
788 | is-string@^1.0.5:
789 | version "1.0.5"
790 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6"
791 | integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==
792 |
793 | is-symbol@^1.0.2:
794 | version "1.0.3"
795 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
796 | integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==
797 | dependencies:
798 | has-symbols "^1.0.1"
799 |
800 | isarray@^1.0.0:
801 | version "1.0.0"
802 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
803 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
804 |
805 | isexe@^2.0.0:
806 | version "2.0.0"
807 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
808 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
809 |
810 | js-tokens@^4.0.0:
811 | version "4.0.0"
812 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
813 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
814 |
815 | js-yaml@^3.13.1:
816 | version "3.14.0"
817 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
818 | integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==
819 | dependencies:
820 | argparse "^1.0.7"
821 | esprima "^4.0.0"
822 |
823 | json-schema-traverse@^0.4.1:
824 | version "0.4.1"
825 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
826 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
827 |
828 | json-stable-stringify-without-jsonify@^1.0.1:
829 | version "1.0.1"
830 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
831 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
832 |
833 | levn@^0.4.1:
834 | version "0.4.1"
835 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
836 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
837 | dependencies:
838 | prelude-ls "^1.2.1"
839 | type-check "~0.4.0"
840 |
841 | load-json-file@^2.0.0:
842 | version "2.0.0"
843 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
844 | integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
845 | dependencies:
846 | graceful-fs "^4.1.2"
847 | parse-json "^2.2.0"
848 | pify "^2.0.0"
849 | strip-bom "^3.0.0"
850 |
851 | locate-path@^2.0.0:
852 | version "2.0.0"
853 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
854 | integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
855 | dependencies:
856 | p-locate "^2.0.0"
857 | path-exists "^3.0.0"
858 |
859 | lodash@^4.17.14, lodash@^4.17.15:
860 | version "4.17.15"
861 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
862 | integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
863 |
864 | mimic-fn@^2.1.0:
865 | version "2.1.0"
866 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
867 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
868 |
869 | minimatch@^3.0.4:
870 | version "3.0.4"
871 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
872 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
873 | dependencies:
874 | brace-expansion "^1.1.7"
875 |
876 | minimist@^1.2.5:
877 | version "1.2.5"
878 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
879 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
880 |
881 | mkdirp@^0.5.1:
882 | version "0.5.5"
883 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
884 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
885 | dependencies:
886 | minimist "^1.2.5"
887 |
888 | ms@2.0.0:
889 | version "2.0.0"
890 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
891 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
892 |
893 | ms@^2.1.1:
894 | version "2.1.2"
895 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
896 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
897 |
898 | mute-stream@0.0.8:
899 | version "0.0.8"
900 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
901 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
902 |
903 | natural-compare@^1.4.0:
904 | version "1.4.0"
905 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
906 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
907 |
908 | normalize-package-data@^2.3.2:
909 | version "2.5.0"
910 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
911 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
912 | dependencies:
913 | hosted-git-info "^2.1.4"
914 | resolve "^1.10.0"
915 | semver "2 || 3 || 4 || 5"
916 | validate-npm-package-license "^3.0.1"
917 |
918 | object-inspect@^1.7.0:
919 | version "1.7.0"
920 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
921 | integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
922 |
923 | object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
924 | version "1.1.1"
925 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
926 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
927 |
928 | object.assign@^4.1.0:
929 | version "4.1.0"
930 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
931 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
932 | dependencies:
933 | define-properties "^1.1.2"
934 | function-bind "^1.1.1"
935 | has-symbols "^1.0.0"
936 | object-keys "^1.0.11"
937 |
938 | object.values@^1.1.0:
939 | version "1.1.1"
940 | resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e"
941 | integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==
942 | dependencies:
943 | define-properties "^1.1.3"
944 | es-abstract "^1.17.0-next.1"
945 | function-bind "^1.1.1"
946 | has "^1.0.3"
947 |
948 | once@^1.3.0:
949 | version "1.4.0"
950 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
951 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
952 | dependencies:
953 | wrappy "1"
954 |
955 | onetime@^5.1.0:
956 | version "5.1.0"
957 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5"
958 | integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==
959 | dependencies:
960 | mimic-fn "^2.1.0"
961 |
962 | optionator@^0.9.1:
963 | version "0.9.1"
964 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
965 | integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
966 | dependencies:
967 | deep-is "^0.1.3"
968 | fast-levenshtein "^2.0.6"
969 | levn "^0.4.1"
970 | prelude-ls "^1.2.1"
971 | type-check "^0.4.0"
972 | word-wrap "^1.2.3"
973 |
974 | os-tmpdir@~1.0.2:
975 | version "1.0.2"
976 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
977 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
978 |
979 | p-limit@^1.1.0:
980 | version "1.3.0"
981 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
982 | integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
983 | dependencies:
984 | p-try "^1.0.0"
985 |
986 | p-locate@^2.0.0:
987 | version "2.0.0"
988 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
989 | integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
990 | dependencies:
991 | p-limit "^1.1.0"
992 |
993 | p-try@^1.0.0:
994 | version "1.0.0"
995 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
996 | integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
997 |
998 | parent-module@^1.0.0:
999 | version "1.0.1"
1000 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
1001 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
1002 | dependencies:
1003 | callsites "^3.0.0"
1004 |
1005 | parse-json@^2.2.0:
1006 | version "2.2.0"
1007 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
1008 | integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
1009 | dependencies:
1010 | error-ex "^1.2.0"
1011 |
1012 | path-exists@^3.0.0:
1013 | version "3.0.0"
1014 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
1015 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
1016 |
1017 | path-is-absolute@^1.0.0:
1018 | version "1.0.1"
1019 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
1020 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
1021 |
1022 | path-key@^3.1.0:
1023 | version "3.1.1"
1024 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
1025 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
1026 |
1027 | path-parse@^1.0.6:
1028 | version "1.0.6"
1029 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
1030 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
1031 |
1032 | path-type@^2.0.0:
1033 | version "2.0.0"
1034 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
1035 | integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
1036 | dependencies:
1037 | pify "^2.0.0"
1038 |
1039 | pify@^2.0.0:
1040 | version "2.3.0"
1041 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
1042 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
1043 |
1044 | pkg-dir@^2.0.0:
1045 | version "2.0.0"
1046 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
1047 | integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
1048 | dependencies:
1049 | find-up "^2.1.0"
1050 |
1051 | prelude-ls@^1.2.1:
1052 | version "1.2.1"
1053 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
1054 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
1055 |
1056 | progress@^2.0.0:
1057 | version "2.0.3"
1058 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
1059 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
1060 |
1061 | punycode@^2.1.0:
1062 | version "2.1.1"
1063 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
1064 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
1065 |
1066 | read-pkg-up@^2.0.0:
1067 | version "2.0.0"
1068 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
1069 | integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
1070 | dependencies:
1071 | find-up "^2.0.0"
1072 | read-pkg "^2.0.0"
1073 |
1074 | read-pkg@^2.0.0:
1075 | version "2.0.0"
1076 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
1077 | integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
1078 | dependencies:
1079 | load-json-file "^2.0.0"
1080 | normalize-package-data "^2.3.2"
1081 | path-type "^2.0.0"
1082 |
1083 | regexpp@^3.0.0, regexpp@^3.1.0:
1084 | version "3.1.0"
1085 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2"
1086 | integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==
1087 |
1088 | resolve-from@^4.0.0:
1089 | version "4.0.0"
1090 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
1091 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
1092 |
1093 | resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1:
1094 | version "1.17.0"
1095 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
1096 | integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
1097 | dependencies:
1098 | path-parse "^1.0.6"
1099 |
1100 | restore-cursor@^3.1.0:
1101 | version "3.1.0"
1102 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
1103 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
1104 | dependencies:
1105 | onetime "^5.1.0"
1106 | signal-exit "^3.0.2"
1107 |
1108 | rimraf@2.6.3:
1109 | version "2.6.3"
1110 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
1111 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
1112 | dependencies:
1113 | glob "^7.1.3"
1114 |
1115 | run-async@^2.4.0:
1116 | version "2.4.1"
1117 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
1118 | integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
1119 |
1120 | rxjs@^6.5.3:
1121 | version "6.5.5"
1122 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec"
1123 | integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==
1124 | dependencies:
1125 | tslib "^1.9.0"
1126 |
1127 | "safer-buffer@>= 2.1.2 < 3":
1128 | version "2.1.2"
1129 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
1130 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
1131 |
1132 | "semver@2 || 3 || 4 || 5", semver@^5.6.0:
1133 | version "5.7.1"
1134 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
1135 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
1136 |
1137 | semver@^6.1.0:
1138 | version "6.3.0"
1139 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
1140 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
1141 |
1142 | semver@^7.2.1, semver@^7.3.2:
1143 | version "7.3.2"
1144 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
1145 | integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
1146 |
1147 | shebang-command@^2.0.0:
1148 | version "2.0.0"
1149 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
1150 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
1151 | dependencies:
1152 | shebang-regex "^3.0.0"
1153 |
1154 | shebang-regex@^3.0.0:
1155 | version "3.0.0"
1156 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
1157 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
1158 |
1159 | signal-exit@^3.0.2:
1160 | version "3.0.3"
1161 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
1162 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
1163 |
1164 | slice-ansi@^2.1.0:
1165 | version "2.1.0"
1166 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
1167 | integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
1168 | dependencies:
1169 | ansi-styles "^3.2.0"
1170 | astral-regex "^1.0.0"
1171 | is-fullwidth-code-point "^2.0.0"
1172 |
1173 | spdx-correct@^3.0.0:
1174 | version "3.1.1"
1175 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
1176 | integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
1177 | dependencies:
1178 | spdx-expression-parse "^3.0.0"
1179 | spdx-license-ids "^3.0.0"
1180 |
1181 | spdx-exceptions@^2.1.0:
1182 | version "2.3.0"
1183 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
1184 | integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
1185 |
1186 | spdx-expression-parse@^3.0.0:
1187 | version "3.0.1"
1188 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
1189 | integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
1190 | dependencies:
1191 | spdx-exceptions "^2.1.0"
1192 | spdx-license-ids "^3.0.0"
1193 |
1194 | spdx-license-ids@^3.0.0:
1195 | version "3.0.5"
1196 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654"
1197 | integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==
1198 |
1199 | sprintf-js@~1.0.2:
1200 | version "1.0.3"
1201 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
1202 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
1203 |
1204 | string-width@^3.0.0:
1205 | version "3.1.0"
1206 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
1207 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
1208 | dependencies:
1209 | emoji-regex "^7.0.1"
1210 | is-fullwidth-code-point "^2.0.0"
1211 | strip-ansi "^5.1.0"
1212 |
1213 | string-width@^4.1.0:
1214 | version "4.2.0"
1215 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
1216 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
1217 | dependencies:
1218 | emoji-regex "^8.0.0"
1219 | is-fullwidth-code-point "^3.0.0"
1220 | strip-ansi "^6.0.0"
1221 |
1222 | string.prototype.trimend@^1.0.0:
1223 | version "1.0.1"
1224 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913"
1225 | integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==
1226 | dependencies:
1227 | define-properties "^1.1.3"
1228 | es-abstract "^1.17.5"
1229 |
1230 | string.prototype.trimleft@^2.1.1:
1231 | version "2.1.2"
1232 | resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc"
1233 | integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==
1234 | dependencies:
1235 | define-properties "^1.1.3"
1236 | es-abstract "^1.17.5"
1237 | string.prototype.trimstart "^1.0.0"
1238 |
1239 | string.prototype.trimright@^2.1.1:
1240 | version "2.1.2"
1241 | resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3"
1242 | integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==
1243 | dependencies:
1244 | define-properties "^1.1.3"
1245 | es-abstract "^1.17.5"
1246 | string.prototype.trimend "^1.0.0"
1247 |
1248 | string.prototype.trimstart@^1.0.0:
1249 | version "1.0.1"
1250 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54"
1251 | integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==
1252 | dependencies:
1253 | define-properties "^1.1.3"
1254 | es-abstract "^1.17.5"
1255 |
1256 | strip-ansi@^5.1.0:
1257 | version "5.2.0"
1258 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
1259 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
1260 | dependencies:
1261 | ansi-regex "^4.1.0"
1262 |
1263 | strip-ansi@^6.0.0:
1264 | version "6.0.0"
1265 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
1266 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
1267 | dependencies:
1268 | ansi-regex "^5.0.0"
1269 |
1270 | strip-bom@^3.0.0:
1271 | version "3.0.0"
1272 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
1273 | integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
1274 |
1275 | strip-json-comments@^3.1.0:
1276 | version "3.1.0"
1277 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180"
1278 | integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==
1279 |
1280 | supports-color@^5.3.0:
1281 | version "5.5.0"
1282 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
1283 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
1284 | dependencies:
1285 | has-flag "^3.0.0"
1286 |
1287 | supports-color@^7.1.0:
1288 | version "7.1.0"
1289 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
1290 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
1291 | dependencies:
1292 | has-flag "^4.0.0"
1293 |
1294 | table@^5.2.3:
1295 | version "5.4.6"
1296 | resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
1297 | integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
1298 | dependencies:
1299 | ajv "^6.10.2"
1300 | lodash "^4.17.14"
1301 | slice-ansi "^2.1.0"
1302 | string-width "^3.0.0"
1303 |
1304 | text-table@^0.2.0:
1305 | version "0.2.0"
1306 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
1307 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
1308 |
1309 | through@^2.3.6:
1310 | version "2.3.8"
1311 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
1312 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
1313 |
1314 | tmp@^0.0.33:
1315 | version "0.0.33"
1316 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
1317 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
1318 | dependencies:
1319 | os-tmpdir "~1.0.2"
1320 |
1321 | tslib@^1.8.1, tslib@^1.9.0:
1322 | version "1.13.0"
1323 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
1324 | integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
1325 |
1326 | tsutils@^3.17.1:
1327 | version "3.17.1"
1328 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
1329 | integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==
1330 | dependencies:
1331 | tslib "^1.8.1"
1332 |
1333 | type-check@^0.4.0, type-check@~0.4.0:
1334 | version "0.4.0"
1335 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
1336 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
1337 | dependencies:
1338 | prelude-ls "^1.2.1"
1339 |
1340 | type-fest@^0.11.0:
1341 | version "0.11.0"
1342 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1"
1343 | integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==
1344 |
1345 | type-fest@^0.8.1:
1346 | version "0.8.1"
1347 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
1348 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
1349 |
1350 | typescript@^3.9.3:
1351 | version "3.9.3"
1352 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a"
1353 | integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==
1354 |
1355 | uri-js@^4.2.2:
1356 | version "4.2.2"
1357 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
1358 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==
1359 | dependencies:
1360 | punycode "^2.1.0"
1361 |
1362 | v8-compile-cache@^2.0.3:
1363 | version "2.1.1"
1364 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745"
1365 | integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==
1366 |
1367 | validate-npm-package-license@^3.0.1:
1368 | version "3.0.4"
1369 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
1370 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
1371 | dependencies:
1372 | spdx-correct "^3.0.0"
1373 | spdx-expression-parse "^3.0.0"
1374 |
1375 | vue-eslint-parser@^7.0.0:
1376 | version "7.1.0"
1377 | resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.1.0.tgz#9cdbcc823e656b087507a1911732b867ac101e83"
1378 | integrity sha512-Kr21uPfthDc63nDl27AGQEhtt9VrZ9nkYk/NTftJ2ws9XiJwzJJCnCr3AITQ2jpRMA0XPGDECxYH8E027qMK9Q==
1379 | dependencies:
1380 | debug "^4.1.1"
1381 | eslint-scope "^5.0.0"
1382 | eslint-visitor-keys "^1.1.0"
1383 | espree "^6.2.1"
1384 | esquery "^1.0.1"
1385 | lodash "^4.17.15"
1386 |
1387 | which@^2.0.1:
1388 | version "2.0.2"
1389 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
1390 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
1391 | dependencies:
1392 | isexe "^2.0.0"
1393 |
1394 | word-wrap@^1.2.3:
1395 | version "1.2.3"
1396 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
1397 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
1398 |
1399 | wrappy@1:
1400 | version "1.0.2"
1401 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
1402 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
1403 |
1404 | write@1.0.3:
1405 | version "1.0.3"
1406 | resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
1407 | integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
1408 | dependencies:
1409 | mkdirp "^0.5.1"
1410 |
--------------------------------------------------------------------------------