From 7bc07946fdf48be178531494017ee496b38b1fa6 Mon Sep 17 00:00:00 2001 From: andatoshiki Date: Tue, 28 Mar 2023 17:22:39 +0800 Subject: [PATCH] feat!: add features to build and genreate rss feeds to readme and add a lot of other contents --- .github/workflows/rss.yml | 33 ++++ .gitignore | 6 +- README.md | 182 ++++++++++++++---- assets/footer-pink.svg | 4 +- assets/header-pink.svg | 6 +- assets/icons/angular.svg | 1 + assets/icons/bing.svg | 1 + assets/icons/github-sponsor-fill.svg | 5 + assets/icons/github-sponsor-outline.svg | 5 + assets/icons/github.dark.svg | 1 + assets/icons/github.light.svg | 1 + assets/icons/javascript.svg | 1 + assets/icons/less.svg | 1 + assets/icons/mongodb.svg | 1 + assets/icons/nestjs.svg | 6 + assets/icons/netease-music.svg | 2 + assets/icons/nodejs.svg | 1 + assets/icons/nuxtjs.svg | 1 + assets/icons/react.svg | 1 + assets/icons/rollup.svg | 46 +++++ assets/icons/surmon.me.svg | 19 ++ assets/icons/typescript.svg | 1 + assets/icons/veact.png | Bin 0 -> 46474 bytes assets/icons/veact.svg | 10 + assets/icons/vite.svg | 15 ++ assets/icons/vscode.svg | 1 + assets/icons/vue.svg | 1 + assets/icons/wordpress.dark.svg | 1 + assets/icons/wordpress.light.svg | 1 + config.json | 14 ++ main.js | 1 + package.json | 53 +++--- prettier.config.js | 26 +++ scripts/config.js | 22 +++ scripts/core.js | 21 +++ scripts/{fetcher.js => fetchers.js} | 16 +- scripts/generator.js | 25 +++ scripts/index.js | 6 +- scripts/plugins/blog.js | 76 ++++++++ scripts/plugins/twitter.js | 76 ++++++++ scripts/runner.js | 69 +++++++ scripts/utils.js | 6 +- scripts/utils/util.js | 13 ++ yarn.lock | 241 ++++++++++++++++++++++-- 44 files changed, 932 insertions(+), 87 deletions(-) create mode 100644 .github/workflows/rss.yml create mode 100644 assets/icons/angular.svg create mode 100644 assets/icons/bing.svg create mode 100644 assets/icons/github-sponsor-fill.svg create mode 100644 assets/icons/github-sponsor-outline.svg create mode 100644 assets/icons/github.dark.svg create mode 100644 assets/icons/github.light.svg create mode 100644 assets/icons/javascript.svg create mode 100644 assets/icons/less.svg create mode 100644 assets/icons/mongodb.svg create mode 100644 assets/icons/nestjs.svg create mode 100644 assets/icons/netease-music.svg create mode 100644 assets/icons/nodejs.svg create mode 100644 assets/icons/nuxtjs.svg create mode 100644 assets/icons/react.svg create mode 100644 assets/icons/rollup.svg create mode 100644 assets/icons/surmon.me.svg create mode 100644 assets/icons/typescript.svg create mode 100644 assets/icons/veact.png create mode 100644 assets/icons/veact.svg create mode 100644 assets/icons/vite.svg create mode 100644 assets/icons/vscode.svg create mode 100644 assets/icons/vue.svg create mode 100644 assets/icons/wordpress.dark.svg create mode 100644 assets/icons/wordpress.light.svg create mode 100644 config.json create mode 100644 main.js create mode 100644 prettier.config.js create mode 100644 scripts/config.js create mode 100644 scripts/core.js rename scripts/{fetcher.js => fetchers.js} (75%) create mode 100644 scripts/generator.js create mode 100644 scripts/plugins/blog.js create mode 100644 scripts/plugins/twitter.js create mode 100644 scripts/runner.js create mode 100644 scripts/utils/util.js diff --git a/.github/workflows/rss.yml b/.github/workflows/rss.yml new file mode 100644 index 0000000..c6256cc --- /dev/null +++ b/.github/workflows/rss.yml @@ -0,0 +1,33 @@ +name: Update RSS feeds on README section + +on: + push: + workflow_dispatch: # allow users to randomly trigger workflows for debugging + schedule: + - cron: '0 * * * *' # workflow run per 24 hours + +jobs: + update: + runs-on: ubuntu-latest + steps: + - name: Check out the latest commit of the repository history + uses: actions/checkout@v2 + - name: Set up node environment + uses: actions/setup-node@v3 + with: + node-version: 16 + - name: Install node dependencies for running build + run: | + yarn install + yarn lint + - name: Generate RSS feeds from source into Markdown formatting + run: | + yarn generate + - name: Commit changed README file and push to repository + run: | + git diff + git config --global user.email "hello@toshiki.dev" + git config --global user.name "@andatoshiki" + git add . + git commit -m 'chore(update): update readme with the latest rss feeds' + git push -f origin master \ No newline at end of file diff --git a/.gitignore b/.gitignore index 9ad8b14..92155b1 100644 --- a/.gitignore +++ b/.gitignore @@ -29,4 +29,8 @@ package-lock.json output/* !output/.gitkeep -dev.js \ No newline at end of file +dev.js + +yarn.lock + +.env \ No newline at end of file diff --git a/README.md b/README.md index 523c977..9844f04 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,166 @@ -header banner + -## d +# Anda Toshiki (ๅฎ‰็”ฐไฟŠๆจน) + +## ๐Ÿ‘‹ ใ‚ˆใ†ใ“ใใ€Developers! logo -> The all-in-one crawler/scraper for crunching free proxy nodes of SS, SSR, vmess, trojan! +> Hey there, I'm Anda Toshiki, or you could refer me as _kiki_ in short (the same name as the protagonist Majo from [Kiki's Delivery Service](https://en.wikipedia.org/wiki/Kiki%27s_Delivery_Service) by Hayao Miyazaki); I'm the Maho ShouJo (้ญ”ๆณ•ๅฐ‘ๅฅณ) whom watches anime, drinks monster, writes codes, documents tutorials, takes photos, eats burgers and stays up all nights~ -dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd3 +Introduction once more, my name is Anda Toshiki, pronounced as `AHN-dah TOH-shee-kee` in case you find my name obscure to read out. I'm currently a precollege student with offer of admission from [UB (University at Buffalo)](https://www.buffalo.edu) as a transfer student to [(CIT) California Institute of Technology](https://www.caltech.edu). I am also the founder of [Toshiki Dev](https://github.com/toshikidev) as the first _organizational_ community I have ever created for building functional utility components and webapps/software to my own needs as serving solutions to people having the same requests, additionally I am maintaining the community with both of my cat ๐Ÿ˜บ (็މใกใ‚ƒใ‚“ & ๆกƒใกใ‚ƒใ‚“ both of them are [cute girls]()!) -

