Merge pull request #5 from patarapolw/next

Static site generator and GitHub integration
This commit is contained in:
polv authored and GitHub committed 2020-12-17 19:25:53 +07:00
commit 9b29374637
75 files changed
+990 -727

No files matched your search

-4
View File
@@ -1,4 +0,0 @@
#!/usr/bin/zsh
# current directory is always `.git/..` root
# echo $PWD
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -6,6 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">天地玄黃,宇宙洪荒。</h3> <h3 class="text-center">天地玄黃,宇宙洪荒。</h3>
</div> </div>
@@ -45,6 +46,7 @@ tag:
<figcaption class="text-center">huang1</figcaption> <figcaption class="text-center">huang1</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,6 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">日月盈昃,辰宿列張。</h3> <h3 class="text-center">日月盈昃,辰宿列張。</h3>
</div> </div>
@@ -45,6 +46,7 @@ tag:
<figcaption class="text-center">zhang1</figcaption> <figcaption class="text-center">zhang1</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,7 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">寒來暑往,秋收冬藏。</h3> <h3 class="text-center">寒來暑往,秋收冬藏。</h3>
</div> </div>
@@ -46,6 +46,7 @@ tag:
<figcaption class="text-center">cang2</figcaption> <figcaption class="text-center">cang2</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,7 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">閏餘成歲,律呂調陽。</h3> <h3 class="text-center">閏餘成歲,律呂調陽。</h3>
</div> </div>
@@ -46,6 +46,7 @@ tag:
<figcaption class="text-center">yang2</figcaption> <figcaption class="text-center">yang2</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,6 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">雲騰致雨,露結為霜。</h3> <h3 class="text-center">雲騰致雨,露結為霜。</h3>
</div> </div>
@@ -45,6 +46,7 @@ tag:
<figcaption class="text-center">shuang1</figcaption> <figcaption class="text-center">shuang1</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,6 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">金生麗水,玉出崑岡。</h3> <h3 class="text-center">金生麗水,玉出崑岡。</h3>
</div> </div>
@@ -45,6 +46,7 @@ tag:
<figcaption class="text-center">gang1</figcaption> <figcaption class="text-center">gang1</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,6 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">劍號巨闕,珠稱夜光。</h3> <h3 class="text-center">劍號巨闕,珠稱夜光。</h3>
</div> </div>
@@ -45,6 +46,7 @@ tag:
<figcaption class="text-center">guang1</figcaption> <figcaption class="text-center">guang1</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,6 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">果珍李柰,菜重芥薑。</h3> <h3 class="text-center">果珍李柰,菜重芥薑。</h3>
</div> </div>
@@ -45,6 +46,7 @@ tag:
<figcaption class="text-center">jiang1</figcaption> <figcaption class="text-center">jiang1</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,6 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">海咸河淡,鱗潛羽翔。</h3> <h3 class="text-center">海咸河淡,鱗潛羽翔。</h3>
</div> </div>
@@ -45,6 +46,7 @@ tag:
<figcaption class="text-center">xiang2</figcaption> <figcaption class="text-center">xiang2</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,6 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">龍師火帝,鳥官人皇。</h3> <h3 class="text-center">龍師火帝,鳥官人皇。</h3>
</div> </div>
@@ -45,6 +46,7 @@ tag:
<figcaption class="text-center">huang1</figcaption> <figcaption class="text-center">huang1</figcaption>
</figure> </figure>
</div> </div>
</center>
<!-- excerpt_separator --> <!-- excerpt_separator -->
@@ -6,6 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">始制文字,乃服衣裳。</h3> <h3 class="text-center">始制文字,乃服衣裳。</h3>
</div> </div>
@@ -45,6 +46,7 @@ tag:
<figcaption class="text-center">chang2</figcaption> <figcaption class="text-center">chang2</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,6 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">推位讓國,有虞陶唐。</h3> <h3 class="text-center">推位讓國,有虞陶唐。</h3>
</div> </div>
@@ -45,6 +46,7 @@ tag:
<figcaption class="text-center">tang2</figcaption> <figcaption class="text-center">tang2</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,6 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">弔民伐罪,周發殷湯。</h3> <h3 class="text-center">弔民伐罪,周發殷湯。</h3>
</div> </div>
@@ -45,6 +46,7 @@ tag:
<figcaption class="text-center">tang1</figcaption> <figcaption class="text-center">tang1</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,6 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">坐朝問道,垂拱平章。</h3> <h3 class="text-center">坐朝問道,垂拱平章。</h3>
</div> </div>
@@ -45,6 +46,7 @@ tag:
<figcaption class="text-center">zhang1</figcaption> <figcaption class="text-center">zhang1</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,6 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">愛育黎首,臣伏戎羌。</h3> <h3 class="text-center">愛育黎首,臣伏戎羌。</h3>
</div> </div>
@@ -45,6 +46,7 @@ tag:
<figcaption class="text-center">qiang1</figcaption> <figcaption class="text-center">qiang1</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,6 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">遐邇一體,率賓歸王。</h3> <h3 class="text-center">遐邇一體,率賓歸王。</h3>
</div> </div>
@@ -45,6 +46,7 @@ tag:
<figcaption class="text-center">wang2</figcaption> <figcaption class="text-center">wang2</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,6 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">鳴鳳在竹,白駒食場。</h3> <h3 class="text-center">鳴鳳在竹,白駒食場。</h3>
</div> </div>
@@ -45,6 +46,7 @@ tag:
<figcaption class="text-center">chang2</figcaption> <figcaption class="text-center">chang2</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,7 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">化被草木,賴及萬方。</h3> <h3 class="text-center">化被草木,賴及萬方。</h3>
</div> </div>
@@ -46,6 +46,7 @@ tag:
<figcaption class="text-center">fang1</figcaption> <figcaption class="text-center">fang1</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,6 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">蓋此身髮,四大五常。</h3> <h3 class="text-center">蓋此身髮,四大五常。</h3>
</div> </div>
@@ -45,6 +46,7 @@ tag:
<figcaption class="text-center">chang2</figcaption> <figcaption class="text-center">chang2</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,6 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">恭惟鞠養,豈敢毀傷。</h3> <h3 class="text-center">恭惟鞠養,豈敢毀傷。</h3>
</div> </div>
@@ -45,6 +46,7 @@ tag:
<figcaption class="text-center">shang1</figcaption> <figcaption class="text-center">shang1</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
@@ -6,6 +6,7 @@ tag:
- 汉字 - 汉字
--- ---
<center>
<div class="w-100 mt-3"> <div class="w-100 mt-3">
<h3 class="text-center">女慕貞絜,男效才良。</h3> <h3 class="text-center">女慕貞絜,男效才良。</h3>
</div> </div>
@@ -45,6 +46,7 @@ tag:
<figcaption class="text-center">liang2</figcaption> <figcaption class="text-center">liang2</figcaption>
</figure> </figure>
</div> </div>
</center>
<style> <style>
img[height="100"] { img[height="100"] {
+8
View File
@@ -0,0 +1,8 @@
{
"presets": ["@babel/preset-typescript"],
"plugins": [
"@babel/plugin-proposal-class-properties",
"@babel/plugin-transform-object-assign",
"@babel/plugin-proposal-object-rest-spread"
]
}
-19
View File
@@ -1,19 +0,0 @@
# This file specifies files that are *not* uploaded to Google Cloud Platform
# using gcloud. It follows the same syntax as .gitignore, with the addition of
# "#!include" directives (which insert the entries of the given .gitignore-style
# file at that point).
#
# For more information, run:
# $ gcloud topic gcloudignore
#
.gcloudignore
# If you would like to upload your .git directory, .gitignore file or files
# from your .gitignore file, remove the corresponding line
# below:
.git
.gitignore
# Node.js dependencies:
node_modules/
/scripts/
+2 -1
View File
@@ -89,5 +89,6 @@ sw.*
# Vim swap files # Vim swap files
*.swp *.swp
/built/ /build/
/static/media/ /static/media/
/*-dist/
+4
View File
@@ -0,0 +1,4 @@
server/
scripts/
lambda/
lambda-dist/
-20
View File
@@ -1,20 +0,0 @@
runtime: nodejs12
instance_class: F2
handlers:
- url: /_nuxt
static_dir: .nuxt/dist/client
secure: always
- url: /(.*\.(gif|png|jpg|ico|txt))$
static_files: static/\1
upload: static/.*\.(gif|png|jpg|ico|txt)$
secure: always
- url: /.*
script: auto
secure: always
env_variables:
HOST: '0.0.0.0'
+1 -1
View File
@@ -2,5 +2,5 @@ interface IPostTeaser {
title: string title: string
path: string path: string
date?: string date?: string
excerpt: string excerptHtml: string
} }
+43 -7
View File
@@ -51,13 +51,18 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { Vue, Component, Prop } from 'nuxt-property-decorator' import { Vue, Component, Prop, Watch } from 'nuxt-property-decorator'
@Component @Component
export default class PostQuery extends Vue { export default class PostQuery extends Vue {
@Prop({ required: true }) posts!: IPostTeaser[] @Prop({ required: true }) posts!: IPostTeaser[]
@Prop({ required: true }) count!: number @Prop({ required: true }) count!: number
readonly defaults = {
posts: this.posts,
count: this.count,
}
get page() { get page() {
return parseInt((this.$route.query.page as string) || '1') return parseInt((this.$route.query.page as string) || '1')
} }
@@ -66,14 +71,45 @@ export default class PostQuery extends Vue {
return Math.ceil(this.count / 5) return Math.ceil(this.count / 5)
} }
makePageUrl(page: number) { makePageUrl(p: number) {
let path = this.$route.path
if (!(path.startsWith('/tag') || path.startsWith('/blog'))) {
path = '/blog'
}
path = path.replace(/\d+$/, '').replace(/\/$/, '')
if (p > 1) {
path = path + '/' + p
}
return this.$router.resolve({ return this.$router.resolve({
path: this.$route.path, path,
query: { query: this.$route.query,
...this.$route.query,
page: page.toString(),
},
}).href }).href
} }
@Watch('$route.params.page')
@Watch('$route.params.tag')
async updatePosts() {
if (this.$route.query.q) {
const ps = await this.$axios.$post(
'/.netlify/functions/search',
undefined,
{
params: {
q: this.$route.query.q,
page: this.$route.params.page,
tag: this.$route.params.tag,
},
}
)
this.count = ps.count
this.$set(this, 'posts', ps.result)
} else {
this.count = this.defaults.count
this.$set(this, 'posts', this.defaults.posts)
}
}
} }
</script> </script>
+2 -2
View File
@@ -1,7 +1,7 @@
<template> <template>
<section> <section>
<h2> <h2>
<nuxt-link :to="'post/' + post.path"> <nuxt-link :to="'/post/' + post.path">
{{ post.title }} {{ post.title }}
</nuxt-link> </nuxt-link>
</h2> </h2>
@@ -25,7 +25,7 @@
</span> </span>
</small> </small>
<article v-html="post.excerpt"></article> <article v-html="post.excerptHtml"></article>
</section> </section>
</template> </template>
+50
View File
@@ -0,0 +1,50 @@
import { Handler } from 'aws-lambda'
import lunr, { Index } from 'lunr'
import idxJson from '../build/idx.json'
import { dbPost, initDatabase } from '../server/db'
let idx: Index
export const handler: Handler = async (evt) => {
const { q = '', tag, page: _page = '1' } = evt.queryStringParameters || {}
const perPage = 5
const offset = (parseInt(_page) - 1) * perPage
idx = idx || lunr.Index.load(idxJson)
await initDatabase()
let cond = dbPost.chain()
if (q) {
cond = cond.find({
path: { $in: idx.search(q).map(({ ref }) => ref) },
})
}
if (tag) {
cond = cond.find({
tag: { $contains: tag },
})
}
const count = cond.branch().count()
const result = cond
.offset(offset)
.limit(5)
.data()
.map(({ title, path, date, excerptHtml }) => ({
title,
path,
date,
excerptHtml,
}))
return {
statusCode: 200,
body: JSON.stringify({
count,
result,
}),
}
}
+3
View File
@@ -0,0 +1,3 @@
[build]
functions = "lambda-dist"
publish = "dist"
+29 -8
View File
@@ -1,12 +1,15 @@
import { NuxtConfig } from '@nuxt/types' import { NuxtConfig } from '@nuxt/types'
import { SERVER_PORT, runServer } from './server/cli'
import { getTheme } from './server/theme' import { getTheme } from './server/theme'
const config = async (): Promise<NuxtConfig> => { const config = async (): Promise<NuxtConfig> => {
await runServer()
const theme = getTheme() const theme = getTheme()
const PORT = process.env.PORT || '3000'
return { return {
target: 'static',
// Global page headers (https://go.nuxtjs.dev/config-head) // Global page headers (https://go.nuxtjs.dev/config-head)
head: { head: {
title: theme.title, title: theme.title,
@@ -55,11 +58,7 @@ const config = async (): Promise<NuxtConfig> => {
css: [], css: [],
// Plugins to run before rendering page (https://go.nuxtjs.dev/config-plugins) // Plugins to run before rendering page (https://go.nuxtjs.dev/config-plugins)
plugins: [ plugins: ['~/plugins/axios-fix.ts', '~/plugins/format.ts'],
'~/plugins/axios-fix.ts',
'~/plugins/format.ts',
'~/plugins/remark42.client.js',
],
// Auto import components (https://go.nuxtjs.dev/config-components) // Auto import components (https://go.nuxtjs.dev/config-components)
components: true, components: true,
@@ -73,13 +72,35 @@ const config = async (): Promise<NuxtConfig> => {
// Modules (https://go.nuxtjs.dev/config-modules) // Modules (https://go.nuxtjs.dev/config-modules)
modules: ['@nuxtjs/axios'], modules: ['@nuxtjs/axios'],
axios: {
proxy: true,
},
proxy: {
'/.netlify/functions': 'http://localhost:9000',
'/api': `http://localhost:${SERVER_PORT}`,
},
// Build Configuration (https://go.nuxtjs.dev/config-build) // Build Configuration (https://go.nuxtjs.dev/config-build)
build: {}, build: {},
env: { env: {
THEME: JSON.stringify(theme), THEME: JSON.stringify(theme),
PORT, SERVER_PORT: SERVER_PORT.toString(),
},
hooks: {
generate: {
done() {
/**
* Do not kill
*/
// try {
// execSync(
// `lsof -i tcp:${SERVER_PORT} | grep LISTEN | awk '{print $2}' | xargs kill -9`
// )
// } catch (_) {}
process.exit(0)
},
},
}, },
serverMiddleware: [{ path: '/api', handler: '~/server/index.ts' }],
} }
} }
+21 -9
View File
@@ -3,42 +3,53 @@
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "nuxt-ts",
"build": "nuxt-ts build",
"start": "nuxt-ts start", "start": "nuxt-ts start",
"generate": "nuxt-ts generate", "generate": "nuxt-ts generate",
"lint:js": "eslint --ext .ts,.js,.vue --ignore-path .gitignore .", "lint": "eslint --ext .ts,.js,.vue --ignore-path .gitignore .",
"lint": "yarn lint:js",
"ts": "ts-node -O '{\"module\":\"commonjs\"}'", "ts": "ts-node -O '{\"module\":\"commonjs\"}'",
"ts:prepare": "yarn ts scripts/prepare.ts", "db:make": "yarn ts scripts/make.ts",
"predeploy": "yarn build", "dev": "run-p 'dev:**'",
"deploy": "gcloud app deploy" "dev:nuxt": "nuxt-ts",
"dev:lambda": "netlify-lambda serve lambda",
"prebuild": "yarn db:make",
"build": "run-p 'build:**'",
"build:nuxt": "nuxt-ts generate",
"build:lambda": "netlify-lambda build lambda",
"postinstall": "netlify-lambda install"
}, },
"dependencies": { "dependencies": {
"@nuxt/typescript-runtime": "^2.0.0", "@nuxt/typescript-runtime": "^2.0.0",
"@nuxtjs/axios": "^5.12.4", "@nuxtjs/axios": "^5.12.4",
"@patarapolw/scope-css": "^1.3.0", "@patarapolw/scope-css": "^1.3.0",
"@types/aws-lambda": "^8.10.66",
"@types/express": "^4.17.9", "@types/express": "^4.17.9",
"@types/js-yaml": "^3.12.5", "@types/js-yaml": "^3.12.5",
"@types/lokijs": "^1.5.3",
"@types/lunr": "^2.3.3",
"@types/morgan": "^1.9.2", "@types/morgan": "^1.9.2",
"better-sqlite3": "^7.1.1",
"cheerio": "^1.0.0-rc.3", "cheerio": "^1.0.0-rc.3",
"core-js": "^3.6.5", "core-js": "^3.6.5",
"express": "^4.17.1", "express": "^4.17.1",
"js-yaml": "^3.14.1", "js-yaml": "^3.14.1",
"lokijs": "^1.5.11",
"lunr": "^2.3.9",
"morgan": "^1.10.0", "morgan": "^1.10.0",
"netlify-lambda": "^2.0.2",
"nuxt": "^2.14.6", "nuxt": "^2.14.6",
"nuxt-property-decorator": "^2.8.8", "nuxt-property-decorator": "^2.8.8",
"showdown": "^1.9.1", "showdown": "^1.9.1",
"zod": "^1.11.11" "zod": "^1.11.11"
}, },
"devDependencies": { "devDependencies": {
"@babel/plugin-proposal-class-properties": "^7.12.1",
"@babel/plugin-proposal-object-rest-spread": "^7.12.1",
"@babel/plugin-transform-object-assign": "^7.12.1",
"@babel/preset-typescript": "^7.12.1",
"@nuxt/types": "^2.14.6", "@nuxt/types": "^2.14.6",
"@nuxt/typescript-build": "^2.0.3", "@nuxt/typescript-build": "^2.0.3",
"@nuxtjs/eslint-config": "^3.1.0", "@nuxtjs/eslint-config": "^3.1.0",
"@nuxtjs/eslint-config-typescript": "^3.0.0", "@nuxtjs/eslint-config-typescript": "^3.0.0",
"@nuxtjs/eslint-module": "^2.0.0", "@nuxtjs/eslint-module": "^2.0.0",
"@types/better-sqlite3": "^5.4.1",
"@types/cheerio": "^0.22.23", "@types/cheerio": "^0.22.23",
"@types/ejs": "^3.0.5", "@types/ejs": "^3.0.5",
"@types/fs-extra": "^9.0.5", "@types/fs-extra": "^9.0.5",
@@ -53,6 +64,7 @@
"eslint-plugin-prettier": "^3.1.4", "eslint-plugin-prettier": "^3.1.4",
"import-sort-parser-typescript": "^6.0.0", "import-sort-parser-typescript": "^6.0.0",
"nodejieba": "^2.5.1", "nodejieba": "^2.5.1",
"npm-run-all": "^4.1.5",
"prettier": "^2.1.2", "prettier": "^2.1.2",
"ts-node": "^9.1.1", "ts-node": "^9.1.1",
"typescript": "4.0.5" "typescript": "4.0.5"
-34
View File
@@ -1,34 +0,0 @@
<template>
<p v-if="$fetchState.pending"></p>
<p v-else-if="$fetchState.error">
An error occurred {{ $fetchState.error.message }}
</p>
<p v-else-if="!posts.length">No posts found.</p>
<post-query v-else :posts="posts" :count="count" />
</template>
<script lang="ts">
import { Vue, Component } from 'nuxt-property-decorator'
@Component<BlogPage>({
watch: {
'$route.query.q': '$fetch',
'$route.query.page': '$fetch',
},
async fetch() {
const { result, count } = await this.$axios.$get('/api/q', {
params: {
q: this.$route.query.q,
page: this.$route.query.page,
},
})
this.posts = result
this.count = count
},
})
export default class BlogPage extends Vue {
posts: IPostTeaser[] = []
count = 0
}
</script>
+26
View File
@@ -0,0 +1,26 @@
<template>
<post-query :posts="posts" :count="count" />
</template>
<script lang="ts">
import { Vue, Component } from 'nuxt-property-decorator'
@Component<BlogPagePaged>({
async asyncData({ $axios, params }) {
const { result, count } = await $axios.$get('/api/q', {
params: {
page: params.page,
},
})
return {
posts: result,
count,
}
},
})
export default class BlogPagePaged extends Vue {
posts: IPostTeaser[] = []
count = 0
}
</script>
+22
View File
@@ -0,0 +1,22 @@
<template>
<post-query :posts="posts" :count="count" />
</template>
<script lang="ts">
import { Vue, Component } from 'nuxt-property-decorator'
@Component<BlogPage>({
async asyncData({ $axios }) {
const { result, count } = await $axios.$get('/api/q')
return {
posts: result,
count,
}
},
})
export default class BlogPage extends Vue {
posts: IPostTeaser[] = []
count = 0
}
</script>
+71 -14
View File
@@ -1,9 +1,5 @@
<template> <template>
<p v-if="$fetchState.pending"></p> <section>
<p v-else-if="$fetchState.error">
An error occurred {{ $fetchState.error.message }}
</p>
<section v-else>
<section> <section>
<h2> <h2>
{{ post.title }} {{ post.title }}
@@ -29,7 +25,7 @@
</small> </small>
</section> </section>
<section v-html="post.content"></section> <section v-html="post.contentHtml"></section>
<section class="tags-container"> <section class="tags-container">
<span>Tags:</span> <span>Tags:</span>
@@ -52,14 +48,75 @@ import { THEME } from '~/assets/global'
import '~/assets/remark42' import '~/assets/remark42'
@Component<PostPage>({ @Component<PostPage>({
async fetch() { async asyncData({ $axios, params }) {
const r = await this.$axios.$get('/api', { const r = await $axios.$get('/api', {
params: { params: {
path: this.$route.params.pathMatch, path: params.pathMatch,
}, },
}) })
this.post = r return {
post: r,
}
},
head() {
const { title: _title, content, tag, image } = this.post
const title = `${_title} - ${THEME.title}`
const description = content.substr(0, 140)
return {
title,
meta: [
{
hid: 'description',
name: 'description',
content: description,
},
...(tag
? [
{
hid: 'keywords',
name: 'keywords',
content: tag.join(','),
},
]
: []),
{
hid: 'og:title',
property: 'og:title',
content: title,
},
{
hid: 'og:description',
property: 'og:description',
content: description,
},
{
hid: 'twitter:title',
property: 'twitter:title',
content: title,
},
{
hid: 'twitter:description',
property: 'twitter:description',
content: description,
},
...(image
? [
{
hid: 'og:image',
property: 'og:image',
content: image,
},
{
hid: 'twitter:image',
property: 'twitter:image',
content: image,
},
]
: []),
],
}
}, },
mounted() { mounted() {
this.initRemark42() this.initRemark42()
@@ -71,21 +128,21 @@ import '~/assets/remark42'
}, },
}) })
export default class PostPage extends Vue { export default class PostPage extends Vue {
post: { post!: {
date?: string date?: string
title: string title: string
image?: string image?: string
tag?: string[] tag?: string[]
category?: string category?: string[]
content: string content: string
} | null = null }
theme = THEME theme = THEME
remark42settings = THEME.comment?.remark42 || null remark42settings = THEME.comment?.remark42 || null
remark42Instance: any = null remark42Instance: any = null
@Watch('$fetchState.pending') @Watch('$route.params.pathMatch')
initRemark42() { initRemark42() {
this.$nextTick(() => { this.$nextTick(() => {
if ( if (
-32
View File
@@ -1,32 +0,0 @@
<template>
<p v-if="$fetchState.pending"></p>
<p v-else-if="$fetchState.error">An error occurred {{ $fetchState.error }}</p>
<post-query v-else :posts="posts" :count="count" />
</template>
<script lang="ts">
import { Vue, Component } from 'nuxt-property-decorator'
@Component<TagPage>({
watch: {
'$route.query.q': '$fetch',
'$route.query.page': '$fetch',
},
async fetch() {
const { result, count } = await this.$axios.$get('/api/q', {
params: {
q: this.$route.query.q,
page: this.$route.query.page,
tag: this.$route.params.tag,
},
})
this.posts = result
this.count = count
},
})
export default class TagPage extends Vue {
posts: IPostTeaser[] = []
count = 0
}
</script>
+27
View File
@@ -0,0 +1,27 @@
<template>
<post-query :posts="posts" :count="count" />
</template>
<script lang="ts">
import { Vue, Component } from 'nuxt-property-decorator'
@Component<TagPagePaged>({
async asyncData({ $axios, params }) {
const { result, count } = await $axios.$get('/api/q', {
params: {
page: params.page,
tag: params.tag,
},
})
return {
posts: result,
count,
}
},
})
export default class TagPagePaged extends Vue {
posts: IPostTeaser[] = []
count = 0
}
</script>
+26
View File
@@ -0,0 +1,26 @@
<template>
<post-query :posts="posts" :count="count" />
</template>
<script lang="ts">
import { Vue, Component } from 'nuxt-property-decorator'
@Component<TagPage>({
async asyncData({ $axios, params }) {
const { result, count } = await $axios.$get('/api/q', {
params: {
tag: params.tag,
},
})
return {
posts: result,
count,
}
},
})
export default class TagPage extends Vue {
posts: IPostTeaser[] = []
count = 0
}
</script>
+4 -3
View File
@@ -1,9 +1,10 @@
import { Plugin } from '@nuxt/types' import { Plugin } from '@nuxt/types'
const plugin: Plugin = ({ $axios, error }) => { const plugin: Plugin = ({ $axios, error }) => {
if (typeof location !== 'undefined') { $axios.defaults.baseURL =
$axios.defaults.baseURL = location.origin typeof location !== 'undefined'
} ? location.origin
: `http://localhost:${process.env.SERVER_PORT}`
$axios.interceptors.response.use( $axios.interceptors.response.use(
(r) => { (r) => {
+1 -1
View File
@@ -1,6 +1,6 @@
import Vue from 'vue' import Vue from 'vue'
Vue.filter('formatDate', (s: string) => { Vue.filter('formatDate', (s?: string | number) => {
return s return s
? new Date(s).toLocaleDateString([], { ? new Date(s).toLocaleDateString([], {
year: 'numeric', year: 'numeric',
Whitespace-only changes.
+2 -2
View File
@@ -10,10 +10,10 @@ dotenv.config()
export const CONTENT_PATH = path.resolve( export const CONTENT_PATH = path.resolve(
process.env.CONTENT_PATH || process.env.CONTENT_PATH ||
(fs.existsSync('../../_posts') ? '../..' : 'content') (fs.existsSync('../../_post') ? '../..' : 'content')
) )
export const srcPath = ( export const srcPath = (
root: '_posts' | '_media' | typeof THEME_FILENAME, root: '_post' | '_media' | typeof THEME_FILENAME,
...ps: string[] ...ps: string[]
): string => path.join(CONTENT_PATH, root, ...ps) ): string => path.join(CONTENT_PATH, root, ...ps)
+19 -13
View File
@@ -3,10 +3,9 @@ import crypto from 'crypto'
import scopeCss from '@patarapolw/scope-css' import scopeCss from '@patarapolw/scope-css'
import cheerio from 'cheerio' import cheerio from 'cheerio'
import ejs from 'ejs' import ejs from 'ejs'
import jieba from 'nodejieba'
import showdown from 'showdown' import showdown from 'showdown'
export class MakeHTML { export class MakeHtml {
$ = cheerio.load('') $ = cheerio.load('')
mdConverter = new showdown.Converter({ mdConverter = new showdown.Converter({
@@ -18,7 +17,7 @@ export class MakeHTML {
tables: true, tables: true,
tasklists: true, tasklists: true,
// simpleLineBreaks: true, // simpleLineBreaks: true,
openLinksInNewWindow: true, // openLinksInNewWindow: true,
backslashEscapesHTMLTags: true, backslashEscapesHTMLTags: true,
emoji: true, emoji: true,
underline: true, underline: true,
@@ -72,9 +71,8 @@ export class MakeHTML {
async parse( async parse(
filename: string filename: string
): Promise<{ ): Promise<{
$: cheerio.Cheerio html: string
html(): string text: string
clean(): string
}> { }> {
const id = const id =
'md-' + 'md-' +
@@ -87,6 +85,7 @@ export class MakeHTML {
const $div = this.$(`<div id="${id}">`) const $div = this.$(`<div id="${id}">`)
$div.html(await this.getHTML(filename)) $div.html(await this.getHTML(filename))
$div.find('style').each((_, el) => { $div.find('style').each((_, el) => {
const $el = this.$(el) const $el = this.$(el)
const html = $el.html() || '' const html = $el.html() || ''
@@ -95,14 +94,21 @@ export class MakeHTML {
} }
}) })
$div.find('a').each((_, el) => {
const $el = this.$(el)
const href = $el.attr('href') || ''
if (/^https?:\/\//.test(href)) {
$el.attr({
rel: 'noopener',
target: '_blank',
})
}
})
return { return {
$: $div, html: this.$('<div>').append($div).html() || '',
html: () => { text: $div.text().trim(),
return this.$('<div>').append($div).html() || ''
},
clean: () => {
return jieba.cutForSearch($div.text() || '').join(' ')
},
} }
} }
+86
View File
@@ -0,0 +1,86 @@
import fg from 'fast-glob'
import fs from 'fs-extra'
import yaml from 'js-yaml'
import lunr from 'lunr'
import jieba from 'nodejieba'
import rimraf from 'rimraf'
import { IPost, db, dbPost, initDatabase, zMatter, zPost } from '../server/db'
import { buildPath, dstMediaPath } from '../server/dir'
import { THEME_FILENAME } from '../server/theme'
import { srcPath } from './dir'
import { MakeHtml } from './make-html'
async function main() {
rimraf.sync(dstMediaPath())
rimraf.sync(buildPath())
await fs.copy(srcPath('_media'), dstMediaPath()).catch((e) => {
// eslint-disable-next-line no-console
console.error(e)
})
await fs.ensureDir(buildPath())
await fs.copyFile(srcPath(THEME_FILENAME), buildPath(THEME_FILENAME))
const files = await fg('**/*.md', {
cwd: srcPath('_post'),
})
const makeHtml = new MakeHtml()
const rawJson: IPost[] = []
await initDatabase()
await Promise.all(
files.map(async (f) => {
const header = zMatter.parse(
yaml.safeLoad(
fs.readFileSync(srcPath('_post', f), 'utf-8').split(/\n---\n/)[0]
)
)
const { html, text } = await makeHtml.parse(srcPath('_post', f))
const p: IPost = {
...header,
date: header.date ? header.date.getTime() : undefined,
createdAt: header.createdAt ? header.createdAt.getTime() : undefined,
updatedAt: header.updatedAt ? header.updatedAt.getTime() : undefined,
path: f.replace(/\.mdx?$/, ''),
excerptHtml: html.split(/<!-- excerpt(?:_separator)? -->/)[0],
contentHtml: html,
content: text,
}
dbPost.insert(zPost.parse(p))
rawJson.push({
...p,
content: jieba.cutForSearch(p.content).join(' '),
})
})
)
db.save()
fs.writeFileSync(
buildPath('idx.json'),
JSON.stringify(
lunr(function () {
this.ref('path')
this.field('title', { boost: 5 })
this.field('tag', { boost: 5 })
this.field('category', { boost: 5 })
this.field('content')
rawJson.map((doc) => {
return this.add(doc)
})
})
)
)
}
if (require.main === module) {
main()
}
-57
View File
@@ -1,57 +0,0 @@
import fg from 'fast-glob'
import fs from 'fs-extra'
import yaml from 'js-yaml'
import rimraf from 'rimraf'
import { Database, IMatter } from '../server/db'
import { builtPath, dstMediaPath } from '../server/dir'
import { THEME_FILENAME } from '../server/theme'
import { srcPath } from './dir'
import { MakeHTML } from './make-html'
async function main() {
rimraf.sync(dstMediaPath())
rimraf.sync(builtPath())
await fs.copy(srcPath('_media'), dstMediaPath())
await fs.ensureDir(builtPath())
await fs.copyFile(srcPath(THEME_FILENAME), builtPath(THEME_FILENAME))
const db = new Database()
db.init()
const files = await fg('**/*.md', {
cwd: srcPath('_posts'),
})
const makeHtml = new MakeHTML()
await Promise.all(
files.map(async (f) => {
const path = f.replace(/\.md$/, '')
const markdown = fs.readFileSync(srcPath('_posts', f), 'utf8')
const [h] = markdown.substr(4).split(/---\n(.*)$/s)
const header = yaml.safeLoad(h) as IMatter
const r = await makeHtml.parse(srcPath('_posts', f))
const contentHtml = r.html()
const excerptHtml = contentHtml.split(
/<!-- excerpt(?:_separator)? -->/
)[0]
db.insert({
...header,
path,
content: r.clean(),
excerptHtml,
contentHtml,
})
})
)
}
if (require.main === module) {
main()
}
+119
View File
@@ -0,0 +1,119 @@
import http from 'http'
import express from 'express'
import lunr from 'lunr'
import morgan from 'morgan'
import * as z from 'zod'
import idxJson from '../build/idx.json'
import { dbPost, initDatabase } from './db'
export const SERVER_PORT = 5000
export async function runServer() {
await initDatabase()
const app = express()
if (process.env.NODE_ENV === 'development') {
app.use(morgan('common'))
}
const router = express.Router()
app.use('/api', router)
const idx = lunr.Index.load(idxJson)
router.get('/', (req, res) => {
const { path } = z
.object({
path: z.string(),
})
.parse(req.query)
const r = dbPost.findOne({ path })
if (!r) {
res.sendStatus(404)
return
}
res.json(r)
})
router.get('/q', (req, res) => {
const { q, tag, page: _page = '1' } = z
.object({
q: z.string().optional(),
tag: z.string().optional(),
page: z
.string()
.refine((s) => /^\d+$/.test(s))
.optional(),
})
.parse(req.query)
const perPage = 5
const offset = (parseInt(_page) - 1) * perPage
let cond = dbPost.chain().find({
date: { $exists: true } as any,
})
if (q) {
cond = cond.find({
path: { $in: idx.search(q).map(({ ref }) => ref) },
})
}
if (tag) {
cond = cond.find({
tag: { $contains: tag },
})
}
cond = cond.simplesort('date', { desc: true })
const count = cond.branch().count()
const result = cond.offset(offset).limit(5).data()
res.json({
count,
result,
})
})
app.use((err: Error, _: express.Request, res: express.Response) => {
// eslint-disable-next-line no-console
console.error(err.stack)
res.status(500).send(err)
})
await new Promise<http.Server | Error>((resolve) => {
const srv = app
.listen(SERVER_PORT, () => {
// eslint-disable-next-line no-console
console.info(
`serverMiddleware is running at http://localhost:${SERVER_PORT}`
)
resolve(srv)
})
.once('error', (e) => {
/**
* Nuxt generate will try to spawn two process on the same SERVER_PORT.
*
* One of which will inevitably fail.
*
* ! DO NOT reject()
*/
resolve(e)
})
.once('close', () => {
// eslint-disable-next-line no-console
console.info('serverMiddleware is closing')
})
})
}
if (require.main === module) {
// eslint-disable-next-line no-console
runServer().catch(console.error)
}
+58 -251
View File
@@ -1,280 +1,87 @@
import sqlite3 from 'better-sqlite3' /* eslint-disable import/no-mutable-exports */
import Loki, { Collection } from 'lokijs'
import * as z from 'zod' import * as z from 'zod'
import { builtPath } from './dir' import { buildPath } from './dir'
const zMatter = z.object({ const _zMatter = {
date: z.date().optional(),
createdAt: z.date().optional(),
updatedAt: z.date().optional(),
priority: z.number().optional(), priority: z.number().optional(),
title: z.string(), title: z.string(),
image: z.string().optional(), image: z.string().optional(),
tag: z.array(z.string()).optional(), tag: z.array(z.string()).optional(),
category: z.string().optional(), category: z.array(z.string()).optional(),
}
export const zMatter = z.object({
..._zMatter,
date: z.date().optional(),
createdAt: z.date().optional(),
updatedAt: z.date().optional(),
}) })
export type IMatter = z.infer<typeof zMatter> export type IMatter = z.infer<typeof zMatter>
const zMatterSerialized = z.object({
..._zMatter,
date: z.number().optional(),
createdAt: z.number().optional(),
updatedAt: z.number().optional(),
})
export type IMatterSerialized = z.infer<typeof zMatterSerialized>
export const zPost = z export const zPost = z
.object({ .object({
path: z.string(), path: z.string(),
/**
* Cleaned and jieba-separated markdown
*/
content: z.string(), content: z.string(),
excerptHtml: z.string(), excerptHtml: z.string(),
contentHtml: z.string(), contentHtml: z.string(),
}) })
.merge(zMatter.nonstrict()) .merge(zMatterSerialized)
export type IPost = z.infer<typeof zPost> export type IPost = z.infer<typeof zPost>
export class Database { export interface IPostSearch {
db: sqlite3.Database path: string
title: string
tag?: string[]
category?: string[]
/**
* Cleaned and jieba-separated markdown
*/
content: string
}
constructor(opts?: sqlite3.Options) { export let db: Loki
this.db = sqlite3(builtPath('data.db'), opts)
export let dbPost: Collection<IPost>
export async function initDatabase() {
if (db) {
return
} }
public init(): void { return new Promise<void>((resolve) => {
this.db.exec(/* sql */ ` db = new Loki(buildPath('data.loki'), {
CREATE TABLE IF NOT EXISTS files ( autoload: true,
[path] TEXT PRIMARY KEY, autoloadCallback: () => {
[date] INT, -- epoch milli dbPost = db.getCollection('post')
createdAt INT, -- epoch milli if (!dbPost) {
updatedAt INT, -- epoch milli dbPost = db.addCollection('post', {
priority INT, unique: ['path'],
-- q.title indices: [
[image] TEXT, 'date',
-- m2o files_tag 'createdAt',
-- q.category 'updatedAt',
-- q.content 'priority',
excerptHtml TEXT NOT NULL, 'tag',
contentHtml TEXT NOT NULL 'category',
); ],
CREATE INDEX IF NOT EXISTS files_date ON files([date]);
CREATE INDEX IF NOT EXISTS files_createdAt ON files(createdAt);
CREATE INDEX IF NOT EXISTS files_updatedAt ON files(updatedAt);
CREATE INDEX IF NOT EXISTS files_priority ON files(priority);
CREATE TABLE IF NOT EXISTS files_tag (
[path] TEXT NOT NULL,
tag TEXT NOT NULL,
PRIMARY KEY ([path], tag)
);
`)
this.db.exec(/* sql */ `
CREATE VIRTUAL TABLE IF NOT EXISTS q USING fts5 (
[path], -- REFERENCES files([path])
title,
tag, -- space separated
category, -- can compare via equal
content -- cleaned markdown
);
`)
}
public insert(...ps: IPost[]): void {
const fStmt = this.db.prepare(/* sql */ `
INSERT INTO files ([path], [date], [createdAt], [updatedAt], priority, [image], excerptHtml, contentHtml)
VALUES (@path, @date, @createdAt, @updatedAt, @priority, @image, @excerptHtml, @contentHtml)
`)
const ftStmt = this.db.prepare(/* sql */ `
INSERT INTO files_tag ([path], tag)
VALUES (@path, @tag)
`)
const qStmt = this.db.prepare(/* sql */ `
INSERT INTO q ([path], title, tag, category, content)
VALUES (@path, @title, @tag, @category, @content)
`)
this.db.transaction(() => {
// eslint-disable-next-line array-callback-return
ps.map((p) => {
const {
path,
date,
createdAt,
updatedAt,
priority,
image,
excerptHtml,
contentHtml,
title,
tag,
category,
content,
} = zPost.parse(p)
fStmt.run({
path,
priority,
image,
excerptHtml,
contentHtml,
date: date ? date.getTime() : null,
createdAt: createdAt ? createdAt.getTime() : null,
updatedAt: updatedAt ? updatedAt.getTime() : null,
})
qStmt.run({
path,
title,
category,
content,
tag: tag ? tag.join(' ') : undefined,
})
if (tag) {
Array.from(new Set(tag)).map((t) => {
ftStmt.run({
path,
tag: t,
})
}) })
} }
})
})()
}
public get(id: string) { resolve()
const r = this.db },
.prepare(
/* sql */ `
SELECT
[date],
title,
[image],
GROUP_CONCAT(ft.tag, ' ') tag,
category,
contentHtml content
FROM files f
JOIN q ON q.path = f.path
LEFT JOIN files_tag ft ON ft.path = f.path
WHERE f.path = @id
GROUP BY f.path
`
)
.get({ id })
if (!r) {
return null
}
return {
...r,
date: r.date ? new Date(r.date) : undefined,
tag: r.tag ? r.tag.split(/ /g) : undefined,
} as {
date?: Date
title: string
image?: string
tag?: string[]
category?: string
content: string
}
}
public q(
q: string,
opts: {
offset: number
limit: number
tag?: string
}
) {
return this._search(q, {
...opts,
orderedBy: 'RANK',
}) })
} })
public by(opts: { tag?: string; offset: number; limit: number }) {
return this._search('', {
...opts,
orderedBy: 'priority DESC, [date] DESC, createdAt DESC, updatedAt DESC',
where: ['[date] IS NOT NULL'],
})
}
private _search(
q: string,
opts: {
offset: number
limit: number
orderedBy: string
tag?: string
where?: string[]
}
) {
const $where: string[] = []
if (q) {
$where.push('q = @q')
}
if (opts.tag) {
$where.push('ft.tag = @tag')
}
if (opts.where) {
$where.push(...opts.where)
}
const fromSegment = /* sql */ `
FROM files f
JOIN q ON q.path = f.path
${opts.tag ? `LEFT JOIN files_tag ft ON ft.path = f.path` : ''}
WHERE ${$where.join(' AND ') || 'TRUE'}
${opts.tag ? 'GROUP BY f.path' : ''}
`
const cond = {
q,
tag: opts.tag,
}
const count =
this.db
.prepare(
/* sql */ `
SELECT COUNT(f.path) [count]
${fromSegment}
`
)
.get(cond)?.count || 0
const result = this.db
.prepare(
/* sql */ `
SELECT
f.path [path],
[date],
title,
[image],
category,
excerptHtml excerpt
${fromSegment}
ORDER BY ${opts.orderedBy}
LIMIT ${opts.limit} OFFSET ${opts.offset}
`
)
.all(cond) as {
path: string
date?: Date
title: string
image?: string
category?: string
excerpt: string
}[]
return {
result,
count,
}
}
} }
+2 -2
View File
@@ -1,7 +1,7 @@
import path from 'path' import path from 'path'
export const builtPath = (...ps: string[]): string => export const buildPath = (...ps: string[]): string =>
path.join(__dirname, '../built', ...ps) path.join(__dirname, '../build', ...ps)
export const dstMediaPath = (...ps: string[]): string => export const dstMediaPath = (...ps: string[]): string =>
path.join(__dirname, '../static/media', ...ps) path.join(__dirname, '../static/media', ...ps)
-69
View File
@@ -1,69 +0,0 @@
import express from 'express'
import morgan from 'morgan'
import * as z from 'zod'
import { Database } from './db'
const app = express()
app.use(morgan('dev'))
const db = new Database({ readonly: true })
app.get('/', (req, res) => {
const { path } = z
.object({
path: z.string(),
})
.parse(req.query)
const r = db.get(path)
if (!r) {
res.sendStatus(404)
return
}
res.json(r)
})
app.get('/q', (req, res) => {
const { q, tag, page: _page = '1' } = z
.object({
q: z.string().optional(),
tag: z.string().optional(),
page: z
.string()
.refine((s) => /^\d+$/.test(s))
.optional(),
})
.parse(req.query)
const perPage = 5
const offset = (parseInt(_page) - 1) * perPage
if (q) {
res.json(
db.q(q, {
offset,
limit: perPage,
tag,
})
)
return
}
res.json(
db.by({
offset,
limit: perPage,
tag,
})
)
})
app.use((err: Error, _: express.Request, res: express.Response) => {
// eslint-disable-next-line no-console
console.error(err.stack)
res.status(500).send(err)
})
export default app
+3 -2
View File
@@ -1,9 +1,10 @@
import fs from 'fs' import fs from 'fs'
import path from 'path'
import yaml from 'js-yaml' import yaml from 'js-yaml'
import * as z from 'zod' import * as z from 'zod'
import { buildPath } from './dir'
export const THEME_FILENAME = 'theme.yml' export const THEME_FILENAME = 'theme.yml'
export const zTheme = z export const zTheme = z
@@ -56,6 +57,6 @@ export type ITheme = z.infer<typeof zTheme>
export function getTheme() { export function getTheme() {
return zTheme.parse( return zTheme.parse(
yaml.safeLoad(fs.readFileSync(path.join('built', THEME_FILENAME), 'utf-8')) yaml.safeLoad(fs.readFileSync(buildPath(THEME_FILENAME), 'utf-8'))
) )
} }
+2 -1
View File
@@ -15,7 +15,8 @@
"~/*": ["./*"], "~/*": ["./*"],
"@/*": ["./*"] "@/*": ["./*"]
}, },
"types": ["@types/node", "@nuxt/types", "@nuxtjs/axios"] "types": ["@types/node", "@nuxt/types", "@nuxtjs/axios"],
"resolveJsonModule": true
}, },
"exclude": ["node_modules", ".nuxt", "dist"] "exclude": ["node_modules", ".nuxt", "dist"]
} }
+317 -172
View File
@@ -14,7 +14,7 @@
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.7.tgz#9329b4782a7d6bbd7eef57e11addf91ee3ef1e41" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.7.tgz#9329b4782a7d6bbd7eef57e11addf91ee3ef1e41"
integrity sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw== integrity sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==
"@babel/core@^7.12.9": "@babel/core@^7.10.4", "@babel/core@^7.12.9":
version "7.12.10" version "7.12.10"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd"
integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==
@@ -213,11 +213,21 @@
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2"
integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==
"@babel/helper-validator-identifier@^7.12.11":
version "7.12.11"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed"
integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==
"@babel/helper-validator-option@^7.12.1": "@babel/helper-validator-option@^7.12.1":
version "7.12.1" version "7.12.1"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz#175567380c3e77d60ff98a54bb015fe78f2178d9" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz#175567380c3e77d60ff98a54bb015fe78f2178d9"
integrity sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A== integrity sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==
"@babel/helper-validator-option@^7.12.11":
version "7.12.11"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz#d66cb8b7a3e7fe4c6962b32020a131ecf0847f4f"
integrity sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw==
"@babel/helper-wrap-function@^7.10.4": "@babel/helper-wrap-function@^7.10.4":
version "7.12.3" version "7.12.3"
resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9"
@@ -260,7 +270,7 @@
"@babel/helper-remap-async-to-generator" "^7.12.1" "@babel/helper-remap-async-to-generator" "^7.12.1"
"@babel/plugin-syntax-async-generators" "^7.8.0" "@babel/plugin-syntax-async-generators" "^7.8.0"
"@babel/plugin-proposal-class-properties@^7.12.1": "@babel/plugin-proposal-class-properties@^7.10.4", "@babel/plugin-proposal-class-properties@^7.12.1":
version "7.12.1" version "7.12.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de"
integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==
@@ -325,7 +335,7 @@
"@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-numeric-separator" "^7.10.4"
"@babel/plugin-proposal-object-rest-spread@^7.12.1": "@babel/plugin-proposal-object-rest-spread@^7.10.4", "@babel/plugin-proposal-object-rest-spread@^7.12.1":
version "7.12.1" version "7.12.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069"
integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==
@@ -465,6 +475,13 @@
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-typescript@^7.12.1":
version "7.12.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz#460ba9d77077653803c3dd2e673f76d66b4029e5"
integrity sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA==
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-transform-arrow-functions@^7.12.1": "@babel/plugin-transform-arrow-functions@^7.12.1":
version "7.12.1" version "7.12.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz#8083ffc86ac8e777fbe24b5967c4b2521f3cb2b3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz#8083ffc86ac8e777fbe24b5967c4b2521f3cb2b3"
@@ -495,6 +512,13 @@
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-transform-block-scoping@^7.12.11":
version "7.12.11"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.11.tgz#83ae92a104dbb93a7d6c6dd1844f351083c46b4f"
integrity sha512-atR1Rxc3hM+VPg/NvNvfYw0npQEAcHuJ+MGZnFn6h3bo+1U3BWXMdFMlvVRApBTWKQMX7SOwRJZA5FBF/JQbvA==
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-transform-classes@^7.12.1": "@babel/plugin-transform-classes@^7.12.1":
version "7.12.1" version "7.12.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6"
@@ -627,6 +651,13 @@
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-transform-object-assign@^7.10.4", "@babel/plugin-transform-object-assign@^7.12.1":
version "7.12.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.12.1.tgz#9102b06625f60a5443cc292d32b565373665e1e4"
integrity sha512-geUHn4XwHznRAFiuROTy0Hr7bKbpijJCmr1Svt/VNGhpxmp0OrdxURNpWbOAf94nUbL+xj6gbxRVPHWIbRpRoA==
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-transform-object-super@^7.12.1": "@babel/plugin-transform-object-super@^7.12.1":
version "7.12.1" version "7.12.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz#4ea08696b8d2e65841d0c7706482b048bed1066e" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz#4ea08696b8d2e65841d0c7706482b048bed1066e"
@@ -708,6 +739,15 @@
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-transform-typescript@^7.12.1":
version "7.12.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz#d92cc0af504d510e26a754a7dbc2e5c8cd9c7ab4"
integrity sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw==
dependencies:
"@babel/helper-create-class-features-plugin" "^7.12.1"
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-typescript" "^7.12.1"
"@babel/plugin-transform-unicode-escapes@^7.12.1": "@babel/plugin-transform-unicode-escapes@^7.12.1":
version "7.12.1" version "7.12.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz#5232b9f81ccb07070b7c3c36c67a1b78f1845709" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz#5232b9f81ccb07070b7c3c36c67a1b78f1845709"
@@ -723,6 +763,78 @@
"@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-create-regexp-features-plugin" "^7.12.1"
"@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4"
"@babel/preset-env@^7.10.4":
version "7.12.11"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.11.tgz#55d5f7981487365c93dbbc84507b1c7215e857f9"
integrity sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw==
dependencies:
"@babel/compat-data" "^7.12.7"
"@babel/helper-compilation-targets" "^7.12.5"
"@babel/helper-module-imports" "^7.12.5"
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/helper-validator-option" "^7.12.11"
"@babel/plugin-proposal-async-generator-functions" "^7.12.1"
"@babel/plugin-proposal-class-properties" "^7.12.1"
"@babel/plugin-proposal-dynamic-import" "^7.12.1"
"@babel/plugin-proposal-export-namespace-from" "^7.12.1"
"@babel/plugin-proposal-json-strings" "^7.12.1"
"@babel/plugin-proposal-logical-assignment-operators" "^7.12.1"
"@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1"
"@babel/plugin-proposal-numeric-separator" "^7.12.7"
"@babel/plugin-proposal-object-rest-spread" "^7.12.1"
"@babel/plugin-proposal-optional-catch-binding" "^7.12.1"
"@babel/plugin-proposal-optional-chaining" "^7.12.7"
"@babel/plugin-proposal-private-methods" "^7.12.1"
"@babel/plugin-proposal-unicode-property-regex" "^7.12.1"
"@babel/plugin-syntax-async-generators" "^7.8.0"
"@babel/plugin-syntax-class-properties" "^7.12.1"
"@babel/plugin-syntax-dynamic-import" "^7.8.0"
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
"@babel/plugin-syntax-json-strings" "^7.8.0"
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
"@babel/plugin-syntax-object-rest-spread" "^7.8.0"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
"@babel/plugin-syntax-optional-chaining" "^7.8.0"
"@babel/plugin-syntax-top-level-await" "^7.12.1"
"@babel/plugin-transform-arrow-functions" "^7.12.1"
"@babel/plugin-transform-async-to-generator" "^7.12.1"
"@babel/plugin-transform-block-scoped-functions" "^7.12.1"
"@babel/plugin-transform-block-scoping" "^7.12.11"
"@babel/plugin-transform-classes" "^7.12.1"
"@babel/plugin-transform-computed-properties" "^7.12.1"
"@babel/plugin-transform-destructuring" "^7.12.1"
"@babel/plugin-transform-dotall-regex" "^7.12.1"
"@babel/plugin-transform-duplicate-keys" "^7.12.1"
"@babel/plugin-transform-exponentiation-operator" "^7.12.1"
"@babel/plugin-transform-for-of" "^7.12.1"
"@babel/plugin-transform-function-name" "^7.12.1"
"@babel/plugin-transform-literals" "^7.12.1"
"@babel/plugin-transform-member-expression-literals" "^7.12.1"
"@babel/plugin-transform-modules-amd" "^7.12.1"
"@babel/plugin-transform-modules-commonjs" "^7.12.1"
"@babel/plugin-transform-modules-systemjs" "^7.12.1"
"@babel/plugin-transform-modules-umd" "^7.12.1"
"@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1"
"@babel/plugin-transform-new-target" "^7.12.1"
"@babel/plugin-transform-object-super" "^7.12.1"
"@babel/plugin-transform-parameters" "^7.12.1"
"@babel/plugin-transform-property-literals" "^7.12.1"
"@babel/plugin-transform-regenerator" "^7.12.1"
"@babel/plugin-transform-reserved-words" "^7.12.1"
"@babel/plugin-transform-shorthand-properties" "^7.12.1"
"@babel/plugin-transform-spread" "^7.12.1"
"@babel/plugin-transform-sticky-regex" "^7.12.7"
"@babel/plugin-transform-template-literals" "^7.12.1"
"@babel/plugin-transform-typeof-symbol" "^7.12.10"
"@babel/plugin-transform-unicode-escapes" "^7.12.1"
"@babel/plugin-transform-unicode-regex" "^7.12.1"
"@babel/preset-modules" "^0.1.3"
"@babel/types" "^7.12.11"
core-js-compat "^3.8.0"
semver "^5.5.0"
"@babel/preset-env@^7.12.7": "@babel/preset-env@^7.12.7":
version "7.12.10" version "7.12.10"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.10.tgz#ca981b95f641f2610531bd71948656306905e6ab" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.10.tgz#ca981b95f641f2610531bd71948656306905e6ab"
@@ -806,6 +918,15 @@
"@babel/types" "^7.4.4" "@babel/types" "^7.4.4"
esutils "^2.0.2" esutils "^2.0.2"
"@babel/preset-typescript@^7.12.1":
version "7.12.7"
resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.12.7.tgz#fc7df8199d6aae747896f1e6c61fc872056632a3"
integrity sha512-nOoIqIqBmHBSEgBXWR4Dv/XBehtIFcw9PqZw6rFYuKrzsZmOQm3PR5siLBnKZFEsDb03IegG8nSjU/iXXXYRmw==
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/helper-validator-option" "^7.12.1"
"@babel/plugin-transform-typescript" "^7.12.1"
"@babel/runtime@^7.12.5", "@babel/runtime@^7.8.4": "@babel/runtime@^7.12.5", "@babel/runtime@^7.8.4":
version "7.12.5" version "7.12.5"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e"
@@ -846,6 +967,15 @@
lodash "^4.17.19" lodash "^4.17.19"
to-fast-properties "^2.0.0" to-fast-properties "^2.0.0"
"@babel/types@^7.12.11":
version "7.12.11"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.11.tgz#a86e4d71e30a9b6ee102590446c98662589283ce"
integrity sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==
dependencies:
"@babel/helper-validator-identifier" "^7.12.11"
lodash "^4.17.19"
to-fast-properties "^2.0.0"
"@csstools/convert-colors@^1.4.0": "@csstools/convert-colors@^1.4.0":
version "1.4.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7"
@@ -1322,6 +1452,11 @@
"@types/browserslist" "*" "@types/browserslist" "*"
postcss "7.x.x" postcss "7.x.x"
"@types/aws-lambda@^8.10.66":
version "8.10.66"
resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.66.tgz#195ae8ff7226a4f580a0cab570d683f5b9a215d0"
integrity sha512-gwWIKwN3IVxRQTIZUNtjKo7w2LoB5RMzbP1PAFHsBq64dOKIhTv8y5RYRIjniLTewrBSBrV2EXxgQ1zZeGU4LA==
"@types/babel__core@^7.1.12": "@types/babel__core@^7.1.12":
version "7.1.12" version "7.1.12"
resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.12.tgz#4d8e9e51eb265552a7e4f1ff2219ab6133bdfb2d" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.12.tgz#4d8e9e51eb265552a7e4f1ff2219ab6133bdfb2d"
@@ -1355,13 +1490,6 @@
dependencies: dependencies:
"@babel/types" "^7.3.0" "@babel/types" "^7.3.0"
"@types/better-sqlite3@^5.4.1":
version "5.4.1"
resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-5.4.1.tgz#d45600bc19f8f41397263d037ca9b0d05df85e58"
integrity sha512-8hje3Rhsg/9veTkALfCwiWn7VMrP1QDwHhBSgerttYPABEvrHsMQnU9dlqoM6QX3x4uw3Y06dDVz8uDQo1J4Ng==
dependencies:
"@types/integer" "*"
"@types/body-parser@*": "@types/body-parser@*":
version "1.19.0" version "1.19.0"
resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f"
@@ -1483,11 +1611,6 @@
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
"@types/integer@*":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@types/integer/-/integer-1.0.1.tgz#025d87e30d97f539fcc6087372af7d3672ffbbe6"
integrity sha512-DmZDpSVnsuBrOhtHwE1oKmUJ3qVjHhhNQ7WnZy9/RhH3A24Ar+9o4SoaCWcTzQhalpRDIAMsfdoZLWNJtdBR7A==
"@types/js-yaml@^3.12.5": "@types/js-yaml@^3.12.5":
version "3.12.5" version "3.12.5"
resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.5.tgz#136d5e6a57a931e1cce6f9d8126aa98a9c92a6bb" resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.5.tgz#136d5e6a57a931e1cce6f9d8126aa98a9c92a6bb"
@@ -1508,6 +1631,16 @@
resolved "https://registry.yarnpkg.com/@types/less/-/less-3.0.2.tgz#2761d477678c8374cb9897666871662eb1d1115e" resolved "https://registry.yarnpkg.com/@types/less/-/less-3.0.2.tgz#2761d477678c8374cb9897666871662eb1d1115e"
integrity sha512-62vfe65cMSzYaWmpmhqCMMNl0khen89w57mByPi1OseGfcV/LV03fO8YVrNj7rFQsRWNJo650WWyh6m7p8vZmA== integrity sha512-62vfe65cMSzYaWmpmhqCMMNl0khen89w57mByPi1OseGfcV/LV03fO8YVrNj7rFQsRWNJo650WWyh6m7p8vZmA==
"@types/lokijs@^1.5.3":
version "1.5.3"
resolved "https://registry.yarnpkg.com/@types/lokijs/-/lokijs-1.5.3.tgz#e45db0b35e53ec09a4c2ff4f253037abd56be151"
integrity sha512-ssiP6F7rpDqlaOzo+0Y/0dkVH2JiAjc+o7n6M4pFnfAMscf+7FthqS0cobvGJEJvxmzp4PWfMOfe0q3VETtrgQ==
"@types/lunr@^2.3.3":
version "2.3.3"
resolved "https://registry.yarnpkg.com/@types/lunr/-/lunr-2.3.3.tgz#ec985618fd2712c010f8edab4f1ae7784ad7c583"
integrity sha512-09sXZZVsB3Ib41U0fC+O1O+4UOZT1bl/e+/QubPxpqDWHNEchvx/DEb1KJMOwq6K3MTNzZFoNSzVdR++o1DVnw==
"@types/memory-fs@*": "@types/memory-fs@*":
version "0.3.2" version "0.3.2"
resolved "https://registry.yarnpkg.com/@types/memory-fs/-/memory-fs-0.3.2.tgz#5d4753f9b390cb077c8c8af97bc96463399ceccd" resolved "https://registry.yarnpkg.com/@types/memory-fs/-/memory-fs-0.3.2.tgz#5d4753f9b390cb077c8c8af97bc96463399ceccd"
@@ -2339,7 +2472,7 @@ babel-eslint@^10.1.0:
eslint-visitor-keys "^1.0.0" eslint-visitor-keys "^1.0.0"
resolve "^1.12.0" resolve "^1.12.0"
babel-loader@^8.2.2: babel-loader@^8.1.0, babel-loader@^8.2.2:
version "8.2.2" version "8.2.2"
resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81"
integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==
@@ -2386,15 +2519,6 @@ basic-auth@~2.0.1:
dependencies: dependencies:
safe-buffer "5.1.2" safe-buffer "5.1.2"
better-sqlite3@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-7.1.1.tgz#107457a8b770cfb16be646e347c17b42bc204dd3"
integrity sha512-AkvGGyhAVZhRBOul2WT+5CB2EuveM3ZkebEKe1wxMqDZUy1XB/1RBgM66t0ybHC4DIni8+pr7NaLqEX87NUTwg==
dependencies:
bindings "^1.5.0"
prebuild-install "^5.3.3"
tar "4.4.10"
bfj@^6.1.1: bfj@^6.1.1:
version "6.1.2" version "6.1.2"
resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f" resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f"
@@ -2427,15 +2551,6 @@ bindings@^1.5.0:
dependencies: dependencies:
file-uri-to-path "1.0.0" file-uri-to-path "1.0.0"
bl@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489"
integrity sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==
dependencies:
buffer "^5.5.0"
inherits "^2.0.4"
readable-stream "^3.4.0"
bluebird@^3.1.1, bluebird@^3.5.5: bluebird@^3.1.1, bluebird@^3.5.5:
version "3.7.2" version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
@@ -2451,7 +2566,7 @@ bn.js@^5.0.0, bn.js@^5.1.1:
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b"
integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==
body-parser@1.19.0: body-parser@1.19.0, body-parser@^1.19.0:
version "1.19.0" version "1.19.0"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
@@ -2618,7 +2733,7 @@ buffer@^4.3.0:
ieee754 "^1.1.4" ieee754 "^1.1.4"
isarray "^1.0.0" isarray "^1.0.0"
buffer@^5.1.0, buffer@^5.5.0: buffer@^5.1.0:
version "5.7.1" version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
@@ -3035,6 +3150,11 @@ commander@^4.1.1:
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
commander@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
commondir@^1.0.1: commondir@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@@ -3260,6 +3380,17 @@ create-require@^1.1.0, create-require@^1.1.1:
resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
cross-spawn@^6.0.5:
version "6.0.5"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
dependencies:
nice-try "^1.0.4"
path-key "^2.0.1"
semver "^5.5.0"
shebang-command "^1.2.0"
which "^1.2.9"
cross-spawn@^7.0.0, cross-spawn@^7.0.2: cross-spawn@^7.0.0, cross-spawn@^7.0.2:
version "7.0.3" version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
@@ -3527,13 +3658,6 @@ decode-uri-component@^0.2.0:
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
decompress-response@^4.2.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986"
integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==
dependencies:
mimic-response "^2.0.0"
deep-extend@^0.6.0: deep-extend@^0.6.0:
version "0.6.0" version "0.6.0"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
@@ -3626,7 +3750,7 @@ detect-indent@^5.0.0:
resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50=
detect-libc@^1.0.2, detect-libc@^1.0.3: detect-libc@^1.0.2:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
@@ -3823,7 +3947,7 @@ encodeurl@~1.0.2:
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: end-of-stream@^1.0.0, end-of-stream@^1.1.0:
version "1.4.4" version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
@@ -4293,10 +4417,12 @@ expand-brackets@^2.1.4:
snapdragon "^0.8.1" snapdragon "^0.8.1"
to-regex "^3.0.1" to-regex "^3.0.1"
expand-template@^2.0.3: express-logging@^1.1.1:
version "2.0.3" version "1.1.1"
resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" resolved "https://registry.yarnpkg.com/express-logging/-/express-logging-1.1.1.tgz#62839618cbab5bb3610f1a1c1485352fe9d26c2a"
integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== integrity sha1-YoOWGMurW7NhDxocFIU1L+nSbCo=
dependencies:
on-headers "^1.0.0"
express@^4.16.3, express@^4.17.1: express@^4.16.3, express@^4.17.1:
version "4.17.1" version "4.17.1"
@@ -4618,11 +4744,6 @@ from2@^2.1.0:
inherits "^2.0.1" inherits "^2.0.1"
readable-stream "^2.0.0" readable-stream "^2.0.0"
fs-constants@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
fs-extra@^8.1.0: fs-extra@^8.1.0:
version "8.1.0" version "8.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
@@ -4781,11 +4902,6 @@ git-url-parse@^11.4.0:
dependencies: dependencies:
git-up "^4.0.0" git-up "^4.0.0"
github-from-package@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=
glob-parent@^3.1.0: glob-parent@^3.1.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
@@ -5667,6 +5783,11 @@ jsonfile@^6.0.1:
optionalDependencies: optionalDependencies:
graceful-fs "^4.1.6" graceful-fs "^4.1.6"
jwt-decode@^3.0.0:
version "3.1.2"
resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59"
integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==
kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
version "3.2.2" version "3.2.2"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
@@ -5737,6 +5858,16 @@ load-json-file@^2.0.0:
pify "^2.0.0" pify "^2.0.0"
strip-bom "^3.0.0" strip-bom "^3.0.0"
load-json-file@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs=
dependencies:
graceful-fs "^4.1.2"
parse-json "^4.0.0"
pify "^3.0.0"
strip-bom "^3.0.0"
loader-runner@^2.3.1, loader-runner@^2.4.0: loader-runner@^2.3.1, loader-runner@^2.4.0:
version "2.4.0" version "2.4.0"
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
@@ -5838,6 +5969,11 @@ loglevel@^1.6.2:
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197"
integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==
lokijs@^1.5.11:
version "1.5.11"
resolved "https://registry.yarnpkg.com/lokijs/-/lokijs-1.5.11.tgz#2b2ea82ec66050e4b112c6cfc588dac22d362b13"
integrity sha512-YYyuBPxMn/oS0tFznQDbIX5XL1ltMcwFqCboDr8voYE4VCDzR5vAsrvQDhlnua4lBeqMqHmLvUXRTmRUzUKH1Q==
lower-case@^1.1.1: lower-case@^1.1.1:
version "1.1.4" version "1.1.4"
resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
@@ -5872,6 +6008,11 @@ lru-cache@^6.0.0:
dependencies: dependencies:
yallist "^4.0.0" yallist "^4.0.0"
lunr@^2.3.9:
version "2.3.9"
resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1"
integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==
make-dir@^1.0.0: make-dir@^1.0.0:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
@@ -5958,6 +6099,11 @@ memory-fs@^0.5.0:
errno "^0.1.3" errno "^0.1.3"
readable-stream "^2.0.1" readable-stream "^2.0.1"
memorystream@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI=
merge-descriptors@1.0.1: merge-descriptors@1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
@@ -6052,11 +6198,6 @@ mimic-fn@^2.1.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
mimic-response@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43"
integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==
minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
@@ -6074,7 +6215,7 @@ minimatch@^3.0.4:
dependencies: dependencies:
brace-expansion "^1.1.7" brace-expansion "^1.1.7"
minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: minimist@^1.2.0, minimist@^1.2.5:
version "1.2.5" version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
@@ -6100,7 +6241,7 @@ minipass-pipeline@^1.2.2:
dependencies: dependencies:
minipass "^3.0.0" minipass "^3.0.0"
minipass@^2.3.5, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
version "2.9.0" version "2.9.0"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
@@ -6146,11 +6287,6 @@ mixin-deep@^1.2.0:
for-in "^1.0.2" for-in "^1.0.2"
is-extendable "^1.0.1" is-extendable "^1.0.1"
mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
version "0.5.3"
resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1:
version "0.5.5" version "0.5.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
@@ -6243,11 +6379,6 @@ nanomatch@^1.2.9:
snapdragon "^0.8.1" snapdragon "^0.8.1"
to-regex "^3.0.1" to-regex "^3.0.1"
napi-build-utils@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806"
integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==
natural-compare@^1.4.0: natural-compare@^1.4.0:
version "1.4.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
@@ -6272,6 +6403,32 @@ neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1:
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
netlify-lambda@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/netlify-lambda/-/netlify-lambda-2.0.2.tgz#1a64286d9094ca9e5fd9088315dd54cf42ddfa43"
integrity sha512-Pf9M+vRsAgSLQ7ZaHajqgIGWYDXYEHGhzM2f8BwYbc3+SL/PjPXR1hdtnl9dgwzrFbPQYEOjHU5LqficUenhYw==
dependencies:
"@babel/core" "^7.10.4"
"@babel/plugin-proposal-class-properties" "^7.10.4"
"@babel/plugin-proposal-object-rest-spread" "^7.10.4"
"@babel/plugin-transform-object-assign" "^7.10.4"
"@babel/preset-env" "^7.10.4"
babel-loader "^8.1.0"
body-parser "^1.19.0"
commander "^5.1.0"
express "^4.17.1"
express-logging "^1.1.1"
globby "^11.0.1"
jwt-decode "^3.0.0"
toml "^3.0.0"
webpack "^4.43.0"
webpack-merge "^4.2.2"
nice-try@^1.0.4:
version "1.0.5"
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
no-case@^2.2.0: no-case@^2.2.0:
version "2.3.2" version "2.3.2"
resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
@@ -6287,13 +6444,6 @@ no-case@^3.0.4:
lower-case "^2.0.2" lower-case "^2.0.2"
tslib "^2.0.3" tslib "^2.0.3"
node-abi@^2.7.0:
version "2.19.3"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.19.3.tgz#252f5dcab12dad1b5503b2d27eddd4733930282d"
integrity sha512-9xZrlyfvKhWme2EXFKQhZRp1yNWT/uI1luYPr3sFl+H4keYY4xR+1jO7mvTTijIsHf1M+QDe9uWuKeEpLInIlg==
dependencies:
semver "^5.4.1"
node-addon-api@^3.0.2: node-addon-api@^3.0.2:
version "3.0.2" version "3.0.2"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.0.2.tgz#04bc7b83fd845ba785bb6eae25bc857e1ef75681" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.0.2.tgz#04bc7b83fd845ba785bb6eae25bc857e1ef75681"
@@ -6385,11 +6535,6 @@ nodejieba@^2.5.1:
node-addon-api "^3.0.2" node-addon-api "^3.0.2"
node-pre-gyp "^0.14.0" node-pre-gyp "^0.14.0"
noop-logger@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2"
integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=
nopt@^4.0.1: nopt@^4.0.1:
version "4.0.3" version "4.0.3"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
@@ -6461,6 +6606,21 @@ npm-packlist@^1.1.6:
npm-bundled "^1.0.1" npm-bundled "^1.0.1"
npm-normalize-package-bin "^1.0.1" npm-normalize-package-bin "^1.0.1"
npm-run-all@^4.1.5:
version "4.1.5"
resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba"
integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==
dependencies:
ansi-styles "^3.2.1"
chalk "^2.4.1"
cross-spawn "^6.0.5"
memorystream "^0.3.1"
minimatch "^3.0.4"
pidtree "^0.3.0"
read-pkg "^3.0.0"
shell-quote "^1.6.1"
string.prototype.padend "^3.0.0"
npm-run-path@^4.0.0: npm-run-path@^4.0.0:
version "4.0.1" version "4.0.1"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
@@ -6468,7 +6628,7 @@ npm-run-path@^4.0.0:
dependencies: dependencies:
path-key "^3.0.0" path-key "^3.0.0"
npmlog@^4.0.1, npmlog@^4.0.2: npmlog@^4.0.2:
version "4.1.2" version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
@@ -6599,7 +6759,7 @@ on-finished@^2.3.0, on-finished@~2.3.0:
dependencies: dependencies:
ee-first "1.1.1" ee-first "1.1.1"
on-headers@^1.0.2, on-headers@~1.0.2: on-headers@^1.0.0, on-headers@^1.0.2, on-headers@~1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
@@ -6871,6 +7031,11 @@ path-is-absolute@^1.0.0:
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
path-key@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
path-key@^3.0.0, path-key@^3.1.0: path-key@^3.0.0, path-key@^3.1.0:
version "3.1.1" version "3.1.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
@@ -6893,6 +7058,13 @@ path-type@^2.0.0:
dependencies: dependencies:
pify "^2.0.0" pify "^2.0.0"
path-type@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
dependencies:
pify "^3.0.0"
path-type@^4.0.0: path-type@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
@@ -6914,6 +7086,11 @@ picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1:
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
pidtree@^0.3.0:
version "0.3.1"
resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a"
integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==
pify@^2.0.0, pify@^2.3.0: pify@^2.0.0, pify@^2.3.0:
version "2.3.0" version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
@@ -7609,27 +7786,6 @@ postcss@7.x.x, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17,
source-map "^0.6.1" source-map "^0.6.1"
supports-color "^6.1.0" supports-color "^6.1.0"
prebuild-install@^5.3.3:
version "5.3.6"
resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.6.tgz#7c225568d864c71d89d07f8796042733a3f54291"
integrity sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==
dependencies:
detect-libc "^1.0.3"
expand-template "^2.0.3"
github-from-package "0.0.0"
minimist "^1.2.3"
mkdirp-classic "^0.5.3"
napi-build-utils "^1.0.1"
node-abi "^2.7.0"
noop-logger "^0.1.1"
npmlog "^4.0.1"
pump "^3.0.0"
rc "^1.2.7"
simple-get "^3.0.3"
tar-fs "^2.0.0"
tunnel-agent "^0.6.0"
which-pm-runs "^1.0.0"
prelude-ls@^1.2.1: prelude-ls@^1.2.1:
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
@@ -7889,6 +8045,15 @@ read-pkg@^2.0.0:
normalize-package-data "^2.3.2" normalize-package-data "^2.3.2"
path-type "^2.0.0" path-type "^2.0.0"
read-pkg@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=
dependencies:
load-json-file "^4.0.0"
normalize-package-data "^2.3.2"
path-type "^3.0.0"
read-pkg@^5.2.0: read-pkg@^5.2.0:
version "5.2.0" version "5.2.0"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
@@ -7912,7 +8077,7 @@ read-pkg@^5.2.0:
string_decoder "~1.1.1" string_decoder "~1.1.1"
util-deprecate "~1.0.1" util-deprecate "~1.0.1"
readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: readable-stream@^3.1.1, readable-stream@^3.6.0:
version "3.6.0" version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@@ -8343,6 +8508,13 @@ sha.js@^2.4.0, sha.js@^2.4.8:
inherits "^2.0.1" inherits "^2.0.1"
safe-buffer "^5.0.1" safe-buffer "^5.0.1"
shebang-command@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
dependencies:
shebang-regex "^1.0.0"
shebang-command@^2.0.0: shebang-command@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
@@ -8350,6 +8522,11 @@ shebang-command@^2.0.0:
dependencies: dependencies:
shebang-regex "^3.0.0" shebang-regex "^3.0.0"
shebang-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
shebang-regex@^3.0.0: shebang-regex@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
@@ -8372,20 +8549,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
simple-concat@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
simple-get@^3.0.3:
version "3.1.0"
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3"
integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==
dependencies:
decompress-response "^4.2.0"
once "^1.3.1"
simple-concat "^1.0.0"
simple-swizzle@^0.2.2: simple-swizzle@^0.2.2:
version "0.2.2" version "0.2.2"
resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
@@ -8665,6 +8828,15 @@ string-width@^4.0.0, string-width@^4.1.0:
is-fullwidth-code-point "^3.0.0" is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.0" strip-ansi "^6.0.0"
string.prototype.padend@^3.0.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.1.tgz#824c84265dbac46cade2b957b38b6a5d8d1683c5"
integrity sha512-eCzTASPnoCr5Ht+Vn1YXgm8SB015hHKgEIMu9Nr9bQmLhRBxKRfmzSj/IQsxDFc8JInJDDFA0qXwK+xxI7wDkg==
dependencies:
call-bind "^1.0.0"
define-properties "^1.1.3"
es-abstract "^1.18.0-next.1"
string.prototype.trimend@^1.0.1: string.prototype.trimend@^1.0.1:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b"
@@ -8833,40 +9005,6 @@ tapable@^1.0.0, tapable@^1.0.0-beta.5, tapable@^1.1.3:
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
tar-fs@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==
dependencies:
chownr "^1.1.1"
mkdirp-classic "^0.5.2"
pump "^3.0.0"
tar-stream "^2.1.4"
tar-stream@^2.1.4:
version "2.1.4"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa"
integrity sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==
dependencies:
bl "^4.0.3"
end-of-stream "^1.4.1"
fs-constants "^1.0.0"
inherits "^2.0.3"
readable-stream "^3.1.1"
tar@4.4.10:
version "4.4.10"
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1"
integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==
dependencies:
chownr "^1.1.1"
fs-minipass "^1.2.5"
minipass "^2.3.5"
minizlib "^1.2.1"
mkdirp "^0.5.0"
safe-buffer "^5.1.2"
yallist "^3.0.3"
tar@^4.4.2: tar@^4.4.2:
version "4.4.13" version "4.4.13"
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
@@ -9022,6 +9160,11 @@ toidentifier@1.0.0:
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
toml@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee"
integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==
tryer@^1.0.1: tryer@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
@@ -9082,13 +9225,6 @@ tty-browserify@0.0.0:
resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
dependencies:
safe-buffer "^5.0.1"
type-check@^0.4.0, type-check@~0.4.0: type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
@@ -9554,6 +9690,13 @@ webpack-log@^2.0.0:
ansi-colors "^3.0.0" ansi-colors "^3.0.0"
uuid "^3.3.2" uuid "^3.3.2"
webpack-merge@^4.2.2:
version "4.2.2"
resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d"
integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==
dependencies:
lodash "^4.17.15"
webpack-node-externals@^2.5.2: webpack-node-externals@^2.5.2:
version "2.5.2" version "2.5.2"
resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-2.5.2.tgz#178e017a24fec6015bc9e672c77958a6afac861d" resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-2.5.2.tgz#178e017a24fec6015bc9e672c77958a6afac861d"
@@ -9567,7 +9710,7 @@ webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-
source-list-map "^2.0.0" source-list-map "^2.0.0"
source-map "~0.6.1" source-map "~0.6.1"
webpack@^4.44.2: webpack@^4.43.0, webpack@^4.44.2:
version "4.44.2" version "4.44.2"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72"
integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==
@@ -9615,10 +9758,12 @@ which-module@^2.0.0:
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
which-pm-runs@^1.0.0: which@^1.2.9:
version "1.0.0" version "1.3.1"
resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
dependencies:
isexe "^2.0.0"
which@^2.0.1: which@^2.0.1:
version "2.0.2" version "2.0.2"