feat(docs): add source and contributors (#6044)

* feat(docs): add source and contributors

closes #6038

* feat(docs): ignore contributor when dev

* ci: add github token

* fix: lint

* fix: page

* fix: placeholder

* ci: remove preview
This commit is contained in:
三咲智子 2022-04-08 00:40:25 +08:00 committed by GitHub
parent 28c3634cda
commit 851242e317
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 664 additions and 31 deletions

View File

@ -59,6 +59,7 @@ jobs:
run: pnpm docs:build
env:
DOC_ENV: production
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Deploy
uses: JamesIves/github-pages-deploy-action@v4.2.5

View File

@ -52,6 +52,7 @@ jobs:
run: pnpm docs:build
env:
DOC_ENV: production
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Deploy
uses: JamesIves/github-pages-deploy-action@v4.2.5

View File

@ -61,6 +61,7 @@ jobs:
env:
DOC_ENV: staging
NODE_OPTIONS: --max-old-space-size=4096
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Deploy staging website
uses: JamesIves/github-pages-deploy-action@v4.2.5

View File

@ -5,6 +5,7 @@ import { sidebars } from './config/sidebars'
import { nav } from './config/nav'
import { mdPlugin } from './config/plugins'
import { features } from './config/features'
import { branch, docsDir, repo } from './vitepress/constant'
import type { UserConfig } from 'vitepress'
const buildTransformers = () => {
@ -49,8 +50,9 @@ export const config: UserConfig = {
lastUpdated: true,
head,
themeConfig: {
repo: 'element-plus/element-plus',
docsDir: 'docs',
repo,
branch,
docsDir,
editLinks: true,
editLinkText: 'Edit this page on GitHub',

View File

@ -8,7 +8,6 @@ import type Token from 'markdown-it/lib/token'
import type Renderer from 'markdown-it/lib/renderer'
const localMd = MarkdownIt()
const scriptSetupRE = /<\s*script[^>]*\bsetup\b[^>]*/
interface ContainerOpts {
marker?: string | undefined
@ -29,9 +28,6 @@ export const mdPlugin = (md: MarkdownIt) => {
},
render(tokens, idx) {
const data = (md as any).__data
const hoistedTags: string[] = data.hoistedTags || (data.hoistedTags = [])
const m = tokens[idx].info.trim().match(/^demo\s*(.*)$/)
if (tokens[idx].nesting === 1 /* means the tag is opening */) {
const description = m && m.length > 1 ? m[1] : ''
@ -44,17 +40,6 @@ export const mdPlugin = (md: MarkdownIt) => {
path.resolve(docRoot, 'examples', `${sourceFile}.vue`),
'utf-8'
)
const existingScriptIndex = hoistedTags.findIndex((tag) =>
scriptSetupRE.test(tag)
)
if (existingScriptIndex === -1) {
hoistedTags.push(`
<script setup>
const demos = import.meta.globEager('../../examples/${
sourceFile.split('/')[0]
}/*.vue')
</script>`)
}
}
if (!source) throw new Error(`Incorrect source file: ${sourceFile}`)

View File

@ -0,0 +1,6 @@
{
"source": "Source",
"contributors": "Contributors",
"component": "Component",
"docs": "Docs"
}

View File

@ -0,0 +1,169 @@
import path from 'path'
import glob from 'fast-glob'
import { Octokit } from 'octokit'
import { projRoot } from '@element-plus/build'
import { branch, owner, repoName } from '../vitepress/constant'
import type { Plugin } from 'vite'
interface FetchOption {
path: string
after?: string
}
interface ApiResult {
pageInfo: {
hasNextPage: boolean
endCursor: string
}
nodes: Array<{
author: {
avatarUrl: string
date: string
email: string
name: string
user?: {
login: string
}
}
}>
}
interface ApiResponse {
repository: {
object: Record<`path${number}`, ApiResult>
}
}
interface ContributorInfo {
login: string
name: string
email: string
avatar: string
count: number
}
const octokit = new Octokit({
auth: process.env.GITHUB_TOKEN,
})
const fetchContributors = async (
options: FetchOption[]
): Promise<Record<string, ApiResult>> => {
const query = `{
repository(owner: "${owner}", name: "${repoName}") {
object(expression: "${branch}") {
... on Commit {
${options
.map(({ path, after }, index) => {
return `
path${index}: history(path: "${path}"${
after ? `, after: "${after}"` : ''
}) {
nodes {
author {
avatarUrl
date
email
name
user {
login
}
}
}
pageInfo {
hasNextPage
endCursor
}
}`
})
.join('\n')}
}
}
}
}`
const respnose = (await octokit.graphql<ApiResponse>(query)).repository.object
return Object.fromEntries(
Object.entries(respnose).map(([key, result]) => {
const index = +key.replace('path', '')
return [index, result]
})
)
}
const calcContributors = (commits: ApiResult['nodes']) => {
const contributors: Record<string, ContributorInfo> = {}
for (const { author } of commits) {
const login = author.user?.login
if (!login) continue
if (!contributors[login])
contributors[login] = {
login,
name: author.name,
email: author.email,
avatar: author.avatarUrl,
count: 0,
}
contributors[login].count++
}
return Object.values(contributors).sort((a, b) => b.count - a.count)
}
const getContributorsAt = async (componentName: string) => {
let options: FetchOption[] = [
{ path: `packages/components/${componentName}` },
{ path: `packages/theme-chalk/src/${componentName}.scss` },
{ path: `docs/examples/${componentName}` },
{ path: `docs/en-US/component/${componentName}.md` },
]
const commits: ApiResult['nodes'] = []
do {
const results = await fetchContributors(options)
options = options
.map((option, index) => {
const pageInfo = results[index].pageInfo
const after = pageInfo.hasNextPage ? pageInfo.endCursor : undefined
return { ...option, after }
})
.filter((option) => !!option.after)
commits.push(...Object.values(results).flatMap((result) => result.nodes))
} while (options.length > 0)
return calcContributors(commits)
}
export async function getContributors() {
if (!process.env.GITHUB_TOKEN) return {}
const components = await glob('*', {
cwd: path.resolve(projRoot, 'packages/components'),
onlyDirectories: true,
})
const contributors = Object.fromEntries(
await Promise.all(
components.map((component) =>
getContributorsAt(component).then((contributors) => [
component,
contributors,
])
)
)
)
return contributors
}
const ID = '/virtual-contributors'
export async function Contributors(): Promise<Plugin> {
const data = await getContributors()
return {
name: 'element-plus-contributors',
resolveId(id) {
return id === ID ? ID : null
},
load(id) {
if (id !== ID) return null
return `export default ${JSON.stringify(data)}`
},
}
}

View File

@ -0,0 +1,114 @@
import fs from 'fs'
import path from 'path'
import { docRoot, projRoot } from '@element-plus/build'
import { branch, docsDir, repo } from '../vitepress/constant'
import { getLang } from '../utils/lang'
import footerLocale from '../i18n/component/footer.json'
import type { Plugin } from 'vite'
type Append = Record<'headers' | 'footers' | 'scriptSetups', string[]>
export function MarkdownTransform(): Plugin {
return {
name: 'element-plus-md-transform',
enforce: 'pre',
async transform(code, id) {
if (!id.endsWith('.md')) return
const componentId = path.basename(id, '.md')
const append: Append = {
headers: [],
footers: [],
scriptSetups: [
`const demos = import.meta.globEager('../../examples/${componentId}/*.vue')`,
],
}
code = transformVpScriptSetup(code, append)
const compPath = path.resolve(docRoot, 'en-US/component')
if (id.startsWith(compPath)) {
code = transformComponentMarkdown(id, componentId, code, append)
}
return combineMarkdown(
code,
[combineScriptSetup(append.scriptSetups), ...append.headers],
append.footers
)
},
}
}
const combineScriptSetup = (codes: string[]) =>
`\n<script setup>
${codes.join('\n')}
</script>
`
const combineMarkdown = (
code: string,
headers: string[],
footers: string[]
) => {
const frontmatterEnds = code.indexOf('---\n\n') + 4
const firstSubheader = code.search(/\n## \w/)
const sliceIndex = firstSubheader < 0 ? frontmatterEnds : firstSubheader
if (headers.length > 0)
code =
code.slice(0, sliceIndex) + headers.join('\n') + code.slice(sliceIndex)
code += footers.join('\n')
return `${code}\n`
}
const vpScriptSetupRE = /<vp-script\s(.*\s)?setup(\s.*)?>([\s\S]*)<\/vp-script>/
const transformVpScriptSetup = (code: string, append: Append) => {
const matches = code.match(vpScriptSetupRE)
if (matches) code = code.replace(matches[0], '')
const scriptSetup = matches?.[3] ?? ''
if (scriptSetup) append.scriptSetups.push(scriptSetup)
return code
}
const GITHUB_BLOB_URL = `https://github.com/${repo}/blob/${branch}`
const GITHUB_TREE_URL = `https://github.com/${repo}/tree/${branch}`
const transformComponentMarkdown = (
id: string,
componentId: string,
code: string,
append: Append
) => {
const lang = getLang(id)
const docUrl = `${GITHUB_BLOB_URL}/${docsDir}/en-US/component/${componentId}.md`
const componentUrl = `${GITHUB_TREE_URL}/packages/components/${componentId}`
const componentPath = path.resolve(
projRoot,
`packages/components/${componentId}`
)
const isComponent = fs.existsSync(componentPath)
const links = [[footerLocale[lang].docs, docUrl]]
if (isComponent) links.unshift([footerLocale[lang].component, componentUrl])
const linksText = links
.filter((i) => i)
.map(([text, link]) => `[${text}](${link})`)
.join(' • ')
const sourceSection = `## ${footerLocale[lang].source}
${linksText}
`
const contributorsSection = `
## ${footerLocale[lang].contributors}
<Contributors id="${componentId}" />
`
append.footers.push(sourceSection, isComponent ? contributorsSection : '')
return code
}

View File

@ -1,6 +1,10 @@
import fs from 'fs'
import path from 'path'
import { docRoot } from '@element-plus/build'
export const languages = fs.readdirSync(path.resolve(__dirname, '../crowdin'))
export const ensureLang = (lang: string) => `/${lang}`
export const getLang = (id: string) =>
path.relative(docRoot, id).split(path.sep)[0]

View File

@ -0,0 +1,37 @@
<script setup lang="ts">
import { computed } from 'vue'
// @ts-expect-error missing types
import _contributors from '/virtual-contributors'
import VpLink from '../common/vp-link.vue'
const props = defineProps<{ id: string }>()
const contributors = computed(() => _contributors[props.id])
</script>
<template>
<div class="mb-4">
<div class="flex flex-wrap gap-4 pt-2">
<div v-for="c of contributors" :key="c.hash">
<VpLink
:href="`https://github.com/${c.login}`"
class="flex gap-2 items-center link"
no-icon
>
<img :src="c.avatar" class="w-8 h-8 rounded-full" />
{{ c.name }}
</VpLink>
</div>
</div>
</div>
</template>
<style lang="scss" scoped>
.link {
color: var(--text-color-light);
&:hover {
color: var(--brand-color);
}
}
</style>

View File

@ -12,13 +12,9 @@ import Example from './demo/vp-example.vue'
import SourceCode from './demo/vp-source-code.vue'
const props = defineProps<{
demos: object
source: string
path: string
css?: string
cssPreProcessor?: string
js?: string
html?: string
demos: object
rawSource: string
description?: string
}>()

View File

@ -9,3 +9,9 @@ export const breakpoints = {
xlg: 1280,
xxl: 1440,
}
export const owner = 'element-plus'
export const repoName = 'element-plus'
export const repo = 'element-plus/element-plus'
export const branch = 'dev'
export const docsDir = 'docs'

View File

@ -24,6 +24,7 @@ import IconList from './components/globals/icons.vue'
import ParallaxHome from './components/globals/parallax-home.vue'
import Resource from './components/globals/resource.vue'
import DesignGuide from './components/globals/design-guide.vue'
import Contributors from './components/globals/contributors.vue'
import type { Component } from 'vue'
@ -40,4 +41,5 @@ export const globals: [string, Component][] = [
['ParallaxHome', ParallaxHome],
['Resource', Resource],
['DesignGuide', DesignGuide],
['Contributors', Contributors],
]

View File

@ -6,6 +6,7 @@ import {
} from 'vitepress/dist/client/theme-default/utils'
import { inBrowser } from 'vitepress'
import type { Ref } from 'vue'
import type { Route } from 'vitepress'
export * from './colors'
@ -85,13 +86,17 @@ export function createCrowdinUrl(targetLang: string) {
return `https://crowdin.com/translate/element-plus/all/en-${translateLang}`
}
export function insertLinkIcon(contentRef: any) {
export function insertLinkIcon(
contentRef: Ref<{ $el: HTMLElement } | undefined>
) {
if (!inBrowser) return
const links = Array.from(
contentRef.value?.$el.querySelectorAll('a:not(.header-anchor)') ?? []
contentRef.value?.$el?.querySelectorAll<HTMLLinkElement>(
'a:not(.header-anchor)'
) ?? []
)
links.forEach((link: any) => {
links.forEach((link) => {
link.classList.add('vp-link')
if (
!link.href.startsWith(window.origin) &&

View File

@ -52,9 +52,9 @@ so you need to use an alias in order to render the icon, if you register `Menu`
</template>
```
<script setup>
<vp-script setup>
import { Edit, Share, Delete, Search, Loading } from '@element-plus/icons-vue'
</script>
</vp-script>
<ElRow>
<div>

View File

@ -12,7 +12,7 @@ Before that, please read the [transition docs](https://vuejs.org/guide/built-ins
:::demo We have two fading effects: `el-fade-in-linear` and `el-fade-in`.
transition/fade
transitions/fade
:::
@ -20,7 +20,7 @@ transition/fade
:::demo `el-zoom-in-center`, `el-zoom-in-top` and `el-zoom-in-bottom` are provided.
transition/zoom
transitions/zoom
:::
@ -30,7 +30,7 @@ For collapse effect, use the `el-collapse-transition` component.
:::demo
transition/collapse
transitions/collapse
:::

View File

@ -3,3 +3,5 @@ title: 'A Vue 3 UI Framework'
lang: en-US
page: true
---
<!-- Placeholder -->

View File

@ -28,6 +28,7 @@
"escape-html": "^1.0.3",
"markdown-it": "^12.3.2",
"markdown-it-container": "^3.0.0",
"octokit": "^1.7.1",
"unocss": "^0.30.11",
"unplugin-icons": "^0.14.1",
"unplugin-vue-components": "^0.18.5",

View File

@ -14,6 +14,8 @@ import {
getPackageDependencies,
projRoot,
} from '@element-plus/build'
import { Contributors } from './.vitepress/plugins/contributors'
import { MarkdownTransform } from './.vitepress/plugins/markdown-transform'
import type { Alias } from 'vite'
const alias: Alias[] = []
@ -82,6 +84,8 @@ export default defineConfig(async ({ mode }) => {
autoInstall: true,
}),
UnoCSS(),
MarkdownTransform(),
await Contributors(),
Inspect(),
mkcert(),
],

View File

@ -178,6 +178,7 @@ importers:
markdown-it-container: ^3.0.0
normalize.css: ^8.0.1
nprogress: ^0.2.0
octokit: ^1.7.1
prism-theme-vars: ^0.2.2
unocss: ^0.30.11
unplugin-icons: ^0.14.1
@ -204,6 +205,7 @@ importers:
escape-html: 1.0.3
markdown-it: 12.3.2
markdown-it-container: 3.0.0
octokit: 1.7.1
unocss: 0.30.11
unplugin-icons: 0.14.1_vite@2.9.1
unplugin-vue-components: 0.18.5_vite@2.9.1+vue@3.2.31
@ -2201,12 +2203,102 @@ packages:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.13.0
/@octokit/app/12.0.5:
resolution: {integrity: sha512-lM3pIfx2h+UbvsXHFVs1ApJ9Rmp8LO4ciFSr5q/9MdHmhsH6WtwayieUn875xwB77IoR9r8czxxxASu2WCtdeA==}
dependencies:
'@octokit/auth-app': 3.6.1
'@octokit/auth-unauthenticated': 2.1.0
'@octokit/core': 3.5.1
'@octokit/oauth-app': 3.6.0
'@octokit/plugin-paginate-rest': 2.17.0_@octokit+core@3.5.1
'@octokit/types': 6.34.0
'@octokit/webhooks': 9.22.0
transitivePeerDependencies:
- encoding
dev: true
/@octokit/auth-app/3.6.1:
resolution: {integrity: sha512-6oa6CFphIYI7NxxHrdVOzhG7hkcKyGyYocg7lNDSJVauVOLtylg8hNJzoUyPAYKKK0yUeoZamE/lMs2tG+S+JA==}
dependencies:
'@octokit/auth-oauth-app': 4.3.0
'@octokit/auth-oauth-user': 1.3.0
'@octokit/request': 5.6.3
'@octokit/request-error': 2.1.0
'@octokit/types': 6.34.0
'@types/lru-cache': 5.1.1
deprecation: 2.3.1
lru-cache: 6.0.0
universal-github-app-jwt: 1.1.0
universal-user-agent: 6.0.0
transitivePeerDependencies:
- encoding
dev: true
/@octokit/auth-oauth-app/4.3.0:
resolution: {integrity: sha512-cETmhmOQRHCz6cLP7StThlJROff3A/ln67Q961GuIr9zvyFXZ4lIJy9RE6Uw5O7D8IXWPU3jhDnG47FTSGQr8Q==}
dependencies:
'@octokit/auth-oauth-device': 3.1.2
'@octokit/auth-oauth-user': 1.3.0
'@octokit/request': 5.6.3
'@octokit/types': 6.34.0
'@types/btoa-lite': 1.0.0
btoa-lite: 1.0.0
universal-user-agent: 6.0.0
transitivePeerDependencies:
- encoding
dev: true
/@octokit/auth-oauth-device/3.1.2:
resolution: {integrity: sha512-w7Po4Ck6N2aAn2VQyKLuojruiyKROTBv4qs6IwE5rbwF7HhBXXp4A/NKmkpoFIZkiXQtM+N8QtkSck4ApYWdGg==}
dependencies:
'@octokit/oauth-methods': 1.2.6
'@octokit/request': 5.6.3
'@octokit/types': 6.34.0
universal-user-agent: 6.0.0
transitivePeerDependencies:
- encoding
dev: true
/@octokit/auth-oauth-user/1.3.0:
resolution: {integrity: sha512-3QC/TAdk7onnxfyZ24BnJRfZv8TRzQK7SEFUS9vLng4Vv6Hv6I64ujdk/CUkREec8lhrwU764SZ/d+yrjjqhaQ==}
dependencies:
'@octokit/auth-oauth-device': 3.1.2
'@octokit/oauth-methods': 1.2.6
'@octokit/request': 5.6.3
'@octokit/types': 6.34.0
btoa-lite: 1.0.0
universal-user-agent: 6.0.0
transitivePeerDependencies:
- encoding
dev: true
/@octokit/auth-token/2.5.0:
resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==}
dependencies:
'@octokit/types': 6.34.0
dev: true
/@octokit/auth-unauthenticated/2.1.0:
resolution: {integrity: sha512-+baofLfSL0CAv3CfGQ9rxiZZQEX8VNJMGuuS4PgrMRBUL52Ho5+hQYb63UJQshw7EXYMPDZxbXznc0y33cbPqw==}
dependencies:
'@octokit/request-error': 2.1.0
'@octokit/types': 6.34.0
dev: true
/@octokit/core/3.5.1:
resolution: {integrity: sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==}
dependencies:
'@octokit/auth-token': 2.5.0
'@octokit/graphql': 4.8.0
'@octokit/request': 5.6.3
'@octokit/request-error': 2.1.0
'@octokit/types': 6.34.0
before-after-hook: 2.2.2
universal-user-agent: 6.0.0
transitivePeerDependencies:
- encoding
dev: true
/@octokit/core/3.6.0:
resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==}
dependencies:
@ -2239,10 +2331,51 @@ packages:
- encoding
dev: true
/@octokit/oauth-app/3.6.0:
resolution: {integrity: sha512-OxPw4ItQXaC2GuEXyZB7EmZ2rHvNFX4y3yAsqdFIRW7qg2HyoEPxacxza6c8wqbEEvu84b98AJ5BXm+IjPWrww==}
dependencies:
'@octokit/auth-oauth-app': 4.3.0
'@octokit/auth-oauth-user': 1.3.0
'@octokit/auth-unauthenticated': 2.1.0
'@octokit/core': 3.5.1
'@octokit/oauth-authorization-url': 4.3.3
'@octokit/oauth-methods': 1.2.6
'@types/aws-lambda': 8.10.93
fromentries: 1.3.2
universal-user-agent: 6.0.0
transitivePeerDependencies:
- encoding
dev: true
/@octokit/oauth-authorization-url/4.3.3:
resolution: {integrity: sha512-lhP/t0i8EwTmayHG4dqLXgU+uPVys4WD/qUNvC+HfB1S1dyqULm5Yx9uKc1x79aP66U1Cb4OZeW8QU/RA9A4XA==}
dev: true
/@octokit/oauth-methods/1.2.6:
resolution: {integrity: sha512-nImHQoOtKnSNn05uk2o76om1tJWiAo4lOu2xMAHYsNr0fwopP+Dv+2MlGvaMMlFjoqVd3fF3X5ZDTKCsqgmUaQ==}
dependencies:
'@octokit/oauth-authorization-url': 4.3.3
'@octokit/request': 5.6.3
'@octokit/request-error': 2.1.0
'@octokit/types': 6.34.0
btoa-lite: 1.0.0
transitivePeerDependencies:
- encoding
dev: true
/@octokit/openapi-types/11.2.0:
resolution: {integrity: sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==}
dev: true
/@octokit/plugin-paginate-rest/2.17.0_@octokit+core@3.5.1:
resolution: {integrity: sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==}
peerDependencies:
'@octokit/core': '>=2'
dependencies:
'@octokit/core': 3.5.1
'@octokit/types': 6.34.0
dev: true
/@octokit/plugin-paginate-rest/2.17.0_@octokit+core@3.6.0:
resolution: {integrity: sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==}
peerDependencies:
@ -2260,6 +2393,16 @@ packages:
'@octokit/core': 3.6.0
dev: true
/@octokit/plugin-rest-endpoint-methods/5.13.0_@octokit+core@3.5.1:
resolution: {integrity: sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==}
peerDependencies:
'@octokit/core': '>=3'
dependencies:
'@octokit/core': 3.5.1
'@octokit/types': 6.34.0
deprecation: 2.3.1
dev: true
/@octokit/plugin-rest-endpoint-methods/5.13.0_@octokit+core@3.6.0:
resolution: {integrity: sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==}
peerDependencies:
@ -2270,6 +2413,23 @@ packages:
deprecation: 2.3.1
dev: true
/@octokit/plugin-retry/3.0.9:
resolution: {integrity: sha512-r+fArdP5+TG6l1Rv/C9hVoty6tldw6cE2pRHNGmFPdyfrc696R6JjrQ3d7HdVqGwuzfyrcaLAKD7K8TX8aehUQ==}
dependencies:
'@octokit/types': 6.34.0
bottleneck: 2.19.5
dev: true
/@octokit/plugin-throttling/3.6.1_@octokit+core@3.5.1:
resolution: {integrity: sha512-T5DOcDQP0K/Ng5pnOEqCHDFojsftYL5o91MNbbR3nj1yAOACoGj3wDYCx0+5yJkbvRjYUdU0GsUt5/wYBba1cA==}
peerDependencies:
'@octokit/core': ^3.5.0
dependencies:
'@octokit/core': 3.5.1
'@octokit/types': 6.34.0
bottleneck: 2.19.5
dev: true
/@octokit/request-error/2.1.0:
resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==}
dependencies:
@ -2308,6 +2468,23 @@ packages:
'@octokit/openapi-types': 11.2.0
dev: true
/@octokit/webhooks-methods/2.0.0:
resolution: {integrity: sha512-35cfQ4YWlnZnmZKmIxlGPUPLtbkF8lr/A/1Sk1eC0ddLMwQN06dOuLc+dI3YLQS+T+MoNt3DIQ0NynwgKPilig==}
dev: true
/@octokit/webhooks-types/5.2.0:
resolution: {integrity: sha512-OZhKy1w8/GF4GWtdiJc+o8sloWAHRueGB78FWFLZnueK7EHV9MzDVr4weJZMflJwMK4uuYLzcnJVnAoy3yB35g==}
dev: true
/@octokit/webhooks/9.22.0:
resolution: {integrity: sha512-wUd7nGfDRHG6xkz311djmq6lIB2tQ+r94SNkyv9o0bQhOsrkwH8fQCM7uVsbpkGUU2lqCYsVoa8z/UC9HJgRaw==}
dependencies:
'@octokit/request-error': 2.1.0
'@octokit/webhooks-methods': 2.0.0
'@octokit/webhooks-types': 5.2.0
aggregate-error: 3.1.0
dev: true
/@pnpm/cli-meta/3.0.0:
resolution: {integrity: sha512-7qFkZf45PQbTTVbRvzUGt7illwXUUWdkv8PekgvpFMEjxZC1zx7mY4mMF9P66QOh5NgarbGSvc7Nqt9yEDh00Q==}
engines: {node: '>=14.19'}
@ -2628,6 +2805,10 @@ packages:
resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==}
dev: true
/@types/aws-lambda/8.10.93:
resolution: {integrity: sha512-Vsyi9ogDAY3REZDjYnXMRJJa62SDvxHXxJI5nGDQdZW058dDE+av/anynN2rLKbCKXDRNw3D/sQmqxVflZFi4A==}
dev: true
/@types/babel__core/7.1.19:
resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==}
dependencies:
@ -2657,6 +2838,10 @@ packages:
'@babel/types': 7.17.0
dev: true
/@types/btoa-lite/1.0.0:
resolution: {integrity: sha512-wJsiX1tosQ+J5+bY5LrSahHxr2wT+uME5UDwdN1kg4frt40euqA+wzECkmq4t5QbveHiJepfdThgQrPw6KiSlg==}
dev: true
/@types/chai-subset/1.3.3:
resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==}
dependencies:
@ -2776,6 +2961,12 @@ packages:
resolution: {integrity: sha1-7ihweulOEdK4J7y+UnC86n8+ce4=}
dev: false
/@types/jsonwebtoken/8.5.8:
resolution: {integrity: sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A==}
dependencies:
'@types/node': 17.0.23
dev: true
/@types/linkify-it/3.0.2:
resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==}
dev: true
@ -2790,6 +2981,10 @@ packages:
resolution: {integrity: sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==}
dev: false
/@types/lru-cache/5.1.1:
resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==}
dev: true
/@types/markdown-it/12.2.3:
resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==}
dependencies:
@ -4033,6 +4228,10 @@ packages:
individual: 3.0.0
dev: true
/bottleneck/2.19.5:
resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==}
dev: true
/boxen/5.1.2:
resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==}
engines: {node: '>=10'}
@ -4106,10 +4305,18 @@ packages:
node-int64: 0.4.0
dev: true
/btoa-lite/1.0.0:
resolution: {integrity: sha1-M3dm2hWAEhD92VbCLpxokaudAzc=}
dev: true
/buffer-crc32/0.2.13:
resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=}
dev: true
/buffer-equal-constant-time/1.0.1:
resolution: {integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=}
dev: true
/buffer-equal/1.0.0:
resolution: {integrity: sha1-WWFrSYME1Var1GaWayLu2j7KX74=}
engines: {node: '>=0.4.0'}
@ -5077,6 +5284,12 @@ packages:
safer-buffer: 2.1.2
dev: true
/ecdsa-sig-formatter/1.0.11:
resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
dependencies:
safe-buffer: 5.2.1
dev: true
/electron-to-chromium/1.4.103:
resolution: {integrity: sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==}
@ -6482,6 +6695,10 @@ packages:
dependencies:
map-cache: 0.2.2
/fromentries/1.3.2:
resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==}
dev: true
/fs-constants/1.0.0:
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
dev: true
@ -8114,6 +8331,22 @@ packages:
engines: {'0': node >= 0.2.0}
dev: true
/jsonwebtoken/8.5.1:
resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==}
engines: {node: '>=4', npm: '>=1.4.28'}
dependencies:
jws: 3.2.2
lodash.includes: 4.3.0
lodash.isboolean: 3.0.3
lodash.isinteger: 4.0.4
lodash.isnumber: 3.0.3
lodash.isplainobject: 4.0.6
lodash.isstring: 4.0.1
lodash.once: 4.1.1
ms: 2.1.3
semver: 5.7.1
dev: true
/jsprim/1.4.2:
resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==}
engines: {node: '>=0.6.0'}
@ -8128,6 +8361,21 @@ packages:
resolution: {integrity: sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==}
dev: false
/jwa/1.4.1:
resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==}
dependencies:
buffer-equal-constant-time: 1.0.1
ecdsa-sig-formatter: 1.0.11
safe-buffer: 5.2.1
dev: true
/jws/3.2.2:
resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==}
dependencies:
jwa: 1.4.1
safe-buffer: 5.2.1
dev: true
/kind-of/3.2.2:
resolution: {integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=}
engines: {node: '>=0.10.0'}
@ -8347,6 +8595,30 @@ packages:
resolution: {integrity: sha1-gteb/zCmfEAF/9XiUVMArZyk168=}
dev: true
/lodash.includes/4.3.0:
resolution: {integrity: sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=}
dev: true
/lodash.isboolean/3.0.3:
resolution: {integrity: sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=}
dev: true
/lodash.isinteger/4.0.4:
resolution: {integrity: sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=}
dev: true
/lodash.isnumber/3.0.3:
resolution: {integrity: sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=}
dev: true
/lodash.isplainobject/4.0.6:
resolution: {integrity: sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=}
dev: true
/lodash.isstring/4.0.1:
resolution: {integrity: sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=}
dev: true
/lodash.map/4.6.0:
resolution: {integrity: sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=}
dev: true
@ -8355,6 +8627,10 @@ packages:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
dev: true
/lodash.once/4.1.1:
resolution: {integrity: sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=}
dev: true
/lodash/4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
@ -8706,7 +8982,6 @@ packages:
/ms/2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
dev: false
/multimatch/4.0.0:
resolution: {integrity: sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==}
@ -8987,6 +9262,21 @@ packages:
es-abstract: 1.19.2
dev: false
/octokit/1.7.1:
resolution: {integrity: sha512-1b7eRgU8uWetHOWr8f9ptnVo2EKbrkOfocMeQdpgCt7tl/LK67HptFsy2Xg4fMjsJ/+onoBJW0hy/fO0In3/uA==}
dependencies:
'@octokit/app': 12.0.5
'@octokit/core': 3.5.1
'@octokit/oauth-app': 3.6.0
'@octokit/plugin-paginate-rest': 2.17.0_@octokit+core@3.5.1
'@octokit/plugin-rest-endpoint-methods': 5.13.0_@octokit+core@3.5.1
'@octokit/plugin-retry': 3.0.9
'@octokit/plugin-throttling': 3.6.1_@octokit+core@3.5.1
'@octokit/types': 6.34.0
transitivePeerDependencies:
- encoding
dev: true
/once/1.4.0:
resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=}
dependencies:
@ -11106,6 +11396,13 @@ packages:
'@types/unist': 2.0.6
dev: false
/universal-github-app-jwt/1.1.0:
resolution: {integrity: sha512-3b+ocAjjz4JTyqaOT+NNBd5BtTuvJTxWElIoeHSVelUV9J3Jp7avmQTdLKCaoqi/5Ox2o/q+VK19TJ233rVXVQ==}
dependencies:
'@types/jsonwebtoken': 8.5.8
jsonwebtoken: 8.5.1
dev: true
/universal-user-agent/6.0.0:
resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==}
dev: true