diff --git a/config.example.yml b/config.example.yml index dd09baa..ded0101 100644 --- a/config.example.yml +++ b/config.example.yml @@ -12,6 +12,8 @@ vk: # Default path for POST requests from VK api endpoint: / groups: [] +templates: + message_new: templates/message_new.md # groups: # - id: 0 # name: 'Group name' @@ -21,5 +23,9 @@ vk: # channels: # - id: '@pogonia_test_chan' # events: -# - test -# - another one +# - wall_post_new +# - post_suggestion +# - group_join +# - group_leave +# - message_new + diff --git a/package.json b/package.json index 8a796c4..5b441f8 100644 --- a/package.json +++ b/package.json @@ -6,19 +6,25 @@ "license": "MIT", "scripts": { "start": "node ./dist/index.js", - "build": "rm -rf ./dist && tsc && copyfiles -f ./config*.yml ./dist" + "build": "rm -rf ./dist && tsc && copyfiles -f ./config*.yml ./dist && copyfiles ./templates/*.md ./dist" }, "dependencies": { "@types/node": "^14.14.37", "express": "^4.17.1", + "handlebars": "^4.7.7", "http": "^0.0.1-security", "js-yaml": "^4.0.0", "morgan": "^1.10.0", "node-yaml-config": "^0.0.6", "path": "^0.12.7", "ramda": "^0.27.1", + "remark": "^13.0.0", + "remark-extract-frontmatter": "^3.1.0", + "remark-frontmatter": "^3.0.0", + "remark-parse-frontmatter": "^1.0.3", "socks-proxy-agent": "^5.0.0", "telegraf": "^4.3.0", + "to-vfile": "^6.1.0", "typescript": "^4.2.3", "url": "^0.11.0", "vk-io": "^4.2.0", @@ -28,6 +34,7 @@ }, "devDependencies": { "@types/express": "^4.17.11", + "@types/handlebars": "^4.1.0", "@types/ramda": "^0.27.39", "@types/winston": "^2.4.4", "@types/yargs": "^16.0.1", diff --git a/src/config/types.ts b/src/config/types.ts index 1c089aa..3da2ca7 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -1,11 +1,14 @@ import { TelegramConfig } from "../service/telegram/types"; -import { VkConfig } from "../service/vk/types"; +import { VkConfig, VkEvent } from "../service/vk/types"; import { HttpConfig } from "../api/http/types"; import { LoggerConfig } from "../service/logger/types"; +export type TemplateConfig = Record; + export interface Config extends Record { http: HttpConfig; telegram: TelegramConfig; vk: VkConfig; logger?: LoggerConfig; + templates?: TemplateConfig; } diff --git a/src/config/validate.ts b/src/config/validate.ts index c56f573..f3a228b 100644 --- a/src/config/validate.ts +++ b/src/config/validate.ts @@ -1,15 +1,20 @@ -import { boolean, object, string } from "yup"; +import { object, string } from "yup"; import { httpConfigSchema } from "../api/http/validation"; import { Config } from "./types"; import { vkConfigSchema } from "../service/vk/validation"; import { telegramConfigSchema } from "../service/telegram/validation"; import { loggerConfigSchema } from "../service/logger/config"; +const templateConfigSchema = object().shape({ + message_new: string().required(), +}); + const configSchema = object().required().shape({ http: httpConfigSchema, vk: vkConfigSchema, telegram: telegramConfigSchema, logger: loggerConfigSchema, + templates: templateConfigSchema, }); export const validateConfig = (config: Config) => diff --git a/src/index.ts b/src/index.ts index db54ff5..fbf4560 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,7 +9,7 @@ async function main() { try { const config = prepareConfig(); const telegram = new TelegramService(config.telegram); - const vkService = new VkService(config.vk, telegram); + const vkService = new VkService(config.vk, telegram, config.templates); const telegramApi = new TelegramApi(telegram).listen(); await telegram.start(); diff --git a/src/service/logger/tg.ts b/src/service/logger/tg.ts index 660a758..2feed04 100644 --- a/src/service/logger/tg.ts +++ b/src/service/logger/tg.ts @@ -2,9 +2,7 @@ import { MiddlewareFn } from "telegraf"; import logger from "./index"; const loggerTgMiddleware: MiddlewareFn = async (ctx, next) => { - logger.debug( - `received tg message from @${ctx.message.from.username}: ${ctx.message.text}` - ); + logger.debug(`received tg message`, ctx); await next().catch(logger.warn); }; diff --git a/src/service/telegram/index.ts b/src/service/telegram/index.ts index 4cec80f..e1cc8ed 100644 --- a/src/service/telegram/index.ts +++ b/src/service/telegram/index.ts @@ -4,6 +4,7 @@ import logger from "../logger"; import { Response } from "express"; import { Update } from "typegram"; import loggerTgMiddleware from "../logger/tg"; +import { ExtraReplyMessage } from "telegraf/typings/telegram-types"; // import SocksProxyAgent from 'socks-proxy-agent'; @@ -74,4 +75,16 @@ export class TelegramService { // TODO: test this.webhook.url with axios instead of 'true' return isWebhookEnabled && true; }; + + /** + * Sends simple message to channel + */ + public sendMessageToChan = async ( + channel: string, + message: string, + extra?: ExtraReplyMessage + ) => { + await this.bot.telegram.sendMessage(channel, message, extra); + return; + }; } diff --git a/src/service/template/index.ts b/src/service/template/index.ts new file mode 100644 index 0000000..5577fc4 --- /dev/null +++ b/src/service/template/index.ts @@ -0,0 +1,60 @@ +import extract from "remark-extract-frontmatter"; +import frontmatter from "remark-frontmatter"; +import compiler from "remark-stringify"; +import parser from "remark-parse"; +import unified from "unified"; +import { parse } from "yaml"; +import toVFile from "to-vfile"; +import path from "path"; +import hb from "handlebars"; + +export class Template< + F extends Record, + V extends Record +> { + public fields: F = {} as F; + public template: string = ""; + + constructor(filename: string) { + try { + if (!filename) { + return; + } + + const processor = unified() + .use(parser) + .use(compiler) + .use(frontmatter) + .use(extract, { yaml: parse }); + + const file = toVFile.readSync(path.join(__dirname, "../../", filename)); + const result = processor.processSync(file); + + this.fields = result.data as F; + this.template = result + .toString() + .replace(/^---\n(.*)---\n?$/gms, "") + .trim(); + } catch (e) { + throw new Error(`Template: ${e.toString()}`); + } + } + + /** + * Themes the tempalte with values + */ + public theme = (values: V) => { + return hb.compile(this.template)(values); + }; + + /** + * Registers handlebars helpers + */ + public static registerHelpers() { + hb.registerHelper("ifEq", function (arg1, arg2, options) { + return arg1 == arg2 ? options.fn(this) : options.inverse(this); + }); + } +} + +Template.registerHelpers(); diff --git a/src/service/vk/handlers/MessageNewHandler.ts b/src/service/vk/handlers/MessageNewHandler.ts index 8a1b8fc..e3debae 100644 --- a/src/service/vk/handlers/MessageNewHandler.ts +++ b/src/service/vk/handlers/MessageNewHandler.ts @@ -3,8 +3,22 @@ import { MessageContext } from "vk-io"; import { NextMiddleware } from "middleware-io"; import logger from "../../logger"; import { ContextDefaultState } from "vk-io/lib/structures/contexts/context"; +import { UsersUserFull } from "vk-io/lib/api/schemas/objects"; +import { ConfigGroup } from "../types"; +import { ExtraReplyMessage } from "telegraf/typings/telegram-types"; -export class MessageNewHandler extends VkEventHandler { +interface Fields { + buttons?: string[]; + link_text?: string; +} + +interface Values { + user: UsersUserFull; + group: ConfigGroup; + text: string; +} + +export class MessageNewHandler extends VkEventHandler { public execute = async ( context: MessageContext, next: NextMiddleware @@ -14,15 +28,44 @@ export class MessageNewHandler extends VkEventHandler { return; } - const users = await this.instance.api.users.get({ - user_ids: [String(context.senderId)], - }); - const from = users[0]; + const user = await this.getUserByID(String(context.senderId)); - logger.debug( - `received message from ${from.first_name} ${from.last_name}: ${context.text}` + logger.info( + `received message from ${user.first_name} ${user.last_name}: ${context.text}` ); + const parsed = this.template.theme({ + user, + group: this.group, + text: context.text, + }); + + const extras: ExtraReplyMessage = { + parse_mode: "Markdown", + }; + + this.appendButtons(extras, user.id); + + await this.telegram + .sendMessageToChan(this.channel, parsed, extras) + .catch(next); + await next(); }; + + /** + * Appending buttons (if needed) by mutating original extras + */ + private appendButtons = (extras: ExtraReplyMessage, userId: number) => { + if (!this.template?.fields?.buttons?.includes("link")) { + return; + } + + const text = this.template?.fields?.link_text || "View dialog"; + const url = this.makeDialogUrl(this.group.id, userId); + + extras.reply_markup = { + inline_keyboard: [[{ text, url }]], + }; + }; } diff --git a/src/service/vk/handlers/StubHandler.ts b/src/service/vk/handlers/StubHandler.ts new file mode 100644 index 0000000..7e53ea9 --- /dev/null +++ b/src/service/vk/handlers/StubHandler.ts @@ -0,0 +1,13 @@ +import { VkEventHandler } from "./VkEventHandler"; +import { NextMiddleware } from "middleware-io"; +import logger from "../../logger"; + +/** + * StubHandler is used to stub event calls + */ +export class StubHandler extends VkEventHandler { + public execute = async (context: any, next: NextMiddleware) => { + logger.debug(`received unhandled message of type "${context.type}"`); + await next(); + }; +} diff --git a/src/service/vk/handlers/VkEventHandler.ts b/src/service/vk/handlers/VkEventHandler.ts index a767757..db30c47 100644 --- a/src/service/vk/handlers/VkEventHandler.ts +++ b/src/service/vk/handlers/VkEventHandler.ts @@ -1,14 +1,21 @@ import { NextMiddleware } from "middleware-io"; -import { ConfigGroup, GroupInstance } from "../types"; +import { ConfigGroup, GroupInstance, VkEvent } from "../types"; import { VkService } from "../index"; import { TelegramService } from "../../telegram"; +import { Template } from "../../template"; -export abstract class VkEventHandler { +export class VkEventHandler< + F extends Record = any, + V extends Record = any +> { public constructor( + protected type: VkEvent, protected group: ConfigGroup, + protected channel: string, protected instance: GroupInstance, protected vk: VkService, - protected telegram: TelegramService + protected telegram: TelegramService, + protected template: Template ) {} public execute: ( @@ -18,4 +25,23 @@ export abstract class VkEventHandler { console.log(`vk received unknown event`, ctx); await next(); }; + + /** + * Fetches user by id + * @param id + */ + protected getUserByID = async (id: string) => { + const users = await this.instance.api.users.get({ + user_ids: [id], + fields: ["sex"], + }); + + return users[0]; + }; + + /** + * Returns url for group dialog + */ + protected makeDialogUrl = (groupId: number, userId: number): string => + `https://vk.com/gim${groupId}?sel=${userId}`; } diff --git a/src/service/vk/handlers/index.ts b/src/service/vk/handlers/index.ts index ac03f9a..38af5b6 100644 --- a/src/service/vk/handlers/index.ts +++ b/src/service/vk/handlers/index.ts @@ -1,14 +1,27 @@ -import { VkEvent } from "../types"; +import { ConfigGroup, GroupInstance, VkEvent } from "../types"; import { VkEventHandler } from "./VkEventHandler"; import { MessageNewHandler } from "./MessageNewHandler"; +import { StubHandler } from "./StubHandler"; +import { VkService } from "../index"; +import { TelegramService } from "../../telegram"; +import { Template } from "../../template"; -type DerivedHandler = typeof VkEventHandler; -interface Handler extends DerivedHandler {} +interface Handler { + new ( + type: VkEvent, + group: ConfigGroup, + channel: string, + instance: GroupInstance, + vk: VkService, + telegram: TelegramService, + template: Template + ): VkEventHandler; +} export const vkEventToHandler: Record = { - [VkEvent.GroupJoin]: MessageNewHandler, - [VkEvent.GroupLeave]: MessageNewHandler, + [VkEvent.GroupJoin]: StubHandler, + [VkEvent.GroupLeave]: StubHandler, [VkEvent.MessageNew]: MessageNewHandler, - [VkEvent.PostSuggestion]: MessageNewHandler, - [VkEvent.WallPostNew]: MessageNewHandler, + [VkEvent.PostSuggestion]: StubHandler, + [VkEvent.WallPostNew]: StubHandler, }; diff --git a/src/service/vk/index.ts b/src/service/vk/index.ts index ac62d14..51d9b7e 100644 --- a/src/service/vk/index.ts +++ b/src/service/vk/index.ts @@ -1,5 +1,5 @@ import { ConfigGroup, GroupInstance, VkConfig, VkEvent } from "./types"; -import { API, Upload, Updates } from "vk-io"; +import { API, Updates, Upload } from "vk-io"; import logger from "../logger"; import { Request, Response } from "express"; import { flatten, has, keys } from "ramda"; @@ -7,13 +7,19 @@ import { NextFunction } from "connect"; import { VkEventHandler } from "./handlers/VkEventHandler"; import { vkEventToHandler } from "./handlers"; import { TelegramService } from "../telegram"; +import { Template } from "../template"; +import { TemplateConfig } from "../../config/types"; export class VkService { public endpoint: string = "/"; private readonly instances: Record; private readonly groups: Record; - constructor(private config: VkConfig, private telegram: TelegramService) { + constructor( + private config: VkConfig, + private telegram: TelegramService, + private templates: TemplateConfig + ) { if (!config.groups.length) { throw new Error("No vk groups to handle. Specify them in config"); } @@ -101,11 +107,16 @@ export class VkService { return flatten( group.channels.map((chan) => chan.events.reduce((acc, event) => { - const handler = new (vkEventToHandler as any)[event]( + const template = new Template(this.templates[event]); + + const handler = new vkEventToHandler[event]( + event, group, + chan.id, instance, this, - this.telegram + this.telegram, + template ); return { ...acc, [event]: handler }; }, {} as Record[]) diff --git a/templates/message_new.md b/templates/message_new.md new file mode 100644 index 0000000..836d15d --- /dev/null +++ b/templates/message_new.md @@ -0,0 +1,11 @@ +--- + buttons: [link] + link_text: Посмотреть сообщение +--- +{{!-- + use handlebars template here + available variables are: user, group, text + (see MessageNewHandler) +--}} +***Новое сообщение:*** +[{{user.first_name}} {{user.last_name}}](https://vk.com/id{{user.id}}) {{#ifEq user.sex 1}}написала{{else}}написал{{/ifEq}}: {{text}} diff --git a/yarn.lock b/yarn.lock index 40f9d69..ebf30c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -52,11 +52,25 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/handlebars@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@types/handlebars/-/handlebars-4.1.0.tgz#3fcce9bf88f85fe73dc932240ab3fb682c624850" + integrity sha512-gq9YweFKNNB1uFK71eRqsd4niVkXrxHugqWFQkeLRJvGjnxsLr16bYtcsG4tOFwmYi0Bax+wCkbf1reUfdl4kA== + dependencies: + handlebars "*" + "@types/lodash@^4.14.165": version "4.14.168" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== +"@types/mdast@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" + integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== + dependencies: + "@types/unist" "*" + "@types/mime@^1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" @@ -97,6 +111,11 @@ "@types/mime" "^1" "@types/node" "*" +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" + integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== + "@types/winston@^2.4.4": version "2.4.4" resolved "https://registry.yarnpkg.com/@types/winston/-/winston-2.4.4.tgz#48cc744b7b42fad74b9a2e8490e0112bd9a3d08d" @@ -182,6 +201,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -241,6 +265,21 @@ bytes@3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -362,7 +401,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.3.1: +debug@4, debug@^4.0.0, debug@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== @@ -470,11 +509,23 @@ express@^4.17.1: utils-merge "1.0.1" vary "~1.1.2" +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + fast-safe-stringify@^2.0.4: version "2.0.7" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== +fault@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" + integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== + dependencies: + format "^0.2.0" + fecha@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.1.tgz#0a83ad8f86ef62a091e22bb5a039cd03d23eecce" @@ -507,6 +558,11 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +format@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs= + forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -544,6 +600,18 @@ glob@^7.0.5: once "^1.3.0" path-is-absolute "^1.0.0" +handlebars@*, handlebars@^4.7.7: + version "4.7.7" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -618,16 +686,49 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-arrayish@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" @@ -673,6 +774,11 @@ lodash-es@^4.17.15: resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== +lodash.iteratee@^4.5.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.iteratee/-/lodash.iteratee-4.7.0.tgz#be4177db289a8ccc3c0990f1db26b5b22fc1554c" + integrity sha1-vkF32yiajMw8CZDx2ya1si/BVUw= + lodash@^4.17.20: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -689,6 +795,46 @@ logform@^2.2.0: ms "^2.1.1" triple-beam "^1.3.0" +longest-streak@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" + integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== + +mdast-util-from-markdown@^0.8.0: + version "0.8.5" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" + integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string "^2.0.0" + micromark "~2.11.0" + parse-entities "^2.0.0" + unist-util-stringify-position "^2.0.0" + +mdast-util-frontmatter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz#8bd5cd55e236c03e204a036f7372ebe9e6748240" + integrity sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ== + dependencies: + micromark-extension-frontmatter "^0.2.0" + +mdast-util-to-markdown@^0.6.0: + version "0.6.5" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" + integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== + dependencies: + "@types/unist" "^2.0.0" + longest-streak "^2.0.0" + mdast-util-to-string "^2.0.0" + parse-entities "^2.0.0" + repeat-string "^1.0.0" + zwitch "^1.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -704,6 +850,21 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= +micromark-extension-frontmatter@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz#61b8e92e9213e1d3c13f5a59e7862f5ca98dfa53" + integrity sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A== + dependencies: + fault "^1.0.0" + +micromark@~2.11.0: + version "2.11.4" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" + integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== + dependencies: + debug "^4.0.0" + parse-entities "^2.0.0" + middleware-io@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/middleware-io/-/middleware-io-2.6.0.tgz#bce019eabf14ad0adb8c7ec328cb57ec37b8eb84" @@ -789,6 +950,11 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +neo-async@^2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + node-fetch@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" @@ -849,6 +1015,18 @@ p-timeout@^4.1.0: resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-4.1.0.tgz#788253c0452ab0ffecf18a62dff94ff1bd09ca0a" integrity sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw== +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -972,11 +1150,66 @@ regenerator-runtime@^0.13.4: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== +remark-extract-frontmatter@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/remark-extract-frontmatter/-/remark-extract-frontmatter-3.1.0.tgz#8ac209bf5e7377578ebfd6dc3504e9fccabea112" + integrity sha512-16TIAq0QTGs2GrbFi9azDxfcjwacf25W33h8zXAwiUbdW9lJN5KPaY6TZ7u2iSPTOSbIYBYmj9E0Q+8e+eGGPQ== + +remark-frontmatter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz#ca5d996361765c859bd944505f377d6b186a6ec6" + integrity sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA== + dependencies: + mdast-util-frontmatter "^0.2.0" + micromark-extension-frontmatter "^0.2.0" + +remark-parse-frontmatter@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/remark-parse-frontmatter/-/remark-parse-frontmatter-1.0.3.tgz#121f0b1b3bfc644fb7b58916ef803d794e083381" + integrity sha512-2hqW4Nod8pEkP4kdui7jOvCwcTfYBfgAb3XJhYYTZGrTMBcxFzQ7h7ay6OwmpJME5BOhORpZ7eY5+K4OHHIh4Q== + dependencies: + revalidator "^0.3.1" + unist-util-find "^1.0.2" + yaml "^1.10.0" + +remark-parse@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" + integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== + dependencies: + mdast-util-from-markdown "^0.8.0" + +remark-stringify@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-9.0.1.tgz#576d06e910548b0a7191a71f27b33f1218862894" + integrity sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg== + dependencies: + mdast-util-to-markdown "^0.6.0" + +remark@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/remark/-/remark-13.0.0.tgz#d15d9bf71a402f40287ebe36067b66d54868e425" + integrity sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA== + dependencies: + remark-parse "^9.0.0" + remark-stringify "^9.0.0" + unified "^9.1.0" + +repeat-string@^1.0.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +revalidator@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.3.1.tgz#ff2cc4cf7cc7c6385ac710178276e6dbcd03762f" + integrity sha1-/yzEz3zHxjhaxxAXgnbm280Ddi8= + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -1067,6 +1300,11 @@ socks@^2.3.3: ip "^1.1.5" smart-buffer "^4.1.0" +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -1145,6 +1383,14 @@ through2@^2.0.1: readable-stream "~2.3.6" xtend "~4.0.1" +to-vfile@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/to-vfile/-/to-vfile-6.1.0.tgz#5f7a3f65813c2c4e34ee1f7643a5646344627699" + integrity sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw== + dependencies: + is-buffer "^2.0.0" + vfile "^4.0.0" + toidentifier@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" @@ -1160,6 +1406,11 @@ triple-beam@^1.2.0, triple-beam@^1.3.0: resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + ts-toolbelt@^6.15.1: version "6.15.5" resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz#cb3b43ed725cb63644782c64fbcad7d8f28c0a83" @@ -1183,6 +1434,57 @@ typescript@^4.2.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3" integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw== +uglify-js@^3.1.4: + version "3.13.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.4.tgz#592588bb9f47ae03b24916e2471218d914955574" + integrity sha512-kv7fCkIXyQIilD5/yQy8O+uagsYIOt5cZvs890W40/e/rvjMSzJw81o9Bg0tkURxzZBROtDQhW2LFjOGoK3RZw== + +unified@^9.1.0: + version "9.2.1" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.1.tgz#ae18d5674c114021bfdbdf73865ca60f410215a3" + integrity sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unist-util-find@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unist-util-find/-/unist-util-find-1.0.2.tgz#4d5b01a69fca2a382ad4f55f9865e402129ecf56" + integrity sha512-ft06UDYzqi9o9RmGP0sZWI/zvLLQiBW2/MD+rW6mDqbOWDcmknGX9orQPspfuGRYWr8eSJAmfsBcvOpfGRJseA== + dependencies: + lodash.iteratee "^4.5.0" + unist-util-visit "^1.1.0" + +unist-util-is@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" + integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" + integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== + dependencies: + unist-util-is "^3.0.0" + +unist-util-visit@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" + integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== + dependencies: + unist-util-visit-parents "^2.0.0" + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -1223,6 +1525,24 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + vk-io@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/vk-io/-/vk-io-4.2.0.tgz#ff16cd94ef8f96eacf3deac95eb448137bd8bbea" @@ -1258,6 +1578,11 @@ winston@*, winston@^3.3.3: triple-beam "^1.3.0" winston-transport "^4.4.0" +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -1282,6 +1607,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.7.tgz#0c514aba53fc40e2db911aeb8b51566a3374efe7" integrity sha512-oOhslryvNcA1lB9WYr+M6TMyLkLg81Dgmyb48ZDU0lvR+5bmNDTMz7iobM1QXooaLhbbrcHrlNaABhI6Vo6StQ== +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + yargs-parser@^20.2.2: version "20.2.7" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" @@ -1325,3 +1655,8 @@ yup@^0.32.9: nanoclone "^0.2.1" property-expr "^2.0.4" toposort "^2.0.2" + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==