├── .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 | 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 | 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 `![bar](bar.jpg =100x*)` 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 `![bar](bar.jpg =100x*)` 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 | 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 | ![](http://www.example.com/image.jpg) 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 | ![](http://www.example.com/image.jpg) 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 | 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 | 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 | 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 | 37 | 38 | 230 | 231 | 244 | -------------------------------------------------------------------------------- /packages/web/src/components/SimpleMde.vue: -------------------------------------------------------------------------------- 1 | 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 | --------------------------------------------------------------------------------