├── .babelrc ├── .eslintrc.js ├── .gitignore ├── .npmrc ├── .prettierrc ├── README.md ├── data ├── collections │ └── stories │ │ ├── story-001.md │ │ ├── story-002.md │ │ ├── story-003.md │ │ ├── story-004.md │ │ ├── story-005.md │ │ ├── story-006.md │ │ ├── story-007.md │ │ ├── story-008.md │ │ ├── story-009.md │ │ ├── story-010.md │ │ ├── story-011.md │ │ ├── story-012.md │ │ ├── story-013.md │ │ ├── story-014.md │ │ ├── story-015.md │ │ ├── story-016.md │ │ ├── story-017.md │ │ ├── story-018.md │ │ ├── story-019.md │ │ ├── story-020.md │ │ ├── story-021.md │ │ ├── story-022.md │ │ ├── story-023.md │ │ ├── story-024.md │ │ ├── story-025.md │ │ ├── story-026.md │ │ ├── story-027.md │ │ ├── story-028.md │ │ ├── story-029.md │ │ ├── story-030.md │ │ ├── story-031.md │ │ ├── story-032.md │ │ ├── story-033.md │ │ ├── story-034.md │ │ ├── story-035.md │ │ ├── story-036.md │ │ ├── story-037.md │ │ ├── story-038.md │ │ ├── story-039.md │ │ ├── story-040.md │ │ ├── story-041.md │ │ ├── story-042.md │ │ ├── story-043.md │ │ ├── story-044.md │ │ ├── story-045.md │ │ ├── story-046.md │ │ ├── story-047.md │ │ ├── story-048.md │ │ ├── story-049.md │ │ ├── story-050.md │ │ ├── story-051.md │ │ ├── story-052.md │ │ ├── story-053.md │ │ ├── story-054.md │ │ ├── story-055.md │ │ ├── story-056.md │ │ ├── story-057.md │ │ ├── story-058.md │ │ ├── story-059.md │ │ ├── story-060.md │ │ ├── story-061.md │ │ ├── story-062.md │ │ ├── story-063.md │ │ ├── story-064.md │ │ ├── story-065.md │ │ ├── story-066.md │ │ ├── story-067.md │ │ ├── story-068.md │ │ ├── story-069.md │ │ ├── story-070.md │ │ ├── story-071.md │ │ ├── story-072.md │ │ ├── story-073.md │ │ ├── story-074.md │ │ ├── story-075.md │ │ ├── story-076.md │ │ ├── story-077.md │ │ ├── story-078.md │ │ ├── story-079.md │ │ ├── story-080.md │ │ ├── story-081.md │ │ ├── story-082.md │ │ ├── story-083.md │ │ ├── story-084.md │ │ ├── story-085.md │ │ ├── story-086.md │ │ ├── story-087.md │ │ ├── story-088.md │ │ ├── story-089.md │ │ ├── story-090.md │ │ ├── story-091.md │ │ ├── story-092.md │ │ ├── story-093.md │ │ ├── story-094.md │ │ ├── story-095.md │ │ ├── story-096.md │ │ ├── story-097.md │ │ ├── story-098.md │ │ ├── story-099.md │ │ ├── story-100.md │ │ ├── story-101.md │ │ ├── story-102.md │ │ ├── story-103.md │ │ ├── story-104.md │ │ ├── story-105.md │ │ ├── story-106.md │ │ ├── story-107.md │ │ ├── story-108.md │ │ ├── story-109.md │ │ ├── story-110.md │ │ ├── story-111.md │ │ ├── story-112.md │ │ ├── story-113.md │ │ ├── story-114.md │ │ ├── story-115.md │ │ ├── story-116.md │ │ ├── story-117.md │ │ ├── story-118.md │ │ ├── story-119.md │ │ ├── story-120.md │ │ ├── story-121.md │ │ ├── story-122.md │ │ ├── story-123.md │ │ ├── story-124.md │ │ ├── story-125.md │ │ ├── story-126.md │ │ ├── story-127.md │ │ ├── story-128.md │ │ ├── story-129.md │ │ ├── story-130.md │ │ ├── story-131.md │ │ ├── story-132.md │ │ ├── story-133.md │ │ ├── story-134.md │ │ ├── story-135.md │ │ ├── story-136.md │ │ ├── story-137.md │ │ ├── story-138.md │ │ └── story-139.md ├── mjml │ ├── email-001.mjml │ ├── email-002.mjml │ ├── email-003.mjml │ ├── email-004.mjml │ ├── email-005.mjml │ └── email-006.mjml └── rankings │ ├── weekly-001.json │ ├── weekly-002.json │ ├── weekly-003.json │ ├── weekly-004.json │ ├── weekly-005.json │ ├── weekly-006.json │ ├── weekly-007.json │ ├── weekly-008.json │ ├── weekly-009.json │ ├── weekly-010.json │ ├── weekly-011.json │ ├── weekly-012.json │ ├── weekly-013.json │ ├── weekly-014.json │ ├── weekly-015.json │ ├── weekly-016.json │ ├── weekly-017.json │ ├── weekly-018.json │ ├── weekly-019.json │ ├── weekly-020.json │ ├── weekly-021.json │ ├── weekly-022.json │ ├── weekly-023.json │ ├── weekly-024.json │ ├── weekly-025.json │ ├── weekly-026.json │ ├── weekly-027.json │ ├── weekly-028.json │ ├── weekly-029.json │ ├── weekly-030.json │ ├── weekly-031.json │ ├── weekly-032.json │ ├── weekly-033.json │ ├── weekly-034.json │ ├── weekly-035.json │ ├── weekly-036.json │ ├── weekly-037.json │ ├── weekly-038.json │ ├── weekly-039.json │ ├── weekly-040.json │ ├── weekly-041.json │ ├── weekly-042.json │ ├── weekly-043.json │ ├── weekly-044.json │ ├── weekly-045.json │ ├── weekly-046.json │ ├── weekly-047.json │ ├── weekly-048.json │ ├── weekly-049.json │ ├── weekly-050.json │ ├── weekly-051.json │ ├── weekly-052.json │ ├── weekly-053.json │ ├── weekly-054.json │ ├── weekly-055.json │ ├── weekly-056.json │ ├── weekly-057.json │ ├── weekly-058.json │ ├── weekly-059.json │ ├── weekly-060.json │ ├── weekly-061.json │ ├── weekly-062.json │ ├── weekly-063.json │ ├── weekly-064.json │ ├── weekly-065.json │ ├── weekly-066.json │ ├── weekly-067.json │ ├── weekly-068.json │ ├── weekly-069.json │ ├── weekly-070.json │ ├── weekly-071.json │ ├── weekly-072.json │ ├── weekly-073.json │ ├── weekly-074.json │ ├── weekly-075.json │ ├── weekly-076.json │ ├── weekly-077.json │ ├── weekly-078.json │ ├── weekly-079.json │ ├── weekly-080.json │ ├── weekly-081.json │ ├── weekly-082.json │ ├── weekly-083.json │ ├── weekly-084.json │ ├── weekly-085.json │ ├── weekly-086.json │ ├── weekly-087.json │ ├── weekly-088.json │ ├── weekly-089.json │ ├── weekly-090.json │ ├── weekly-091.json │ ├── weekly-092.json │ ├── weekly-093.json │ ├── weekly-094.json │ ├── weekly-095.json │ ├── weekly-096.json │ ├── weekly-097.json │ ├── weekly-098.json │ ├── weekly-099.json │ ├── weekly-100.json │ ├── weekly-101.json │ ├── weekly-102.json │ ├── weekly-103.json │ ├── weekly-104.json │ ├── weekly-105.json │ ├── weekly-106.json │ ├── weekly-107.json │ ├── weekly-108.json │ ├── weekly-109.json │ ├── weekly-110.json │ ├── weekly-111.json │ ├── weekly-112.json │ ├── weekly-113.json │ ├── weekly-114.json │ ├── weekly-115.json │ ├── weekly-116.json │ ├── weekly-117.json │ ├── weekly-118.json │ ├── weekly-119.json │ ├── weekly-120.json │ ├── weekly-121.json │ ├── weekly-122.json │ ├── weekly-123.json │ ├── weekly-124.json │ ├── weekly-125.json │ ├── weekly-126.json │ ├── weekly-127.json │ ├── weekly-128.json │ ├── weekly-129.json │ ├── weekly-130.json │ ├── weekly-131.json │ ├── weekly-132.json │ ├── weekly-133.json │ ├── weekly-134.json │ ├── weekly-135.json │ ├── weekly-136.json │ ├── weekly-137.json │ ├── weekly-138.json │ └── weekly-139.json ├── netlify.toml ├── package.json ├── public ├── bestofjs.png └── robots.txt ├── scripts ├── rss │ ├── README.md │ ├── build-weekly-feed.js │ ├── build-xml.js │ ├── index.js │ └── write-xml.js ├── stats │ └── count-projects.js ├── step1-build-rankings │ ├── build-story.test.js │ ├── build-weekly-report.js │ ├── build-weekly-story.js │ ├── fetch-trending-projects.js │ ├── fetch.test.js │ └── index.js ├── step2-create-campaign │ ├── README.md │ ├── api │ │ ├── campaign-list.test.js │ │ ├── create-campaign.js │ │ ├── create-campaign.test.js │ │ ├── create-template.js │ │ ├── create-template.test.js │ │ └── request.js │ ├── build-email-html.js │ ├── index.js │ ├── mjml │ │ ├── render-footer.js │ │ ├── render-header.js │ │ ├── render-intro.js │ │ ├── render-newsletter.js │ │ ├── render-project.js │ │ └── render-rankings.js │ └── preview-mjml.test.js └── utils │ └── utils.js ├── src ├── App.js ├── components │ ├── Avatar.js │ ├── Description.js │ ├── Divider.js │ ├── Footer.js │ ├── GrowthScore.js │ ├── Header.js │ ├── Issue.js │ ├── IssueDate.js │ ├── IssueList.js │ ├── Logo.js │ ├── Navigation.js │ ├── ProjectCard.js │ ├── ProjectList.js │ ├── ProjectTable.js │ ├── Spinner.js │ ├── StarDelta.js │ ├── StarIcon.js │ ├── StarTotal.js │ ├── Story.js │ ├── Subscribe.js │ ├── TagLabel.js │ ├── bestofjs.svg │ ├── icons.js │ └── spinner.css ├── containers │ ├── 404.js │ ├── CheckEmailPage.js │ ├── EmailConfirmedPage.js │ ├── ExistingContactPage.js │ ├── HomePage.js │ ├── IssueListPage.js │ └── IssuePage.js ├── index.js └── utils │ ├── fetch-and-populate.js │ ├── fetch-content.js │ ├── project-helpers.js │ ├── rankings.js │ └── stories.js └── static.config.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["react-static/babel-preset.js"] 3 | } 4 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: 'react-tools' 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # secret keys 2 | .env 3 | 4 | # dependencies 5 | /node_modules 6 | 7 | # testing 8 | /coverage 9 | /test 10 | 11 | # production 12 | /dist 13 | /tmp 14 | 15 | # misc 16 | .DS_Store 17 | .env.local 18 | .env.development.local 19 | .env.test.local 20 | .env.production.local 21 | 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | 26 | # files automatically generated by react-static 7 27 | artifacts/ -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "semi": false 4 | } 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Best of JavaScript Weekly 2 | 3 | The weekly newsletter from [Best of JavaScript](https://bestofjs.org), a curated list of the most popular open-source projects related to the web platform and node.js. 4 | 5 | Available online at: https://weekly.bestofjs.org 6 | 7 | [![image](https://user-images.githubusercontent.com/5546996/41823487-9e09a808-783b-11e8-9192-0c2ad349db58.png)](https://weekly.bestofjs.org) 8 | 9 | The newsletter, sent every Sunday, is made of 2 parts: 10 | 11 | - The story: a short comment about the the week's numbers. 12 | - The rankings: the 10 trendiest projects over the last week 13 | 14 | The online version is a static website made with [react-static](https://react-static.js.org/). 15 | -------------------------------------------------------------------------------- /data/collections/stories/story-001.md: -------------------------------------------------------------------------------- 1 | --- 2 | number: 1 3 | --- 4 | 5 | This is the very first issue of [Best of JavaScript Weekly](https://weekly.bestofjs.org) newsletter. 6 | 7 | Every week, you will find here the 10 trendiest projects from [Best of JavaScript](https://weekly.bestofjs.org), a curated list of projects related to the web platform and node.js. 8 | 9 | With almost 1,000 stars added on GitHub every day, the hottest project of the week is [JavaScript Algorithms and Data Structures](https://github.com/trekhleb/javascript-algorithms). 10 | 11 | It's a great resource to learn the basics of computer sciences algorithms (quicksort, binary search...) and data structures (tree, linked list, graph...). 12 | 13 | For developers coming from other languages, who are already familiar with the concepts, it's also nice to see modern JavaScript in action, including testing with Jest. 14 | 15 | An other interesting project related to data structure implementation in JavaScript: [Itsy Bitsy Data Structures](https://github.com/jamiebuilds/itsy-bitsy-data-structures) from James Kyle. 16 | 17 | If you want to learn more about modern JavaScript (ES6, node.js, React...), you may find useful content under the [Learning Resource](http://bestofjs.org/tags/learning) tag in _Best of JavaScript_. 18 | -------------------------------------------------------------------------------- /data/collections/stories/story-002.md: -------------------------------------------------------------------------------- 1 | --- 2 | number: 2 3 | --- 4 | 5 | Welcome to the second issue of Best of JavaScript Weekly! 6 | 7 | This week, the project number 1 is "deno", a prototype by Ryan Dahl, the creator of node.js. 8 | 9 | In an interesting [video presentation](https://www.youtube.com/watch?v=M3BM9TB-8yA), Ryan explains several things he doesn't like about node.js and even expresses regrets. 10 | 11 | But rather than just lamenting, Ryan addresses the issues he mentions by releasing this "secure TypeScript runtime built on V8" ("de no" is an anagram of "no de" if you struggle remembering the name!). 12 | 13 | Among interesting things, a TypeScript compiler is included in the box and it's possible to import any source file from any URL... like the `