+### 1: Pronouns + +**She/her** (internet wide, I'm a loli :P); **he/him** if you happens to meet me offline. + +### 2: Languages + +I speak three languages, **English** primarily, proficient in **Chinese** and fluent in **Japanese**, all three languages are welcomed to use when having conversations with me (I also don't mind blending them altogether). + +### 3: Academics + +I current studying Data Science and Physics as core essentials for my academia. Frontend developing and Computer Networking are both my hobbies at rest while I mostly work with numbers and maths mainly. I am also obsessed with _process automation_, _CI/CD_, I am highly active on building practical GitHub actions for easing my DevOps life. + +### 4: Hobbies + +Below is a short intro on my personal hobbies I enjoys doing while I am free. + +- **Frontend development & blogging**: Aside from academic learnings, I am also captivated into frontend development and blogging, more specifically theming and beautification. I was introduced to [HUGO](https://github.com/gohugoio/hugo) when I first get started with website generator/blog building, I contributes one of the best hugo theme communities-[Fixit](https://github.com/hugo-fixit/FixIt) on GitHub. I have also independently created other themes such as gallery and showcasing sites (see more in the projects table below)... + +- **Documenting**: I have a strong eagerness on finding the best solution for issues I encounters and devote to understand hard concepts; in order to respond to this fetish, I enjoys documenting notes and epiphanies in detailed and specific no matter how much time it waste, it deserves my dedication (see my notes [in action](https://note.toshiki.dev)). + +- **Art**: I engage in pixel art and indie game developments when free, I practice techniques and share my artworks on [Discord Pixel Art](https://discord.gg/pixelart) community. + +- **Anime**: I am a heavy _weeb_ whom watches anime a lot at my leisure, my favorite anime so far is, ["DanMachi" (ใƒ€ใƒณใ‚ธใƒงใƒณใซๅ‡บไผšใ„ใ‚’ๆฑ‚ใ‚ใ‚‹ใฎใฏ้–“้•ใฃใฆใ„ใ‚‹ใ ใ‚ใ†ใ‹)](https://danmachi.fandom.com/wiki/DanMachi_Wiki). + +- **Collectomania**: I love collecting resources from different field, from photography sets to reference books to torrents to movies et cetera. (But I usually read through any of them instead just let them sit in my hard drives). + +- **Photography & photo editing**: I have intermediate experience with photography editing with both PhotoShop and Illustrator and have been using both tools on daily bases to commit minor edits on photos to level of perfections; I am also interested in photography, I records everything aesthetic in life with cameras and showcase them at my [web gallery](https://gallery.toshiki.dev). + +### 5: Technologies + +#### 5.1: Tools + +![NPM](https://img.shields.io/badge/NPM-%23CB3837.svg?style=flat&logo=npm&logoColor=white) ![Yarn](https://img.shields.io/badge/yarn-%232C8EBB.svg?style=flat&logo=yarn&logoColor=white) ![Gitea](https://img.shields.io/badge/Gitea-34495E?style=flat&logo=gitea&logoColor=5D9425) ![Jenkins](https://img.shields.io/badge/-Jenkins-D24939?logo=Jenkins&logoColor=000) ![SonarQube](https://img.shields.io/badge/-SonarQube-A9A9A9?logo=SonarQube&logoColor=4E9BCD) ![Docker](https://img.shields.io/badge/-Docker-2496ED?logo=Docker&logoColor=FFF) ![Harbor](https://img.shields.io/badge/-Harbor-FFF?logo=Harbor&logoColor=60B932) ![Kubernetes](https://img.shields.io/badge/-Kubernetes-326CE5?logo=Kubernetes&logoColor=FFF) ![CentOS](https://img.shields.io/badge/-CentOS-262577?logo=CentOS&logoColor=FFF) ![Ubuntu](https://img.shields.io/badge/-Ubuntu-E95420?logo=Ubuntu&logoColor=FFF) ![Git](https://img.shields.io/badge/git-%23F05033.svg?style=flat&logo=git&logoColor=white) + +#### 5.2: Platforms + +![GitHub](https://img.shields.io/badge/github-%23121011.svg?style=flat&logo=github&logoColor=white) ![TravisCI](https://img.shields.io/badge/travis%20ci-%232B2F33.svg?style=flat&logo=travis&logoColor=white) ![OneDrive](https://img.shields.io/badge/OneDrive-0078D4.svg?style=flat&logo=microsoftonedrive&logoColor=white) ![Vercel](https://img.shields.io/badge/vercel-%23000000.svg?style=flat&logo=vercel&logoColor=white) ![Vultr](https://img.shields.io/badge/Vultr-007BFC.svg?style=flat&logo=vultr) ![Cloudflare](https://img.shields.io/badge/Cloudflare-F38020?style=flat&logo=Cloudflare&logoColor=white) ![Netlify](https://img.shields.io/badge/netlify-%23000000.svg?style=flat&logo=netlify&logoColor=#00C7B7) ![Gitea](https://img.shields.io/badge/Gitea-34495E?style=flat&logo=gitea&logoColor=5D9425) ![GitLab](https://img.shields.io/badge/gitlab-%23181717.svg?style=flat&logo=gitlab&logoColor=white) ![Gitee](https://img.shields.io/badge/Gitee-C71D23?style=flat&logo=gitee&logoColor=white) ![Gitea](https://img.shields.io/badge/Gitea-34495E?style=flat&logo=gitea&logoColor=5D9425) ![CodeCov](https://img.shields.io/badge/codecov-%23ff0077.svg?style=for-the-badge&logo=codecov&logoColor=white) + +#### 5.3: Languages + +![CSS3](https://img.shields.io/badge/css3-%231572B6.svg?style=flat&logo=css3&logoColor=white) ![JavaScript](https://img.shields.io/badge/javascript-%23323330.svg?style=flat&logo=javascript&logoColor=%23F7DF1E) ![PHP](https://img.shields.io/badge/php-%23777BB4.svg?style=flat&logo=php&logoColor=white) ![R](https://img.shields.io/badge/r-%23276DC3.svg?style=flat&logo=r&logoColor=white) ![Rust](https://img.shields.io/badge/rust-%23000000.svg?style=flat&logo=rust&logoColor=white) ![HTML5](https://img.shields.io/badge/html5-%23E34F26.svg?style=flat&logo=html5&logoColor=white) ![Go](https://img.shields.io/badge/go-%2300ADD8.svg?style=flat&logo=go&logoColor=white) ![C#](https://img.shields.io/badge/c%23-%23239120.svg?style=flat&logo=c-sharp&logoColor=white) ![LaTeX](https://img.shields.io/badge/latex-%23008080.svg?style=flat&logo=latex&logoColor=white) ![Markdown](https://img.shields.io/badge/markdown-%23000000.svg?style=flat&logo=markdown&logoColor=white) ![PowerShell](https://img.shields.io/badge/PowerShell-%235391FE.svg?style=flat&logo=powershell&logoColor=white) ![Shell Script](https://img.shields.io/badge/shell_script-%23121011.svg?style=flat&logo=gnu-bash&logoColor=white) ![Vue3](https://img.shields.io/badge/-Vue3-C0C0C0?logo=Vue.js&logoColor=4FC08D) ![TypeScript](https://img.shields.io/badge/-TypeScript-C0C0C0?logo=TypeScript&logoColor=3178C6) ![Ant Design](https://img.shields.io/badge/-Ant%20Design-C0C0C0?logo=Ant-Design&logoColor=0170FE) ![Node.js](https://img.shields.io/badge/-Node.js-D3D3D3?logo=Node.js&logoColor=339933) ![Vite](https://img.shields.io/badge/-Vite-D3D3D3?logo=Vite&logoColor=646CFF) ![Webpack](https://img.shields.io/badge/-Webpack-D3D3D3?logo=Webpack&logoColor=8DD6F9) ![NPM](https://img.shields.io/badge/-NPM-C0C0C0?logo=npm&logoColor=CB3837) ![Axios](https://img.shields.io/badge/-Axios-C0C0C0?logo=Axios&logoColor=5A29E4) ![ESLint](https://img.shields.io/badge/-ESLint-C0C0C0?logo=ESLint&logoColor=4B32C3) ![jQuery](https://img.shields.io/badge/-jQuery-0769AD?logo=jQuery&logoColor=FFF) ![Bootstrap](https://img.shields.io/badge/-Bootstrap-7952B3?logo=Bootstrap&logoColor=FFF) ![ECharts](https://img.shields.io/badge/-ECharts-C0C0C0?logo=Apache-ECharts&logoColor=AA344D) ![JavaScript](https://img.shields.io/badge/-JavaScript-A9A9A9?logo=JavaScript&logoColor=F7DF1E) ![HTML5](https://img.shields.io/badge/-HTML5-A9A9A9?logo=HTML5&logoColor=E34F26) ![CSS3](https://img.shields.io/badge/-CSS3-A9A9A9?logo=CSS3&logoColor=1572B6) ![Tailwind CSS](https://img.shields.io/badge/-Tailwind%20CSS-FFF?logo=Tailwind-CSS&logoColor=06B6D4) ![Less](https://img.shields.io/badge/-Less-D3D3D3?logo=Less&logoColor=1D365D) +![Angular](https://img.shields.io/badge/angular-%23DD0031.svg?style=flat&logo=angular&logoColor=white) ![jQuery](https://img.shields.io/badge/jquery-%230769AD.svg?style=flat&logo=jquery&logoColor=white)![Pug](https://img.shields.io/badge/Pug-FFF?style=flat&logo=pug&logoColor=A86454) ![React](https://img.shields.io/badge/react-%2320232a.svg?style=flat&logo=react&logoColor=%2361DAFB) ![SASS](https://img.shields.io/badge/SASS-hotpink.svg?style=flat&logo=SASS&logoColor=white) + +#### 5.4: IDEs + +![GoLand](https://img.shields.io/badge/GoLand-0f0f0f?&style=flat&logo=goland&logoColor=white) ![Jupyter Notebook](https://img.shields.io/badge/jupyter-%23FA0F00.svg?style=flat&logo=jupyter&logoColor=white) +![Vim](https://img.shields.io/badge/VIM-%2311AB00.svg?style=flat&logo=vim&logoColor=white) ![Visual Studio Code](https://img.shields.io/badge/Visual%20Studio%20Code-0078d7.svg?style=flat&logo=visual-studio-code&logoColor=white) ![PyCharm](https://img.shields.io/badge/pycharm-143?style=flat&logo=pycharm&logoColor=black&color=black&labelColor=green) ![Sublime Text](https://img.shields.io/badge/sublime_text-%23575757.svg?style=flat&logo=sublime-text&logoColor=important) + +#### 5.5: OS + +![Windows 11](https://img.shields.io/badge/Windows%2011-%230079d5.svg?style=flat&logo=Windows%2011&logoColor=white) ![Ubuntu](https://img.shields.io/badge/Ubuntu-E95420?style=flat&logo=ubuntu&logoColor=white) ![Openwrt](https://img.shields.io/badge/OpenWRT-00B5E2?style=flat&logo=OpenWrt&logoColor=white) ![Linux](https://img.shields.io/badge/Linux-FCC624?style=flat&logo=linux&logoColor=black) ![Android](https://img.shields.io/badge/Android-3DDC84?style=flat&logo=android&logoColor=white) + +### 6: Identities + +In order to prove my real identity as a human being, I have verified my identity with a GPG public key hosted on [Keybase - Anda Toshiki (@toshikidev)](https://keybase.io/toshikidev) with [ownership of domain `www.toshiki.dev`](https://keybase.io/toshikidev/sigchain#7a41ec772fd948db46e454c55efc71005299fe7b3ed76b789bbcdb5a7505667c0f) via https; which validates I am legitimately a **cute, living human loli** on Earth, you can pull and import my GPG public keys onto your local machine with the following command using cURL. + +```sh +curl https://keybase.io/toshikidev/pgp_keys.asc | gpg --import +``` + +### 7. Metrics + + + + + + + + + + + +
+ +#### [Wakatime](https://wakatime.com) development breakdown + + + +```text +Markdown 2 hrs 40 mins โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ 25.89 % +TypeScript 2 hrs 28 mins โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ 23.95 % +JavaScript 1 hr 22 mins โ–ˆโ–ˆโ–ˆโ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ 13.27 % +Vue.js 1 hr 7 mins โ–ˆโ–ˆโ–“โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ 10.93 % +JSON 54 mins โ–ˆโ–ˆโ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ 08.75 % +Other 28 mins โ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ 04.56 % +``` + + + + + +#### Blog RSS updates + + + +- Build a Full Stack App with create-t3-app - 2022-08-11 +- T3 Stack and My Most Popular Open Source Project Ever - 2022-06-27 +- How I Made a Really Fast Link Shortener That Runs on the Edge - 2022-06-01 +- Create Licenses for Your Projects Right from the Terminal - 2022-03-25 +- Conway's Game of Life in Go - 2022-03-17 + + + +
+ +#### GitHub development metrics + +![Anda Toshiki's GitHub stats](https://github-readme-stats.vercel.app/api?username=andatoshiki&show_icons=false&theme=transparent&hide_border=true&text_color=FFF&icon_color=FFF&title_color=FFF) + + + +#### ๐Ÿฉด Twitter updates + + + +- Verifying myself: I am toshikidev on http://Keybase.io. pQuYoKO8oET7dLOazltqkPLQs2MIceG5rr3m / https://keybase.io/toshikidev/sigs/pQuYoKO8oET7dLOazltq... - 2023-03-27 +- Sakura ๐ŸŒธ https://t.co/YoEmRMTmr3 - 2023-03-26 +- I love Excalidraw for architectural diagrams! #excalidraw #diagram #architecture #software #engineering #graph https://t.co/comucWgobW - 2023-03-25 +- Re @hamident83hami @SaveToNotion tweet - 2023-03-08 +- Re @LinuxHandbook @SaveToNotion #thread - 2023-03-07 + + + +
+ +### 8. Projects + +|   | Repository | Tags | Homepage | Stars | Last Commit | Description | +| ---------------------------------------- | --------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | --------------------------------------- | --------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| ![icon](./assets/icons/github.light.svg) | [andatoshiki/toshiki-proxypool](https://github.com/andatoshiki/toshiki-proxypool) | `proxy`, `gfw`, `proxypool`, `ssr`, `clash`, `trojan`, `vmess`, `vpn`, `go` | [`#proxypool`](proxypool.toshiki.dev) | ![GitHub stars](https://img.shields.io/github/stars/andatoshiki/toshiki-proxypool?style=flat) | ![GitHub last commit](https://img.shields.io/github/last-commit/andatoshiki/toshiki-proxypool?style=flat&label=last) | ๐Ÿงธ A magical scraper that automatically crawl SS, SSR, vmess, trojan node info from web, Telegram Channels, and localize/integrate into a web panel for convenient usages | +| ![icon](./assets/icons/nuxtjs.svg) | [andatoshiki/toshiki-home-v2](https://github.com/andatoshiki/toshiki-home-v2) | `homepage`, `personal-home`, `nuxtjs`, `custom-home`, `personal-website`, `home` | [`#homepage`](https://www.toshiki.dev) | ![GitHub stars](https://img.shields.io/github/stars/andatoshiki/toshiki-home-v2?style=flat) | ![GitHub last commit](https://img.shields.io/github/last-commit/andatoshiki/toshiki-home-v2?style=flat&label=last) | ๐Ÿช— V2 of Toshiki's lovely homepage with a complete rebuild and UI/UX design on top of NuxtJS including a decent yet with smooth page transitional effect in addition with customizable showcase pages of interests! | +| ![icon](./assets/icons/vite.svg) | [andatoshiki](https://github.com/andatoshiki/toshiki-notebook) | `notebook`, `vitepress`, `vite`, `knowledge`, `personal-notebook` | [`#notebook`](https://note.toshiki.dev) | ![GitHub stars](https://img.shields.io/github/stars/andatoshiki/toshiki-notebook?style=flat) | ![GitHub last commit](https://img.shields.io/github/last-commit/andatoshiki/toshiki-notebook?style=flat&label=last) | ๐Ÿ“– Toshiki's web notebook built upon Vitepress and deployed via Vercel! | +| | | | | | | | +| | | | | | | | + + + + - -```text -๐Ÿ’ฌ Languages: From: 17 March 2023 - To: 24 March 2023 - -TypeScript 2 hrs 18 mins โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ 31.38 % -Markdown 1 hr 38 mins โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–“โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ 22.28 % -JSON 48 mins โ–ˆโ–ˆโ–“โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ 10.97 % -Vue.js 47 mins โ–ˆโ–ˆโ–“โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ 10.69 % -Other 26 mins โ–ˆโ–“โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ 06.10 % -``` - - - - - - +

