Merge branch 'master' into feat/ssr

pull/5494/head
Kamran Ahmed 9 months ago
commit f8e5833f6a
  1. 34
      package.json
  2. 388
      pnpm-lock.yaml
  3. BIN
      public/pdfs/roadmaps/datastructures-and-algorithms.pdf
  4. BIN
      public/pdfs/roadmaps/mlops.pdf
  5. BIN
      public/roadmaps/mlops.png
  6. 4
      readme.md
  7. 7
      src/components/AstroIcon.astro
  8. 41
      src/components/AuthenticationFlow/AuthenticationForm.tsx
  9. 13
      src/components/AuthenticationFlow/EmailLoginForm.tsx
  10. 19
      src/components/AuthenticationFlow/EmailSignupForm.tsx
  11. 14
      src/components/AuthenticationFlow/GitHubButton.tsx
  12. 15
      src/components/AuthenticationFlow/GoogleButton.tsx
  13. 15
      src/components/AuthenticationFlow/LinkedInButton.tsx
  14. 22
      src/components/AuthenticationFlow/LoginPopup.astro
  15. 3
      src/components/FeaturedItems/FeaturedItem.astro
  16. 1
      src/components/Footer.astro
  17. 39
      src/components/Navigation/Navigation.astro
  18. 42
      src/components/OpenSourceBanner.astro
  19. 105
      src/components/OpenSourceStat.astro
  20. 2
      src/components/TeamAnnouncement.tsx
  21. 6
      src/data/roadmaps/backend/content/109-apis/104-hateoas.md
  22. 1
      src/data/roadmaps/blockchain/content/101-blockchain-general-knowledge/103-blockchain-forking.md
  23. 16
      src/data/roadmaps/datastructures-and-algorithms/content/100-language/100-javascript.md
  24. 13
      src/data/roadmaps/datastructures-and-algorithms/content/100-language/101-java.md
  25. 14
      src/data/roadmaps/datastructures-and-algorithms/content/100-language/102-go.md
  26. 10
      src/data/roadmaps/datastructures-and-algorithms/content/100-language/103-csharp.md
  27. 8
      src/data/roadmaps/datastructures-and-algorithms/content/100-language/104-cpp.md
  28. 18
      src/data/roadmaps/datastructures-and-algorithms/content/100-language/105-python.md
  29. 10
      src/data/roadmaps/datastructures-and-algorithms/content/100-language/106-rust.md
  30. 10
      src/data/roadmaps/datastructures-and-algorithms/content/100-language/107-ruby.md
  31. 3
      src/data/roadmaps/datastructures-and-algorithms/content/100-language/index.md
  32. 5
      src/data/roadmaps/datastructures-and-algorithms/content/101-programming-fundamentals/100-language-syntax.md
  33. 3
      src/data/roadmaps/datastructures-and-algorithms/content/101-programming-fundamentals/101-control-structures.md
  34. 3
      src/data/roadmaps/datastructures-and-algorithms/content/101-programming-fundamentals/102-functions.md
  35. 3
      src/data/roadmaps/datastructures-and-algorithms/content/101-programming-fundamentals/103-oop-basics.md
  36. 3
      src/data/roadmaps/datastructures-and-algorithms/content/101-programming-fundamentals/104-pseudo-code.md
  37. 3
      src/data/roadmaps/datastructures-and-algorithms/content/101-programming-fundamentals/index.md
  38. 3
      src/data/roadmaps/datastructures-and-algorithms/content/102-data-structures/100-what-are-datastructures.md
  39. 3
      src/data/roadmaps/datastructures-and-algorithms/content/102-data-structures/101-importance-of-datastructures.md
  40. 3
      src/data/roadmaps/datastructures-and-algorithms/content/102-data-structures/index.md
  41. 3
      src/data/roadmaps/datastructures-and-algorithms/content/103-basic-data-structures/100-array.md
  42. 3
      src/data/roadmaps/datastructures-and-algorithms/content/103-basic-data-structures/101-linked-lists.md
  43. 11
      src/data/roadmaps/datastructures-and-algorithms/content/103-basic-data-structures/102-stacks.md
  44. 3
      src/data/roadmaps/datastructures-and-algorithms/content/103-basic-data-structures/103-queues.md
  45. 3
      src/data/roadmaps/datastructures-and-algorithms/content/103-basic-data-structures/104-hash-tables.md
  46. 9
      src/data/roadmaps/datastructures-and-algorithms/content/103-basic-data-structures/index.md
  47. 3
      src/data/roadmaps/datastructures-and-algorithms/content/104-algorithmic-complexity/100-time-vs-space.md
  48. 3
      src/data/roadmaps/datastructures-and-algorithms/content/104-algorithmic-complexity/101-calculating.md
  49. 3
      src/data/roadmaps/datastructures-and-algorithms/content/104-algorithmic-complexity/102-common-runtimes/100-constant.md
  50. 3
      src/data/roadmaps/datastructures-and-algorithms/content/104-algorithmic-complexity/102-common-runtimes/101-logarithmic.md
  51. 3
      src/data/roadmaps/datastructures-and-algorithms/content/104-algorithmic-complexity/102-common-runtimes/102-linear.md
  52. 3
      src/data/roadmaps/datastructures-and-algorithms/content/104-algorithmic-complexity/102-common-runtimes/103-polynomial.md
  53. 3
      src/data/roadmaps/datastructures-and-algorithms/content/104-algorithmic-complexity/102-common-runtimes/104-exponential.md
  54. 3
      src/data/roadmaps/datastructures-and-algorithms/content/104-algorithmic-complexity/102-common-runtimes/105-factorial.md
  55. 13
      src/data/roadmaps/datastructures-and-algorithms/content/104-algorithmic-complexity/102-common-runtimes/index.md
  56. 3
      src/data/roadmaps/datastructures-and-algorithms/content/104-algorithmic-complexity/103-asymptotic-notation/100-big-o.md
  57. 3
      src/data/roadmaps/datastructures-and-algorithms/content/104-algorithmic-complexity/103-asymptotic-notation/101-big-theta.md
  58. 3
      src/data/roadmaps/datastructures-and-algorithms/content/104-algorithmic-complexity/103-asymptotic-notation/102-big-omega.md
  59. 3
      src/data/roadmaps/datastructures-and-algorithms/content/104-algorithmic-complexity/103-asymptotic-notation/index.md
  60. 3
      src/data/roadmaps/datastructures-and-algorithms/content/104-algorithmic-complexity/index.md
  61. 3
      src/data/roadmaps/datastructures-and-algorithms/content/105-sorting-algorithms/100-bubble-sort.md
  62. 3
      src/data/roadmaps/datastructures-and-algorithms/content/105-sorting-algorithms/101-merge-sort.md
  63. 3
      src/data/roadmaps/datastructures-and-algorithms/content/105-sorting-algorithms/102-insertion-sort.md
  64. 3
      src/data/roadmaps/datastructures-and-algorithms/content/105-sorting-algorithms/103-quick-sort.md
  65. 3
      src/data/roadmaps/datastructures-and-algorithms/content/105-sorting-algorithms/104-selection-sort.md
  66. 3
      src/data/roadmaps/datastructures-and-algorithms/content/105-sorting-algorithms/105-heap-sort.md
  67. 3
      src/data/roadmaps/datastructures-and-algorithms/content/105-sorting-algorithms/index.md
  68. 3
      src/data/roadmaps/datastructures-and-algorithms/content/106-search-algorithms/100-linear-search.md
  69. 3
      src/data/roadmaps/datastructures-and-algorithms/content/106-search-algorithms/101-binary-search.md
  70. 3
      src/data/roadmaps/datastructures-and-algorithms/content/106-search-algorithms/index.md
  71. 3
      src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/100-binary-trees.md
  72. 3
      src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/101-binary-search-trees.md
  73. 3
      src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/102-avl-trees.md
  74. 3
      src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/103-b-trees.md
  75. 3
      src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/104-tree-traversal/100-in-order-traversal.md
  76. 3
      src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/104-tree-traversal/101-pre-order-traversal.md
  77. 3
      src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/104-tree-traversal/102-post-order-traversal.md
  78. 3
      src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/104-tree-traversal/index.md
  79. 3
      src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/105-search-algorithms/100-breadth-first-search.md
  80. 3
      src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/105-search-algorithms/101-depth-first-search.md
  81. 3
      src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/105-search-algorithms/index.md
  82. 3
      src/data/roadmaps/datastructures-and-algorithms/content/107-tree-data-structure/index.md
  83. 3
      src/data/roadmaps/datastructures-and-algorithms/content/108-graph-data-structure/100-directed-graph.md
  84. 3
      src/data/roadmaps/datastructures-and-algorithms/content/108-graph-data-structure/101-undirected-graph.md
  85. 3
      src/data/roadmaps/datastructures-and-algorithms/content/108-graph-data-structure/102-search-algorithms/100-breadth-first-search.md
  86. 3
      src/data/roadmaps/datastructures-and-algorithms/content/108-graph-data-structure/102-search-algorithms/101-depth-first-search.md
  87. 3
      src/data/roadmaps/datastructures-and-algorithms/content/108-graph-data-structure/102-search-algorithms/index.md
  88. 3
      src/data/roadmaps/datastructures-and-algorithms/content/108-graph-data-structure/103-shortest-path-algorithms/100-dijkstra-algorithm.md
  89. 3
      src/data/roadmaps/datastructures-and-algorithms/content/108-graph-data-structure/103-shortest-path-algorithms/101-bellman-ford.md
  90. 3
      src/data/roadmaps/datastructures-and-algorithms/content/108-graph-data-structure/103-shortest-path-algorithms/index.md
  91. 3
      src/data/roadmaps/datastructures-and-algorithms/content/108-graph-data-structure/104-minimum-spanning-tree/100-prims-algorithm.md
  92. 3
      src/data/roadmaps/datastructures-and-algorithms/content/108-graph-data-structure/104-minimum-spanning-tree/101-kruskal-algorithm.md
  93. 3
      src/data/roadmaps/datastructures-and-algorithms/content/108-graph-data-structure/104-minimum-spanning-tree/index.md
  94. 3
      src/data/roadmaps/datastructures-and-algorithms/content/108-graph-data-structure/index.md
  95. 3
      src/data/roadmaps/datastructures-and-algorithms/content/109-advanced-data-structures/100-trie.md
  96. 3
      src/data/roadmaps/datastructures-and-algorithms/content/109-advanced-data-structures/101-segment-trees.md
  97. 3
      src/data/roadmaps/datastructures-and-algorithms/content/109-advanced-data-structures/102-fenwick-trees.md
  98. 3
      src/data/roadmaps/datastructures-and-algorithms/content/109-advanced-data-structures/103-disjoint-set.md
  99. 3
      src/data/roadmaps/datastructures-and-algorithms/content/109-advanced-data-structures/104-suffix-trees-arrays.md
  100. 3
      src/data/roadmaps/datastructures-and-algorithms/content/109-advanced-data-structures/index.md
  101. Some files were not shown because too many files have changed in this diff Show More

@ -22,39 +22,39 @@
"test:e2e": "playwright test"
},
"dependencies": {
"@astrojs/react": "^3.0.9",
"@astrojs/react": "^3.0.10",
"@astrojs/sitemap": "^3.0.5",
"@astrojs/tailwind": "^5.1.0",
"@fingerprintjs/fingerprintjs": "^4.2.1",
"@fingerprintjs/fingerprintjs": "^4.2.2",
"@nanostores/react": "^0.7.1",
"@types/react": "^18.2.48",
"@types/react-dom": "^18.2.18",
"astro": "^4.2.1",
"astro-compress": "^2.2.8",
"@types/react": "^18.2.56",
"@types/react-dom": "^18.2.19",
"astro": "^4.4.0",
"astro-compress": "^2.2.10",
"clsx": "^2.1.0",
"dracula-prism": "^2.1.13",
"jose": "^5.2.0",
"dracula-prism": "^2.1.16",
"jose": "^5.2.2",
"js-cookie": "^3.0.5",
"lucide-react": "^0.300.0",
"nanoid": "^5.0.4",
"lucide-react": "^0.334.0",
"nanoid": "^5.0.5",
"nanostores": "^0.9.5",
"node-html-parser": "^6.1.12",
"npm-check-updates": "^16.14.12",
"npm-check-updates": "^16.14.15",
"prismjs": "^1.29.0",
"react": "^18.2.0",
"react-calendar-heatmap": "^1.9.0",
"react-confetti": "^6.1.0",
"react-dom": "^18.2.0",
"reactflow": "^11.10.2",
"reactflow": "^11.10.4",
"rehype-external-links": "^3.0.0",
"roadmap-renderer": "^1.0.6",
"slugify": "^1.6.6",
"tailwind-merge": "^2.2.1",
"tailwindcss": "^3.4.1",
"zustand": "^4.5.0"
"zustand": "^4.5.1"
},
"devDependencies": {
"@playwright/test": "^1.41.1",
"@playwright/test": "^1.41.2",
"@tailwindcss/typography": "^0.5.10",
"@types/js-cookie": "^3.0.6",
"@types/prismjs": "^1.26.3",
@ -63,9 +63,9 @@
"gh-pages": "^6.1.1",
"js-yaml": "^4.1.0",
"markdown-it": "^14.0.0",
"openai": "^4.25.0",
"prettier": "^3.2.4",
"prettier-plugin-astro": "^0.12.3",
"openai": "^4.28.0",
"prettier": "^3.2.5",
"prettier-plugin-astro": "^0.13.0",
"prettier-plugin-tailwindcss": "^0.5.11"
}
}

