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 0000000..18ab52a Binary files /dev/null and b/assets/icons/veact.png differ 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==