--> -footer banner + + +

+ +

diff --git a/assets/footer-pink.svg b/assets/footer-pink.svg index ed064c6..bfeae1a 100644 --- a/assets/footer-pink.svg +++ b/assets/footer-pink.svg @@ -20,10 +20,10 @@ - + - + diff --git a/assets/header-pink.svg b/assets/header-pink.svg index 462fb63..214f2a7 100644 --- a/assets/header-pink.svg +++ b/assets/header-pink.svg @@ -44,13 +44,13 @@ - + - + - Anda Toshiki ๅฎ‰็”ฐไฟŠๆจน + Anda Toshiki (ๅฎ‰็”ฐไฟŠๆจน) \ No newline at end of file diff --git a/assets/icons/angular.svg b/assets/icons/angular.svg new file mode 100644 index 0000000..468c4ba --- /dev/null +++ b/assets/icons/angular.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/bing.svg b/assets/icons/bing.svg new file mode 100644 index 0000000..4cd9525 --- /dev/null +++ b/assets/icons/bing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/github-sponsor-fill.svg b/assets/icons/github-sponsor-fill.svg new file mode 100644 index 0000000..dbb9bc7 --- /dev/null +++ b/assets/icons/github-sponsor-fill.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/assets/icons/github-sponsor-outline.svg b/assets/icons/github-sponsor-outline.svg new file mode 100644 index 0000000..ae10705 --- /dev/null +++ b/assets/icons/github-sponsor-outline.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/assets/icons/github.dark.svg b/assets/icons/github.dark.svg new file mode 100644 index 0000000..a134f43 --- /dev/null +++ b/assets/icons/github.dark.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/github.light.svg b/assets/icons/github.light.svg new file mode 100644 index 0000000..ee32150 --- /dev/null +++ b/assets/icons/github.light.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/javascript.svg b/assets/icons/javascript.svg new file mode 100644 index 0000000..47ec986 --- /dev/null +++ b/assets/icons/javascript.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/less.svg b/assets/icons/less.svg new file mode 100644 index 0000000..9c6fbbb --- /dev/null +++ b/assets/icons/less.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/mongodb.svg b/assets/icons/mongodb.svg new file mode 100644 index 0000000..b44dccc --- /dev/null +++ b/assets/icons/mongodb.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/nestjs.svg b/assets/icons/nestjs.svg new file mode 100644 index 0000000..7a51ea5 --- /dev/null +++ b/assets/icons/nestjs.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/icons/netease-music.svg b/assets/icons/netease-music.svg new file mode 100644 index 0000000..b2cb830 --- /dev/null +++ b/assets/icons/netease-music.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/assets/icons/nodejs.svg b/assets/icons/nodejs.svg new file mode 100644 index 0000000..ae0b62b --- /dev/null +++ b/assets/icons/nodejs.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/nuxtjs.svg b/assets/icons/nuxtjs.svg new file mode 100644 index 0000000..7f20b55 --- /dev/null +++ b/assets/icons/nuxtjs.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/react.svg b/assets/icons/react.svg new file mode 100644 index 0000000..3a27f7c --- /dev/null +++ b/assets/icons/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/rollup.svg b/assets/icons/rollup.svg new file mode 100644 index 0000000..d57d421 --- /dev/null +++ b/assets/icons/rollup.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/surmon.me.svg b/assets/icons/surmon.me.svg new file mode 100644 index 0000000..dc38f22 --- /dev/null +++ b/assets/icons/surmon.me.svg @@ -0,0 +1,19 @@ + + + diff --git a/assets/icons/typescript.svg b/assets/icons/typescript.svg new file mode 100644 index 0000000..e2568d5 --- /dev/null +++ b/assets/icons/typescript.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/veact.png b/assets/icons/veact.png new file mode 100644 index 0000000000000000000000000000000000000000..18ab52aac08feb10c8e19f712bff023410806fa5 GIT binary patch literal 46474 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 literal 0 HcmV?d00001 diff --git a/assets/icons/veact.svg b/assets/icons/veact.svg new file mode 100644 index 0000000..129d784 --- /dev/null +++ b/assets/icons/veact.svg @@ -0,0 +1,10 @@ + + + React Logo + + + + + + + diff --git a/assets/icons/vite.svg b/assets/icons/vite.svg new file mode 100644 index 0000000..ae2601a --- /dev/null +++ b/assets/icons/vite.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/assets/icons/vscode.svg b/assets/icons/vscode.svg new file mode 100644 index 0000000..67aee17 --- /dev/null +++ b/assets/icons/vscode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/vue.svg b/assets/icons/vue.svg new file mode 100644 index 0000000..8d00e8c --- /dev/null +++ b/assets/icons/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/wordpress.dark.svg b/assets/icons/wordpress.dark.svg new file mode 100644 index 0000000..9ffb612 --- /dev/null +++ b/assets/icons/wordpress.dark.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/wordpress.light.svg b/assets/icons/wordpress.light.svg new file mode 100644 index 0000000..34b3723 --- /dev/null +++ b/assets/icons/wordpress.light.svg @@ -0,0 +1 @@ + diff --git a/config.json b/config.json new file mode 100644 index 0000000..2156f08 --- /dev/null +++ b/config.json @@ -0,0 +1,14 @@ +{ + "plugins": { + "blog": { + "url": "https://www.nexxel.dev/", + "rss_url": "https://www.nexxel.dev/rss.xml", + "latest": 5 + }, + "twitter": { + "url": "https://twitter.com/andatoshiki/", + "rss_url": "https://rsshub.app/twitter/user/andatoshiki", + "latest": 5 + } + } +} diff --git a/main.js b/main.js new file mode 100644 index 0000000..5cfa554 --- /dev/null +++ b/main.js @@ -0,0 +1 @@ +require('./scripts/core') diff --git a/package.json b/package.json index 0ac7c5e..45c2e9c 100644 --- a/package.json +++ b/package.json @@ -1,25 +1,30 @@ { - "name": "surmon-china", - "version": "0.1.2", - "main": "scripts/index.js", - "repository": "git@github.com:surmon-china/surmon-china.git", - "author": "surmon-china", - "license": "UNLICENSED", - "config": { - "GITHUB_UID": "andatoshiki", - "NPM_UID": "" - }, - "scripts": { - "dev": "nodemon ./dev.js", - "generate": "node scripts/index.js", - "format": "prettier ./scripts --write" - }, - "devDependencies": { - "nodemon": "^2.0.15", - "prettier": "^2.3.2" - }, - "dependencies": { - "axios": "^0.21.1", - "simple-icons": "^6.7.0" - } - } \ No newline at end of file + "name": "surmon-china", + "version": "0.1.2", + "main": "scripts/index.js", + "repository": "git@github.com:surmon-china/surmon-china.git", + "author": "Anda Toshiki ", + "license": "UNLICENSED", + "config": { + "GITHUB_UID": "andatoshiki", + "NPM_UID": "andatoshiki" + }, + "scripts": { + "generate:metadata": "node scripts/index.js", + "lint": "prettier --write .", + "generate": "node main.js" + }, + "devDependencies": { + "dotenv": "^16.0.3", + "lodash": "^4.17.21", + "nodemon": "^2.0.15", + "prettier": "^2.3.2", + "signale": "^1.4.0", + "wakatime-client": "^2.7.0", + "xml2js": "^0.4.23" + }, + "dependencies": { + "axios": "^1.3.4", + "simple-icons": "^6.7.0" + } +} diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 0000000..b9eff56 --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,26 @@ +module.exports = { + tabWidth: 4, + printWidth: 120, + proseWrap: 'preserve', + semi: false, + trailingComma: 'es5', + singleQuote: true, + arrowParens: 'avoid', + overrides: [ + { + files: '{*.js?(on),*.js,*.y?(a)ml,.*.js?(on),.*.y?(a)ml,*.md,.prettierrc,.stylelintrc,.babelrc,.html,.sh}', + options: { + tabWidth: 2, + }, + }, + { + files: '{**/.vscode/*.json,**/tsconfig.json,**/tsconfig.*.json}', + options: { + parser: 'json5', + quoteProps: 'preserve', + singleQuote: false, + trailingComma: 'all', + }, + }, + ], +} diff --git a/scripts/config.js b/scripts/config.js new file mode 100644 index 0000000..0538132 --- /dev/null +++ b/scripts/config.js @@ -0,0 +1,22 @@ +const _ = require('lodash') +const path = require('path') + +require('dotenv').config({ + path: path.resolve(process.cwd(), '.env.local'), +}) + +class Config { + constructor() { + this.config = require('../config.json') + } + + getPluginConfig(name) { + if (!name) { + throw new Error('Plugin must have a name') + } + + return _.get(this.config, `plugins.${name}`) + } +} + +module.exports = { Config } diff --git a/scripts/core.js b/scripts/core.js new file mode 100644 index 0000000..9e22beb --- /dev/null +++ b/scripts/core.js @@ -0,0 +1,21 @@ +const signale = require('signale') +const { Runner } = require('./runner') +const { Generator } = require('./generator') +const { Config } = require('./config') + +async function start() { + const config = new Config() + const generator = new Generator('../README.md') + const runner = new Runner(generator, config) + + try { + // Load plugins + await runner.loadPlugin('./plugins') + // Run scripts + await runner.run() + } catch (err) { + signale.error(err) + } +} + +start() diff --git a/scripts/fetcher.js b/scripts/fetchers.js similarity index 75% rename from scripts/fetcher.js rename to scripts/fetchers.js index 412da4f..17a3b2a 100644 --- a/scripts/fetcher.js +++ b/scripts/fetchers.js @@ -1,38 +1,38 @@ const axios = require('axios') axios.interceptors.response.use( - (response) => response, - (error) => { + response => response, + error => { console.error('Fetch failed:', error) return Promise.reject(error) } ) // https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md -exports.fetchNPMPackages = async (npmUID) => { +exports.fetchNPMPackages = async npmUID => { const response = await axios.get(`https://registry.npmjs.com/-/v1/search?text=maintainer:${npmUID}`) return response.data.objects } // https://github.com/npm/registry/blob/master/docs/download-counts.md -exports.fetchNPMPackageDownloads = async (packageName) => { +exports.fetchNPMPackageDownloads = async packageName => { const now = new Date() const today = `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}` const response = await axios.get(`https://api.npmjs.org/downloads/point/2015-01-10:${today}/${packageName}`) return response.data } -exports.fetchGitHubUserinfo = async (githubUID) => { +exports.fetchGitHubUserinfo = async githubUID => { const response = await axios.get(`https://api.github.com/users/${githubUID}`) return response.data } -exports.fetchGitHubRepositories = async (githubUID) => { +exports.fetchGitHubRepositories = async githubUID => { const response = await axios.get(`https://api.github.com/users/${githubUID}/repos?per_page=1000`) return response.data } -exports.fetchGitHubOrganizations = async (githubUID) => { +exports.fetchGitHubOrganizations = async githubUID => { const response = await axios.get(`https://api.github.com/users/${githubUID}/orgs`) return response.data -} \ No newline at end of file +} diff --git a/scripts/generator.js b/scripts/generator.js new file mode 100644 index 0000000..acd4686 --- /dev/null +++ b/scripts/generator.js @@ -0,0 +1,25 @@ +const fs = require('fs') +const path = require('path') + +class Generator { + constructor(filePath) { + const dist = path.resolve(__dirname, filePath) + + this.dist = dist + this.content = fs.readFileSync(dist, { encoding: 'utf-8' }) + } + + render(name, newContent) { + if (!name) return + + const reg = new RegExp(`([\\s\\S]*?)`, 'mg') + + this.content = this.content.replace(reg, newContent) + } + + update() { + fs.writeFileSync(this.dist, this.content, { encoding: 'utf-8' }) + } +} + +module.exports = { Generator } diff --git a/scripts/index.js b/scripts/index.js index cda9351..c01dcee 100644 --- a/scripts/index.js +++ b/scripts/index.js @@ -14,7 +14,7 @@ const npmScript = async () => { // packages downloads map const packageDownloadsMap = new Map() await Promise.all( - packages.map(async (package) => { + packages.map(async package => { const packageName = package.package.name const downloadsResult = await fetchNPMPackageDownloads(packageName) const downloads = downloadsResult?.downloads || 0 @@ -57,7 +57,7 @@ const githubScript = async () => { languages: [], topics: [], } - repositories.forEach((repository) => { + repositories.forEach(repository => { statistics.stars += repository.stargazers_count statistics.forks += repository.forks_count statistics.open_issues += repository.open_issues @@ -101,4 +101,4 @@ const githubScript = async () => { console.error('Generate error!', error) process.exit(1) } -})() \ No newline at end of file +})() diff --git a/scripts/plugins/blog.js b/scripts/plugins/blog.js new file mode 100644 index 0000000..58cd374 --- /dev/null +++ b/scripts/plugins/blog.js @@ -0,0 +1,76 @@ +// Copyright (c) 2020 blackcater +// [Software Name] is licensed under Mulan PSL v2. +// You can use this software according to the terms and conditions of the Mulan PSL v2. +// You may obtain a copy of Mulan PSL v2 at: +// http://license.coscl.org.cn/MulanPSL2 +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +// See the Mulan PSL v2 for more details. + +const _ = require('lodash') +const axios = require('axios') +const { parseString: parseXml } = require('xml2js') +const { getDate } = require('../utils/util') + +class BlogPlugin { + constructor() { + this.name = 'blog' + } + + async apply(config, { log, render }) { + if (!config) return + + const { url, rss_url, latest } = _.defaults(_.clone(config), { latest: 5 }) + + log.log('[BlogPlugin] checking configuration...') + + if (!url) { + throw new Error('Please configure blog.url') + } + + if (!rss_url) { + throw new Error('Please configure blog.rss_url') + } + + log.log(`[BlogPlugin] loading xml content from ${rss_url}...`) + + const { data } = await axios.get(rss_url) + + if (!data) { + throw new Error(`Cannot load '${rss_url}'`) + } + + log.log(`[BlogPlugin] parsing xml content...`) + + const result = await new Promise((resolve, reject) => { + parseXml(data, (err, result) => { + if (err) { + return reject(err) + } + + resolve(result) + }) + }) + + log.log(`[BlogPlugin] updating README.md content...`) + + const items = _.get(result, 'rss.channel[0].item') + const content_prefix = ` +` + const content_suffix = ` +` + let content = `` + + items.slice(0, latest).forEach(item => { + const title = item.title[0] + const link = item.link[0] + const date = item.pubDate[0] + + content += `- ${title} - ${getDate(date)} +` + }) + + render(`${this.name}_plugin`, `${content_prefix}${content}${content_suffix}`) + } +} + +module.exports = BlogPlugin diff --git a/scripts/plugins/twitter.js b/scripts/plugins/twitter.js new file mode 100644 index 0000000..aecff9a --- /dev/null +++ b/scripts/plugins/twitter.js @@ -0,0 +1,76 @@ +// Copyright (c) 2020 blackcater +// [Software Name] is licensed under Mulan PSL v2. +// You can use this software according to the terms and conditions of the Mulan PSL v2. +// You may obtain a copy of Mulan PSL v2 at: +// http://license.coscl.org.cn/MulanPSL2 +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +// See the Mulan PSL v2 for more details. + +const _ = require('lodash') +const axios = require('axios') +const { parseString: parseXml } = require('xml2js') +const { getDate } = require('../utils/util') + +class twitterPlugin { + constructor() { + this.name = 'twitter' + } + + async apply(config, { log, render }) { + if (!config) return + + const { url, rss_url, latest } = _.defaults(_.clone(config), { latest: 5 }) + + log.log('[twitterPlugin] checking configuration...') + + if (!url) { + throw new Error('Please configure twitter.url') + } + + if (!rss_url) { + throw new Error('Please configure twitter.rss_url') + } + + log.log(`[twitterPlugin] loading xml content from ${rss_url}...`) + + const { data } = await axios.get(rss_url) + + if (!data) { + throw new Error(`Cannot load '${rss_url}'`) + } + + log.log(`[twitterPlugin] parsing xml content...`) + + const result = await new Promise((resolve, reject) => { + parseXml(data, (err, result) => { + if (err) { + return reject(err) + } + + resolve(result) + }) + }) + + log.log(`[twitterPlugin] updating README.md content...`) + + const items = _.get(result, 'rss.channel[0].item') + const content_prefix = ` +` + const content_suffix = ` +` + let content = `` + + items.slice(0, latest).forEach(item => { + const title = item.title[0] + const link = item.link[0] + const date = item.pubDate[0] + + content += `- ${title} - ${getDate(date)} +` + }) + + render(`${this.name}_plugin`, `${content_prefix}${content}${content_suffix}`) + } +} + +module.exports = twitterPlugin diff --git a/scripts/runner.js b/scripts/runner.js new file mode 100644 index 0000000..60d35e9 --- /dev/null +++ b/scripts/runner.js @@ -0,0 +1,69 @@ +const fs = require('fs') +const path = require('path') +const signale = require('signale') +const _ = require('lodash') +const { getDate } = require('./utils/util') + +class Runner { + constructor(generator, config) { + this.plugins = [] + this.generator = generator + this.config = config + } + + loadPlugin(rawPath) { + const dist = path.resolve(__dirname, rawPath) + let pluginPaths = [] + + if (fs.statSync(dist).isDirectory()) { + const subPaths = fs.readdirSync(dist) + + subPaths.forEach(subPath => { + const pluginPath = path.resolve(dist, subPath) + + if (fs.statSync(pluginPath).isFile() && !/^\./.test(pluginPath)) { + pluginPaths.push(pluginPath) + } + }) + } else { + pluginPaths = [dist] + } + + this.plugins = _.uniqWith( + [ + ...this.plugins, + ...pluginPaths.map(pluginPath => { + const Constr = require(pluginPath) + + return new Constr() + }), + ], + (x, y) => x.name === y.name + ) + } + + async run() { + const api = { + log: signale, + render: this.generator.render.bind(this.generator), + } + + // run plugins + for await (const plugin of this.plugins) { + signale.time(plugin.name) + await plugin.apply(this.config.getPluginConfig(plugin.name), api) + signale.timeEnd() + } + + // write content to README.md + this.generator.update() + + signale.complete({ + prefix: '[README.md]', + message: ['Updated'], + suffix: `(${getDate(new Date())})`, + }) + } +} + +module.exports = { Runner } diff --git a/scripts/utils.js b/scripts/utils.js index bf2f819..c01febf 100644 --- a/scripts/utils.js +++ b/scripts/utils.js @@ -4,13 +4,13 @@ const path = require('path') exports.CONFIG = require('../package.json').config exports.OUTPUT_DIR = path.join(__dirname, '..', 'output') -exports.thousands = (num) => { +exports.thousands = num => { var str = num.toString() var reg = str.indexOf('.') > -1 ? /(\d)(?=(\d{3})+\.)/g : /(\d)(?=(?:\d{3})+$)/g return str.replace(reg, '$1,') } -exports.jsonStringify = (data) => { +exports.jsonStringify = data => { return JSON.stringify(data, null, 2) } exports.writeFileToOutput = (fileName, fileData) => { @@ -18,4 +18,4 @@ exports.writeFileToOutput = (fileName, fileData) => { } exports.writeJSONToOutput = (fileName, jsonData) => { return exports.writeFileToOutput(fileName, exports.jsonStringify(jsonData)) -} \ No newline at end of file +} diff --git a/scripts/utils/util.js b/scripts/utils/util.js new file mode 100644 index 0000000..b2b884a --- /dev/null +++ b/scripts/utils/util.js @@ -0,0 +1,13 @@ +module.exports.getDate = function (date) { + if (typeof date === 'string') { + date = new Date(date) + } + + function paddingZero(number) { + if (number < 10) return `0${number}` + + return `${number}` + } + + return `${date.getFullYear()}-${paddingZero(date.getMonth() + 1)}-${paddingZero(date.getDate())}` +} diff --git a/yarn.lock b/yarn.lock index a527bac..2d38811 100644 --- a/yarn.lock +++ b/yarn.lock @@ -31,6 +31,13 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -46,12 +53,19 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -axios@^0.21.1: - version "0.21.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" - integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024" + integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== dependencies: - follow-redirects "^1.10.0" + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" balanced-match@^1.0.0: version "1.0.2" @@ -110,6 +124,15 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== +chalk@^2.3.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -150,6 +173,13 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -157,11 +187,23 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -208,6 +250,11 @@ defer-to-connect@^1.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + dot-prop@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -215,6 +262,11 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" +dotenv@^16.0.3: + version "16.0.3" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" + integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -232,11 +284,30 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + escape-goat@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== + dependencies: + escape-string-regexp "^1.0.5" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -244,10 +315,26 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -follow-redirects@^1.10.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" - integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + +follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" fsevents@~2.3.2: version "2.3.2" @@ -349,6 +436,11 @@ ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -423,6 +515,11 @@ json-buffer@3.0.0: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -437,6 +534,29 @@ latest-version@^5.1.0: dependencies: package-json "^6.3.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 sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" @@ -461,6 +581,18 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -528,6 +660,25 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + package-json@^6.3.0: version "6.5.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" @@ -538,11 +689,37 @@ package-json@^6.3.0: registry-url "^5.0.0" semver "^6.2.0" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + picomatch@^2.0.4, picomatch@^2.2.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +pkg-conf@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" + integrity sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g== + dependencies: + find-up "^2.0.0" + load-json-file "^4.0.0" + prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" @@ -553,6 +730,11 @@ prettier@^2.3.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d" integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ== +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + pstree.remy@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" @@ -611,6 +793,11 @@ responselike@^1.0.2: dependencies: lowercase-keys "^1.0.0" +sax@>=0.6.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + semver-diff@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" @@ -640,6 +827,15 @@ signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== +signale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/signale/-/signale-1.4.0.tgz#c4be58302fb0262ac00fc3d886a7c113759042f1" + integrity sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w== + dependencies: + chalk "^2.3.2" + figures "^2.0.0" + pkg-conf "^2.1.0" + simple-icons@^6.7.0: version "6.7.0" resolved "https://registry.yarnpkg.com/simple-icons/-/simple-icons-6.7.0.tgz#45263b5cd624f26f8f11c8ce1cf814be07de41dc" @@ -661,12 +857,17 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -supports-color@^5.5.0: +supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -750,6 +951,11 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" +wakatime-client@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/wakatime-client/-/wakatime-client-2.7.0.tgz#a95f0999376c8eddb89ede99e685c2e62b007868" + integrity sha512-8evdA2P5mKrTHWqVHiQ7X43wQCyZGgfVxlS/r+aypSBXVtM32tfjMjbNNowR6wzfmB5yFjDjxcxPFOYROi476w== + widest-line@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" @@ -786,7 +992,20 @@ xdg-basedir@^4.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== +xml2js@^0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== \ No newline at end of file + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==