@ -6,50 +6,50 @@ settings:
dependencies:
'@astrojs/react':
specifier: ^3.0.9
version: 3.0.9(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)(vite@5.0.12)
specifier: ^3.0.10
version: 3.0.10(@types/react-dom@18.2.19)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)(vite@5.0.12)
'@astrojs/sitemap':
specifier: ^3.0.5
version: 3.0.5
'@astrojs/tailwind':
specifier: ^5.1.0
version: 5.1.0(astro@4.2.1)(tailwindcss@3.4.1)
version: 5.1.0(astro@4.4.0)(tailwindcss@3.4.1)
'@fingerprintjs/fingerprintjs':
specifier: ^4.2.1
version: 4.2.1
specifier: ^4.2.2
version: 4.2.2
'@nanostores/react':
specifier: ^0.7.1
version: 0.7.1(nanostores@0.9.5)(react@18.2.0)
'@types/react':
specifier: ^18.2.48
version: 18.2.48
specifier: ^18.2.55
version: 18.2.55
'@types/react-dom':
specifier: ^18.2.18
version: 18.2.18
specifier: ^18.2.19
version: 18.2.19
astro:
specifier: ^4.2.1
version: 4.2.1
specifier: ^4.4.0
version: 4.4.0
astro-compress:
specifier: ^2.2.8
version: 2.2.8
specifier: ^2.2.10
version: 2.2.10
clsx:
specifier: ^2.1.0
version: 2.1.0
dracula-prism:
specifier: ^2.1.13
version: 2.1.13
specifier: ^2.1.16
version: 2.1.16
jose:
specifier: ^5.2.0
version: 5.2.0
specifier: ^5.2.2
version: 5.2.2
js-cookie:
specifier: ^3.0.5
version: 3.0.5
lucide-react:
specifier: ^0.300.0
version: 0.300.0(react@18.2.0)
specifier: ^0.331.0
version: 0.331.0(react@18.2.0)
nanoid:
specifier: ^5.0.4
version: 5.0.4
specifier: ^5.0.5
version: 5.0.5
nanostores:
specifier: ^0.9.5
version: 0.9.5
@ -57,8 +57,8 @@ dependencies:
specifier: ^6.1.12
version: 6.1.12
npm-check-updates:
specifier: ^16.14.12
version: 16.14.12
specifier: ^16.14.15
version: 16.14.15
prismjs:
specifier: ^1.29.0
version: 1.29.0
@ -72,8 +72,8 @@ dependencies:
specifier: ^18.2.0
version: 18.2.0(react@18.2.0)
reactflow:
specifier: ^11.10.2
version: 11.10.2(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
specifier: ^11.10.4
version: 11.10.4(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
rehype-external-links:
specifier: ^3.0.0
version: 3.0.0
@ -91,12 +91,12 @@ dependencies:
version: 3.4.1
zustand:
specifier: ^4.5.0
version: 4.5.0(@types/react@18.2.48)(react@18.2.0)
version: 4.5.0(@types/react@18.2.55)(react@18.2.0)
devDependencies:
'@playwright/test':
specifier: ^1.41.1
version: 1.41.1
specifier: ^1.41.2
version: 1.41.2
'@tailwindcss/typography':
specifier: ^0.5.10
version: 0.5.10(tailwindcss@3.4.1)
@ -119,17 +119,17 @@ devDependencies:
specifier: ^14.0.0
version: 14.0.0
openai:
specifier: ^4.25.0
version: 4.25.0
specifier: ^4.28.0
version: 4.28.0
prettier:
specifier: ^3.2.4
version: 3.2.4
specifier: ^3.2.5
version: 3.2.5
prettier-plugin-astro:
specifier: ^0.12.3
version: 0.12.3
specifier: ^0.13.0
version: 0.13.0
prettier-plugin-tailwindcss:
specifier: ^0.5.11
version: 0.5.11(prettier-plugin-astro@0.12.3)(prettier@3.2.4)
version: 0.5.11(prettier-plugin-astro@0.13.0)(prettier@3.2.5)
packages:
@ -149,16 +149,16 @@ packages:
resolution: {integrity: sha512-o/ObKgtMzl8SlpIdzaxFnt7SATKPxu4oIP/1NL+HDJRzxfJcAkOTAb/ZKMRyULbz4q+1t2/DAebs2Z1QairkZw==}
dev: true
/@astrojs/compiler@2.5.0:
resolution: {integrity: sha512-ZDluNgMIJT+z+HJcZ6QEJ/KqaFkTkrb+Za6c6VZs8G/nb1LBErL14/iU5EVJ9yu25i4QCLweuBJ3m5df34gZJg==}
/@astrojs/compiler@2.5.3:
resolution: {integrity: sha512-jzj01BRv/fmo+9Mr2FhocywGzEYiyiP2GVHje1ziGNU6c97kwhYGsnvwMkHrncAy9T9Vi54cjaMK7UE4ClX4vA==}
dev: false
/@astrojs/internal-helpers@0.2.1:
resolution: {integrity: sha512-06DD2ZnItMwUnH81LBLco3tWjcZ1lGU9rLCCBaeUCGYe9cI0wKyY2W3kDyoW1I6GmcWgt1fu+D1CTvz+FIKf8A==}
dev: false
/@astrojs/markdown-remark@4.1.0:
resolution: {integrity: sha512-JnIy6zk+6f/SgSVMZecZFxQt0faT1uBckwYCuBxKH1hYYJsal8OOe+tx6JxfnyaV+xViyjUvQ28mmn+p/F5LkQ==}
/@astrojs/markdown-remark@4.2.1:
resolution: {integrity: sha512-2RQBIwrq+2qPYtp99bH+eL5hfbK0BoxXla85lHsRpIX/IsGqFrPX6pXI2cbWPihBwGbKCdxS6uZNX2QerZWwpQ==}
dependencies:
'@astrojs/prism': 3.0.0
github-slugger: 2.0.0
@ -185,8 +185,8 @@ packages:
prismjs: 1.29.0
dev: false
/@astrojs/react@3.0.9(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)(vite@5.0.12):
resolution: {integrity: sha512-31J5yF5p9yBFV1axBooLA9PB4B2+MYm7swWhtlezSsJiUNXRFo5Is9qI3teJ7cKgmaCv+ZA593Smskko0NGaDQ==}
/@astrojs/react@3.0.10(@types/react-dom@18.2.19)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)(vite@5.0.12):
resolution: {integrity: sha512-uGRIwKMAn7tva2vxXMyoVIGxWFr0rjZ8ZWIlkTG/vIpnAjD2nM8Cz6B8j7yzj176jvl6gZ6xTbTVPm09aeK0Yw==}
engines: {node: '>=18.14.1'}
peerDependencies:
'@types/react': ^17.0.50 || ^18.0.21
@ -194,8 +194,8 @@ packages:
react: ^17.0.2 || ^18.0.0
react-dom: ^17.0.2 || ^18.0.0
dependencies:
'@types/react': 18.2.48
'@types/react-dom': 18.2.18
'@types/react': 18.2.55
'@types/react-dom': 18.2.19
'@vitejs/plugin-react': 4.2.1(vite@5.0.12)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
@ -212,13 +212,13 @@ packages:
zod: 3.22.4
dev: false
/@astrojs/tailwind@5.1.0(astro@4.2.1)(tailwindcss@3.4.1):
/@astrojs/tailwind@5.1.0(astro@4.4.0)(tailwindcss@3.4.1):
resolution: {integrity: sha512-BJoCDKuWhU9FT2qYg+fr6Nfb3qP4ShtyjXGHKA/4mHN94z7BGcmauQK23iy+YH5qWvTnhqkd6mQPQ1yTZTe9Ig==}
peerDependencies:
astro: ^3.0.0 || ^4.0.0
tailwindcss: ^3.0.24
dependencies:
astro: 4.2.1
astro: 4.4.0
autoprefixer: 10.4.17(postcss@8.4.33)
postcss: 8.4.33
postcss-load-config: 4.0.2(postcss@8.4.33)
@ -718,8 +718,8 @@ packages:
dev: false
optional: true
/@fingerprintjs/fingerprintjs@4.2.1:
resolution: {integrity: sha512-uW+GVUNTgCXbVPEbgnbf5Aor22e1dyYR0JRwdUiZBaikfxr7KlhV9y0aahA1FB99fEeQVvhCEvTcPIFSYTy9Pw==}
/@fingerprintjs/fingerprintjs@4.2.2:
resolution: {integrity: sha512-scD+pDgNZW78LuFAr7ms2yxmDx2NWC4+K5iiOjPT2ZlTlHFbLsORUzLJI2rcKicxxLtHbvf3A7BU1drVr4iHGg==}
dependencies:
tslib: 2.6.2
dev: false
@ -959,6 +959,10 @@ packages:
'@jridgewell/resolve-uri': 3.1.1
'@jridgewell/sourcemap-codec': 1.4.15
/@medv/finder@3.1.0:
resolution: {integrity: sha512-ojkXjR3K0Zz3jnCR80tqPL+0yvbZk/lEodb6RIVjLz7W8RVA2wrw8ym/CzCpXO9SYVUIKHFUpc7jvf8UKfIM3w==}
dev: false
/@nanostores/react@0.7.1(nanostores@0.9.5)(react@18.2.0):
resolution: {integrity: sha512-EXQg9N4MdI4eJQz/AZLIx3hxQ6BuBmV4Q55bCd5YCSgEOAW7tGTsIZxpRXxvxLXzflNvHTBvfrDNY38TlSVBkQ==}
engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0}
@ -1069,12 +1073,12 @@ packages:
requiresBuild: true
optional: true
/@playwright/test@1.41.1:
resolution: {integrity: sha512-9g8EWTjiQ9yFBXc6HjCWe41msLpxEX0KhmfmPl9RPLJdfzL4F0lg2BdJ91O9azFdl11y1pmpwdjBiSxvqc+btw==}
/@playwright/test@1.41.2:
resolution: {integrity: sha512-qQB9h7KbibJzrDpkXkYvsmiDJK14FULCCZgEcoe2AvFAS64oCirWTwzTlAYEbKaRxWs5TFesE1Na6izMv3HfGg==}
engines: {node: '>=16'}
hasBin: true
dependencies:
playwright: 1.41.1
playwright: 1.41.2
dev: true
/@pnpm/config.env-replace@1.1.0:
@ -1098,40 +1102,40 @@ packages:
config-chain: 1.1.13
dev: false
/@reactflow/background@11.3.7(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-PhkvoFtO/NXJgFtBvfbPwdR/6/dl25egQlFhKWS3T4aYa7rh80dvf6dF3t6+JXJS4q5ToYJizD2/n8/qylo1yQ==}
/@reactflow/background@11.3.9(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-byj/G9pEC8tN0wT/ptcl/LkEP/BBfa33/SvBkqE4XwyofckqF87lKp573qGlisfnsijwAbpDlf81PuFL41So4Q==}
peerDependencies:
react: '>=17'
react-dom: '>=17'
dependencies:
'@reactflow/core': 11.10.2(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
'@reactflow/core': 11.10.4(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
classcat: 5.0.4
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
zustand: 4.5.0(@types/react@18.2.48)(react@18.2.0)
zustand: 4.5.0(@types/react@18.2.55)(react@18.2.0)
transitivePeerDependencies:
- '@types/react'
- immer
dev: false
/@reactflow/controls@11.2.7(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-mugzVALH/SuKlVKk+JCRm1OXQ+p8e9+k8PCTIaqL+nBl+lPF8KA4uMm8ApsOvhuSAb2A80ezewpyvYHr0qSYVA==}
/@reactflow/controls@11.2.9(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-e8nWplbYfOn83KN1BrxTXS17+enLyFnjZPbyDgHSRLtI5ZGPKF/8iRXV+VXb2LFVzlu4Wh3la/pkxtfP/0aguA==}
peerDependencies:
react: '>=17'
react-dom: '>=17'
dependencies:
'@reactflow/core': 11.10.2(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
'@reactflow/core': 11.10.4(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
classcat: 5.0.4
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
zustand: 4.5.0(@types/react@18.2.48)(react@18.2.0)
zustand: 4.5.0(@types/react@18.2.55)(react@18.2.0)
transitivePeerDependencies:
- '@types/react'
- immer
dev: false
/@reactflow/core@11.10.2(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-/cbTxtFpfkIGReSVkcnQhS4Jx4VFY2AhPlJ5n0sbPtnR7OWowF9zodh5Yyzr4j1NOUoBgJ9h+UqGEwwY2dbAlw==}
/@reactflow/core@11.10.4(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-j3i9b2fsTX/sBbOm+RmNzYEFWbNx4jGWGuGooh2r1jQaE2eV+TLJgiG/VNOp0q5mBl9f6g1IXs3Gm86S9JfcGw==}
peerDependencies:
react: '>=17'
react-dom: '>=17'
@ -1146,19 +1150,19 @@ packages:
d3-zoom: 3.0.0
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
zustand: 4.5.0(@types/react@18.2.48)(react@18.2.0)
zustand: 4.5.0(@types/react@18.2.55)(react@18.2.0)
transitivePeerDependencies:
- '@types/react'
- immer
dev: false
/@reactflow/minimap@11.7.7(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-Pwqw31tJ663cJur6ypqyJU33nPckvTepmz96erdQZoHsfOyLmFj4nXT7afC30DJ48lp0nfNsw+028mlf7f/h4g==}
/@reactflow/minimap@11.7.9(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-le95jyTtt3TEtJ1qa7tZ5hyM4S7gaEQkW43cixcMOZLu33VAdc2aCpJg/fXcRrrf7moN2Mbl9WIMNXUKsp5ILA==}
peerDependencies:
react: '>=17'
react-dom: '>=17'
dependencies:
'@reactflow/core': 11.10.2(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
'@reactflow/core': 11.10.4(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
'@types/d3-selection': 3.0.10
'@types/d3-zoom': 3.0.8
classcat: 5.0.4
@ -1166,41 +1170,41 @@ packages:
d3-zoom: 3.0.0
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
zustand: 4.5.0(@types/react@18.2.48)(react@18.2.0)
zustand: 4.5.0(@types/react@18.2.55)(react@18.2.0)
transitivePeerDependencies:
- '@types/react'
- immer
dev: false
/@reactflow/node-resizer@2.2.7(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-BMBstmWNiklHnnAjHu8irkiPQ8/k8nnjzqlTql4acbVhD6Tsdxx/t/saOkELmfQODqGZNiPw9+pHcAHgtE6oNQ==}
/@reactflow/node-resizer@2.2.9(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-HfickMm0hPDIHt9qH997nLdgLt0kayQyslKE0RS/GZvZ4UMQJlx/NRRyj5y47Qyg0NnC66KYOQWDM9LLzRTnUg==}
peerDependencies:
react: '>=17'
react-dom: '>=17'
dependencies:
'@reactflow/core': 11.10.2(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
'@reactflow/core': 11.10.4(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
classcat: 5.0.4
d3-drag: 3.0.0
d3-selection: 3.0.0
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
zustand: 4.5.0(@types/react@18.2.48)(react@18.2.0)
zustand: 4.5.0(@types/react@18.2.55)(react@18.2.0)
transitivePeerDependencies:
- '@types/react'
- immer
dev: false
/@reactflow/node-toolbar@1.3.7(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-75moEQKg23YKA3A2DNSFhq719ZPmby5mpwOD+NO7ZffJ88oMS/2eY8l8qpA3hvb1PTBHDxyKazhJirW+f4t0Wg==}
/@reactflow/node-toolbar@1.3.9(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-VmgxKmToax4sX1biZ9LXA7cj/TBJ+E5cklLGwquCCVVxh+lxpZGTBF3a5FJGVHiUNBBtFsC8ldcSZIK4cAlQww==}
peerDependencies:
react: '>=17'
react-dom: '>=17'
dependencies:
'@reactflow/core': 11.10.2(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
'@reactflow/core': 11.10.4(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
classcat: 5.0.4
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
zustand: 4.5.0(@types/react@18.2.48)(react@18.2.0)
zustand: 4.5.0(@types/react@18.2.55)(react@18.2.0)
transitivePeerDependencies:
- '@types/react'
- immer
@ -1659,7 +1663,7 @@ packages:
/@types/node-fetch@2.6.11:
resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==}
dependencies:
'@types/node': 18.19.8
'@types/node': 20.11.0
form-data: 4.0.0
dev: true
@ -1675,6 +1679,12 @@ packages:
/@types/node@20.11.0:
resolution: {integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==}
dependencies:
undici-types: 5.26.5
dev: true
/@types/node@20.11.17:
resolution: {integrity: sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==}
dependencies:
undici-types: 5.26.5
dev: false
@ -1687,14 +1697,14 @@ packages:
resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==}
dev: false
/@types/react-dom@18.2.18:
resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==}
/@types/react-dom@18.2.19:
resolution: {integrity: sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==}
dependencies:
'@types/react': 18.2.48
'@types/react': 18.2.55
dev: false
/@types/react@18.2.48:
resolution: {integrity: sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==}
/@types/react@18.2.55:
resolution: {integrity: sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==}
dependencies:
'@types/prop-types': 15.7.11
'@types/scheduler': 0.16.8
@ -1871,29 +1881,29 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/astro-compress@2.2.8:
resolution: {integrity: sha512-nLV/htvhPt8t4iM7IdxCfLA/+69+4UN+cknOSTFJs6sKg31Dik0tRZQyHBLdAf7ZRVoSUV6M+49vcwg06FGE2g==}
/astro-compress@2.2.10:
resolution: {integrity: sha512-JjoEQ5mSrsskoccb81XaAp0Z/J6uYlw9jyVnLHmX4sslyO0a3SKYmLzTIyb+ayGmDar2R8yEKolm4oXtaKC3+w==}
dependencies:
'@types/csso': 5.0.4
'@types/html-minifier-terser': 7.0.2
csso: 5.0.5
files-pipe: 2.1.6
files-pipe: 2.1.8
html-minifier-terser: 7.2.0
kleur: 4.1.5
lightningcss: 1.23.0
sharp: 0.33.2
svgo: 3.2.0
terser: 5.26.0
terser: 5.27.0
dev: false
/astro@4.2.1:
resolution: {integrity: sha512-TcrveW2/lohmljrbTUgcDxajEdF1yK+zBvb7SXroloGix/d4jkegO6GANFgvyy0zprMyajW7qgJEFyhWUX86Vw==}
/astro@4.4.0:
resolution: {integrity: sha512-JAsMrm1Z6W4Iqg9Q7LW/6lCXrqa4jndEOlR/yu7NGNP0BrPwSM8i4+yzya6hxgsNvyyVK8ywthaNhFmqd8Z+cg==}
engines: {node: '>=18.14.1', npm: '>=6.14.0'}
hasBin: true
dependencies:
'@astrojs/compiler': 2.5.0
'@astrojs/compiler': 2.5.3
'@astrojs/internal-helpers': 0.2.1
'@astrojs/markdown-remark': 4.1.0
'@astrojs/markdown-remark': 4.2.1
'@astrojs/telemetry': 3.0.4
'@babel/core': 7.23.7
'@babel/generator': 7.23.6
@ -1901,6 +1911,7 @@ packages:
'@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.7)
'@babel/traverse': 7.23.7
'@babel/types': 7.23.6
'@medv/finder': 3.1.0
'@types/babel__core': 7.20.5
acorn: 8.11.3
aria-query: 5.3.0
@ -1911,6 +1922,7 @@ packages:
clsx: 2.1.0
common-ancestor-path: 1.0.1
cookie: 0.6.0
cssesc: 3.0.0
debug: 4.3.4
deterministic-object-hash: 2.0.2
devalue: 4.3.2
@ -1937,20 +1949,20 @@ packages:
p-queue: 8.0.1
path-to-regexp: 6.2.1
preferred-pm: 3.1.2
probe-image-size: 7.2.3
prompts: 2.4.2
rehype: 13.0.1
resolve: 1.22.8
semver: 7.5.4
server-destroy: 1.0.1
shikiji: 0.9.19
shikiji-core: 0.9.19
string-width: 7.1.0
strip-ansi: 7.1.0
tsconfck: 3.0.1
unist-util-visit: 5.0.0
vfile: 6.0.1
vite: 5.0.12
vitefu: 0.2.5(vite@5.0.12)
vite: 5.1.3
vitefu: 0.2.5(vite@5.1.3)
which-pm: 2.1.1
yargs-parser: 21.1.1
zod: 3.22.4
@ -2569,28 +2581,6 @@ packages:
d3-transition: 3.0.1(d3-selection@3.0.0)
dev: false
/debug@2.6.9:
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
dependencies:
ms: 2.0.0
dev: false
/debug@3.2.7:
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
dependencies:
ms: 2.1.3
dev: false
/debug@4.3.4:
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
engines: {node: '>=6.0'}
@ -2740,8 +2730,8 @@ packages:
is-obj: 2.0.0
dev: false
/dracula-prism@2.1.13:
resolution: {integrity: sha512-mgm8Nr/X0RGUz/wpha88dKN/xw0QIGK8BQmWXrzgtOp9be+qcKiFEa2J5SQ3+/WNvL5sPPtNQXPL+Vy//Q8+dg==}
/dracula-prism@2.1.16:
resolution: {integrity: sha512-fNZU8sMYOFYq/K8WFtsVUJEHemYlQJy7E3wm+Lndp3hTWG+Hp3+sCcbQdWVvQTfw+xIJeI+mIrjfUWHb9Q/s2Q==}
dev: false
/dset@3.1.3:
@ -2950,10 +2940,10 @@ packages:
trim-repeated: 1.0.0
dev: true
/files-pipe@2.1.6:
resolution: {integrity: sha512-M5z8ff6PQHb4IE5FwOdfFveye9PAyX69g6er7IaHVnYV9xfxR6HSAaXI/2kzIn8Fbe0M8uXlqJ6phKDqQwtF6A==}
/files-pipe@2.1.8:
resolution: {integrity: sha512-2qebFhQ/Vnw7HygoeKpLjnd6ClzTt9y8qSNXjcP+5DHAFEwDq1T+d6sW8PLSkDujHMsN6Lq2ufFoWZCT8YraXw==}
dependencies:
'@types/node': 20.11.0
'@types/node': 20.11.17
deepmerge-ts: 5.1.0
fast-glob: 3.3.2
dev: false
@ -3421,7 +3411,7 @@ packages:
entities: 4.5.0
param-case: 3.0.4
relateurl: 0.2.7
terser: 5.26.0
terser: 5.27.0
dev: false
/html-void-elements@3.0.0:
@ -3471,13 +3461,6 @@ packages:
dependencies:
ms: 2.1.3
/iconv-lite@0.4.24:
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
engines: {node: '>=0.10.0'}
dependencies:
safer-buffer: 2.1.2
dev: false
/iconv-lite@0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
@ -3708,8 +3691,8 @@ packages:
resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
dev: false
/jose@5.2.0:
resolution: {integrity: sha512-oW3PCnvyrcm1HMvGTzqjxxfnEs9EoFOFWi2HsEGhlFVOXxTE3K9GKWVMFoFw06yPUqwpvEWic1BmtUZBI/tIjw==}
/jose@5.2.2:
resolution: {integrity: sha512-/WByRr4jDcsKlvMd1dRJnPfS1GVO3WuKyaurJ/vvXcOaUQO8rnNObCQMlv/5uCceVQIq5Q4WLF44ohsdiTohdg==}
dev: false
/js-cookie@3.0.5:
@ -3955,6 +3938,7 @@ packages:
/lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
dev: true
/lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
@ -4012,8 +3996,8 @@ packages:
engines: {node: '>=12'}
dev: false
/lucide-react@0.300.0(react@18.2.0):
resolution: {integrity: sha512-rQxUUCmWAvNLoAsMZ5j04b2+OJv6UuNLYMY7VK0eVlm4aTwUEjEEHc09/DipkNIlhXUSDn2xoyIzVT0uh7dRsg==}
/lucide-react@0.331.0(react@18.2.0):
resolution: {integrity: sha512-CHFJ0ve9vaZ7bB2VRAl27SlX1ELh6pfNC0jS96qGpPEEzLkLDGq4pDBFU8RhOoRMqsjXqTzLm9U6bZ1OcIHq7Q==}
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0
dependencies:
@ -4677,10 +4661,6 @@ packages:
hasBin: true
dev: false
/ms@2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
dev: false
/ms@2.1.2:
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
dev: false
@ -4700,8 +4680,8 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
/nanoid@5.0.4:
resolution: {integrity: sha512-vAjmBf13gsmhXSgBrtIclinISzFFy22WwCYoyilZlsrRXNIHSwgFQ1bEdjRwMT3aoadeIF6HMuDRlOxzfXV8ig==}
/nanoid@5.0.5:
resolution: {integrity: sha512-/Veqm+QKsyMY3kqi4faWplnY1u+VuKO3dD2binyPIybP31DRO29bPF+1mszgLnrR2KqSLceFLBNw0zmvDzN1QQ==}
engines: {node: ^18 || >=20}
hasBin: true
dev: false
@ -4717,18 +4697,6 @@ packages:
dev: false
optional: true
/needle@2.9.1:
resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==}
engines: {node: '>= 4.4.x'}
hasBin: true
dependencies:
debug: 3.2.7
iconv-lite: 0.4.24
sax: 1.3.0
transitivePeerDependencies:
- supports-color
dev: false
/negotiator@0.6.3:
resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
engines: {node: '>= 0.6'}
@ -4850,8 +4818,8 @@ packages:
npm-normalize-package-bin: 3.0.1
dev: false
/npm-check-updates@16.14.12:
resolution: {integrity: sha512-5FvqaDX8AqWWTDQFbBllgLwoRXTvzlqVIRSKl9Kg8bYZTfNwMnrp1Zlmb5e/ocf11UjPTc+ShBFjYQ7kg6FL0w==}
/npm-check-updates@16.14.15:
resolution: {integrity: sha512-WH0wJ9j6CP7Azl+LLCxWAYqroT2IX02kRIzgK/fg0rPpMbETgHITWBdOPtrv521xmA3JMgeNsQ62zvVtS/nCmQ==}
engines: {node: '>=14.14'}
hasBin: true
dependencies:
@ -4996,8 +4964,8 @@ packages:
mimic-fn: 4.0.0
dev: false
/openai@4.25.0:
resolution: {integrity: sha512-qLMFOizjxKuDfQkBrczZPYo6XVL4bdcuz9MR11Q+M91kGcs8dQw+O90nRcC+qWuhaGphQkfXQJMn4cd7Yew3Kg==}
/openai@4.28.0:
resolution: {integrity: sha512-JM8fhcpmpGN0vrUwGquYIzdcEQHtFuom6sRCbbCM6CfzZXNuRk33G7KfeRAIfnaCxSpzrP5iHtwJzIm6biUZ2Q==}
hasBin: true
dependencies:
'@types/node': 18.19.8
@ -5236,18 +5204,18 @@ packages:
dependencies:
find-up: 4.1.0
/playwright-core@1.41.1:
resolution: {integrity: sha512-/KPO5DzXSMlxSX77wy+HihKGOunh3hqndhqeo/nMxfigiKzogn8kfL0ZBDu0L1RKgan5XHCPmn6zXd2NUJgjhg==}
/playwright-core@1.41.2:
resolution: {integrity: sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA==}
engines: {node: '>=16'}
hasBin: true
dev: true
/playwright@1.41.1:
resolution: {integrity: sha512-gdZAWG97oUnbBdRL3GuBvX3nDDmUOuqzV/D24dytqlKt+eI5KbwusluZRGljx1YoJKZ2NRPaeWiFTeGZO7SosQ==}
/playwright@1.41.2:
resolution: {integrity: sha512-v0bOa6H2GJChDL8pAeLa/LZC4feoAMbSQm1/jF/ySsWWoaNItvrMP7GEkvEEFyCTUYKMxjQKaTSg5up7nR6/8A==}
engines: {node: '>=16'}
hasBin: true
dependencies:
playwright-core: 1.41.1
playwright-core: 1.41.2
optionalDependencies:
fsevents: 2.3.2
dev: true
@ -5323,6 +5291,15 @@ packages:
picocolors: 1.0.0
source-map-js: 1.0.2
/postcss@8.4.35:
resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==}
engines: {node: ^10 || ^12 || >=14}
dependencies:
nanoid: 3.3.7
picocolors: 1.0.0
source-map-js: 1.0.2
dev: false
/prebuild-install@7.1.1:
resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==}
engines: {node: '>=10'}
@ -5354,16 +5331,16 @@ packages:
which-pm: 2.0.0
dev: false
/prettier-plugin-astro@0.12.3:
resolution: {integrity: sha512-GthUSu3zCvmtVyqlArosez0xE08vSJ0R1sWurxIWpABaCkNGYFANoUdFkqmIo54EV2uPLGcVJzOucWvCjPBWvg==}
/prettier-plugin-astro@0.13.0:
resolution: {integrity: sha512-5HrJNnPmZqTUNoA97zn4gNQv9BgVhv+et03314WpQ9H9N8m2L9OSV798olwmG2YLXPl1iSstlJCR1zB3x5xG4g==}
engines: {node: ^14.15.0 || >=16.0.0}
dependencies:
'@astrojs/compiler': 1.8.2
prettier: 3.2.4
prettier: 3.2.5
sass-formatter: 0.7.8
dev: true
/prettier-plugin-tailwindcss@0.5.11(prettier-plugin-astro@0.12.3)(prettier@3.2.4):
/prettier-plugin-tailwindcss@0.5.11(prettier-plugin-astro@0.13.0)(prettier@3.2.5):
resolution: {integrity: sha512-AvI/DNyMctyyxGOjyePgi/gqj5hJYClZ1avtQvLlqMT3uDZkRbi4HhGUpok3DRzv9z7Lti85Kdj3s3/1CeNI0w==}
engines: {node: '>=14.21.3'}
peerDependencies:
@ -5412,12 +5389,12 @@ packages:
prettier-plugin-twig-melody:
optional: true
dependencies:
prettier: 3.2.4
prettier-plugin-astro: 0.12.3
prettier: 3.2.5
prettier-plugin-astro: 0.13.0
dev: true
/prettier@3.2.4:
resolution: {integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==}
/prettier@3.2.5:
resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==}
engines: {node: '>=14'}
hasBin: true
dev: true
@ -5427,16 +5404,6 @@ packages:
engines: {node: '>=6'}
dev: false
/probe-image-size@7.2.3:
resolution: {integrity: sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==}
dependencies:
lodash.merge: 4.6.2
needle: 2.9.1
stream-parser: 0.3.1
transitivePeerDependencies:
- supports-color
dev: false
/proc-log@3.0.0:
resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@ -5576,18 +5543,18 @@ packages:
loose-envify: 1.4.0
dev: false
/reactflow@11.10.2(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-tqQJfPEiIkXonT3piVYf+F9CvABI5e28t5I6rpaLTnO8YVCAOh1h0f+ziDKz0Bx9Y2B/mFgyz+H7LZeUp/+lhQ==}
/reactflow@11.10.4(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-0CApYhtYicXEDg/x2kvUHiUk26Qur8lAtTtiSlptNKuyEuGti6P1y5cS32YGaUoDMoCqkm/m+jcKkfMOvSCVRA==}
peerDependencies:
react: '>=17'
react-dom: '>=17'
dependencies:
'@reactflow/background': 11.3.7(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
'@reactflow/controls': 11.2.7(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
'@reactflow/core': 11.10.2(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
'@reactflow/minimap': 11.7.7(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
'@reactflow/node-resizer': 2.2.7(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
'@reactflow/node-toolbar': 1.3.7(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
'@reactflow/background': 11.3.9(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
'@reactflow/controls': 11.2.9(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
'@reactflow/core': 11.10.4(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
'@reactflow/minimap': 11.7.9(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
'@reactflow/node-resizer': 2.2.9(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
'@reactflow/node-toolbar': 1.3.9(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
transitivePeerDependencies:
@ -5889,7 +5856,9 @@ packages:
/safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
requiresBuild: true
dev: false
optional: true
/sass-formatter@0.7.8:
resolution: {integrity: sha512-7fI2a8THglflhhYis7k06eUf92VQuJoXzEs2KRP0r1bluFxKFvLx0Ns7c478oYGM0fPfrr846ZRWVi2MAgHt9Q==}
@ -6179,14 +6148,6 @@ packages:
bl: 5.1.0
dev: false
/stream-parser@0.3.1:
resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==}
dependencies:
debug: 2.6.9
transitivePeerDependencies:
- supports-color
dev: false
/streamx@2.15.6:
resolution: {integrity: sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==}
requiresBuild: true
@ -6424,8 +6385,8 @@ packages:
yallist: 4.0.0
dev: false
/terser@5.26.0:
resolution: {integrity: sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==}
/terser@5.27.0:
resolution: {integrity: sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==}
engines: {node: '>=10'}
hasBin: true
dependencies:
@ -6819,7 +6780,42 @@ packages:
fsevents: 2.3.3
dev: false
/vitefu@0.2.5(vite@5.0.12):
/vite@5.1.3:
resolution: {integrity: sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
'@types/node': ^18.0.0 || >=20.0.0
less: '*'
lightningcss: ^1.21.0
sass: '*'
stylus: '*'
sugarss: '*'
terser: ^5.4.0
peerDependenciesMeta:
'@types/node':
optional: true
less:
optional: true
lightningcss:
optional: true
sass:
optional: true
stylus:
optional: true
sugarss:
optional: true
terser:
optional: true
dependencies:
esbuild: 0.19.11
postcss: 8.4.35
rollup: 4.9.6
optionalDependencies:
fsevents: 2.3.3
dev: false
/vitefu@0.2.5(vite@5.1.3):
resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==}
peerDependencies:
vite: ^3.0.0 || ^4.0.0 || ^5.0.0
@ -6827,7 +6823,7 @@ packages:
vite:
optional: true
dependencies:
vite: 5.0.12
vite: 5.1.3
dev: false
/web-namespaces@2.0.1:
@ -6968,7 +6964,7 @@ packages:
resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==}
dev: false
/zustand@4.5.0(@types/react@18.2.48)(react@18.2.0):
/zustand@4.5.0(@types/react@18.2.55)(react@18.2.0):
resolution: {integrity: sha512-zlVFqS5TQ21nwijjhJlx4f9iGrXSL0o/+Dpy4txAP22miJ8Ti6c1Ol1RLNN98BMib83lmDH/2KmLwaNXpjrO1A==}
engines: {node: '>=12.7.0'}
peerDependencies:
@ -6983,7 +6979,7 @@ packages:
react:
optional: true
dependencies:
'@types/react': 18.2.48
'@types/react': 18.2.55
react: 18.2.0
use-sync-external-store: 1.2.0(react@18.2.0)
dev: false

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

@ -31,11 +31,13 @@ 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 Beginner Roadmap](https://roadmap.sh/frontend?r=frontend-beginner)
- [Backend Roadmap](https://roadmap.sh/backend)
- [Backend Roadmap](https://roadmap.sh/backend) / [Backend Beginner Roadmap](https://roadmap.sh/backend?r=backend-beginner)
- [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)
- [Data Structures and Algorithms Roadmap](https://roadmap.sh/datastructures-and-algorithms)
- [AI and Data Scientist Roadmap](https://roadmap.sh/ai-data-scientist)
- [MLOps Roadmap](https://roadmap.sh/mlops)
- [QA Roadmap](https://roadmap.sh/qa)
- [Python Roadmap](https://roadmap.sh/python)
- [Software Architect Roadmap](https://roadmap.sh/software-architect)

@ -11,15 +11,16 @@ async function getSVG(name: string) {
const filepath = `/src/icons/${name}.svg`;
const files = import.meta.glob<string>('/src/icons/**/*.svg', {
query: '?raw',
eager: true,
as: 'raw',
});
if (!(filepath in files)) {
throw new Error(`${filepath} not found`);
}
const root = parse(files[filepath]);
const root = parse(files[filepath].default as string);
const svg = root.querySelector('svg');
@ -35,4 +36,4 @@ const { attributes: baseAttributes, innerHTML } = await getSVG(icon);
const svgAttributes = { ...baseAttributes, ...attributes };
---
<svg {...svgAttributes} set:html={innerHTML}></svg>
<svg {...svgAttributes} set:html={innerHTML} />

@ -0,0 +1,41 @@
import { useState } from 'react';
import { GitHubButton } from './GitHubButton';
import { GoogleButton } from './GoogleButton';
import { LinkedInButton } from './LinkedInButton';
import { EmailLoginForm } from './EmailLoginForm';
import { EmailSignupForm } from './EmailSignupForm';
type AuthenticationFormProps = {
type?: 'login' | 'signup';
};
export function AuthenticationForm(props: AuthenticationFormProps) {
const { type = 'login' } = props;
const [isDisabled, setIsDisabled] = useState(false);
return (
<>
<div className="flex w-full flex-col gap-2">
<GitHubButton isDisabled={isDisabled} setIsDisabled={setIsDisabled} />
<GoogleButton isDisabled={isDisabled} setIsDisabled={setIsDisabled} />
<LinkedInButton isDisabled={isDisabled} setIsDisabled={setIsDisabled} />
</div>
<div className="flex w-full items-center gap-2 py-6 text-sm text-slate-600">
<div className="h-px w-full bg-slate-200" />
OR
<div className="h-px w-full bg-slate-200" />
</div>
{type === 'login' ? (
<EmailLoginForm isDisabled={isDisabled} setIsDisabled={setIsDisabled} />
) : (
<EmailSignupForm
isDisabled={isDisabled}
setIsDisabled={setIsDisabled}
/>
)}
</>
);
}

@ -4,7 +4,14 @@ import { useState } from 'react';
import { httpPost } from '../../lib/http';
import { TOKEN_COOKIE_NAME } from '../../lib/jwt';
export function EmailLoginForm() {
type EmailLoginFormProps = {
isDisabled?: boolean;
setIsDisabled?: (isDisabled: boolean) => void;
};
export function EmailLoginForm(props: EmailLoginFormProps) {
const { isDisabled, setIsDisabled } = props;
const [email, setEmail] = useState<string>('');
const [password, setPassword] = useState<string>('');
const [error, setError] = useState('');
@ -14,6 +21,7 @@ export function EmailLoginForm() {
const handleFormSubmit = async (e: FormEvent<HTMLFormElement>) => {
e.preventDefault();
setIsLoading(true);
setIsDisabled?.(true);
setError('');
const { response, error } = await httpPost<{ token: string }>(
@ -45,6 +53,7 @@ export function EmailLoginForm() {
}
setIsLoading(false);
setIsDisabled?.(false);
setError(error?.message || 'Something went wrong. Please try again later.');
};
@ -92,7 +101,7 @@ export function EmailLoginForm() {
<button
type="submit"
disabled={isLoading}
disabled={isLoading || isDisabled}
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'}

@ -1,7 +1,14 @@
import { type FormEvent, useState } from 'react';
import { httpPost } from '../../lib/http';
export function EmailSignupForm() {
type EmailSignupFormProps = {
isDisabled?: boolean;
setIsDisabled?: (isDisabled: boolean) => void;
};
export function EmailSignupForm(props: EmailSignupFormProps) {
const { isDisabled, setIsDisabled } = props;
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [name, setName] = useState('');
@ -13,6 +20,7 @@ export function EmailSignupForm() {
e.preventDefault();
setIsLoading(true);
setIsDisabled?.(true);
setError('');
const { response, error } = await httpPost<{ status: 'ok' }>(
@ -21,20 +29,21 @@ export function EmailSignupForm() {
email,
password,
name,
}
},
);
if (error || response?.status !== 'ok') {
setIsLoading(false);
setIsDisabled?.(false);
setError(
error?.message || 'Something went wrong. Please try again later.'
error?.message || 'Something went wrong. Please try again later.',
);
return;
}
window.location.href = `/verification-pending?email=${encodeURIComponent(
email
email,
)}`;
};
@ -90,7 +99,7 @@ export function EmailSignupForm() {
<button
type="submit"
disabled={isLoading}
disabled={isLoading || isDisabled}
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'}

@ -5,12 +5,17 @@ import { TOKEN_COOKIE_NAME } from '../../lib/jwt';
import { httpGet } from '../../lib/http';
import { Spinner } from '../ReactIcons/Spinner.tsx';
type GitHubButtonProps = {};
type GitHubButtonProps = {
isDisabled?: boolean;
setIsDisabled?: (isDisabled: boolean) => void;
};
const GITHUB_REDIRECT_AT = 'githubRedirectAt';
const GITHUB_LAST_PAGE = 'githubLastPage';
export function GitHubButton(props: GitHubButtonProps) {
const { isDisabled, setIsDisabled } = props;
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState('');
@ -25,6 +30,7 @@ export function GitHubButton(props: GitHubButtonProps) {
}
setIsLoading(true);
setIsDisabled?.(true);
httpGet<{ token: string }>(
`${import.meta.env.PUBLIC_API_URL}/v1-github-callback${
window.location.search
@ -35,6 +41,7 @@ export function GitHubButton(props: GitHubButtonProps) {
const errMessage = error?.message || 'Something went wrong.';
setError(errMessage);
setIsLoading(false);
setIsDisabled?.(false);
return;
}
@ -73,11 +80,13 @@ export function GitHubButton(props: GitHubButtonProps) {
.catch((err) => {
setError('Something went wrong. Please try again later.');
setIsLoading(false);
setIsDisabled?.(false);
});
}, []);
const handleClick = async () => {
setIsLoading(true);
setIsDisabled?.(true);
const { response, error } = await httpGet<{ loginUrl: string }>(
`${import.meta.env.PUBLIC_API_URL}/v1-github-login`,
@ -89,6 +98,7 @@ export function GitHubButton(props: GitHubButtonProps) {
);
setIsLoading(false);
setIsDisabled?.(false);
return;
}
@ -112,7 +122,7 @@ export function GitHubButton(props: GitHubButtonProps) {
<>
<button
className="inline-flex h-10 w-full items-center justify-center gap-2 rounded border border-slate-300 bg-white p-2 text-sm font-medium text-black outline-none focus:ring-2 focus:ring-[#333] focus:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-60"
disabled={isLoading}
disabled={isLoading || isDisabled}
onClick={handleClick}
>
{isLoading ? (

@ -5,12 +5,17 @@ import { httpGet } from '../../lib/http';
import { Spinner } from '../ReactIcons/Spinner.tsx';
import { GoogleIcon } from '../ReactIcons/GoogleIcon.tsx';
type GoogleButtonProps = {};
type GoogleButtonProps = {
isDisabled?: boolean;
setIsDisabled?: (isDisabled: boolean) => void;
};
const GOOGLE_REDIRECT_AT = 'googleRedirectAt';
const GOOGLE_LAST_PAGE = 'googleLastPage';
export function GoogleButton(props: GoogleButtonProps) {
const { isDisabled, setIsDisabled } = props;
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState('');
@ -25,6 +30,7 @@ export function GoogleButton(props: GoogleButtonProps) {
}
setIsLoading(true);
setIsDisabled?.(true);
httpGet<{ token: string }>(
`${import.meta.env.PUBLIC_API_URL}/v1-google-callback${
window.location.search
@ -34,6 +40,7 @@ export function GoogleButton(props: GoogleButtonProps) {
if (!response?.token) {
setError(error?.message || 'Something went wrong.');
setIsLoading(false);
setIsDisabled?.(false);
return;
}
@ -72,11 +79,13 @@ export function GoogleButton(props: GoogleButtonProps) {
.catch((err) => {
setError('Something went wrong. Please try again later.');
setIsLoading(false);
setIsDisabled?.(false);
});
}, []);
const handleClick = () => {
setIsLoading(true);
setIsDisabled?.(true);
httpGet<{ loginUrl: string }>(
`${import.meta.env.PUBLIC_API_URL}/v1-google-login`,
)
@ -84,6 +93,7 @@ export function GoogleButton(props: GoogleButtonProps) {
if (!response?.loginUrl) {
setError(error?.message || 'Something went wrong.');
setIsLoading(false);
setIsDisabled?.(false);
return;
}
@ -106,6 +116,7 @@ export function GoogleButton(props: GoogleButtonProps) {
.catch((err) => {
setError('Something went wrong. Please try again later.');
setIsLoading(false);
setIsDisabled?.(false);
});
};
@ -113,7 +124,7 @@ export function GoogleButton(props: GoogleButtonProps) {
<>
<button
className="inline-flex h-10 w-full items-center justify-center gap-2 rounded border border-slate-300 bg-white p-2 text-sm font-medium text-black outline-none focus:ring-2 focus:ring-[#333] focus:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-60"
disabled={isLoading}
disabled={isLoading || isDisabled}
onClick={handleClick}
>
{isLoading ? (

@ -5,12 +5,17 @@ import { httpGet } from '../../lib/http';
import { Spinner } from '../ReactIcons/Spinner.tsx';
import { LinkedInIcon } from '../ReactIcons/LinkedInIcon.tsx';
type LinkedInButtonProps = {};
type LinkedInButtonProps = {
isDisabled?: boolean;
setIsDisabled?: (isDisabled: boolean) => void;
};
const LINKEDIN_REDIRECT_AT = 'linkedInRedirectAt';
const LINKEDIN_LAST_PAGE = 'linkedInLastPage';
export function LinkedInButton(props: LinkedInButtonProps) {
const { isDisabled, setIsDisabled } = props;
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState('');
@ -25,6 +30,7 @@ export function LinkedInButton(props: LinkedInButtonProps) {
}
setIsLoading(true);
setIsDisabled?.(true);
httpGet<{ token: string }>(
`${import.meta.env.PUBLIC_API_URL}/v1-linkedin-callback${
window.location.search
@ -34,6 +40,7 @@ export function LinkedInButton(props: LinkedInButtonProps) {
if (!response?.token) {
setError(error?.message || 'Something went wrong.');
setIsLoading(false);
setIsDisabled?.(false);
return;
}
@ -72,11 +79,13 @@ export function LinkedInButton(props: LinkedInButtonProps) {
.catch((err) => {
setError('Something went wrong. Please try again later.');
setIsLoading(false);
setIsDisabled?.(false);
});
}, []);
const handleClick = () => {
setIsLoading(true);
setIsDisabled?.(true);
httpGet<{ loginUrl: string }>(
`${import.meta.env.PUBLIC_API_URL}/v1-linkedin-login`,
)
@ -84,6 +93,7 @@ export function LinkedInButton(props: LinkedInButtonProps) {
if (!response?.loginUrl) {
setError(error?.message || 'Something went wrong.');
setIsLoading(false);
setIsDisabled?.(false);
return;
}
@ -106,6 +116,7 @@ export function LinkedInButton(props: LinkedInButtonProps) {
.catch((err) => {
setError('Something went wrong. Please try again later.');
setIsLoading(false);
setIsDisabled?.(false);
});
};
@ -113,7 +124,7 @@ export function LinkedInButton(props: LinkedInButtonProps) {
<>
<button
className="inline-flex h-10 w-full items-center justify-center gap-2 rounded border border-slate-300 bg-white p-2 text-sm font-medium text-black outline-none focus:ring-2 focus:ring-[#333] focus:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-60"
disabled={isLoading}
disabled={isLoading || isDisabled}
onClick={handleClick}
>
{isLoading ? (

@ -1,14 +1,10 @@
---
import Popup from '../Popup/Popup.astro';
import { EmailLoginForm } from './EmailLoginForm';
import Divider from './Divider.astro';
import { GitHubButton } from './GitHubButton';
import { GoogleButton } from './GoogleButton';
import { LinkedInButton } from './LinkedInButton';
import { AuthenticationForm } from './AuthenticationForm';
---
<Popup id='login-popup' title='' subtitle=''>
<div class='text-center'>
<div class='mb-7 text-center'>
<p class='mb-3 text-2xl font-semibold leading-5 text-slate-900'>
Login to your account
</p>
@ -16,19 +12,9 @@ import { LinkedInButton } from './LinkedInButton';
You must be logged in to perform this action.
</p>
</div>
<div class='mt-7 flex flex-col gap-2'>
<GitHubButton client:load />
<GoogleButton client:load />
<LinkedInButton client:load />
</div>
<Divider />
<EmailLoginForm client:load />
<AuthenticationForm client:load />
<div class='mt-6 text-center text-sm text-slate-600'>
Don't have an account?{' '}
<a href='/signup' class='font-medium text-[#4285f4]'>Sign up</a>
<a href='/signup' class='font-medium text-[#4285f4]'> Sign up</a>
</div>
</Popup>

@ -48,11 +48,10 @@ const {
{
isNew && (
<span class='absolute bottom-1.5 right-2 flex items-center rounded-br rounded-tl text-xs font-medium text-purple-300'>
<span class='mr-1.5 flex h-2 w-2'>
<span class='flex h-2 w-2'>
<span class='absolute inline-flex h-2 w-2 animate-ping rounded-full bg-purple-400 opacity-75' />
<span class='relative inline-flex h-2 w-2 rounded-full bg-purple-500' />
</span>
New
</span>
)
}

@ -105,6 +105,7 @@ import Icon from './AstroIcon.astro';
class='my-1.5 mr-auto sm:ml-auto sm:mr-0'
width='200'
height='24.8'
loading="lazy"
/>
</a>
<p class='my-4 text-slate-300/60'>

@ -16,6 +16,25 @@ import { AccountDropdown } from './AccountDropdown';
<Icon icon='logo' />
</a>
<a
target='_blank'
rel='noreferrer nofollow'
href='https://boards.greenhouse.io/insightmediagroupllc/jobs/4002116008'
class='group inline sm:hidden relative !mr-2 text-blue-300 hover:text-white'
>
We're Hiring
<span class='absolute -right-[11px] top-0'>
<span class='relative flex h-2 w-2'>
<span
class='absolute inline-flex h-full w-full animate-ping rounded-full bg-sky-400 opacity-75'
></span>
<span class='relative inline-flex h-2 w-2 rounded-full bg-sky-500'
></span>
</span>
</span>
</a>
<!-- Desktop navigation items -->
<div class='hidden space-x-5 sm:flex sm:items-center'>
<NavigationDropdown client:load />
@ -23,9 +42,27 @@ import { AccountDropdown } from './AccountDropdown';
Start Here
</a>
<a href='/teams' class='text-gray-400 hover:text-white'> Teams</a>
<a
target='_blank'
rel='noreferrer nofollow'
href='https://boards.greenhouse.io/insightmediagroupllc/jobs/4002116008'
class='group relative !mr-2 text-blue-300 hover:text-white'
>
We're Hiring
<span class='absolute -right-[11px] top-0'>
<span class='relative flex h-2 w-2'>
<span
class='absolute inline-flex h-full w-full animate-ping rounded-full bg-sky-400 opacity-75'
></span>
<span class='relative inline-flex h-2 w-2 rounded-full bg-sky-500'
></span>
</span>
</span>
</a>
<button
data-command-menu
class='hidden items-center rounded-md border border-gray-800 px-2.5 py-1.5 text-sm text-gray-400 hover:cursor-pointer hover:bg-gray-800 sm:flex'
class='hidden items-center rounded-md border border-gray-800 px-2.5 py-1.5 text-sm text-gray-400 hover:cursor-pointer hover:bg-gray-800 md:flex'
>
<Icon icon='search' class='h-3 w-3' />
<span class='ml-2'>Search</span>

@ -1,42 +1,34 @@
---
import { getFormattedStars } from '../lib/github';
import Icon from './AstroIcon.astro';
import { getDiscordInfo } from '../lib/discord';
import OpenSourceStat from './OpenSourceStat.astro';
const starCount = await getFormattedStars('kamranahmedse/developer-roadmap');
const discordInfo = await getDiscordInfo();
---
<div class='py-6 sm:py-16 border-b border-t text-left sm:text-center bg-white'>
<div class='!max-w-[600px] container'>
<p class='text-2xl sm:text-5xl font-bold'>Community</p>
<p class='text-gray-600 text-sm sm:text-lg leading-relaxed my-2.5 sm:my-5'>
<div class='border-b border-t bg-white py-6 text-left sm:py-16 sm:text-center'>
<div class='container !max-w-[650px]'>
<p class='text-2xl font-bold sm:text-5xl'>Join the Community</p>
<p class='my-2.5 text-sm leading-relaxed text-gray-600 sm:my-5 sm:text-lg'>
roadmap.sh is the <a
href='https://github.com/search?o=desc&q=stars%3A%3E100000&s=stars&type=Repositories'
target='_blank'
class='font-medium text-gray-600 hover:text-black underline underline-offset-2'
class='font-medium text-gray-600 underline underline-offset-2 hover:text-black'
>6th most starred project on GitHub</a
> and is visited by hundreds of thousands of developers every month.
</p>
<div class='flex justify-start flex-col sm:flex-row sm:justify-center gap-2 sm:gap-3 mb-1.5 sm:mb-0'>
<a
href='https://github.com/kamranahmedse/developer-roadmap'
target='_blank'
class='inline-flex items-center border border-black py-1.5 px-3 rounded-lg text-sm hover:text-white hover:bg-black bg-white'
>
<Icon icon='star' class='mr-1 -ml-1 fill-current' />
<span class='lowercase'>{starCount}</span>
<span class='ml-2 hover:block'>GitHub Stars</span>
</a>
<a
href="https://discord.gg/cJpEt5Qbwa"
target='_blank'
class='relative pointer inline-flex items-center border border-black py-1.5 px-3 rounded-lg text-sm hover:text-white hover:bg-black bg-white group'
>
<Icon icon='discord' class='h-[14px] mr-2 -ml-1 fill-current' />
Join on Discord
</a>
<div
class='mt-5 grid grid-cols-1 justify-between gap-2 divide-x-0 sm:my-11 sm:grid-cols-3 sm:gap-0 sm:divide-x'
>
<OpenSourceStat text='GitHub Stars' value={starCount} />
<OpenSourceStat text='Registered Users' value={'850k'} />
<OpenSourceStat
text='Discord Members'
value={discordInfo.totalFormatted}
/>
</div>
</div>
</div>

@ -0,0 +1,105 @@
---
import { ChevronUp } from 'lucide-react';
import Icon from './AstroIcon.astro';
export interface Props {
value: string;
text: string;
}
const { value, text } = Astro.props;
const isGitHubStars = text.toLowerCase() === 'github stars';
const isRegistered = text.toLowerCase() === 'registered users';
const isDiscordMembers = text.toLowerCase() === 'discord members';
---
<div
class='flex items-start sm:items-center justify-start flex-col sm:justify-center sm:gap-0 gap-2 sm:bg-transparent bg-gray-200 sm:rounded-none rounded-xl p-4'
>
{
isGitHubStars && (
<p class='flex items-center text-sm text-blue-500 sm:flex'>
<span class='rounded-md bg-blue-500 px-1 text-white'>Rank 6th</span>
&nbsp;out of 28M!
</p>
)
}
{
isRegistered && (
<p class='flex items-center text-sm text-blue-500 sm:flex'>
<span class='mr-1.5 rounded-md bg-blue-500 px-1 text-white'>+55k</span>
every month
</p>
)
}
{
isDiscordMembers && (
<p class='flex items-center text-sm text-blue-500 sm:flex'>
<span class='mr-1.5 rounded-md bg-blue-500 px-1 text-white'>+1.5k</span>
every month
</p>
)
}
<div class="flex flex-row items-center sm:flex-col my-1 sm:my-0">
<p
class='relative my-0 sm:my-4 mr-1 sm:mr-0 text-base font-bold lowercase sm:w-auto sm:text-5xl'
>
{value}
</p>
<p class='mb-0 mt-0 text-base sm:text-xs tracking-wide text-black sm:-mt-3 sm:mb-5'>
{text}
</p>
</div>
{
isGitHubStars && (
<a
href='https://github.com/kamranahmedse/developer-roadmap'
target='_blank'
class='group mt-0 flex flex-col items-center rounded-lg border border-black bg-white px-3 py-2 text-sm hover:bg-black hover:text-white'
>
<div class='mb-0.5 flex items-center font-semibold'>
<Icon icon='star' class='-ml-1 fill-current' />
<span class='ml-1.5 hover:block'>Star us on GitHub</span>
</div>
<span class='text-xs text-gray-500 group-hover:text-gray-100'>
Help us reach #1
</span>
</a>
)
}
{
isRegistered && (
<a
href='/signup'
class='group mt-0 flex flex-col items-center rounded-lg border border-black bg-white px-3 py-2 text-sm hover:bg-black hover:text-white'
>
<div class='mb-0.5 flex items-center font-semibold'>
<Icon icon='users' class='-ml-1 h-[15px] fill-current' />
<span class='ml-1 hover:block'>Register yourself</span>
</div>
<span class='text-xs text-gray-500 group-hover:text-gray-100'>
Commit to your growth
</span>
</a>
)
}
{
isDiscordMembers && (
<a
href='https://discord.gg/cJpEt5Qbwa'
target='_blank'
class='group mt-0 flex flex-col items-center rounded-lg border border-black bg-white px-3 py-2 text-sm hover:bg-black hover:text-white'
>
<div class='mb-0.5 flex items-center font-semibold'>
<Icon icon='discord' class='-ml-1 h-[13px] fill-current' />
<span class='ml-1 hover:block'>Join on Discord</span>
</div>
<span class='text-xs text-gray-500 group-hover:text-gray-100'>
Join the community
</span>
</a>
)
}
</div>

@ -10,7 +10,7 @@ export function TeamAnnouncement(props: TeamAnnouncementProps) {
New
</span>{' '}
<span className={'hidden sm:inline'}>Announcing roadmaps for teams. <span className='font-semibold'>Learn more!</span></span>
<span className={'inline sm:hidden'}>Announcing roadmaps for teams!</span>
<span className={'inline text-sm sm:hidden'}>Roadmaps for teams!</span>
</a>
);
}

@ -1,7 +1,3 @@
# Hateoas
HATEOAS is an acronym for <b>H</b>ypermedia <b>A</b>s <b>T</b>he <b>E</b>ngine <b>O</b>f <b>A</b>pplication <b>S</b>tate, it's the concept that when sending information over a RESTful API the document received should contain everything the client needs in order to parse and use the data i.e they don't have to contact any other endpoint not explicitly mentioned within the Document
Visit the following resources to learn more:
- [Oktane17: Designing Beautiful REST + JSON APIs (3:56 - 5:57)](https://youtu.be/MiOSzpfP1Ww?t=236)
HATEOAS is an acronym for <b>H</b>ypermedia <b>A</b>s <b>T</b>he <b>E</b>ngine <b>O</b>f <b>A</b>pplication <b>S</b>tate, it's the concept that when sending information over a RESTful API the document received should contain everything the client needs in order to parse and use the data i.e they don't have to contact any other endpoint not explicitly mentioned within the Document.

@ -7,4 +7,3 @@ Visit the following resources to learn more:
- [Blockchain Fork](<https://en.wikipedia.org/wiki/Fork_(blockchain)>)
- [What is a fork?](https://www.coinbase.com/learn/crypto-basics/what-is-a-fork)
- [What Is a Hard Fork?](https://www.investopedia.com/terms/h/hard-fork.asp)
- [Blockchain Forking](https://www.youtube.com/watch?v=bu1gcyyfz7w)

@ -0,0 +1,16 @@
# JavaScript
JavaScript allows you to add interactivity to your pages. Common examples that you may have seen on the websites are sliders, click interactions, popups and so on. Apart from being used on the frontend in browsers, there is Node.js which is an open-source, cross-platform, back-end JavaScript runtime environment that runs on the V8 engine and executes JavaScript code outside a web browser.
Visit the following resources to learn more:
- [Visit Dedicated JavaScript Roadmap](/javascript)
- [W3Schools – JavaScript Tutorial](https://www.w3schools.com/js/)
- [The Modern JavaScript Tutorial](https://javascript.info/)
- [Codecademy - Learn JavaScript](https://www.codecademy.com/learn/introduction-to-javascript)
- [JavaScript Crash Course for Beginners](https://youtu.be/hdI2bqOjy3c)
- [Node.js Crash Course](https://www.youtube.com/watch?v=fBNz5xF-Kx4)
- [Node.js Tutorial for Beginners](https://www.youtube.com/watch?v=TlB_eWDSMt4)
- [W3Schools – Node.js Tutorial](https://www.w3schools.com/nodejs/)
- [What is NPM?](https://www.w3schools.com/nodejs/nodejs_npm.asp)
- [Official Documentation](https://nodejs.org/en/learn/getting-started/introduction-to-nodejs)

@ -0,0 +1,13 @@
# Java
Java is general-purpose language, primarily used for Internet-based applications.
It was created in 1995 by James Gosling at Sun Microsystems and is one of the most popular options for backend developers.
Visit the following resources to learn more:
- [Visit Dedicated Java Roadmap](/java)
- [Java Website](https://www.java.com/)
- [Codeacademy - Free Course](https://www.codecademy.com/learn/learn-java)
- [W3 Schools Tutorials](https://www.w3schools.com/java/)
- [Java Crash Course](https://www.youtube.com/watch?v=eIrMbAQSU34)
- [Complete Java course](https://www.youtube.com/watch?v=xk4_1vDrzzo)

@ -0,0 +1,14 @@
# Go
Go is an open source programming language supported by Google. Go can be used to write cloud services, CLI tools, used for API development, and much more.
Visit the following resources to learn more:
- [Visit Dedicated Go Roadmap](/golang)
- [A Tour of Go – Go Basics](https://go.dev/tour/welcome/1)
- [Go Reference Documentation](https://go.dev/doc/)
- [Go by Example - annotated example programs](https://gobyexample.com/)
- [Learn Go | Codecademy](https://www.codecademy.com/learn/learn-go)
- [W3Schools Go Tutorial ](https://www.w3schools.com/go/)
- [Making a RESTful JSON API in Go](https://thenewstack.io/make-a-restful-json-api-go/)
- [Go, the Programming Language of the Cloud](https://thenewstack.io/go-the-programming-language-of-the-cloud/)

@ -0,0 +1,10 @@
# C#
C# (pronounced "C sharp") is a general purpose programming language made by Microsoft. It is used to perform different tasks and can be used to create web apps, games, mobile apps, etc.
Visit the following resources to learn more:
- [C# Learning Path](https://docs.microsoft.com/en-us/learn/paths/csharp-first-steps/?WT.mc_id=dotnet-35129-website)
- [C# on W3 schools](https://www.w3schools.com/cs/index.php)
- [Introduction to C#](https://docs.microsoft.com/en-us/shows/CSharp-101/?WT.mc_id=Educationalcsharp-c9-scottha)
- [C# tutorials](https://www.youtube.com/watch?v=gfkTfcpWqAY&list=PLTjRvDozrdlz3_FPXwb6lX_HoGXa09Yef)

@ -0,0 +1,8 @@
# C++
C++ is a powerful general-purpose programming language. It can be used to develop operating systems, browsers, games, and so on. C++ supports different ways of programming like procedural, object-oriented, functional, and so on. This makes C++ powerful as well as flexible.
Visit the following resources to learn more:
- [Learn Cpp](https://learncpp.com/)
- [C++ Reference](https://en.cppreference.com/)

@ -0,0 +1,18 @@
# Python
Python is a well known programming language which is both a strongly typed and a dynamically typed language. Being an interpreted language, code is executed as soon as it is written and the Python syntax allows for writing code in functional, procedural or object-oriented programmatic ways.
Visit the following resources to learn more:
- [Visit Dedicated Python Roadmap](/python)
- [Python Website](https://www.python.org/)
- [Python Getting Started](https://www.python.org/about/gettingstarted/)
- [Automate the Boring Stuff](https://automatetheboringstuff.com/)
- [FreeCodeCamp.org - How to Learn Python ? ](https://www.freecodecamp.org/news/how-to-learn-python/)
- [Python principles - Python basics](https://pythonprinciples.com/)
- [W3Schools - Python Tutorial ](https://www.w3schools.com/python/)
- [Python Crash Course](https://ehmatthes.github.io/pcc/)
- [Codecademy - Learn Python 2](https://www.codecademy.com/learn/learn-python)
- [An Introduction to Python for Non-Programmers](https://thenewstack.io/an-introduction-to-python-for-non-programmers/)
- [Getting Started with Python and InfluxDB](https://thenewstack.io/getting-started-with-python-and-influxdb/)
- [Python for Beginners - Learn Python in 1 Hour](https://www.youtube.com/watch?v=kqtD5dpn9C8&ab_channel=ProgrammingwithMosh)

@ -0,0 +1,10 @@
# Rust
Rust is a modern systems programming language focusing on safety, speed, and concurrency. It accomplishes these goals by being memory safe without using garbage collection.
Visit the following resources to learn more:
- [The Rust Programming Language - online book](https://doc.rust-lang.org/book/)
- [Rust by Example - collection of runnable examples](https://doc.rust-lang.org/stable/rust-by-example/index.html)
- [Rust vs. Go: Why They’re Better Together](https://thenewstack.io/rust-vs-go-why-theyre-better-together/)
- [Rust by the Numbers: The Rust Programming Language in 2021](https://thenewstack.io/rust-by-the-numbers-the-rust-programming-language-in-2021/)

@ -0,0 +1,10 @@
# Ruby
Ruby is a high-level, interpreted programming language that blends Perl, Smalltalk, Eiffel, Ada, and Lisp. Ruby focuses on simplicity and productivity along with a syntax that reads and writes naturally. Ruby supports procedural, object-oriented and functional programming and is dynamically typed.
Visit the following resources to learn more:
- [Ruby Website](https://www.ruby-lang.org/en/)
- [Learn Ruby in 20 minutes](https://www.ruby-lang.org/en/documentation/quickstart/)
- [Learn Ruby | Codecademy](https://www.codecademy.com/learn/learn-ruby)
- [Ruby, An Introduction to a Programmer’s Best Friend](https://thenewstack.io/ruby-a-programmers-best-friend/)

@ -0,0 +1,3 @@
# Pick a Language
Pick a programming language to practice data structures and algorithms with. You should pick a language that you are comfortable with or plan to adopt.

@ -0,0 +1,5 @@
# Language Syntax
Language syntax refers to the set of rules that dictate how programs written in a particular programming language must be structured. This can include rules for how to declare variables, how to call functions, how to structure control flow statements, and so on. Syntax varies significantly between different programming languages, so it is critical to grasp the specific syntax of the language you are using. It’s similar to grammar in human languages - putting words in the wrong order or including extraneous punctuation can make a sentence hard to understand, and the same applies to programming. Incorrect syntax leads to syntax errors which prevent your code from executing.
Learn the language syntax of the programming language you are using.

@ -0,0 +1,3 @@
# Control Structures
Control structures are fundamental elements in most programming languages that facilitate the flow of control through a program. There are three main types of control structures: Sequential, Selection and Iteration. Sequential control structures are the default mode where instructions happen one after another. Selection control structures (often called "conditional" or "decision" structures) allow one set of instructions to be executed if a condition is true and another if it's false. These typically include `if...else` statements. Iteration control structures (also known as "loops") allow a block of code to be repeated multiple times. Common loop structures include `for`, `while`, and `do...while` loops. All these control structures play a vital role in shaping the program logic.

@ -0,0 +1,3 @@
# Functions
Functions in programming are named sections of a program that perform a specific task. They allow us to write a piece of code once and reuse it in different places throughout the program, making our code more modular and easier to maintain. Functions often take in input, do something with it, and return output. Functions can be categorized into four main types: built-in functions (like `print()`, provided by the programming language), user-defined functions (written by the user for a specific use case), anonymous functions (also known as lambda functions, which are not declared using the standard `def` keyword), and higher-order functions (functions that take other functions as arguments or return a function).

@ -0,0 +1,3 @@
# OOP Basics
Object-oriented programming (OOP) is a programming paradigm that uses "objects" to design applications and software. In OOP, each object is an instance of a class. A class defines the properties (often known as attributes or fields) and methods (actions) that are common to all objects of a certain kind. A key principle of OOP is the ability to hide certain parts of the objects’ data from the outside, a concept known as encapsulation. Other key principles are inheritance, a way to form new classes using classes that have already been defined, and polymorphism, the concept of designing objects to share behaviors and being able to override shared behaviors with specifics.

@ -0,0 +1,3 @@
# Pseudo Code
Pseudo code is a plain language description of the steps in an algorithm or another system. It is intended for human reading rather than machine reading. Pseudo code often uses control structures and terms common to popular high-level programming languages without strictly adhering to the syntax of any particular one. The foremost aim of pseudocode is to explain the inner "algorithmic thinking" behind coding, rather than focusing on the syntax of a particular language. A nice feature of pseudocode is that it is largely able to be understood by a wider range of people than the corresponding code in a specific programming language, which enhances its roles in drafting, documentation, learning, and collaboration aspects.

@ -0,0 +1,3 @@
# Programming Fundamentals
Programming Fundamentals are the basic concepts and principles that form the foundation of any computer programming language. These include understanding variables, which store data for processing, control structures such as loops and conditional statements that direct the flow of a program, data structures which organize and store data efficiently, and algorithms which step by step instructions to solve specific problems or perform specific tasks. Mastery of these fundamentals forms the basis for learning any specific programming language and for writing efficient, effective code.

@ -0,0 +1,3 @@
# What are Data Structures?
Data structures are specialized formats for organizing and storing data in a computer so that it can be used efficiently. They provide a means to manage large amounts of data efficiently for uses such as large databases and internet indexing services. They are critical to programming and are used in almost all software systems including web development, operating systems, image editing, and much more. Some common types of data structures are arrays, linked lists, queues, stacks, trees, and graphs. The choice of the data structure often begins from the choice of an abstract data type, a broad type encapsulating various possible data structures."

@ -0,0 +1,3 @@
# Importance of Data Structures
Data structures are crucial in the field of computer science and coding because they offer a method of organizing and storing data in an efficient and manageable format. They're critical because they form the foundation for modern algorithm design. Your ability to choose or design the most suited data structure for a particular task can be the difference between a solution that's functional and efficient and one that isn't. They allow data to be processed in a variety of ways - stored, sorted, ordered, or accessed - which is integral to software or database development. By implementing effective data structures, programmers can enhance performance, ease coding procedures, allow flexibility of data and most importantly, reduce complexity of code in a significant manner. Markdown offers the advantage of clear, straightforward formatting to express these concepts.

@ -0,0 +1,3 @@
# Data Structures
Data Structures are a fundamental element of computer science. They provide a specific way to organize and store data so that it can be accessed and used efficiently. Different types of data structures include arrays, linked lists, stacks, queues, hash tables, trees, and graphs. Each of these has its unique characteristics and use-cases, and is optimal for certain kinds of operations. For example, arrays are excellent for random access, while linked lists work well for frequent insertions and deletions. The correct choice of data structure can significantly enhance the performance of your programs.

@ -0,0 +1,3 @@
# Array
An **Array** is a linear data structure that holds elements of the same type, which means we can store only a specific type of elements in the array. It uses contiguous memory space to store elements. In an array, we can directly access any element based on its index which makes it an efficient data structure. Arrays have two types: one-dimensional and multi-dimensional. In a one-dimensional array, data is stored in a linear form while a multi-dimensional array can store data in the form of a matrix or in 3-D format.

@ -0,0 +1,3 @@
# Linked Lists
Linked Lists are a type of data structure used for storing collections of data. The data is stored in nodes, each of which contains a data field and a reference (link) to the next node in the sequence. Structurally, a linked list is organized into a sequence or chain of nodes, hence the name. Two types of linked lists are commonly used: singly linked lists, where each node points to the next node and the last node points to null, and doubly linked lists, where each node has two links, one to the previous node and another one to the next. Linked Lists are used in other types of data structures like stacks and queues.

@ -0,0 +1,11 @@
# Stacks
A **stack** is a linear data structure that follows a particular order in which the operations are performed. The order may be LIFO (Last In First Out) or FILO (First In Last Out). Mainly three basic operations are performed in the stack:
1. **Push**: adds an element to the collection.
2. **Pop**: removes an element from the collection. A pop can result in stack underflow if the stack is empty.
3. **Peek** or **Top**: returns the top item without removing it from the stack.
The basic principle of stack operation is that in a stack, the element that is added last is the first one to come off, thus the name "Last in First Out".

@ -0,0 +1,3 @@
# Queues
Queues are a type of data structure in which elements are held in a sequence and access is restricted to one end. Elements are added ("enqueued") at the rear end and removed ("dequeued") from the front. This makes queues a First-In, First-Out (FIFO) data structure. This type of organization is particularly useful for specific situations such as printing jobs, handling requests in a web server, scheduling tasks in a system, etc. Due to its FIFO property, once a new element is inserted into the queue, all elements that were inserted before the new element must be removed before the new element can be invoked. The fundamental operations associated with queues include Enqueue (insert), Dequeue (remove) and Peek (get the top element).

@ -0,0 +1,3 @@
# Hash Tables
`Hash Tables` are specialized data structures that allow fast access to data based on a key. Essentially, a hash table works by taking a key input, and then computes an index into an array in which the desired value can be found. It uses a hash function to calculate this index. Suppose the elements are integers and the hash function returns the value at the unit's place. If the given key is 22, it will check the value at index 2. Collisions occur when the hash function returns the same output for two different inputs. There are different methods to handle these collisions such as chaining and open addressing.

@ -0,0 +1,9 @@
# Basic Data Structures
The five main types of basic data structures are: **Arrays**, **Linked Lists**, **Stacks**, **Queues**, and **Hash Tables**.
- **Arrays** are static data structures that store elements of the same type in contiguous memory locations.
- **Linked Lists** are dynamic data structures that store elements in individual nodes, with each node pointing to the next.
- **Stacks** follow the Last-In-First-Out principle (LIFO) and primarily assist in function calls in most programming languages.
- **Queues** operate on the First-In-First-Out principle (FIFO) and are commonly used in task scheduling.
- Lastly, **Hash Tables** store key-value pairs allowing for fast insertion, deletion, and search operations.

@ -0,0 +1,3 @@
# Time vs Space Complexity
In the context of algorithmic complexity, "time" refers to the amount of computational time that the algorithm takes to execute, while "space" refers to the amount of memory that the algorithm needs to complete its operation. The time complexity of an algorithm quantifies the amount of time taken by an algorithm to run, as a function of the size of the input to the program. The space complexity of an algorithm quantifies the amount of space or memory taken by an algorithm to run, as a function of the size of the input to the program. It's important to note that time and space are often at odds with each other; optimizing an algorithm to be quicker often requires taking up more memory, and decreasing memory usage can often make the algorithm slower. This is known as the space-time tradeoff.

@ -0,0 +1,3 @@
# How to Calculate Complexity?
The process of calculating algorithmic complexity, often referred to as Big O notation, involves counting the operations or steps an algorithm takes in function of the size of its input. The aim is to identify the worst-case, average-case, and best-case complexity. Generally, the main focus is on the worst-case scenario which represents the maximum number of steps taken by an algorithm. To calculate it, you consider the highest order of size (n) in your algorithm's steps. For instance, if an algorithm performs a loop 5 times for 'n' items, and then does 3 unrelated steps, it has a complexity of O(n), because the linear steps grow faster than constant ones as n increases. Other complexities include O(1) for constant complexity, O(n) for linear complexity, O(n^2) for quadratic complexity, and so on, based on how the steps increase with size.

@ -0,0 +1,3 @@
# Constant
Constant time complexity is denoted as O(1). This means the running time of the algorithm remains constant, regardless of the size of the input data set. Whether you're working with an array of 10 elements or 1 million, if an operation takes the same amount of time regardless of the size of the array, it is said to have a constant time complexity. For example, accessing any element in an array by index is an O(1) operation, as the access operation takes the same amount of time regardless of the position of the element in the array.

@ -0,0 +1,3 @@
# Logarithmic
Logarithmic time complexity (O(log n)) often indicates that the algorithm halves the size of the input at each step. It's more efficient compared to linear time complexity. Binary search is a classic example of logarithmic time complexity where at every step, the algorithm breaks the list into half until it finds the desired element. As the size of the input increases, the growth of the time taken by an algorithm with logarithmic complexity grows slowly because it divides the problem into smaller parts in each step.

@ -0,0 +1,3 @@
# Linear
Linear time complexity, denoted as O(n), is one of the best possible algorithmic performance situations. An algorithm is said to have a linear time complexity when the running time increases at most linearly with the size of the input data. This means that if you double the size of the input, the running time will at most double as well. In an ideal situation, every single element in the data set should be viewed exactly once. Sorting algorithms such as counting sort and bucket sort have linear time complexity under certain conditions.

@ -0,0 +1,3 @@
# Polynomial
Polynomial time complexity, denoted as O(n^k), is a class of time complexity that represents the amount of time an algorithm takes to run as being proportional to the size of the input data raised to a constant power 'k'. Polynomial time complexity includes runtimes like O(n), O(n^2), O(n^3), etc. The value 'n' is a representation of the size of the input, while 'k' represents a constant. Algorithms running in polynomial time are considered to be reasonably efficient for small and medium-sized inputs, but can become impractical for large input sizes due to the rapid growth rate of function.

@ -0,0 +1,3 @@
# Exponential
Exponential time complexity is denoted as `O(2^n)`, where a growth in `n` leads to an exponential growth in the number of steps required to complete a task. It means that the time complexity will double with every additional element in the input set. This is seen in many recursive algorithms, where a problem is divided into two sub-problems of the same type. Examples of such algorithms include the naive recursive approach for the Fibonacci sequence or the Towers of Hanoi problem. Although exponential time complexity solutions are often simpler to implement, they are inefficient for larger input sizes.

@ -0,0 +1,3 @@
# Factorial
Factorial, often denoted as `n!`, is a mathematical operation. In the context of computer science and algorithm complexity, it represents an extremely high growth rate. This occurs because of the way a factorial is calculated: The product of all positive integers less than or equal to a non-negative integer `n`. Thus, if an algorithm has a complexity of O(n!), it means the running time increases factorially based on the size of the input data set. That is, for an input of size `n`, the algorithm does `n` * `(n-1)` * `(n-2)` * ... * `1` operations. O(n!) is essentially the worst case scenario of complexity for an algorithm and is seen in brute-force search algorithms, such as the traveling salesman problem via brute-force.

@ -0,0 +1,13 @@
# Common Runtimes
Common runtimes are used to quantify the performance of an algorithm as the size of the input data increases. They are usually expressed in Big O notation such as:
- **O(1)**: Constant time complexity, the algorithm will always execute in the same time regardless of the size of the input data set.
- **O(N)**: Linear time complexity, the running time increases linearly with the size of the input data.
- **O(log N)**: Logarithmic time complexity, the running time increases logarithmically with the size of the input data set.
- **O(N log N)**: Quasilinear time complexity, slightly worse than linear but better than polynomial.
- **O(N^2)**: Quadratic time complexity, the running time increases quadratically with the size of the input data.
- **O(N^3)**: Cubic time complexity, the running time increases cubically with the size of the input.
- **O(2^N)**, **O(N!)**: Exponential and factorial time complexities respectively, the running time grows very quickly with the size of the input.
Each of these represent different classes of algorithms and the increase in their running time as the size of input increases. Algorithms with lesser time complexity are generally preferred as they scale better with larger input sizes.

@ -0,0 +1,3 @@
# Big O Notation
"Big O" notation, officially known as O-notation, is used in computer science to describe the performance or complexity of an algorithm. Specifically, it provides an upper bound on the time complexity, describing the worst-case scenario. Thus, it gives an upper limit on the time taken for an algorithm to complete based on the size of the input. The notation is expressed as O(f(n)), where f(n) is a function that measures the largest count of steps that an algorithm could possibly take to solve a problem of size n. For instance, O(n) denotes a linear relationship between the time taken and the input size, while O(1) signifies constant time complexity, i.e., the time taken is independent of input size. Remember, Big O notation is only an approximation meant to describe the scaling of the algorithm and not the exact time taken.

@ -0,0 +1,3 @@
# Big-θ Notation
Big Theta \(\Theta\) notation is used in computer science to describe an asymptotic tight bound on a function. This essentially means it provides both an upper and lower bound for a function. When we say a function f(n) is \(\Theta(g(n))\), we mean that the growth rate of f(n) is both bounded above and below by the function g(n) after a certain point. This is more precise than Big O and Big Omega notation, which provide only an upper and a lower bound, respectively. Big Theta notation tells us exactly how a function behaves for large input values. For example, if an algorithm has a time complexity of \(\Theta(n^2)\), it means the running time will increase quadratically with the input size.

@ -0,0 +1,3 @@
# Big-Ω Notation
The Big Omega (Ω) notation is used in computer science to describe an algorithm's lower bound. Essentially, it provides a worst-case analysis of an algorithm's efficiency, giving us a lower limit of the performance. If we say a function f(n) is Ω(g(n)), it means that from a certain point onwards (n0 for some constant n0), the value of g(n) is a lower bound on f(n). It implies that f(n) is at least as fast as g(n) past a certain threshold. This means that the algorithm won't perform more efficiently than the Ω time complexity suggests.

@ -0,0 +1,3 @@
# Asymptotic Notation
In computer science, **asymptotic notation** is used to describe the efficiency of algorithms for large inputs. It is the mathematical notation of the growth rate of an algorithm's time complexity. The most commonly used notations are *O-notation* (Big O), *Ω-notation* (Omega), and *Θ-notation* (Theta). Big O notation provides an upper bound of the complexity in the worst-case, giving an approximated maximum amount of time taken by an algorithm for any input. Omega notation provides a lower bound of the complexity in the best-case, whereas Theta notation defines a tight bound giving both the lower and upper bound. These notational systems allow for a comparison of the efficiency of algorithms without considering the effect of hardware or software related factors.

@ -0,0 +1,3 @@
# Algorithmic Complexity
"Algorithmic Complexity" refers to the computing resources needed by an algorithm to solve a problem. These computing resources can be the time taken for program execution (time complexity), or the space used in memory during its execution (space complexity). The aim is to minimize these resources, so an algorithm that takes less time and space is considered more efficient. Complexity is usually expressed using Big O notation, which describes the upper bound of time or space needs, and explains how they grow in relation to the input size. It's important to analyze and understand the algorithmic complexity to choose or design the most efficient algorithm for a specific use-case.

@ -0,0 +1,3 @@
# Bubble Sort
Bubble Sort is a simple sorting algorithm that works by repeatedly swapping the adjacent elements if they are in the wrong order. It gets its name because with each iteration the largest element "bubbles" up to its proper location. It continues this process of swapping until the entire list is sorted in ascending order. The main steps of the algorithm are: starting from the beginning of the list, compare every pair of adjacent items and swap them if they are in the wrong order, and then pass through the list until no more swaps are needed. However, despite being simple, Bubble Sort is not suited for large datasets as it has a worst-case and average time complexity of O(n²), where n is the number of items being sorted.

@ -0,0 +1,3 @@
# Merge Sort
__Merge sort__ is a type of sorting algorithm that follows the divide-and-conquer paradigm. It was invented by John von Neumann in 1945. This algorithm works by dividing an unsorted list into `n` partitions, each containing one element (a list of one element is considered sorted), then repeatedly merging partitions to produce new sorted lists until there is only 1 sorted list remaining. This resulting list is the fully sorted list. The process of dividing the list is done recursively until it hits the base case of a list with one item. Merge sort has a time complexity of `O(n log n)` for all cases (best, average and worst), which makes it highly efficient for large data sets.

@ -0,0 +1,3 @@
# Insertion Sort
Insertion sort is a simple sorting algorithm that builds the final sorted array (or list) one item at a time. It's much less efficient on large lists than more advanced algorithms like quicksort, heapsort, or merge sort. Still, it provides several advantages such as it's easy to understand the algorithm, it performs well with small lists or lists that are already partially sorted and it can sort the list as it receives it. The algorithm iterates, consuming one input element each repetition and growing a sorted output list. At each iteration, it removes one element from the input data, finds the location it belongs within the sorted list and inserts it there. It repeats until no input elements remain.

@ -0,0 +1,3 @@
# Quick Sort
Quicksort, also known as partition-exchange sort, is an efficient, in-place sorting algorithm, which uses divide and conquer principles. It was developed by Tony Hoare in 1959. It operates by selecting a 'pivot' element from the array and partitioning the other elements into two sub-arrays, according to whether they are less than or greater than the pivot. The sub-arrays are then recursively sorted. This process continues until the base case is achieved, which is when the array or sub-array has zero or one element, hence is already sorted. Quicksort can have worst-case performance of O(n^2) if the pivot is the smallest or the largest element in the array, although this scenario is rare if the pivot is chosen randomly. The average case time complexity is O(n log n).

@ -0,0 +1,3 @@
# Selection Sort
Selection Sort is a simple and intuitive sorting algorithm. It works by dividing the array into two parts - sorted and unsorted. Initially, the sorted part is empty and the unsorted part contains all the elements. The algorithm repeatedly selects the smallest (or largest, if sorting in descending order) element from the unsorted part and moves that to the end of the sorted part. The process continues until the unsorted part becomes empty and the sorted part contains all the elements. Selection sort is not efficient on large lists, as its time complexity is O(n²) where n is the number of items.

@ -0,0 +1,3 @@
# Heap Sort
Heap Sort is an efficient, comparison-based sorting algorithm. It utilizes a datastructure known as a 'binary heap', and works by dividing its input into a sorted and an unsorted region, and iteratively shrinking the unsorted region by extracting the largest element and moving that to the sorted region. It's an in-place algorithm but not a stable sort. It involves building a Max-Heap, which is a specialized tree-based data structure, and then swapping the root node (maximum element) with the last node, reducing the size of heap by one and heapifying the root node. The maximum element is now at the end of the list and this step is repeated until all nodes are sorted. Heap Sort offers a good worst-case runtime of O(n log n), irrespective of the input data.

@ -0,0 +1,3 @@
# Sorting Algorithms
Sorting algorithms are used to rearrange a given array or list elements according to a comparison operator on the elements. The comparison operator is used to decide the new order of element in the respective data structure. For example, the numerical order is a commonly used sequence but a lexicographical order is also a commonly used sequence type. There are several types of sorting algorithms: quick sort, bubble sort, merge sort, insertion sort, selection sort, heap sort, radix sort, bucket sort among others. Each has its own properties and are suited to specific types of tasks and data.

@ -0,0 +1,3 @@
# Linear Search
Linear search is one of the simplest search algorithms. In this method, every element in an array is checked sequentially starting from the first until a match is found or all elements have been checked. It is also known as sequential search. It works on both sorted and unsorted lists, and does not need any preconditioned list for the operation. However, its efficiency is lesser as compared to other search algorithms since it checks all elements one by one.

@ -0,0 +1,3 @@
# Binary Search
`Binary Search` is a type of search algorithm that follows the divide and conquer strategy. It works on a sorted array by repeatedly dividing the search interval in half. Initially, the search space is the entire array and the target is compared with the middle element of the array. If they are not equal, the half in which the target cannot lie is eliminated and the search continues on the remaining half, again taking the middle element to compare to the target, and repeating this until the target is found. If the search ends with the remaining half being empty, the target is not in the array. Binary Search is log(n) as it cuts down the search space by half each step.

@ -0,0 +1,3 @@
# Search Algorithms
Search algorithms are techniques used for finding a specific item or group of items among a collection of data. They operate by checking each element in the dataset in order to locate the target selection. The primary types of search algorithms are linear search, binary search, depth-first search, and breadth-first search. Linear search scans each element in sequence, while binary search operates by splitting the dataset in half repeatedly until finding the desired element. Depth-first and breadth-first searches are both used with more intricate data structures like trees and graphs. The former explores the depth of a branch before the breadth, while the latter explores all neighboring nodes before proceeding to the nodes at the next level depth.

@ -0,0 +1,3 @@
# Binary Trees
A **Binary Tree** is a type of tree data structure in which each node has at most two children, referred to as the left child and the right child. This distinguishes it from trees in which nodes can have any number of children. A binary tree is further classified as a strictly binary tree if every non-leaf node in the tree has non-empty left and right child nodes. A binary tree is complete if all levels of the tree, except possibly the last, are fully filled, and all nodes are as left-justified as possible. Multiple algorithms and functions employ binary trees due to their suitable properties for mathematical operations and data organization.

@ -0,0 +1,3 @@
# Binary Search Trees
A **Binary Search Tree** (BST) is a type of binary tree data structure where each node carries a unique key (a value), and each key/node has up to two referenced sub-trees, the left and right child. The key feature of a BST is that every node on the right subtree must have a value greater than its parent node, while every node on the left subtree must have a value less than its parent node. This property must be true for all the nodes, not just the root. Due to this property, searching, insertion, and removal of a node in a BST perform quite fast, and the operations can be done in O(log n) time complexity, making it suitable for data-intensive operations.

@ -0,0 +1,3 @@
# AVL Trees
An **AVL tree** is a type of binary search tree that is self-balancing, which means the heights of the two child subtrees of any node in the tree differ by at most one. If at any point the difference becomes greater than one, rebalancing is done to restore the property. The tree is named after its inventors, G.M. Adelson-Velsky and E.M. Landis, who introduced it in 1962. Each node in an AVL tree carries extra information (its Balance Factor) which could be either -1, 0, or +1. AVL trees balance themselves by rotating sub-trees in different manners(named as Left-Left rotation, Right-Right rotation, Left-Right rotation, and Right-Left rotation) whenever an insert operation causes the balance factor to go beyond this range.

@ -0,0 +1,3 @@
# B-Trees
B-Tree is a self-balanced search tree data structure that maintains sorted data and allows for efficient insertion, deletion, and search operations. It is most commonly used in systems where read and write operations are performed on disk, such as databases and file systems. The main characteristic of a B-Tree is that all leaves are at the same level, and the internal nodes can store more than one key. Each node in a B-Tree contains a certain number of keys and pointers which navigate the tree. The keys act as separation values which divide its subtrees. For example, if a node contains the values [10,20,30] it has four children: the first contains values less than 10, the second contains values between 10 and 20, the third contains values between 20 and 30, and the fourth contains values greater than 30.

@ -0,0 +1,3 @@
# In-Order Traversal
In order traversal is a method for traversing binary trees. This method follows a specific order: Left Node, Root Node, then Right Node (L-N-R). Starting from the leftmost node of the tree, you first visit the left subtree, then the root node, and finally the right subtree. If the tree is a binary search tree, in order traversal will output the values of the nodes in the tree in ascending order. This traversal method is recursive in nature, as it requires each subtree to be visited in the exact same way.

@ -0,0 +1,3 @@
# Pre-Order Traversal
Pre Order Traversal is a very specific kind of tree traversal in data structures. In this method of traversal, the process starts from the root node, then proceeds to the left subtree, and finally to the right subtree. To put it concisely, the order of traversal is Root, Left, and Right (often abbreviated as R-L-R). This makes it particularly useful in scenarios where it's important to duplicate or clone a tree, or to get a prefix expression (Polish notation) of a binary expression tree.

@ -0,0 +1,3 @@
# Post-Order Traversal
Post Order Traversal is a technique used in Binary Tree structure where each node is processed after its child nodes. As the name suggests, it first traverses the left subtree, then the right subtree, and finally the root node. The process is recursively repeated for each subtree until the entire tree has been traversed. This traversal method is often used for calculations that require that all child nodes be processed before the parent, such as evaluating a mathematical expression represented in a tree structure.

@ -0,0 +1,3 @@
# Tree Traversal
Tree Traversal is a method of visiting all the nodes in a tree data structure. There are three main types of tree traversal, these include Preorder, Inorder, and Postorder. Preorder traversal visits the current node before its child nodes, Inorder traversal visits the left child, then the parent and right child, and Postorder traversal visits the children before their respective parents. There's also a level order traversal which visits nodes level by level. Depth First Search (DFS) and Breadth First Search (BFS) are two popular algorithms used for tree traversal. DFS involves exhaustive searches of nodes by going forward if possible and if it is not possible then by going back. BFS starts traversal from the root node and visits nodes in a level by level manner.

@ -0,0 +1,3 @@
# Breadth First Search
Breadth-First Search (BFS) is a searching algorithm that's used in tree or graph data structures. It starts from the root (the topmost node in the tree) and expands all neighboring nodes at the present depth prior to moving on to nodes at the next depth level. This technique uses a queue data structure to remember to explore the next vertex or node and every edge that leads to a vertex will be explored, which ensures the discovery of every vertex reachable from the source. BFS is complete in nature, which means if the searched node is in the tree, BFS is guaranteed to find it.

@ -0,0 +1,3 @@
# Depth First Search
Depth First Search (DFS) is an algorithm for traversing or searching tree or graph data structures. The process starts at the root (in the case of a tree) or an arbitrary node (in case of a graph), and explores as far as possible along each branch before retracing steps. Essentially, DFS is about diving deep into the tree/graph from a starting point, and when no more nodes are left to explore, it backtracks, moving up the tree/graph. This repeat until all nodes have been visited. This algorithm is often used in simulation of game states, solving puzzles and finding connected components in a graph.

@ -0,0 +1,3 @@
# Search Algorithms
Search algorithms in context of the tree data structure typically include breadth-first search (BFS) and depth-first search (DFS). BFS traverses the tree level by level starting from the root. It visits all nodes at current depth or level before proceeding to nodes at the next level. On the contrary, DFS travels toward the deepest node first, which means it travels as far as it can down one path before backtracking and exploring the next available path. DFS has three types - pre-order (root, left, right), in-order (left, root, right) and post-order (left, right, root). Another important search algorithm is the Binary Search that operates only on sorted dataset and effectively halves the search space after each comparison. It seeks the mid-point of the array and compares it against the target value. If the mid-point value is greater, it repeats the process on the left half and if the mid-point value is less, then on the right half.

@ -0,0 +1,3 @@
# Tree Data Structures
A **Tree data structure** is a type of non-linear, hierarchical data structure that consists of nodes connected by edges. It follows the parent-child relationship, with the top node being called the root. Each node in a tree can have child nodes and each of these child nodes has a single parent node. Nodes with same parents are known as siblings. Nodes without any children are referred to as leaves. Its structure allows the organization of data in a natural hierarchy. The simplification it provides in accessing, managing and manipulating data with complex relationships makes it a vital data structure in computer science. Implementations of the tree data structure are seen in databases, file systems, and HTML DOM.

@ -0,0 +1,3 @@
# Directed Graph
A **Directed Graph**, also known as a DiGraph, is a set of vertices and a collection of directed edges. Each directed edge has an initial vertex, also called the tail, and a terminal vertex, also known as the head. The directed edge is said to point from the tail to the head. To visualize this, think of a graph where the nodes are cities and the edges are one-way roads. Directed graphs are often used to represent relationships between objects where direction does matter, such as a sequence of events in a workflow.

@ -0,0 +1,3 @@
# Undirected Graph
An **Undirected Graph** is a type of graph in which the edges are not directed. That is, they do not point in any specific direction and are not ordered pairs. They cannot be referred to as originating or ending node, instead, they are endpoints of the edges. In this type of graph, the edges essentially represent a two-way relationship, in the sense that, a travel can be made back and forth between the two vertices without any restriction. Every edge of the undirected graph always connects two different vertices or nodes.

@ -0,0 +1,3 @@
# Breadth First Search
Breadth-First Search (BFS) is a searching algorithm used to traverse or search in data structures like a tree or a graph. The algorithm starts with a root node and visits the nodes in a level by level manner (i.e., visiting the ones nearest to the root first). It makes use of a queue data structure to store nodes not yet visited. A check is performed before nodes are put in the queue. This is to ensure same node is not visited twice. BFS can be used in multiple areas like finding shortest paths, serialized tree or in test case scenarios where all vertices are equally important.

@ -0,0 +1,3 @@
# Depth First Search
**Depth-First Search (DFS)** is an algorithm used for traversing or searching tree or graph data structures. The process starts at the root node (selecting some arbitrary node as the root in the case of a graph), and explores as far as possible along each branch before backtracking. It uses a last in, first out (LIFO) stack to remember to get the next vertex to start a search when a dead end occurs in any iteration. DFS has been used in a variety of applications including finding connected components, topological sorting, and finding articulation points (or cut vertices) in a graph.

@ -0,0 +1,3 @@
# Search Algorithms
Search algorithms are fundamental techniques used for exploring a graph. Two classical methods are **Depth-First Search** (DFS) and **Breadth-First Search** (BFS). **DFS** relies on a stack and the concept of backtracking. Starting from a given node, it explores as far down a path as possible before backtracking. **BFS**, on the other hand, uses a queue and visits all of a node's neighbors at one level before moving on to the next. For discovering the shortest path between two nodes, Dijkstra’s algorithm and the A* search algorithm are often used. **Dijkstra's algorithm** builds up a table that provides the shortest distances to each reachable node from a selected starting node. **A* search algorithm**, a modification of Dijkstra's algorithm, uses a heuristic to provide a best estimate of the path from the current node to the goal, thus often increasing the algorithm's efficiency.

@ -0,0 +1,3 @@
# Dijkstra's Algorithm
Dijkstra's algorithm is a popular method used in computing and graph theory for finding the shortest paths between nodes in a graph. Named after Dutch computer scientist Edsger W. Dijkstra, this algorithm works by visiting vertices in the graph starting from the object's starting point and gradually spreading out until the shortest path to the desired endpoint is known. This algorithm is applicable in such situation where all the edges are non-negative. Linear data structures such as stacks and queues are commonly used in the implementation of this algorithm. Although its worst-case time complexity appears to be high (O(|V|^2)), it runs significantly faster in practice.

@ -0,0 +1,3 @@
# Bellman-Ford
The **Bellman Ford algorithm** is a method used in graph theory for finding the shortest path between a single source vertex and all other vertices in a weighted graph. This algorithm is significant because it is capable of handling graphs with negative weight edges, unlike Dijkstra's algorithm. It follows a bottom-up approach, filling up the distance table gradually while relaxing edges. The algorithm gets its name from its developers, Richard Bellman and Lester Ford. However, it can lead to an infinite loop if there are negative weight cycles in the graph, which should be addressed separately using another check.

@ -0,0 +1,3 @@
# Shortest Path Algos.
Shortest Path Algorithms are a set of algorithms used in graph theory to find the shortest path between two vertices or nodes. The two most well-known algorithms are Dijkstra's Algorithm and the Bellman-Ford Algorithm. Dijkstra's Algorithm operates by visiting neighbors of the starting vertex and keeps a running tally of the shortest distance from the starting vertex to each visited vertex. This is repeated until all vertices have been visited and the shortest distances calculated. Bellman-Ford Algorithm, on the other hand, is capable of handling graphs with negative edges. It works by iteratively relaxing the graph edges and thereby finding the shortest paths to all vertices.

@ -0,0 +1,3 @@
# Prim's Algorithm
Prim's algorithm is a greedy algorithm that finds a minimum spanning tree for a weighted undirected graph. This means it finds a subset of the edges that forms a tree that includes every vertex, where the total weight of all the edges in the tree is minimized. The algorithm operates by building this tree one vertex at a time, from an arbitrary starting vertex, at each step adding the cheapest possible connection from the tree to another vertex.

@ -0,0 +1,3 @@
# Kruskal's Algorithm
Kruskal's algorithm is a popular procedure in computer science for finding minimum spanning trees in a graph, developed by Joseph Kruskal in 1956. The algorithm operates by sorting the edges of the graph by their weight in ascending order. Then, it loops through each, adding the edge to the spanning tree if it doesn't form a circuit with the edges already there. This process repeats until all the vertices in the graph are included in the tree. Kruskal's algorithm belongs to the group of Greedy Algorithms as it tries to find the local optimum at each stage with the hope of finding the global optimum. It has an overall time complexity of O(E log E) or O(E log V), where E is the number of edges and V is the number of vertices.

@ -0,0 +1,3 @@
# Minimum Spanning Tree
A **Minimum Spanning Tree (MST)** is a concept in graph theory where it represents a subset of the edges of a connected, undirected graph. This subset connects all the vertices together, without any cycles and with the minimum possible total edge weight. There are quite a few algorithms that can be used to find the MST of a graph such as Prim's, Kruskal's, and Boruvka's algorithm. The concept is important in network design, where the goal is to minimize the total length of the wires yet still connect all of the points.

@ -0,0 +1,3 @@
# Graph Data Structure
A **Graph Data Structure** consists of a set of vertices (or nodes) and edges where each edge connects a pair of vertices. It can be visualized as networks consisting of elements in interconnected various relationships. There are two major types of graphs: Directed and Undirected. In a directed graph, all the edges are unidirectional - they only go one way. On the other hand, in an undirected graph, the edges are not directed - they are bidirectional. Another concept important to graphs is the idea of 'Weighted' and 'Unweighted' graphs. In a weighted graph, each edge is assigned a weight or cost. Unweighted graphs don't have these extra edge information. Graphs have a diverse set of applications in computer science, from creating connections between web pages to modeling networks and much more.

@ -0,0 +1,3 @@
# Trie
A **Trie**, also called digital tree and sometimes radix tree or prefix tree, is a type of search tree that is used to store a dynamic set or associative array where the keys are usually strings. Unlike binary search trees, no node in the tree stores the key associated with that node; instead, its position in the tree defines the key with which it is associated. All the descendants of any one node have a common prefix of the string associated with that node, and the root is associated with the empty string. A 'trie' is thus a way to represent the 're**trie**val' of information and is a type of tree structure used for this purpose. Typical usage scenarios could be in storing a predictive text or autocomplete dictionary, such as found on your smartphone or search engine.

@ -0,0 +1,3 @@
# Segment Trees
A **Segment Tree** is a data structure designed for efficient processing of range queries and updates on array elements. In a situation where you have an array and you need to execute several types of queries including updating array elements and computing sum or minimum or maximum of elements in a given range, segment trees could be a great choice. The tree itself is a height-balanced binary tree and is filled with data from the input array. The leaves of the Segment Tree contain the array elements, while the internal nodes store information needed for processing the query, often the sum, minimum, or maximum of the elements represented by their child nodes. Efficient implementation of segment trees can achieve query and update operations in logarithmic time.

@ -0,0 +1,3 @@
# Fenwick Trees
Fenwick Trees, also known as Binary Indexed Trees, are data structures that can efficiently support the operation of updating elements and calculating prefix sums in a table of numbers. This makes it particularly useful in situations where the table gets updated often and different kinds of queries (such as sum of elements) need to be answered fast. A Fenwick Tree typically takes O(log n) time for both updation and query operations, which is more efficient than an array or a segment tree. It achieves this efficiency by storing partial sum information in the array. This allows for efficient calculation of sum ranges, with the operation of adding an element and getting the sum of a range both achieve in O(log n) time.

@ -0,0 +1,3 @@
# Disjoint Set (Union-Find)
A **disjoint-set** data structure, also called a union-find data structure or merge-find set, is a data structure that tracks a partition of a set into numerous non-overlapping subsets. It provides near-constant-time operations to add new sets, to merge existing sets, and to determine whether elements are in the same set. The underlying algorithm uses two main techniques, `Union by Rank` and `Path Compression`, to achieve the efficient time complexity. Each element is represented as a node, and each group of disjoint sets forms a tree structure. Disjoint sets are useful in multitude of graph algorithms like Kruskal’s algorithm and many more.

@ -0,0 +1,3 @@
# Suffix Trees and Arrays
**Suffix Trees and Arrays** are advanced data structures used primarily for string manipulation and searches. A **Suffix Tree** is a compressed trie containing all the suffixes of a given text as their keys and positions as their values. On the other hand, a **Suffix Array** is a sorted array of all possible suffixes of a given text. Both these data structures provide an efficient way to store and search substrings in a text, but differ in terms of space complexity and time complexity.

@ -0,0 +1,3 @@
# Advanced Data Structures
Advanced data structures are an integral part of advanced programming. They include structures such as Binary Search Trees (BST), Balanced trees like AVL Trees, Red-Black Trees, Heap, Disjoint Data Set, Trie, Suffix Array, Suffix tree and others. BST is a node-based data structure where each node contains a key, a pointer to left child and a pointer to right child. AVL and Red-Black trees are self-balancing binary search trees. Disjoint set data structure supports union and find operations making them useful in computer vision for segmentation. Trie is an ordered tree structure used for faster retrievals, while Suffix Array and Suffix tree are data structures used in pattern matching algorithms. These structures offer an efficient way of manipulating and storing data.

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

Loading…
Cancel
Save