Compare commits

...

656 Commits

Author SHA1 Message Date
Kamran Ahmed
9916c47f8e Update src/data/question-groups/react/react.md 2023-09-22 05:01:22 +01:00
Kamran Ahmed
49a7f46fc8 Update src/data/question-groups/react/react.md 2023-09-22 05:01:16 +01:00
Arik Chakma
3284457fb1 wip: investigating slow react app 2023-09-21 18:05:25 +06:00
Arik Chakma
5b3f6358f7 wip: add strict mode question 2023-09-21 08:26:18 +06:00
Arik Chakma
0675572f8b wip: add error boundary example 2023-09-21 07:11:33 +06:00
Arik Chakma
c153d4a28a wip: add hydration question 2023-09-21 06:24:38 +06:00
Arik Chakma
a46a49f45d wip: add custom hook question 2023-09-21 05:58:25 +06:00
Arik Chakma
772281a8de fix: conventions and examples 2023-09-20 21:17:33 +06:00
Arik Chakma
3edd5f7cc1 wip: add directive questions 2023-09-20 18:22:26 +06:00
Arik Chakma
08a6d6ef91 wip: add list question 2023-09-20 17:30:26 +06:00
Arik Chakma
88da459e8e chore: add more questions 2023-09-20 15:42:06 +06:00
Arik Chakma
2fe8e31d52 wip: add comment and state 2023-09-20 07:26:49 +06:00
Arik Chakma
cbcab29589 wip: add dependency array question 2023-09-20 06:34:58 +06:00
Arik Chakma
7f1330f6a2 wip: add component's lifecycle 2023-09-20 06:31:01 +06:00
Arik Chakma
719996419d wip: Add RSC questions 2023-09-20 04:32:18 +06:00
Arik Chakma
4a57c7677c wip: add lazy, conditional questions 2023-09-20 03:38:47 +06:00
Arik Chakma
2596091167 Add more questions 2023-09-19 23:20:10 +06:00
Arik Chakma
aa6d48b775 Add more questions and remove setState 2023-09-19 07:34:29 +06:00
Kamran Ahmed
3e622ecc2c UI Change for Title Question 2023-09-18 18:27:48 +01:00
Kamran Ahmed
ea5c3c2c01 UI Change for Title Question 2023-09-18 18:25:38 +01:00
Kamran Ahmed
8dc0424823 Update description meta for frontend, backend, devops 2023-09-18 17:39:54 +01:00
Kamran Ahmed
f3b16eb50f Fix headings 2023-09-18 16:23:44 +01:00
Kamran Ahmed
e07112a3a9 Remove duplicate questions 2023-09-18 16:19:39 +01:00
Kamran Ahmed
81983b6b06 Add more questions 2023-09-18 16:15:12 +01:00
Kamran Ahmed
bc6b100c26 Add introductory paragraph on roadmaps 2023-09-16 11:20:23 +01:00
Ihor
846bbc1533 fix(typescript): fix template lineral type definition (#4474) 2023-09-13 21:09:45 +01:00
roadmap bot
0b0168b40f chore: add resource under qa:qa-basics:project-management:atlassian 2023-09-12 17:05:41 +01:00
Matvey Volkov
4c9371ee74 Fix issue in typescript (#3922)
json_build_object is used to create json object and get it
2023-09-12 17:03:57 +01:00
Toshita Singh
bb9cc31e8a Fix typo in prototypal inheritance (#3930)
Completed missing property name used to set the prototype of an object.
2023-09-12 16:44:01 +01:00
Jakub Olszewski
8585857cc3 Add ChangeNotifier and ValueNotifier tutorials (#3997)
Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2023-09-12 16:41:36 +01:00
JasonMan34
8c2e812667 Fix recursive types example in typescript roadmap (#4022)
Co-authored-by: Itamar Zwi <itamarz@amplicy.io>
2023-09-12 16:39:19 +01:00
Olawuwo Abideen
bfbee6da0f Add a resource for REST (#4025) 2023-09-12 16:38:47 +01:00
Selva Muthu Kumaran
8057b218a0 Fix video link (#4398)
Computer network | Google IT Support certificate video fixed
fix : #4396
2023-09-12 16:38:10 +01:00
Selva Muthu Kumaran
c3d24a65d1 Fix appium link (#4402)
QA-roadmap-appium website - new link provided
fix: #4205
2023-09-12 16:37:45 +01:00
Tomasz Mikulski
67beb4e8c4 Fix broken http link to presentation - use https (#4405) 2023-09-12 16:37:15 +01:00
Selva Muthu Kumaran
35066d5b70 Fix video lini (#4408)
python-roadmap-oop-classes-python OOP tutorial - fixed video link
fixes : #4221

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2023-09-12 16:36:59 +01:00
Julien Alric
bb76ae411f Update system-design.json fix typo (#4414) 2023-09-12 16:36:22 +01:00
Mohit Rajput
98ea93da8c fix incorrect url change (#4415) 2023-09-12 16:36:06 +01:00
Selva Muthu Kumaran
a69f0cc1b1 Fix YARP in .net roadmap (#4416)
asp.net-core-YARP-description fixex
fixes : #4406
2023-09-12 16:35:36 +01:00
Michał Gałązka
e50e75479a Fixed PHP official website address in backend roadmap (#4417)
changed from php.org to php.net
2023-09-12 16:35:13 +01:00
FranMD
f4592b1e58 Update URL for "Enabling HTTPS on Your Servers" site (#4418) 2023-09-12 16:34:50 +01:00
Selva Muthu Kumaran
45c88da643 Add information about local scope (#4420)
javascript-roadmap-scope-variable-local scope description added
fixes : #4388
2023-09-12 16:34:32 +01:00
Mikhail Ostashchenko
a54fe0d1ba Fix broken links (#4421) 2023-09-12 16:33:51 +01:00
Leo Wang
e1f494776e Fix content link in contributing.md (#4431)
Co-authored-by: Leo Wang <ab0988956087@gamil.com>
2023-09-12 16:33:08 +01:00
Muhammad Afzal
11272da330 docs: add content for Google Cloud Functions (#4443) 2023-09-12 16:31:40 +01:00
Andret Carpizo
8903f11f02 Fix Template Specialization Index CodeBlock for const in printData (#4446) 2023-09-12 16:31:24 +01:00
Selva Muthu Kumaran
8ca9f976cd python-roadmap-decorators (#4448)
python-roadmap-modules-decorators - new link for python decorators in 1 minute
2023-09-12 16:30:57 +01:00
Blake
488521d2e3 Update URL for OpenID Link (#4459) 2023-09-12 16:30:40 +01:00
Kirill Bryntsev
072953c69a Add information about function pointer (#4460) 2023-09-12 16:30:27 +01:00
Akash Sharma
79a656e171 Fixing PRIMARY_KEY NULL constraint (#4465) 2023-09-12 16:27:19 +01:00
Aus Gomez
b565ce9bce issue-442 (#4470) 2023-09-12 16:26:30 +01:00
Kamran Ahmed
460ea8b95a Fix icon on the team creation page 2023-09-06 17:39:04 +01:00
Kamran Ahmed
26ab7b9098 Remove EKS from devops beginner 2023-09-05 11:25:39 +01:00
Kamran Ahmed
0eebcd03a4 Add questions on homepage 2023-09-03 23:18:00 +01:00
Kamran Ahmed
9c75404d0c feat: responsiveness of questions 2023-09-03 23:12:27 +01:00
Kamran Ahmed
61c3c88fb6 Integrate question backend 2023-09-03 19:57:51 +01:00
Kamran Ahmed
1ed54bad90 Change confetti to show on completion of quiz 2023-09-03 17:07:39 +01:00
Kamran Ahmed
437d879af3 feat: add finished screen for questions 2023-09-03 14:11:56 +01:00
Kamran Ahmed
58dd3f2f41 Fix flickering numbers 2023-09-03 12:17:30 +01:00
Kamran Ahmed
cbe758349c Add reset progress functionality 2023-09-03 12:14:20 +01:00
Kamran Ahmed
a847d0b08d Show user progress 2023-09-03 12:02:34 +01:00
Kamran Ahmed
548b7f31f9 Fix confetti does not show up properly 2023-09-03 11:49:00 +01:00
Kamran Ahmed
2e18d5a563 feat: question page with progress tracking 2023-09-03 03:20:59 +01:00
Kamran Ahmed
5bbcd85e6c Update question ui 2023-09-02 23:09:02 +01:00
Kamran Ahmed
1eb0e8869a fix: broken type on hero 2023-09-02 18:00:58 +01:00
Kamran Ahmed
1b74e86db7 Custom roadmaps listing on homepage 2023-09-02 17:49:07 +01:00
Kamran Ahmed
07b2cb0f9b fix: ui 2023-09-02 02:04:44 +01:00
Kamran Ahmed
fba926625d fix: scroll to top when user hides answer 2023-09-02 01:59:07 +01:00
Kamran Ahmed
e4c29b03ab feat: question page ui 2023-09-02 01:56:06 +01:00
Kamran Ahmed
2a7fd53c8b feat: question page confetti 2023-09-01 20:07:17 +01:00
Kamran Ahmed
4cb905b69a feat: design for question page 2023-09-01 18:58:00 +01:00
Kamran Ahmed
a123fc0828 fix: client:only=react 2023-09-01 17:25:10 +01:00
Kamran Ahmed
e15a36a2ce Fix accessibility issues 2023-09-01 00:04:25 +01:00
Kamran Ahmed
ca32c814da Fix accessibility issues 2023-08-31 23:54:27 +01:00
Kamran Ahmed
c4ef2bfcb4 fix: broken build 2023-08-31 23:23:08 +01:00
Kamran Ahmed
bb42c809fb fix: broken build 2023-08-31 23:21:18 +01:00
Kamran Ahmed
03d0a32fd6 chore: upgrade to astro v3 (#4437) 2023-08-31 23:17:51 +01:00
Kamran Ahmed
b8c90948f9 chore: trigger build 2023-08-31 19:05:54 +01:00
Kamran Ahmed
5c57a84e82 chore: migrate from preact to react (#4435) 2023-08-31 17:19:18 +01:00
Kamran Ahmed
c274feced1 Fix broken build 2023-08-30 18:56:36 +01:00
Kamran Ahmed
cdb9153029 Change in grid item design 2023-08-30 18:51:20 +01:00
Jamie Douglas
d3bebfeea6 Updated link to Gradle site (#4423) 2023-08-30 14:20:28 +01:00
Pawel Janicki
68f9e4576b Fix ArgoCD Beginner tutorial link (#4425)
https://github.com/kamranahmedse/developer-roadmap/issues/4424
2023-08-30 14:20:05 +01:00
Leo Wang
051bcce933 Fix video link in Python OOP classes (#4427)
Co-authored-by: Leo Wang <ab0988956087@gamil.com>
2023-08-30 14:19:40 +01:00
Kamran Ahmed
e3793b00c7 Change background color of grid 2023-08-29 18:35:53 +01:00
Kamran Ahmed
f256a5a9b0 Fix logout not working 2023-08-28 17:51:34 +01:00
Mohit Rajput
7e18c97e78 from inside compilerOptions to outside exclude (#4410) 2023-08-28 11:26:46 +06:00
Selva Muthu Kumaran
c95caccae5 golang\conditional-statement (#4400)
* golang\conditional-statement

golang\conditional-statement\golang programs switch case - new link provided

* Add both conditional statements

---------

Co-authored-by: Arik Chakma <arikchangma@gmail.com>
2023-08-26 22:47:33 +06:00
Juan Pablo Partridge
102c57e925 Add mongodb roadmap in backend content (#4035) 2023-08-26 00:15:25 +01:00
Mikhail Ostashchenko
1ec6005fe1 Fix code style (#4356) 2023-08-25 19:40:58 +01:00
KT
ce41b3a955 Remove duplicate resource (#4375)
Remove resource hosting a duplicate of another listed resource.
2023-08-25 19:40:35 +01:00
Selva Muthu Kumaran
eea79968e2 Fix data type content (#4381)
data type (struct and class) clarification
2023-08-25 19:39:37 +01:00
Selva Muthu Kumaran
538e41307c Fix video link (#4385)
javascript\variable\scope\understanding global local function block scope
2023-08-25 19:39:01 +01:00
Mikhail Ostashchenko
79fcf2400f SFINAE fix (C++) (#4390)
When you try to use these function templates, there can be ambiguity issues. If you call foo with an arithmetic type, both template overloads will be considered valid, and the compiler won't know which one to choose.

You can use specialization or tag dispatching to properly handle different cases.
2023-08-25 19:38:41 +01:00
Tushar Daiya
0da1edaa55 Fix link in python roadmap (#4393) 2023-08-25 19:37:46 +01:00
Kamran Ahmed
b04b8c702f Cookie sharing across sub-domains 2023-08-25 02:19:10 +01:00
Bartłomiej Majowicz - Unlimitech
1a7a6db50c Fix typos (#4362)
* Fix misspell.

* Add missing link title.

* Fix add missing word.
2023-08-22 12:37:32 +01:00
Mikhail Ostashchenko
7072c4cf80 Fix code in c++ (#4373) 2023-08-22 12:19:08 +01:00
Mikhail Ostashchenko
f2b29f80f9 Add Reverse iterator (C++) (#4374) 2023-08-22 12:18:19 +01:00
roadmap bot
76c2686269 chore: add resource under cpp:language-concepts:type-casting 2023-08-20 19:14:11 +01:00
Kamran Ahmed
b7728fa6fd Change related roadmaps + faqs to h2 2023-08-18 18:52:50 +01:00
Kamran Ahmed
ca5bae687b Update AI and Data Scientist roadmap 2023-08-18 14:29:33 +01:00
Kamran Ahmed
face1eefbb Update data scientist roadmap 2023-08-17 19:39:08 +01:00
Kamran Ahmed
498ef2eb3b Change feedback popup design 2023-08-17 17:20:19 +01:00
Kamran Ahmed
80d53a9c5d Add AI and Data Scientist Roadmap 2023-08-17 13:57:42 +01:00
Arik Chakma
e0eccaa30e Add team feedback popup (#4341)
* wip: submit feedback popup

* wip: feedback popup state
2023-08-17 13:45:22 +01:00
Erasmo Hernández
c43ee13c94 Fix typo from bug 4210 (#4211) 2023-08-17 03:01:58 +01:00
Kyrylo Nehaturov
b57c4cb558 fix: removed dublicated link (#4217)
removed dublicated link in react roadmap
2023-08-17 03:01:29 +01:00
Kyrylo Nehaturov
c236bf9bf9 fix: removed duplicate link in react 103-rendering/104-events (#4218)
removed duplicate link in react roadmap section 103-rendering/104-events
2023-08-17 03:01:15 +01:00
Kyrylo Nehaturov
c92c67acc9 fix: added link + rewritten link text react 106-state-management (#4219)
I found more obvious such resources list, with the documentation as  the starting resource and then the link for the repo as the next one
2023-08-17 03:01:01 +01:00
Mirac Seref
bec59ed630 Update 101-functional-components.md (#4233)
Fix link issue

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2023-08-17 03:00:34 +01:00
Mark Puchala 2/
7f800f2717 Update history-of-javascript.md (#4287)
Fix reference to non-existent comment section.
2023-08-17 02:58:57 +01:00
carmen
e5579ef7d1 fix: removed unavailable youtube link (#4288) 2023-08-17 02:58:25 +01:00
Gary Y
9e5baad85f Update 103-reporting.md (#4298)
The current link leads to an outdated page with a 404.

https://www.ministryoftesting.com/dojo/series/the-testing-planet-2019/lessons/the-art-of-the-bug-report

This is the new updated link.
https://www.ministryoftesting.com/articles/11b82aee?s_id=15465627
2023-08-17 02:56:42 +01:00
Hugo Poças
146022d1ed Removed duplicate sentence (#4325)
removed the sentence:
"JOIN Queries
Absolutely, here’s a brief summary about SQL JOIN Queries:"

It's the same information as the sentence below and it doesn't give the impression it's answering anything.
2023-08-17 02:56:22 +01:00
obvTiger
6af8033764 Remove extra "s" on 102-razor-pages.md (#4329) 2023-08-17 02:56:08 +01:00
Nikola Hristov
e4d6cd9f41 Restores astro-compress (#4339)
* Restores astro-compress

* squash!
2023-08-17 02:55:49 +01:00
Mikhail Ostashchenko
5cff162a94 Change to the correct data type (#4343) 2023-08-17 02:54:56 +01:00
Kamran Ahmed
3b7e5d5ce2 Add AI and Data Scientist roadmap 2023-08-17 02:52:35 +01:00
Kamran Ahmed
6bc7c2f48c Accept friend request to redirect to friends page 2023-08-15 00:18:49 +01:00
Kamran Ahmed
458396f782 Fix cookie not removed 2023-08-13 20:06:19 +01:00
Kamran Ahmed
bb7f1f4d67 Update frontend roadmap 2023-08-12 14:25:23 +01:00
Jesús
430350fe88 Fix typo in Method Overriding in Typescript (#4306) 2023-08-10 14:30:09 +01:00
Shawn Gestupa
c1d37dead3 update link of "Functional Components and Props" (#4317) 2023-08-10 14:29:38 +01:00
Abdul Wahab
eafd36f6aa Fixed: Function Expression Syntax (#4324)
The syntax for Function Expression was incorrect. It was an example of a function declared using Function Declaration.
2023-08-10 14:28:44 +01:00
Abdul Wahab
ea70632de1 Fix instanceOf mistake (#4322)
instanceof is a runtime check and interface and types don't exist during runtime.

Also TypeScript has a structural type system, which means that they are matched according to the structure of the object and types - not according to instances.

For example:

interface Person {
    name: string;
    age: number
}

const person = {
    name: "Ken",
    age: 25
}

if (person instanceof Person) // Error
2023-08-10 13:14:40 +01:00
roadmap bot
08e29c2c14 chore: add resource under kubernetes:kubernetes-introduction:key-concepts-terminologies 2023-08-09 00:25:05 +01:00
roadmap bot
00b27eabd6 chore: add resource under cyber-security:networking-knowledge:basics-of-nas-and-san 2023-08-09 00:24:07 +01:00
roadmap bot
667e7f4c7f chore: add resource under devops:serverless:cloudflare 2023-08-09 00:23:45 +01:00
stokey
19edadcc18 fix: broken link to CompTIA A+ 220-1101 - (#4309)
Added a link to channel with a query searching for CompTIA A+ 220-1101 in Professor Messer channel
2023-08-08 22:13:06 +01:00
Kamran Ahmed
c5cb2e1877 Fix broken build 2023-08-08 22:10:55 +01:00
Kamran Ahmed
3a09982ff6 Show received friend request count in sidebar 2023-08-08 22:00:04 +01:00
Kamran Ahmed
1d716a9438 Add confirmation on withdraw request 2023-08-08 21:30:33 +01:00
Kamran Ahmed
b69889cc29 Add friends listing 2023-08-08 21:04:44 +01:00
Kamran Ahmed
92295a7906 Friend progress tracking 2023-08-08 19:50:12 +01:00
Kamran Ahmed
2c1ab6b19d Accept, reject friends 2023-08-08 19:29:50 +01:00
Kamran Ahmed
fb3fe8be42 Friends listing page 2023-08-07 19:48:22 +01:00
Kamran Ahmed
c3b34cde3f Add rejected user status 2023-08-07 18:19:24 +01:00
Kamran Ahmed
a30cb170d6 Remove friend 2023-08-07 18:14:48 +01:00
Kamran Ahmed
0a5eeae68c Add friend page 2023-08-07 18:02:25 +01:00
Kamran Ahmed
9ed60d836a Add friends invite page 2023-08-04 18:23:43 +01:00
Arik Chakma
c720888f2b Add functionality to share progress (#4279)
* wip: user progress modal

* wip: modal loading state

* wip: share progress

* chore: best practices share

* chore: prettier

* fix: classname

* Progress button design

* Progress modal

* Update

* Update

* Progress modal refactoring

* Remove event binding for progress

* Update

* UI changes on progress

---------

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2023-08-02 20:49:55 +01:00
Barış Tanrıverdi
2018b9bf38 Fix typos in history of JavaScript (#4240)
Minor text formatting changes and punctuation fixes were made for a consistency of the article structure and clear understanding.
2023-07-31 17:00:02 +01:00
yandif
1ca36e8bfa Correct 'CDNss' to 'CDNs' (#4259) 2023-07-31 16:35:57 +01:00
Maitrayee Khalasi
c0e2e541ca Update the link of youtube channel (#4261)
Updated the link of youtube channel in c++ roadmap, what is c++
2023-07-31 16:35:44 +01:00
Maitrayee Khalasi
04478272c2 Update the link of youtube channel (#4262)
Updated the link of youtube channel in c++ roadmap, bitwise operators
2023-07-31 16:35:19 +01:00
Bartłomiej Majowicz - Unlimitech
9c2e9c1be6 Fix spelling mistake (#4265)
* Fix misspell.

* Add missing link title.
2023-07-31 16:35:01 +01:00
Tomasz Mikulski
77310d24d8 Update 102-sharding-strategies.md (#4269)
Typo in dat(a)base word
2023-07-31 16:34:16 +01:00
Kamran Ahmed
6524da9a9a Add feedback link 2023-07-31 16:04:04 +01:00
roadmap bot
c1d39d24db chore: add resource under ux-design:behavior-change-strategies:cheating:defaulting 2023-07-29 14:41:59 +01:00
roadmap bot
8a747acabd chore: add resource under flutter:state-management:bloc 2023-07-29 14:41:45 +01:00
Mithilesh Pawar
18caaa9d0a fix(typo): fixed typo in js resources (#4271) 2023-07-29 16:56:20 +06:00
Kamran Ahmed
c066ba6c52 Team dropdown 2023-07-28 19:01:10 +01:00
Kamran Ahmed
35148cb8a3 Responsiveness 2023-07-28 18:46:36 +01:00
Kamran Ahmed
5b541dfb3d Updates to team functionality 2023-07-28 18:20:38 +01:00
Arik Chakma
fc8ce296be Team Member listing and Progress Reminder (#4264)
* wip: team member listing

* wip: no progress alert

* wip: mail icon

* feat: Send progress reminder

* fix: guard clause

* chore: resend invite
2023-07-28 15:11:58 +01:00
Kamran Ahmed
543d3b47ce Hide recommendations and reference from roadmaps for teams 2023-07-27 22:00:25 +01:00
Kamran Ahmed
21008de3d1 Prepare roadmaps for team edits 2023-07-26 21:28:15 +01:00
Kamran Ahmed
8787ed46c5 Toast message on leaving team 2023-07-26 20:01:03 +01:00
Kamran Ahmed
94ad20fc04 Remove progress hint 2023-07-26 19:19:57 +01:00
Kamran Ahmed
7f5bbf743a Member progress modal 2023-07-26 19:19:32 +01:00
Kamran Ahmed
f48a351c99 Updating personal progress from popup 2023-07-26 19:02:46 +01:00
Arik Chakma
b85639d876 Add update progress functionality in modal (#4256)
* chore: add update progress in modal

* chore: show tracking for current user

* chore: current user header

---------

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2023-07-26 15:43:55 +01:00
Kamran Ahmed
14f9ad9530 Highlight user personal progress 2023-07-26 15:41:39 +01:00
Kamran Ahmed
076b866430 Personal progress indicator in teams 2023-07-26 15:24:29 +01:00
Kamran Ahmed
7aca57c3e4 Team roadmaps listing page 2023-07-25 21:34:00 +01:00
Kamran Ahmed
36cd03f14f Use the same add roadmap modal 2023-07-25 20:50:40 +01:00
Kamran Ahmed
5bc33cb527 Member progress item sorting 2023-07-25 20:05:47 +01:00
Kamran Ahmed
5d3202e065 Add skip button for teams 2023-07-25 18:56:40 +01:00
Kamran Ahmed
5cf286a753 Update team sizes and copy 2023-07-25 18:32:43 +01:00
Kamran Ahmed
0addc56123 Update the select roadmaps modal 2023-07-25 18:24:32 +01:00
Arik Chakma
3182e2a599 Show current user progress first (#4255)
* wip: progress sorting

* chore: show current user progress first

* fix: team guard

* fix: user progress sort
2023-07-25 17:36:49 +01:00
Kamran Ahmed
8c7fb8cab5 Copy change 2023-07-25 16:51:34 +01:00
Arik Chakma
f61d360ee7 Add select roadmap modal (#4253)
* wip: roadmap selector modal

* wip

* fix: typo

* fix: prettier

* chore: close icon
2023-07-25 16:49:21 +01:00
Kamran Ahmed
29d91be094 Add cursors 2023-07-25 13:21:57 +01:00
Kamran Ahmed
8ee56576ea Update copy for team creation 2023-07-25 13:21:56 +01:00
Arik Chakma
8e945f5e1c Leave Team confirmation popup (#4254)
* wip: leave team popup

* fix: leave warning
2023-07-24 23:38:49 +01:00
Kamran Ahmed
ac48f4c441 Enable teams 2023-07-24 17:26:44 +01:00
Kamran Ahmed
34d0cde165 fix: toast not appearing 2023-07-20 19:55:45 +01:00
Kamran Ahmed
03ba0c384b Add teams support 2023-07-20 19:24:34 +01:00
Arik Chakma
bbe8125fc1 chore: add youtube and twitter icon (#4241) 2023-07-20 17:50:06 +01:00
Balaji Sivasakthi
0c64223ec1 fix(typo): package manager's C++ Archive Network (cppan) heading (#4118)
* fix(typo): package manager's C++ Archive Network (cppan) heading

* Update pnpm-lock.yaml
2023-07-15 13:30:16 +06:00
Nicolas Walcker de Miranda
3a022926de fix check gzip compression url (#4208)
* fix: change check gzip compression url

* remove package-lock.json
2023-07-14 18:32:47 +01:00
Balaji Sivasakthi
93a6ae3f81 fix(typo): fixed typo in cpp - main() function heading (#4120) 2023-07-14 21:57:48 +06:00
Balaji Sivasakthi
42b3595367 fix(typo): fixed typo in cpp namespaces (#4122) 2023-07-14 21:56:21 +06:00
Sadegh Motevali
39278cc97b fix incorrect pyramid document URL (#4198) 2023-07-14 21:54:51 +06:00
Kyrylo Nehaturov
c83d20d63c Fix: removed dublicate link in 108-javascript-expressions-and-operators (#4196)
Removed dublicate link in JS roadmap
2023-07-12 12:57:09 +01:00
Kamran Ahmed
6e8770c8c4 Add clone note in readme 2023-07-11 15:21:12 +01:00
Tabish Naqvi
3457f7495a Clone size fix ISSUE #3312 (#4130)
* Issue #4110 Broken Link Fix

* added note in readme.md fixing large clone size Issue #3312
2023-07-11 15:18:21 +01:00
Dmitrii Goriachev
07acb17459 Update links to new react documentation (#4134)
* update react error boundary link

* update links to JSX

* actualize Component Life Cycle overview and links

* update links to event handling in react

* actualize HOC overview
2023-07-11 14:03:28 +01:00
Davidson Fellipe
77cd0ecf26 Fix typos (#4135) 2023-07-11 04:12:00 +01:00
Reyhan4j02
eccc0302f2 Update 100-installing.md (#4143)
Previously the MinGW-64 link redirected to an error 404 page 
Fixed it to redirect to the overview page
2023-07-11 04:11:22 +01:00
Kamran Ahmed
7274d8a54e Add new badge to sql roadmap 2023-07-11 04:00:31 +01:00
Kamran Ahmed
8d19be6232 Fix typos in ux design roadmap 2023-07-11 03:55:42 +01:00
Ritik Ranjan
e0828d11bf Remove trailing spaces/lines (#4177) 2023-07-11 03:54:03 +01:00
Andrei Belokurov
9e7a37d079 Fix invalid link in devops roadmap (#4186)
Updated from 'ext_link:roadmap.sh/python' to 'ext_link:roadmap.sh/backend' and 'ext_link:roadmap.sh/best-practices/aws'.
2023-07-11 03:53:46 +01:00
Kamran Ahmed
76f1592615 Add link to SQL roadmap 2023-07-11 03:53:17 +01:00
Kamran Ahmed
80e80e7d9b Add syntax highlighting for queries 2023-07-11 03:47:48 +01:00
Kamran Ahmed
8692f05f14 Add content for SQL roadmap 2023-07-11 03:45:54 +01:00
Kamran Ahmed
e5705bd6cc Add SQL roadmap 2023-07-10 20:36:53 +01:00
Arik Chakma
f52e6df410 fix: twice social callback call 2023-07-10 21:18:37 +06:00
Kamran Ahmed
c4db994753 Add link to react native roadmap 2023-07-08 16:38:04 +01:00
Arnav K
7bfd3934f8 🔗 fix: broken link in roadmap cpp (#4181) 2023-07-08 18:04:55 +06:00
Gabriel Coelho da Cunha
32dac79565 [Node.js Developer] Update 102-history-of-nodejs.md (#4179)
Deleted broken link of official documentation and added some suggestions of links that can fill in.
2023-07-08 01:01:06 +06:00
roadmap bot
ceb51a18df chore: add resource under aspnet-core:basics-of-csharp 2023-07-06 17:31:00 +01:00
Dimun
c21f217425 Update typo in introduction-to-llms.md (#4159) 2023-07-06 16:10:21 +01:00
Kamran Ahmed
9299326dc2 Field label for the issue template 2023-07-06 16:06:45 +01:00
Kamran Ahmed
fbe597706a Field label for the issue template 2023-07-06 16:03:49 +01:00
Kamran Ahmed
c7b6257c74 Add new template 2023-07-06 16:03:21 +01:00
Kamran Ahmed
dbe6f8589d Fix duplicate title in the issue template 2023-07-06 16:01:32 +01:00
Kamran Ahmed
9139c8eaf8 Fix broken URL 2023-07-06 15:54:00 +01:00
Kamran Ahmed
05451a0f07 Fix typo 2023-07-06 15:51:48 +01:00
Levon
36d4d8e449 Fix Computer Science roadmap MFU cache description (#4174)
Issue ##4172
2023-07-06 15:50:36 +01:00
Kamran Ahmed
fa8551dd31 Rearrange issues 2023-07-06 15:49:29 +01:00
Kamran Ahmed
7cbf8eb72a Add new issue templates 2023-07-06 15:43:55 +01:00
Kamran Ahmed
e739662d49 Add suggest changes button 2023-07-06 15:39:31 +01:00
Kamran Ahmed
e26fa35470 Add roadmap contribution issue template 2023-07-06 15:33:54 +01:00
Kamran Ahmed
37e92fd084 Add roadmap contribution issue template 2023-07-06 15:31:05 +01:00
Kamran Ahmed
0aef3efda9 Add bug report issue template 2023-07-06 15:18:51 +01:00
Kamran Ahmed
7187da853b Add issue template config 2023-07-06 15:10:31 +01:00
roadmap bot
b81dba9f8b chore: add resource under cyber-security:operating-systems:learn-for-each:understand-permissions 2023-07-06 08:40:32 +01:00
roadmap bot
bf0fd62bff chore: add resource under cyber-security:security-skills-and-knowledge:common-distros-for-hacking:kali-linux 2023-07-06 08:39:16 +01:00
roadmap bot
67e6043cbc chore: add resource under cyber-security:security-skills-and-knowledge:uderstand-frameworks:attck 2023-07-06 08:37:48 +01:00
roadmap bot
9d169219ce chore: add resource under cyber-security:networking-knowledge:understand-the-terminology:vm 2023-07-06 08:36:48 +01:00
roadmap bot
8eb6a0f857 chore: add resource under cyber-security:networking-knowledge:understand-the-terminology:arp 2023-07-06 08:36:36 +01:00
roadmap bot
9c2d3bd2d8 chore: add resource under cyber-security:extras:certifications:beginner-certifications:ccna 2023-07-06 08:36:16 +01:00
roadmap bot
d6de73d7d4 chore: add resource under ux-design:human-decision-making:ux-buzzwords:nudge-theory 2023-07-06 08:36:03 +01:00
roadmap bot
8899654937 chore: add resource under cyber-security:networking-knowledge:understand-the-terminology:dmz 2023-07-06 08:35:52 +01:00
roadmap bot
d64cb4116a chore: add resource under cyber-security:networking-knowledge:understand-the-terminology:vlan 2023-07-06 08:35:34 +01:00
roadmap bot
f428849daa chore: add resource under spring-boot:spring-core 2023-07-05 22:23:51 +01:00
roadmap bot
83143f4438 chore: add resource under postgresql-dba:postgresql-infrastructure-skills:kubernetes-deployment 2023-07-05 22:23:35 +01:00
roadmap bot
8adc6cb7b4 chore: add resource under postgresql-dba:installation-and-setup:deployment-in-cloud 2023-07-05 22:23:27 +01:00
roadmap bot
d12eccb6aa chore: add resource under cyber-security:security-skills-and-knowledge:tools-for-unintended-purposes:lolbas 2023-07-05 22:18:17 +01:00
roadmap bot
93a1dedd8f chore: add resource under nodejs:nodejs-logging 2023-07-05 22:18:06 +01:00
roadmap bot
027a4a947a chore: add resource under ux-design:human-decision-making 2023-07-05 22:17:55 +01:00
roadmap bot
67fd8d3d47 chore: add resource under computer-science:design-patterns 2023-07-05 22:17:39 +01:00
roadmap bot
e42532ad7c chore: add resource under frontend:web-security-knowledge:content-security-policy 2023-07-05 22:16:52 +01:00
roadmap bot
944a35a905 chore: add resource under cyber-security:extras:ctfs:hack-the-box 2023-07-05 22:16:04 +01:00
roadmap bot
9f620866cb chore: add resource under react:cli-tools:create-react-app 2023-07-05 22:15:27 +01:00
roadmap bot
4d74e9c47c chore: add resource under devops:operating-systems:linux:ubuntu 2023-07-05 22:11:43 +01:00
roadmap bot
f1a37deab2 chore: add resource under cpp:basic-operations:loops 2023-07-05 22:10:16 +01:00
roadmap bot
f36dd4b964 chore: add resource under cyber-security:security-skills-and-knowledge:cia-triad 2023-07-05 22:10:00 +01:00
Kamran Ahmed
80c842412a Add docker course link 2023-07-05 22:09:35 +01:00
roadmap bot
219ef68001 chore: add resource under spring-boot:spring-security 2023-07-05 22:08:19 +01:00
roadmap bot
ab8a551a96 chore: add resource under java:java-advanced-topics:memory-management 2023-07-05 22:08:12 +01:00
roadmap bot
467382879d chore: add resource under python:python-frameworks:fastapi 2023-07-05 22:07:57 +01:00
roadmap bot
258f6cd0f0 chore: add resource under postgresql-dba:rdbms-concepts:object-model:tables 2023-07-05 22:07:46 +01:00
roadmap bot
2c3bf1ebbc chore: add resource under postgresql-dba:rdbms-concepts:object-model:data-types 2023-07-05 22:07:37 +01:00
roadmap bot
1113b698be chore: add resource under postgresql-dba:rdbms-concepts:object-model:queries 2023-07-05 22:07:27 +01:00
roadmap bot
eefcc6866b chore: add resource under cyber-security:networking-knowledge:osi-model 2023-07-05 22:07:17 +01:00
roadmap bot
34185ac8fb chore: add resource under devops:serverless 2023-07-05 22:06:24 +01:00
roadmap bot
c1e85ce422 chore: add resource under angular:zones 2023-07-05 22:05:54 +01:00
Iwin Issac
6ed270112d Fixed Broken Link in 100-html.md (#4147) 2023-07-04 18:22:09 +01:00
Fabrício Vilela
df4c457dd4 fix: link pointing from javascript to devops (#4154)
* fix: link pointing from javascript to devops

* fix: return to one line json
2023-07-04 18:16:36 +01:00
Arik Chakma
8a5bc21206 Add account deletion functionality (#4153)
* chore: delete account

* Add account deletion functionality

---------

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2023-07-04 18:14:56 +01:00
Kamran Ahmed
2d3a89bd56 Add related roadmaps 2023-07-03 18:04:51 +01:00
Kamran Ahmed
d39dad7275 Remove affiliates from devops roadmap 2023-07-03 17:04:12 +01:00
Ankur Jain
37107c495f fix(typo): link updated in 100-servlet.md (#4151)
[FIXED] Last link typos in the Servlet section of the Spring boot developer roadmap titled "What is Dispatcher Servlet in Spring?" 100-servlet.md
2023-07-03 10:34:24 +01:00
roadmap bot
2a910ddde4 chore: add resource under java:java-advanced-topics:streams 2023-07-02 23:38:40 +01:00
roadmap bot
11d7e7d431 chore: add resource under devops:artifcats:artifactory 2023-07-02 23:38:32 +01:00
roadmap bot
991de00891 chore: add resource under system-design:asynchronism:message-queues 2023-07-02 23:38:23 +01:00
roadmap bot
7747582e70 chore: add resource under prompt-engineering:prompt-hacking 2023-07-02 23:38:00 +01:00
roadmap bot
28550ec84c chore: add resource under python:data-structures-and-algorithms 2023-07-02 23:37:31 +01:00
roadmap bot
8246b48f59 chore: add resource under typescript:typescript 2023-07-02 23:37:04 +01:00
roadmap bot
455a70c64c chore: add resource under aspnet-core:basics-of-csharp:csharp 2023-07-02 23:36:13 +01:00
roadmap bot
f0f797a996 chore: add resource under design-system:design-language:guidelines:user-onboarding 2023-07-02 23:36:00 +01:00
roadmap bot
037763770d chore: add resource under cyber-security:networking-knowledge:ip-terminology:subnet-mask 2023-07-02 23:35:41 +01:00
roadmap bot
8d4299c899 chore: add resource under react:components:composition-vs-inheritance 2023-07-02 23:35:31 +01:00
roadmap bot
534ed126d4 chore: add resource under vue:ecosystem:mobile-apps 2023-07-02 23:35:19 +01:00
Kamran Ahmed
0fa6ecd3ce Remove youtube alert 2023-06-30 19:23:58 +01:00
Kamran Ahmed
7dfb630cb5 Update devops roadmap link 2023-06-30 19:15:33 +01:00
roadmap bot
13e1aacd3b chore: add resource under frontend:html:seo-basics 2023-06-30 19:10:24 +01:00
roadmap bot
9ad5143588 chore: add resource under java:java-advanced-topics:generics 2023-06-30 19:01:13 +01:00
roadmap bot
9e867d5f4e chore: add resource under javascript:javascript-control-flow:exception-handling:throw-statement 2023-06-30 19:00:32 +01:00
roadmap bot
f3b186d525 chore: add resource under system-design:latency-vs-throughput 2023-06-30 19:00:23 +01:00
roadmap bot
5f9a50804b chore: add resource under aspnet-core:basics-of-csharp 2023-06-30 18:57:45 +01:00
roadmap bot
486603aff7 chore: add resource under devops:live-in-terminal:process-monitoring 2023-06-30 18:57:37 +01:00
roadmap bot
feec4b7576 chore: add resource under docker:introduction:need-for-containers 2023-06-30 18:57:26 +01:00
roadmap bot
f64f7b973e chore: add resource under prompt-engineering:prompt-hacking:offensive-measures 2023-06-30 18:57:12 +01:00
roadmap bot
31f941e262 chore: add resource under prompt-engineering:prompt-hacking:defensive-measures 2023-06-30 18:57:00 +01:00
roadmap bot
09d312ee46 chore: add resource under prompt-engineering:prompt-hacking:prompt-injection 2023-06-30 18:56:53 +01:00
roadmap bot
a92e8f1b1a chore: add resource under prompt-engineering:prompt-hacking:prompt-leaking 2023-06-30 18:56:46 +01:00
roadmap bot
bca66f7c0b chore: add resource under prompt-engineering:prompt-hacking:jailbreaking 2023-06-30 18:56:38 +01:00
roadmap bot
b743a31610 chore: add resource under react:cli-tools:vite 2023-06-30 18:56:16 +01:00
roadmap bot
b1dc116cae chore: add resource under devops:cloud-providers:aws 2023-06-30 18:55:54 +01:00
roadmap bot
fae57224a8 chore: add resource under javascript:javascript-variables:hoisting 2023-06-30 18:55:35 +01:00
roadmap bot
c8ffea31d9 chore: add resource under devops:language:rust 2023-06-30 18:55:26 +01:00
roadmap bot
fc3b2a4015 chore: add resource under cyber-security:networking-knowledge:auth-methodologies:kerberos 2023-06-30 18:54:53 +01:00
roadmap bot
f70272763f chore: add resource under design-system:design-language:logo:different-file-formats 2023-06-30 11:10:13 +01:00
roadmap bot
a15c2a3ca7 chore: add resource under flutter:deployment:appstore 2023-06-30 11:10:01 +01:00
roadmap bot
550555c0c5 chore: add resource under design-system:design-language:logo:small-use-guidance 2023-06-30 11:09:40 +01:00
roadmap bot
6e201a8c29 chore: add resource under cyber-security:operating-systems:linux 2023-06-30 11:09:21 +01:00
roadmap bot
dd139170d1 chore: add resource under devops:serverless:aws-lambda 2023-06-30 11:09:03 +01:00
roadmap bot
66412327fa chore: add resource under python:data-structures-and-algorithms:arrays-linked-lists 2023-06-30 11:08:37 +01:00
roadmap bot
7736271ba0 chore: add resource under flutter:dart-basics:control-flow-statements 2023-06-30 11:07:45 +01:00
roadmap bot
4236c8495a chore: add resource under cyber-security:extras:certifications:beginner-certifications:comptia-linuxplus 2023-06-30 11:06:33 +01:00
roadmap bot
6c930716fc chore: add resource under ux-design:human-decision-making:ux-buzzwords:nudge-theory 2023-06-30 11:06:21 +01:00
roadmap bot
522b00612a chore: add resource under cyber-security:security-skills-and-knowledge:other-attacks:buffer-overflow 2023-06-30 11:02:56 +01:00
roadmap bot
e36ff7bdd6 chore: add resource under frontend:build-tools:module-bundlers:vite 2023-06-30 11:02:38 +01:00
roadmap bot
d168731cbd chore: add resource under python:python-advanced-topics:iterators 2023-06-30 11:02:15 +01:00
roadmap bot
715daf499f chore: add resource under cyber-security:basic-it-skills:connection-types:wifi 2023-06-30 11:01:59 +01:00
roadmap bot
6f5449e4b9 chore: add resource under cyber-security:basic-it-skills:connection-types:nfc 2023-06-30 11:01:42 +01:00
roadmap bot
7f3690d5b8 chore: add resource under cyber-security:basic-it-skills:connection-types 2023-06-30 11:01:24 +01:00
roadmap bot
1046dc9171 chore: add resource under cyber-security:basic-it-skills:computer-hardware-components 2023-06-30 11:01:11 +01:00
Kamran Ahmed
28f672d989 Update distance of mark favorite 2023-06-27 20:46:36 +01:00
Kamran Ahmed
3f5ddfa346 Add react native content 2023-06-27 20:20:17 +01:00
Kamran Ahmed
f1f4e99dab Add directories for react native roadmap 2023-06-27 20:20:17 +01:00
Kamran Ahmed
67f3917a8d Add react native roadmap 2023-06-27 20:20:17 +01:00
Tabish Naqvi
02988fac2c Issue #4110 Broken Link Fix (#4129) 2023-06-27 19:21:01 +01:00
Ritik Ranjan
d21deb0725 Database spelling mistake (#4115) 2023-06-24 16:49:12 +06:00
Anthony Da Mota
2a5d316e58 Fixed typo in 102-documentation.md (#4108) 2023-06-23 19:11:26 +06:00
Kamran Ahmed
557a01b4d0 Fix typo in docker file 2023-06-22 20:44:37 +01:00
Kamran Ahmed
680dbee6eb Clear favorite on logout 2023-06-22 20:44:37 +01:00
roadmap bot
b525c5efb4 chore: add resource under react:components:functional-components 2023-06-22 20:41:10 +01:00
roadmap bot
347141f93b chore: add resource under cyber-security:operating-systems:windows 2023-06-22 20:40:50 +01:00
Snahal Kumar
9a6e8b1635 C++ Lambdas link (#4084)
The video link is no longer available on youtube. It is updated with another link which I have personally reviewed and has good-quality content of 18 minutes in English has high viewers and is one of the most popular C++ channels on youtube. Also, a free e-book of lambda is provided by the content creator.
2023-06-22 20:38:00 +01:00
Shawn Nectar
8a42d0346b [Issue] #4062 Wrong link assigned (#4077) 2023-06-22 20:37:17 +01:00
Arnav K
0e0a3f17ae Update 101-c.md (#4106) 2023-06-22 20:36:52 +01:00
Shawn Nectar
9298f76a68 [Issue] Software Architect - Duplicated python in related roadmaps (#4078) 2023-06-22 20:14:53 +01:00
Renato C. Francisco
e85ff79dbe remove duplicated top explanation (#4104) 2023-06-22 20:14:35 +01:00
Arnav K
7a19b7887a Fix router link (#4105) 2023-06-22 20:14:05 +01:00
roadmap bot
08e7efa637 chore: add resource under frontend:html:writing-semantic-html 2023-06-22 16:14:51 +01:00
roadmap bot
cc348c0c96 chore: add resource under flutter:state-management:riverpod 2023-06-22 16:14:24 +01:00
roadmap bot
5a059c151f chore: add resource under cyber-security:extras:ctfs:sans-holiday-hack-challenge 2023-06-22 16:14:10 +01:00
roadmap bot
4063b71345 chore: add resource under backend:more-about-databases:orms 2023-06-22 16:13:58 +01:00
roadmap bot
129ef9ccd8 chore: add resource under backend:internet 2023-06-22 16:13:42 +01:00
roadmap bot
d60e4fcfa4 chore: add resource under full-stack:git 2023-06-22 16:13:26 +01:00
roadmap bot
310c6d4c55 chore: add resource under cpp:basic-operations:bitwise 2023-06-22 16:13:11 +01:00
roadmap bot
fffccbe5b5 chore: add resource under cpp:introduction:what-is-cpp 2023-06-22 16:12:50 +01:00
roadmap bot
9685f1e952 chore: add resource under prompt-engineering:image-prompting:style-modifiers 2023-06-22 16:12:16 +01:00
roadmap bot
ef53c2dd5f chore: add resource under frontend:desktop-applications:electron 2023-06-22 16:11:57 +01:00
roadmap bot
7e0f7a32af chore: add resource under software-design-architecture:clean-code-principles:code-by-actor 2023-06-22 16:11:46 +01:00
roadmap bot
cdea68e754 chore: add resource under devops:operating-systems:linux:rhel 2023-06-22 16:11:20 +01:00
roadmap bot
90069e4ef4 chore: add resource under devops:operating-systems:linux:ubuntu 2023-06-22 16:10:50 +01:00
roadmap bot
8dbaa60b58 chore: add resource under golang:go-basics 2023-06-22 16:08:20 +01:00
roadmap bot
19b38dec4c chore: add resource under full-stack:nodejs 2023-06-22 15:58:53 +01:00
Arik Chakma
9c246984d1 Mark favorite in the Roadmap's page (#4098)
* chore: favorite in roadmap header

* chore: best practices header

* chore: mark favorite

* fix: bookmark position

* UI changes and fix

---------

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2023-06-22 02:57:32 +01:00
Aaryan Dewan
ff0e10c16c Correct grammar (#4095)
Changed 'al' to 'all'
2023-06-21 20:40:56 +06:00
roadmap bot
ec165d4a78 chore: add resource under devops:networking-protocols 2023-06-20 22:03:44 +01:00
Arik Chakma
afe718ee09 Allow marking roadmaps and best practices as favorites (#4087)
* chore: favorite icon

* fix: hero progress mark favorit

* chore: mark favorite

* fix: mouse overflow

* fix: popup redirect

* Update favorites on homepage

* Refactor favorite logic

* Change icon location

---------

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2023-06-20 21:50:18 +01:00
Ritik Ranjan
4aca01a98d Fix spelling mistake (#4088) 2023-06-20 18:24:48 +01:00
Kamran Ahmed
140282f1ff Update devops roadmap link 2023-06-20 17:31:31 +01:00
roadmap bot
4d38d19e4f chore: add resource under aspnet-core:basics-of-aspnet-core:filters-and-attributes 2023-06-20 15:16:05 +01:00
roadmap bot
5e39417a64 chore: add resource under cyber-security:security-skills-and-knowledge:common-exploit-frameworks 2023-06-20 15:15:57 +01:00
roadmap bot
03ec7ebcd9 chore: add resource under javascript:javascript-variables:scopes 2023-06-20 15:15:44 +01:00
roadmap bot
fbb6def555 chore: add resource under computer-science:pick-a-language:c-plus-plus 2023-06-20 15:15:24 +01:00
roadmap bot
ae9e30eb73 chore: add resource under mongodb:mongodb-basics:sql-vs-nosql 2023-06-20 15:15:03 +01:00
roadmap bot
9e89c6946b chore: add resource under ux-design:human-decision-making 2023-06-20 15:14:48 +01:00
Arik Chakma
6ff83d0797 Merge pull request #3766 from jensrott/fix-typo-playwright
Fixed typo in the word tutorial
2023-06-20 00:53:01 +06:00
Arik Chakma
5ff131ae29 Merge pull request #3873 from the-land-mine/master
fix: Correct syntax error in Promise initialization example by adding space
2023-06-20 00:51:52 +06:00
Arik Chakma
e80f88ef2c Merge pull request #4049 from arzkar/issue4044_fix
fix: typo: mor -> more
2023-06-20 00:49:50 +06:00
Arik Chakma
cff01c151b Merge pull request #4080 from JustLolo/master
The external link is broken
2023-06-20 00:48:48 +06:00
Arik Chakma
6ca85a41a2 Merge pull request #4081 from johan456789/master
fix URL link
2023-06-20 00:46:32 +06:00
JustLolo
1630b493b1 External link is broken, fixed 2023-06-19 06:41:26 -05:00
Tsung-Han Yu
518ece3cab fix URL link 2023-06-19 10:34:37 +08:00
JustLolo
aba2fd1d35 External broken link, Youtube is showing:
`This video isn't available anymore`
2023-06-18 18:11:38 -05:00
Arik Chakma
fcd68568c2 Merge pull request #4076 from ShawnNectar/patch-1
[Issue] #4075 Wrong link assigned
2023-06-18 22:11:26 +06:00
Shawn Nectar
1b5e9ffe0d [Issue] #4075 Wrong link assigned 2023-06-18 12:58:33 -03:00
Kamran Ahmed
b3c3e44ba2 Update shortcut for marking as skipped 2023-06-17 23:13:59 +01:00
Kamran Ahmed
67b49d3f87 Remove new badges from old roadmaps 2023-06-17 16:17:42 +01:00
roadmap bot
0d3e1d31bb chore: add resource under aspnet-core:orm:entity-framework-core:change-tracker-api 2023-06-17 15:23:52 +01:00
roadmap bot
28a27a1c65 chore: add resource under computer-science:pick-a-language:c 2023-06-17 15:23:36 +01:00
roadmap bot
8c3ea21ef1 chore: add resource under cpp:introduction 2023-06-17 15:22:41 +01:00
roadmap bot
417596db36 chore: add resource under frontend:progressive-web-apps:notifications 2023-06-17 15:22:30 +01:00
roadmap bot
28240162b3 chore: add resource under frontend:build-tools:module-bundlers:esbuild 2023-06-17 15:22:11 +01:00
roadmap bot
6dca357782 chore: add resource under blockchain:blockchain-general-knowledge:blockchain-forking 2023-06-17 15:21:57 +01:00
roadmap bot
d1fe06a4e9 chore: add resource under flutter:widgets:responsive-widgets 2023-06-17 15:20:28 +01:00
roadmap bot
97cba5681b chore: add resource under full-stack:html 2023-06-17 15:20:15 +01:00
roadmap bot
715d2ba62b chore: add resource under golang:go-advanced:working-with-json 2023-06-17 15:19:54 +01:00
Kamran Ahmed
32673c21fb Add shortcuts for progress tracking 2023-06-17 15:19:24 +01:00
roadmap bot
f0c47705cb chore: add resource under nodejs:nodejs-command-line-apps:command-line-args 2023-06-17 15:17:18 +01:00
roadmap bot
612b91e05f chore: add resource under full-stack:nodejs 2023-06-17 15:17:08 +01:00
roadmap bot
b4cce42844 chore: add resource under devops:serverless:azure-functions 2023-06-17 15:16:41 +01:00
roadmap bot
2c2d57ecab chore: add resource under cpp:functions 2023-06-17 15:16:36 +01:00
roadmap bot
d05374ca68 chore: add resource under ux-design:human-decision-making:ux-buzzwords:nudge-theory 2023-06-17 15:16:14 +01:00
roadmap bot
b5c02a9aff chore: add resource under cyber-security:basic-it-skills:popular-suites:icloud 2023-06-17 15:16:04 +01:00
roadmap bot
1e3568a1c4 chore: add resource under cyber-security:networking-knowledge:understand-the-terminology:dns 2023-06-17 15:15:44 +01:00
Arik Chakma
bdeebbc9cc chore: linkedin login functionality (#4072) 2023-06-17 12:31:33 +01:00
Kamran Ahmed
510e6fd273 Update youtube banner 2023-06-17 11:49:15 +01:00
Kamran Ahmed
2ca98bbb10 Show resource progress on best practices 2023-06-17 11:47:25 +01:00
Kamran Ahmed
49cff0c22c Add progress loading on roadmap pages 2023-06-17 05:43:50 +01:00
Kamran Ahmed
943bf41dc5 Fix duplicate nodes in frontend roadmap 2023-06-17 04:30:58 +01:00
Umair Khan
6c9ba75906 Fix KodeKloud spelling (#4066)
* Update devops.json 

kodekloud spelling correction

* Update src/data/roadmaps/devops/devops.json

---------

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2023-06-15 22:17:53 +01:00
Kamran Ahmed
70976ee42a Add roadcard as protected route 2023-06-15 14:51:52 +01:00
roadmap bot
5848698abf chore: add resource under python:python-advanced-topics:lambdas 2023-06-15 02:27:28 +01:00
roadmap bot
29dd1eb21f chore: add resource under python:python-advanced-topics:decorators 2023-06-15 02:27:17 +01:00
roadmap bot
ebe6d3c6e4 chore: add resource under system-design:latency-vs-throughput 2023-06-15 02:27:06 +01:00
roadmap bot
425bfea265 chore: add resource under system-design:performance-vs-scalability 2023-06-15 02:26:57 +01:00
roadmap bot
c58efe8d00 chore: add resource under python:python-advanced-topics:oop:classes 2023-06-15 02:26:39 +01:00
Kamran Ahmed
955d04e532 UI changes on road cards 2023-06-14 20:58:15 +01:00
Kamran Ahmed
0031a9c6ba Remove preact-compat 2023-06-14 20:42:32 +01:00
Kamran Ahmed
8fb778337d Add support for roadcards 2023-06-14 20:42:07 +01:00
Kamran Ahmed
a48d39a863 Update animation of progress switcher 2023-06-14 15:02:53 +01:00
Kamran Ahmed
36b2a8f2d7 Progress container update 2023-06-14 14:46:10 +01:00
Kamran Ahmed
00e9d44ba9 Remove client:only from favorite roadmaps 2023-06-14 13:54:54 +01:00
Kamran Ahmed
62b068a94a Fix jitter on homepage 2023-06-14 13:51:29 +01:00
Kamran Ahmed
af926002e9 feat: show user's progress on homepage (#4058)
* Add custom client:authenticated directive

* Update 100-installing-a-local-cluster.md

fixed typo for ubuntu in 100-installing-a-local-cluster.md

* Animate progress on the homescreen

* Show progress on homepage

* Update progress list UI

* Remove sponsor call from non-required pages

* Resolve merge conflicts

* Change height of hero container

---------

Co-authored-by: kanhaya kumar yadav <kanhaya.workspace@gmail.com>
2023-06-14 13:12:52 +01:00
roadmap bot
0612f9c44f chore: add resource under docker:introduction:what-are-containers 2023-06-14 03:47:19 +01:00
roadmap bot
fbf545c2ed chore: add resource under cyber-security:security-skills-and-knowledge:common-distros-for-hacking:parrot-os 2023-06-14 03:47:04 +01:00
roadmap bot
c7ef97cb4f chore: add resource under react:rendering:refs 2023-06-14 03:46:43 +01:00
roadmap bot
564f48540e chore: add resource under react:rendering:render-props 2023-06-14 03:46:29 +01:00
roadmap bot
52e729d212 chore: add resource under prompt-engineering:prompting-introduction 2023-06-14 03:45:32 +01:00
roadmap bot
bdfa7606dd chore: add resource under devops:live-in-terminal:scripting:powershell 2023-06-14 03:45:21 +01:00
roadmap bot
056e0e8e3a chore: add resource under react:rendering:lists-and-keys 2023-06-14 03:45:11 +01:00
roadmap bot
879ba258b2 chore: add resource under cyber-security:basic-it-skills:connection-types:wifi 2023-06-14 03:44:40 +01:00
Kamran Ahmed
3d62d2689f Animate progress on the homescreen 2023-06-14 02:09:09 +01:00
Arbaaz Laskar
3b7a9ca5cd fix: typo: mor -> more 2023-06-14 00:06:37 +05:30
Arik Chakma
ac892d2868 Merge pull request #4047 from kanhayaKy/patch-1
fix: ubuntu type
2023-06-13 17:57:19 +06:00
roadmap bot
19bde7bb2f chore: add resource under cyber-security:security-skills-and-knowledge:forensics 2023-06-13 11:38:12 +01:00
roadmap bot
419b1872b8 chore: add resource under javascript:javascript-asynchronous-javascript:callbacks 2023-06-13 11:37:50 +01:00
roadmap bot
bbeb4ee279 chore: add resource under devops:live-in-terminal:scripting:bash-scripting 2023-06-13 11:37:42 +01:00
roadmap bot
f2ca7d9140 chore: add resource under backend:relational-databases:mysql 2023-06-13 11:37:12 +01:00
roadmap bot
70b95c6ad1 chore: add resource under javascript:javascript-asynchronous-javascript:callbacks:callback-hell 2023-06-13 11:36:49 +01:00
roadmap bot
5a3f621093 chore: add resource under javascript:javascript-loops-iterations:break-continue:labeled-statements 2023-06-13 11:36:41 +01:00
roadmap bot
631eb380fc chore: add resource under cpp:pointers-and-references:smart-pointers:weak-ptr 2023-06-13 11:36:31 +01:00
roadmap bot
cb9778ba15 chore: add resource under cyber-security:basic-it-skills:os-independent-troubleshooting 2023-06-13 11:36:20 +01:00
roadmap bot
38106a8199 chore: add resource under typescript:typescript-types:type-assertions:as-type 2023-06-13 11:35:46 +01:00
roadmap bot
226e94857b chore: add resource under aspnet-core:basics-of-csharp:csharp 2023-06-13 11:35:31 +01:00
roadmap bot
f94c701657 chore: add resource under computer-science:pick-a-language:c-plus-plus 2023-06-13 11:35:17 +01:00
roadmap bot
259109cc38 chore: add resource under cyber-security:basic-it-skills 2023-06-13 11:35:04 +01:00
kanhaya kumar yadav
e120df30e3 Update 100-installing-a-local-cluster.md
fixed typo for ubuntu in 100-installing-a-local-cluster.md
2023-06-13 11:46:55 +05:30
Kamran Ahmed
43f351a943 Add progress loading on homepage roadmaps 2023-06-13 03:19:59 +01:00
roadmap bot
502b8e20d5 chore: add resource under computer-science:common-algorithms:graph-algorithms:breadth-first-search 2023-06-11 18:44:23 +01:00
roadmap bot
ff5858f965 chore: add resource under flutter:widgets:inherited-widgets 2023-06-11 18:43:59 +01:00
roadmap bot
8b8ef52d98 chore: add resource under python:python-basics 2023-06-11 18:43:37 +01:00
roadmap bot
7032bc0726 chore: add resource under backend:repo-hosting-services:github 2023-06-11 18:43:29 +01:00
roadmap bot
ba65dec596 chore: add resource under cpp:libraries:poco 2023-06-11 18:42:48 +01:00
roadmap bot
78cf88fbd9 chore: add resource under flutter:design-principles:design-patterns 2023-06-11 02:10:16 +01:00
roadmap bot
93e16d899a chore: add resource under devops:artifcats:nexus 2023-06-11 02:09:49 +01:00
roadmap bot
14060bda94 chore: add resource under javascript:javascript-control-flow:exception-handling:throw-statement 2023-06-11 02:08:21 +01:00
Kamran Ahmed
45b729d708 Update the schema updated date 2023-06-10 20:28:13 +01:00
roadmap bot
9023ea6298 chore: add resource under angular:typescript-basics:union-types 2023-06-10 14:06:00 +01:00
Kamran Ahmed
d29176cf98 Add links to beginner versions 2023-06-10 11:40:24 +01:00
Kamran Ahmed
55989d8480 Add updated devops roadmap pdf 2023-06-10 04:03:38 +01:00
Kamran Ahmed
9c936974c7 Add devops beginner roadmap 2023-06-10 04:02:51 +01:00
Kamran Ahmed
311b4683d0 Rewrite devops roadmap 2023-06-10 04:02:48 +01:00
roadmap bot
bf61697154 chore: add resource under react:hooks:common-hooks 2023-06-09 21:01:31 +01:00
roadmap bot
52818f1e34 chore: add resource under blockchain:blockchain-basics 2023-06-09 21:01:17 +01:00
roadmap bot
174ea05a92 chore: add resource under devops:infrastructure-as-code:kubernetes 2023-06-09 20:59:40 +01:00
roadmap bot
dcb4e06fea chore: add resource under cyber-security:security-skills-and-knowledge:blue-team-read-team-purple-team 2023-06-09 01:53:31 +01:00
roadmap bot
62eb6a4a01 chore: add resource under postgresql-dba:introduction:what-are-relational-databases 2023-06-09 01:53:04 +01:00
roadmap bot
f643f3bd9a chore: add resource under kubernetes:running-applications:deployments 2023-06-09 01:52:10 +01:00
roadmap bot
972370e0e6 chore: add resource under angular:typescript-basics:type-guard 2023-06-09 01:52:01 +01:00
roadmap bot
a6feb72339 chore: add resource under cyber-security:basic-it-skills:connection-types:nfc 2023-06-09 01:51:47 +01:00
roadmap bot
c751706631 chore: add resource under cpp:functions:lambda 2023-06-09 01:51:32 +01:00
roadmap bot
8900324234 chore: add resource under frontend:css:responsive-design-and-media-queries 2023-06-09 01:51:04 +01:00
roadmap bot
f1b880d898 chore: add resource under java:java-advanced-topics:memory-management 2023-06-09 01:50:50 +01:00
roadmap bot
9a285d7470 chore: add resource under cpp:setting-up:code-editors 2023-06-09 01:50:36 +01:00
roadmap bot
15259560e0 chore: add resource under javascript:javascript-control-flow:exception-handling 2023-06-09 01:50:19 +01:00
roadmap bot
d8afa166aa chore: add resource under python:python-basics:variables-and-datatypes 2023-06-08 14:34:57 +01:00
roadmap bot
d39791257e chore: add resource under cpp:introduction:what-is-cpp 2023-06-07 14:48:42 +01:00
Kamran Ahmed
06b7005782 chore: add resource under cyber-security:security-skills-and-knowledge:attack-types:phishing-vishing-whaling-smishing 2023-06-07 11:24:23 +01:00
Kamran Ahmed
bc6c933440 chore: add resource under cyber-security:security-skills-and-knowledge:cryptography 2023-06-07 11:24:05 +01:00
Kamran Ahmed
b965a89db3 chore: add resource under java:java-advanced-topics:garbage-collection 2023-06-07 11:23:32 +01:00
Kamran Ahmed
9b82e327e2 chore: add resource under backend:learn-a-language:java 2023-06-07 11:23:01 +01:00
Kamran Ahmed
5808125d92 chore: add resource under computer-science:pick-a-language:c-plus-plus 2023-06-07 11:22:38 +01:00
Kamran Ahmed
f49fe258aa chore: add resource under cyber-security:basic-it-skills:connection-types:nfc 2023-06-07 11:22:05 +01:00
Kamran Ahmed
08df9e8c33 chore: add resource under cyber-security:extras:certifications:beginner-certifications:comptia-aplus 2023-06-07 11:21:46 +01:00
Kamran Ahmed
56e388edd8 chore: add resource under backend:apis:authentication:openid 2023-06-07 11:21:08 +01:00
Kamran Ahmed
ded75c7af1 chore: add resource under golang:go-basics:structs 2023-06-07 11:20:44 +01:00
Kamran Ahmed
557c426078 Update apollo workshop image 2023-06-07 11:19:42 +01:00
Kamran Ahmed
d61a83a0a3 chore: add resource under flutter:design-principles:solid-principles 2023-06-06 14:19:46 +01:00
Kamran Ahmed
7500c6c1cb chore: add resource under backend:internet:what-is-http 2023-06-06 14:19:16 +01:00
Kamran Ahmed
b51076dd0a chore: add resource under cpp:introduction 2023-06-06 14:18:56 +01:00
Kamran Ahmed
8010bfc832 Add kodecloud link 2023-06-06 14:17:21 +01:00
Kamran Ahmed
0f80f26d17 Update link-groups 2023-06-06 11:02:08 +01:00
thesmallrock
40d25c43f4 Fixing "new and delete operators" titles. (#3994) 2023-06-06 09:32:02 +01:00
Kamran Ahmed
686a7382ab chore: add resource under cyber-security:basic-it-skills:basics-of-computer-networking 2023-06-06 09:11:42 +01:00
Kamran Ahmed
88401bd7b1 chore: add resource under mongodb:datatypes:date 2023-06-06 09:11:12 +01:00
Kamran Ahmed
1d97467c05 chore: add resource under software-design-architecture:architectural-styles 2023-06-06 09:10:43 +01:00
Kamran Ahmed
2388fa148b Update apollo workshop 2023-06-05 23:40:10 +01:00
Kamran Ahmed
d574fccbc8 Add apollo asset 2023-06-05 23:21:04 +01:00
Kamran Ahmed
89cc55a1eb chore: add resource under flutter:state-management:change-notifier 2023-06-05 21:18:29 +01:00
Kamran Ahmed
8c75354235 chore: add resource under flutter:state-management:value-notifier 2023-06-05 21:18:22 +01:00
Kamran Ahmed
9eb9dc8cd8 chore: add resource under nodejs:nodejs-command-line-apps:taking-input 2023-06-05 21:18:07 +01:00
Kamran Ahmed
afa28bddd3 chore: add resource under python:python-advanced-topics:lambdas 2023-06-05 21:17:32 +01:00
Kamran Ahmed
5cf0e76765 chore: add resource under react:components:props-vs-state 2023-06-05 21:16:59 +01:00
Kamran Ahmed
16b3f8ff49 chore: add resource under system-design:application-layer:microservices 2023-06-05 21:16:12 +01:00
Kamran Ahmed
d2055e0f6d chore: add resource under react:components:conditional-rendering 2023-06-05 21:15:43 +01:00
Kamran Ahmed
4010157baf chore: add resource under ux-design:human-decision-making:frameworks:bj-frogg-behavior-model 2023-06-05 21:15:08 +01:00
Kamran Ahmed
75c7e83264 chore: add resource under backend:os-general-knowledge:terminal-usage 2023-06-05 21:14:28 +01:00
Kamran Ahmed
8ca22e0dcc chore: add resource under python:python-testing:pytest 2023-06-05 21:13:27 +01:00
Kamran Ahmed
2b8d1f470c chore: add resource under backend:version-control-systems:git 2023-06-05 21:13:15 +01:00
Kamran Ahmed
c4d9651e95 chore: add resource under react:components 2023-06-05 21:12:13 +01:00
Kamran Ahmed
813c0ebd93 chore: add resource under backend:relational-databases:mysql 2023-06-05 21:11:38 +01:00
Kamran Ahmed
e376942c8d chore: add resource under devops:infrastructure-as-code:gitops:argo-cd 2023-06-05 21:02:21 +01:00
Kamran Ahmed
6d91c11856 chore: add resource link to ux-design >> human-decision-making:frameworks:stephen-wendell-create-action-funnel 2023-06-05 21:00:49 +01:00
Kamran Ahmed
1d47b1fb7b chore: add resource link to cpp >> introduction:what-is-cpp 2023-06-05 20:47:54 +01:00
Kamran Ahmed
54a9e586bf chore: add resource link to frontend >> progressive-web-apps:lighthouse 2023-06-05 20:46:58 +01:00
Kamran Ahmed
b58c2a1356 Fix roadmap json 2023-06-05 20:38:54 +01:00
Kamran Ahmed
dec5e58063 Refactor roadmap and best practice rendering engine 2023-06-05 19:55:58 +01:00
Kamran Ahmed
b0a4130229 Update code review pyramid 2023-06-04 23:00:35 +01:00
Kamran Ahmed
a06e992b8a Update reference link for code review pyramid 2023-06-03 21:31:37 +01:00
Kamran Ahmed
6e1072bea9 Add code review pyramid 2023-06-03 21:17:55 +01:00
Kamran Ahmed
1f9eb18bfb Add update file URL in the topic file 2023-06-02 22:45:37 +01:00
Kamran Ahmed
603bd2b107 Update contribution copy 2023-06-02 21:34:30 +01:00
Kamran Ahmed
0163d9e4f9 Update copy on contribution 2023-06-02 21:33:30 +01:00
Kamran Ahmed
910579f463 Update isNew badges 2023-06-02 21:31:27 +01:00
Kamran Ahmed
d6a28a312a Add contribution functionality 2023-06-02 21:23:26 +01:00
Kamran Ahmed
267a4a7be5 Update cpp roadmap dates 2023-06-01 17:01:39 +01:00
Kamran Ahmed
59111a1a90 Add link to C++ roadmap 2023-06-01 03:59:22 +01:00
Kamran Ahmed
9f5d1aef74 Add content to C++ roadmap 2023-06-01 03:42:42 +01:00
Kamran Ahmed
36eed57ec2 Add content to C++ roadmap 2023-06-01 03:33:27 +01:00
Kamran Ahmed
cc054bb24b Add content to C++ roadmap 2023-06-01 03:18:40 +01:00
Kamran Ahmed
056256015d Add C++ roadmap 2023-06-01 02:55:26 +01:00
Arik Chakma
dd5f3795ec fix: login link (#3985) 2023-05-31 10:00:19 +01:00
Kamran Ahmed
8c29d43bef fix: page loading message does not persist 2023-05-30 19:48:40 +01:00
Kamran Ahmed
aa32258aa1 Refactor page progress implementation 2023-05-30 18:52:41 +01:00
Kamran Ahmed
d2394aca77 Downgrade nanostores 2023-05-30 18:40:58 +01:00
Kamran Ahmed
6804535fe4 chore: update dependencies 2023-05-30 18:27:08 +01:00
github-actions[bot]
3852e7d96f chore: update dependencies to latest (#3973)
Co-authored-by: kamranahmedse <kamranahmedse@users.noreply.github.com>
2023-05-30 17:41:57 +01:00
Kamran Ahmed
eb852caee8 Update link to improve guide 2023-05-30 14:50:37 +01:00
유성현
1414693e33 fix minor typos (#3974)
* 📝 fix : typos

* Update 101-anti-corruption-layer.md

---------

Co-authored-by: Arik Chakma <arikchangma@gmail.com>
2023-05-30 14:32:15 +01:00
Kamran Ahmed
fbdb7e77c3 Fix: active sidebar missing border 2023-05-27 03:04:35 +01:00
Kamran Ahmed
c72658938f Add icons in the mobile sidebar menu 2023-05-26 17:31:10 +01:00
Kamran Ahmed
718c582a8c Update account sidebar 2023-05-26 17:11:59 +01:00
Kamran Ahmed
12f385dffd Show the recently updated item on top 2023-05-26 15:38:04 +01:00
Kamran Ahmed
35f500d218 Show most recently tracked items on top 2023-05-26 03:43:50 +01:00
Kamran Ahmed
44949709d1 Add activity page 2023-05-26 03:16:25 +01:00
Kamran Ahmed
476557db80 Add activity dashboard 2023-05-25 16:37:33 +01:00
Kamran Ahmed
f7625a8250 Add basic UI for activity dashboard 2023-05-24 19:25:35 +01:00
Kamran Ahmed
c06c236da5 Refactor account pages 2023-05-24 15:18:29 +01:00
Kamran Ahmed
24c262282e External redirect tracking from roadmap.sh 2023-05-22 19:59:38 +01:00
Kamran Ahmed
876330522d Add devops by nana link 2023-05-22 19:59:38 +01:00
Sean Kelly
f1c771e95c Fix typo in content (#3959) 2023-05-22 18:08:55 +01:00
Kamran Ahmed
d3668b25e9 Add kbd around cmd+k 2023-05-22 11:06:26 +01:00
Kamran Ahmed
b0493c370c Add prompt engineering roadmap 2023-05-21 13:00:45 +01:00
Arik Chakma
e67caa0ffe chore: firefox input outline (#3951) 2023-05-21 12:56:34 +01:00
Arik Chakma
82a44ddfef fix: user gets logged out on browser quit (#3947) 2023-05-21 12:55:02 +01:00
Arik Chakma
205fe6cc23 fix: firefox bug (#3948) 2023-05-21 12:27:38 +01:00
Kamran Ahmed
591cac8bfa Add content for reliability 2023-05-21 03:39:19 +01:00
Kamran Ahmed
42debdeab0 Add content for real world under prompting techniques 2023-05-21 03:22:20 +01:00
Kamran Ahmed
0555452bf2 Load pages on render 2023-05-21 02:17:31 +01:00
Kamran Ahmed
cc7f9d94bb Clear text on command menu close 2023-05-20 23:47:54 +01:00
Kamran Ahmed
51d986b86f Add support for CMD + K search (#3944)
* Add command k input

* On Enter open the page

* chore: backend fix

* Refactor pages and add retrieval

* Group separation, no result handling and filtering

* Fix responsiveness of command menu

* Activate on CMD+K and focus

* Add icons to menu

* Add page filtering

* Add search icon in navigation

---------

Co-authored-by: Arik Chakma <arikchangma@gmail.com>
2023-05-20 23:20:11 +01:00
Kamran Ahmed
83057d65cd Update content for prompt engineering 2023-05-20 12:15:37 +01:00
Kamran Ahmed
b886f20570 Add pdf for prompt engineering 2023-05-20 05:13:38 +01:00
Kamran Ahmed
dacd2d898b Add prompt enginering roadmap 2023-05-20 05:12:33 +01:00
Kamran Ahmed
a2490efa80 Add content dirs for prompt engineering 2023-05-20 02:37:57 +01:00
Kamran Ahmed
e087b79ade Add prompt engineering roadmap 2023-05-20 02:10:20 +01:00
Kamran Ahmed
10b1a8cb07 Add guide about resources for llms 2023-05-19 16:06:59 +01:00
Kamran Ahmed
f2c06462fa Add assets for ambassador and GraphQL 2023-05-19 01:05:36 +01:00
Kamran Ahmed
ad7ba44a2e Add pages JSON 2023-05-18 20:03:46 +01:00
Kamran Ahmed
7a72c96e79 Remove categroy field injection 2023-05-18 19:36:39 +01:00
Kamran Ahmed
d955044a3b Add category levels to pages 2023-05-18 18:03:08 +01:00
Kamran Ahmed
b86fafd538 Update roadmap note 2023-05-18 16:23:12 +01:00
Abilio Castro
c52a4e6638 Adding link to Spring Boot roadmap from Java roadmap (#3935)
* Adding link to Spring Boot roadmap from Java roadmap

* Adding link to Spring Boot roadmap from Java roadmap

---------

Co-authored-by: Abilio Silva <asilva@descartes.com>
2023-05-18 15:47:11 +01:00
Kamran Ahmed
9d66da6bf9 Add store link in footer 2023-05-18 12:57:20 +01:00
Kamran Ahmed
4b76d0b7aa Rearrange visual 2023-05-16 16:35:18 +01:00
Kamran Ahmed
626026eebc Add guide about LLMs 2023-05-16 16:35:18 +01:00
Kamran Ahmed
fdd12acb8e Add link to full stack roadmap 2023-05-15 19:51:14 +01:00
Kamran Ahmed
02015826ff Update related roadmaps 2023-05-15 14:51:45 +01:00
Kamran Ahmed
5d07ce32d8 Change color for skipped 2023-05-14 14:57:51 +01:00
Mohammad Ostadi
3967b16d25 Fix wrong backend and devops links (#3919) 2023-05-14 13:09:38 +01:00
Kamran Ahmed
f325183691 Add keydowns in updating progerss 2023-05-14 03:31:00 +01:00
Kamran Ahmed
a029850531 Change color of skipped 2023-05-14 03:12:28 +01:00
Kamran Ahmed
d3d2ae5889 Refactor update topic progress functionality 2023-05-14 03:05:54 +01:00
Kamran Ahmed
4a049b2a7a Skip colors 2023-05-14 02:53:07 +01:00
Kamran Ahmed
fd349f2da8 Allow skipping 2023-05-14 02:41:04 +01:00
Kamran Ahmed
f338bd5ecb Refactor progress button 2023-05-13 12:44:14 +01:00
Kamran Ahmed
a3470cd844 Fix flickering issue on the profile pages 2023-05-12 22:38:14 +01:00
Kamran Ahmed
f4635d794f Refactor buttons 2023-05-12 17:26:37 +01:00
Kamran Ahmed
426fe44dc8 Add content for full stack roadmap 2023-05-12 14:14:45 +01:00
Kamran Ahmed
4ed39cec1a Update monitoring 2023-05-12 13:07:46 +01:00
Kamran Ahmed
b1f0844546 Add github action sample 2023-05-12 12:57:35 +01:00
Kamran Ahmed
88aa7e4024 Add fullstack roadmap 2023-05-12 12:51:34 +01:00
Kamran Ahmed
471f6348f1 Add isNew flag to fullstack roadmap 2023-05-12 12:51:34 +01:00
Kamran Ahmed
9dfb70c941 Add fullstack roadmap 2023-05-12 12:51:34 +01:00
Zai Santillan
6fa7e0d1c0 Update twitter username (#3907) 2023-05-11 03:41:20 +01:00
Kamran Ahmed
5ccfa654ec Add support for custom labels in ga 2023-05-10 01:18:23 +01:00
Kamran Ahmed
1c67068eab Update twitter username 2023-05-09 15:39:50 +01:00
Kamran Ahmed
f5ff2a0823 Add contribution url to topic detail popup 2023-05-09 15:28:16 +01:00
Aman Tank
58503f67f3 Fix #3882, resolves #3874 (#3882)
* F[ixed] Link in Content Delivery Networks #3881

* [Fixed] Typo #3881

* Delete package-lock.json

---------

Co-authored-by: Aman Tank <132202130+amanntank@users.noreply.github.com>
2023-05-09 15:24:21 +01:00
Kamran Ahmed
5dd0479caf Add feature image 2023-05-09 11:47:07 +01:00
Kamran Ahmed
7441f1a203 Refactor avatar implementation 2023-05-09 03:36:29 +01:00
Arik Chakma
4d3ebb0ac6 chore: placeholder image 2023-05-09 03:36:29 +01:00
Arik Chakma
47d5716238 feat: upload profile picture 2023-05-09 03:36:29 +01:00
Kamran Ahmed
94d888a61e Add avatar url config 2023-05-09 03:35:45 +01:00
bany
ddd43a1514 Add missing file android.pdf (#3899) 2023-05-09 02:22:52 +01:00
Kamran Ahmed
2cf94f981b Resource progress functionality 2023-05-09 02:14:27 +01:00
Kamran Ahmed
f1973f63c2 Rename "Mark as Done" and "Mark as Pending" 2023-05-09 01:53:18 +01:00
Arik Chakma
dfb67e17d5 chore: in progress design 2023-05-09 06:21:39 +06:00
Arik Chakma
48239772f6 fix: removing classes 2023-05-09 06:04:47 +06:00
Arik Chakma
1cea9d0e13 chore: added pending state for topics 2023-05-09 06:02:41 +06:00
Kamran Ahmed
6591c36ef4 Add visit tracker to roadmap 2023-05-08 23:06:09 +01:00
Kamran Ahmed
41de9c47b0 Add partner images 2023-05-08 22:48:45 +01:00
Kamran Ahmed
0ba1a8a1d1 Rearrange scripts 2023-05-08 22:16:27 +01:00
Kamran Ahmed
6fcb153244 Fix invalid markdown language warnings 2023-05-08 21:12:34 +01:00
Kamran Ahmed
7a8d97b1cd Refactor analytics 2023-05-08 21:06:33 +01:00
Kamran Ahmed
9e37076d0d Add preconnect for ga and api 2023-05-08 20:59:57 +01:00
Kamran Ahmed
f8e5661353 Refactor perf issues 2023-05-08 20:54:56 +01:00
Kamran Ahmed
4d4cda6cac Fix accessibility issues 2023-05-08 20:37:26 +01:00
Arik Chakma
8b528f39f2 fix: broken link (#3897) 2023-05-08 16:58:35 +01:00
Kamran Ahmed
e1a04b4a20 Update username 2023-05-08 14:36:21 +01:00
Kamran Ahmed
f0e8ffe565 Fix spelling mistake 2023-05-06 16:42:12 +01:00
Kamran Ahmed
f9c1e64235 Add docker roadmap to readme 2023-05-06 01:44:25 +01:00
Kamran Ahmed
0174c9156b Fix formatting issue 2023-05-05 22:51:38 +01:00
Kamran Ahmed
2ee81e6ff3 Add docker roadmap 2023-05-05 22:49:57 +01:00
Kamran Ahmed
42ab5a3e9e Add docker roadmpa 2023-05-05 22:49:57 +01:00
Kamran Ahmed
e9fa663410 Notify icon 2023-05-05 12:16:07 +01:00
Kamran Ahmed
2d17a267be Refactor upcoming form 2023-05-04 18:18:44 +01:00
Arik Chakma
40371cdded fix: notify for upcoming page (#3887)
* chore: upcoming login

* fix: subscribed button
2023-05-04 18:09:32 +01:00
Arik Chakma
6bb315a2fc fix: featured items heading position (#3837) 2023-05-03 14:48:21 +01:00
Kamran Ahmed
fc2c9a1439 Remove sponsors and relevant codebase 2023-05-03 12:50:15 +01:00
Kamran Ahmed
b50935ecd6 Remove delay for sponsors 2023-05-03 04:09:09 +01:00
Kamran Ahmed
9b73d60c5d Add support for multiple ads 2023-05-03 03:14:04 +01:00
Kamran Ahmed
504ee8cf5e Add support for multiple ads 2023-05-02 20:48:01 +01:00
Kamran Ahmed
057bbddd9f Add support for multiple ads 2023-05-02 20:48:01 +01:00
Joshua
4063979c2a Fix typo (#3797) 2023-05-02 20:34:17 +01:00
Rita Bradley
da391fe9ed Fix typos (#3795)
* Fix typos

- Add 's' to reason
- Change "it's" to is
- Remove unnecessary hyphen

* Fix typos

- change 'remove' to 'removing'
- change comma to semicolon

* Fix typos

- change "don't" to "doesn't"
- add "is" before "relied upon"
2023-05-02 20:33:33 +01:00
Kamran Ahmed
953ca9257c Fix typo on homepage 2023-05-01 17:02:16 +01:00
Kamran Ahmed
396bedd319 Update sponsor banners 2023-05-01 16:50:59 +01:00
Edwin Manual
b6c8260faf fix: Correct syntax error in Promise initialization example by adding space 2023-04-29 07:27:34 +05:30
The New Stack
e05269f117 Add TypeScript installation guide (#3791)
* Added 1 TNS Article

* Update src/data/roadmaps/typescript/content/100-typescript/102-install-configure/index.md

---------

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2023-04-27 13:58:30 +01:00
Kamran Ahmed
77c7ca8835 Update badges 2023-04-27 12:41:08 +01:00
Kamran Ahmed
e877f5c610 Add code review best practices 2023-04-27 12:39:16 +01:00
Kamran Ahmed
42e1a79697 Update code review pdf 2023-04-26 21:12:09 +01:00
Kamran Ahmed
ce32cdc8a4 Update code review texts 2023-04-26 20:54:29 +01:00
Kamran Ahmed
e2a0bd23c0 Add best practice content 2023-04-26 17:44:02 +01:00
Kamran Ahmed
98f0ebde8b Add code-review best practices 2023-04-26 17:17:39 +01:00
Kamran Ahmed
bc018f8b39 Add code review best practices 2023-04-26 15:57:32 +01:00
Kamran Ahmed
03bd478aaa Add data aggregation command 2023-04-26 13:47:19 +01:00
Kamran Ahmed
67a8582c22 Fix overlapping login and videos 2023-04-24 18:07:51 +01:00
Kamran Ahmed
7533575df9 Update PgQ (#3856) 2023-04-24 15:29:21 +01:00
Kamran Ahmed
34fcd74d93 Update ad text 2023-04-21 20:27:52 +01:00
Kamran Ahmed
1558feb734 Update liblab link 2023-04-21 19:48:38 +01:00
Kamran Ahmed
bc4d9f9e2f Add postgresql dba pdf 2023-04-19 22:11:00 +01:00
Kamran Ahmed
4142c7b51e Compress postgresql json 2023-04-19 21:55:56 +01:00
Kamran Ahmed
e36a749223 Update postgresql roadmap 2023-04-19 21:55:22 +01:00
Kamran Ahmed
e69d9b4238 Add PEV2 2023-04-19 15:28:14 +01:00
Kamran Ahmed
3132a39816 Fix sponsor opener 2023-04-19 00:57:41 +01:00
Kamran Ahmed
03f9fa51ff Update roadmap node 2023-04-18 14:36:54 +01:00
Kamran Ahmed
e2062aefe9 Update postgresql roadmap 2023-04-18 14:24:58 +01:00
Kamran Ahmed
855ba7bbfb Add postgresql roadmap 2023-04-18 14:24:58 +01:00
Kamran Ahmed
ad71b6398d Fix styling issue 2023-04-18 14:24:57 +01:00
Kamran Ahmed
0ea0629104 Add postgresql-dba content 2023-04-18 14:24:57 +01:00
Kamran Ahmed
8b2f12fcdd Improve the content writing performance 2023-04-18 14:24:57 +01:00
Kamran Ahmed
e66bff74bf Add postgresql-dba content 2023-04-18 14:24:57 +01:00
github-actions[bot]
58ea34bb49 chore: update sponsors (#3821)
Co-authored-by: kamranahmedse <kamranahmedse@users.noreply.github.com>
2023-04-17 15:01:32 +01:00
Kamran Ahmed
275c2c3c88 Add noindex pages 2023-04-17 00:57:20 +01:00
Kamran Ahmed
f13c29adad Enable github auth 2023-04-14 21:17:49 +01:00
Kamran Ahmed
ec9f836a1f Fix check icon 2023-04-14 20:56:24 +01:00
Kamran Ahmed
589d157be5 Disable github login for now 2023-04-14 20:16:38 +01:00
Kamran Ahmed
a2719bc771 feat: user accounts functionality (#3813)
* feat: integrate astro

* chore: login popup design

* chore: data-popup changed

* refactor: github and google button

* chore: signup page

* chore: login popup design

* chore: signup page design

* chore: auth divider

* feat: integrate astro

* chore: login popup design

* chore: data-popup changed

* refactor: github and google button

* chore: signup page

* chore: login popup design

* chore: signup page design

* chore: auth divider

* chore: login feature

* chore: login error message

* chore: added name in token decode return

* chore: use auth hook

* chore: logout vs login

* chore: download button link

* chore: account dropdown

* fix: dropdown z index

* chore: profile page

* Add missing content for backend roadmap

* Remove unused styles

* Add login with google

* chore: google login implementation

* chore: profile guard clause

* fix: button size

* chore: preact to astro components

* chore: preact to astro comp

* chore: github astro component

* chore: google login error handling

* chore: github login error handling

* chore: change password page

* chore: rename profile to password

* fix: change password rename

* chore: update profile page

* chore: setting sidebar

* fix: setting dropdown design

* chore: required indicator

* chore: change password form

* chore: update profile form

* chore: mobile navigation

* fix: form data empty error

* chore: email login and signup components

* chore: forgot password page

* chore: reset password page

* chore: verify account page

* chore: resend verification email

* fix: types in spinner

* chore: forgot password functionality

* fix: class -> className

* chore: reset password page

* chore: reset password functionality

* chore: login page

* fix: spacing for login and signup page

* refactor: email login form

* chore: astro spinner

* chore: pre-fill user data

* chore: dummy placeholder

* chore: forgot password link add

* fix: replaced constants

* chore: forgot password link

* chore: change password for social provider

* chore: internal pages guard

* chore: internal paths

* refactor: change password errors

* refactor: update profile errors

* chore: mark as done overlay

* fix: uncontrolled to controlled form

* fix: de-structure error

* chore: error messages

* fix: 401 error code redirect to login page

* chore: loading spinner accessibilities

* fix: remove spinner

* chore: keep spinner after success to redirect

* chore: keep the spinner

* style: resend email underline

* chore: chevron down account

* chore: roadmap pdf link download

* chore: roadmap pdf link download

* chore: best practices buttons

* fix: verify account text

* fix: topic overlay hide

* chore: base verify design

* chore: email verify page

* fix: div tag missing

* Formatting

* Refactor top navigation

* Prettier

* Update dependencies

* Refactor top navigation

* Refactor login button

* Remove captcha and add google scripts

* Refactor email sign up form

* Resend verfication email functionality

* Refactor verification pending page

* Add verify account functionality

* Update signup text

* Add login page

* Add login button in top nav

* Email login form

* Handle authenticatoin

* Show hide auth elements change

* Add ease-in on the guest elements

* Refactor logic for download and subscribe popups

* Add forgot password

* Rename fetch lib

* Add authentication popup

* Refactor logic for mark done and pending

* Handle logout

* Add route protection

* Popup opener to close the overlay

* Remember page when logging in

* Add reset password page

* Change placement of constant

* Update profile page

* Add update password form

* Update password page

* Update profile page

* Update design

* chore: toggle mark resource done api

* chore: toggle topic done

* chore: get user resource progress api

* fix: best practice topic toggle

* chore: fetch progress

* fix: query selector for topics

* Keep track of the old page before social login

* Update public api url

* Add user progress tracking

* Update topic done functionality

* Add progress loader

* Add page wide spinner

* Add spinner on setting pages

* Add fingerprint to user requests

* Use http wrapper instead of fetch

* Update fingerprint

* Minor improvements

---------

Co-authored-by: Arik Chakma <arikchangma@gmail.com>
2023-04-14 19:22:52 +01:00
Umair Raza
c5645299aa Issues: Text not showing up properly #3796 (#3802) 2023-04-12 12:09:25 +01:00
Kamran Ahmed
6aac3f296c Remove youtube banner from top 2023-04-08 13:57:32 +01:00
Haseeb Ansari
137635f11a fix: wrong MAN explanation (#3771)
Co-authored-by: haseeb.ansari <haseeb.ansari@qordata.com>
2023-04-07 18:55:53 +01:00
Jens Rottiers
03f69c02c1 Fixed typo in the word tutorial 2023-04-06 10:08:45 +02:00
karthikeyantc
8487d2f443 Updated the Route Guard for Angular (#3731)
* Update 104-guards.md

Added the link for resolve route guard

* Update 103-router-events.md

Added the documentation for Router events.

---------

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2023-04-05 17:35:19 +01:00
github-actions[bot]
a7bee1fea7 chore: update dependencies to latest (#3744)
Co-authored-by: kamranahmedse <kamranahmedse@users.noreply.github.com>
2023-04-05 17:34:13 +01:00
CMarghin
43292de507 Fix typo, replace Interface with Inference (#3750) 2023-04-05 17:32:51 +01:00
Sanjay Singha
bee30defb5 Add content for FVM (#3759)
* Adding content for FVM

* Update src/data/roadmaps/flutter/content/101-setup-development-environment/102-fvm.md

---------

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2023-04-05 17:32:20 +01:00
Pedro Macedo
52649a2d3c Change react docs link (#3742) 2023-04-05 17:31:04 +01:00
Salah Eddine Mebkhouti
be47ac6573 Update invalid link (#3752)
Co-authored-by: AIpills <x9one@pop-os.localdomain>
2023-04-04 14:09:15 +01:00
Arik Chakma
24ce27090e Fix guide type (#3754) 2023-04-04 14:08:50 +01:00
Ehren Nwokocha
8dd0225720 Fix minor typo (#3756)
I replaced and with it in the Javascript versioning paragraph
2023-04-04 14:08:30 +01:00
1750 changed files with 376127 additions and 8471 deletions

2
.env.example Normal file
View File

@@ -0,0 +1,2 @@
PUBLIC_API_URL=http://api.roadmap.sh
PUBLIC_AVATAR_BASE_URL=https://dodrc8eu8m09s.cloudfront.net/avatars

View File

@@ -0,0 +1,25 @@
name: "✍️ Suggest Changes"
description: Help us improve the roadmaps by suggesting changes
labels: [suggestion]
assignees: []
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to help us improve the roadmaps with your suggestions.
- type: input
id: url
attributes:
label: Roadmap URL
description: Please provide the URL of the roadmap you are suggesting changes to.
placeholder: https://roadmap.sh
validations:
required: true
- type: textarea
id: roadmap-suggestions
attributes:
label: Suggestions
description: What changes would you like to suggest?
placeholder: Enter your suggestions here.
validations:
required: true

View File

@@ -0,0 +1,42 @@
name: "🐛 Bug Report"
description: Report an issue or possible bug
labels: [bug]
assignees: []
body:
- type: input
id: url
attributes:
label: What is the URL where the issue is happening
placeholder: https://roadmap.sh
validations:
required: true
- type: dropdown
id: browsers
attributes:
label: What browsers are you seeing the problem on?
multiple: true
options:
- Firefox
- Chrome
- Safari
- Microsoft Edge
- Other
- type: textarea
id: bug-description
attributes:
label: Describe the Bug
description: A clear and concise description of what the bug is.
validations:
required: true
- type: textarea
id: logs
attributes:
label: Output from browser console (if any)
description: Please copy and paste any relevant log output.
- type: checkboxes
id: will-pr
attributes:
label: Participation
options:
- label: I am willing to submit a pull request for this issue.
required: false

View File

@@ -0,0 +1,12 @@
name: "✨ Feature Suggestion"
description: Is there a feature you'd like to see on Roadmap.sh? Let us know!
labels: [feature request]
assignees: []
body:
- type: textarea
id: feature-description
attributes:
label: Feature Description
description: Please provide a detailed description of the feature you are suggesting and how it would help you/others.
validations:
required: true

View File

@@ -0,0 +1,37 @@
name: "🙏 Submit a Roadmap"
description: Help us launch a new roadmap with your expertise.
labels: [roadmap contribution]
assignees: []
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to submit a roadmap! Please fill out the information below and we'll get back to you as soon as we can.
- type: input
id: roadmap-title
attributes:
label: What is the title of the roadmap you are submitting?
placeholder: e.g. Roadmap to learn Data Science
validations:
required: true
- type: dropdown
id: browsers
attributes:
label: Is this roadmap prepared by you or someone else?
options:
- I prepared this roadmap
- I found this roadmap online (please provide a link below)
- type: textarea
id: roadmap-description
attributes:
label: Roadmap Items
description: Please submit a nested list of items which we can convert into the visual. Here is an [example of roadmap items list.](https://gist.github.com/kamranahmedse/98758d2c73799b3a6ce17385e4c548a5).
placeholder: |
- Item 1
- Subitem 1
- Subitem 2
- Item 2
- Subitem 1
- Subitem 2
validations:
required: true

View File

@@ -0,0 +1,12 @@
name: "🤷‍♂️ Something else"
description: If none of the above templates fit your needs, please use this template to submit your issue.
labels: []
assignees: []
body:
- type: textarea
id: issue-description
attributes:
label: Detailed Description
description: Please provide a detailed description of the issue.
validations:
required: true

14
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,14 @@
blank_issues_enabled: false
contact_links:
- name: Roadmap Request
url: https://discord.gg/cJpEt5Qbwa
about: Please do not open issues with roadmap requests, hop onto the discord server for that.
- name: 📝 Typo or Grammatical Mistake
url: https://github.com/kamranahmedse/developer-roadmap/tree/master/src/data
about: Please submit a pull request instead of reporting it as an issue.
- name: 💬 Chat on Discord
url: https://discord.gg/cJpEt5Qbwa
about: Join the community on our Discord server.
- name: 🤝 Guidance
url: https://discord.gg/cJpEt5Qbwa
about: Join the community in our Discord server.

View File

@@ -3,6 +3,8 @@ on:
push:
branches: [ master ]
env:
PUBLIC_API_URL: "https://api.roadmap.sh"
PUBLIC_AVATAR_BASE_URL: "https://dodrc8eu8m09s.cloudfront.net/avatars"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PAT: ${{ secrets.PAT }}
CI: true

View File

@@ -1,43 +0,0 @@
name: Update Sponsors
on:
workflow_dispatch: # allow manual run
schedule:
- cron: '0 0 * * *' # run daily at 00:00 UTC
env:
SPONSOR_SHEET_API_KEY: ${{ secrets.SPONSOR_SHEET_API_KEY }}
SPONSOR_SHEET_ID: ${{ secrets.SPONSOR_SHEET_ID }}
jobs:
update-sponsors:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v3
with:
node-version: 18
- uses: pnpm/action-setup@v2.2.2
with:
version: 7.13.4
- name: Install dependencies
run: |
pnpm install
- name: Update sponsors
run: |
node bin/update-sponsors.cjs
- name: Create PR
uses: peter-evans/create-pull-request@v4
with:
delete-branch: false
branch: 'update-sponsors'
base: 'master'
labels: |
sponsors
automated pr
reviewers: kamranahmedse
commit-message: 'chore: update sponsors'
title: 'Update Sponsor Banners'
body: |
Updates sponsor banners.
Please review the changes and merge if everything looks good.

7
.gitignore vendored
View File

@@ -1,3 +1,5 @@
.idea
# build output
dist/
.output/
@@ -5,7 +7,7 @@ dist/
# dependencies
node_modules/
bin/developer-roadmap
scripts/developer-roadmap
# logs
npm-debug.log*
@@ -23,4 +25,5 @@ pnpm-debug.log*
/test-results/
/playwright-report/
/playwright/.cache/
tests-examples
tests-examples
*.csv

1
.npmrc Normal file
View File

@@ -0,0 +1 @@
auto-install-peers=true

View File

@@ -4,8 +4,12 @@ import tailwind from '@astrojs/tailwind';
import compress from 'astro-compress';
import { defineConfig } from 'astro/config';
import rehypeExternalLinks from 'rehype-external-links';
import { fileURLToPath } from 'node:url';
import { serializeSitemap, shouldIndexPage } from './sitemap.mjs';
import react from '@astrojs/react';
// https://astro.build/config
export default defineConfig({
site: 'https://roadmap.sh/',
markdown: {
@@ -28,11 +32,9 @@ export default defineConfig({
'https://cs.fyi',
'https://roadmap.sh',
];
if (whiteListedStarts.some((start) => href.startsWith(start))) {
return [];
}
return 'noopener noreferrer nofollow';
},
},
@@ -53,8 +55,10 @@ export default defineConfig({
serialize: serializeSitemap,
}),
compress({
css: false,
js: false,
HTML: false,
CSS: false,
JavaScript: false,
}),
react(),
],
});

View File

@@ -1,19 +0,0 @@
const fs = require('node:fs');
const path = require('node:path');
const jsonsDir = path.join(process.cwd(), 'public/jsons');
const childJsonDirs = fs.readdirSync(jsonsDir);
childJsonDirs.forEach((childJsonDir) => {
const fullChildJsonDirPath = path.join(jsonsDir, childJsonDir);
const jsonFiles = fs.readdirSync(fullChildJsonDirPath);
jsonFiles.forEach((jsonFileName) => {
console.log(`Compressing ${jsonFileName}...`);
const jsonFilePath = path.join(fullChildJsonDirPath, jsonFileName);
const json = require(jsonFilePath);
fs.writeFileSync(jsonFilePath, JSON.stringify(json));
});
});

View File

@@ -16,7 +16,7 @@ For new roadmaps, submit a roadmap by providing [a textual roadmap similar to th
For the existing roadmaps, please follow the details listed for the nature of contribution:
- **Fixing Typos** — Make your changes in the [roadmap JSON file](https://github.com/kamranahmedse/developer-roadmap/tree/master/public/jsons)
- **Fixing Typos** — Make your changes in the [roadmap JSON file](https://github.com/kamranahmedse/developer-roadmap/tree/master/src/data/roadmaps)
- **Adding or Removing Nodes** — Please open an issue with your suggestion.
**Note:** Please note that our goal is not to have the biggest list of items. Our goal is to list items or skills most relevant today.
@@ -30,11 +30,12 @@ Find [the content directory inside the relevant roadmap](https://github.com/kamr
## Guidelines
- <p><strong>Adding everything available out there is not the goal!</strong><br />
- <p><strong>Adding everything available out there is not the goal!</strong><br />
The roadmaps represent the skillset most valuable today, i.e., if you were to enter any of the listed fields today, what would you learn?! There might be things that are of-course being used today but prioritize the things that are most in demand today, e.g., agreed that lots of people are using angular.js today but you wouldn't want to learn that instead of React, Angular, or Vue. Use your critical thinking to filter out non-essential stuff. Give honest arguments for why the resource should be included.</p>
- <p><strong>Do not add things you have not evaluated personally!</strong><br />
- <p><strong>Do not add things you have not evaluated personally!</strong><br />
Use your critical thinking to filter out non-essential stuff. Give honest arguments for why the resource should be included. Have you read this book? Can you give a short article?</p>
- <p><strong>Create a Single PR for Content Additions</strong></p>
If you are planning to contribute by adding content to the roadmaps, I recommend you to clone the repository, add content to the [content directory of the roadmap](./content/roadmaps/) and create a single PR to make it easier for me to review and merge the PR.
If you are planning to contribute by adding content to the roadmaps, I recommend you to clone the repository, add content to the [content directory of the roadmap](./src/data/roadmaps/) and create a single PR to make it easier for me to review and merge the PR.
- Write meaningful commit messages
- Look at the existing issues/pull requests before opening new ones

View File

@@ -4,41 +4,60 @@
"version": "0.0.1",
"private": true,
"scripts": {
"dev": "astro dev",
"dev": "astro dev --port 3000",
"start": "astro dev",
"build": "astro build",
"preview": "astro preview",
"format": "prettier --write .",
"astro": "astro",
"deploy": "NODE_DEBUG=gh-pages gh-pages -d dist -t",
"compress:jsons": "node bin/compress-jsons.cjs",
"compress:jsons": "node scripts/compress-jsons.cjs",
"upgrade": "ncu -u",
"roadmap-links": "node bin/roadmap-links.cjs",
"roadmap-dirs": "node bin/roadmap-dirs.cjs",
"roadmap-content": "node bin/roadmap-content.cjs",
"best-practice-dirs": "node bin/best-practice-dirs.cjs",
"roadmap-links": "node scripts/roadmap-links.cjs",
"roadmap-dirs": "node scripts/roadmap-dirs.cjs",
"roadmap-content": "node scripts/roadmap-content.cjs",
"best-practice-dirs": "node scripts/best-practice-dirs.cjs",
"best-practice-content": "node scripts/best-practice-content.cjs",
"test:e2e": "playwright test"
},
"dependencies": {
"@astrojs/sitemap": "^1.2.1",
"@astrojs/tailwind": "^3.1.1",
"astro": "^2.1.7",
"astro-compress": "^1.1.35",
"@astrojs/react": "^3.0.0",
"@astrojs/sitemap": "^1.3.3",
"@astrojs/tailwind": "^5.0.0",
"@fingerprintjs/fingerprintjs": "^3.4.1",
"@nanostores/react": "^0.7.1",
"@types/react": "^18.0.21",
"@types/react-dom": "^18.0.6",
"astro": "^3.0.5",
"astro-compress": "^2.0.8",
"dracula-prism": "^2.1.13",
"jose": "^4.14.4",
"js-cookie": "^3.0.5",
"lucide-react": "^0.274.0",
"nanostores": "^0.9.2",
"node-html-parser": "^6.1.5",
"npm-check-updates": "^16.8.0",
"rehype-external-links": "^2.0.1",
"roadmap-renderer": "^1.0.4",
"tailwindcss": "^3.2.7"
"npm-check-updates": "^16.10.12",
"prismjs": "^1.29.0",
"react": "^18.0.0",
"react-confetti": "^6.1.0",
"react-dom": "^18.0.0",
"rehype-external-links": "^2.1.0",
"roadmap-renderer": "^1.0.6",
"slugify": "^1.6.6",
"tailwindcss": "^3.3.3"
},
"devDependencies": {
"@playwright/test": "^1.32.1",
"@playwright/test": "^1.35.1",
"@tailwindcss/typography": "^0.5.9",
"@types/js-cookie": "^3.0.3",
"@types/prismjs": "^1.26.0",
"csv-parser": "^3.0.0",
"gh-pages": "^5.0.0",
"js-yaml": "^4.1.0",
"markdown-it": "^13.0.1",
"openai": "^3.2.1",
"prettier": "^2.8.7",
"prettier-plugin-astro": "^0.8.0",
"prettier-plugin-tailwindcss": "^0.2.6"
"openai": "^3.3.0",
"prettier": "^2.8.8",
"prettier-plugin-astro": "^0.10.0",
"prettier-plugin-tailwindcss": "^0.3.0"
}
}

8636
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -1,13 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 36 36">
<path fill="#000" d="M22.25 4h-8.5a1 1 0 0 0-.96.73l-5.54 19.4a.5.5 0 0 0 .62.62l5.05-1.44a2 2 0 0 0 1.38-1.4l3.22-11.66a.5.5 0 0 1 .96 0l3.22 11.67a2 2 0 0 0 1.38 1.39l5.05 1.44a.5.5 0 0 0 .62-.62l-5.54-19.4a1 1 0 0 0-.96-.73Z"/>
<path fill="url(#gradient)" d="M18 28a7.63 7.63 0 0 1-5-2c-1.4 2.1-.35 4.35.6 5.55.14.17.41.07.47-.15.44-1.8 2.93-1.22 2.93.6 0 2.28.87 3.4 1.72 3.81.34.16.59-.2.49-.56-.31-1.05-.29-2.46 1.29-3.25 3-1.5 3.17-4.83 2.5-6-.67.67-2.6 2-5 2Z"/>
<defs>
<linearGradient id="gradient" x1="16" x2="16" y1="32" y2="24" gradientUnits="userSpaceOnUse">
<stop stop-color="#000"/>
<stop offset="1" stop-color="#000" stop-opacity="0"/>
</linearGradient>
</defs>
<style>
@media (prefers-color-scheme:dark){:root{filter:invert(100%)}}
</style>
</svg>

Before

Width:  |  Height:  |  Size: 873 B

BIN
public/guides/llms.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 691 KiB

View File

@@ -0,0 +1,8 @@
<svg width="63" height="24" viewBox="0 0 63 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="63" height="24" rx="7" fill="#563AFF"/>
<path d="M27.2629 16.7273H25.2856L28.2984 8H30.6763L33.6848 16.7273H31.7075L29.5214 9.99432H29.4533L27.2629 16.7273ZM27.1393 13.2969H31.8098V14.7372H27.1393V13.2969Z" fill="white"/>
<path d="M37.829 16.7273H34.7352V8H37.8545C38.7324 8 39.4881 8.17472 40.1216 8.52415C40.7551 8.87074 41.2423 9.36932 41.5832 10.0199C41.927 10.6705 42.0989 11.4489 42.0989 12.3551C42.0989 13.2642 41.927 14.0455 41.5832 14.6989C41.2423 15.3523 40.7523 15.8537 40.1131 16.2031C39.4767 16.5526 38.7153 16.7273 37.829 16.7273ZM36.5804 15.1463H37.7523C38.2977 15.1463 38.7565 15.0497 39.1287 14.8565C39.5037 14.6605 39.7849 14.358 39.9724 13.9489C40.1628 13.5369 40.2579 13.0057 40.2579 12.3551C40.2579 11.7102 40.1628 11.1832 39.9724 10.7741C39.7849 10.3651 39.5051 10.0639 39.1329 9.87074C38.7608 9.67756 38.302 9.58097 37.7565 9.58097H36.5804V15.1463Z" fill="white"/>
<path d="M46.5594 16.7273H43.4657V8H46.585C47.4628 8 48.2185 8.17472 48.8521 8.52415C49.4856 8.87074 49.9728 9.36932 50.3137 10.0199C50.6574 10.6705 50.8293 11.4489 50.8293 12.3551C50.8293 13.2642 50.6574 14.0455 50.3137 14.6989C49.9728 15.3523 49.4827 15.8537 48.8435 16.2031C48.2072 16.5526 47.4458 16.7273 46.5594 16.7273ZM45.3109 15.1463H46.4827C47.0282 15.1463 47.487 15.0497 47.8592 14.8565C48.2342 14.6605 48.5154 14.358 48.7029 13.9489C48.8932 13.5369 48.9884 13.0057 48.9884 12.3551C48.9884 11.7102 48.8932 11.1832 48.7029 10.7741C48.5154 10.3651 48.2356 10.0639 47.8634 9.87074C47.4913 9.67756 47.0324 9.58097 46.487 9.58097H45.3109V15.1463Z" fill="white"/>
<path d="M10 12H18" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M14 8V16" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,5 @@
<svg width="89" height="24" viewBox="0 0 89 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="89" height="24" rx="7" fill="black"/>
<path d="M23.8217 17V7.54545H27.5518C28.2659 7.54545 28.8752 7.67318 29.38 7.92862C29.8878 8.18099 30.274 8.53954 30.5387 9.00426C30.8065 9.46591 30.9403 10.0091 30.9403 10.6339C30.9403 11.2617 30.8049 11.8018 30.5341 12.2543C30.2633 12.7036 29.8709 13.0483 29.3569 13.2884C28.846 13.5284 28.2274 13.6484 27.5011 13.6484H25.0036V12.0419H27.1779C27.5595 12.0419 27.8765 11.9896 28.1289 11.8849C28.3813 11.7803 28.569 11.6233 28.6921 11.4141C28.8183 11.2048 28.8814 10.9447 28.8814 10.6339C28.8814 10.32 28.8183 10.0553 28.6921 9.83984C28.569 9.62441 28.3797 9.46129 28.1243 9.3505C27.8719 9.23662 27.5534 9.17969 27.1687 9.17969H25.8207V17H23.8217ZM28.9276 12.6974L31.2773 17H29.0707L26.7717 12.6974H28.9276ZM32.353 17V7.54545H38.7237V9.19354H34.3519V11.4464H38.396V13.0945H34.3519V15.3519H38.7422V17H32.353ZM40.3129 7.54545H42.7781L45.3818 13.8977H45.4926L48.0963 7.54545H50.5615V17H48.6226V10.8462H48.5441L46.0974 16.9538H44.7771L42.3303 10.8232H42.2519V17H40.3129V7.54545ZM60.8967 12.2727C60.8967 13.3037 60.7012 14.1809 60.3104 14.9041C59.9226 15.6274 59.3932 16.1798 58.7223 16.5614C58.0545 16.94 57.3035 17.1293 56.4695 17.1293C55.6293 17.1293 54.8752 16.9384 54.2074 16.5568C53.5395 16.1752 53.0117 15.6228 52.6239 14.8995C52.2362 14.1763 52.0423 13.3007 52.0423 12.2727C52.0423 11.2417 52.2362 10.3646 52.6239 9.64134C53.0117 8.91809 53.5395 8.36719 54.2074 7.98864C54.8752 7.60701 55.6293 7.41619 56.4695 7.41619C57.3035 7.41619 58.0545 7.60701 58.7223 7.98864C59.3932 8.36719 59.9226 8.91809 60.3104 9.64134C60.7012 10.3646 60.8967 11.2417 60.8967 12.2727ZM58.87 12.2727C58.87 11.6049 58.77 11.0417 58.57 10.5831C58.373 10.1245 58.0945 9.77675 57.7344 9.53977C57.3743 9.30279 56.9527 9.1843 56.4695 9.1843C55.9863 9.1843 55.5646 9.30279 55.2045 9.53977C54.8445 9.77675 54.5644 10.1245 54.3643 10.5831C54.1674 11.0417 54.0689 11.6049 54.0689 12.2727C54.0689 12.9406 54.1674 13.5038 54.3643 13.9624C54.5644 14.4209 54.8445 14.7687 55.2045 15.0057C55.5646 15.2427 55.9863 15.3612 56.4695 15.3612C56.9527 15.3612 57.3743 15.2427 57.7344 15.0057C58.0945 14.7687 58.373 14.4209 58.57 13.9624C58.77 13.5038 58.87 12.9406 58.87 12.2727ZM63.5523 7.54545L65.8374 14.7287H65.9252L68.2149 7.54545H70.4308L67.1716 17H64.5956L61.3318 7.54545H63.5523ZM71.5688 17V7.54545H77.9395V9.19354H73.5677V11.4464H77.6118V13.0945H73.5677V15.3519H77.958V17H71.5688Z" fill="white"/>
<path d="M8 12L17 12" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
public/roadmaps/cpp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 773 KiB

BIN
public/roadmaps/docker.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

BIN
public/roadmaps/sql.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 KiB

View File

@@ -4,16 +4,16 @@
<p align="center">Community driven roadmaps, articles and resources for developers<p>
<p align="center">
<a href="https://roadmap.sh/roadmaps">
<img src="https://img.shields.io/badge/-Roadmaps%20-0a0a0a.svg?style=flat&colorA=0a0a0a" alt="roadmaps" />
<img src="https://img.shields.io/badge/%E2%9C%A8-Roadmaps%20-0a0a0a.svg?style=flat&colorA=0a0a0a" alt="roadmaps" />
</a>
<a href="https://roadmap.sh/best-practices">
<img src="https://img.shields.io/badge/%E2%9C%A8-Best%20Practices-0a0a0a.svg?style=flat&colorA=0a0a0a" alt="best practices" />
</a>
<a href="https://youtube.com/theroadmap?sub_confirmation=1">
<img src="https://img.shields.io/badge/-Videos-0a0a0a.svg?style=flat&colorA=0a0a0a" alt="videos" />
</a>
<a href="https://github.com/kamranahmedse/developer-roadmap/tree/0471d44c8fae58b6a36a7c57bba12253916d0249/translations">
<img src="https://img.shields.io/badge/-Translations-0a0a0a.svg?style=flat&colorA=0a0a0a" alt="videos" />
<img src="https://img.shields.io/badge/%E2%9C%A8-Videos-0a0a0a.svg?style=flat&colorA=0a0a0a" alt="videos" />
</a>
<a href="https://www.youtube.com/channel/UCA0H2KIWgWTwpTFjSxp0now?sub_confirmation=1">
<img src="https://img.shields.io/badge/%E2%9D%A4-YouTube%20Channel-0a0a0a.svg?style=flat&colorA=0a0a0a" alt="roadmaps" />
<img src="https://img.shields.io/badge/%E2%9C%A8-YouTube%20Channel-0a0a0a.svg?style=flat&colorA=0a0a0a" alt="roadmaps" />
</a>
</p>
</p>
@@ -30,28 +30,33 @@ Roadmaps are now interactive, you can click the nodes to read more about the top
Here is the list of available roadmaps with more being actively worked upon.
- [Frontend Roadmap](https://roadmap.sh/frontend)
- [Frontend Roadmap](https://roadmap.sh/frontend) / [Frontend Beginner Roadmap](https://roadmap.sh/frontend?r=frontend-beginner)
- [Backend Roadmap](https://roadmap.sh/backend)
- [DevOps Roadmap](https://roadmap.sh/devops)
- [DevOps Roadmap](https://roadmap.sh/devops) / [DevOps Beginner Roadmap](https://roadmap.sh/devops?r=devops-beginner)
- [Full Stack Roadmap](https://roadmap.sh/full-stack)
- [Computer Science Roadmap](https://roadmap.sh/computer-science)
- [AI and Data Scientist Roadmap](https://roadmap.sh/ai-data-scientist)
- [QA Roadmap](https://roadmap.sh/qa)
- [Python Roadmap](https://roadmap.sh/python)
- [Software Architect Roadmap](https://roadmap.sh/software-architect)
- [Software Design and Architecture Roadmap](https://roadmap.sh/software-design-architecture)
- [JavaScript Roadmap](https://roadmap.sh/javascript)
- [TypeScript Roadmap](https://roadmap.sh/typescript)
- [C++ Roadmap](https://roadmap.sh/cpp)
- [React Roadmap](https://roadmap.sh/react)
- [React Native Roadmap](https://roadmap.sh/react-native)
- [Vue Roadmap](https://roadmap.sh/vue)
- [Angular Roadmap](https://roadmap.sh/angular)
- [Node.js Roadmap](https://roadmap.sh/nodejs)
- [GraphQL Roadmap](https://roadmap.sh/graphql)
- [Android Roadmap](https://roadmap.sh/android)
- [Flutter Roadmap](https://roadmap.sh/flutter)
- [Python Roadmap](https://roadmap.sh/python)
- [Go Roadmap](https://roadmap.sh/golang)
- [Java Roadmap](https://roadmap.sh/java)
- [Spring Boot Roadmap](https://roadmap.sh/spring-boot)
- [Design System Roadmap](https://roadmap.sh/design-system)
- [DBA Roadmap](https://roadmap.sh/postgresql-dba)
- [PostgreSQL Roadmap](https://roadmap.sh/postgresql-dba)
- [SQL Roadmap](https://roadmap.sh/sql)
- [Blockchain Roadmap](https://roadmap.sh/blockchain)
- [ASP.NET Core Roadmap](https://roadmap.sh/aspnet-core)
- [System Design Roadmap](https://roadmap.sh/system-design)
@@ -59,9 +64,12 @@ Here is the list of available roadmaps with more being actively worked upon.
- [Cyber Security Roadmap](https://roadmap.sh/cyber-security)
- [MongoDB Roadmap](https://roadmap.sh/mongodb)
- [UX Design Roadmap](https://roadmap.sh/ux-design)
- [Docker Roadmap](https://roadmap.sh/docker)
- [Prompt Engineering Roadmap](https://roadmap.sh/prompt-engineering)
We have also added a new form of visual content covering best practices:
- [Code Review Best Practices](https://roadmap.sh/best-practices/code-review)
- [Frontend Performance Best Practices](https://roadmap.sh/best-practices/frontend-performance)
- [API Security Best Practices](https://roadmap.sh/best-practices/api-security)
- [AWS Best Practices](https://roadmap.sh/best-practices/aws)
@@ -88,6 +96,12 @@ npm install
npm run dev
```
Note: use the `depth` parameter to reduce the clone size and speed up the clone.
```sh
git clone --depth=1 https://github.com/kamranahmedse/developer-roadmap.git
```
## Contribution
> Have a look at [contribution docs](./contributing.md) for how to update any of the roadmaps

View File

@@ -0,0 +1,173 @@
const fs = require('fs');
const path = require('path');
const OPEN_AI_API_KEY = process.env.OPEN_AI_API_KEY;
const ALL_BEST_PRACTICES_DIR = path.join(
__dirname,
'../src/data/best-practices'
);
const BEST_PRACTICE_JSON_DIR = path.join(
__dirname,
'../public/jsons/best-practices'
);
const bestPracticeId = process.argv[2];
const bestPracticeTitle = bestPracticeId.replace(/-/g, ' ');
const allowedBestPracticeIds = fs.readdirSync(ALL_BEST_PRACTICES_DIR);
if (!bestPracticeId) {
console.error('bestPracticeId is required');
process.exit(1);
}
if (!allowedBestPracticeIds.includes(bestPracticeId)) {
console.error(`Invalid bestPractice key ${bestPracticeId}`);
console.error(`Allowed keys are ${allowedBestPracticeIds.join(', ')}`);
process.exit(1);
}
const BEST_PRACTICE_CONTENT_DIR = path.join(
ALL_BEST_PRACTICES_DIR,
bestPracticeId,
'content'
);
const { Configuration, OpenAIApi } = require('openai');
const configuration = new Configuration({
apiKey: OPEN_AI_API_KEY,
});
const openai = new OpenAIApi(configuration);
function getFilesInFolder(folderPath, fileList = {}) {
const files = fs.readdirSync(folderPath);
files.forEach((file) => {
const filePath = path.join(folderPath, file);
const stats = fs.statSync(filePath);
if (stats.isDirectory()) {
getFilesInFolder(filePath, fileList);
} else if (stats.isFile()) {
const fileUrl = filePath
.replace(BEST_PRACTICE_CONTENT_DIR, '') // Remove the content folder
.replace(/\/\d+-/g, '/') // Remove ordering info `/101-ecosystem`
.replace(/\/index\.md$/, '') // Make the `/index.md` to become the parent folder only
.replace(/\.md$/, ''); // Remove `.md` from the end of file
fileList[fileUrl] = filePath;
}
});
return fileList;
}
function writeTopicContent(topicTitle) {
let prompt = `I am reading a guide that has best practices about "${bestPracticeTitle}". I want to know more about "${topicTitle}". Write me a brief introductory paragraph about this and some tips on how I make sure of this? Behave as if you are the author of the guide.`;
console.log(`Generating '${topicTitle}'...`);
return new Promise((resolve, reject) => {
openai
.createChatCompletion({
model: 'gpt-4',
messages: [
{
role: 'user',
content: prompt,
},
],
})
.then((response) => {
const article = response.data.choices[0].message.content;
resolve(article);
})
.catch((err) => {
reject(err);
});
});
}
async function writeFileForGroup(group, topicUrlToPathMapping) {
const topicId = group?.properties?.controlName;
const topicTitle = group?.children?.controls?.control?.find(
(control) => control?.typeID === 'Label'
)?.properties?.text;
const currTopicUrl = `/${topicId}`;
if (currTopicUrl.startsWith('/check:')) {
return;
}
const contentFilePath = topicUrlToPathMapping[currTopicUrl];
if (!contentFilePath) {
console.log(`Missing file for: ${currTopicUrl}`);
process.exit(0);
return;
}
const currentFileContent = fs.readFileSync(contentFilePath, 'utf8');
const isFileEmpty = currentFileContent.replace(/^#.+/, ``).trim() === '';
if (!isFileEmpty) {
console.log(`Ignoring ${topicId}. Not empty.`);
return;
}
let newFileContent = `# ${topicTitle}`;
if (!OPEN_AI_API_KEY) {
console.log(`Writing ${topicId}..`);
fs.writeFileSync(contentFilePath, newFileContent, 'utf8');
return;
}
const topicContent = await writeTopicContent(topicTitle);
newFileContent += `\n\n${topicContent}`;
console.log(`Writing ${topicId}..`);
fs.writeFileSync(contentFilePath, newFileContent, 'utf8');
// console.log(currentFileContent);
// console.log(currTopicUrl);
// console.log(topicTitle);
// console.log(topicUrlToPathMapping[currTopicUrl]);
}
async function run() {
const topicUrlToPathMapping = getFilesInFolder(BEST_PRACTICE_CONTENT_DIR);
const bestPracticeJson = require(path.join(
BEST_PRACTICE_JSON_DIR,
`${bestPracticeId}.json`
));
const groups = bestPracticeJson?.mockup?.controls?.control?.filter(
(control) =>
control.typeID === '__group__' &&
!control.properties?.controlName?.startsWith('ext_link')
);
if (!OPEN_AI_API_KEY) {
console.log('----------------------------------------');
console.log('OPEN_AI_API_KEY not found. Skipping openai api calls...');
console.log('----------------------------------------');
}
const writePromises = [];
for (let group of groups) {
writePromises.push(writeFileForGroup(group, topicUrlToPathMapping));
}
console.log('Waiting for all files to be written...');
await Promise.all(writePromises);
}
run()
.then(() => {
console.log('Done');
})
.catch((err) => {
console.error(err);
process.exit(1);
});

129
scripts/page-data-agg.cjs Normal file
View File

@@ -0,0 +1,129 @@
const csv = require('csv-parser');
const fs = require('fs');
const path = require('path');
const csvFilePath = path.join(__dirname, '../data.csv');
const results = {};
const pageSummary = {};
fs.createReadStream(csvFilePath)
.pipe(
csv({
separator: ',',
mapHeaders: ({ header, index }) =>
header.toLowerCase().replace(/ /g, '_'),
mapValues: ({ header, index, value }) => {
if (header === 'page') {
return (
value
.replace(/"/g, '')
.replace(/'/g, '')
.replace(/`/g, '')
.replace(/\?r=/g, '#r#')
.replace(/\?.+?$/g, '')
.replace(/#r#/g, '?r=')
.replace(/\/$/g, '') || '/'
);
}
if (header !== 'month_of_year') {
return parseInt(value, 10);
}
return value;
},
})
)
.on('data', (data) => {
const { page, month_of_year, unique_pageviews, users } = data;
const pageData = results[page] || {};
const existingPageMonthData = pageData[month_of_year] || {};
const existingViews = existingPageMonthData.views || 0;
const existingUsers = existingPageMonthData.users || 0;
const newViews = existingViews + unique_pageviews;
const newUsers = existingUsers + users;
pageData[month_of_year] = {
views: newViews,
users: newUsers,
};
results[page] = pageData;
pageSummary[page] = pageSummary[page] || { views: 0, users: 0 };
pageSummary[page].views += unique_pageviews;
pageSummary[page].users += users;
})
.on('end', () => {
const csvHeader = [
'Page',
'Jan 2022',
'Feb 2022',
'Mar 2022',
'Apr 2022',
'May 2022',
'Jun 2022',
'Jul 2022',
'Aug 2022',
'Sep 2022',
'Oct 2022',
'Nov 2022',
'Dec 2022',
'Jan 2023',
'Feb 2023',
'Mar 2023',
'Apr 2023',
'May 2023',
'Jun 2023',
'Jul 2023',
'Aug 2023',
'Sep 2023',
'Oct 2023',
'Nov 2023',
'Dec 2023',
];
const csvRows = Object.keys(pageSummary)
.filter(pageUrl => pageSummary[pageUrl].views > 10)
.filter(pageUrl => !['/upcoming', '/pdfs', '/signup', '/login', '/@'].includes(pageUrl))
.sort((pageA, pageB) => {
const aViews = pageSummary[pageA].views;
const bViews = pageSummary[pageB].views;
return bViews - aViews;
})
.map((pageUrl) => {
const rawPageResult = results[pageUrl];
const pageResultCsvRow = [];
csvHeader.forEach((csvHeaderItem) => {
if (csvHeaderItem === 'Page') {
pageResultCsvRow.push(pageUrl);
return;
}
const csvHeaderItemAlt = csvHeaderItem
.replace(/ /g, '_')
.toLowerCase();
const result = rawPageResult[csvHeaderItem || csvHeaderItemAlt] || {};
const views = result.views || 0;
const users = result.users || 0;
pageResultCsvRow.push(users);
});
return pageResultCsvRow;
});
const finalCsvRows = [csvHeader, ...csvRows];
const csvRowStrings = finalCsvRows.map((row) => {
return row.join(',');
});
const csvString = csvRowStrings.join('\n');
fs.writeFileSync(path.join(__dirname, '../data-agg.csv'), csvString);
});

View File

@@ -3,7 +3,6 @@ const path = require('path');
const OPEN_AI_API_KEY = process.env.OPEN_AI_API_KEY;
const ALL_ROADMAPS_DIR = path.join(__dirname, '../src/data/roadmaps');
const ROADMAP_JSON_DIR = path.join(__dirname, '../public/jsons/roadmaps');
const roadmapId = process.argv[2];
@@ -61,12 +60,12 @@ function writeTopicContent(currTopicUrl) {
const roadmapTitle = roadmapId.replace(/-/g, ' ');
let prompt = `I am reading a guide about "${roadmapTitle}". I am on the topic "${parentTopic}". I want to know more about "${childTopic}". Write me a brief summary for that topic. Content should be in markdown. Behave as if you are the author of the guide.`;
let prompt = `I am reading a guide about "${roadmapTitle}". I am on the topic "${parentTopic}". I want to know more about "${childTopic}". Write me with a brief summary of that. Content should be in markdown. I already know the benefits of each so do not add benefits in the output. Also include the code examples if applicable to this topic.`;
if (!childTopic) {
prompt = `I am reading a guide about "${roadmapTitle}". I am on the topic "${parentTopic}". I want to know more about "${parentTopic}". Write me a brief summary for that topic. Content should be in markdown. Behave as if you are the author of the guide.`;
prompt = `I am reading a guide about "${roadmapTitle}". I am on the topic "${parentTopic}". I want to know more about "${parentTopic}". Write me with a brief summary of that. Content should be in markdown. I already know the benefits of each so do not add benefits in the output. Also include the code examples if applicable to this topic.`;
}
console.log(`Genearting '${childTopic || parentTopic}'...`);
console.log(`Generating '${childTopic || parentTopic}'...`);
return new Promise((resolve, reject) => {
openai
@@ -90,10 +89,60 @@ function writeTopicContent(currTopicUrl) {
});
}
async function writeFileForGroup(group, topicUrlToPathMapping) {
const topicId = group?.properties?.controlName;
const topicTitle = group?.children?.controls?.control?.find(
(control) => control?.typeID === 'Label'
)?.properties?.text;
const currTopicUrl = topicId?.replace(/^\d+-/g, '/')?.replace(/:/g, '/');
if (!currTopicUrl) {
return;
}
const contentFilePath = topicUrlToPathMapping[currTopicUrl];
if (!contentFilePath) {
console.log(`Missing file for: ${currTopicUrl}`);
return;
}
const currentFileContent = fs.readFileSync(contentFilePath, 'utf8');
const isFileEmpty = currentFileContent.replace(/^#.+/, ``).trim() === '';
if (!isFileEmpty) {
console.log(`Ignoring ${topicId}. Not empty.`);
return;
}
let newFileContent = `# ${topicTitle}`;
if (!OPEN_AI_API_KEY) {
console.log(`Writing ${topicId}..`);
fs.writeFileSync(contentFilePath, newFileContent, 'utf8');
return;
}
const topicContent = await writeTopicContent(currTopicUrl);
newFileContent += `\n\n${topicContent}`;
console.log(`Writing ${topicId}..`);
fs.writeFileSync(contentFilePath, newFileContent, 'utf8');
// console.log(currentFileContent);
// console.log(currTopicUrl);
// console.log(topicTitle);
// console.log(topicUrlToPathMapping[currTopicUrl]);
}
async function run() {
const topicUrlToPathMapping = getFilesInFolder(ROADMAP_CONTENT_DIR);
const roadmapJson = require(path.join(ROADMAP_JSON_DIR, `${roadmapId}.json`));
const roadmapJson = require(path.join(
ALL_ROADMAPS_DIR,
`${roadmapId}/${roadmapId}`
));
const groups = roadmapJson?.mockup?.controls?.control?.filter(
(control) =>
control.typeID === '__group__' &&
@@ -106,50 +155,13 @@ async function run() {
console.log('----------------------------------------');
}
const writePromises = [];
for (let group of groups) {
const topicId = group?.properties?.controlName;
const topicTitle = group?.children?.controls?.control?.find(
(control) => control?.typeID === 'Label'
)?.properties?.text;
const currTopicUrl = topicId?.replace(/^\d+-/g, '/')?.replace(/:/g, '/');
if (!currTopicUrl) {
continue;
}
const contentFilePath = topicUrlToPathMapping[currTopicUrl];
if (!contentFilePath) {
console.log(`Missing file for: ${currTopicUrl}`);
return;
}
const currentFileContent = fs.readFileSync(contentFilePath, 'utf8');
const isFileEmpty = currentFileContent.replace(/^#.+/, ``).trim() === '';
if (!isFileEmpty) {
console.log(`Ignoring ${topicId}. Not empty.`);
continue;
}
let newFileContent = `# ${topicTitle}`;
if (!OPEN_AI_API_KEY) {
console.log(`Writing ${topicId}..`);
fs.writeFileSync(contentFilePath, newFileContent, 'utf8');
continue;
}
const topicContent = await writeTopicContent(currTopicUrl);
newFileContent += `\n\n${topicContent}`;
console.log(`Writing ${topicId}..`);
fs.writeFileSync(contentFilePath, newFileContent, 'utf8');
// console.log(currentFileContent);
// console.log(currTopicUrl);
// console.log(topicTitle);
// console.log(topicUrlToPathMapping[currTopicUrl]);
writePromises.push(writeFileForGroup(group, topicUrlToPathMapping));
}
console.log('Waiting for all files to be written...');
await Promise.all(writePromises);
}
run()

View File

@@ -53,12 +53,12 @@ function prepareDirTree(control, dirTree, dirSortOrders) {
const sortOrder = controlName.match(/^\d+/)?.[0];
// No directory for a group without control name
if (!controlName || !sortOrder) {
if (!controlName || (!sortOrder && !controlName.startsWith('check:'))) {
return;
}
// e.g. testing-your-apps:other-options
const controlNameWithoutSortOrder = controlName.replace(/^\d+-/, '');
const controlNameWithoutSortOrder = controlName.replace(/^\d+-/, '').replace(/^check:/, '');
// e.g. ['testing-your-apps', 'other-options']
const dirParts = controlNameWithoutSortOrder.split(':');
@@ -84,8 +84,9 @@ function prepareDirTree(control, dirTree, dirSortOrders) {
const roadmap = require(path.join(
__dirname,
`../public/jsons/roadmaps/${roadmapId}`
`../src/data/roadmaps/${roadmapId}/${roadmapId}`
));
const controls = roadmap.mockup.controls.control;
// Prepare the dir tree that we will be creating and also calculate the sort orders

View File

@@ -22,7 +22,7 @@ function removeAllSponsors(baseContentDir) {
const contentDir = fs.readdirSync(contentDirPath);
contentDir.forEach((content) => {
console.log('Removing sponsor from: ', content);
console.log('Removing sponsors from: ', content);
const pageFilePath = path.join(contentDirPath, content, `${content}.md`);
const pageFileContent = fs.readFileSync(pageFilePath, 'utf8');
@@ -35,7 +35,7 @@ function removeAllSponsors(baseContentDir) {
.trim();
let frontmatterObj = yaml.load(existingFrontmatter);
delete frontmatterObj.sponsor;
delete frontmatterObj.sponsors;
const newFrontmatter = yaml.dump(frontmatterObj, {
lineWidth: 10000,
@@ -87,27 +87,23 @@ function addPageSponsor({
.trim();
let frontmatterObj = yaml.load(existingFrontmatter);
delete frontmatterObj.sponsor;
const sponsors = frontmatterObj.sponsors || [];
const frontmatterValues = Object.entries(frontmatterObj);
const roadmapLabel = frontmatterObj.briefTitle;
sponsors.push({
url: redirectUrl,
title: adTitle,
imageUrl,
description: adDescription,
page: roadmapLabel,
company,
});
// Insert sponsor data at 10 index i.e. after
// roadmap dimensions in the frontmatter
frontmatterValues.splice(10, 0, [
'sponsor',
{
url: redirectUrl,
title: adTitle,
imageUrl,
description: adDescription,
event: {
category: 'SponsorClick',
action: `${company} Redirect`,
label: `${roadmapLabel} / ${company} Link`,
},
},
]);
frontmatterValues.splice(10, 0, ['sponsors', sponsors]);
frontmatterObj = Object.fromEntries(frontmatterValues);

View File

@@ -0,0 +1,192 @@
---
import AstroIcon from './AstroIcon.astro';
import { TeamDropdown } from './TeamDropdown/TeamDropdown';
import { SidebarFriendsCounter } from './Friends/SidebarFriendsCounter';
export interface Props {
activePageId: string;
activePageTitle: string;
hasDesktopSidebar?: boolean;
}
const { hasDesktopSidebar = true, activePageId, activePageTitle } = Astro.props;
const sidebarLinks = [
{
href: '/account',
title: 'Activity',
id: 'activity',
isNew: false,
icon: {
glyph: 'analytics',
classes: 'h-3 w-4',
},
},
{
href: '/account/friends',
title: 'Friends',
id: 'friends',
isNew: true,
icon: {
glyph: 'users',
classes: 'h-4 w-4',
},
},
{
href: '/account/road-card',
title: 'Card',
id: 'road-card',
isNew: false,
icon: {
glyph: 'badge',
classes: 'h-4 w-4',
},
},
{
href: '/account/update-profile',
title: 'Profile',
id: 'profile',
isNew: false,
icon: {
glyph: 'user',
classes: 'h-4 w-4',
},
},
{
href: '/account/settings',
title: 'Settings',
id: 'settings',
isNew: false,
icon: {
glyph: 'cog',
classes: 'h-4 w-4',
},
},
];
---
<div class='relative mb-5 block border-b p-4 shadow-inner md:hidden'>
<button
class='flex h-10 w-full items-center justify-between rounded-md border bg-white px-2 text-center text-sm font-medium text-gray-900'
id='settings-menu'
>
{activePageTitle}
<AstroIcon icon='dropdown' />
</button>
<ul
id='settings-menu-dropdown'
class='absolute left-0 right-0 z-10 mt-1 hidden space-y-1.5 bg-white p-2 shadow-lg'
>
<li>
<a
href='/team'
class={`flex w-full items-center rounded px-3 py-1.5 text-sm text-slate-900 hover:bg-slate-200 ${
activePageId === 'team' ? 'bg-slate-100' : ''
}`}
>
<AstroIcon icon={'users'} class={`h-4 w-4 mr-2`} />
Teams
</a>
</li>
{
sidebarLinks.map((sidebarLink) => {
const isActive = activePageId === sidebarLink.id;
return (
<li>
<a
href={sidebarLink.href}
class={`flex w-full items-center rounded px-3 py-1.5 text-sm text-slate-900 hover:bg-slate-200 ${
isActive ? 'bg-slate-100' : ''
}`}
>
<AstroIcon
icon={sidebarLink.icon.glyph}
class={`${sidebarLink.icon.classes} mr-2`}
/>
{sidebarLink.title}
</a>
</li>
);
})
}
</ul>
</div>
<div class='container flex min-h-screen items-stretch'>
<!-- Start Desktop Sidebar -->
{
hasDesktopSidebar && (
<aside class='hidden w-[195px] shrink-0 border-r border-slate-200 py-10 md:block'>
<TeamDropdown client:load />
<nav>
<ul class='space-y-1'>
{sidebarLinks.map((sidebarLink) => {
const isActive = activePageId === sidebarLink.id;
return (
<li>
<a
href={sidebarLink.href}
class={`font-regular flex w-full items-center border-r-2 px-2 py-1.5 text-sm ${
isActive
? 'border-r-black bg-gray-100 text-black'
: 'border-r-transparent text-gray-500 hover:border-r-gray-300'
}`}
>
<span class='flex flex-grow items-center'>
<AstroIcon
icon={sidebarLink.icon.glyph}
class={`${sidebarLink.icon.classes} mr-2`}
/>
{sidebarLink.title}
</span>
{sidebarLink.isNew &&
sidebarLink.id !== 'friends' &&
!isActive && (
<span class='relative mr-1 flex items-center'>
<span class='relative rounded-full bg-gray-200 p-1 text-xs' />
<span class='absolute bottom-0 left-0 right-0 top-0 animate-ping rounded-full bg-gray-400 p-1 text-xs' />
</span>
)}
{sidebarLink.id === 'friends' && (
<SidebarFriendsCounter client:load />
)}
</a>
</li>
);
})}
</ul>
</nav>
</aside>
)
}
<!-- /End Desktop Sidebar -->
<div
class:list={[
'grow px-0 py-0 md:py-10',
{ 'md:px-10': hasDesktopSidebar, 'md:px-5': !hasDesktopSidebar },
]}
>
<slot />
</div>
</div>
<script>
const menuButton = document.getElementById('settings-menu');
const menuDropdown = document.getElementById('settings-menu-dropdown');
menuButton?.addEventListener('click', () => {
menuDropdown?.classList.toggle('hidden');
});
document.addEventListener('click', (e) => {
if (!menuButton?.contains(e.target as Node)) {
menuDropdown?.classList.add('hidden');
}
});
</script>

View File

@@ -0,0 +1,56 @@
type ActivityCountersType = {
done: {
today: number;
total: number;
};
learning: {
today: number;
total: number;
};
streak: {
count: number;
};
};
type ActivityCounterType = {
text: string;
count: string;
};
function ActivityCounter(props: ActivityCounterType) {
const { text, count } = props;
return (
<div className="relative flex flex-1 flex-row-reverse sm:flex-col px-0 sm:px-4 py-2 sm:py-4 text-center sm:pt-10 items-center gap-2 sm:gap-0 justify-end">
<h2 className="text-base sm:text-5xl font-bold">
{count}
</h2>
<p className="mt-0 sm:mt-2 text-sm text-gray-400">{text}</p>
</div>
);
}
export function ActivityCounters(props: ActivityCountersType) {
const { done, learning, streak } = props;
return (
<div className="mx-0 -mt-5 sm:-mx-10 md:-mt-10">
<div className="flex flex-col sm:flex-row gap-0 sm:gap-2 divide-y sm:divide-y-0 divide-x-0 sm:divide-x border-b">
<ActivityCounter
text={'Topics Completed'}
count={`${done?.total || 0}`}
/>
<ActivityCounter
text={'Currently Learning'}
count={`${learning?.total || 0}`}
/>
<ActivityCounter
text={'Visit Streak'}
count={`${streak?.count || 0}d`}
/>
</div>
</div>
);
}

View File

@@ -0,0 +1,162 @@
import { useEffect, useState } from 'react';
import { httpGet } from '../../lib/http';
import { ActivityCounters } from './ActivityCounters';
import { ResourceProgress } from './ResourceProgress';
import { pageProgressMessage } from '../../stores/page';
import { EmptyActivity } from './EmptyActivity';
export type ActivityResponse = {
done: {
today: number;
total: number;
};
learning: {
today: number;
total: number;
roadmaps: {
title: string;
id: string;
learning: number;
done: number;
total: number;
skipped: number;
updatedAt: string;
}[];
bestPractices: {
title: string;
id: string;
learning: number;
done: number;
skipped: number;
total: number;
updatedAt: string;
}[];
};
streak: {
count: number;
firstVisitAt: Date | null;
lastVisitAt: Date | null;
};
activity: {
type: 'done' | 'learning' | 'pending' | 'skipped';
createdAt: Date;
metadata: {
resourceId?: string;
resourceType?: 'roadmap' | 'best-practice';
topicId?: string;
topicLabel?: string;
resourceTitle?: string;
};
}[];
};
export function ActivityPage() {
const [activity, setActivity] = useState<ActivityResponse>();
const [isLoading, setIsLoading] = useState(true);
async function loadActivity() {
const { error, response } = await httpGet<ActivityResponse>(
`${import.meta.env.PUBLIC_API_URL}/v1-get-user-stats`
);
if (!response || error) {
console.error('Error loading activity');
console.error(error);
return;
}
setActivity(response);
}
useEffect(() => {
loadActivity().finally(() => {
pageProgressMessage.set('');
setIsLoading(false);
});
}, []);
const learningRoadmaps = activity?.learning.roadmaps || [];
const learningBestPractices = activity?.learning.bestPractices || [];
if (isLoading) {
return null;
}
return (
<>
<ActivityCounters
done={activity?.done || { today: 0, total: 0 }}
learning={activity?.learning || { today: 0, total: 0 }}
streak={activity?.streak || { count: 0 }}
/>
<div className="mx-0 px-0 py-5 md:-mx-10 md:px-8 md:py-8">
{learningRoadmaps.length === 0 &&
learningBestPractices.length === 0 && <EmptyActivity />}
{(learningRoadmaps.length > 0 || learningBestPractices.length > 0) && (
<>
<h2 className="mb-3 text-xs uppercase text-gray-400">
Continue Following
</h2>
<div className="flex flex-col gap-3">
{learningRoadmaps
.sort((a, b) => {
const updatedAtA = new Date(a.updatedAt);
const updatedAtB = new Date(b.updatedAt);
return updatedAtB.getTime() - updatedAtA.getTime();
})
.map((roadmap) => (
<ResourceProgress
key={roadmap.id}
doneCount={roadmap.done || 0}
learningCount={roadmap.learning || 0}
totalCount={roadmap.total || 0}
skippedCount={roadmap.skipped || 0}
resourceId={roadmap.id}
resourceType={'roadmap'}
updatedAt={roadmap.updatedAt}
title={roadmap.title}
onCleared={() => {
pageProgressMessage.set('Updating activity');
loadActivity().finally(() => {
pageProgressMessage.set('');
});
}}
/>
))}
{learningBestPractices
.sort((a, b) => {
const updatedAtA = new Date(a.updatedAt);
const updatedAtB = new Date(b.updatedAt);
return updatedAtB.getTime() - updatedAtA.getTime();
})
.map((bestPractice) => (
<ResourceProgress
doneCount={bestPractice.done || 0}
totalCount={bestPractice.total || 0}
learningCount={bestPractice.learning || 0}
resourceId={bestPractice.id}
skippedCount={bestPractice.skipped || 0}
resourceType={'best-practice'}
title={bestPractice.title}
updatedAt={bestPractice.updatedAt}
onCleared={() => {
pageProgressMessage.set('Updating activity');
loadActivity().finally(() => {
pageProgressMessage.set('');
});
}}
/>
))}
</div>
</>
)}
</div>
</>
);
}

View File

@@ -0,0 +1,27 @@
import RoadmapIcon from '../../icons/roadmap.svg';
export function EmptyActivity() {
return (
<div className="rounded-md">
<div className="flex flex-col items-center p-7 text-center">
<img
alt="no roadmaps"
src={RoadmapIcon.src}
className="mb-2 w-[60px] h-[60px] sm:h-[120px] sm:w-[120px] opacity-10"
/>
<h2 className="text-lg sm:text-xl font-bold">No Progress</h2>
<p className="my-1 sm:my-2 max-w-[400px] text-gray-500 text-sm sm:text-base">
Progress will appear here as you start tracking your{' '}
<a href="/roadmaps" className="mt-4 text-blue-500 hover:underline">
Roadmaps
</a>{' '}
or{' '}
<a href="/best-practices" className="mt-4 text-blue-500 hover:underline">
Best Practices
</a>{' '}
progress.
</p>
</div>
</div>
);
}

View File

@@ -0,0 +1,162 @@
import { httpPost } from '../../lib/http';
import { getRelativeTimeString } from '../../lib/date';
import { useToast } from '../../hooks/use-toast';
import { ProgressShareButton } from '../UserProgress/ProgressShareButton';
import { useState } from 'react';
type ResourceProgressType = {
resourceType: 'roadmap' | 'best-practice';
resourceId: string;
title: string;
updatedAt: string;
totalCount: number;
doneCount: number;
learningCount: number;
skippedCount: number;
onCleared?: () => void;
showClearButton?: boolean;
};
export function ResourceProgress(props: ResourceProgressType) {
const { showClearButton = true } = props;
const toast = useToast();
const [isClearing, setIsClearing] = useState(false);
const [isConfirming, setIsConfirming] = useState(false);
const {
updatedAt,
resourceType,
resourceId,
title,
totalCount,
learningCount,
doneCount,
skippedCount,
onCleared,
} = props;
async function clearProgress() {
setIsClearing(true);
const { error, response } = await httpPost(
`${import.meta.env.PUBLIC_API_URL}/v1-clear-resource-progress`,
{
resourceId,
resourceType,
}
);
if (error || !response) {
toast.error('Error clearing progress. Please try again.');
console.error(error);
setIsClearing(false);
return;
}
localStorage.removeItem(`${resourceType}-${resourceId}-favorite`);
localStorage.removeItem(`${resourceType}-${resourceId}-progress`);
setIsClearing(false);
setIsConfirming(false);
if (onCleared) {
onCleared();
}
}
const url =
resourceType === 'roadmap'
? `/${resourceId}`
: `/best-practices/${resourceId}`;
const totalMarked = doneCount + skippedCount;
const progressPercentage = Math.round((totalMarked / totalCount) * 100);
return (
<div>
<a
href={url}
className="group relative flex cursor-pointer items-center rounded-t-md border p-3 text-gray-600 hover:border-gray-300 hover:text-black"
>
<span
className={`absolute left-0 top-0 block h-full cursor-pointer rounded-tl-md bg-black/5 group-hover:bg-black/10`}
style={{
width: `${progressPercentage}%`,
}}
></span>
<span className="relative flex-1 cursor-pointer truncate">
{title}
</span>
<span className="ml-1 cursor-pointer text-sm text-gray-400">
{getRelativeTimeString(updatedAt)}
</span>
</a>
<div className="sm:space-between flex flex-row items-start rounded-b-md border border-t-0 px-2 py-2 text-xs text-gray-500">
<span className="hidden flex-1 gap-1 sm:flex">
{doneCount > 0 && (
<>
<span>{doneCount} done</span> &bull;
</>
)}
{learningCount > 0 && (
<>
<span>{learningCount} in progress</span> &bull;
</>
)}
{skippedCount > 0 && (
<>
<span>{skippedCount} skipped</span> &bull;
</>
)}
<span>{totalCount} total</span>
</span>
<div className="flex w-full items-center justify-between gap-2 sm:w-auto sm:justify-start">
<ProgressShareButton
resourceType={resourceType}
resourceId={resourceId}
className="text-xs font-normal"
shareIconClassName="w-2.5 h-2.5 stroke-2"
checkIconClassName="w-2.5 h-2.5"
/>
<span className={'hidden sm:block'}>&bull;</span>
{showClearButton && (
<>
{!isConfirming && (
<button
className="text-red-500 hover:text-red-800"
onClick={() => setIsConfirming(true)}
disabled={isClearing}
>
{!isClearing && (
<>
Clear Progress <span>&times;</span>
</>
)}
{isClearing && 'Processing...'}
</button>
)}
{isConfirming && (
<span>
Are you sure?{' '}
<button
onClick={clearProgress}
className="ml-1 mr-1 text-red-500 underline hover:text-red-800"
>
Yes
</button>{' '}
<button
onClick={() => setIsConfirming(false)}
className="text-red-500 underline hover:text-red-800"
>
No
</button>
</span>
)}
</>
)}
</div>
</div>
</div>
);
}

View File

@@ -0,0 +1,174 @@
import { useRef, useState } from 'react';
import { useOutsideClick } from '../hooks/use-outside-click';
import { OptionType, SearchSelector } from './SearchSelector';
import type { PageType } from './CommandMenu/CommandMenu';
import { CheckIcon } from './ReactIcons/CheckIcon';
import { httpPut } from '../lib/http';
import type { TeamResourceConfig } from './CreateTeam/RoadmapSelector';
import { Spinner } from './ReactIcons/Spinner';
type AddTeamRoadmapProps = {
teamId: string;
allRoadmaps: PageType[];
availableRoadmaps: PageType[];
onClose: () => void;
onMakeChanges: (roadmapId: string) => void;
setResourceConfigs: (config: TeamResourceConfig) => void;
};
export function AddTeamRoadmap(props: AddTeamRoadmapProps) {
const {
teamId,
onMakeChanges,
onClose,
allRoadmaps,
availableRoadmaps,
setResourceConfigs,
} = props;
const [error, setError] = useState('');
const [isLoading, setIsLoading] = useState(false);
const [selectedRoadmap, setSelectedRoadmap] = useState<string>('');
const popupBodyEl = useRef<HTMLDivElement>(null);
async function addTeamResource(roadmapId: string) {
if (!teamId) {
return;
}
setIsLoading(true);
const { error, response } = await httpPut<TeamResourceConfig>(
`${
import.meta.env.PUBLIC_API_URL
}/v1-update-team-resource-config/${teamId}`,
{
teamId: teamId,
resourceId: roadmapId,
resourceType: 'roadmap',
removed: [],
}
);
if (error || !response) {
setError(error?.message || 'Error adding roadmap');
return;
}
setResourceConfigs(response);
}
useOutsideClick(popupBodyEl, () => {
onClose();
});
const selectedRoadmapTitle = allRoadmaps.find(
(roadmap) => roadmap.id === selectedRoadmap
)?.title;
return (
<div className="popup fixed left-0 right-0 top-0 z-50 flex h-full items-center justify-center overflow-y-auto overflow-x-hidden bg-black/50">
<div className="relative h-full w-full max-w-md p-4 md:h-auto">
<div
ref={popupBodyEl}
className="popup-body relative rounded-lg bg-white p-4 shadow"
>
{isLoading && (
<>
<div className="flex items-center justify-center gap-2 py-8">
<Spinner isDualRing={false} className="h-4 w-4" />
<h2 className="font-medium">Loading...</h2>
</div>
</>
)}
{!isLoading && !error && selectedRoadmap && (
<div className={'text-center'}>
<CheckIcon additionalClasses="h-10 w-10 mx-auto opacity-20 mb-3 mt-4" />
<h3 className="mb-1.5 text-2xl font-medium">
{selectedRoadmapTitle} Added
</h3>
<p className="mb-4 text-sm leading-none text-gray-400">
<button
onClick={() => onMakeChanges(selectedRoadmap)}
className="underline underline-offset-2 hover:text-gray-900"
>
Click here
</button>{' '}
to make changes to the roadmap.
</p>
<div className="flex items-center gap-2">
<button
onClick={onClose}
type="button"
className="flex-grow cursor-pointer rounded-lg bg-gray-200 py-2 text-center hover:bg-gray-300"
>
Done
</button>
<button
onClick={() => {
setSelectedRoadmap('');
setError('');
setIsLoading(false);
}}
type="button"
className="flex-grow cursor-pointer rounded-lg bg-black py-2 text-center text-white"
>
+ Add More
</button>
</div>
</div>
)}
{!isLoading && error && (
<>
<h3 className="mb-1.5 text-2xl font-medium">Error</h3>
<p className="mb-3 text-sm leading-none text-red-400">{error}</p>
<div className="flex items-center gap-2">
<button
onClick={onClose}
type="button"
className="flex-grow cursor-pointer rounded-lg bg-gray-200 py-2 text-center hover:bg-gray-300"
>
Cancel
</button>
</div>
</>
)}
{!isLoading && !error && !selectedRoadmap && (
<>
<h3 className="mb-1.5 text-2xl font-medium">Add Roadmap</h3>
<p className="mb-3 text-sm leading-none text-gray-400">
Search and add a roadmap
</p>
<SearchSelector
options={availableRoadmaps.map((roadmap) => ({
value: roadmap.id,
label: roadmap.title,
}))}
onSelect={(option: OptionType) => {
const roadmapId = option.value;
addTeamResource(roadmapId).finally(() => {
setIsLoading(false);
setSelectedRoadmap(roadmapId);
});
}}
inputClassName="mt-2 mb-2 block w-full rounded-md border border-gray-300 px-3 py-2 outline-none placeholder:text-gray-400 focus:border-gray-400"
placeholder={'Search for roadmap'}
/>
<div className="flex items-center gap-2">
<button
onClick={onClose}
type="button"
className="flex-grow cursor-pointer rounded-lg bg-gray-200 py-2 text-center hover:bg-gray-300"
>
Cancel
</button>
</div>
</>
)}
</div>
</div>
</div>
);
}

View File

@@ -1,41 +1,17 @@
---
---
<script src='./analytics.js'></script>
<script src='./analytics.ts'></script>
<script async src='https://www.googletagmanager.com/gtag/js?id=UA-139582634-1'
></script>
<script is:inline>
// @ts-nocheck
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'UA-139582634-1');
document.addEventListener('click', (e) => {
let trackEl = e.target;
if (!trackEl.getAttribute('ga-category')) {
trackEl = trackEl.closest('[ga-category]');
}
if (!trackEl) {
return;
}
const category = trackEl.getAttribute('ga-category');
const action = trackEl.getAttribute('ga-action');
const label = trackEl.getAttribute('ga-label');
if (!category) {
return;
}
window.fireEvent({
category,
action,
label,
});
});
</script>

View File

@@ -1,35 +1,29 @@
export {};
declare global {
interface Window {
// To selectively enable/disable debug logs
__DEBUG__: boolean;
gtag: any;
fireEvent: (props: GAEventType) => void;
fireEvent: (props: {
action: string;
category: string;
label?: string;
value?: string;
}) => void;
}
}
export type GAEventType = {
action: string;
category: string;
label?: string;
value?: string;
};
/**
* Tracks the event on google analytics
* @see https://developers.google.com/analytics/devguides/collection/gtagjs/events
* @param props Event properties
* @returns void
*/
window.fireEvent = (props: GAEventType) => {
window.fireEvent = (props) => {
const { action, category, label, value } = props;
if (!window.gtag) {
console.warn('Missing GTAG - Analytics disabled');
return;
}
if (window.__DEBUG__) {
if (import.meta.env.DEV) {
console.log('Analytics event fired', props);
}

View File

@@ -35,5 +35,4 @@ const { attributes: baseAttributes, innerHTML } = await getSVG(icon);
const svgAttributes = { ...baseAttributes, ...attributes };
---
<svg {...svgAttributes} set:html={innerHTML}></svg>
<svg {...svgAttributes} set:html={innerHTML}></svg>

View File

@@ -0,0 +1,5 @@
<div class='flex w-full items-center gap-2 py-6 text-sm text-slate-600'>
<div class='h-px w-full bg-slate-200'></div>
OR
<div class='h-px w-full bg-slate-200'></div>
</div>

View File

@@ -0,0 +1,102 @@
import Cookies from 'js-cookie';
import type { FormEvent } from 'react';
import { useState } from 'react';
import { httpPost } from '../../lib/http';
import { TOKEN_COOKIE_NAME } from '../../lib/jwt';
export function EmailLoginForm() {
const [email, setEmail] = useState<string>('');
const [password, setPassword] = useState<string>('');
const [error, setError] = useState('');
const [isLoading, setIsLoading] = useState<boolean>(false);
const handleFormSubmit = async (e: FormEvent<HTMLFormElement>) => {
e.preventDefault();
setIsLoading(true);
setError('');
const { response, error } = await httpPost<{ token: string }>(
`${import.meta.env.PUBLIC_API_URL}/v1-login`,
{
email,
password,
}
);
// Log the user in and reload the page
if (response?.token) {
Cookies.set(TOKEN_COOKIE_NAME, response.token, {
path: '/',
expires: 30,
domain: import.meta.env.DEV ? 'localhost' : '.roadmap.sh',
});
window.location.reload();
return;
}
// @todo use proper types
if ((error as any).type === 'user_not_verified') {
window.location.href = `/verification-pending?email=${encodeURIComponent(
email
)}`;
return;
}
setIsLoading(false);
setError(error?.message || 'Something went wrong. Please try again later.');
};
return (
<form className="w-full" onSubmit={handleFormSubmit}>
<label htmlFor="email" className="sr-only">
Email address
</label>
<input
name="email"
type="email"
autoComplete="email"
required
className="block w-full rounded-lg border border-gray-300 px-3 py-2 shadow-sm outline-none placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1"
placeholder="Email Address"
value={email}
onInput={(e) => setEmail(String((e.target as any).value))}
/>
<label htmlFor="password" className="sr-only">
Password
</label>
<input
name="password"
type="password"
autoComplete="current-password"
required
className="mt-2 block w-full rounded-lg border border-gray-300 px-3 py-2 shadow-sm outline-none placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1"
placeholder="Password"
value={password}
onInput={(e) => setPassword(String((e.target as any).value))}
/>
<p className="mb-3 mt-2 text-sm text-gray-500">
<a
href="/forgot-password"
className="text-blue-800 hover:text-blue-600"
>
Reset your password?
</a>
</p>
{error && (
<p className="mb-2 rounded-md bg-red-100 p-2 text-red-800">{error}</p>
)}
<button
type="submit"
disabled={isLoading}
className="inline-flex w-full items-center justify-center rounded-lg bg-black p-2 py-3 text-sm font-medium text-white outline-none focus:ring-2 focus:ring-black focus:ring-offset-1 disabled:bg-gray-400"
>
{isLoading ? 'Please wait...' : 'Continue'}
</button>
</form>
);
}

View File

@@ -0,0 +1,100 @@
import { type FormEvent, useState } from 'react';
import { httpPost } from '../../lib/http';
export function EmailSignupForm() {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [name, setName] = useState('');
const [error, setError] = useState('');
const [isLoading, setIsLoading] = useState(false);
const onSubmit = async (e: FormEvent<HTMLFormElement>) => {
e.preventDefault();
setIsLoading(true);
setError('');
const { response, error } = await httpPost<{ status: 'ok' }>(
`${import.meta.env.PUBLIC_API_URL}/v1-register`,
{
email,
password,
name,
}
);
if (error || response?.status !== 'ok') {
setIsLoading(false);
setError(
error?.message || 'Something went wrong. Please try again later.'
);
return;
}
window.location.href = `/verification-pending?email=${encodeURIComponent(
email
)}`;
};
return (
<form className="flex w-full flex-col gap-2" onSubmit={onSubmit}>
<label htmlFor="name" className="sr-only">
Name
</label>
<input
name="name"
type="text"
autoComplete="name"
min={3}
max={50}
required
className="block w-full rounded-lg border border-gray-300 px-3 py-2 outline-none placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1"
placeholder="Full Name"
value={name}
onInput={(e) => setName(String((e.target as any).value))}
/>
<label htmlFor="email" className="sr-only">
Email address
</label>
<input
name="email"
type="email"
autoComplete="email"
required
className="block w-full rounded-lg border border-gray-300 px-3 py-2 outline-none placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1"
placeholder="Email Address"
value={email}
onInput={(e) => setEmail(String((e.target as any).value))}
/>
<label htmlFor="password" className="sr-only">
Password
</label>
<input
name="password"
type="password"
autoComplete="current-password"
min={6}
max={50}
required
className="block w-full rounded-lg border border-gray-300 px-3 py-2 outline-none placeholder:text-gray-400 focus:ring-2 focus:ring-black focus:ring-offset-1"
placeholder="Password"
value={password}
onInput={(e) => setPassword(String((e.target as any).value))}
/>
{error && (
<p className="rounded-lg bg-red-100 p-2 text-red-700">{error}.</p>
)}
<button
type="submit"
disabled={isLoading}
className="inline-flex w-full items-center justify-center rounded-lg bg-black p-2 py-3 text-sm font-medium text-white outline-none focus:ring-2 focus:ring-black focus:ring-offset-1 disabled:bg-gray-400"
>
{isLoading ? 'Please wait...' : 'Continue to Verify Email'}
</button>
</form>
);
}

Some files were not shown because too many files have changed in this diff Show More