From 74693151a6dd76805f1c2d4c7602ce08fe7e5653 Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Fri, 16 Aug 2024 02:10:55 +0100 Subject: [PATCH 001/120] Add citation files --- .../content/citation-files@Ddkss13_qDJTquDHbVTVs.md | 7 +++++++ src/data/roadmaps/git-github/git-github.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 src/data/roadmaps/git-github/content/citation-files@Ddkss13_qDJTquDHbVTVs.md diff --git a/src/data/roadmaps/git-github/content/citation-files@Ddkss13_qDJTquDHbVTVs.md b/src/data/roadmaps/git-github/content/citation-files@Ddkss13_qDJTquDHbVTVs.md new file mode 100644 index 000000000..f4d5d1cff --- /dev/null +++ b/src/data/roadmaps/git-github/content/citation-files@Ddkss13_qDJTquDHbVTVs.md @@ -0,0 +1,7 @@ +# CITATION files + +You can add a CITATION.cff file to the root of a repository to let others know how you would like them to cite your work. The citation file format is plain text with human- and machine-readable citation information. + +Visit the following resources to learn more: + +- [@official@CITATION Files Documentation](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-citation-files) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/git-github.json b/src/data/roadmaps/git-github/git-github.json index b8feb506a..f052af79a 100644 --- a/src/data/roadmaps/git-github/git-github.json +++ b/src/data/roadmaps/git-github/git-github.json @@ -1 +1 @@ -{"nodes":[{"id":"lGNqOaL2J0jaYewnPbrxZ","type":"vertical","position":{"x":1166.5374122325647,"y":3312.536593518702},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":192,"style":{"width":20,"height":192},"positionAbsolute":{"x":1166.5374122325647,"y":3312.536593518702},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"lqrIjDM7CfF2CNgcIOq3Z","type":"vertical","position":{"x":857.3760409943199,"y":2716.91990782706},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55,"strokeDasharray":"0","strokeLinecap":"round"},"oldId":"GyhfjObOGq-CwF_VIwO8b"},"zIndex":999,"width":20,"height":139,"style":{"width":20,"height":139},"positionAbsolute":{"x":857.3760409943199,"y":2716.91990782706},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"ZRB7mytelAk8pg5gsu2Xs","type":"horizontal","position":{"x":843.0316934344742,"y":2691.91990782706},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.55,"strokeDasharray":"0.8 8","strokeLinecap":"round"}},"zIndex":999,"width":177,"height":20,"style":{"width":177,"height":20},"positionAbsolute":{"x":843.0316934344742,"y":2691.91990782706},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"mGoWfyS0DO8L-JwPDK5p9","type":"vertical","position":{"x":308.03169343447416,"y":2605.7489330045287},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55,"strokeDasharray":"0","strokeLinecap":"round"},"oldId":"GyhfjObOGq-CwF_VIwO8b"},"zIndex":999,"width":20,"height":88,"style":{"width":20,"height":88},"positionAbsolute":{"x":308.03169343447416,"y":2605.7489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"WyueeGiceOzKqHrM2Mn_v","type":"vertical","position":{"x":308.53169343447416,"y":2711.3618259293457},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55,"strokeDasharray":"0.8 8","strokeLinecap":"round"},"oldId":"GyhfjObOGq-CwF_VIwO8b"},"zIndex":999,"width":20,"height":77,"style":{"width":20,"height":77},"positionAbsolute":{"x":308.53169343447416,"y":2711.3618259293457},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"GVLwJZlzs2me5ogEcf_f9","type":"vertical","position":{"x":307.03169343447416,"y":2317.2489330045287},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55},"oldId":"GyhfjObOGq-CwF_VIwO8b"},"zIndex":999,"width":20,"height":225,"style":{"width":20,"height":225},"positionAbsolute":{"x":307.03169343447416,"y":2317.2489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"MtX03b7FVvVq6kDKfmidT","type":"horizontal","position":{"x":364.53169343447416,"y":2479.2489330045287},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.55}},"zIndex":999,"width":233,"height":20,"style":{"width":233,"height":20},"positionAbsolute":{"x":364.53169343447416,"y":2479.2489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"gZ7dytie1YH3DDtKKcyiQ","type":"vertical","position":{"x":355.53169343447416,"y":2317.2489330045287},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55},"oldId":"GyhfjObOGq-CwF_VIwO8b"},"zIndex":999,"width":20,"height":174,"style":{"width":20,"height":174},"positionAbsolute":{"x":355.53169343447416,"y":2317.2489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"e5O8lUSSEOEFR-dlZV5wN","type":"section","position":{"x":522.0316934344742,"y":2094.2489330045287},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":217,"height":322,"style":{"width":217,"height":322},"resizing":false,"positionAbsolute":{"x":522.0316934344742,"y":2094.2489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"-KKWgOEFEaVxuaHPDjJmA","type":"vertical","position":{"x":543.8760409943199,"y":1902.348933004529},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":98,"style":{"width":20,"height":98},"positionAbsolute":{"x":543.8760409943199,"y":1902.348933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"bVGSRi7pMd3rHQ1X6UrA1","type":"vertical","position":{"x":1161.0316934344742,"y":1643.848933004529},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":101,"style":{"width":20,"height":101},"positionAbsolute":{"x":1161.0316934344742,"y":1643.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"9tkYqqVy0v42G4tijnDAP","type":"horizontal","position":{"x":428.53169343447416,"y":1371.0489330045289},"selected":true,"data":{"label":"horizontal node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":82,"height":20,"style":{"width":82,"height":20},"positionAbsolute":{"x":428.53169343447416,"y":1371.0489330045289},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"uDsTnM22jHuGBvJfRgv9v","type":"section","position":{"x":208.03169343447416,"y":1307.348933004529},"width":221,"height":217,"style":{"width":221,"height":217},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":208.03169343447416,"y":1307.348933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"I-sIkdwJlt8JK0gdvdloQ","type":"vertical","position":{"x":688.3760409943199,"y":736.548933004529},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.65,"strokeDasharray":"0.8 8","strokeLinecap":"round"}},"zIndex":999,"width":20,"height":77,"style":{"width":20,"height":77},"positionAbsolute":{"x":688.3760409943199,"y":736.548933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"zyFrOb5yF198jH5vjZTg1","type":"vertical","position":{"x":688.3760409943199,"y":830.548933004529},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.65},"oldId":"I-sIkdwJlt8JK0gdvdloQ"},"zIndex":999,"width":20,"height":553,"style":{"width":20,"height":553},"positionAbsolute":{"x":688.3760409943199,"y":830.548933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"CK9zYMrsw7Rl1ux4PU5wl","type":"section","position":{"x":205.53169343447416,"y":289.84893300452904},"width":241,"height":422,"style":{"width":241,"height":422},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":205.53169343447416,"y":289.84893300452904},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"Qq13cf04JGzV_H3glm_D5","type":"horizontal","position":{"x":446.53169343447416,"y":486.34893300452904},"selected":true,"data":{"label":"horizontal node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":172,"height":20,"style":{"width":172,"height":20},"positionAbsolute":{"x":446.53169343447416,"y":486.34893300452904},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"5Z9o-b3vBA-ITFg86zzYM","type":"title","position":{"x":594.8760409943199,"y":166.2553633125035},"selected":true,"data":{"label":"Git and GitHub","style":{"fontSize":28,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":227,"height":68,"style":{},"positionAbsolute":{"x":594.8760409943199,"y":166.2553633125035},"dragging":false,"selectable":true,"focusable":true},{"id":"XgM_I974PlXAu4AbeqHX1","type":"vertical","position":{"x":698.3760409943199,"y":93.2553633125035},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":73,"style":{"width":20,"height":73},"resizing":false,"positionAbsolute":{"x":698.3760409943199,"y":93.2553633125035},"dragging":false,"focusable":true,"selectable":true},{"id":"yHmHXymPNWwu8p1vvqD3o","type":"paragraph","position":{"x":909.4971847919508,"y":83.84893300452893},"selected":true,"data":{"label":"Find the detailed version of this roadmap along with other similar roadmaps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","borderColor":"#000000","backgroundColor":"#FFFFFf"}},"zIndex":999,"width":353,"height":142,"positionAbsolute":{"x":909.4971847919508,"y":83.84893300452893},"dragging":false,"selectable":true,"focusable":true,"style":{"width":353,"height":142},"resizing":false},{"id":"2zqZkyVgigifcRS1H7F_b","type":"button","position":{"x":921.7005592047509,"y":165.8344964222742},"selected":true,"data":{"label":"roadmap.sh","href":"https://roadmap.sh","color":"#ffffff","backgroundColor":"#4136D6","style":{"fontSize":17}},"zIndex":999,"width":329,"height":49,"dragging":false,"style":{"width":329,"height":49},"resizing":false,"positionAbsolute":{"x":921.7005592047509,"y":165.8344964222742},"selectable":true,"focusable":true},{"id":"HlUUGj3dOZ68t4gIjerXh","type":"topic","position":{"x":570.3760409943199,"y":374.48940199488766},"selected":true,"data":{"label":"Learn the Basics","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":276,"height":49,"positionAbsolute":{"x":570.3760409943199,"y":374.48940199488766},"selectable":true,"focusable":true,"dragging":false,"style":{"width":276,"height":49},"resizing":false},{"id":"bY6b1GV2XQQ52NOx8gWFj","type":"subtopic","position":{"x":984.0316934344742,"y":299.84893300452904},"selected":true,"data":{"label":"What is Version Control?","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":984.0316934344742,"y":299.84893300452904},"dragging":false,"selectable":true,"focusable":true},{"id":"dhIx1GnynvbSUriqYLUt0","type":"subtopic","position":{"x":984.0316934344742,"y":352.84893300452904},"selected":true,"data":{"label":"Why use Version Control?","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":984.0316934344742,"y":352.84893300452904},"dragging":false,"selectable":true,"focusable":true},{"id":"_jSTrYN9G8EsGHkbusKPU","type":"subtopic","position":{"x":984.0316934344742,"y":405.84893300452904},"selected":true,"data":{"label":"Git vs Other VCS","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":984.0316934344742,"y":405.84893300452904},"dragging":false,"selectable":true,"focusable":true},{"id":"v7hCNbgPByi3YiLSs46BK","type":"subtopic","position":{"x":984.0316934344742,"y":458.84893300452904},"selected":true,"data":{"label":"Installing Git Locally","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":984.0316934344742,"y":458.84893300452904},"dragging":false,"selectable":true,"focusable":true},{"id":"PtU5Qwfzn3N1i3oRlCGoR","type":"topic","position":{"x":570.3760409943199,"y":471.84893300452904},"selected":true,"data":{"label":"What is a Repository","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"bXfCUG3h1TIFPgD4WUDph"},"zIndex":999,"width":276,"height":49,"style":{"width":276,"height":49},"positionAbsolute":{"x":570.3760409943199,"y":471.84893300452904},"dragging":false,"selectable":true,"focusable":true},{"id":"1iOkbO5juk2LO-WZHx_W6","type":"subtopic","position":{"x":214.53169343447416,"y":303.84893300452904},"selected":true,"data":{"label":"git init","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":223,"height":49,"style":{"width":223,"height":49},"positionAbsolute":{"x":214.53169343447416,"y":303.84893300452904},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"NMCWgzhhfUvFOMO5GbF_u","type":"subtopic","position":{"x":214.53169343447416,"y":358.853050782843},"selected":true,"data":{"label":"git config","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":223,"height":49,"style":{"width":223,"height":49},"positionAbsolute":{"x":214.53169343447416,"y":358.853050782843},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"tVvxC5JQgUb_B8kOqYpD8","type":"subtopic","position":{"x":214.53169343447416,"y":412.84893300452904},"selected":true,"data":{"label":"Local vs Global Config","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":223,"height":49,"style":{"width":223,"height":49},"positionAbsolute":{"x":214.53169343447416,"y":412.84893300452904},"dragging":false,"selectable":true,"focusable":true},{"id":"hzL8j8473CoyFf5ab2f_B","type":"label","position":{"x":229.03169343447416,"y":465},"selected":true,"data":{"label":"Repository Initialization","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":194,"height":36,"style":{},"positionAbsolute":{"x":229.03169343447416,"y":465},"dragging":false,"selectable":true,"focusable":true},{"id":"XB_mRInocRU6nPjt_iOo5","type":"label","position":{"x":224.53169343447416,"y":667.848933004529},"selected":true,"data":{"label":"Intro and Git Commands","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":203,"height":36,"style":{},"positionAbsolute":{"x":224.53169343447416,"y":667.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"Sv36oxTZwlUv-i1K28NeP","type":"subtopic","position":{"x":214.53169343447416,"y":506.84893300452904},"selected":true,"data":{"label":"Working Directory","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":223,"height":49,"style":{"width":223,"height":49},"positionAbsolute":{"x":214.53169343447416,"y":506.84893300452904},"dragging":false,"selectable":true,"focusable":true},{"id":"h71Tx3nkfUrnhaqcHlDkQ","type":"subtopic","position":{"x":214.53169343447416,"y":559.848933004529},"selected":true,"data":{"label":"Staging Area","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":223,"height":49,"style":{"width":223,"height":49},"positionAbsolute":{"x":214.53169343447416,"y":559.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"2_z3R7seCvQVj-Na4H1SV","type":"subtopic","position":{"x":214.53169343447416,"y":612.848933004529},"selected":true,"data":{"label":"Committing Changes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":223,"height":49,"style":{"width":223,"height":49},"dragging":false,"resizing":false,"positionAbsolute":{"x":214.53169343447416,"y":612.848933004529},"selectable":true,"focusable":true},{"id":"oz2oRAhaEQb0Fm3aRJQG8","type":"subtopic","position":{"x":207.53169343447416,"y":715.848933004529},"selected":true,"data":{"label":".gitignore","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"IfUm5D_zNaUKMd4HX4Fi4"},"zIndex":999,"width":239,"height":49,"style":{"width":239,"height":49},"dragging":false,"positionAbsolute":{"x":207.53169343447416,"y":715.848933004529},"selectable":true,"focusable":true},{"id":"IfUm5D_zNaUKMd4HX4Fi4","type":"subtopic","position":{"x":207.53169343447416,"y":768.848933004529},"selected":true,"data":{"label":"Viewing Commit History","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":239,"height":49,"style":{"width":239,"height":49},"dragging":false,"positionAbsolute":{"x":207.53169343447416,"y":768.848933004529},"selectable":true,"focusable":true},{"id":"bXfCUG3h1TIFPgD4WUDph","type":"topic","position":{"x":1049.0316934344742,"y":573.848933004529},"selected":true,"data":{"label":"Branching Basics","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":215,"height":49,"style":{"width":215,"height":49},"positionAbsolute":{"x":1049.0316934344742,"y":573.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"OegitQ5Ngjvd3ZfMpfrkM","type":"subtopic","position":{"x":1049.0316934344742,"y":653.0489330045289},"selected":true,"data":{"label":"Creating Branch","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":215,"height":49,"style":{"width":215,"height":49},"positionAbsolute":{"x":1049.0316934344742,"y":653.0489330045289},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"_dPOVUbxApx0pfKPH8fgr","type":"subtopic","position":{"x":1049.0316934344742,"y":706.0489330045289},"selected":true,"data":{"label":"Renaming Branch","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":215,"height":49,"style":{"width":215,"height":49},"positionAbsolute":{"x":1049.0316934344742,"y":706.0489330045289},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"1uDenoQ6zu7CT69FR2iQB","type":"subtopic","position":{"x":1049.0316934344742,"y":759.0489330045289},"selected":true,"data":{"label":"Deleting Branch","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":215,"height":49,"style":{"width":215,"height":49},"positionAbsolute":{"x":1049.0316934344742,"y":759.0489330045289},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"PtRo-wGiNAagZ6CykfvMr","type":"subtopic","position":{"x":1049.0316934344742,"y":812.0489330045289},"selected":true,"data":{"label":"Checkout Branch","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":215,"height":49,"style":{"width":215,"height":49},"positionAbsolute":{"x":1049.0316934344742,"y":812.0489330045289},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"sNuy6NMjLOEkJlqdEjFPq","type":"subtopic","position":{"x":1049.0316934344742,"y":865.0489330045289},"selected":true,"data":{"label":"Merging Basics","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":215,"height":49,"style":{"width":215,"height":49},"positionAbsolute":{"x":1049.0316934344742,"y":865.0489330045289},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"fIfmS6BkkOFWzCB1RqrhK","type":"paragraph","position":{"x":795.8760409943199,"y":703.848933004529},"selected":true,"data":{"label":"Basic Collaboration","style":{"fontSize":20,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"center","padding":16}},"zIndex":999,"width":216,"height":46,"style":{"width":216,"height":46},"resizing":false,"positionAbsolute":{"x":795.8760409943199,"y":703.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"NeSvgS2yA5x8qbcJHrV__","type":"topic","position":{"x":796.8760409943199,"y":799.0489330045289},"selected":true,"data":{"label":"GitHub Essentials","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":214,"height":49,"style":{"width":214,"height":49},"resizing":false,"positionAbsolute":{"x":796.8760409943199,"y":799.0489330045289},"dragging":false,"selectable":true,"focusable":true},{"id":"i7fIIHcBEk473te8bniJ5","type":"subtopic","position":{"x":796.8760409943199,"y":878.848933004529},"selected":true,"data":{"label":"Creating Account","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":214,"height":49,"style":{"width":214,"height":49},"positionAbsolute":{"x":796.8760409943199,"y":878.848933004529},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"qZFtRABvlBbVvsy6T00J2","type":"subtopic","position":{"x":796.8760409943199,"y":931.848933004529},"selected":true,"data":{"label":"GitHub Interface","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":214,"height":49,"style":{"width":214,"height":49},"positionAbsolute":{"x":796.8760409943199,"y":931.848933004529},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"GS3f1FKFVKT0-GJQrgCm8","type":"subtopic","position":{"x":796.8760409943199,"y":984.848933004529},"selected":true,"data":{"label":"Setting up Profile","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":214,"height":49,"style":{"width":214,"height":49},"positionAbsolute":{"x":796.8760409943199,"y":984.848933004529},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"c_FO6xMixrrMo6iisfsvl","type":"subtopic","position":{"x":796.8760409943199,"y":1037.848933004529},"selected":true,"data":{"label":"Creating Repositories","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":214,"height":49,"style":{"width":214,"height":49},"positionAbsolute":{"x":796.8760409943199,"y":1037.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"KbVvFVQ4k77R2_ddsc7WT","type":"subtopic","position":{"x":1076.5316934344742,"y":984.848933004529},"selected":true,"data":{"label":"Profile Readme","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":177,"height":49,"style":{"width":177,"height":49},"resizing":false,"positionAbsolute":{"x":1076.5316934344742,"y":984.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"HEqBbw_A4ZbJI5zEy8ViN","type":"subtopic","position":{"x":1076.5316934344742,"y":1037.848933004529},"selected":true,"data":{"label":"Private vs Public","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":177,"height":49,"style":{"width":177,"height":49},"resizing":false,"positionAbsolute":{"x":1076.5316934344742,"y":1037.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"aWx9WHUrgofcTr8B-fQYe","type":"topic","position":{"x":544.3760409943199,"y":799.0489330045289},"selected":true,"data":{"label":"Git Remotes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"0rHDUbAdXqH9zQW2VfJ8v"},"zIndex":999,"width":179,"height":49,"style":{"width":179,"height":49},"positionAbsolute":{"x":544.3760409943199,"y":799.0489330045289},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"sBQOInoFBU9XfkPZ-JlyT","type":"subtopic","position":{"x":488.37604099431985,"y":608.848933004529},"selected":true,"data":{"label":"Managing Remotes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":249,"height":49,"style":{"width":249,"height":49},"positionAbsolute":{"x":488.37604099431985,"y":608.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"ZVMCh9om37ee1qsecFa-N","type":"subtopic","position":{"x":488.37604099431985,"y":661.848933004529},"selected":true,"data":{"label":"Pushing / Pulling Changes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":249,"height":49,"style":{"width":249,"height":49},"positionAbsolute":{"x":488.37604099431985,"y":661.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"Gybnekbd1rJKTOf4hJ4Sh","type":"subtopic","position":{"x":488.37604099431985,"y":714.848933004529},"selected":true,"data":{"label":"Fetch without Merge","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":249,"height":49,"style":{"width":249,"height":49},"positionAbsolute":{"x":488.37604099431985,"y":714.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"d_GNnB6PBINz1jxGNWAE-","type":"topic","position":{"x":473.37604099431985,"y":1356.5489330045289},"selected":true,"data":{"label":"Collaboration on GitHub","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"zLSGqFLjw2kodmMwurzrY"},"zIndex":999,"width":249,"height":49,"style":{"width":249,"height":49},"positionAbsolute":{"x":473.37604099431985,"y":1356.5489330045289},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"l1Wf7Pe_ah8ycCgslfSK4","type":"subtopic","position":{"x":208.03169343447416,"y":1095.5489330045289},"selected":true,"data":{"label":"Forking vs Cloning","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"positionAbsolute":{"x":208.03169343447416,"y":1095.5489330045289},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"crdllx5cH_seIpgVPvHg_","type":"subtopic","position":{"x":208.03169343447416,"y":1148.5489330045289},"selected":true,"data":{"label":"Issues","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"x6eILrLCQrVpz4j8uOuy6"},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"positionAbsolute":{"x":208.03169343447416,"y":1148.5489330045289},"dragging":false,"selectable":true,"focusable":true},{"id":"1Koej79yTv-OAswVZwgGq","type":"subtopic","position":{"x":488.37604099431985,"y":555.848933004529},"selected":true,"data":{"label":"Cloning Repositories","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"sBQOInoFBU9XfkPZ-JlyT"},"zIndex":999,"width":249,"height":49,"style":{"width":249,"height":49},"positionAbsolute":{"x":488.37604099431985,"y":555.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"x6eILrLCQrVpz4j8uOuy6","type":"subtopic","position":{"x":208.03169343447416,"y":1201.5489330045289},"selected":true,"data":{"label":"Pull Requests","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"positionAbsolute":{"x":208.03169343447416,"y":1201.5489330045289},"dragging":false,"selectable":true,"focusable":true},{"id":"8lXXVFkgK6n5IHaYkYe3l","type":"subtopic","position":{"x":501.87604099431985,"y":1169.5489330045289},"selected":true,"data":{"label":"PR from a Fork","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":161,"height":49,"style":{"width":161,"height":49},"positionAbsolute":{"x":501.87604099431985,"y":1169.5489330045289},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"r-u1vTpUyuvsB0revOU0C","type":"subtopic","position":{"x":502.87604099431985,"y":1222.5489330045289},"selected":true,"data":{"label":"Collaborators","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":160,"height":49,"style":{"width":160,"height":49},"positionAbsolute":{"x":502.87604099431985,"y":1222.5489330045289},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"aFuWO8Z74Lbiwh9F27Yrh","type":"label","position":{"x":527.3760409943199,"y":1276.5489330045289},"selected":true,"data":{"label":"Creating PR","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":110,"height":36,"style":{},"positionAbsolute":{"x":527.3760409943199,"y":1276.5489330045289},"dragging":false,"selectable":true,"focusable":true},{"id":"y4DkB5NvTh41IeT0G2gr-","type":"subtopic","position":{"x":208.03169343447416,"y":1254.5489330045289},"selected":true,"data":{"label":"Labelling Issues / PRs","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"dragging":false,"positionAbsolute":{"x":208.03169343447416,"y":1254.5489330045289},"resizing":false,"selectable":true,"focusable":true},{"id":"dQS1V0zZxeKhHhUo3STBK","type":"subtopic","position":{"x":215.53169343447416,"y":1315.348933004529},"selected":true,"data":{"label":"Saved Replies","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":206,"height":49,"style":{"width":206,"height":49},"positionAbsolute":{"x":215.53169343447416,"y":1315.348933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"oWMaOWU06juoIuzXNe-wt","type":"subtopic","position":{"x":215.53169343447416,"y":1368.348933004529},"selected":true,"data":{"label":"Mentions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":206,"height":49,"style":{"width":206,"height":49},"positionAbsolute":{"x":215.53169343447416,"y":1368.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"XstmIysIi_lWo6RzszLBt","type":"subtopic","position":{"x":215.53169343447416,"y":1421.348933004529},"selected":true,"data":{"label":"Reactions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":206,"height":49,"style":{"width":206,"height":49},"positionAbsolute":{"x":215.53169343447416,"y":1421.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"Lw3oG5flufLskTN1AGIGc","type":"label","position":{"x":241.53169343447416,"y":1481.348933004529},"selected":true,"data":{"label":"Commenting","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":154,"height":36,"style":{"width":154},"positionAbsolute":{"x":241.53169343447416,"y":1481.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"0rHDUbAdXqH9zQW2VfJ8v","type":"topic","position":{"x":544.3760409943199,"y":931.848933004529},"selected":true,"data":{"label":"Merge Strategies","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"zLSGqFLjw2kodmMwurzrY"},"zIndex":999,"width":179,"height":49,"style":{"width":179,"height":49},"positionAbsolute":{"x":544.3760409943199,"y":931.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"agtPWS8j6i6wQPk10cy8E","type":"subtopic","position":{"x":208.53169343447416,"y":852.0489330045289},"selected":true,"data":{"label":"Fast-Forward vs Non-FF","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Z-srOhYFGVEKDexlJ6cjt"},"zIndex":999,"width":235,"height":49,"style":{"width":235,"height":49},"positionAbsolute":{"x":208.53169343447416,"y":852.0489330045289},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"9Dt4Gyiiq5jteWSKxsRMK","type":"subtopic","position":{"x":208.53169343447416,"y":958.0489330045289},"selected":true,"data":{"label":"Handling Conflicts","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"eFf2fesrs-1aVM5tH3ORQ"},"zIndex":999,"width":235,"height":49,"style":{"width":235,"height":49},"positionAbsolute":{"x":208.53169343447416,"y":958.0489330045289},"selectable":true,"focusable":true,"dragging":false},{"id":"99FVJ3Zs8n6lr8L95mG6g","type":"subtopic","position":{"x":208.53169343447416,"y":905.0489330045289},"selected":true,"data":{"label":"Rebase","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Z-srOhYFGVEKDexlJ6cjt"},"zIndex":999,"width":115,"height":49,"style":{"width":115,"height":49},"positionAbsolute":{"x":208.53169343447416,"y":905.0489330045289},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"Z-srOhYFGVEKDexlJ6cjt","type":"subtopic","position":{"x":329.53169343447416,"y":905.0489330045289},"selected":true,"data":{"label":"Squash","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":114,"height":49,"style":{"width":114,"height":49},"positionAbsolute":{"x":329.53169343447416,"y":905.0489330045289},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"eFf2fesrs-1aVM5tH3ORQ","type":"subtopic","position":{"x":208.53169343447416,"y":1011.0489330045289},"selected":true,"data":{"label":"Cherry Picking Commits","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":235,"height":49,"style":{"width":235,"height":49},"positionAbsolute":{"x":208.53169343447416,"y":1011.0489330045289},"selectable":true,"focusable":true,"dragging":false},{"id":"C1ai9r31b7HPySw0o9tyT","type":"paragraph","position":{"x":816.3760409943199,"y":1360.0489330045289},"selected":true,"data":{"label":"Best Practices","style":{"fontSize":17,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"center","padding":16}},"zIndex":999,"width":172,"height":42,"style":{"width":172,"height":42},"positionAbsolute":{"x":816.3760409943199,"y":1360.0489330045289},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"7lRUYWNSpHvJ-QyIE8RMa","type":"subtopic","position":{"x":786.8760409943199,"y":1111.848933004529},"selected":true,"data":{"label":"Commit Messages","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":231,"height":49,"style":{"width":231,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1111.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"ks1Pip-RM-UWD6zuF2j4n","type":"subtopic","position":{"x":786.8760409943199,"y":1164.848933004529},"selected":true,"data":{"label":"Branch Naming","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":231,"height":49,"style":{"width":231,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1164.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"GwDNk2HBjASr_NWIL4G3-","type":"subtopic","position":{"x":786.8760409943199,"y":1217.848933004529},"selected":true,"data":{"label":"PR Guidelines","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":231,"height":49,"style":{"width":231,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1217.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"xLB2fhsOm0Vu3xg_PusJB","type":"subtopic","position":{"x":786.8760409943199,"y":1270.848933004529},"selected":true,"data":{"label":"Code Reviews","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"i3AbARgzQtxtlB-1AS8zv"},"zIndex":999,"width":231,"height":49,"style":{"width":231,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1270.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"pJ-najh7dXhhYA_0bDiR5","type":"subtopic","position":{"x":786.8760409943199,"y":1447.348933004529},"selected":true,"data":{"label":"Contribution Guidelines","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"i3AbARgzQtxtlB-1AS8zv"},"zIndex":999,"width":231,"height":49,"style":{"width":231,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1447.348933004529},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"D2WIExwfSnkAPIa5O-Hp5","type":"topic","position":{"x":1068.0316934344742,"y":1356.5489330045289},"selected":true,"data":{"label":"Documentation","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1068.0316934344742,"y":1356.5489330045289},"dragging":false,"selectable":true,"focusable":true},{"id":"1Ulxl4VUvRSfyCPpi-iv8","type":"subtopic","position":{"x":1068.0316934344742,"y":1128.848933004529},"selected":true,"data":{"label":"Markdown","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1068.0316934344742,"y":1128.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"WIVr7JxO1AJTNObW8mtY3","type":"subtopic","position":{"x":1068.0316934344742,"y":1181.848933004529},"selected":true,"data":{"label":"Project Readme","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1068.0316934344742,"y":1181.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"Ddkss13_qDJTquDHbVTVs","type":"subtopic","position":{"x":1068.0316934344742,"y":1234.848933004529},"selected":true,"data":{"label":"GitHub Wikis","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1068.0316934344742,"y":1234.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"i3AbARgzQtxtlB-1AS8zv","type":"subtopic","position":{"x":786.8760409943199,"y":1500.348933004529},"selected":true,"data":{"label":"Clean Git History","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":231,"height":49,"style":{"width":231,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1500.348933004529},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"yMx3LdadPz4g25CL3N8da","type":"topic","position":{"x":1068.0316934344742,"y":1631.848933004529},"selected":true,"data":{"label":"Working in a Team","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1068.0316934344742,"y":1631.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"RMrxQLhrINO5g4Mhxh5qS","type":"subtopic","position":{"x":1020.0316934344742,"y":1773.848933004529},"selected":true,"data":{"label":"GitHub Organizations","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":248,"height":49,"style":{"width":248,"height":49},"positionAbsolute":{"x":1020.0316934344742,"y":1773.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"_ft-uvXt6s_xrcMT3fbSF","type":"subtopic","position":{"x":1020.0316934344742,"y":1720.848933004529},"selected":true,"data":{"label":"Collaborators / Members","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":248,"height":49,"style":{"width":248,"height":49},"positionAbsolute":{"x":1020.0316934344742,"y":1720.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"wydgCxR5VnieBpRolXt8i","type":"subtopic","position":{"x":1020.0316934344742,"y":1826.848933004529},"selected":true,"data":{"label":"Teams within Organization","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":248,"height":49,"style":{"width":248,"height":49},"positionAbsolute":{"x":1020.0316934344742,"y":1826.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"DzFJDdqnSy5GeGHWOpcVo","type":"topic","position":{"x":786.8760409943199,"y":1631.348933004529},"selected":true,"data":{"label":"GitHub Projects","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":181,"height":49,"style":{"width":181,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1631.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"q0zy_hXav5iXw8LpGVJVd","type":"subtopic","position":{"x":786.8760409943199,"y":1723.348933004529},"selected":true,"data":{"label":"Project Planning","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":181,"height":49,"style":{"width":181,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1723.348933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"RFJgfuxoVxt22QlwLI5mW","type":"subtopic","position":{"x":786.8760409943199,"y":1776.348933004529},"selected":true,"data":{"label":"Kanban Boards","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":181,"height":49,"style":{"width":181,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1776.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"sxvT2hGko2PDRBoBrCGWD","type":"subtopic","position":{"x":786.8760409943199,"y":1829.348933004529},"selected":true,"data":{"label":"Roadmaps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":181,"height":49,"style":{"width":181,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1829.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"TNBz5755PhI6iKxTQTqcS","type":"subtopic","position":{"x":786.8760409943199,"y":1882.348933004529},"selected":true,"data":{"label":"Automations","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":181,"height":49,"style":{"width":181,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1882.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"snWQHCQECZyUXHdn6ppIk","type":"subtopic","position":{"x":207.53169343447416,"y":1528},"selected":true,"data":{"label":"GitHub Discussions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"positionAbsolute":{"x":207.53169343447416,"y":1528},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"hes8XQqAvpxWITcbU9tiH","type":"paragraph","position":{"x":501.37604099431985,"y":1630.848933004529},"selected":true,"data":{"label":"Intermediate Git Topics","style":{"fontSize":17,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"center","padding":16},"oldId":"C1ai9r31b7HPySw0o9tyT"},"zIndex":999,"width":221,"height":50,"style":{"width":221,"height":50},"positionAbsolute":{"x":501.37604099431985,"y":1630.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"X9K3PBpGsMoXkJsKdJPI7","type":"topic","position":{"x":519.3760409943199,"y":1519},"selected":true,"data":{"label":"Git Stash Basics","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":185,"height":49,"style":{"width":185},"positionAbsolute":{"x":519.3760409943199,"y":1519},"dragging":false,"selectable":true,"focusable":true},{"id":"zen3RRdK9_nPAYgicRoHk","type":"topic","position":{"x":543.8760409943199,"y":1720.848933004529},"selected":true,"data":{"label":"History","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"iFJBF-EEnLjQVsFSXjo_i"},"zIndex":999,"width":136,"height":49,"style":{"width":136,"height":49},"positionAbsolute":{"x":543.8760409943199,"y":1720.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"lXC07j6dOa3rQixY1P-Ob","type":"subtopic","position":{"x":207.53169343447416,"y":1628.848933004529},"selected":true,"data":{"label":"Linear vs Non-Linear","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"positionAbsolute":{"x":207.53169343447416,"y":1628.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"V8nLIvddyOKTzEjOJX5GW","type":"subtopic","position":{"x":207.53169343447416,"y":1681.848933004529},"selected":true,"data":{"label":"HEAD","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"positionAbsolute":{"x":207.53169343447416,"y":1681.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"0cLf7FiI9CX--UX45sm2f","type":"subtopic","position":{"x":207.53169343447416,"y":1734.848933004529},"selected":true,"data":{"label":"Detached HEAD","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"positionAbsolute":{"x":207.53169343447416,"y":1734.848933004529},"dragging":false,"resizing":true,"selectable":true,"focusable":true},{"id":"qFEonbCMLri8iA0yONwuf","type":"subtopic","position":{"x":207.53169343447416,"y":1787.848933004529},"selected":true,"data":{"label":"git log options","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"positionAbsolute":{"x":207.53169343447416,"y":1787.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"0Yi4cryT2v2SGBjouOas3","type":"topic","position":{"x":518.3760409943199,"y":1980.348933004529},"selected":true,"data":{"label":"Undoing Changes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"iFJBF-EEnLjQVsFSXjo_i"},"zIndex":999,"width":186,"height":49,"style":{"width":186,"height":49},"positionAbsolute":{"x":518.3760409943199,"y":1980.348933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"dLr55Om7IOvI53c1DgTKc","type":"subtopic","position":{"x":473.37604099431985,"y":1878.348933004529},"selected":true,"data":{"label":"git revert","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":116,"height":49,"style":{"width":116,"height":49},"positionAbsolute":{"x":473.37604099431985,"y":1878.348933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"igrR7LguU1jemg_mf_AD6","type":"subtopic","position":{"x":374.37604099431985,"y":1980.348933004529},"selected":true,"data":{"label":"git reset","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":109,"height":49,"style":{"width":109,"height":49},"positionAbsolute":{"x":374.37604099431985,"y":1980.348933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"Uc7FyfAKpDFRGRNHwztFo","type":"subtopic","position":{"x":210.03169343447416,"y":1927.348933004529},"selected":true,"data":{"label":"--soft","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":103,"height":49,"style":{"width":103,"height":49},"positionAbsolute":{"x":210.03169343447416,"y":1927.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"V_joZNpQsS9G9PI-o-GmC","type":"subtopic","position":{"x":210.03169343447416,"y":1980.348933004529},"selected":true,"data":{"label":"--hard","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":103,"height":49,"style":{"width":103,"height":49},"positionAbsolute":{"x":210.03169343447416,"y":1980.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"qis7Z5VRxMcOmbesQlegZ","type":"subtopic","position":{"x":210.03169343447416,"y":2033.348933004529},"selected":true,"data":{"label":"--mixed","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":103,"height":49,"style":{"width":103,"height":49},"positionAbsolute":{"x":210.03169343447416,"y":2033.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"-0zQvCHG8jS_ghSjmTeIx","type":"topic","position":{"x":792.8760409943199,"y":1980.348933004529},"selected":true,"data":{"label":"Viewing Diffs","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"iFJBF-EEnLjQVsFSXjo_i"},"zIndex":999,"width":176,"height":49,"style":{"width":176,"height":49},"positionAbsolute":{"x":792.8760409943199,"y":1980.348933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"Rwpeltygwzcf6hnuZNURE","type":"subtopic","position":{"x":1064.5316934344742,"y":1897.7489330045287},"selected":true,"data":{"label":"Between Commits","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":201,"height":49,"style":{"width":201},"positionAbsolute":{"x":1064.5316934344742,"y":1897.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"O-zoAWkDvyn7B8_TmY257","type":"subtopic","position":{"x":1064.5316934344742,"y":1950.7489330045287},"selected":true,"data":{"label":"Between Branches","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":201,"height":49,"style":{"width":201},"positionAbsolute":{"x":1064.5316934344742,"y":1950.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"mzjtCdpke1ayHcEuS-YUS","type":"subtopic","position":{"x":1064.5316934344742,"y":2003.7489330045287},"selected":true,"data":{"label":"Staged Changes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":201,"height":49,"style":{"width":201},"positionAbsolute":{"x":1064.5316934344742,"y":2003.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"uxqJzQFRcALqatNRIWR0w","type":"subtopic","position":{"x":1064.5316934344742,"y":2056.7489330045287},"selected":true,"data":{"label":"Unstaged Changes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":201,"height":49,"style":{"width":201,"height":49},"positionAbsolute":{"x":1064.5316934344742,"y":2056.7489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"sOoC-XxEoIvwKct00oKlX","type":"topic","position":{"x":792.8760409943199,"y":2217.7489330045287},"selected":true,"data":{"label":"Rewriting History","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"iFJBF-EEnLjQVsFSXjo_i"},"zIndex":999,"width":176,"height":49,"style":{"width":176,"height":49},"positionAbsolute":{"x":792.8760409943199,"y":2217.7489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"NjPnEXLf1Lt9qzgxccogv","type":"subtopic","position":{"x":1070.0316934344742,"y":2138.7489330045287},"selected":true,"data":{"label":"git commit --amend","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1070.0316934344742,"y":2138.7489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"HMEfUFNu_Wp_Pac7VWHr-","type":"subtopic","position":{"x":1070.0316934344742,"y":2191.7489330045287},"selected":true,"data":{"label":"git rebase","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1070.0316934344742,"y":2191.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"BKVA6Q7DXemAYjyQOA0nh","type":"subtopic","position":{"x":1070.0316934344742,"y":2244.7489330045287},"selected":true,"data":{"label":"git filter-branch","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1070.0316934344742,"y":2244.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"OQOmxg9mCfcjt80hpvXkA","type":"subtopic","position":{"x":1070.0316934344742,"y":2297.7489330045287},"selected":true,"data":{"label":"git push --force","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1070.0316934344742,"y":2297.7489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"iFJBF-EEnLjQVsFSXjo_i","type":"topic","position":{"x":791.8760409943199,"y":2465.2489330045287},"selected":true,"data":{"label":"Tagging","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":176,"height":49,"style":{"width":176,"height":49},"positionAbsolute":{"x":791.8760409943199,"y":2465.2489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"NeU38WPbEphJuJ_AMkH82","type":"subtopic","position":{"x":1070.0316934344742,"y":2383.7489330045287},"selected":true,"data":{"label":"Managing Tags","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1070.0316934344742,"y":2383.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"E3HAGNM-kXLL4Oci5JzpQ","type":"subtopic","position":{"x":1070.0316934344742,"y":2436.7489330045287},"selected":true,"data":{"label":"Pushing Tags","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1070.0316934344742,"y":2436.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"62E1tDMXB6K74OEN0WsS0","type":"subtopic","position":{"x":1070.0316934344742,"y":2489.7489330045287},"selected":true,"data":{"label":"Checkout Tags","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1070.0316934344742,"y":2489.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"YmnTrjJtqHPXbEVrP8vd7","type":"subtopic","position":{"x":1070.0316934344742,"y":2542.7489330045287},"selected":true,"data":{"label":"GitHub Releases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1070.0316934344742,"y":2542.7489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"pqBV7BMAs0z6qpfZeW2XP","type":"topic","position":{"x":567.5316934344742,"y":2465.2489330045287},"selected":true,"data":{"label":"Git hooks","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"sFf1PdFfmEdQxsEntfeFq"},"zIndex":999,"width":126,"height":49,"style":{"width":126.25,"height":49},"positionAbsolute":{"x":567.5316934344742,"y":2465.2489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"v7uabKuMQPOD_hBIaHOVT","type":"subtopic","position":{"x":521.0316934344742,"y":2540.7489330045287},"selected":true,"data":{"label":"What and Why?","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":219,"height":49,"style":{"width":219,"height":49},"positionAbsolute":{"x":521.0316934344742,"y":2540.7489330045287},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"zsU6R2zvJKnYNU2ac4o4p","type":"subtopic","position":{"x":521.0316934344742,"y":2593.7489330045287},"selected":true,"data":{"label":"Client vs Server Hooks","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":219,"height":49,"style":{"width":219,"height":49},"positionAbsolute":{"x":521.0316934344742,"y":2593.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"jzYjHx-gIKSP8dQUTqWVw","type":"subtopic","position":{"x":532.0316934344742,"y":2105.2489330045287},"selected":true,"data":{"label":"commit-msg","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":197,"height":49,"style":{"width":197,"height":49},"positionAbsolute":{"x":532.0316934344742,"y":2105.2489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"SANEQI2rgOtsMQyn4qUCq","type":"subtopic","position":{"x":532.0316934344742,"y":2158.2489330045287},"selected":true,"data":{"label":"post-checkout","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":197,"height":49,"style":{"width":197,"height":49},"positionAbsolute":{"x":532.0316934344742,"y":2158.2489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"buxb5TpzQ-xxn0vqtGdS3","type":"subtopic","position":{"x":532.0316934344742,"y":2211.2489330045287},"selected":true,"data":{"label":"post-update","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":197,"height":49,"style":{"width":197,"height":49},"positionAbsolute":{"x":532.0316934344742,"y":2211.2489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"HhpAIzYMlMiQ9msrYZyDB","type":"subtopic","position":{"x":532.0316934344742,"y":2264.2489330045287},"selected":true,"data":{"label":"pre-commit","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":197,"height":49,"style":{"width":197,"height":49},"positionAbsolute":{"x":532.0316934344742,"y":2264.2489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"j5kWEUKwBFg5EMm8-61K9","type":"subtopic","position":{"x":532.0316934344742,"y":2317.2489330045287},"selected":true,"data":{"label":"pre-push","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":197,"height":49,"style":{"width":197,"height":49},"positionAbsolute":{"x":532.0316934344742,"y":2317.2489330045287},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"fEdLEowaTG4nyqxV5BPbk","type":"label","position":{"x":561.5316934344742,"y":2371.2489330045287},"selected":true,"data":{"label":"Common Hooks","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":138,"height":36,"style":{},"positionAbsolute":{"x":561.5316934344742,"y":2371.2489330045287},"selectable":true,"focusable":true,"dragging":false},{"id":"fjAFNjNNbPOzme9Uk_fDV","type":"topic","position":{"x":249.03169343447416,"y":2293.7489330045287},"selected":true,"data":{"label":"Submodules","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":170,"height":49,"style":{"width":170,"height":49},"focusable":true,"dragging":false,"positionAbsolute":{"x":249.03169343447416,"y":2293.7489330045287},"selectable":true,"resizing":false},{"id":"x4bnsPVTiX2xOCSyrgWpF","type":"subtopic","position":{"x":222.03169343447416,"y":2188.2489330045287},"selected":true,"data":{"label":"Adding / Updating","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"d0-u_-_vtPK8tnUpnj_NB"},"zIndex":999,"width":224,"height":49,"style":{"width":224,"height":49},"positionAbsolute":{"x":222.03169343447416,"y":2188.2489330045287},"selectable":true,"focusable":true,"dragging":false},{"id":"d0-u_-_vtPK8tnUpnj_NB","type":"subtopic","position":{"x":222.03169343447416,"y":2135.2489330045287},"selected":true,"data":{"label":"What and Why use?","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":224,"height":49,"style":{"width":224,"height":49},"positionAbsolute":{"x":222.03169343447416,"y":2135.2489330045287},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"Nr3MMuTWvDY6p1N7gSRDz","type":"paragraph","position":{"x":207.53169343447416,"y":2548.7489330045287},"selected":true,"data":{"label":"GitHub Workflow","style":{"fontSize":20,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"center","padding":16}},"zIndex":999,"width":219,"height":45,"style":{"width":219,"height":45},"resizing":false,"dragging":false,"positionAbsolute":{"x":207.53169343447416,"y":2548.7489330045287},"selectable":true,"focusable":true},{"id":"h9cf_dh_pwjialOXOlNW-","type":"topic","position":{"x":253.53169343447416,"y":2679.362719846154},"selected":true,"data":{"label":"GitHub CLI","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"AmetdCURXXob5TUsikAab"},"zIndex":999,"width":134,"height":49,"style":{"width":134,"height":49},"positionAbsolute":{"x":253.53169343447416,"y":2679.362719846154},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"vHfpoVbOW0DHNtiy0VN4X","type":"subtopic","position":{"x":205.53169343447416,"y":2765.2779308290865},"selected":true,"data":{"label":"Installation and Setup","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":243,"height":50,"style":{"width":243,"height":50},"dragging":false,"positionAbsolute":{"x":205.53169343447416,"y":2765.2779308290865},"selectable":true,"focusable":true},{"id":"lw4zHuhtxIO4kDvbyiVfq","type":"subtopic","position":{"x":205.53169343447416,"y":2819.2779308290865},"selected":true,"data":{"label":"Repository management","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":243,"height":49,"style":{"width":243,"height":49},"resizing":false,"positionAbsolute":{"x":205.53169343447416,"y":2819.2779308290865},"dragging":false,"selectable":true,"focusable":true},{"id":"kGnZifvXbHBf5zXIsfAQw","type":"subtopic","position":{"x":205.53169343447416,"y":2872.2779308290865},"selected":true,"data":{"label":"Issue Management","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":243,"height":49,"style":{"width":243,"height":49},"positionAbsolute":{"x":205.53169343447416,"y":2872.2779308290865},"dragging":false,"selectable":true,"focusable":true},{"id":"s3MzDYFPMASqiS8UnvWzW","type":"subtopic","position":{"x":205.53169343447416,"y":2925.2779308290865},"selected":true,"data":{"label":"Pull Requests","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Y0EWgPsS4kZxH3y53jNxY"},"zIndex":999,"width":243,"height":49,"style":{"width":243,"height":49},"positionAbsolute":{"x":205.53169343447416,"y":2925.2779308290865},"dragging":false,"selectable":true,"focusable":true},{"id":"AmetdCURXXob5TUsikAab","type":"topic","position":{"x":785.8760409943199,"y":2677.41990782706},"selected":true,"data":{"label":"GitHub Actions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":163,"height":49,"style":{"width":163,"height":49},"positionAbsolute":{"x":785.8760409943199,"y":2677.41990782706},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"p6rq3lQ9YRrTqwcc31O23","type":"subtopic","position":{"x":1042.8707774220793,"y":2630.41990782706},"selected":true,"data":{"label":"YAML Syntax","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1042.8707774220793,"y":2630.41990782706},"dragging":false,"selectable":true,"focusable":true},{"id":"55uHPFNwYPVZx8Cy3c985","type":"subtopic","position":{"x":1040.9255430960754,"y":2683.41990782706},"selected":true,"data":{"label":"Workflow Triggers","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1040.9255430960754,"y":2683.41990782706},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"uS1H9KoKGNONvETCuFBbz","type":"subtopic","position":{"x":1040.7423034439896,"y":2736.41990782706},"selected":true,"data":{"label":"Scheduled Worfklows","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1040.7423034439896,"y":2736.41990782706},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"6QwlY3dEvjfAOPALcWKXQ","type":"subtopic","position":{"x":1040.9255430960754,"y":2789.41990782706},"selected":true,"data":{"label":"Workflow Runners","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1040.9255430960754,"y":2789.41990782706},"dragging":false,"selectable":true,"focusable":true},{"id":"BnPiTu1Jw2kIW560a2A5T","type":"subtopic","position":{"x":1040.9255430960754,"y":2842.41990782706},"selected":true,"data":{"label":"Workflow Context","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1040.9255430960754,"y":2842.41990782706},"dragging":false,"selectable":true,"focusable":true},{"id":"aflP7oWsQzAr4YPo2LLiQ","type":"subtopic","position":{"x":1040.9255430960754,"y":2895.41990782706},"selected":true,"data":{"label":"Secrets and Env Vars","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1040.9255430960754,"y":2895.41990782706},"dragging":false,"selectable":true,"focusable":true},{"id":"HMNhzzV6ApTKj4I_FOmUB","type":"subtopic","position":{"x":1040.9255430960754,"y":2948.41990782706},"selected":true,"data":{"label":"Caching Dependencies","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1040.9255430960754,"y":2948.41990782706},"dragging":false,"selectable":true,"focusable":true},{"id":"alysXC4b1hGi9ZdQ5-40y","type":"subtopic","position":{"x":1040.9255430960754,"y":3001.41990782706},"selected":true,"data":{"label":"Storing Artifacts","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1040.9255430960754,"y":3001.41990782706},"dragging":false,"selectable":true,"focusable":true},{"id":"jc4R1zhd1YeCEbVuxwJWy","type":"subtopic","position":{"x":1040.9255430960754,"y":3054.41990782706},"selected":true,"data":{"label":"Workflow Status","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1040.9255430960754,"y":3054.41990782706},"dragging":false,"selectable":true,"focusable":true},{"id":"SsogoCgJIbeTD6tk8UhTe","type":"subtopic","position":{"x":1040.9255430960754,"y":3107.41990782706},"selected":true,"data":{"label":"Marketplace Actions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1040.9255430960754,"y":3107.41990782706},"dragging":false,"selectable":true,"focusable":true},{"id":"PUnYNBrAZWoZiopjtNgnA","type":"subtopic","position":{"x":781.8760409943199,"y":2595.7489330045287},"selected":true,"data":{"label":"Usecases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Ni3HKVLanFvSrJ3u8i5I1"},"zIndex":999,"width":171,"height":49,"style":{"width":171,"height":49},"positionAbsolute":{"x":781.8760409943199,"y":2595.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"Ni3HKVLanFvSrJ3u8i5I1","type":"subtopic","position":{"x":781.8760409943199,"y":2542.7489330045287},"selected":true,"data":{"label":"What are these?","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":171,"height":49,"style":{"width":171,"height":49},"positionAbsolute":{"x":781.8760409943199,"y":2542.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"ninjmIn5APEPuIbDhRuUh","type":"vertical","position":{"x":1010.8760409943199,"y":2632.91990782706},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55}},"zIndex":999,"width":20,"height":521,"style":{"width":20,"height":521},"positionAbsolute":{"x":1010.8760409943199,"y":2632.91990782706},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"Y0EWgPsS4kZxH3y53jNxY","type":"subtopic","position":{"x":205.53169343447416,"y":2978.2779308290865},"selected":true,"data":{"label":"Use in Automation","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":243,"height":49,"style":{"width":243,"height":49},"positionAbsolute":{"x":205.53169343447416,"y":2978.2779308290865},"dragging":false,"selectable":true,"focusable":true},{"id":"sFf1PdFfmEdQxsEntfeFq","type":"topic","position":{"x":395.53169343447416,"y":2464.7489330045287},"selected":true,"data":{"label":"Git Patch","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":124,"height":49,"style":{"width":124,"height":49},"positionAbsolute":{"x":395.53169343447416,"y":2464.7489330045287},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"Q7BSE-ueezjXkYluzMecJ","type":"paragraph","position":{"x":746.0316934344742,"y":2869.102227419993},"selected":true,"data":{"label":"Advanced Git Topics","style":{"fontSize":20,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"center","padding":16},"oldId":"RvqrjCowu0YK5QWK2ZVyg"},"zIndex":999,"width":238,"height":43,"style":{"width":238,"height":43},"resizing":false,"dragging":false,"positionAbsolute":{"x":746.0316934344742,"y":2869.102227419993},"selectable":true,"focusable":true},{"id":"hru0sL1-D4bJSQI1efEyU","type":"subtopic","position":{"x":479.407889216747,"y":2763.102227419993},"selected":true,"data":{"label":"Git Reflog","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":154,"height":49,"style":{"width":154,"height":49},"positionAbsolute":{"x":479.407889216747,"y":2763.102227419993},"dragging":false,"selectable":true,"focusable":true},{"id":"ExXuwTQSI_lg4SRGW3Iu1","type":"subtopic","position":{"x":479.407889216747,"y":2816.102227419993},"selected":true,"data":{"label":"Git Bisect","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":154,"height":49,"style":{"width":154,"height":49},"positionAbsolute":{"x":479.407889216747,"y":2816.102227419993},"dragging":false,"selectable":true,"focusable":true},{"id":"4dxVN81rXWn6VZqK99yq0","type":"subtopic","position":{"x":479.407889216747,"y":2869.102227419993},"selected":true,"data":{"label":"Git Worktree","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":154,"height":49,"style":{"width":154,"height":49},"positionAbsolute":{"x":479.407889216747,"y":2869.102227419993},"selectable":true,"focusable":true,"dragging":false},{"id":"CGj_UX5JMOOCKinedsNRc","type":"subtopic","position":{"x":479.407889216747,"y":2922.102227419993},"selected":true,"data":{"label":"Git Attributes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":154,"height":49,"style":{"width":154,"height":49},"positionAbsolute":{"x":479.407889216747,"y":2922.102227419993},"dragging":false,"selectable":true,"focusable":true},{"id":"zdunaucVe8J1tKf_z-NQo","type":"subtopic","position":{"x":479.407889216747,"y":2975.102227419993},"selected":true,"data":{"label":"Git LFS","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":155,"height":49,"style":{"width":155,"height":49},"positionAbsolute":{"x":479.407889216747,"y":2975.102227419993},"dragging":false,"selectable":true,"focusable":true},{"id":"xK8mSkkxTABUZV9zZjDPH","type":"paragraph","position":{"x":732.5316934344742,"y":3200.29226453252},"selected":true,"data":{"label":"GitHub Developer Tools","style":{"fontSize":20,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"center","padding":16},"oldId":"RvqrjCowu0YK5QWK2ZVyg"},"zIndex":999,"width":265,"height":42,"style":{"width":265,"height":42},"resizing":false,"dragging":false,"positionAbsolute":{"x":732.5316934344742,"y":3200.29226453252},"selectable":true,"focusable":true},{"id":"CDde9XlrZz6YZa9oo5WHl","type":"vertical","position":{"x":857.3760409943199,"y":2924.602227419993},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55,"strokeDasharray":"0","strokeLinecap":"round"},"oldId":"GyhfjObOGq-CwF_VIwO8b"},"zIndex":999,"width":20,"height":265,"style":{"width":20,"height":265},"positionAbsolute":{"x":857.3760409943199,"y":2924.602227419993},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"NV2HAXLEN7tskfgyFrbaf","type":"topic","position":{"x":479.407889216747,"y":3196.79226453252},"selected":true,"data":{"label":"GitHub API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"MoG7D9kqPuA6o52-z_WDN"},"zIndex":999,"width":155,"height":49,"style":{"width":155,"height":49},"positionAbsolute":{"x":479.407889216747,"y":3196.79226453252},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"lSCnKhmRr6xrKVYxO8idD","type":"subtopic","position":{"x":479.407889216747,"y":3058.4066404943324},"selected":true,"data":{"label":"REST API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":155,"height":49,"style":{"width":155,"height":49},"positionAbsolute":{"x":479.407889216747,"y":3058.4066404943324},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"KlXPt-K6br8PtpLgELaCj","type":"subtopic","position":{"x":479.407889216747,"y":3111.4066404943324},"selected":true,"data":{"label":"GraphQL API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":155,"height":49,"style":{"width":155,"height":49},"positionAbsolute":{"x":479.407889216747,"y":3111.4066404943324},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"5Oax1p7zIZ9HD2hmENPof","type":"topic","position":{"x":215.03169343447416,"y":3196.79226453252},"selected":true,"data":{"label":"Creating Apps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":155,"height":49,"style":{"width":155,"height":49},"positionAbsolute":{"x":215.03169343447416,"y":3196.79226453252},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"560GJXFTt7DPdJjKtSDOo","type":"subtopic","position":{"x":215.53169343447416,"y":3059.400921696242},"selected":true,"data":{"label":"GitHub Apps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":154,"height":49,"style":{"width":154,"height":49.28173828125},"positionAbsolute":{"x":215.53169343447416,"y":3059.400921696242},"dragging":false,"selectable":true,"focusable":true},{"id":"qrdOARfqGPF9xhF6snbAn","type":"subtopic","position":{"x":215.53169343447416,"y":3112.400921696242},"selected":true,"data":{"label":"OAuth Apps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":154,"height":49,"style":{"width":154},"positionAbsolute":{"x":215.53169343447416,"y":3112.400921696242},"dragging":false,"selectable":true,"focusable":true},{"id":"MoG7D9kqPuA6o52-z_WDN","type":"topic","position":{"x":1079.0316934344742,"y":3196.79226453252},"selected":true,"data":{"label":"Webhooks","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"5Oax1p7zIZ9HD2hmENPof"},"zIndex":999,"width":155,"height":49,"style":{"width":155,"height":49},"positionAbsolute":{"x":1079.0316934344742,"y":3196.79226453252},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"RvqrjCowu0YK5QWK2ZVyg","type":"paragraph","position":{"x":734.8760409943199,"y":3380.381300735853},"selected":true,"data":{"label":"More GitHub Features","style":{"fontSize":20,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"center","padding":16},"oldId":"Nr3MMuTWvDY6p1N7gSRDz"},"zIndex":999,"width":265,"height":42,"style":{"width":265,"height":42},"resizing":false,"dragging":false,"positionAbsolute":{"x":734.8760409943199,"y":3380.381300735853},"selectable":true,"focusable":true},{"id":"GyhfjObOGq-CwF_VIwO8b","type":"vertical","position":{"x":857.3760409943199,"y":3262.6578360691838},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55,"strokeDasharray":"0","strokeLinecap":"round"}},"zIndex":999,"width":20,"height":110,"style":{"width":20,"height":110},"positionAbsolute":{"x":857.3760409943199,"y":3262.6578360691838},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"vhdGUhMAyre_Xya6IxZ-t","type":"topic","position":{"x":449.8445524291993,"y":3510.881300735853},"selected":true,"data":{"label":"GitHub Sponsors","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"rqPCHh25xX_ROMr-ULpaw"},"zIndex":999,"width":200,"height":49,"style":{"width":200,"height":49},"positionAbsolute":{"x":449.8445524291993,"y":3510.881300735853},"selectable":true,"focusable":true,"dragging":false},{"id":"bnai6R6pOq_L5CPdbVwMW","type":"topic","position":{"x":1089.0374122325647,"y":3376.881300735853},"selected":true,"data":{"label":"GitHub Pages","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"rqPCHh25xX_ROMr-ULpaw"},"zIndex":999,"width":175,"height":49,"style":{"width":175,"height":49},"positionAbsolute":{"x":1089.0374122325647,"y":3376.881300735853},"selectable":true,"focusable":true,"dragging":false},{"id":"M2_hBvXou7cCNqsMnexCt","type":"topic","position":{"x":449.8445524291993,"y":3298.881300735853},"selected":true,"data":{"label":"GitHub Gists","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"iWn3zDMOfLLjSp6f1jQoE"},"zIndex":999,"width":200,"height":49,"style":{"width":200,"height":49},"positionAbsolute":{"x":449.8445524291993,"y":3298.881300735853},"selectable":true,"focusable":true,"dragging":false},{"id":"rqPCHh25xX_ROMr-ULpaw","type":"topic","position":{"x":449.8445524291993,"y":3351.881300735853},"selected":true,"data":{"label":"GitHub Packages","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":200,"height":49,"style":{"width":200,"height":49},"positionAbsolute":{"x":449.8445524291993,"y":3351.881300735853},"selectable":true,"focusable":true,"dragging":false},{"id":"ZHplGidvhxEIC3HN8KqRa","type":"subtopic","position":{"x":1021.0316934344742,"y":3274.4626439764525},"selected":true,"data":{"label":"Deploying Static Websites","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":244,"height":49,"style":{"width":244,"height":49},"positionAbsolute":{"x":1021.0316934344742,"y":3274.4626439764525},"dragging":false,"focusable":true,"selectable":true,"resizing":true},{"id":"VdoxEWaU56-QCbHFRw649","type":"subtopic","position":{"x":1022.0316934344742,"y":3486.2445399831518},"selected":true,"data":{"label":"Custom Domains","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":243,"height":49,"style":{"width":243,"height":49},"positionAbsolute":{"x":1022.0316934344742,"y":3486.2445399831518},"dragging":false,"focusable":true,"selectable":true},{"id":"iwfNYDlAgbA_rpWYcoHCC","type":"subtopic","position":{"x":1022.0316934344742,"y":3539.2445399831518},"selected":true,"data":{"label":"Static Site Generators","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":243,"height":49,"style":{"width":243,"height":49},"positionAbsolute":{"x":1022.0316934344742,"y":3539.2445399831518},"dragging":false,"focusable":true,"selectable":true},{"id":"NdfwgwMOewiyEAFyC2l7U","type":"topic","position":{"x":449.8445524291993,"y":3404.881300735853},"selected":true,"data":{"label":"GitHub Codespaces","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"4slyjdk2Eeg5VYY6gCDG6"},"zIndex":999,"width":200,"height":49,"style":{"width":200,"height":49},"positionAbsolute":{"x":449.8445524291993,"y":3404.881300735853},"dragging":false,"focusable":true,"selectable":true},{"id":"pFyMiyNQ16-kP7jKaKKEU","type":"topic","position":{"x":206.3814171159704,"y":3456.583923235142},"selected":true,"data":{"label":"GitHub Education","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"R20LXLLEzNn-SpyFDMRXj"},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":206.3814171159704,"y":3456.583923235142},"dragging":false,"focusable":true,"selectable":true},{"id":"XRSVRl6iHncMmgSXoB7Lq","type":"subtopic","position":{"x":206.3814171159704,"y":3574.398947531598},"selected":true,"data":{"label":"Student Developer Pack","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":206.3814171159704,"y":3574.398947531598},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"Pg6G4fzYb_RUhANeRKlRX","type":"subtopic","position":{"x":206.3814171159704,"y":3626.898947531598},"selected":true,"data":{"label":"GitHub Classroom","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":206.3814171159704,"y":3626.898947531598},"dragging":false,"focusable":true,"selectable":true},{"id":"B1KiSOt2b8t8FYD7Jxw2A","type":"subtopic","position":{"x":206.3814171159704,"y":3679.398947531598},"selected":true,"data":{"label":"Campus Program","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":206.3814171159704,"y":3679.398947531598},"dragging":false,"focusable":true,"selectable":true},{"id":"R20LXLLEzNn-SpyFDMRXj","type":"topic","position":{"x":206.3814171159704,"y":3402.504649727731},"selected":true,"data":{"label":"GitHub Marketplace","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":206.3814171159704,"y":3402.504649727731},"dragging":false,"focusable":true,"selectable":true},{"id":"f2PG4t6iVtfIH8BVe5H7f","type":"topic","position":{"x":449.8445524291993,"y":3457.881300735853},"selected":true,"data":{"label":"GitHub Security","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"rqPCHh25xX_ROMr-ULpaw"},"zIndex":999,"width":200,"height":49,"style":{"width":200,"height":49},"positionAbsolute":{"x":449.8445524291993,"y":3457.881300735853},"selectable":true,"focusable":true,"dragging":false},{"id":"4slyjdk2Eeg5VYY6gCDG6","type":"topic","position":{"x":206.3814171159704,"y":3350.504649727731},"selected":true,"data":{"label":"GitHub Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":206.3814171159704,"y":3350.504649727731},"dragging":false,"focusable":true,"selectable":true},{"id":"iWn3zDMOfLLjSp6f1jQoE","type":"topic","position":{"x":206.3814171159704,"y":3297.887019533944},"selected":true,"data":{"label":"GitHub Copilot","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"f2PG4t6iVtfIH8BVe5H7f"},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":206.3814171159704,"y":3297.887019533944},"selectable":true,"focusable":true,"dragging":false},{"width":522,"height":122,"id":"0vLaVNJaJSHZ_bHli6Qzs","type":"paragraph","position":{"x":533.8251366454728,"y":3633.6959434496457},"selected":true,"data":{"label":"Continue learning with following roadmaps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","borderColor":"#000000","backgroundColor":"WHITe"},"oldId":"m9eO0jLGuR_9w2JJbe_g2"},"zIndex":999,"positionAbsolute":{"x":533.8251366454728,"y":3633.6959434496457},"dragging":false,"style":{"width":522,"height":122},"resizing":false,"focusable":true,"selectable":true},{"width":121,"height":49,"id":"P8nE-yRpa7NmoTENNv-Qz","type":"button","position":{"x":546.9220790169977,"y":3692.6265191129755},"selected":true,"data":{"label":"Frontend","href":"https://roadmap.sh/frontend","color":"#FFf","backgroundColor":"#4136D6","style":{"fontSize":17},"borderColor":"#4136D6","oldId":"OIcmPSbdsuWapb6HZ4BEi"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":546.9220790169977,"y":3692.6265191129755},"style":{"width":121,"height":49},"focusable":true,"resizing":false,"selectable":true},{"width":20,"height":74,"id":"RLtk1C3gofHnLJ17x3o5b","type":"vertical","position":{"x":857.3760409943199,"y":3755.6959434496457},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"},"oldId":"ExXFPDHXtcOMcvZttzxvD"},"zIndex":999,"positionAbsolute":{"x":857.3760409943199,"y":3755.6959434496457},"dragging":false,"focusable":true,"style":{"width":20,"height":74},"resizing":false,"selectable":true},{"width":121,"height":49,"id":"N0zxK2dVGTxmMLEsvkRGl","type":"button","position":{"x":673.3251366454728,"y":3692.6265191129755},"selected":true,"data":{"label":"Backend","href":"https://roadmap.sh/backend","color":"#FFf","backgroundColor":"#4136D6","style":{"fontSize":17},"borderColor":"#4136D6","oldId":"OIcmPSbdsuWapb6HZ4BEi"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":673.3251366454728,"y":3692.6265191129755},"style":{"width":121,"height":49},"focusable":true,"resizing":false,"selectable":true},{"width":121,"height":49,"id":"xU5kwxmH2Ir9e2xKTH82n","type":"button","position":{"x":797.4807890856271,"y":3692.6265191129755},"selected":true,"data":{"label":"DevOps","href":"https://roadmap.sh/devops","color":"#FFf","backgroundColor":"#4136D6","style":{"fontSize":17},"borderColor":"#4136D6","oldId":"OIcmPSbdsuWapb6HZ4BEi"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":797.4807890856271,"y":3692.6265191129755},"style":{"width":121,"height":49},"focusable":true,"resizing":false,"selectable":true},{"width":121,"height":49,"id":"OIcmPSbdsuWapb6HZ4BEi","type":"button","position":{"x":923.9807890856271,"y":3692.6265191129755},"selected":true,"data":{"label":"Full-stack","href":"https://roadmap.sh/full-stack","color":"#FFf","backgroundColor":"#4136D6","style":{"fontSize":17},"borderColor":"#4136D6","oldId":"cmSSwPPiiHwYh9ct14N6A"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":923.9807890856271,"y":3692.6265191129755},"style":{"width":121,"height":49},"focusable":true,"resizing":false,"selectable":true},{"id":"GFOiV1rK5PlVHk15QZmTd","type":"vertical","position":{"x":857.3760409943199,"y":3449.881300735853},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55,"strokeDasharray":"0","strokeLinecap":"round"},"oldId":"GyhfjObOGq-CwF_VIwO8b"},"zIndex":999,"width":20,"height":185,"style":{"width":20,"height":185},"positionAbsolute":{"x":857.3760409943199,"y":3449.881300735853},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"JN1S4v1vCH6o_1FGxLu6i","type":"paragraph","position":{"x":209.37471641744668,"y":88.38682211276446},"selected":true,"data":{"label":"If you are a beginner, we'd recommend you to visit the beginner friendly version.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","borderColor":"#000000","backgroundColor":"#FFFFFf"},"oldId":"yHmHXymPNWwu8p1vvqD3o"},"zIndex":999,"width":354,"height":143,"positionAbsolute":{"x":209.37471641744668,"y":88.38682211276446},"dragging":false,"selectable":true,"focusable":true,"style":{"width":354,"height":143},"resizing":false},{"id":"MfErpYwkJ0wiWJZEUVfrb","type":"button","position":{"x":223.7266137420417,"y":167.9386373305844},"selected":true,"data":{"label":"Visit the Beginner Version","href":"/git-github?r=git-github-beginner","color":"#ffffff","backgroundColor":"#232323","style":{"fontSize":17},"oldId":"2zqZkyVgigifcRS1H7F_b"},"zIndex":999,"width":328,"height":49,"dragging":false,"style":{"width":328,"height":49},"resizing":false,"positionAbsolute":{"x":223.7266137420417,"y":167.9386373305844},"selectable":true,"focusable":true}],"edges":[{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iogwMmOvub2ZF4zgg6WyF","sourceHandle":"x2","target":"_hYN0gEi9BL24nptEtXWU","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"XX0I26JoVMVXIe_7bVMix","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"idLHBxhvcIqZTqmh_E8Az","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"dFn6kGOoJ-0BzJJEb9DSG","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"os3Pa6W9SSNEzgmlBbglQ","targetHandle":"y2","data":{"edgeStyle":"dashed"},"id":"arkF7QJJRbCBYWp0crqa2","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"3oInpqvTSSC5_K6i7j8N7","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"HNVw8OboycWKLEtEbG2bn","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"YKhuRbcUFzo0hTvuTq-Yl","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"auB7Png72XjmhcLr3IJA7","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"jZ67HhVRelJaxjsCckSSI","sourceHandle":"x2","target":"hWA7RtuqltMTmHdcCnmES","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"2aoDIr80lXSJLW1hIGUkb","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"sourceHandle":"z2","target":"NMznG9mo2wzNFnjhg990f","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"m-_y7nLeYFkUKGiacxWA0","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"sourceHandle":"z2","target":"gc_7cuIO2_joKlQRAPDfX","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"G7pXuJfkyt2nWAOHU8yV0","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"rrrvATyhXqRgJGWI3z0WF","sourceHandle":"x2","target":"AvbMQ5vY3ip1oX_6Yq4ie","targetHandle":"w2","data":{"edgeStyle":"dashed"},"id":"2_6Yz3-Agx9_rEN5xW86c","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"hWA7RtuqltMTmHdcCnmES","sourceHandle":"w2","target":"1AJv95mTLpR7L8KBoGym8","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"kgMI98fg2-mKMgUs0wnjD","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"hWA7RtuqltMTmHdcCnmES","sourceHandle":"y2","target":"0etAs56EeBfh_0IlAaSra","targetHandle":"w1","data":{"edgeStyle":"solid"},"selected":true,"id":"ts38Q2ceHs60TJscUBZVE","focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"jZ67HhVRelJaxjsCckSSI","sourceHandle":"y2","target":"h6ceO0kiBIxNRkPzN3hBY","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"ZiMV7umyPdhy3JJDcopR-","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"jZ67HhVRelJaxjsCckSSI","sourceHandle":"y2","target":"_JlT9oKQ6Yu4UX6l19G8P","targetHandle":"z2","data":{"edgeStyle":"dashed"},"id":"WI-MhbxrehFcVwyGJ5CQJ","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"x2","target":"jZ67HhVRelJaxjsCckSSI","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"qUrLBzvXvJOg53HBfjrOI","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"5Z9o-b3vBA-ITFg86zzYM","sourceHandle":"x2","target":"HlUUGj3dOZ68t4gIjerXh","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-5Z9o-b3vBA-ITFg86zzYMx2-HlUUGj3dOZ68t4gIjerXhw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"HlUUGj3dOZ68t4gIjerXh","sourceHandle":"z2","target":"bY6b1GV2XQQ52NOx8gWFj","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-HlUUGj3dOZ68t4gIjerXhz2-bY6b1GV2XQQ52NOx8gWFjy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"HlUUGj3dOZ68t4gIjerXh","sourceHandle":"z2","target":"dhIx1GnynvbSUriqYLUt0","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-HlUUGj3dOZ68t4gIjerXhz2-dhIx1GnynvbSUriqYLUt0y1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"HlUUGj3dOZ68t4gIjerXh","sourceHandle":"z2","target":"_jSTrYN9G8EsGHkbusKPU","targetHandle":"y2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-HlUUGj3dOZ68t4gIjerXhz2-_jSTrYN9G8EsGHkbusKPUy2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"HlUUGj3dOZ68t4gIjerXh","sourceHandle":"z2","target":"v7hCNbgPByi3YiLSs46BK","targetHandle":"y2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-HlUUGj3dOZ68t4gIjerXhz2-v7hCNbgPByi3YiLSs46BKy2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"HlUUGj3dOZ68t4gIjerXh","sourceHandle":"x2","target":"PtU5Qwfzn3N1i3oRlCGoR","targetHandle":"w2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-HlUUGj3dOZ68t4gIjerXhx2-bXfCUG3h1TIFPgD4WUDphw2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"PtU5Qwfzn3N1i3oRlCGoR","sourceHandle":"z2","target":"bXfCUG3h1TIFPgD4WUDph","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-PtU5Qwfzn3N1i3oRlCGoRz2-bXfCUG3h1TIFPgD4WUDphy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"bXfCUG3h1TIFPgD4WUDph","sourceHandle":"x2","target":"OegitQ5Ngjvd3ZfMpfrkM","targetHandle":"w2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-bXfCUG3h1TIFPgD4WUDphx2-OegitQ5Ngjvd3ZfMpfrkMw2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"fIfmS6BkkOFWzCB1RqrhK","sourceHandle":"x2","target":"NeSvgS2yA5x8qbcJHrV__","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-fIfmS6BkkOFWzCB1RqrhKx2-NeSvgS2yA5x8qbcJHrV__w1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NeSvgS2yA5x8qbcJHrV__","sourceHandle":"x2","target":"i7fIIHcBEk473te8bniJ5","targetHandle":"w2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-NeSvgS2yA5x8qbcJHrV__x2-i7fIIHcBEk473te8bniJ5w2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"GS3f1FKFVKT0-GJQrgCm8","sourceHandle":"z2","target":"KbVvFVQ4k77R2_ddsc7WT","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-GS3f1FKFVKT0-GJQrgCm8z2-KbVvFVQ4k77R2_ddsc7WTy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"c_FO6xMixrrMo6iisfsvl","sourceHandle":"z2","target":"HEqBbw_A4ZbJI5zEy8ViN","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-c_FO6xMixrrMo6iisfsvlz2-HEqBbw_A4ZbJI5zEy8ViNy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"bXfCUG3h1TIFPgD4WUDph","sourceHandle":"y2","target":"fIfmS6BkkOFWzCB1RqrhK","targetHandle":"w2","data":{"edgeStyle":"solid"},"selected":true,"selectable":true,"focusable":true,"id":"reactflow__edge-bXfCUG3h1TIFPgD4WUDphy2-fIfmS6BkkOFWzCB1RqrhKw2"},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NeSvgS2yA5x8qbcJHrV__","sourceHandle":"y2","target":"aWx9WHUrgofcTr8B-fQYe","targetHandle":"z1","data":{"edgeStyle":"solid"},"selected":true,"id":"reactflow__edge-NeSvgS2yA5x8qbcJHrV__y2-zLSGqFLjw2kodmMwurzrYz1","selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"0rHDUbAdXqH9zQW2VfJ8v","sourceHandle":"y2","target":"agtPWS8j6i6wQPk10cy8E","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-0rHDUbAdXqH9zQW2VfJ8vy2-agtPWS8j6i6wQPk10cy8Ez1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"0rHDUbAdXqH9zQW2VfJ8v","sourceHandle":"y2","target":"Z-srOhYFGVEKDexlJ6cjt","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-0rHDUbAdXqH9zQW2VfJ8vy2-Z-srOhYFGVEKDexlJ6cjtz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"0rHDUbAdXqH9zQW2VfJ8v","sourceHandle":"y2","target":"9Dt4Gyiiq5jteWSKxsRMK","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-0rHDUbAdXqH9zQW2VfJ8vy2-9Dt4Gyiiq5jteWSKxsRMKz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"0rHDUbAdXqH9zQW2VfJ8v","sourceHandle":"y2","target":"eFf2fesrs-1aVM5tH3ORQ","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-0rHDUbAdXqH9zQW2VfJ8vy2-eFf2fesrs-1aVM5tH3ORQz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"d_GNnB6PBINz1jxGNWAE-","sourceHandle":"z2","target":"C1ai9r31b7HPySw0o9tyT","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-d_GNnB6PBINz1jxGNWAE-z2-C1ai9r31b7HPySw0o9tyTy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"C1ai9r31b7HPySw0o9tyT","sourceHandle":"w2","target":"xLB2fhsOm0Vu3xg_PusJB","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-C1ai9r31b7HPySw0o9tyTw2-i3AbARgzQtxtlB-1AS8zvx1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"C1ai9r31b7HPySw0o9tyT","sourceHandle":"x2","target":"pJ-najh7dXhhYA_0bDiR5","targetHandle":"w1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-C1ai9r31b7HPySw0o9tyTx2-i3AbARgzQtxtlB-1AS8zvw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"x6eILrLCQrVpz4j8uOuy6","sourceHandle":"z2","target":"8lXXVFkgK6n5IHaYkYe3l","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-x6eILrLCQrVpz4j8uOuy6z2-8lXXVFkgK6n5IHaYkYe3ly1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"x6eILrLCQrVpz4j8uOuy6","sourceHandle":"z2","target":"r-u1vTpUyuvsB0revOU0C","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-x6eILrLCQrVpz4j8uOuy6z2-r-u1vTpUyuvsB0revOU0Cy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"C1ai9r31b7HPySw0o9tyT","sourceHandle":"z2","target":"D2WIExwfSnkAPIa5O-Hp5","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-C1ai9r31b7HPySw0o9tyTz2-D2WIExwfSnkAPIa5O-Hp5y1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"D2WIExwfSnkAPIa5O-Hp5","sourceHandle":"w2","target":"Ddkss13_qDJTquDHbVTVs","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-D2WIExwfSnkAPIa5O-Hp5w2-Ddkss13_qDJTquDHbVTVsx1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"D2WIExwfSnkAPIa5O-Hp5","sourceHandle":"x2","target":"yMx3LdadPz4g25CL3N8da","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-D2WIExwfSnkAPIa5O-Hp5x2-yMx3LdadPz4g25CL3N8daw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"yMx3LdadPz4g25CL3N8da","sourceHandle":"y2","target":"DzFJDdqnSy5GeGHWOpcVo","targetHandle":"z1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-yMx3LdadPz4g25CL3N8day2-DzFJDdqnSy5GeGHWOpcVoz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"DzFJDdqnSy5GeGHWOpcVo","sourceHandle":"x2","target":"q0zy_hXav5iXw8LpGVJVd","targetHandle":"w2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-DzFJDdqnSy5GeGHWOpcVox2-q0zy_hXav5iXw8LpGVJVdw2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"DzFJDdqnSy5GeGHWOpcVo","sourceHandle":"y2","target":"hes8XQqAvpxWITcbU9tiH","targetHandle":"z2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-DzFJDdqnSy5GeGHWOpcVoy2-hes8XQqAvpxWITcbU9tiHz2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"hes8XQqAvpxWITcbU9tiH","sourceHandle":"w2","target":"X9K3PBpGsMoXkJsKdJPI7","targetHandle":"x2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-hes8XQqAvpxWITcbU9tiHw2-X9K3PBpGsMoXkJsKdJPI7x2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"hes8XQqAvpxWITcbU9tiH","sourceHandle":"x2","target":"zen3RRdK9_nPAYgicRoHk","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-hes8XQqAvpxWITcbU9tiHx2-iFJBF-EEnLjQVsFSXjo_iw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zen3RRdK9_nPAYgicRoHk","sourceHandle":"y2","target":"lXC07j6dOa3rQixY1P-Ob","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iy2-lXC07j6dOa3rQixY1P-Obz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zen3RRdK9_nPAYgicRoHk","sourceHandle":"y2","target":"V8nLIvddyOKTzEjOJX5GW","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iy2-V8nLIvddyOKTzEjOJX5GWz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zen3RRdK9_nPAYgicRoHk","sourceHandle":"y2","target":"0cLf7FiI9CX--UX45sm2f","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iy2-0cLf7FiI9CX--UX45sm2fz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zen3RRdK9_nPAYgicRoHk","sourceHandle":"y2","target":"qFEonbCMLri8iA0yONwuf","targetHandle":"z2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iy2-qFEonbCMLri8iA0yONwufz2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zen3RRdK9_nPAYgicRoHk","sourceHandle":"x2","target":"0Yi4cryT2v2SGBjouOas3","targetHandle":"w2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-zen3RRdK9_nPAYgicRoHkx2-iFJBF-EEnLjQVsFSXjo_iw2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"0Yi4cryT2v2SGBjouOas3","sourceHandle":"y2","target":"igrR7LguU1jemg_mf_AD6","targetHandle":"z2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iy2-igrR7LguU1jemg_mf_AD6z2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"igrR7LguU1jemg_mf_AD6","sourceHandle":"y2","target":"V_joZNpQsS9G9PI-o-GmC","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-igrR7LguU1jemg_mf_AD6y2-V_joZNpQsS9G9PI-o-GmCz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"igrR7LguU1jemg_mf_AD6","sourceHandle":"y2","target":"qis7Z5VRxMcOmbesQlegZ","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-igrR7LguU1jemg_mf_AD6y2-qis7Z5VRxMcOmbesQlegZz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"igrR7LguU1jemg_mf_AD6","sourceHandle":"y2","target":"Uc7FyfAKpDFRGRNHwztFo","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-igrR7LguU1jemg_mf_AD6y2-Uc7FyfAKpDFRGRNHwztFoz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"0Yi4cryT2v2SGBjouOas3","sourceHandle":"z2","target":"-0zQvCHG8jS_ghSjmTeIx","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-0Yi4cryT2v2SGBjouOas3z2-iFJBF-EEnLjQVsFSXjo_iy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"-0zQvCHG8jS_ghSjmTeIx","sourceHandle":"z2","target":"Rwpeltygwzcf6hnuZNURE","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-Rwpeltygwzcf6hnuZNUREy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"-0zQvCHG8jS_ghSjmTeIx","sourceHandle":"z2","target":"O-zoAWkDvyn7B8_TmY257","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-O-zoAWkDvyn7B8_TmY257y1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"-0zQvCHG8jS_ghSjmTeIx","sourceHandle":"z2","target":"mzjtCdpke1ayHcEuS-YUS","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-mzjtCdpke1ayHcEuS-YUSy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"-0zQvCHG8jS_ghSjmTeIx","sourceHandle":"z2","target":"uxqJzQFRcALqatNRIWR0w","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-uxqJzQFRcALqatNRIWR0wy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"-0zQvCHG8jS_ghSjmTeIx","sourceHandle":"x2","target":"sOoC-XxEoIvwKct00oKlX","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge--0zQvCHG8jS_ghSjmTeIxx2-iFJBF-EEnLjQVsFSXjo_iw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"sOoC-XxEoIvwKct00oKlX","sourceHandle":"z2","target":"NjPnEXLf1Lt9qzgxccogv","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-NjPnEXLf1Lt9qzgxccogvy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"sOoC-XxEoIvwKct00oKlX","sourceHandle":"z2","target":"HMEfUFNu_Wp_Pac7VWHr-","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-HMEfUFNu_Wp_Pac7VWHr-y1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"sOoC-XxEoIvwKct00oKlX","sourceHandle":"z2","target":"BKVA6Q7DXemAYjyQOA0nh","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-BKVA6Q7DXemAYjyQOA0nhy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"sOoC-XxEoIvwKct00oKlX","sourceHandle":"z2","target":"OQOmxg9mCfcjt80hpvXkA","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-OQOmxg9mCfcjt80hpvXkAy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"sOoC-XxEoIvwKct00oKlX","sourceHandle":"x2","target":"iFJBF-EEnLjQVsFSXjo_i","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-sOoC-XxEoIvwKct00oKlXx2-iFJBF-EEnLjQVsFSXjo_iw1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iFJBF-EEnLjQVsFSXjo_i","sourceHandle":"z2","target":"NeU38WPbEphJuJ_AMkH82","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-NeU38WPbEphJuJ_AMkH82y1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iFJBF-EEnLjQVsFSXjo_i","sourceHandle":"z2","target":"E3HAGNM-kXLL4Oci5JzpQ","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-E3HAGNM-kXLL4Oci5JzpQy1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iFJBF-EEnLjQVsFSXjo_i","sourceHandle":"z2","target":"62E1tDMXB6K74OEN0WsS0","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-62E1tDMXB6K74OEN0WsS0y1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iFJBF-EEnLjQVsFSXjo_i","sourceHandle":"z2","target":"YmnTrjJtqHPXbEVrP8vd7","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-YmnTrjJtqHPXbEVrP8vd7y1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iFJBF-EEnLjQVsFSXjo_i","sourceHandle":"y2","target":"pqBV7BMAs0z6qpfZeW2XP","targetHandle":"z2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iy2-sFf1PdFfmEdQxsEntfeFqz2","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"pqBV7BMAs0z6qpfZeW2XP","sourceHandle":"w2","target":"e5O8lUSSEOEFR-dlZV5wN","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-sFf1PdFfmEdQxsEntfeFqw2-e5O8lUSSEOEFR-dlZV5wNx1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"pqBV7BMAs0z6qpfZeW2XP","sourceHandle":"x2","target":"v7uabKuMQPOD_hBIaHOVT","targetHandle":"w2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-sFf1PdFfmEdQxsEntfeFqx2-v7uabKuMQPOD_hBIaHOVTw2","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"fjAFNjNNbPOzme9Uk_fDV","sourceHandle":"w2","target":"x4bnsPVTiX2xOCSyrgWpF","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-fjAFNjNNbPOzme9Uk_fDVw2-x4bnsPVTiX2xOCSyrgWpFx1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"h9cf_dh_pwjialOXOlNW-","sourceHandle":"z2","target":"AmetdCURXXob5TUsikAab","targetHandle":"y2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-h9cf_dh_pwjialOXOlNW-z2-AmetdCURXXob5TUsikAaby2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"AmetdCURXXob5TUsikAab","sourceHandle":"w2","target":"PUnYNBrAZWoZiopjtNgnA","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-AmetdCURXXob5TUsikAabw2-PUnYNBrAZWoZiopjtNgnAx1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"Q7BSE-ueezjXkYluzMecJ","sourceHandle":"y2","target":"hru0sL1-D4bJSQI1efEyU","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-hru0sL1-D4bJSQI1efEyUz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"Q7BSE-ueezjXkYluzMecJ","sourceHandle":"y2","target":"ExXuwTQSI_lg4SRGW3Iu1","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-ExXuwTQSI_lg4SRGW3Iu1z1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"Q7BSE-ueezjXkYluzMecJ","sourceHandle":"y2","target":"4dxVN81rXWn6VZqK99yq0","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-4dxVN81rXWn6VZqK99yq0z1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"Q7BSE-ueezjXkYluzMecJ","sourceHandle":"y2","target":"CGj_UX5JMOOCKinedsNRc","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-CGj_UX5JMOOCKinedsNRcz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"Q7BSE-ueezjXkYluzMecJ","sourceHandle":"y2","target":"zdunaucVe8J1tKf_z-NQo","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-zdunaucVe8J1tKf_z-NQoz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"xK8mSkkxTABUZV9zZjDPH","sourceHandle":"y2","target":"NV2HAXLEN7tskfgyFrbaf","targetHandle":"z1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-5Oax1p7zIZ9HD2hmENPofz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NV2HAXLEN7tskfgyFrbaf","sourceHandle":"w2","target":"KlXPt-K6br8PtpLgELaCj","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-5Oax1p7zIZ9HD2hmENPofw2-KlXPt-K6br8PtpLgELaCjx1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"5Oax1p7zIZ9HD2hmENPof","sourceHandle":"w2","target":"qrdOARfqGPF9xhF6snbAn","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-5Oax1p7zIZ9HD2hmENPofw2-qrdOARfqGPF9xhF6snbAnx1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NV2HAXLEN7tskfgyFrbaf","sourceHandle":"y2","target":"5Oax1p7zIZ9HD2hmENPof","targetHandle":"z1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-MoG7D9kqPuA6o52-z_WDNy2-5Oax1p7zIZ9HD2hmENPofz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"xK8mSkkxTABUZV9zZjDPH","sourceHandle":"z2","target":"MoG7D9kqPuA6o52-z_WDN","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygz2-MoG7D9kqPuA6o52-z_WDNy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"RvqrjCowu0YK5QWK2ZVyg","sourceHandle":"z2","target":"bnai6R6pOq_L5CPdbVwMW","targetHandle":"y2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygz2-bnai6R6pOq_L5CPdbVwMWy2","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"pFyMiyNQ16-kP7jKaKKEU","sourceHandle":"x2","target":"XRSVRl6iHncMmgSXoB7Lq","targetHandle":"w1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-pFyMiyNQ16-kP7jKaKKEUx2-XRSVRl6iHncMmgSXoB7Lqw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"RvqrjCowu0YK5QWK2ZVyg","sourceHandle":"y2","target":"M2_hBvXou7cCNqsMnexCt","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-M2_hBvXou7cCNqsMnexCtz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"RvqrjCowu0YK5QWK2ZVyg","sourceHandle":"y2","target":"rqPCHh25xX_ROMr-ULpaw","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-rqPCHh25xX_ROMr-ULpawz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"RvqrjCowu0YK5QWK2ZVyg","sourceHandle":"y2","target":"NdfwgwMOewiyEAFyC2l7U","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-NdfwgwMOewiyEAFyC2l7Uz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"RvqrjCowu0YK5QWK2ZVyg","sourceHandle":"y2","target":"f2PG4t6iVtfIH8BVe5H7f","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-f2PG4t6iVtfIH8BVe5H7fz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"KMA7NkxFbPoUDtFnGBFnj","sourceHandle":"x2","target":"0vLaVNJaJSHZ_bHli6Qzs","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-KMA7NkxFbPoUDtFnGBFnjx2-0vLaVNJaJSHZ_bHli6Qzsw1","selected":true,"type":"simplebezier","focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"wBKp8Q5D6WhjVVsD89UHl","sourceHandle":"x2","target":"0vLaVNJaJSHZ_bHli6Qzs","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-wBKp8Q5D6WhjVVsD89UHlx2-0vLaVNJaJSHZ_bHli6Qzsw1","selected":true,"selectable":true,"focusable":true}]} \ No newline at end of file +{"nodes":[{"id":"lGNqOaL2J0jaYewnPbrxZ","type":"vertical","position":{"x":1166.5374122325647,"y":3312.536593518702},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":192,"style":{"width":20,"height":192},"positionAbsolute":{"x":1166.5374122325647,"y":3312.536593518702},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"lqrIjDM7CfF2CNgcIOq3Z","type":"vertical","position":{"x":857.3760409943199,"y":2716.91990782706},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55,"strokeDasharray":"0","strokeLinecap":"round"},"oldId":"GyhfjObOGq-CwF_VIwO8b"},"zIndex":999,"width":20,"height":139,"style":{"width":20,"height":139},"positionAbsolute":{"x":857.3760409943199,"y":2716.91990782706},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"ZRB7mytelAk8pg5gsu2Xs","type":"horizontal","position":{"x":843.0316934344742,"y":2691.91990782706},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.55,"strokeDasharray":"0.8 8","strokeLinecap":"round"}},"zIndex":999,"width":177,"height":20,"style":{"width":177,"height":20},"positionAbsolute":{"x":843.0316934344742,"y":2691.91990782706},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"mGoWfyS0DO8L-JwPDK5p9","type":"vertical","position":{"x":308.03169343447416,"y":2605.7489330045287},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55,"strokeDasharray":"0","strokeLinecap":"round"},"oldId":"GyhfjObOGq-CwF_VIwO8b"},"zIndex":999,"width":20,"height":88,"style":{"width":20,"height":88},"positionAbsolute":{"x":308.03169343447416,"y":2605.7489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"WyueeGiceOzKqHrM2Mn_v","type":"vertical","position":{"x":308.53169343447416,"y":2711.3618259293457},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55,"strokeDasharray":"0.8 8","strokeLinecap":"round"},"oldId":"GyhfjObOGq-CwF_VIwO8b"},"zIndex":999,"width":20,"height":77,"style":{"width":20,"height":77},"positionAbsolute":{"x":308.53169343447416,"y":2711.3618259293457},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"GVLwJZlzs2me5ogEcf_f9","type":"vertical","position":{"x":307.03169343447416,"y":2317.2489330045287},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55},"oldId":"GyhfjObOGq-CwF_VIwO8b"},"zIndex":999,"width":20,"height":225,"style":{"width":20,"height":225},"positionAbsolute":{"x":307.03169343447416,"y":2317.2489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"MtX03b7FVvVq6kDKfmidT","type":"horizontal","position":{"x":364.53169343447416,"y":2479.2489330045287},"selected":true,"data":{"label":"horizontal node","style":{"stroke":"#2B78E4","strokeWidth":3.55}},"zIndex":999,"width":233,"height":20,"style":{"width":233,"height":20},"positionAbsolute":{"x":364.53169343447416,"y":2479.2489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"gZ7dytie1YH3DDtKKcyiQ","type":"vertical","position":{"x":355.53169343447416,"y":2317.2489330045287},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55},"oldId":"GyhfjObOGq-CwF_VIwO8b"},"zIndex":999,"width":20,"height":174,"style":{"width":20,"height":174},"positionAbsolute":{"x":355.53169343447416,"y":2317.2489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"e5O8lUSSEOEFR-dlZV5wN","type":"section","position":{"x":522.0316934344742,"y":2094.2489330045287},"selected":true,"data":{"label":"","style":{"width":150,"height":100,"fontSize":17,"backgroundColor":"#ffffff","borderColor":"#000000"}},"zIndex":-999,"width":217,"height":322,"style":{"width":217,"height":322},"resizing":false,"positionAbsolute":{"x":522.0316934344742,"y":2094.2489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"-KKWgOEFEaVxuaHPDjJmA","type":"vertical","position":{"x":543.8760409943199,"y":1902.348933004529},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":98,"style":{"width":20,"height":98},"positionAbsolute":{"x":543.8760409943199,"y":1902.348933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"bVGSRi7pMd3rHQ1X6UrA1","type":"vertical","position":{"x":1161.0316934344742,"y":1643.848933004529},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":101,"style":{"width":20,"height":101},"positionAbsolute":{"x":1161.0316934344742,"y":1643.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"9tkYqqVy0v42G4tijnDAP","type":"horizontal","position":{"x":428.53169343447416,"y":1371.0489330045289},"selected":true,"data":{"label":"horizontal node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":82,"height":20,"style":{"width":82,"height":20},"positionAbsolute":{"x":428.53169343447416,"y":1371.0489330045289},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"uDsTnM22jHuGBvJfRgv9v","type":"section","position":{"x":208.03169343447416,"y":1307.348933004529},"width":221,"height":217,"style":{"width":221,"height":217},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":208.03169343447416,"y":1307.348933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"I-sIkdwJlt8JK0gdvdloQ","type":"vertical","position":{"x":688.3760409943199,"y":736.548933004529},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.65,"strokeDasharray":"0.8 8","strokeLinecap":"round"}},"zIndex":999,"width":20,"height":77,"style":{"width":20,"height":77},"positionAbsolute":{"x":688.3760409943199,"y":736.548933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"zyFrOb5yF198jH5vjZTg1","type":"vertical","position":{"x":688.3760409943199,"y":830.548933004529},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.65},"oldId":"I-sIkdwJlt8JK0gdvdloQ"},"zIndex":999,"width":20,"height":553,"style":{"width":20,"height":553},"positionAbsolute":{"x":688.3760409943199,"y":830.548933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"CK9zYMrsw7Rl1ux4PU5wl","type":"section","position":{"x":205.53169343447416,"y":289.84893300452904},"width":241,"height":422,"style":{"width":241,"height":422},"selected":true,"data":{"style":{"backgroundColor":"#ffffff","borderColor":"#000000"}},"positionAbsolute":{"x":205.53169343447416,"y":289.84893300452904},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"Qq13cf04JGzV_H3glm_D5","type":"horizontal","position":{"x":446.53169343447416,"y":486.34893300452904},"selected":true,"data":{"label":"horizontal node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":172,"height":20,"style":{"width":172,"height":20},"positionAbsolute":{"x":446.53169343447416,"y":486.34893300452904},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"5Z9o-b3vBA-ITFg86zzYM","type":"title","position":{"x":594.8760409943199,"y":166.2553633125035},"selected":true,"data":{"label":"Git and GitHub","style":{"fontSize":28,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":227,"height":68,"style":{},"positionAbsolute":{"x":594.8760409943199,"y":166.2553633125035},"dragging":false,"selectable":true,"focusable":true},{"id":"XgM_I974PlXAu4AbeqHX1","type":"vertical","position":{"x":698.3760409943199,"y":93.2553633125035},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"}},"zIndex":999,"width":20,"height":73,"style":{"width":20,"height":73},"resizing":false,"positionAbsolute":{"x":698.3760409943199,"y":93.2553633125035},"dragging":false,"focusable":true,"selectable":true},{"id":"yHmHXymPNWwu8p1vvqD3o","type":"paragraph","position":{"x":909.4971847919508,"y":83.84893300452893},"selected":true,"data":{"label":"Find the detailed version of this roadmap along with other similar roadmaps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","borderColor":"#000000","backgroundColor":"#FFFFFf"}},"zIndex":999,"width":353,"height":142,"positionAbsolute":{"x":909.4971847919508,"y":83.84893300452893},"dragging":false,"selectable":true,"focusable":true,"style":{"width":353,"height":142},"resizing":false},{"id":"2zqZkyVgigifcRS1H7F_b","type":"button","position":{"x":921.7005592047509,"y":165.8344964222742},"selected":true,"data":{"label":"roadmap.sh","href":"https://roadmap.sh","color":"#ffffff","backgroundColor":"#4136D6","style":{"fontSize":17}},"zIndex":999,"width":329,"height":49,"dragging":false,"style":{"width":329,"height":49},"resizing":false,"positionAbsolute":{"x":921.7005592047509,"y":165.8344964222742},"selectable":true,"focusable":true},{"id":"HlUUGj3dOZ68t4gIjerXh","type":"topic","position":{"x":570.3760409943199,"y":374.48940199488766},"selected":true,"data":{"label":"Learn the Basics","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":276,"height":49,"positionAbsolute":{"x":570.3760409943199,"y":374.48940199488766},"selectable":true,"focusable":true,"dragging":false,"style":{"width":276,"height":49},"resizing":false},{"id":"bY6b1GV2XQQ52NOx8gWFj","type":"subtopic","position":{"x":984.0316934344742,"y":299.84893300452904},"selected":true,"data":{"label":"What is Version Control?","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":984.0316934344742,"y":299.84893300452904},"dragging":false,"selectable":true,"focusable":true},{"id":"dhIx1GnynvbSUriqYLUt0","type":"subtopic","position":{"x":984.0316934344742,"y":352.84893300452904},"selected":true,"data":{"label":"Why use Version Control?","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":984.0316934344742,"y":352.84893300452904},"dragging":false,"selectable":true,"focusable":true},{"id":"_jSTrYN9G8EsGHkbusKPU","type":"subtopic","position":{"x":984.0316934344742,"y":405.84893300452904},"selected":true,"data":{"label":"Git vs Other VCS","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":984.0316934344742,"y":405.84893300452904},"dragging":false,"selectable":true,"focusable":true},{"id":"v7hCNbgPByi3YiLSs46BK","type":"subtopic","position":{"x":984.0316934344742,"y":458.84893300452904},"selected":true,"data":{"label":"Installing Git Locally","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":275,"height":49,"style":{"width":275,"height":49},"positionAbsolute":{"x":984.0316934344742,"y":458.84893300452904},"dragging":false,"selectable":true,"focusable":true},{"id":"PtU5Qwfzn3N1i3oRlCGoR","type":"topic","position":{"x":570.3760409943199,"y":471.84893300452904},"selected":true,"data":{"label":"What is a Repository","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"bXfCUG3h1TIFPgD4WUDph"},"zIndex":999,"width":276,"height":49,"style":{"width":276,"height":49},"positionAbsolute":{"x":570.3760409943199,"y":471.84893300452904},"dragging":false,"selectable":true,"focusable":true},{"id":"1iOkbO5juk2LO-WZHx_W6","type":"subtopic","position":{"x":214.53169343447416,"y":303.84893300452904},"selected":true,"data":{"label":"git init","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":223,"height":49,"style":{"width":223,"height":49},"positionAbsolute":{"x":214.53169343447416,"y":303.84893300452904},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"NMCWgzhhfUvFOMO5GbF_u","type":"subtopic","position":{"x":214.53169343447416,"y":358.853050782843},"selected":true,"data":{"label":"git config","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":223,"height":49,"style":{"width":223,"height":49},"positionAbsolute":{"x":214.53169343447416,"y":358.853050782843},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"tVvxC5JQgUb_B8kOqYpD8","type":"subtopic","position":{"x":214.53169343447416,"y":412.84893300452904},"selected":true,"data":{"label":"Local vs Global Config","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":223,"height":49,"style":{"width":223,"height":49},"positionAbsolute":{"x":214.53169343447416,"y":412.84893300452904},"dragging":false,"selectable":true,"focusable":true},{"id":"hzL8j8473CoyFf5ab2f_B","type":"label","position":{"x":229.03169343447416,"y":465},"selected":true,"data":{"label":"Repository Initialization","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":194,"height":36,"style":{},"positionAbsolute":{"x":229.03169343447416,"y":465},"dragging":false,"selectable":true,"focusable":true},{"id":"XB_mRInocRU6nPjt_iOo5","type":"label","position":{"x":224.53169343447416,"y":667.848933004529},"selected":true,"data":{"label":"Intro and Git Commands","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":203,"height":36,"style":{},"positionAbsolute":{"x":224.53169343447416,"y":667.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"Sv36oxTZwlUv-i1K28NeP","type":"subtopic","position":{"x":214.53169343447416,"y":506.84893300452904},"selected":true,"data":{"label":"Working Directory","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":223,"height":49,"style":{"width":223,"height":49},"positionAbsolute":{"x":214.53169343447416,"y":506.84893300452904},"dragging":false,"selectable":true,"focusable":true},{"id":"h71Tx3nkfUrnhaqcHlDkQ","type":"subtopic","position":{"x":214.53169343447416,"y":559.848933004529},"selected":true,"data":{"label":"Staging Area","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":223,"height":49,"style":{"width":223,"height":49},"positionAbsolute":{"x":214.53169343447416,"y":559.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"2_z3R7seCvQVj-Na4H1SV","type":"subtopic","position":{"x":214.53169343447416,"y":612.848933004529},"selected":true,"data":{"label":"Committing Changes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":223,"height":49,"style":{"width":223,"height":49},"dragging":false,"resizing":false,"positionAbsolute":{"x":214.53169343447416,"y":612.848933004529},"selectable":true,"focusable":true},{"id":"oz2oRAhaEQb0Fm3aRJQG8","type":"subtopic","position":{"x":207.53169343447416,"y":715.848933004529},"selected":true,"data":{"label":".gitignore","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"IfUm5D_zNaUKMd4HX4Fi4"},"zIndex":999,"width":239,"height":49,"style":{"width":239,"height":49},"dragging":false,"positionAbsolute":{"x":207.53169343447416,"y":715.848933004529},"selectable":true,"focusable":true},{"id":"IfUm5D_zNaUKMd4HX4Fi4","type":"subtopic","position":{"x":207.53169343447416,"y":768.848933004529},"selected":true,"data":{"label":"Viewing Commit History","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":239,"height":49,"style":{"width":239,"height":49},"dragging":false,"positionAbsolute":{"x":207.53169343447416,"y":768.848933004529},"selectable":true,"focusable":true},{"id":"bXfCUG3h1TIFPgD4WUDph","type":"topic","position":{"x":1049.0316934344742,"y":573.848933004529},"selected":true,"data":{"label":"Branching Basics","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":215,"height":49,"style":{"width":215,"height":49},"positionAbsolute":{"x":1049.0316934344742,"y":573.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"OegitQ5Ngjvd3ZfMpfrkM","type":"subtopic","position":{"x":1049.0316934344742,"y":653.0489330045289},"selected":true,"data":{"label":"Creating Branch","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":215,"height":49,"style":{"width":215,"height":49},"positionAbsolute":{"x":1049.0316934344742,"y":653.0489330045289},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"_dPOVUbxApx0pfKPH8fgr","type":"subtopic","position":{"x":1049.0316934344742,"y":706.0489330045289},"selected":true,"data":{"label":"Renaming Branch","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":215,"height":49,"style":{"width":215,"height":49},"positionAbsolute":{"x":1049.0316934344742,"y":706.0489330045289},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"1uDenoQ6zu7CT69FR2iQB","type":"subtopic","position":{"x":1049.0316934344742,"y":759.0489330045289},"selected":true,"data":{"label":"Deleting Branch","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":215,"height":49,"style":{"width":215,"height":49},"positionAbsolute":{"x":1049.0316934344742,"y":759.0489330045289},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"PtRo-wGiNAagZ6CykfvMr","type":"subtopic","position":{"x":1049.0316934344742,"y":812.0489330045289},"selected":true,"data":{"label":"Checkout Branch","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":215,"height":49,"style":{"width":215,"height":49},"positionAbsolute":{"x":1049.0316934344742,"y":812.0489330045289},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"sNuy6NMjLOEkJlqdEjFPq","type":"subtopic","position":{"x":1049.0316934344742,"y":865.0489330045289},"selected":true,"data":{"label":"Merging Basics","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":215,"height":49,"style":{"width":215,"height":49},"positionAbsolute":{"x":1049.0316934344742,"y":865.0489330045289},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"fIfmS6BkkOFWzCB1RqrhK","type":"paragraph","position":{"x":795.8760409943199,"y":703.848933004529},"selected":true,"data":{"label":"Basic Collaboration","style":{"fontSize":20,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"center","padding":16}},"zIndex":999,"width":216,"height":46,"style":{"width":216,"height":46},"resizing":false,"positionAbsolute":{"x":795.8760409943199,"y":703.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"NeSvgS2yA5x8qbcJHrV__","type":"topic","position":{"x":796.8760409943199,"y":799.0489330045289},"selected":true,"data":{"label":"GitHub Essentials","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":214,"height":49,"style":{"width":214,"height":49},"resizing":false,"positionAbsolute":{"x":796.8760409943199,"y":799.0489330045289},"dragging":false,"selectable":true,"focusable":true},{"id":"i7fIIHcBEk473te8bniJ5","type":"subtopic","position":{"x":796.8760409943199,"y":878.848933004529},"selected":true,"data":{"label":"Creating Account","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":214,"height":49,"style":{"width":214,"height":49},"positionAbsolute":{"x":796.8760409943199,"y":878.848933004529},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"qZFtRABvlBbVvsy6T00J2","type":"subtopic","position":{"x":796.8760409943199,"y":931.848933004529},"selected":true,"data":{"label":"GitHub Interface","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":214,"height":49,"style":{"width":214,"height":49},"positionAbsolute":{"x":796.8760409943199,"y":931.848933004529},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"GS3f1FKFVKT0-GJQrgCm8","type":"subtopic","position":{"x":796.8760409943199,"y":984.848933004529},"selected":true,"data":{"label":"Setting up Profile","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":214,"height":49,"style":{"width":214,"height":49},"positionAbsolute":{"x":796.8760409943199,"y":984.848933004529},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"c_FO6xMixrrMo6iisfsvl","type":"subtopic","position":{"x":796.8760409943199,"y":1037.848933004529},"selected":true,"data":{"label":"Creating Repositories","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":214,"height":49,"style":{"width":214,"height":49},"positionAbsolute":{"x":796.8760409943199,"y":1037.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"KbVvFVQ4k77R2_ddsc7WT","type":"subtopic","position":{"x":1076.5316934344742,"y":984.848933004529},"selected":true,"data":{"label":"Profile Readme","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":177,"height":49,"style":{"width":177,"height":49},"resizing":false,"positionAbsolute":{"x":1076.5316934344742,"y":984.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"HEqBbw_A4ZbJI5zEy8ViN","type":"subtopic","position":{"x":1076.5316934344742,"y":1037.848933004529},"selected":true,"data":{"label":"Private vs Public","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":177,"height":49,"style":{"width":177,"height":49},"resizing":false,"positionAbsolute":{"x":1076.5316934344742,"y":1037.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"aWx9WHUrgofcTr8B-fQYe","type":"topic","position":{"x":544.3760409943199,"y":799.0489330045289},"selected":true,"data":{"label":"Git Remotes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"0rHDUbAdXqH9zQW2VfJ8v"},"zIndex":999,"width":179,"height":49,"style":{"width":179,"height":49},"positionAbsolute":{"x":544.3760409943199,"y":799.0489330045289},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"sBQOInoFBU9XfkPZ-JlyT","type":"subtopic","position":{"x":488.37604099431985,"y":608.848933004529},"selected":true,"data":{"label":"Managing Remotes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":249,"height":49,"style":{"width":249,"height":49},"positionAbsolute":{"x":488.37604099431985,"y":608.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"ZVMCh9om37ee1qsecFa-N","type":"subtopic","position":{"x":488.37604099431985,"y":661.848933004529},"selected":true,"data":{"label":"Pushing / Pulling Changes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":249,"height":49,"style":{"width":249,"height":49},"positionAbsolute":{"x":488.37604099431985,"y":661.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"Gybnekbd1rJKTOf4hJ4Sh","type":"subtopic","position":{"x":488.37604099431985,"y":714.848933004529},"selected":true,"data":{"label":"Fetch without Merge","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":249,"height":49,"style":{"width":249,"height":49},"positionAbsolute":{"x":488.37604099431985,"y":714.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"d_GNnB6PBINz1jxGNWAE-","type":"topic","position":{"x":473.37604099431985,"y":1356.5489330045289},"selected":true,"data":{"label":"Collaboration on GitHub","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"zLSGqFLjw2kodmMwurzrY"},"zIndex":999,"width":249,"height":49,"style":{"width":249,"height":49},"positionAbsolute":{"x":473.37604099431985,"y":1356.5489330045289},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"l1Wf7Pe_ah8ycCgslfSK4","type":"subtopic","position":{"x":208.03169343447416,"y":1095.5489330045289},"selected":true,"data":{"label":"Forking vs Cloning","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"positionAbsolute":{"x":208.03169343447416,"y":1095.5489330045289},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"crdllx5cH_seIpgVPvHg_","type":"subtopic","position":{"x":208.03169343447416,"y":1148.5489330045289},"selected":true,"data":{"label":"Issues","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"x6eILrLCQrVpz4j8uOuy6"},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"positionAbsolute":{"x":208.03169343447416,"y":1148.5489330045289},"dragging":false,"selectable":true,"focusable":true},{"id":"1Koej79yTv-OAswVZwgGq","type":"subtopic","position":{"x":488.37604099431985,"y":555.848933004529},"selected":true,"data":{"label":"Cloning Repositories","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"sBQOInoFBU9XfkPZ-JlyT"},"zIndex":999,"width":249,"height":49,"style":{"width":249,"height":49},"positionAbsolute":{"x":488.37604099431985,"y":555.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"x6eILrLCQrVpz4j8uOuy6","type":"subtopic","position":{"x":208.03169343447416,"y":1201.5489330045289},"selected":true,"data":{"label":"Pull Requests","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"positionAbsolute":{"x":208.03169343447416,"y":1201.5489330045289},"dragging":false,"selectable":true,"focusable":true},{"id":"8lXXVFkgK6n5IHaYkYe3l","type":"subtopic","position":{"x":501.87604099431985,"y":1169.5489330045289},"selected":true,"data":{"label":"PR from a Fork","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":161,"height":49,"style":{"width":161,"height":49},"positionAbsolute":{"x":501.87604099431985,"y":1169.5489330045289},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"r-u1vTpUyuvsB0revOU0C","type":"subtopic","position":{"x":502.87604099431985,"y":1222.5489330045289},"selected":true,"data":{"label":"Collaborators","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":160,"height":49,"style":{"width":160,"height":49},"positionAbsolute":{"x":502.87604099431985,"y":1222.5489330045289},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"aFuWO8Z74Lbiwh9F27Yrh","type":"label","position":{"x":527.3760409943199,"y":1276.5489330045289},"selected":true,"data":{"label":"Creating PR","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":110,"height":36,"style":{},"positionAbsolute":{"x":527.3760409943199,"y":1276.5489330045289},"dragging":false,"selectable":true,"focusable":true},{"id":"y4DkB5NvTh41IeT0G2gr-","type":"subtopic","position":{"x":208.03169343447416,"y":1254.5489330045289},"selected":true,"data":{"label":"Labelling Issues / PRs","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"dragging":false,"positionAbsolute":{"x":208.03169343447416,"y":1254.5489330045289},"resizing":false,"selectable":true,"focusable":true},{"id":"dQS1V0zZxeKhHhUo3STBK","type":"subtopic","position":{"x":215.53169343447416,"y":1315.348933004529},"selected":true,"data":{"label":"Saved Replies","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":206,"height":49,"style":{"width":206,"height":49},"positionAbsolute":{"x":215.53169343447416,"y":1315.348933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"oWMaOWU06juoIuzXNe-wt","type":"subtopic","position":{"x":215.53169343447416,"y":1368.348933004529},"selected":true,"data":{"label":"Mentions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":206,"height":49,"style":{"width":206,"height":49},"positionAbsolute":{"x":215.53169343447416,"y":1368.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"XstmIysIi_lWo6RzszLBt","type":"subtopic","position":{"x":215.53169343447416,"y":1421.348933004529},"selected":true,"data":{"label":"Reactions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":206,"height":49,"style":{"width":206,"height":49},"positionAbsolute":{"x":215.53169343447416,"y":1421.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"Lw3oG5flufLskTN1AGIGc","type":"label","position":{"x":241.53169343447416,"y":1481.348933004529},"selected":true,"data":{"label":"Commenting","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":154,"height":36,"style":{"width":154},"positionAbsolute":{"x":241.53169343447416,"y":1481.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"0rHDUbAdXqH9zQW2VfJ8v","type":"topic","position":{"x":544.3760409943199,"y":931.848933004529},"selected":true,"data":{"label":"Merge Strategies","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"zLSGqFLjw2kodmMwurzrY"},"zIndex":999,"width":179,"height":49,"style":{"width":179,"height":49},"positionAbsolute":{"x":544.3760409943199,"y":931.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"agtPWS8j6i6wQPk10cy8E","type":"subtopic","position":{"x":208.53169343447416,"y":852.0489330045289},"selected":true,"data":{"label":"Fast-Forward vs Non-FF","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Z-srOhYFGVEKDexlJ6cjt"},"zIndex":999,"width":235,"height":49,"style":{"width":235,"height":49},"positionAbsolute":{"x":208.53169343447416,"y":852.0489330045289},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"9Dt4Gyiiq5jteWSKxsRMK","type":"subtopic","position":{"x":208.53169343447416,"y":958.0489330045289},"selected":true,"data":{"label":"Handling Conflicts","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"eFf2fesrs-1aVM5tH3ORQ"},"zIndex":999,"width":235,"height":49,"style":{"width":235,"height":49},"positionAbsolute":{"x":208.53169343447416,"y":958.0489330045289},"selectable":true,"focusable":true,"dragging":false},{"id":"99FVJ3Zs8n6lr8L95mG6g","type":"subtopic","position":{"x":208.53169343447416,"y":905.0489330045289},"selected":true,"data":{"label":"Rebase","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Z-srOhYFGVEKDexlJ6cjt"},"zIndex":999,"width":115,"height":49,"style":{"width":115,"height":49},"positionAbsolute":{"x":208.53169343447416,"y":905.0489330045289},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"Z-srOhYFGVEKDexlJ6cjt","type":"subtopic","position":{"x":329.53169343447416,"y":905.0489330045289},"selected":true,"data":{"label":"Squash","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":114,"height":49,"style":{"width":114,"height":49},"positionAbsolute":{"x":329.53169343447416,"y":905.0489330045289},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"eFf2fesrs-1aVM5tH3ORQ","type":"subtopic","position":{"x":208.53169343447416,"y":1011.0489330045289},"selected":true,"data":{"label":"Cherry Picking Commits","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":235,"height":49,"style":{"width":235,"height":49},"positionAbsolute":{"x":208.53169343447416,"y":1011.0489330045289},"selectable":true,"focusable":true,"dragging":false},{"id":"C1ai9r31b7HPySw0o9tyT","type":"paragraph","position":{"x":816.3760409943199,"y":1360.0489330045289},"selected":true,"data":{"label":"Best Practices","style":{"fontSize":17,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"center","padding":16}},"zIndex":999,"width":172,"height":42,"style":{"width":172,"height":42},"positionAbsolute":{"x":816.3760409943199,"y":1360.0489330045289},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"7lRUYWNSpHvJ-QyIE8RMa","type":"subtopic","position":{"x":786.8760409943199,"y":1106.848933004529},"selected":true,"data":{"label":"Commit Messages","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":231,"height":49,"style":{"width":231,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1106.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"ks1Pip-RM-UWD6zuF2j4n","type":"subtopic","position":{"x":786.8760409943199,"y":1159.848933004529},"selected":true,"data":{"label":"Branch Naming","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":231,"height":49,"style":{"width":231,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1159.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"GwDNk2HBjASr_NWIL4G3-","type":"subtopic","position":{"x":786.8760409943199,"y":1212.848933004529},"selected":true,"data":{"label":"PR Guidelines","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":231,"height":49,"style":{"width":231,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1212.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"xLB2fhsOm0Vu3xg_PusJB","type":"subtopic","position":{"x":786.8760409943199,"y":1265.848933004529},"selected":true,"data":{"label":"Code Reviews","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"i3AbARgzQtxtlB-1AS8zv"},"zIndex":999,"width":231,"height":49,"style":{"width":231,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1265.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"pJ-najh7dXhhYA_0bDiR5","type":"subtopic","position":{"x":786.8760409943199,"y":1447.348933004529},"selected":true,"data":{"label":"Contribution Guidelines","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"i3AbARgzQtxtlB-1AS8zv"},"zIndex":999,"width":231,"height":49,"style":{"width":231,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1447.348933004529},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"D2WIExwfSnkAPIa5O-Hp5","type":"topic","position":{"x":1068.0316934344742,"y":1356.5489330045289},"selected":true,"data":{"label":"Documentation","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1068.0316934344742,"y":1356.5489330045289},"dragging":false,"selectable":true,"focusable":true},{"id":"1Ulxl4VUvRSfyCPpi-iv8","type":"subtopic","position":{"x":1068.0316934344742,"y":1108.848933004529},"selected":true,"data":{"label":"Markdown","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1068.0316934344742,"y":1108.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"WIVr7JxO1AJTNObW8mtY3","type":"subtopic","position":{"x":1068.0316934344742,"y":1160.848933004529},"selected":true,"data":{"label":"Project Readme","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1068.0316934344742,"y":1161.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"lONqOqD-4slxa9B5i9ADX","type":"subtopic","position":{"x":1068.0316934344742,"y":1212.848933004529},"selected":true,"data":{"label":"GitHub Wikis","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Ddkss13_qDJTquDHbVTVs"},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1068.0316934344742,"y":1214.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"i3AbARgzQtxtlB-1AS8zv","type":"subtopic","position":{"x":786.8760409943199,"y":1500.348933004529},"selected":true,"data":{"label":"Clean Git History","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":231,"height":49,"style":{"width":231,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1500.348933004529},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"yMx3LdadPz4g25CL3N8da","type":"topic","position":{"x":1068.0316934344742,"y":1631.848933004529},"selected":true,"data":{"label":"Working in a Team","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1068.0316934344742,"y":1631.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"RMrxQLhrINO5g4Mhxh5qS","type":"subtopic","position":{"x":1020.0316934344742,"y":1773.848933004529},"selected":true,"data":{"label":"GitHub Organizations","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":248,"height":49,"style":{"width":248,"height":49},"positionAbsolute":{"x":1020.0316934344742,"y":1773.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"_ft-uvXt6s_xrcMT3fbSF","type":"subtopic","position":{"x":1020.0316934344742,"y":1720.848933004529},"selected":true,"data":{"label":"Collaborators / Members","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":248,"height":49,"style":{"width":248,"height":49},"positionAbsolute":{"x":1020.0316934344742,"y":1720.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"wydgCxR5VnieBpRolXt8i","type":"subtopic","position":{"x":1020.0316934344742,"y":1826.848933004529},"selected":true,"data":{"label":"Teams within Organization","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":248,"height":49,"style":{"width":248,"height":49},"positionAbsolute":{"x":1020.0316934344742,"y":1826.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"DzFJDdqnSy5GeGHWOpcVo","type":"topic","position":{"x":786.8760409943199,"y":1631.348933004529},"selected":true,"data":{"label":"GitHub Projects","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":181,"height":49,"style":{"width":181,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1631.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"q0zy_hXav5iXw8LpGVJVd","type":"subtopic","position":{"x":786.8760409943199,"y":1723.348933004529},"selected":true,"data":{"label":"Project Planning","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":181,"height":49,"style":{"width":181,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1723.348933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"RFJgfuxoVxt22QlwLI5mW","type":"subtopic","position":{"x":786.8760409943199,"y":1776.348933004529},"selected":true,"data":{"label":"Kanban Boards","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":181,"height":49,"style":{"width":181,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1776.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"sxvT2hGko2PDRBoBrCGWD","type":"subtopic","position":{"x":786.8760409943199,"y":1829.348933004529},"selected":true,"data":{"label":"Roadmaps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":181,"height":49,"style":{"width":181,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1829.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"TNBz5755PhI6iKxTQTqcS","type":"subtopic","position":{"x":786.8760409943199,"y":1882.348933004529},"selected":true,"data":{"label":"Automations","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":181,"height":49,"style":{"width":181,"height":49},"positionAbsolute":{"x":786.8760409943199,"y":1882.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"snWQHCQECZyUXHdn6ppIk","type":"subtopic","position":{"x":207.53169343447416,"y":1528},"selected":true,"data":{"label":"GitHub Discussions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"positionAbsolute":{"x":207.53169343447416,"y":1528},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"hes8XQqAvpxWITcbU9tiH","type":"paragraph","position":{"x":501.37604099431985,"y":1630.848933004529},"selected":true,"data":{"label":"Intermediate Git Topics","style":{"fontSize":17,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"center","padding":16},"oldId":"C1ai9r31b7HPySw0o9tyT"},"zIndex":999,"width":221,"height":50,"style":{"width":221,"height":50},"positionAbsolute":{"x":501.37604099431985,"y":1630.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"X9K3PBpGsMoXkJsKdJPI7","type":"topic","position":{"x":519.3760409943199,"y":1519},"selected":true,"data":{"label":"Git Stash Basics","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":185,"height":49,"style":{"width":185},"positionAbsolute":{"x":519.3760409943199,"y":1519},"dragging":false,"selectable":true,"focusable":true},{"id":"zen3RRdK9_nPAYgicRoHk","type":"topic","position":{"x":543.8760409943199,"y":1720.848933004529},"selected":true,"data":{"label":"History","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"iFJBF-EEnLjQVsFSXjo_i"},"zIndex":999,"width":136,"height":49,"style":{"width":136,"height":49},"positionAbsolute":{"x":543.8760409943199,"y":1720.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"lXC07j6dOa3rQixY1P-Ob","type":"subtopic","position":{"x":207.53169343447416,"y":1628.848933004529},"selected":true,"data":{"label":"Linear vs Non-Linear","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"positionAbsolute":{"x":207.53169343447416,"y":1628.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"V8nLIvddyOKTzEjOJX5GW","type":"subtopic","position":{"x":207.53169343447416,"y":1681.848933004529},"selected":true,"data":{"label":"HEAD","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"positionAbsolute":{"x":207.53169343447416,"y":1681.848933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"0cLf7FiI9CX--UX45sm2f","type":"subtopic","position":{"x":207.53169343447416,"y":1734.848933004529},"selected":true,"data":{"label":"Detached HEAD","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"positionAbsolute":{"x":207.53169343447416,"y":1734.848933004529},"dragging":false,"resizing":true,"selectable":true,"focusable":true},{"id":"qFEonbCMLri8iA0yONwuf","type":"subtopic","position":{"x":207.53169343447416,"y":1787.848933004529},"selected":true,"data":{"label":"git log options","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":221,"height":49,"style":{"width":221,"height":49},"positionAbsolute":{"x":207.53169343447416,"y":1787.848933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"0Yi4cryT2v2SGBjouOas3","type":"topic","position":{"x":518.3760409943199,"y":1980.348933004529},"selected":true,"data":{"label":"Undoing Changes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"iFJBF-EEnLjQVsFSXjo_i"},"zIndex":999,"width":186,"height":49,"style":{"width":186,"height":49},"positionAbsolute":{"x":518.3760409943199,"y":1980.348933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"dLr55Om7IOvI53c1DgTKc","type":"subtopic","position":{"x":473.37604099431985,"y":1878.348933004529},"selected":true,"data":{"label":"git revert","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":116,"height":49,"style":{"width":116,"height":49},"positionAbsolute":{"x":473.37604099431985,"y":1878.348933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"igrR7LguU1jemg_mf_AD6","type":"subtopic","position":{"x":374.37604099431985,"y":1980.348933004529},"selected":true,"data":{"label":"git reset","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":109,"height":49,"style":{"width":109,"height":49},"positionAbsolute":{"x":374.37604099431985,"y":1980.348933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"Uc7FyfAKpDFRGRNHwztFo","type":"subtopic","position":{"x":210.03169343447416,"y":1927.348933004529},"selected":true,"data":{"label":"--soft","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":103,"height":49,"style":{"width":103,"height":49},"positionAbsolute":{"x":210.03169343447416,"y":1927.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"V_joZNpQsS9G9PI-o-GmC","type":"subtopic","position":{"x":210.03169343447416,"y":1980.348933004529},"selected":true,"data":{"label":"--hard","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":103,"height":49,"style":{"width":103,"height":49},"positionAbsolute":{"x":210.03169343447416,"y":1980.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"qis7Z5VRxMcOmbesQlegZ","type":"subtopic","position":{"x":210.03169343447416,"y":2033.348933004529},"selected":true,"data":{"label":"--mixed","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":103,"height":49,"style":{"width":103,"height":49},"positionAbsolute":{"x":210.03169343447416,"y":2033.348933004529},"dragging":false,"selectable":true,"focusable":true},{"id":"-0zQvCHG8jS_ghSjmTeIx","type":"topic","position":{"x":792.8760409943199,"y":1980.348933004529},"selected":true,"data":{"label":"Viewing Diffs","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"iFJBF-EEnLjQVsFSXjo_i"},"zIndex":999,"width":176,"height":49,"style":{"width":176,"height":49},"positionAbsolute":{"x":792.8760409943199,"y":1980.348933004529},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"Rwpeltygwzcf6hnuZNURE","type":"subtopic","position":{"x":1064.5316934344742,"y":1897.7489330045287},"selected":true,"data":{"label":"Between Commits","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":201,"height":49,"style":{"width":201},"positionAbsolute":{"x":1064.5316934344742,"y":1897.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"O-zoAWkDvyn7B8_TmY257","type":"subtopic","position":{"x":1064.5316934344742,"y":1950.7489330045287},"selected":true,"data":{"label":"Between Branches","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":201,"height":49,"style":{"width":201},"positionAbsolute":{"x":1064.5316934344742,"y":1950.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"mzjtCdpke1ayHcEuS-YUS","type":"subtopic","position":{"x":1064.5316934344742,"y":2003.7489330045287},"selected":true,"data":{"label":"Staged Changes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":201,"height":49,"style":{"width":201},"positionAbsolute":{"x":1064.5316934344742,"y":2003.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"uxqJzQFRcALqatNRIWR0w","type":"subtopic","position":{"x":1064.5316934344742,"y":2056.7489330045287},"selected":true,"data":{"label":"Unstaged Changes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":201,"height":49,"style":{"width":201,"height":49},"positionAbsolute":{"x":1064.5316934344742,"y":2056.7489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"sOoC-XxEoIvwKct00oKlX","type":"topic","position":{"x":792.8760409943199,"y":2217.7489330045287},"selected":true,"data":{"label":"Rewriting History","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"iFJBF-EEnLjQVsFSXjo_i"},"zIndex":999,"width":176,"height":49,"style":{"width":176,"height":49},"positionAbsolute":{"x":792.8760409943199,"y":2217.7489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"NjPnEXLf1Lt9qzgxccogv","type":"subtopic","position":{"x":1070.0316934344742,"y":2138.7489330045287},"selected":true,"data":{"label":"git commit --amend","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1070.0316934344742,"y":2138.7489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"HMEfUFNu_Wp_Pac7VWHr-","type":"subtopic","position":{"x":1070.0316934344742,"y":2191.7489330045287},"selected":true,"data":{"label":"git rebase","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1070.0316934344742,"y":2191.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"BKVA6Q7DXemAYjyQOA0nh","type":"subtopic","position":{"x":1070.0316934344742,"y":2244.7489330045287},"selected":true,"data":{"label":"git filter-branch","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1070.0316934344742,"y":2244.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"OQOmxg9mCfcjt80hpvXkA","type":"subtopic","position":{"x":1070.0316934344742,"y":2297.7489330045287},"selected":true,"data":{"label":"git push --force","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1070.0316934344742,"y":2297.7489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"iFJBF-EEnLjQVsFSXjo_i","type":"topic","position":{"x":791.8760409943199,"y":2465.2489330045287},"selected":true,"data":{"label":"Tagging","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":176,"height":49,"style":{"width":176,"height":49},"positionAbsolute":{"x":791.8760409943199,"y":2465.2489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"NeU38WPbEphJuJ_AMkH82","type":"subtopic","position":{"x":1070.0316934344742,"y":2383.7489330045287},"selected":true,"data":{"label":"Managing Tags","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1070.0316934344742,"y":2383.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"E3HAGNM-kXLL4Oci5JzpQ","type":"subtopic","position":{"x":1070.0316934344742,"y":2436.7489330045287},"selected":true,"data":{"label":"Pushing Tags","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1070.0316934344742,"y":2436.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"62E1tDMXB6K74OEN0WsS0","type":"subtopic","position":{"x":1070.0316934344742,"y":2489.7489330045287},"selected":true,"data":{"label":"Checkout Tags","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1070.0316934344742,"y":2489.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"YmnTrjJtqHPXbEVrP8vd7","type":"subtopic","position":{"x":1070.0316934344742,"y":2542.7489330045287},"selected":true,"data":{"label":"GitHub Releases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1070.0316934344742,"y":2542.7489330045287},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"pqBV7BMAs0z6qpfZeW2XP","type":"topic","position":{"x":567.5316934344742,"y":2465.2489330045287},"selected":true,"data":{"label":"Git hooks","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"sFf1PdFfmEdQxsEntfeFq"},"zIndex":999,"width":126,"height":49,"style":{"width":126.25,"height":49},"positionAbsolute":{"x":567.5316934344742,"y":2465.2489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"v7uabKuMQPOD_hBIaHOVT","type":"subtopic","position":{"x":521.0316934344742,"y":2540.7489330045287},"selected":true,"data":{"label":"What and Why?","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":219,"height":49,"style":{"width":219,"height":49},"positionAbsolute":{"x":521.0316934344742,"y":2540.7489330045287},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"zsU6R2zvJKnYNU2ac4o4p","type":"subtopic","position":{"x":521.0316934344742,"y":2593.7489330045287},"selected":true,"data":{"label":"Client vs Server Hooks","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":219,"height":49,"style":{"width":219,"height":49},"positionAbsolute":{"x":521.0316934344742,"y":2593.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"jzYjHx-gIKSP8dQUTqWVw","type":"subtopic","position":{"x":532.0316934344742,"y":2105.2489330045287},"selected":true,"data":{"label":"commit-msg","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":197,"height":49,"style":{"width":197,"height":49},"positionAbsolute":{"x":532.0316934344742,"y":2105.2489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"SANEQI2rgOtsMQyn4qUCq","type":"subtopic","position":{"x":532.0316934344742,"y":2158.2489330045287},"selected":true,"data":{"label":"post-checkout","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":197,"height":49,"style":{"width":197,"height":49},"positionAbsolute":{"x":532.0316934344742,"y":2158.2489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"buxb5TpzQ-xxn0vqtGdS3","type":"subtopic","position":{"x":532.0316934344742,"y":2211.2489330045287},"selected":true,"data":{"label":"post-update","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":197,"height":49,"style":{"width":197,"height":49},"positionAbsolute":{"x":532.0316934344742,"y":2211.2489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"HhpAIzYMlMiQ9msrYZyDB","type":"subtopic","position":{"x":532.0316934344742,"y":2264.2489330045287},"selected":true,"data":{"label":"pre-commit","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":197,"height":49,"style":{"width":197,"height":49},"positionAbsolute":{"x":532.0316934344742,"y":2264.2489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"j5kWEUKwBFg5EMm8-61K9","type":"subtopic","position":{"x":532.0316934344742,"y":2317.2489330045287},"selected":true,"data":{"label":"pre-push","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":197,"height":49,"style":{"width":197,"height":49},"positionAbsolute":{"x":532.0316934344742,"y":2317.2489330045287},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"fEdLEowaTG4nyqxV5BPbk","type":"label","position":{"x":561.5316934344742,"y":2371.2489330045287},"selected":true,"data":{"label":"Common Hooks","href":"","color":"#000000","style":{"fontSize":17}},"zIndex":999,"width":138,"height":36,"style":{},"positionAbsolute":{"x":561.5316934344742,"y":2371.2489330045287},"selectable":true,"focusable":true,"dragging":false},{"id":"fjAFNjNNbPOzme9Uk_fDV","type":"topic","position":{"x":249.03169343447416,"y":2293.7489330045287},"selected":true,"data":{"label":"Submodules","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":170,"height":49,"style":{"width":170,"height":49},"focusable":true,"dragging":false,"positionAbsolute":{"x":249.03169343447416,"y":2293.7489330045287},"selectable":true,"resizing":false},{"id":"x4bnsPVTiX2xOCSyrgWpF","type":"subtopic","position":{"x":222.03169343447416,"y":2188.2489330045287},"selected":true,"data":{"label":"Adding / Updating","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"d0-u_-_vtPK8tnUpnj_NB"},"zIndex":999,"width":224,"height":49,"style":{"width":224,"height":49},"positionAbsolute":{"x":222.03169343447416,"y":2188.2489330045287},"selectable":true,"focusable":true,"dragging":false},{"id":"d0-u_-_vtPK8tnUpnj_NB","type":"subtopic","position":{"x":222.03169343447416,"y":2135.2489330045287},"selected":true,"data":{"label":"What and Why use?","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":224,"height":49,"style":{"width":224,"height":49},"positionAbsolute":{"x":222.03169343447416,"y":2135.2489330045287},"selectable":true,"focusable":true,"dragging":false,"resizing":false},{"id":"Nr3MMuTWvDY6p1N7gSRDz","type":"paragraph","position":{"x":207.53169343447416,"y":2548.7489330045287},"selected":true,"data":{"label":"GitHub Workflow","style":{"fontSize":20,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"center","padding":16}},"zIndex":999,"width":219,"height":45,"style":{"width":219,"height":45},"resizing":false,"dragging":false,"positionAbsolute":{"x":207.53169343447416,"y":2548.7489330045287},"selectable":true,"focusable":true},{"id":"h9cf_dh_pwjialOXOlNW-","type":"topic","position":{"x":253.53169343447416,"y":2679.362719846154},"selected":true,"data":{"label":"GitHub CLI","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"AmetdCURXXob5TUsikAab"},"zIndex":999,"width":134,"height":49,"style":{"width":134,"height":49},"positionAbsolute":{"x":253.53169343447416,"y":2679.362719846154},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"vHfpoVbOW0DHNtiy0VN4X","type":"subtopic","position":{"x":205.53169343447416,"y":2765.2779308290865},"selected":true,"data":{"label":"Installation and Setup","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":243,"height":50,"style":{"width":243,"height":50},"dragging":false,"positionAbsolute":{"x":205.53169343447416,"y":2765.2779308290865},"selectable":true,"focusable":true},{"id":"lw4zHuhtxIO4kDvbyiVfq","type":"subtopic","position":{"x":205.53169343447416,"y":2819.2779308290865},"selected":true,"data":{"label":"Repository management","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":243,"height":49,"style":{"width":243,"height":49},"resizing":false,"positionAbsolute":{"x":205.53169343447416,"y":2819.2779308290865},"dragging":false,"selectable":true,"focusable":true},{"id":"kGnZifvXbHBf5zXIsfAQw","type":"subtopic","position":{"x":205.53169343447416,"y":2872.2779308290865},"selected":true,"data":{"label":"Issue Management","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":243,"height":49,"style":{"width":243,"height":49},"positionAbsolute":{"x":205.53169343447416,"y":2872.2779308290865},"dragging":false,"selectable":true,"focusable":true},{"id":"s3MzDYFPMASqiS8UnvWzW","type":"subtopic","position":{"x":205.53169343447416,"y":2925.2779308290865},"selected":true,"data":{"label":"Pull Requests","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Y0EWgPsS4kZxH3y53jNxY"},"zIndex":999,"width":243,"height":49,"style":{"width":243,"height":49},"positionAbsolute":{"x":205.53169343447416,"y":2925.2779308290865},"dragging":false,"selectable":true,"focusable":true},{"id":"AmetdCURXXob5TUsikAab","type":"topic","position":{"x":785.8760409943199,"y":2677.41990782706},"selected":true,"data":{"label":"GitHub Actions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":163,"height":49,"style":{"width":163,"height":49},"positionAbsolute":{"x":785.8760409943199,"y":2677.41990782706},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"p6rq3lQ9YRrTqwcc31O23","type":"subtopic","position":{"x":1042.8707774220793,"y":2630.41990782706},"selected":true,"data":{"label":"YAML Syntax","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1042.8707774220793,"y":2630.41990782706},"dragging":false,"selectable":true,"focusable":true},{"id":"55uHPFNwYPVZx8Cy3c985","type":"subtopic","position":{"x":1040.9255430960754,"y":2683.41990782706},"selected":true,"data":{"label":"Workflow Triggers","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1040.9255430960754,"y":2683.41990782706},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"uS1H9KoKGNONvETCuFBbz","type":"subtopic","position":{"x":1040.7423034439896,"y":2736.41990782706},"selected":true,"data":{"label":"Scheduled Worfklows","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1040.7423034439896,"y":2736.41990782706},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"6QwlY3dEvjfAOPALcWKXQ","type":"subtopic","position":{"x":1040.9255430960754,"y":2789.41990782706},"selected":true,"data":{"label":"Workflow Runners","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1040.9255430960754,"y":2789.41990782706},"dragging":false,"selectable":true,"focusable":true},{"id":"BnPiTu1Jw2kIW560a2A5T","type":"subtopic","position":{"x":1040.9255430960754,"y":2842.41990782706},"selected":true,"data":{"label":"Workflow Context","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1040.9255430960754,"y":2842.41990782706},"dragging":false,"selectable":true,"focusable":true},{"id":"aflP7oWsQzAr4YPo2LLiQ","type":"subtopic","position":{"x":1040.9255430960754,"y":2895.41990782706},"selected":true,"data":{"label":"Secrets and Env Vars","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1040.9255430960754,"y":2895.41990782706},"dragging":false,"selectable":true,"focusable":true},{"id":"HMNhzzV6ApTKj4I_FOmUB","type":"subtopic","position":{"x":1040.9255430960754,"y":2948.41990782706},"selected":true,"data":{"label":"Caching Dependencies","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1040.9255430960754,"y":2948.41990782706},"dragging":false,"selectable":true,"focusable":true},{"id":"alysXC4b1hGi9ZdQ5-40y","type":"subtopic","position":{"x":1040.9255430960754,"y":3001.41990782706},"selected":true,"data":{"label":"Storing Artifacts","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1040.9255430960754,"y":3001.41990782706},"dragging":false,"selectable":true,"focusable":true},{"id":"jc4R1zhd1YeCEbVuxwJWy","type":"subtopic","position":{"x":1040.9255430960754,"y":3054.41990782706},"selected":true,"data":{"label":"Workflow Status","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1040.9255430960754,"y":3054.41990782706},"dragging":false,"selectable":true,"focusable":true},{"id":"SsogoCgJIbeTD6tk8UhTe","type":"subtopic","position":{"x":1040.9255430960754,"y":3107.41990782706},"selected":true,"data":{"label":"Marketplace Actions","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":226,"height":49,"style":{"width":226,"height":49},"positionAbsolute":{"x":1040.9255430960754,"y":3107.41990782706},"dragging":false,"selectable":true,"focusable":true},{"id":"PUnYNBrAZWoZiopjtNgnA","type":"subtopic","position":{"x":781.8760409943199,"y":2595.7489330045287},"selected":true,"data":{"label":"Usecases","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"Ni3HKVLanFvSrJ3u8i5I1"},"zIndex":999,"width":171,"height":49,"style":{"width":171,"height":49},"positionAbsolute":{"x":781.8760409943199,"y":2595.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"Ni3HKVLanFvSrJ3u8i5I1","type":"subtopic","position":{"x":781.8760409943199,"y":2542.7489330045287},"selected":true,"data":{"label":"What are these?","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":171,"height":49,"style":{"width":171,"height":49},"positionAbsolute":{"x":781.8760409943199,"y":2542.7489330045287},"dragging":false,"selectable":true,"focusable":true},{"id":"ninjmIn5APEPuIbDhRuUh","type":"vertical","position":{"x":1010.8760409943199,"y":2632.91990782706},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55}},"zIndex":999,"width":20,"height":521,"style":{"width":20,"height":521},"positionAbsolute":{"x":1010.8760409943199,"y":2632.91990782706},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"Y0EWgPsS4kZxH3y53jNxY","type":"subtopic","position":{"x":205.53169343447416,"y":2978.2779308290865},"selected":true,"data":{"label":"Use in Automation","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":243,"height":49,"style":{"width":243,"height":49},"positionAbsolute":{"x":205.53169343447416,"y":2978.2779308290865},"dragging":false,"selectable":true,"focusable":true},{"id":"sFf1PdFfmEdQxsEntfeFq","type":"topic","position":{"x":395.53169343447416,"y":2464.7489330045287},"selected":true,"data":{"label":"Git Patch","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":124,"height":49,"style":{"width":124,"height":49},"positionAbsolute":{"x":395.53169343447416,"y":2464.7489330045287},"dragging":false,"selectable":true,"focusable":true,"resizing":false},{"id":"Q7BSE-ueezjXkYluzMecJ","type":"paragraph","position":{"x":746.0316934344742,"y":2869.102227419993},"selected":true,"data":{"label":"Advanced Git Topics","style":{"fontSize":20,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"center","padding":16},"oldId":"RvqrjCowu0YK5QWK2ZVyg"},"zIndex":999,"width":238,"height":43,"style":{"width":238,"height":43},"resizing":false,"dragging":false,"positionAbsolute":{"x":746.0316934344742,"y":2869.102227419993},"selectable":true,"focusable":true},{"id":"hru0sL1-D4bJSQI1efEyU","type":"subtopic","position":{"x":479.407889216747,"y":2763.102227419993},"selected":true,"data":{"label":"Git Reflog","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":154,"height":49,"style":{"width":154,"height":49},"positionAbsolute":{"x":479.407889216747,"y":2763.102227419993},"dragging":false,"selectable":true,"focusable":true},{"id":"ExXuwTQSI_lg4SRGW3Iu1","type":"subtopic","position":{"x":479.407889216747,"y":2816.102227419993},"selected":true,"data":{"label":"Git Bisect","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":154,"height":49,"style":{"width":154,"height":49},"positionAbsolute":{"x":479.407889216747,"y":2816.102227419993},"dragging":false,"selectable":true,"focusable":true},{"id":"4dxVN81rXWn6VZqK99yq0","type":"subtopic","position":{"x":479.407889216747,"y":2869.102227419993},"selected":true,"data":{"label":"Git Worktree","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":154,"height":49,"style":{"width":154,"height":49},"positionAbsolute":{"x":479.407889216747,"y":2869.102227419993},"selectable":true,"focusable":true,"dragging":false},{"id":"CGj_UX5JMOOCKinedsNRc","type":"subtopic","position":{"x":479.407889216747,"y":2922.102227419993},"selected":true,"data":{"label":"Git Attributes","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":154,"height":49,"style":{"width":154,"height":49},"positionAbsolute":{"x":479.407889216747,"y":2922.102227419993},"dragging":false,"selectable":true,"focusable":true},{"id":"zdunaucVe8J1tKf_z-NQo","type":"subtopic","position":{"x":479.407889216747,"y":2975.102227419993},"selected":true,"data":{"label":"Git LFS","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":155,"height":49,"style":{"width":155,"height":49},"positionAbsolute":{"x":479.407889216747,"y":2975.102227419993},"dragging":false,"selectable":true,"focusable":true},{"id":"xK8mSkkxTABUZV9zZjDPH","type":"paragraph","position":{"x":732.5316934344742,"y":3200.29226453252},"selected":true,"data":{"label":"GitHub Developer Tools","style":{"fontSize":20,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"center","padding":16},"oldId":"RvqrjCowu0YK5QWK2ZVyg"},"zIndex":999,"width":265,"height":42,"style":{"width":265,"height":42},"resizing":false,"dragging":false,"positionAbsolute":{"x":732.5316934344742,"y":3200.29226453252},"selectable":true,"focusable":true},{"id":"CDde9XlrZz6YZa9oo5WHl","type":"vertical","position":{"x":857.3760409943199,"y":2924.602227419993},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55,"strokeDasharray":"0","strokeLinecap":"round"},"oldId":"GyhfjObOGq-CwF_VIwO8b"},"zIndex":999,"width":20,"height":265,"style":{"width":20,"height":265},"positionAbsolute":{"x":857.3760409943199,"y":2924.602227419993},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"NV2HAXLEN7tskfgyFrbaf","type":"topic","position":{"x":479.407889216747,"y":3196.79226453252},"selected":true,"data":{"label":"GitHub API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"MoG7D9kqPuA6o52-z_WDN"},"zIndex":999,"width":155,"height":49,"style":{"width":155,"height":49},"positionAbsolute":{"x":479.407889216747,"y":3196.79226453252},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"lSCnKhmRr6xrKVYxO8idD","type":"subtopic","position":{"x":479.407889216747,"y":3058.4066404943324},"selected":true,"data":{"label":"REST API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":155,"height":49,"style":{"width":155,"height":49},"positionAbsolute":{"x":479.407889216747,"y":3058.4066404943324},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"KlXPt-K6br8PtpLgELaCj","type":"subtopic","position":{"x":479.407889216747,"y":3111.4066404943324},"selected":true,"data":{"label":"GraphQL API","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":155,"height":49,"style":{"width":155,"height":49},"positionAbsolute":{"x":479.407889216747,"y":3111.4066404943324},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"5Oax1p7zIZ9HD2hmENPof","type":"topic","position":{"x":215.03169343447416,"y":3196.79226453252},"selected":true,"data":{"label":"Creating Apps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":155,"height":49,"style":{"width":155,"height":49},"positionAbsolute":{"x":215.03169343447416,"y":3196.79226453252},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"560GJXFTt7DPdJjKtSDOo","type":"subtopic","position":{"x":215.53169343447416,"y":3059.400921696242},"selected":true,"data":{"label":"GitHub Apps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":154,"height":49,"style":{"width":154,"height":49.28173828125},"positionAbsolute":{"x":215.53169343447416,"y":3059.400921696242},"dragging":false,"selectable":true,"focusable":true},{"id":"qrdOARfqGPF9xhF6snbAn","type":"subtopic","position":{"x":215.53169343447416,"y":3112.400921696242},"selected":true,"data":{"label":"OAuth Apps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":154,"height":49,"style":{"width":154},"positionAbsolute":{"x":215.53169343447416,"y":3112.400921696242},"dragging":false,"selectable":true,"focusable":true},{"id":"MoG7D9kqPuA6o52-z_WDN","type":"topic","position":{"x":1079.0316934344742,"y":3196.79226453252},"selected":true,"data":{"label":"Webhooks","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"5Oax1p7zIZ9HD2hmENPof"},"zIndex":999,"width":155,"height":49,"style":{"width":155,"height":49},"positionAbsolute":{"x":1079.0316934344742,"y":3196.79226453252},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"RvqrjCowu0YK5QWK2ZVyg","type":"paragraph","position":{"x":734.8760409943199,"y":3380.381300735853},"selected":true,"data":{"label":"More GitHub Features","style":{"fontSize":20,"borderColor":"transparent","backgroundColor":"transparent","color":"#000000","textAlign":"center","justifyContent":"center","padding":16},"oldId":"Nr3MMuTWvDY6p1N7gSRDz"},"zIndex":999,"width":265,"height":42,"style":{"width":265,"height":42},"resizing":false,"dragging":false,"positionAbsolute":{"x":734.8760409943199,"y":3380.381300735853},"selectable":true,"focusable":true},{"id":"GyhfjObOGq-CwF_VIwO8b","type":"vertical","position":{"x":857.3760409943199,"y":3262.6578360691838},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55,"strokeDasharray":"0","strokeLinecap":"round"}},"zIndex":999,"width":20,"height":110,"style":{"width":20,"height":110},"positionAbsolute":{"x":857.3760409943199,"y":3262.6578360691838},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"vhdGUhMAyre_Xya6IxZ-t","type":"topic","position":{"x":449.8445524291993,"y":3510.881300735853},"selected":true,"data":{"label":"GitHub Sponsors","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"rqPCHh25xX_ROMr-ULpaw"},"zIndex":999,"width":200,"height":49,"style":{"width":200,"height":49},"positionAbsolute":{"x":449.8445524291993,"y":3510.881300735853},"selectable":true,"focusable":true,"dragging":false},{"id":"bnai6R6pOq_L5CPdbVwMW","type":"topic","position":{"x":1089.0374122325647,"y":3376.881300735853},"selected":true,"data":{"label":"GitHub Pages","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"rqPCHh25xX_ROMr-ULpaw"},"zIndex":999,"width":175,"height":49,"style":{"width":175,"height":49},"positionAbsolute":{"x":1089.0374122325647,"y":3376.881300735853},"selectable":true,"focusable":true,"dragging":false},{"id":"M2_hBvXou7cCNqsMnexCt","type":"topic","position":{"x":449.8445524291993,"y":3298.881300735853},"selected":true,"data":{"label":"GitHub Gists","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"iWn3zDMOfLLjSp6f1jQoE"},"zIndex":999,"width":200,"height":49,"style":{"width":200,"height":49},"positionAbsolute":{"x":449.8445524291993,"y":3298.881300735853},"selectable":true,"focusable":true,"dragging":false},{"id":"rqPCHh25xX_ROMr-ULpaw","type":"topic","position":{"x":449.8445524291993,"y":3351.881300735853},"selected":true,"data":{"label":"GitHub Packages","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":200,"height":49,"style":{"width":200,"height":49},"positionAbsolute":{"x":449.8445524291993,"y":3351.881300735853},"selectable":true,"focusable":true,"dragging":false},{"id":"ZHplGidvhxEIC3HN8KqRa","type":"subtopic","position":{"x":1021.0316934344742,"y":3274.4626439764525},"selected":true,"data":{"label":"Deploying Static Websites","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":244,"height":49,"style":{"width":244,"height":49},"positionAbsolute":{"x":1021.0316934344742,"y":3274.4626439764525},"dragging":false,"focusable":true,"selectable":true,"resizing":true},{"id":"VdoxEWaU56-QCbHFRw649","type":"subtopic","position":{"x":1022.0316934344742,"y":3486.2445399831518},"selected":true,"data":{"label":"Custom Domains","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":243,"height":49,"style":{"width":243,"height":49},"positionAbsolute":{"x":1022.0316934344742,"y":3486.2445399831518},"dragging":false,"focusable":true,"selectable":true},{"id":"iwfNYDlAgbA_rpWYcoHCC","type":"subtopic","position":{"x":1022.0316934344742,"y":3539.2445399831518},"selected":true,"data":{"label":"Static Site Generators","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":243,"height":49,"style":{"width":243,"height":49},"positionAbsolute":{"x":1022.0316934344742,"y":3539.2445399831518},"dragging":false,"focusable":true,"selectable":true},{"id":"NdfwgwMOewiyEAFyC2l7U","type":"topic","position":{"x":449.8445524291993,"y":3404.881300735853},"selected":true,"data":{"label":"GitHub Codespaces","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"4slyjdk2Eeg5VYY6gCDG6"},"zIndex":999,"width":200,"height":49,"style":{"width":200,"height":49},"positionAbsolute":{"x":449.8445524291993,"y":3404.881300735853},"dragging":false,"focusable":true,"selectable":true},{"id":"pFyMiyNQ16-kP7jKaKKEU","type":"topic","position":{"x":206.3814171159704,"y":3456.583923235142},"selected":true,"data":{"label":"GitHub Education","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"R20LXLLEzNn-SpyFDMRXj"},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":206.3814171159704,"y":3456.583923235142},"dragging":false,"focusable":true,"selectable":true},{"id":"XRSVRl6iHncMmgSXoB7Lq","type":"subtopic","position":{"x":206.3814171159704,"y":3574.398947531598},"selected":true,"data":{"label":"Student Developer Pack","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":206.3814171159704,"y":3574.398947531598},"dragging":false,"resizing":false,"focusable":true,"selectable":true},{"id":"Pg6G4fzYb_RUhANeRKlRX","type":"subtopic","position":{"x":206.3814171159704,"y":3626.898947531598},"selected":true,"data":{"label":"GitHub Classroom","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":206.3814171159704,"y":3626.898947531598},"dragging":false,"focusable":true,"selectable":true},{"id":"B1KiSOt2b8t8FYD7Jxw2A","type":"subtopic","position":{"x":206.3814171159704,"y":3679.398947531598},"selected":true,"data":{"label":"Campus Program","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":206.3814171159704,"y":3679.398947531598},"dragging":false,"focusable":true,"selectable":true},{"id":"R20LXLLEzNn-SpyFDMRXj","type":"topic","position":{"x":206.3814171159704,"y":3402.504649727731},"selected":true,"data":{"label":"GitHub Marketplace","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":206.3814171159704,"y":3402.504649727731},"dragging":false,"focusable":true,"selectable":true},{"id":"f2PG4t6iVtfIH8BVe5H7f","type":"topic","position":{"x":449.8445524291993,"y":3457.881300735853},"selected":true,"data":{"label":"GitHub Security","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"rqPCHh25xX_ROMr-ULpaw"},"zIndex":999,"width":200,"height":49,"style":{"width":200,"height":49},"positionAbsolute":{"x":449.8445524291993,"y":3457.881300735853},"selectable":true,"focusable":true,"dragging":false},{"id":"4slyjdk2Eeg5VYY6gCDG6","type":"topic","position":{"x":206.3814171159704,"y":3350.504649727731},"selected":true,"data":{"label":"GitHub Models","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":206.3814171159704,"y":3350.504649727731},"dragging":false,"focusable":true,"selectable":true},{"id":"iWn3zDMOfLLjSp6f1jQoE","type":"topic","position":{"x":206.3814171159704,"y":3297.887019533944},"selected":true,"data":{"label":"GitHub Copilot","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"},"oldId":"f2PG4t6iVtfIH8BVe5H7f"},"zIndex":999,"width":238,"height":49,"style":{"width":238,"height":49},"positionAbsolute":{"x":206.3814171159704,"y":3297.887019533944},"selectable":true,"focusable":true,"dragging":false},{"width":522,"height":122,"id":"0vLaVNJaJSHZ_bHli6Qzs","type":"paragraph","position":{"x":533.8251366454728,"y":3633.6959434496457},"selected":true,"data":{"label":"Continue learning with following roadmaps","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center","borderColor":"#000000","backgroundColor":"WHITe"},"oldId":"m9eO0jLGuR_9w2JJbe_g2"},"zIndex":999,"positionAbsolute":{"x":533.8251366454728,"y":3633.6959434496457},"dragging":false,"style":{"width":522,"height":122},"resizing":false,"focusable":true,"selectable":true},{"width":121,"height":49,"id":"P8nE-yRpa7NmoTENNv-Qz","type":"button","position":{"x":546.9220790169977,"y":3692.6265191129755},"selected":true,"data":{"label":"Frontend","href":"https://roadmap.sh/frontend","color":"#FFf","backgroundColor":"#4136D6","style":{"fontSize":17},"borderColor":"#4136D6","oldId":"OIcmPSbdsuWapb6HZ4BEi"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":546.9220790169977,"y":3692.6265191129755},"style":{"width":121,"height":49},"focusable":true,"resizing":false,"selectable":true},{"width":20,"height":74,"id":"RLtk1C3gofHnLJ17x3o5b","type":"vertical","position":{"x":857.3760409943199,"y":3755.6959434496457},"selected":true,"data":{"label":"vertical node","style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2B78E4"},"oldId":"ExXFPDHXtcOMcvZttzxvD"},"zIndex":999,"positionAbsolute":{"x":857.3760409943199,"y":3755.6959434496457},"dragging":false,"focusable":true,"style":{"width":20,"height":74},"resizing":false,"selectable":true},{"width":121,"height":49,"id":"N0zxK2dVGTxmMLEsvkRGl","type":"button","position":{"x":673.3251366454728,"y":3692.6265191129755},"selected":true,"data":{"label":"Backend","href":"https://roadmap.sh/backend","color":"#FFf","backgroundColor":"#4136D6","style":{"fontSize":17},"borderColor":"#4136D6","oldId":"OIcmPSbdsuWapb6HZ4BEi"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":673.3251366454728,"y":3692.6265191129755},"style":{"width":121,"height":49},"focusable":true,"resizing":false,"selectable":true},{"width":121,"height":49,"id":"xU5kwxmH2Ir9e2xKTH82n","type":"button","position":{"x":797.4807890856271,"y":3692.6265191129755},"selected":true,"data":{"label":"DevOps","href":"https://roadmap.sh/devops","color":"#FFf","backgroundColor":"#4136D6","style":{"fontSize":17},"borderColor":"#4136D6","oldId":"OIcmPSbdsuWapb6HZ4BEi"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":797.4807890856271,"y":3692.6265191129755},"style":{"width":121,"height":49},"focusable":true,"resizing":false,"selectable":true},{"width":121,"height":49,"id":"OIcmPSbdsuWapb6HZ4BEi","type":"button","position":{"x":923.9807890856271,"y":3692.6265191129755},"selected":true,"data":{"label":"Full-stack","href":"https://roadmap.sh/full-stack","color":"#FFf","backgroundColor":"#4136D6","style":{"fontSize":17},"borderColor":"#4136D6","oldId":"cmSSwPPiiHwYh9ct14N6A"},"zIndex":999,"dragging":false,"positionAbsolute":{"x":923.9807890856271,"y":3692.6265191129755},"style":{"width":121,"height":49},"focusable":true,"resizing":false,"selectable":true},{"id":"GFOiV1rK5PlVHk15QZmTd","type":"vertical","position":{"x":857.3760409943199,"y":3449.881300735853},"selected":true,"data":{"label":"vertical node","style":{"stroke":"#2B78E4","strokeWidth":3.55,"strokeDasharray":"0","strokeLinecap":"round"},"oldId":"GyhfjObOGq-CwF_VIwO8b"},"zIndex":999,"width":20,"height":185,"style":{"width":20,"height":185},"positionAbsolute":{"x":857.3760409943199,"y":3449.881300735853},"dragging":false,"resizing":false,"selectable":true,"focusable":true},{"id":"JN1S4v1vCH6o_1FGxLu6i","type":"paragraph","position":{"x":209.37471641744668,"y":88.38682211276446},"selected":true,"data":{"label":"If you are a beginner, we'd recommend you to visit the beginner friendly version.","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"left","borderColor":"#000000","backgroundColor":"#FFFFFf"},"oldId":"yHmHXymPNWwu8p1vvqD3o"},"zIndex":999,"width":354,"height":143,"positionAbsolute":{"x":209.37471641744668,"y":88.38682211276446},"dragging":false,"selectable":true,"focusable":true,"style":{"width":354,"height":143},"resizing":false},{"id":"MfErpYwkJ0wiWJZEUVfrb","type":"button","position":{"x":223.7266137420417,"y":167.9386373305844},"selected":true,"data":{"label":"Visit the Beginner Version","href":"/git-github?r=git-github-beginner","color":"#ffffff","backgroundColor":"#232323","style":{"fontSize":17},"oldId":"2zqZkyVgigifcRS1H7F_b"},"zIndex":999,"width":328,"height":49,"dragging":false,"style":{"width":328,"height":49},"resizing":false,"positionAbsolute":{"x":223.7266137420417,"y":167.9386373305844},"selectable":true,"focusable":true},{"id":"Ddkss13_qDJTquDHbVTVs","type":"subtopic","position":{"x":1068.0316934344742,"y":1264.848933004529},"selected":true,"data":{"label":"CITATION files","style":{"fontSize":17,"justifyContent":"flex-start","textAlign":"center"}},"zIndex":999,"width":195,"height":49,"style":{"width":195,"height":49},"positionAbsolute":{"x":1068.0316934344742,"y":1266.348933004529},"dragging":false,"selectable":true,"focusable":true}],"edges":[{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iogwMmOvub2ZF4zgg6WyF","sourceHandle":"x2","target":"_hYN0gEi9BL24nptEtXWU","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"XX0I26JoVMVXIe_7bVMix","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"idLHBxhvcIqZTqmh_E8Az","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"dFn6kGOoJ-0BzJJEb9DSG","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"os3Pa6W9SSNEzgmlBbglQ","targetHandle":"y2","data":{"edgeStyle":"dashed"},"id":"arkF7QJJRbCBYWp0crqa2","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"3oInpqvTSSC5_K6i7j8N7","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"HNVw8OboycWKLEtEbG2bn","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"z2","target":"YKhuRbcUFzo0hTvuTq-Yl","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"auB7Png72XjmhcLr3IJA7","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"jZ67HhVRelJaxjsCckSSI","sourceHandle":"x2","target":"hWA7RtuqltMTmHdcCnmES","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"2aoDIr80lXSJLW1hIGUkb","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"sourceHandle":"z2","target":"NMznG9mo2wzNFnjhg990f","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"m-_y7nLeYFkUKGiacxWA0","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"sourceHandle":"z2","target":"gc_7cuIO2_joKlQRAPDfX","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"G7pXuJfkyt2nWAOHU8yV0","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"rrrvATyhXqRgJGWI3z0WF","sourceHandle":"x2","target":"AvbMQ5vY3ip1oX_6Yq4ie","targetHandle":"w2","data":{"edgeStyle":"dashed"},"id":"2_6Yz3-Agx9_rEN5xW86c","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"hWA7RtuqltMTmHdcCnmES","sourceHandle":"w2","target":"1AJv95mTLpR7L8KBoGym8","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"kgMI98fg2-mKMgUs0wnjD","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"hWA7RtuqltMTmHdcCnmES","sourceHandle":"y2","target":"0etAs56EeBfh_0IlAaSra","targetHandle":"w1","data":{"edgeStyle":"solid"},"selected":true,"id":"ts38Q2ceHs60TJscUBZVE","focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"jZ67HhVRelJaxjsCckSSI","sourceHandle":"y2","target":"h6ceO0kiBIxNRkPzN3hBY","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"ZiMV7umyPdhy3JJDcopR-","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"jZ67HhVRelJaxjsCckSSI","sourceHandle":"y2","target":"_JlT9oKQ6Yu4UX6l19G8P","targetHandle":"z2","data":{"edgeStyle":"dashed"},"id":"WI-MhbxrehFcVwyGJ5CQJ","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"_hYN0gEi9BL24nptEtXWU","sourceHandle":"x2","target":"jZ67HhVRelJaxjsCckSSI","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"qUrLBzvXvJOg53HBfjrOI","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"5Z9o-b3vBA-ITFg86zzYM","sourceHandle":"x2","target":"HlUUGj3dOZ68t4gIjerXh","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-5Z9o-b3vBA-ITFg86zzYMx2-HlUUGj3dOZ68t4gIjerXhw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"HlUUGj3dOZ68t4gIjerXh","sourceHandle":"z2","target":"bY6b1GV2XQQ52NOx8gWFj","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-HlUUGj3dOZ68t4gIjerXhz2-bY6b1GV2XQQ52NOx8gWFjy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"HlUUGj3dOZ68t4gIjerXh","sourceHandle":"z2","target":"dhIx1GnynvbSUriqYLUt0","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-HlUUGj3dOZ68t4gIjerXhz2-dhIx1GnynvbSUriqYLUt0y1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"HlUUGj3dOZ68t4gIjerXh","sourceHandle":"z2","target":"_jSTrYN9G8EsGHkbusKPU","targetHandle":"y2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-HlUUGj3dOZ68t4gIjerXhz2-_jSTrYN9G8EsGHkbusKPUy2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"HlUUGj3dOZ68t4gIjerXh","sourceHandle":"z2","target":"v7hCNbgPByi3YiLSs46BK","targetHandle":"y2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-HlUUGj3dOZ68t4gIjerXhz2-v7hCNbgPByi3YiLSs46BKy2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"HlUUGj3dOZ68t4gIjerXh","sourceHandle":"x2","target":"PtU5Qwfzn3N1i3oRlCGoR","targetHandle":"w2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-HlUUGj3dOZ68t4gIjerXhx2-bXfCUG3h1TIFPgD4WUDphw2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"PtU5Qwfzn3N1i3oRlCGoR","sourceHandle":"z2","target":"bXfCUG3h1TIFPgD4WUDph","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-PtU5Qwfzn3N1i3oRlCGoRz2-bXfCUG3h1TIFPgD4WUDphy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"bXfCUG3h1TIFPgD4WUDph","sourceHandle":"x2","target":"OegitQ5Ngjvd3ZfMpfrkM","targetHandle":"w2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-bXfCUG3h1TIFPgD4WUDphx2-OegitQ5Ngjvd3ZfMpfrkMw2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"fIfmS6BkkOFWzCB1RqrhK","sourceHandle":"x2","target":"NeSvgS2yA5x8qbcJHrV__","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-fIfmS6BkkOFWzCB1RqrhKx2-NeSvgS2yA5x8qbcJHrV__w1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NeSvgS2yA5x8qbcJHrV__","sourceHandle":"x2","target":"i7fIIHcBEk473te8bniJ5","targetHandle":"w2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-NeSvgS2yA5x8qbcJHrV__x2-i7fIIHcBEk473te8bniJ5w2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"GS3f1FKFVKT0-GJQrgCm8","sourceHandle":"z2","target":"KbVvFVQ4k77R2_ddsc7WT","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-GS3f1FKFVKT0-GJQrgCm8z2-KbVvFVQ4k77R2_ddsc7WTy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"c_FO6xMixrrMo6iisfsvl","sourceHandle":"z2","target":"HEqBbw_A4ZbJI5zEy8ViN","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-c_FO6xMixrrMo6iisfsvlz2-HEqBbw_A4ZbJI5zEy8ViNy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"bXfCUG3h1TIFPgD4WUDph","sourceHandle":"y2","target":"fIfmS6BkkOFWzCB1RqrhK","targetHandle":"w2","data":{"edgeStyle":"solid"},"selected":true,"selectable":true,"focusable":true,"id":"reactflow__edge-bXfCUG3h1TIFPgD4WUDphy2-fIfmS6BkkOFWzCB1RqrhKw2"},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NeSvgS2yA5x8qbcJHrV__","sourceHandle":"y2","target":"aWx9WHUrgofcTr8B-fQYe","targetHandle":"z1","data":{"edgeStyle":"solid"},"selected":true,"id":"reactflow__edge-NeSvgS2yA5x8qbcJHrV__y2-zLSGqFLjw2kodmMwurzrYz1","selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"0rHDUbAdXqH9zQW2VfJ8v","sourceHandle":"y2","target":"agtPWS8j6i6wQPk10cy8E","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-0rHDUbAdXqH9zQW2VfJ8vy2-agtPWS8j6i6wQPk10cy8Ez1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"0rHDUbAdXqH9zQW2VfJ8v","sourceHandle":"y2","target":"Z-srOhYFGVEKDexlJ6cjt","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-0rHDUbAdXqH9zQW2VfJ8vy2-Z-srOhYFGVEKDexlJ6cjtz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"0rHDUbAdXqH9zQW2VfJ8v","sourceHandle":"y2","target":"9Dt4Gyiiq5jteWSKxsRMK","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-0rHDUbAdXqH9zQW2VfJ8vy2-9Dt4Gyiiq5jteWSKxsRMKz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"0rHDUbAdXqH9zQW2VfJ8v","sourceHandle":"y2","target":"eFf2fesrs-1aVM5tH3ORQ","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-0rHDUbAdXqH9zQW2VfJ8vy2-eFf2fesrs-1aVM5tH3ORQz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"d_GNnB6PBINz1jxGNWAE-","sourceHandle":"z2","target":"C1ai9r31b7HPySw0o9tyT","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-d_GNnB6PBINz1jxGNWAE-z2-C1ai9r31b7HPySw0o9tyTy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"C1ai9r31b7HPySw0o9tyT","sourceHandle":"w2","target":"xLB2fhsOm0Vu3xg_PusJB","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-C1ai9r31b7HPySw0o9tyTw2-i3AbARgzQtxtlB-1AS8zvx1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"C1ai9r31b7HPySw0o9tyT","sourceHandle":"x2","target":"pJ-najh7dXhhYA_0bDiR5","targetHandle":"w1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-C1ai9r31b7HPySw0o9tyTx2-i3AbARgzQtxtlB-1AS8zvw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"x6eILrLCQrVpz4j8uOuy6","sourceHandle":"z2","target":"8lXXVFkgK6n5IHaYkYe3l","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-x6eILrLCQrVpz4j8uOuy6z2-8lXXVFkgK6n5IHaYkYe3ly1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"x6eILrLCQrVpz4j8uOuy6","sourceHandle":"z2","target":"r-u1vTpUyuvsB0revOU0C","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-x6eILrLCQrVpz4j8uOuy6z2-r-u1vTpUyuvsB0revOU0Cy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"C1ai9r31b7HPySw0o9tyT","sourceHandle":"z2","target":"D2WIExwfSnkAPIa5O-Hp5","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-C1ai9r31b7HPySw0o9tyTz2-D2WIExwfSnkAPIa5O-Hp5y1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"D2WIExwfSnkAPIa5O-Hp5","sourceHandle":"x2","target":"yMx3LdadPz4g25CL3N8da","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-D2WIExwfSnkAPIa5O-Hp5x2-yMx3LdadPz4g25CL3N8daw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"yMx3LdadPz4g25CL3N8da","sourceHandle":"y2","target":"DzFJDdqnSy5GeGHWOpcVo","targetHandle":"z1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-yMx3LdadPz4g25CL3N8day2-DzFJDdqnSy5GeGHWOpcVoz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"DzFJDdqnSy5GeGHWOpcVo","sourceHandle":"x2","target":"q0zy_hXav5iXw8LpGVJVd","targetHandle":"w2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-DzFJDdqnSy5GeGHWOpcVox2-q0zy_hXav5iXw8LpGVJVdw2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"DzFJDdqnSy5GeGHWOpcVo","sourceHandle":"y2","target":"hes8XQqAvpxWITcbU9tiH","targetHandle":"z2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-DzFJDdqnSy5GeGHWOpcVoy2-hes8XQqAvpxWITcbU9tiHz2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"hes8XQqAvpxWITcbU9tiH","sourceHandle":"w2","target":"X9K3PBpGsMoXkJsKdJPI7","targetHandle":"x2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-hes8XQqAvpxWITcbU9tiHw2-X9K3PBpGsMoXkJsKdJPI7x2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"hes8XQqAvpxWITcbU9tiH","sourceHandle":"x2","target":"zen3RRdK9_nPAYgicRoHk","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-hes8XQqAvpxWITcbU9tiHx2-iFJBF-EEnLjQVsFSXjo_iw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zen3RRdK9_nPAYgicRoHk","sourceHandle":"y2","target":"lXC07j6dOa3rQixY1P-Ob","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iy2-lXC07j6dOa3rQixY1P-Obz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zen3RRdK9_nPAYgicRoHk","sourceHandle":"y2","target":"V8nLIvddyOKTzEjOJX5GW","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iy2-V8nLIvddyOKTzEjOJX5GWz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zen3RRdK9_nPAYgicRoHk","sourceHandle":"y2","target":"0cLf7FiI9CX--UX45sm2f","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iy2-0cLf7FiI9CX--UX45sm2fz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zen3RRdK9_nPAYgicRoHk","sourceHandle":"y2","target":"qFEonbCMLri8iA0yONwuf","targetHandle":"z2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iy2-qFEonbCMLri8iA0yONwufz2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"zen3RRdK9_nPAYgicRoHk","sourceHandle":"x2","target":"0Yi4cryT2v2SGBjouOas3","targetHandle":"w2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-zen3RRdK9_nPAYgicRoHkx2-iFJBF-EEnLjQVsFSXjo_iw2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"0Yi4cryT2v2SGBjouOas3","sourceHandle":"y2","target":"igrR7LguU1jemg_mf_AD6","targetHandle":"z2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iy2-igrR7LguU1jemg_mf_AD6z2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"igrR7LguU1jemg_mf_AD6","sourceHandle":"y2","target":"V_joZNpQsS9G9PI-o-GmC","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-igrR7LguU1jemg_mf_AD6y2-V_joZNpQsS9G9PI-o-GmCz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"igrR7LguU1jemg_mf_AD6","sourceHandle":"y2","target":"qis7Z5VRxMcOmbesQlegZ","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-igrR7LguU1jemg_mf_AD6y2-qis7Z5VRxMcOmbesQlegZz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"igrR7LguU1jemg_mf_AD6","sourceHandle":"y2","target":"Uc7FyfAKpDFRGRNHwztFo","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-igrR7LguU1jemg_mf_AD6y2-Uc7FyfAKpDFRGRNHwztFoz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"0Yi4cryT2v2SGBjouOas3","sourceHandle":"z2","target":"-0zQvCHG8jS_ghSjmTeIx","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-0Yi4cryT2v2SGBjouOas3z2-iFJBF-EEnLjQVsFSXjo_iy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"-0zQvCHG8jS_ghSjmTeIx","sourceHandle":"z2","target":"Rwpeltygwzcf6hnuZNURE","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-Rwpeltygwzcf6hnuZNUREy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"-0zQvCHG8jS_ghSjmTeIx","sourceHandle":"z2","target":"O-zoAWkDvyn7B8_TmY257","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-O-zoAWkDvyn7B8_TmY257y1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"-0zQvCHG8jS_ghSjmTeIx","sourceHandle":"z2","target":"mzjtCdpke1ayHcEuS-YUS","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-mzjtCdpke1ayHcEuS-YUSy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"-0zQvCHG8jS_ghSjmTeIx","sourceHandle":"z2","target":"uxqJzQFRcALqatNRIWR0w","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-uxqJzQFRcALqatNRIWR0wy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"-0zQvCHG8jS_ghSjmTeIx","sourceHandle":"x2","target":"sOoC-XxEoIvwKct00oKlX","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge--0zQvCHG8jS_ghSjmTeIxx2-iFJBF-EEnLjQVsFSXjo_iw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"sOoC-XxEoIvwKct00oKlX","sourceHandle":"z2","target":"NjPnEXLf1Lt9qzgxccogv","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-NjPnEXLf1Lt9qzgxccogvy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"sOoC-XxEoIvwKct00oKlX","sourceHandle":"z2","target":"HMEfUFNu_Wp_Pac7VWHr-","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-HMEfUFNu_Wp_Pac7VWHr-y1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"sOoC-XxEoIvwKct00oKlX","sourceHandle":"z2","target":"BKVA6Q7DXemAYjyQOA0nh","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-BKVA6Q7DXemAYjyQOA0nhy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"sOoC-XxEoIvwKct00oKlX","sourceHandle":"z2","target":"OQOmxg9mCfcjt80hpvXkA","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-OQOmxg9mCfcjt80hpvXkAy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"sOoC-XxEoIvwKct00oKlX","sourceHandle":"x2","target":"iFJBF-EEnLjQVsFSXjo_i","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-sOoC-XxEoIvwKct00oKlXx2-iFJBF-EEnLjQVsFSXjo_iw1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iFJBF-EEnLjQVsFSXjo_i","sourceHandle":"z2","target":"NeU38WPbEphJuJ_AMkH82","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-NeU38WPbEphJuJ_AMkH82y1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iFJBF-EEnLjQVsFSXjo_i","sourceHandle":"z2","target":"E3HAGNM-kXLL4Oci5JzpQ","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-E3HAGNM-kXLL4Oci5JzpQy1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iFJBF-EEnLjQVsFSXjo_i","sourceHandle":"z2","target":"62E1tDMXB6K74OEN0WsS0","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-62E1tDMXB6K74OEN0WsS0y1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iFJBF-EEnLjQVsFSXjo_i","sourceHandle":"z2","target":"YmnTrjJtqHPXbEVrP8vd7","targetHandle":"y1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iz2-YmnTrjJtqHPXbEVrP8vd7y1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"iFJBF-EEnLjQVsFSXjo_i","sourceHandle":"y2","target":"pqBV7BMAs0z6qpfZeW2XP","targetHandle":"z2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-iFJBF-EEnLjQVsFSXjo_iy2-sFf1PdFfmEdQxsEntfeFqz2","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"pqBV7BMAs0z6qpfZeW2XP","sourceHandle":"w2","target":"e5O8lUSSEOEFR-dlZV5wN","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-sFf1PdFfmEdQxsEntfeFqw2-e5O8lUSSEOEFR-dlZV5wNx1","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"pqBV7BMAs0z6qpfZeW2XP","sourceHandle":"x2","target":"v7uabKuMQPOD_hBIaHOVT","targetHandle":"w2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-sFf1PdFfmEdQxsEntfeFqx2-v7uabKuMQPOD_hBIaHOVTw2","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"fjAFNjNNbPOzme9Uk_fDV","sourceHandle":"w2","target":"x4bnsPVTiX2xOCSyrgWpF","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-fjAFNjNNbPOzme9Uk_fDVw2-x4bnsPVTiX2xOCSyrgWpFx1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"h9cf_dh_pwjialOXOlNW-","sourceHandle":"z2","target":"AmetdCURXXob5TUsikAab","targetHandle":"y2","data":{"edgeStyle":"solid"},"id":"reactflow__edge-h9cf_dh_pwjialOXOlNW-z2-AmetdCURXXob5TUsikAaby2","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"AmetdCURXXob5TUsikAab","sourceHandle":"w2","target":"PUnYNBrAZWoZiopjtNgnA","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-AmetdCURXXob5TUsikAabw2-PUnYNBrAZWoZiopjtNgnAx1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"Q7BSE-ueezjXkYluzMecJ","sourceHandle":"y2","target":"hru0sL1-D4bJSQI1efEyU","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-hru0sL1-D4bJSQI1efEyUz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"Q7BSE-ueezjXkYluzMecJ","sourceHandle":"y2","target":"ExXuwTQSI_lg4SRGW3Iu1","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-ExXuwTQSI_lg4SRGW3Iu1z1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"Q7BSE-ueezjXkYluzMecJ","sourceHandle":"y2","target":"4dxVN81rXWn6VZqK99yq0","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-4dxVN81rXWn6VZqK99yq0z1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"Q7BSE-ueezjXkYluzMecJ","sourceHandle":"y2","target":"CGj_UX5JMOOCKinedsNRc","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-CGj_UX5JMOOCKinedsNRcz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"Q7BSE-ueezjXkYluzMecJ","sourceHandle":"y2","target":"zdunaucVe8J1tKf_z-NQo","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-zdunaucVe8J1tKf_z-NQoz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"xK8mSkkxTABUZV9zZjDPH","sourceHandle":"y2","target":"NV2HAXLEN7tskfgyFrbaf","targetHandle":"z1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-5Oax1p7zIZ9HD2hmENPofz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NV2HAXLEN7tskfgyFrbaf","sourceHandle":"w2","target":"KlXPt-K6br8PtpLgELaCj","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-5Oax1p7zIZ9HD2hmENPofw2-KlXPt-K6br8PtpLgELaCjx1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"5Oax1p7zIZ9HD2hmENPof","sourceHandle":"w2","target":"qrdOARfqGPF9xhF6snbAn","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-5Oax1p7zIZ9HD2hmENPofw2-qrdOARfqGPF9xhF6snbAnx1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"NV2HAXLEN7tskfgyFrbaf","sourceHandle":"y2","target":"5Oax1p7zIZ9HD2hmENPof","targetHandle":"z1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-MoG7D9kqPuA6o52-z_WDNy2-5Oax1p7zIZ9HD2hmENPofz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"xK8mSkkxTABUZV9zZjDPH","sourceHandle":"z2","target":"MoG7D9kqPuA6o52-z_WDN","targetHandle":"y1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygz2-MoG7D9kqPuA6o52-z_WDNy1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"RvqrjCowu0YK5QWK2ZVyg","sourceHandle":"z2","target":"bnai6R6pOq_L5CPdbVwMW","targetHandle":"y2","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygz2-bnai6R6pOq_L5CPdbVwMWy2","selected":true,"focusable":true,"selectable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"pFyMiyNQ16-kP7jKaKKEU","sourceHandle":"x2","target":"XRSVRl6iHncMmgSXoB7Lq","targetHandle":"w1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-pFyMiyNQ16-kP7jKaKKEUx2-XRSVRl6iHncMmgSXoB7Lqw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"RvqrjCowu0YK5QWK2ZVyg","sourceHandle":"y2","target":"M2_hBvXou7cCNqsMnexCt","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-M2_hBvXou7cCNqsMnexCtz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"RvqrjCowu0YK5QWK2ZVyg","sourceHandle":"y2","target":"rqPCHh25xX_ROMr-ULpaw","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-rqPCHh25xX_ROMr-ULpawz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"RvqrjCowu0YK5QWK2ZVyg","sourceHandle":"y2","target":"NdfwgwMOewiyEAFyC2l7U","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-NdfwgwMOewiyEAFyC2l7Uz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"RvqrjCowu0YK5QWK2ZVyg","sourceHandle":"y2","target":"f2PG4t6iVtfIH8BVe5H7f","targetHandle":"z1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-RvqrjCowu0YK5QWK2ZVygy2-f2PG4t6iVtfIH8BVe5H7fz1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"KMA7NkxFbPoUDtFnGBFnj","sourceHandle":"x2","target":"0vLaVNJaJSHZ_bHli6Qzs","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-KMA7NkxFbPoUDtFnGBFnjx2-0vLaVNJaJSHZ_bHli6Qzsw1","selected":true,"type":"simplebezier","focusable":true,"selectable":true},{"style":{"strokeDasharray":"0","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"wBKp8Q5D6WhjVVsD89UHl","sourceHandle":"x2","target":"0vLaVNJaJSHZ_bHli6Qzs","targetHandle":"w1","data":{"edgeStyle":"solid"},"id":"reactflow__edge-wBKp8Q5D6WhjVVsD89UHlx2-0vLaVNJaJSHZ_bHli6Qzsw1","selected":true,"selectable":true,"focusable":true},{"style":{"strokeDasharray":"0.8 8","strokeLinecap":"round","strokeWidth":3.5,"stroke":"#2b78e4"},"source":"D2WIExwfSnkAPIa5O-Hp5","sourceHandle":"w2","target":"Ddkss13_qDJTquDHbVTVs","targetHandle":"x1","data":{"edgeStyle":"dashed"},"id":"reactflow__edge-D2WIExwfSnkAPIa5O-Hp5w2-Ddkss13_qDJTquDHbVTVsx1","selected":true,"focusable":true}]} \ No newline at end of file From 45727a1bb2f32c21701672b5b6bec61ed6575d2d Mon Sep 17 00:00:00 2001 From: dsh Date: Fri, 16 Aug 2024 02:11:45 +0100 Subject: [PATCH 002/120] Updated topics starting with git* (#6586) --- .../content/github-api@NV2HAXLEN7tskfgyFrbaf.md | 7 ++++++- .../content/github-cli@h9cf_dh_pwjialOXOlNW-.md | 9 ++++++++- .../content/github-discussions@snWQHCQECZyUXHdn6ppIk.md | 9 ++++++++- .../content/github-education@pFyMiyNQ16-kP7jKaKKEU.md | 7 ++++++- .../content/github-essentials@NeSvgS2yA5x8qbcJHrV__.md | 4 +++- .../content/github-gists@M2_hBvXou7cCNqsMnexCt.md | 1 - .../content/github-interface@qZFtRABvlBbVvsy6T00J2.md | 9 ++++++++- .../github-organizations@RMrxQLhrINO5g4Mhxh5qS.md | 9 ++++++++- .../content/github-projects@DzFJDdqnSy5GeGHWOpcVo.md | 9 ++++++++- .../content/github-releases@YmnTrjJtqHPXbEVrP8vd7.md | 9 ++++++++- .../content/github-wikis@Ddkss13_qDJTquDHbVTVs.md | 9 ++++++++- 11 files changed, 71 insertions(+), 11 deletions(-) diff --git a/src/data/roadmaps/git-github/content/github-api@NV2HAXLEN7tskfgyFrbaf.md b/src/data/roadmaps/git-github/content/github-api@NV2HAXLEN7tskfgyFrbaf.md index 0287eaecf..5521184a1 100644 --- a/src/data/roadmaps/git-github/content/github-api@NV2HAXLEN7tskfgyFrbaf.md +++ b/src/data/roadmaps/git-github/content/github-api@NV2HAXLEN7tskfgyFrbaf.md @@ -1,3 +1,8 @@ # GitHub API -The GitHub API is a powerful tool that allows developers to interact with the GitHub platform programmatically. It provides access to various GitHub features, such as user data, repository information, and commit history. \ No newline at end of file +The GitHub API is a powerful tool that allows developers to interact with the GitHub platform programmatically. It provides access to various GitHub features, such as user data, repository information, and commit history, through both REST and GraphQL interfaces. The API supports authentication, implements rate limiting, and offers webhooks for real-time notifications, enabling developers to automate tasks, create custom integrations, and build applications that leverage GitHub's functionality. + +Learn more from the following resources: + +- [@official@official API Docs](https://docs.github.com/en/rest?apiVersion=2022-11-28) +- [@article@Getting started](https://docs.github.com/en/rest/using-the-rest-api/getting-started-with-the-rest-api?apiVersion=2022-11-28) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/github-cli@h9cf_dh_pwjialOXOlNW-.md b/src/data/roadmaps/git-github/content/github-cli@h9cf_dh_pwjialOXOlNW-.md index fc22e332e..1ccb67f2d 100644 --- a/src/data/roadmaps/git-github/content/github-cli@h9cf_dh_pwjialOXOlNW-.md +++ b/src/data/roadmaps/git-github/content/github-cli@h9cf_dh_pwjialOXOlNW-.md @@ -1 +1,8 @@ -# GitHub CLI \ No newline at end of file +# GitHub CLI + +GitHub CLI is a command-line interface tool that brings GitHub functionality to your terminal. It allows developers to interact with GitHub directly from the command line, enabling them to manage repositories, create issues, pull requests, and perform various GitHub operations without leaving their terminal environment. This powerful tool streamlines workflows, enhances productivity, and provides a seamless integration between local development and GitHub's collaborative features, making it easier for developers to incorporate GitHub into their daily coding routines. + +Learn more from the following resources: + +- [@official@official GitHub CLI Docs](https://cli.github.com/) +- [@video@What is the GitHub CLI?](https://www.youtube.com/watch?v=uy_PEGgUF4U) diff --git a/src/data/roadmaps/git-github/content/github-discussions@snWQHCQECZyUXHdn6ppIk.md b/src/data/roadmaps/git-github/content/github-discussions@snWQHCQECZyUXHdn6ppIk.md index 27c122b9f..bc52e5753 100644 --- a/src/data/roadmaps/git-github/content/github-discussions@snWQHCQECZyUXHdn6ppIk.md +++ b/src/data/roadmaps/git-github/content/github-discussions@snWQHCQECZyUXHdn6ppIk.md @@ -1 +1,8 @@ -# GitHub Discussions \ No newline at end of file +# GitHub Discussions + +GitHub Discussions is a collaborative communication feature within GitHub repositories that provides a dedicated space for community conversations, questions, and knowledge sharing. It allows team members, contributors, and users to engage in threaded discussions, share ideas, ask for help, and make announcements outside of specific code changes or issues. This feature enhances project collaboration by centralizing important conversations, reducing noise in the issue tracker, and fostering a sense of community around open-source projects or team initiatives. + +Learn more from the following resources: + +- [@video@What is GitHub Discussions?](https://www.youtube.com/watch?v=bErGYN3Ljz8) +- [@official@official GitHub Discussions Docs](https://docs.github.com/en/discussions) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/github-education@pFyMiyNQ16-kP7jKaKKEU.md b/src/data/roadmaps/git-github/content/github-education@pFyMiyNQ16-kP7jKaKKEU.md index 6c7759572..1ebef25f1 100644 --- a/src/data/roadmaps/git-github/content/github-education@pFyMiyNQ16-kP7jKaKKEU.md +++ b/src/data/roadmaps/git-github/content/github-education@pFyMiyNQ16-kP7jKaKKEU.md @@ -1,3 +1,8 @@ # GitHub Education -GitHub Education is a program that provides free and discounted access to GitHub's developer tools, services, and resources for students, teachers, and researchers. This program aims to support education and research in software development, by making it easier for students and educators to learn, collaborate, and build projects on GitHub. By using GitHub Education, students can gain hands-on experience with real-world coding challenges, while educators can create a more engaging and interactive learning environment. \ No newline at end of file +GitHub Education is a program that provides free and discounted access to GitHub's developer tools, services, and resources for students, teachers, and researchers. This program aims to support education and research in software development, by making it easier for students and educators to learn, collaborate, and build projects on GitHub. By using GitHub Education, students can gain hands-on experience with real-world coding challenges, while educators can create a more engaging and interactive learning environment. + +Learn more from the following resources: + +- [@official@official GitHub Education Docs](https://education.github.com/) +- [@video@GitHub GitHub Education: free programs, technology, and opportunities available for Students](https://www.youtube.com/watch?v=HIVFdN9VGgw) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/github-essentials@NeSvgS2yA5x8qbcJHrV__.md b/src/data/roadmaps/git-github/content/github-essentials@NeSvgS2yA5x8qbcJHrV__.md index 68df35adf..b5cbab580 100644 --- a/src/data/roadmaps/git-github/content/github-essentials@NeSvgS2yA5x8qbcJHrV__.md +++ b/src/data/roadmaps/git-github/content/github-essentials@NeSvgS2yA5x8qbcJHrV__.md @@ -1 +1,3 @@ -# GitHub Essentials \ No newline at end of file +# GitHub Essentials + +GitHub Essentials refers to the core features and functionalities that form the foundation of GitHub's version control and collaboration platform. These essentials include repositories for storing and managing code, branches for parallel development, pull requests for code review and merging, issues for tracking tasks and bugs, and collaborative tools like project boards and wikis. Understanding and mastering these fundamental components allows developers to effectively manage their projects, collaborate with team members, and contribute to open-source initiatives, making GitHub an indispensable tool in modern software development workflows. \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/github-gists@M2_hBvXou7cCNqsMnexCt.md b/src/data/roadmaps/git-github/content/github-gists@M2_hBvXou7cCNqsMnexCt.md index 8637acd2c..77bc688a2 100644 --- a/src/data/roadmaps/git-github/content/github-gists@M2_hBvXou7cCNqsMnexCt.md +++ b/src/data/roadmaps/git-github/content/github-gists@M2_hBvXou7cCNqsMnexCt.md @@ -2,7 +2,6 @@ A GitHub Gist is a small code or text snippet that can be shared with others. It is a simple way to share code, configuration files, or other snippets of text without creating a full-fledged repository. Gists are useful for sharing examples, demos, or tutorials, and they can also serve as a starting point for larger projects. Each gist has a unique URL that can be shared with others, allowing them to view and edit the content. Gists support various file types, including code files, text files, and even images. They also provide features like syntax highlighting, line numbers, and commit history. - Visit the following resources to learn more: - [@official@Creating gists](https://docs.github.com/en/get-started/writing-on-github/editing-and-sharing-content-with-gists/creating-gists) diff --git a/src/data/roadmaps/git-github/content/github-interface@qZFtRABvlBbVvsy6T00J2.md b/src/data/roadmaps/git-github/content/github-interface@qZFtRABvlBbVvsy6T00J2.md index bf7a783ca..4a2d39a3b 100644 --- a/src/data/roadmaps/git-github/content/github-interface@qZFtRABvlBbVvsy6T00J2.md +++ b/src/data/roadmaps/git-github/content/github-interface@qZFtRABvlBbVvsy6T00J2.md @@ -1 +1,8 @@ -# GitHub Interface \ No newline at end of file +# GitHub Interface + +The GitHub interface is a web-based platform that provides a user-friendly environment for managing and collaborating on software projects. It offers a comprehensive set of tools and features accessible through an intuitive layout, including repository management, code browsing, issue tracking, pull requests, and project boards. The interface is designed to streamline workflows, facilitate team communication, and enhance productivity for developers of all skill levels. With its clean and organized structure, users can easily navigate between different sections of their projects, review code changes, manage tasks, and interact with team members, making it an essential tool for modern software development and version control. + +Learn more from the following resources: + +- [@official@GitHub Desktop App](https://github.com/apps/desktop) +- [@article@Getting Started with GitHub](https://digital.gov/resources/an-introduction-github/) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/github-organizations@RMrxQLhrINO5g4Mhxh5qS.md b/src/data/roadmaps/git-github/content/github-organizations@RMrxQLhrINO5g4Mhxh5qS.md index ff55952c9..a270e98c3 100644 --- a/src/data/roadmaps/git-github/content/github-organizations@RMrxQLhrINO5g4Mhxh5qS.md +++ b/src/data/roadmaps/git-github/content/github-organizations@RMrxQLhrINO5g4Mhxh5qS.md @@ -1 +1,8 @@ -# GitHub Organizations \ No newline at end of file +# GitHub Organizations + +GitHub Organizations are shared accounts that provide centralized management and collaboration for multiple projects and teams. They offer enhanced administrative controls, allowing owners to create teams with specific access permissions, manage member roles, and oversee repositories at scale. Organizations facilitate better project coordination, resource sharing, and team communication, making them ideal for businesses, open-source projects, and large-scale collaborations. With features like team discussions, project boards, and audit logs, GitHub Organizations streamline workflow management and foster a more structured and secure development environment. + +Learn more from the following resources: + +- [@official@About Organizations](https://docs.github.com/en/organizations/collaborating-with-groups-in-organizations/about-organizations) +- [@video@Set up a GitHub Organization](https://www.youtube.com/watch?v=XowSSIhJFuk) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/github-projects@DzFJDdqnSy5GeGHWOpcVo.md b/src/data/roadmaps/git-github/content/github-projects@DzFJDdqnSy5GeGHWOpcVo.md index 396e5f66e..c64d91fb0 100644 --- a/src/data/roadmaps/git-github/content/github-projects@DzFJDdqnSy5GeGHWOpcVo.md +++ b/src/data/roadmaps/git-github/content/github-projects@DzFJDdqnSy5GeGHWOpcVo.md @@ -1 +1,8 @@ -# GitHub Projects \ No newline at end of file +# GitHub Projects + +GitHub Projects is a flexible project management tool integrated directly into GitHub repositories. It allows teams to create customizable project boards, track issues and pull requests, and manage workflows using Kanban-style columns or table views. With features like automated workflows, custom fields, and various visualization options, GitHub Projects helps teams organize, prioritize, and track work across multiple repositories. This tool enhances collaboration, increases transparency, and streamlines project management processes, making it easier for developers and stakeholders to stay aligned on project goals and progress. + +Learn more from the following resources: + +- [@official@About Projects](https://docs.github.com/en/issues/planning-and-tracking-with-projects/learning-about-projects/about-projects) +- [@video@How to use Projects Roadmap](https://www.youtube.com/watch?v=D80u__nYYWw) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/github-releases@YmnTrjJtqHPXbEVrP8vd7.md b/src/data/roadmaps/git-github/content/github-releases@YmnTrjJtqHPXbEVrP8vd7.md index a13f580a6..c76dd74c1 100644 --- a/src/data/roadmaps/git-github/content/github-releases@YmnTrjJtqHPXbEVrP8vd7.md +++ b/src/data/roadmaps/git-github/content/github-releases@YmnTrjJtqHPXbEVrP8vd7.md @@ -1 +1,8 @@ -# GitHub Releases \ No newline at end of file +# GitHub Releases + +GitHub Releases is a feature that allows developers to package and distribute software versions to users. It provides a way to create tagged points in a repository's history, attach binary files (such as compiled executables or packaged code), and include release notes. This feature makes it easy to track and manage different versions of a project, share pre-compiled binaries with users who may not want to build from source, and communicate changes and updates to the community. GitHub Releases integrates seamlessly with Git tags and can be automated as part of a continuous integration and deployment pipeline. + +Learn more from the following resources: + +- [@official@About Releases](https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases) +- [@article@REST API endpoints for releases](https://docs.github.com/en/rest/releases/releases?apiVersion=2022-11-28) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/github-wikis@Ddkss13_qDJTquDHbVTVs.md b/src/data/roadmaps/git-github/content/github-wikis@Ddkss13_qDJTquDHbVTVs.md index 772097c91..db7a9b424 100644 --- a/src/data/roadmaps/git-github/content/github-wikis@Ddkss13_qDJTquDHbVTVs.md +++ b/src/data/roadmaps/git-github/content/github-wikis@Ddkss13_qDJTquDHbVTVs.md @@ -1 +1,8 @@ -# GitHub Wikis \ No newline at end of file +# GitHub Wikis + +GitHub Wikis are collaborative documentation spaces integrated directly into GitHub repositories. They provide a platform for teams to create, edit, and organize project-related information, such as documentation, guidelines, and FAQs. Wikis support Markdown formatting, making it easy to structure content and include images or links. With version control and the ability to clone wiki repositories, teams can collaboratively maintain up-to-date documentation alongside their code, enhancing project understanding and facilitating knowledge sharing among contributors and users. + +Learn more from the following resources: + +- [@official@About Wikis](https://docs.github.com/en/communities/documenting-your-project-with-wikis/about-wikis) +- [@article@Documenting your project with Wikis](https://docs.github.com/en/communities/documenting-your-project-with-wikis) From d2a15647413c0465f31f7dbb551890f29cf21ce2 Mon Sep 17 00:00:00 2001 From: dsh Date: Fri, 16 Aug 2024 02:12:10 +0100 Subject: [PATCH 003/120] Add what is a devops engineer guide (#6585) * add what is a devops engineer guide and add link in devops roadmap * fix some empty lines --- src/data/guides/devops-engineer.md | 309 +++++++++++++++++++++++++ src/data/roadmaps/devops/devops.md | 2 +- src/pages/devops/devops-engineer.astro | 31 +++ 3 files changed, 341 insertions(+), 1 deletion(-) create mode 100644 src/data/guides/devops-engineer.md create mode 100644 src/pages/devops/devops-engineer.astro diff --git a/src/data/guides/devops-engineer.md b/src/data/guides/devops-engineer.md new file mode 100644 index 000000000..b844b7ef8 --- /dev/null +++ b/src/data/guides/devops-engineer.md @@ -0,0 +1,309 @@ +--- +title: 'What is a DevOps Engineer? Responsbilities & Roles in @currentYear@' +description: 'Explore the responsibilities and roles of a DevOps Engineer in @currentYear@. Gain insights into the evolving field of DevOps and what it takes to succeed.' +authorId: ekene +excludedBySlug: '/devops/devops-engineer' +seo: + title: 'What is a DevOps Engineer? Responsbilities & Roles in @currentYear@' + description: 'Explore the responsibilities and roles of a DevOps Engineer in @currentYear@. Gain insights into the evolving field of DevOps and what it takes to succeed.' + ogImageUrl: 'https://assets.roadmap.sh/guest/what-is-devops-engineer-jort4.jpg' +isNew: true +type: 'textual' +date: 2024-08-15 +sitemap: + priority: 0.7 + changefreq: 'weekly' +tags: + - 'guide' + - 'textual-guide' + - 'guide-sitemap' +--- + +![What is a DevOps engineer and what are their responsibilities?](https://assets.roadmap.sh/guest/what-is-devops-engineer-jort4.jpg) + +Are you a developer monitoring recent changes in the ecosystem, looking to change careers or pick up new skills in 2024? If your choice is DevOps, you might be wondering what it entails, what it will take to become one in 2024, and how it is affected by the recent changes in the tech ecosystem. + +In recent years, the technology ecosystem has experienced a constant shift in the way hiring managers reach out, companies hire, and the roles and responsibilities described in job postings. Particularly, 2023 proved to be a challenging year as layoffs in the technology sector grew significantly, with more than [262,000 employees laid off across 1,180 firms](https://www.statista.com/statistics/199999/worldwide-tech-layoffs-covid-19/). + +Despite this change, DevOps, a field within the same ecosystem, has experienced continuous growth. In fact, the DevOps market size is expected to grow to [25.5 billion USD by 2028](https://www.marketsandmarkets.com/Market-Reports/devops-market-824.html#:~:text=The%20global%20DevOps%20market%20size,USD%2010.4%20billion%20in%202023.). This indicates that the roles and responsibilities of a DevOps engineer in the modern technology environment will evolve alongside this increasing demand. + +In this guide, we'll discuss the roles and responsibilities of a [DevOps engineer](https://roadmap.sh/devops), the importance of DevOps in teams, common roles within a DevOps team, and best practices for DevOps teams. Finally, the guide will offer roadmaps for your DevOps journey. + +A DevOps engineer's roles and responsibilities include: + +- Following best practices and utilizing Infrastructure as Code (IaC) tools to design, implement, and manage infrastructure. + +- Implementing and managing Continuous Integration and Continuous Delivery (CI/CD) pipelines to automate software and code releases. + +- Facilitating and promoting interpersonal skills between the development teams, operations teams, and other stakeholders to establish productivity and continuous improvement. + +- Implementing monitoring, logging, alerts, and dashboards to track the performance and health of applications and infrastructure. + +- Writing and maintaining scripts to automate tasks and DevOps processes. + +- Providing support and troubleshooting issues related to applications, systems, and infrastructure. + +- Efficiently manage and monitor cloud resources by implementing autoscaling and other cloud management techniques to maintain optimal performance. + +Let's look at the DevOps ecosystem in detail. + +## What is a DevOps engineer? + +A DevOps engineer is a professional whose primary purpose is to work at the intersection of software development and IT operations. Their main goal is to continuously deliver high-quality software, improve collaboration between teams, and shorten the Software Development Life Cycle (SDLC). + +DevOps engineers are responsible for maintaining the culture and practices that bridge the gap between the software development process (Dev) and IT operations (Ops). They promote the use of tools and other automation mechanisms to shorten the software delivery processes while maintaining high quality. + +DevOps engineers use various tools to automate and enhance their workflow, such as: + +- Docker +- Kubernetes +- Jenkins +- Version control systems +- Grafana +- Ansible +- Prometheus + +### Docker + +Docker is a containerization platform that allows developers to package applications and their dependencies into a lightweight and portable container that can run consistently in any environment. Docker streamlines the development process by making it easy to manage and scale applications + +![Docker](https://assets.roadmap.sh/guest/docker-logo-cvtzr.jpg) + +You can learn more details by exploring the [Docker roadmap](https://roadmap.sh/docker). + +### Kubernetes + +Kubernetes is a container orchestration platform for automating, deploying, and scaling containerized applications. It offers numerous benefits, including cluster management, high availability, load balancing, and resource management. + +![Kubernetes](https://assets.roadmap.sh/guest/kubernetes-logo-zipbs.jpg) + +You can learn more details by exploring the [Kubernetes roadmap](https://roadmap.sh/kubernetes). + +### Jenkins + +Jenkins is an open-source automation tool for automating CI/CD processes. It gives developers the flexibility to build, test, and deploy applications. Jenkins' ecosystem and seamless integration with various tools make it ideal for automating DevOps workflow. + +![Jenkins](https://assets.roadmap.sh/guest/jenkins-logo-pqnqc.jpg) + +### Version control systems + +Version control systems allow developers to track, revise, manage branches, and merge codes seamlessly. Examples include Git, Mercurial, and Subversion, with popular platforms like GitHub and Bitbucket providing integration support. + +![Version control systems](https://assets.roadmap.sh/guest/git-logo-hrzut.jpg) + +### Grafana + +Grafana is an analytic and monitoring platform for visualizing metrics, logs, and other critical data. It helps DevOps engineers monitor the real-time health and performance of applications and systems. + +![Grafana](https://assets.roadmap.sh/guest/grafana-logo-zyx92.jpg) + +### Ansible + +Ansible is an automation tool for configuring application management, deployment, and other automation tasks. It uses a YAML syntax to define automation workflow, reducing the time required for repetitive tasks. + +![Ansible](https://assets.roadmap.sh/guest/ansible-logo-efs80.jpg) + +### Prometheus + +Prometheus is a monitoring and alerting tool that collects metrics from applications and infrastructure. It stores these metrics in a time-series database, allowing for querying and visualization to detect potential issues. + +![Prometheus](https://assets.roadmap.sh/guest/pometheus-logo-v4pp4.jpg) + +## What are the responsibilities of a DevOps engineer? + +DevOps engineers wear multiple hats to perform their day-to-day tasks. They possess technical skills in the software development lifecycle and operations skills for maintenance, and they are responsible for bridging the gap and fostering collaboration between development and other stakeholders. + +DevOps engineer responsibilities include: + +- Infrastructure management +- Setting up and maintaining CI/CD pipelines +- Working closely with others and keeping communication flowing +- Keeping an eye on things by monitoring and logging +- Automating toil +- Handling deployments and managing cloud services +- Optimizing performance +- Software development and scripting +- Managing resources efficiently +- Supporting developers and troubleshooting issues +- Ensuring security across the infrastructure + +![DevOps engineer job description](https://assets.roadmap.sh/guest/devops-engineer-description-tro4n.jpeg) + +Now, let's look at these points in detail. + +### Infrastructure management + +A key responsibility of a DevOps engineer is to ensure the design, implementation, and management of a robust and scalable infrastructure. They use Infrastructure as Code (IaC) tools like Terraform or Ansible to automate infrastructure provisioning and configuration management. + +### CI/CD pipelines + +In the SDLC, new features, patches, and fixes are frequently deployed to meet customers' needs. To facilitate this, a DevOps engineer must set up a CI/CD pipeline to automate the testing environment and software releases, ensuring seamless integration and a smooth deployment process. + +![ci/cd](https://assets.roadmap.sh/guest/cicd-y1h56.jpeg) + +### Collaboration and communication + +DevOps engineer skills are essential for fostering an efficient and collaborative work environment. DevOps engineers champion clear communication (both oral and written) between project stakeholders. They believe in active communication and collaboration between the development team and other project stakeholders to ensure productivity, shared responsibilities, and continuous improvement. + +![collaboration & communication](https://assets.roadmap.sh/guest/collaboration-f4lfb.jpeg) + +### Automation + +One of the essential DevOps principles is automating manual and repetitive tasks. A DevOps engineer uses DevOps automation tools like Puppet or SaltStack to improve efficiency and reduce human error during deployment processes, scaling, and other operational tasks. + +![automation](https://assets.roadmap.sh/guest/automation-kani0.jpeg) + +### Deployment and cloud management + +DevOps engineers use containers and orchestration platforms like Docker and Kubernetes to facilitate efficient deployment, scaling, and management, whether in on-premise environments or cloud services like [Amazon Web Services (AWS),](https://roadmap.sh/aws) Microsoft Azure, or Google Cloud Platform. + +![Clouds deployment — AWS vs Azure vs GCP](https://assets.roadmap.sh/guest/cloud-management-qbcb0.jpeg) + +### Performance optimization + +A key responsibility of a DevOps engineer is to set up mechanisms to constantly audit systems, analyze performance, and implement load and stress testing. This guarantees that applications can handle high demand and spikes in traffic. + +### Software development and scripting + +While the DevOps ecosystem offers both paid and open-source tools to help streamline responsibilities, there are times when custom-made tools or extensions of existing tools are required. A good understanding of software development processes and scripting languages like [Python](https://roadmap.sh/python), [Go](https://roadmap.sh/golang), or [JavaScript (Node.js)](https://roadmap.sh/nodejs) helps a DevOps engineer build solutions for such specific business edge cases. + +### Resource management + +In a DevOps engineer role, engineers ensure that the resources allocated to a system can perform effectively during both slow and peak periods. This involves implementing autoscaling, monitoring resource usage, considering future capacity needs, and utilizing other resource configuration management tools. + +### Developer support and troubleshooting + +An integral part of DevOps methodology is ensuring that development and operational teams are supported by troubleshooting issues related to applications, infrastructures, and other systems. Additionally, DevOps professionals create documentation, guides, and other helpful resources to enhance the knowledge base. This guarantees that both experienced team members and new joiners can leverage these resources for debugging, troubleshooting, or research purposes. + +### Security + +A growing part of the DevOps ecosystem is Development, Security, and Operations (DevSecOps). This practice involves automating security and best practices into every phase of the SDLC to ensure compliance with industry standards, effective resource identity and access management, and more. A good understanding of DevSecOps is an essential skill for experienced DevOps engineers. + +## What is the importance of DevOps in an organization? + +DevOps is gaining massive adoption because organizations are shifting away from traditional software development and resource provisioning approaches that are slow, prone to human error, and siloed. They want to deliver fast, reliable, and scalable applications, which the traditional approach lacks. + +Some of the ways DevOps can benefit an organization include: + +- Improving collaboration and shared responsibilities among project stakeholders. +- Enhancing software quality with automated testing and continuous feedback loops. +- Speeding up software delivery by promoting communication and collaboration between cross-functional teams. +- Supporting career development through a DevOps culture of experimentation and learning new DevOps skills. +- Providing a better customer experience because applications are thoroughly tested before going live. +- Reducing risk associated with software development and deployment using CI/CD principles. +- Encouraging knowledge sharing and flexibility to experiment, helping teams learn a wide range of skills and technologies. + +Organizations practicing or willing to adopt DevOps must be prepared for a cultural shift, continuous improvement, and investment in automation tools. Although it may be a lot at times, the benefits are worth the investment. + +## Common roles within the DevOps ecosystem + +The recent growth in the DevOps ecosystem has led to newer DevOps roles. While most jobs categorize these roles under the umbrella term "DevOps Engineer," which may work for small organizations, it becomes an issue in medium to larger organizations with diverse project goals and other factors. While these roles share similarities and sometimes overlap in responsibilities, it is important to understand the different aspects they tackle. The diagram below shows the crucial roles in the DevOps lifecycle. + +![Roles in DevOps](https://assets.roadmap.sh/guest/6-devops-roles-xc82k.jpeg) + +### Site Reliability engineers (SRE) + +SRE focuses on system reliability, scalability, and performance. Their skills involve combining software engineering and systems administration. + +**Key Responsibilities** + +- Implements monitoring and alerting systems. +- Ensures the system is reliable, performant, and scalable. +- Analyze incidents to detect them and implement preventive measures. + +**Required skills** + +- Proficiency in using automation and infrastructure as code tools. +- Problem-solving and troubleshooting skills. +- Experience with alerting and monitoring tools like Prometheus and Grafana. + +### Cloud engineers + +Cloud engineers are responsible for designing and implementing cloud-native solutions. They also manage cloud technologies and infrastructure like AWS, Azure, or Google Cloud to guarantee efficient resource usage and cost-effectiveness. + +**Key Responsibilities** + +- Design and manage cloud infrastructure. +- Monitor and optimize cloud resources and associated costs. +- Ensure compliance and security of cloud resources. + +**Required skills** + +- Expertise in using popular cloud providers like AWS, Azure, and GCP. +- Proficiency in using automation tools like Terraform and CloudFormation. +- Knowledge of cloud security and compliance + +### Automation engineers + +Automation engineers are responsible for identifying tasks that can be automated across development and operations. They develop scripts and DevOps tools to automate repetitive tasks and integrate them into CI/CD pipelines. + +**Key Responsibilities** + +- Review, design, and implement automation strategies across the software development lifecycle. +- Ensures consistency and reliability of automated processes. +- Stay up-to-date with the latest automation tools and technologies. + +**Required skills** + +- Proficiency in scripting and programming languages. +- Expertise in automation tools and frameworks like Jenkins and GitHub Action. + +### Build engineers + +Build engineers are responsible for managing build systems and tools, troubleshooting build failures, optimizing build performance, and integrating builds into the CI/CD pipelines. + +**Key Responsibilities** + +- Manage and maintain build systems and tools. +- Ensures builds are consistent and replicable across environments. +- Automate the build process. + +**Required skills** + +- Knowledge of CI/CD tools and version control systems. +- Proficiency in build tools. +- Strong problem-solving and debugging skills. + +### Release engineers + +Release engineers are responsible for planning, scheduling, and coordinating the software release process for testing, sandbox, or production environments. + +**Key Responsibilities** + +- Plan and manage the release of new software, software updates, and new features. +- Maintain release schedules and project release timelines. + +**Required skills** + +- Knowledge of CI/CD tools and version control systems. +- Project management and organization skills. +- Strong communication and coordination skills + +### Security engineers + +Security engineers are responsible for integrating security and best practices into the DevOps pipeline. Additionally, they collaborate with development and operations teams to conduct security assessments, vulnerability scans, and compliance checks. + +**Key Responsibilities** + +- Implement and manage security tools and technologies. +- Integrate DevSecOps into the software development lifecycle. +- Document security best practices and ensure compliance with policies and regulations. + +**Required skills** + +- Knowledge of security best practices and frameworks +- Familiarity with identity and access management systems + +## Best practices for DevOps teams + +To achieve success as a team practicing or intending to adopt DevOps practices, you need a combination of the right tools, best practices, and a cultural shift. Here are some tips and best DevOps practices for teams: + +- Encourage Continuous Integration (CI) and Continuous Deployment (CD) by having software developers commit code frequently, automating builds, and providing timely feedback between teams. +- Embrace IaC to maintain consistency across testing, production, and other environments. +- Implement logging, alerts, and monitoring across systems. +- Ensure unit tests, integration tests, and end-to-end tests to validate the quality of software. +- Promote soft skills, feedback loops, post-mortem audits, retrospectives, and a continuous learning culture. +- Set clear metrics and Key Performance Indicators (KPIs) to easily identify areas needing improvement. +- Ensure effective collaboration and shared responsibilities between development, operations, QAs, and other teams. + +In summary, DevOps is growing and will continue to expand, bringing about even more DevOps roles and responsibilities for engineers in the ecosystem. The roadmap.sh’s [DevOps roadmap](https://roadmap.sh/devops) is a valuable resource that can help you stay updated on these changes. Additionally, you can track your learning path and connect with a vibrant community by [signing up](https://roadmap.sh/signup) on the roadmap.sh platform. diff --git a/src/data/roadmaps/devops/devops.md b/src/data/roadmaps/devops/devops.md index 5b8396f1a..a1849ac41 100644 --- a/src/data/roadmaps/devops/devops.md +++ b/src/data/roadmaps/devops/devops.md @@ -18,7 +18,7 @@ question: DevOps is not a specific job title or role, but rather a set of practices and principles that can be applied across a variety of roles in software development and IT operations. Anyone involved in the software development and delivery process can adopt a DevOps mindset and apply DevOps practices in their work, including developers, testers, operations engineers, product managers, and others. ## What is a DevOps Engineer? - While DevOps is not a specific job title or role, organizations often hire for a "DevOps Engineer" role. A DevOps Engineer is a software engineer who specializes in the practices and tools that enable the continuous delivery of software. DevOps Engineers are responsible for the design and implementation of applications, software, and services for their organization, and they work closely with developers, testers, and operations staff to oversee the code releases. + While DevOps is not a specific job title or role, organizations often hire for a "DevOps Engineer" role. A [DevOps Engineer](https://roadmap.sh/devops/devops-engineer) is a software engineer who specializes in the practices and tools that enable the continuous delivery of software. DevOps Engineers are responsible for the design and implementation of applications, software, and services for their organization, and they work closely with developers, testers, and operations staff to oversee the code releases. dimensions: width: 968 height: 2850 diff --git a/src/pages/devops/devops-engineer.astro b/src/pages/devops/devops-engineer.astro new file mode 100644 index 000000000..c90546429 --- /dev/null +++ b/src/pages/devops/devops-engineer.astro @@ -0,0 +1,31 @@ +--- +import GuideContent from '../../components/Guide/GuideContent.astro'; +import GuideHeader from '../../components/GuideHeader.astro'; +import BaseLayout from '../../layouts/BaseLayout.astro'; +import { getGuideById } from '../../lib/guide'; +import { getOpenGraphImageUrl } from '../../lib/open-graph'; +import { replaceVariables } from '../../lib/markdown'; + +const guideId = 'devops-engineer'; +const guide = await getGuideById(guideId); + +const { frontmatter: guideData } = guide!; + +const ogImageUrl = + guideData.seo.ogImageUrl || + getOpenGraphImageUrl({ + group: 'guide', + resourceId: guideId, + }); +--- + + + + + From 9d8c7f7253df25889142ae7fcbc1b687ca8e5272 Mon Sep 17 00:00:00 2001 From: dsh Date: Fri, 16 Aug 2024 02:12:31 +0100 Subject: [PATCH 004/120] How to become a Frontend Developer in 7 steps article (#6583) * How to become a Frontend Developer in 7 steps article * fix link issues --- package-lock.json | 5378 +++++------------ .../how-to-become-frontend-developer.md | 306 + .../how-to-become-frontend-developer.astro | 31 + 3 files changed, 1717 insertions(+), 3998 deletions(-) create mode 100644 src/data/guides/how-to-become-frontend-developer.md create mode 100644 src/pages/frontend/how-to-become-frontend-developer.astro diff --git a/package-lock.json b/package-lock.json index 8bd87ca84..edfa07c9d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,66 +9,68 @@ "version": "1.0.0", "dependencies": { "@astrojs/node": "^8.3.2", - "@astrojs/react": "^3.6.0", + "@astrojs/react": "^3.6.1", "@astrojs/sitemap": "^3.1.6", "@astrojs/tailwind": "^5.1.0", - "@fingerprintjs/fingerprintjs": "^4.4.1", + "@fingerprintjs/fingerprintjs": "^4.4.3", "@nanostores/react": "^0.7.2", "@napi-rs/image": "^1.9.2", "@resvg/resvg-js": "^2.6.2", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", - "astro": "^4.11.3", + "astro": "^4.13.0", "clsx": "^2.1.1", - "dayjs": "^1.11.11", + "dayjs": "^1.11.12", "dom-to-image": "^2.6.0", "dracula-prism": "^2.1.16", "gray-matter": "^4.0.3", "htm": "^3.1.1", "image-size": "^1.1.1", - "jose": "^5.6.2", + "jose": "^5.6.3", "js-cookie": "^3.0.5", - "lucide-react": "^0.399.0", + "lucide-react": "^0.419.0", "nanoid": "^5.0.7", "nanostores": "^0.10.3", "node-html-parser": "^6.1.13", - "npm-check-updates": "^16.14.20", - "playwright": "^1.45.0", + "npm-check-updates": "^17.0.0", + "playwright": "^1.45.3", "prismjs": "^1.29.0", "react": "^18.3.1", "react-calendar-heatmap": "^1.9.0", "react-confetti": "^6.1.0", "react-dom": "^18.3.1", - "react-tooltip": "^5.27.0", + "react-tooltip": "^5.27.1", "reactflow": "^11.11.4", "rehype-external-links": "^3.0.0", "remark-parse": "^11.0.0", "roadmap-renderer": "^1.0.6", - "satori": "^0.10.13", + "satori": "^0.10.14", "satori-html": "^0.3.2", "sharp": "^0.33.4", "slugify": "^1.6.6", - "tailwind-merge": "^2.3.0", - "tailwindcss": "^3.4.4", + "tailwind-merge": "^2.4.0", + "tailwindcss": "^3.4.7", + "turndown": "^7.2.0", "unified": "^11.0.5", "zustand": "^4.5.4" }, "devDependencies": { - "@playwright/test": "^1.45.0", + "@playwright/test": "^1.45.3", "@tailwindcss/typography": "^0.5.13", "@types/dom-to-image": "^2.6.7", "@types/js-cookie": "^3.0.6", "@types/prismjs": "^1.26.4", "@types/react-calendar-heatmap": "^1.6.7", + "@types/turndown": "^5.0.5", "csv-parser": "^3.0.0", "gh-pages": "^6.1.1", "js-yaml": "^4.1.0", "markdown-it": "^14.1.0", - "openai": "^4.52.2", - "prettier": "^3.3.2", - "prettier-plugin-astro": "^0.14.0", + "openai": "^4.53.2", + "prettier": "^3.3.3", + "prettier-plugin-astro": "^0.14.1", "prettier-plugin-tailwindcss": "^0.6.5", - "tsx": "^4.16.0" + "tsx": "^4.16.5" } }, "node_modules/@alloc/quick-lru": { @@ -95,9 +97,9 @@ } }, "node_modules/@astrojs/compiler": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.9.2.tgz", - "integrity": "sha512-Vpu0Ffsj8SoV+N0DFHlxxOMKHwSC9059Xy/OlG1t6uFYSoJXxkBC2WyF6igO7x10V+8uJrhOxaXr3nA90kJXow==" + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.10.3.tgz", + "integrity": "sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw==" }, "node_modules/@astrojs/internal-helpers": { "version": "0.4.1", @@ -153,9 +155,9 @@ } }, "node_modules/@astrojs/react": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@astrojs/react/-/react-3.6.0.tgz", - "integrity": "sha512-YGLxy5jCU9xKG/HAvYsWMcvrQVIhqVe0Sda3Z5UtP32rfXeG6B9J1xQvnx+kRSFTpIrj+7AwPSDSehLbCHJ56w==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@astrojs/react/-/react-3.6.2.tgz", + "integrity": "sha512-fK29lYI7zK/KG4ZBy956x4dmauZcZ18osFkuyGa8r3gmmCQa2NZ9XNu9WaVYEUm0j89f4Gii4tbxLoyM8nk2MA==", "dependencies": { "@vitejs/plugin-react": "^4.3.1", "ultrahtml": "^1.5.3" @@ -224,28 +226,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", - "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", - "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.9", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-module-transforms": "^7.24.9", - "@babel/helpers": "^7.24.8", - "@babel/parser": "^7.24.8", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.9", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -261,11 +263,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", - "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", "dependencies": { - "@babel/types": "^7.24.9", + "@babel/types": "^7.25.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -286,11 +288,11 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", - "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dependencies": { - "@babel/compat-data": "^7.24.8", + "@babel/compat-data": "^7.25.2", "@babel/helper-validator-option": "^7.24.8", "browserslist": "^4.23.1", "lru-cache": "^5.1.1", @@ -300,40 +302,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", @@ -347,15 +315,14 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", - "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -384,17 +351,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", @@ -420,12 +376,12 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", - "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.8" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -446,9 +402,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", - "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "dependencies": { + "@babel/types": "^7.25.2" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -471,15 +430,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz", - "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -517,31 +476,28 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", - "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.8", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.8", - "@babel/types": "^7.24.8", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -550,9 +506,9 @@ } }, "node_modules/@babel/types": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", - "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", "dependencies": { "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", @@ -562,15 +518,6 @@ "node": ">=6.9.0" } }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/@emnapi/core": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.2.0.tgz", @@ -869,6 +816,22 @@ "node": ">=12" } }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", + "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/openbsd-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", @@ -974,11 +937,6 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.4.tgz", "integrity": "sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==" }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" - }, "node_modules/@img/sharp-darwin-arm64": { "version": "0.33.4", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz", @@ -1490,6 +1448,11 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mixmark-io/domino": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", + "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==" + }, "node_modules/@nanostores/react": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/@nanostores/react/-/react-0.7.2.tgz", @@ -1757,183 +1720,10 @@ "node": ">= 8" } }, - "node_modules/@npmcli/fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", - "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/git": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", - "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", - "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/@npmcli/git/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", - "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "bin/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/move-file/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", - "dependencies": { - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", - "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "node_modules/@oslojs/encoding": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-0.4.1.tgz", + "integrity": "sha512-hkjo6MuIK/kQR5CrGNdAPZhS01ZCXuWDRJ187zh6qqF2+yMHZpD9fAYpX8q2bOO6Ryhl3XpCT6kUX76N8hhm4Q==" }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", @@ -1945,12 +1735,12 @@ } }, "node_modules/@playwright/test": { - "version": "1.45.2", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.45.2.tgz", - "integrity": "sha512-JxG9eq92ET75EbVi3s+4sYbcG7q72ECeZNbdBlaMkGcNbiDQ4cAi8U2QP5oKkOx+1gpaiL1LDStmzCaEM1Z6fQ==", + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.46.0.tgz", + "integrity": "sha512-/QYft5VArOrGRP5pgkrfKksqsKA6CEFyGQ/gjNe6q0y4tZ1aaPfq4gIjudr1s3D+pXyrPRdsy4opKDrjBabE5w==", "dev": true, "dependencies": { - "playwright": "1.45.2" + "playwright": "1.46.0" }, "bin": { "playwright": "cli.js" @@ -1959,43 +1749,6 @@ "node": ">=18" } }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@reactflow/background": { "version": "11.3.14", "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.3.14.tgz", @@ -2487,9 +2240,9 @@ ] }, "node_modules/@shikijs/core": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.10.3.tgz", - "integrity": "sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.13.0.tgz", + "integrity": "sha512-Mj5NVfbAXcD1GnwOTSPl8hBn/T8UDpfFQTptp+p41n/CbUcJtOq98WaRD7Lz3hCglYotUTHUWtzu3JhK6XlkAA==", "dependencies": { "@types/hast": "^3.0.4" } @@ -2509,72 +2262,6 @@ "node": ">= 8.0.0" } }, - "node_modules/@sigstore/bundle": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", - "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", - "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", - "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "make-fetch-happen": "^11.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", - "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, "node_modules/@tailwindcss/typography": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.13.tgz", @@ -2590,56 +2277,6 @@ "tailwindcss": ">=3.0.0 || insiders" } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tufjs/canonical-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", - "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", - "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", - "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@tybys/wasm-util": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", @@ -2945,11 +2582,6 @@ "@types/unist": "*" } }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" - }, "node_modules/@types/js-cookie": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz", @@ -3040,10 +2672,11 @@ "@types/node": "*" } }, - "node_modules/@types/semver-utils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@types/semver-utils/-/semver-utils-1.1.3.tgz", - "integrity": "sha512-T+YwkslhsM+CeuhYUxyAjWm7mJ5am/K10UX40RuA6k6Lc7eGtq8iY2xOzy7Vq0GOqhl/xZl5l2FwURZMTPTUww==" + "node_modules/@types/turndown": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@types/turndown/-/turndown-5.0.5.tgz", + "integrity": "sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w==", + "dev": true }, "node_modules/@types/unist": { "version": "3.0.2", @@ -3073,11 +2706,6 @@ "vite": "^4.2.0 || ^5.0.0" } }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -3101,21 +2729,11 @@ "node": ">=0.4.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/agentkeepalive": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, "dependencies": { "humanize-ms": "^1.2.1" }, @@ -3123,18 +2741,6 @@ "node": ">= 8.0.0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -3219,24 +2825,6 @@ "node": ">= 8" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "deprecated": "This package is no longer supported.", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -3286,33 +2874,33 @@ } }, "node_modules/astro": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/astro/-/astro-4.12.1.tgz", - "integrity": "sha512-KwBoXYL4L1XLTTjoj4z6q1g/tZfWDKR1pKSTAshVqt5FH2eu82pnGW737SxcT/Ssg/hLlb9KnWiclXmqWpcbCQ==", + "version": "4.13.4", + "resolved": "https://registry.npmjs.org/astro/-/astro-4.13.4.tgz", + "integrity": "sha512-uoW961qyU5xxCiUzITVX8wYmdWbSH1zeog9UomoWC5uNpnIbH6WxOPv/qYu2m7W4r2PCxdRqfVXoYjZhFyGfTA==", "dependencies": { - "@astrojs/compiler": "^2.9.0", + "@astrojs/compiler": "^2.10.2", "@astrojs/internal-helpers": "0.4.1", "@astrojs/markdown-remark": "5.2.0", "@astrojs/telemetry": "3.1.0", - "@babel/core": "^7.24.9", - "@babel/generator": "^7.24.10", - "@babel/parser": "^7.24.8", - "@babel/plugin-transform-react-jsx": "^7.24.7", - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.9", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/plugin-transform-react-jsx": "^7.25.2", + "@babel/traverse": "^7.25.3", + "@babel/types": "^7.25.2", + "@oslojs/encoding": "^0.4.1", "@types/babel__core": "^7.20.5", "@types/cookie": "^0.6.0", "acorn": "^8.12.1", "aria-query": "^5.3.0", "axobject-query": "^4.1.0", "boxen": "7.1.1", - "chokidar": "^3.6.0", "ci-info": "^4.0.0", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^0.6.0", "cssesc": "^3.0.0", - "debug": "^4.3.5", + "debug": "^4.3.6", "deterministic-object-hash": "^2.0.2", "devalue": "^5.0.0", "diff": "^5.2.0", @@ -3330,7 +2918,7 @@ "http-cache-semantics": "^4.1.1", "js-yaml": "^4.1.0", "kleur": "^4.1.5", - "magic-string": "^0.30.10", + "magic-string": "^0.30.11", "mrmime": "^2.0.0", "ora": "^8.0.1", "p-limit": "^6.1.0", @@ -3339,19 +2927,19 @@ "preferred-pm": "^4.0.0", "prompts": "^2.4.2", "rehype": "^13.0.1", - "semver": "^7.6.2", - "shiki": "^1.10.3", + "semver": "^7.6.3", + "shiki": "^1.12.1", "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "tsconfck": "^3.1.1", "unist-util-visit": "^5.0.0", "vfile": "^6.0.2", - "vite": "^5.3.4", + "vite": "^5.4.0", "vitefu": "^0.2.5", "which-pm": "^3.0.0", "yargs-parser": "^21.1.1", "zod": "^3.23.8", - "zod-to-json-schema": "^3.23.1" + "zod-to-json-schema": "^3.23.2" }, "bin": { "astro": "astro.js" @@ -3532,6 +3120,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3579,126 +3168,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", - "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/camelcase": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", @@ -3817,14 +3286,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, "node_modules/ci-info": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", @@ -3849,14 +3310,6 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, "node_modules/cli-boxes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", @@ -3893,57 +3346,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-table3/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-table3/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-table3/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -3986,14 +3388,6 @@ "simple-swizzle": "^0.2.2" } }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" - } - }, "node_modules/color/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -4054,44 +3448,8 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true }, "node_modules/convert-source-map": { "version": "2.0.0", @@ -4119,31 +3477,6 @@ "node": ">= 8" } }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/css-background-parser": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/css-background-parser/-/css-background-parser-0.1.0.tgz", @@ -4331,9 +3664,9 @@ "integrity": "sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==" }, "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { "ms": "2.1.2" }, @@ -4358,47 +3691,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -4408,11 +3700,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -4487,17 +3774,6 @@ "node": ">=0.3.1" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -4559,20 +3835,6 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/dracula-prism": { "version": "2.1.16", "resolved": "https://registry.npmjs.org/dracula-prism/-/dracula-prism-2.1.16.tgz", @@ -4624,7 +3886,9 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, "optional": true, + "peer": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -4640,19 +3904,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" - }, "node_modules/es-module-lexer": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", @@ -4703,17 +3954,6 @@ "node": ">=6" } }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -4791,11 +4031,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==" - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -4827,11 +4062,6 @@ "node": ">=8.6.0" } }, - "node_modules/fast-memoize": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", - "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==" - }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -4899,21 +4129,6 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/find-up-simple": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", @@ -4999,14 +4214,6 @@ "node": ">= 14" } }, - "node_modules/fp-and-or": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.4.tgz", - "integrity": "sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw==", - "engines": { - "node": ">=10" - } - }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -5041,29 +4248,11 @@ "node": ">=14.14" } }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -5086,67 +4275,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "deprecated": "This package is no longer supported.", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/gauge/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -5166,17 +4294,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-stream": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", @@ -5232,6 +4349,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5258,28 +4376,6 @@ "node": ">= 6" } }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "engines": { - "node": ">=10" - } - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -5304,49 +4400,6 @@ "node": ">=0.10.0" } }, - "node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/got/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -5399,22 +4452,6 @@ "node": ">=4" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, - "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -5613,25 +4650,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, "node_modules/htm": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.1.tgz", @@ -5671,43 +4689,6 @@ "node": ">= 0.8" } }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/human-signals": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", @@ -5720,6 +4701,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, "dependencies": { "ms": "^2.0.0" } @@ -5728,7 +4710,9 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, "optional": true, + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -5736,47 +4720,6 @@ "node": ">=0.10.0" } }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-walk": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", - "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/image-size": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", @@ -5791,14 +4734,6 @@ "node": ">=16.x" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "engines": { - "node": ">=8" - } - }, "node_modules/import-meta-resolve": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", @@ -5808,32 +4743,12 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -5844,26 +4759,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, "node_modules/is-absolute-url": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", @@ -5891,31 +4786,6 @@ "node": ">=8" } }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-ci/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, "node_modules/is-core-module": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", @@ -5996,21 +4866,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-interactive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", @@ -6022,22 +4877,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" - }, - "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -6046,26 +4885,10 @@ "node": ">=0.12.0" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "engines": { "node": ">=12" }, @@ -6084,11 +4907,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, "node_modules/is-unicode-supported": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", @@ -6114,14 +4932,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "engines": { - "node": ">=12" - } - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -6149,11 +4959,6 @@ "jiti": "bin/jiti.js" } }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" - }, "node_modules/jose": { "version": "5.6.3", "resolved": "https://registry.npmjs.org/jose/-/jose-5.6.3.tgz", @@ -6186,11 +4991,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -6202,27 +5002,6 @@ "node": ">=4" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/json-parse-helpfulerror": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", - "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==", - "dependencies": { - "jju": "^1.1.0" - } - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -6246,27 +5025,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsonlines": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsonlines/-/jsonlines-0.1.1.tgz", - "integrity": "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==" - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -6283,20 +5041,6 @@ "node": ">=6" } }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "dependencies": { - "package-json": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/lilconfig": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", @@ -6378,25 +5122,6 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, "node_modules/lodash.castarray": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", @@ -6472,17 +5197,6 @@ "loose-envify": "cli.js" } }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -6492,19 +5206,19 @@ } }, "node_modules/lucide-react": { - "version": "0.399.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.399.0.tgz", - "integrity": "sha512-UyTNa3djBISdzL2UktgCrESXexQXaDQWi/WsDkbw6fBFfHlapajR58WoR+gxQ4laxfEyiHmoFrEIM3V+5XOVQg==", + "version": "0.419.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.419.0.tgz", + "integrity": "sha512-YkOHuc1uGH2A4G0NRZyeCW6mMFGb8z3amep0fARuKIri68nveAT5C8OuXOPJXpb/iIgSfsjdMjjII7bnEtGkvw==", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/make-dir": { @@ -6522,39 +5236,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, "node_modules/markdown-it": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", @@ -7417,21 +6098,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7443,6 +6114,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7455,202 +6127,6 @@ "node": ">=8" } }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/minipass-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", - "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-json-stream/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -7705,14 +6181,6 @@ "node": "^18.0.0 || >=20.0.0" } }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/nlcst-to-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", @@ -7764,418 +6232,184 @@ } } }, - "node_modules/node-gyp": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", - "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "node_modules/node-html-parser": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", + "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" + "css-select": "^5.1.0", + "he": "1.2.0" } }, - "node_modules/node-gyp/node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, + "node_modules/node-releases": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.17.tgz", + "integrity": "sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/node-gyp/node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" + "node_modules/npm-check-updates": { + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-17.0.6.tgz", + "integrity": "sha512-KCiaJH1cfnh/RyzKiDNjNfXgcKFyQs550Uf1OF/Yzb8xO56w+RLpP/OKRUx23/GyP/mLYwEpOO65qjmVdh6j0A==", + "bin": { + "ncu": "build/cli.js", + "npm-check-updates": "build/cli.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0", + "npm": ">=8.12.1" } }, - "node_modules/node-gyp/node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-gyp/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/node-gyp/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "engines": { "node": ">=12" - } - }, - "node_modules/node-gyp/node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-gyp/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-gyp/node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/node-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-gyp/node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dependencies": { - "minipass": "^3.1.1" + "boolbase": "^1.0.0" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/node-gyp/node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dependencies": { - "unique-slug": "^3.0.0" - }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/node-gyp/node_modules/unique-slug": { + "node_modules/object-hash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dependencies": { - "imurmurhash": "^0.1.4" - }, + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/node-html-parser": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", - "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", - "dependencies": { - "css-select": "^5.1.0", - "he": "1.2.0" + "node": ">= 6" } }, - "node_modules/node-releases": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.17.tgz", - "integrity": "sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==" - }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" + "ee-first": "1.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.8" } }, - "node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "wrappy": "1" } }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dependencies": { - "lru-cache": "^7.5.1" + "mimic-fn": "^4.0.0" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "engines": { "node": ">=12" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", - "engines": { - "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-bundled": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", - "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", + "node_modules/openai": { + "version": "4.55.7", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.55.7.tgz", + "integrity": "sha512-I2dpHTINt0Zk+Wlns6KzkKu77MmNW3VfIIQf5qYziEUI6t7WciG1zTobfKqdPzBmZi3TTM+3DtjPumxQdcvzwA==", + "dev": true, "dependencies": { - "npm-normalize-package-bin": "^3.0.0" + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } } }, - "node_modules/npm-check-updates": { - "version": "16.14.20", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.20.tgz", - "integrity": "sha512-sYbIhun4DrjO7NFOTdvs11nCar0etEhZTsEjL47eM0TuiGMhmYughRCxG2SpGRmGAQ7AkwN7bw2lWzoE7q6yOQ==", + "node_modules/ora": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", + "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", "dependencies": { - "@types/semver-utils": "^1.1.1", "chalk": "^5.3.0", - "cli-table3": "^0.6.3", - "commander": "^10.0.1", - "fast-memoize": "^2.5.2", - "find-up": "5.0.0", - "fp-and-or": "^0.1.4", - "get-stdin": "^8.0.0", - "globby": "^11.0.4", - "hosted-git-info": "^5.1.0", - "ini": "^4.1.1", - "js-yaml": "^4.1.0", - "json-parse-helpfulerror": "^1.0.3", - "jsonlines": "^0.1.1", - "lodash": "^4.17.21", - "make-fetch-happen": "^11.1.1", - "minimatch": "^9.0.3", - "p-map": "^4.0.0", - "pacote": "15.2.0", - "parse-github-url": "^1.0.2", - "progress": "^2.0.3", - "prompts-ncu": "^3.0.0", - "rc-config-loader": "^4.1.3", - "remote-git-tags": "^3.0.0", - "rimraf": "^5.0.5", - "semver": "^7.5.4", - "semver-utils": "^1.1.4", - "source-map-support": "^0.5.21", - "spawn-please": "^2.0.2", - "strip-ansi": "^7.1.0", - "strip-json-comments": "^5.0.1", - "untildify": "^4.0.0", - "update-notifier": "^6.0.2" - }, - "bin": { - "ncu": "build/src/bin/cli.js", - "npm-check-updates": "build/src/bin/cli.js" + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=14.14" - } - }, - "node_modules/npm-check-updates/node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm-check-updates/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-check-updates/node_modules/chalk": { + "node_modules/ora/node_modules/chalk": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", @@ -8186,969 +6420,500 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/npm-check-updates/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "engines": { - "node": ">=14" - } - }, - "node_modules/npm-check-updates/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/p-limit": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.1.0.tgz", + "integrity": "sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "yocto-queue": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-check-updates/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/p-queue": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", + "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", "dependencies": { - "brace-expansion": "^2.0.1" + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-check-updates/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, + "node_modules/p-timeout": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", + "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", "engines": { - "node": ">=10" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", - "dependencies": { - "semver": "^7.1.1" - }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=6" } }, - "node_modules/npm-install-checks/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" + }, + "node_modules/parse-css-color": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/parse-css-color/-/parse-css-color-0.2.1.tgz", + "integrity": "sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==", + "dependencies": { + "color-name": "^1.1.4", + "hex-rgb": "^4.1.0" } }, - "node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "node_modules/parse-css-color/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dependencies": { - "lru-cache": "^7.5.1" + "entities": "^4.4.0" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/npm-package-arg/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/npm-package-arg/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/npm-packlist": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", - "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", - "dependencies": { - "ignore-walk": "^6.0.0" - }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/npm-pick-manifest": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", - "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" + "node": ">=16 || 14 >=14.18" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm-registry-fetch": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", - "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", - "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dependencies": { - "path-key": "^4.0.0" - }, + "node_modules/path-to-regexp": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==" + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "deprecated": "This package is no longer supported.", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, "dependencies": { - "boolbase": "^1.0.0" + "pinkie": "^2.0.0" }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "engines": { "node": ">= 6" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dependencies": { - "ee-first": "1.1.1" + "find-up": "^4.0.0" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" + "node": ">=8" } }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dependencies": { - "mimic-fn": "^4.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/openai": { - "version": "4.52.7", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.52.7.tgz", - "integrity": "sha512-dgxA6UZHary6NXUHEDj5TWt8ogv0+ibH+b4pT5RrWMjiRZVylNwLcw/2ubDrX5n0oUmHX/ZgudMJeemxzOvz7A==", - "dev": true, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7", - "web-streams-polyfill": "^3.2.1" + "p-locate": "^4.1.0" }, - "bin": { - "openai": "bin/cli" + "engines": { + "node": ">=8" } }, - "node_modules/ora": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", - "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=18" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "engines": { - "node": ">=12.20" + "node": ">=8" } }, - "node_modules/p-limit": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.1.0.tgz", - "integrity": "sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==", + "node_modules/playwright": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.0.tgz", + "integrity": "sha512-XYJ5WvfefWONh1uPAUAi0H2xXV5S3vrtcnXe6uAOgdGi3aSpqOSXX08IAjXW34xitfuOJsvXU5anXZxPSEQiJw==", "dependencies": { - "yocto-queue": "^1.1.1" + "playwright-core": "1.46.0" + }, + "bin": { + "playwright": "cli.js" }, "engines": { "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "fsevents": "2.3.2" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" + "node_modules/playwright-core": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.0.tgz", + "integrity": "sha512-9Y/d5UIwuJk8t3+lhmMSAJyNP1BUC/DqP3cQJDQQL/oWqAiuPTLgy7Q5dzglmTLwcBRdetzgNM/gni7ckfTr6A==", + "bin": { + "playwright-core": "cli.js" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "yocto-queue": "^0.1.0" + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^10 || ^12 || >=14" } }, - "node_modules/p-locate/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, "engines": { - "node": ">=10" + "node": ">=14.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.0.0" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", "dependencies": { - "aggregate-error": "^3.0.0" + "camelcase-css": "^2.0.1" }, "engines": { - "node": ">=10" + "node": "^12 || ^14 || >= 16" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" } }, - "node_modules/p-queue": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", - "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^6.1.2" + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" }, "engines": { - "node": ">=18" + "node": ">= 14" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/p-timeout": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", - "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, "engines": { - "node": ">=14.16" + "node": ">=12.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", + "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, - "node_modules/package-json/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { - "semver": "bin/semver.js" + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=10" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/pacote": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", - "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", - "dependencies": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^5.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" + "node_modules/preferred-pm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-4.0.0.tgz", + "integrity": "sha512-gYBeFTZLu055D8Vv3cSPox/0iTPtkzxpLroSYYA7WXgRi31WCJ51Uyl8ZiPeUUjyvs2MBzK+S8v9JVUgHU/Sqw==", + "dependencies": { + "find-up-simple": "^1.0.0", + "find-yarn-workspace-root2": "1.2.16", + "which-pm": "^3.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" - }, - "node_modules/parse-css-color": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/parse-css-color/-/parse-css-color-0.2.1.tgz", - "integrity": "sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==", - "dependencies": { - "color-name": "^1.1.4", - "hex-rgb": "^4.1.0" + "node": ">=18.12" } }, - "node_modules/parse-css-color/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/parse-github-url": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.3.tgz", - "integrity": "sha512-tfalY5/4SqGaV/GIGzWyHnFjlpTPTNpENR9Ea2lLldSJ8EWXMsvacWucqY3m3I4YPtas15IxTLQVQ5NSYXPrww==", + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, "bin": { - "parse-github-url": "cli.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse-latin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", - "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", - "dependencies": { - "@types/nlcst": "^2.0.0", - "@types/unist": "^3.0.0", - "nlcst-to-string": "^4.0.0", - "unist-util-modify-children": "^4.0.0", - "unist-util-visit-children": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, - "node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/playwright": { - "version": "1.45.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.45.2.tgz", - "integrity": "sha512-ReywF2t/0teRvNBpfIgh5e4wnrI/8Su8ssdo5XsQKpjxJj+jspm00jSoz9BTg91TT0c9HRjXO7LBNVrgYj9X0g==", - "dependencies": { - "playwright-core": "1.45.2" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.45.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.45.2.tgz", - "integrity": "sha512-ha175tAWb0dTK0X4orvBIqi3jGEt701SMxMhyujxNrgd8K0Uy5wMSwwcQHtyB4om7INUkfndx02XnQ2p6dvLDw==", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/playwright/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-nested/node_modules/postcss-selector-parser": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", - "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/preferred-pm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-4.0.0.tgz", - "integrity": "sha512-gYBeFTZLu055D8Vv3cSPox/0iTPtkzxpLroSYYA7WXgRi31WCJ51Uyl8ZiPeUUjyvs2MBzK+S8v9JVUgHU/Sqw==", - "dependencies": { - "find-up-simple": "^1.0.0", - "find-yarn-workspace-root2": "1.2.16", - "which-pm": "^3.0.0" - }, - "engines": { - "node": ">=18.12" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/prettier-plugin-astro": { @@ -9247,39 +7012,6 @@ "node": ">=6" } }, - "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -9292,18 +7024,6 @@ "node": ">= 6" } }, - "node_modules/prompts-ncu": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-3.0.0.tgz", - "integrity": "sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==", - "dependencies": { - "kleur": "^4.0.1", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/prompts/node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -9331,11 +7051,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" - }, "node_modules/punycode.js": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", @@ -9345,20 +7060,6 @@ "node": ">=6" } }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/queue": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", @@ -9386,17 +7087,6 @@ } ] }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -9405,44 +7095,6 @@ "node": ">= 0.6" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc-config-loader": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz", - "integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==", - "dependencies": { - "debug": "^4.3.4", - "js-yaml": "^4.1.0", - "json5": "^2.2.2", - "require-from-string": "^2.0.2" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -9538,134 +7190,20 @@ "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-package-json": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", - "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", - "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/read-package-json/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/read-package-json/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/read-package-json/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" + "pify": "^2.3.0" } }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { - "rc": "1.2.8" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.10.0" } }, "node_modules/rehype": { @@ -9818,22 +7356,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remote-git-tags": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remote-git-tags/-/remote-git-tags-3.0.0.tgz", - "integrity": "sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -9850,11 +7372,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -9864,20 +7381,6 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/restore-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", @@ -9977,14 +7480,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "engines": { - "node": ">= 4" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -9994,72 +7489,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.9.tgz", - "integrity": "sha512-3i7b8OcswU6CpU8Ej89quJD4O98id7TtVM5U4Mybh84zQXdrFmDLouWBEEaD/QfO3gDDfH+AGFCGsR7kngzQnA==", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "14 >=14.20 || 16 >=16.20 || >=18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/roadmap-renderer": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/roadmap-renderer/-/roadmap-renderer-1.0.6.tgz", @@ -10127,30 +7556,13 @@ "integrity": "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==", "dev": true }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "optional": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/sass-formatter": { "version": "0.7.9", @@ -10222,36 +7634,6 @@ "semver": "bin/semver.js" } }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-utils": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", - "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==" - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -10298,11 +7680,6 @@ "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==" }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -10378,11 +7755,11 @@ } }, "node_modules/shiki": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.10.3.tgz", - "integrity": "sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.13.0.tgz", + "integrity": "sha512-e0dWfnONbEv6xl7FJy3XIhsVHQ/65XHDZl92+6H9+4xWjfdo7pmkqG7Kg47KWtDiEtzM5Z+oEfb4vtRvoZ/X9w==", "dependencies": { - "@shikijs/core": "1.10.3", + "@shikijs/core": "1.13.0", "@types/hast": "^3.0.4" } }, @@ -10397,24 +7774,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/sigstore": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", - "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "@sigstore/sign": "^1.0.0", - "@sigstore/tuf": "^1.0.3", - "make-fetch-happen": "^11.0.1" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -10451,14 +7810,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, "node_modules/slugify": { "version": "1.6.6", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", @@ -10467,131 +7818,263 @@ "node": ">=8.0.0" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stream-replace-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", + "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==" + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">=8" + } + }, + "node_modules/string.prototype.codepointat": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", + "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==" + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "engines": { + "node": ">=12" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/spawn-please": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-2.0.2.tgz", - "integrity": "sha512-KM8coezO6ISQ89c1BzyWNtcn2V2kAVtwIXd3cN/V5a0xPYc1F/vydrRc01wsKFEQ/p+V1a4sw4z2yMITIXrgGw==", + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, "dependencies": { - "cross-spawn": "^7.0.3" + "escape-string-regexp": "^1.0.2" }, "engines": { - "node": ">=14" + "node": ">=0.10.0" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "balanced-match": "^1.0.0" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==" + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/ssri": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", - "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dependencies": { - "minipass": "^7.0.3" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ssri/node_modules/minipass": { + "node_modules/sucrase/node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", @@ -10599,186 +8082,183 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/suf-log": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/suf-log/-/suf-log-2.5.3.tgz", + "integrity": "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==", + "dev": true, + "dependencies": { + "s.color": "0.0.15" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/stream-replace-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", - "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" + "node_modules/tailwind-merge": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.4.0.tgz", + "integrity": "sha512-49AwoOQNKdqKPd9CViyH5wJoSKsCDjUlzL8DxuGp3P1FsGY36NJDAa18jLZcaHAUUuTj+JB8IAo8zWgBNvBF7A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" } }, - "node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "node_modules/tailwindcss": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz", + "integrity": "sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" }, - "engines": { - "node": ">=18" + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" + "node": ">=10.13.0" } }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/string.prototype.codepointat": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", - "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==" - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "node_modules/tailwindcss/node_modules/postcss-selector-parser": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", + "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=4" } }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "any-promise": "^1.0.0" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dependencies": { - "ansi-regex": "^5.0.1" + "thenify": ">= 3.1.0 < 4" }, "engines": { - "node": ">=8" + "node": ">=0.8" } }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "engines": { "node": ">=4" } }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0" } }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.6" } }, - "node_modules/strip-json-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", - "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", - "engines": { - "node": ">=14.16" - }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", "dev": true, "dependencies": { "escape-string-regexp": "^1.0.2" @@ -10787,380 +8267,476 @@ "node": ">=0.10.0" } }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "node_modules/tsconfck": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.1.tgz", + "integrity": "sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, "engines": { - "node": ">= 6" + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/tsx": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.17.0.tgz", + "integrity": "sha512-eN4mnDA5UMKDt4YZixo9tBioibaMBpoxBkD+rIPAjVmYERSG0/dWEY1CEFuV89CgASlKL499q8AhmkMnnjtOJg==", + "dev": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" }, "bin": { - "glob": "dist/esm/bin.mjs" + "tsx": "dist/cli.mjs" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", + "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=18" } }, - "node_modules/sucrase/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", + "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", + "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/suf-log": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/suf-log/-/suf-log-2.5.3.tgz", - "integrity": "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==", + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", + "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "s.color": "0.0.15" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", + "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", + "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/tailwind-merge": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.4.0.tgz", - "integrity": "sha512-49AwoOQNKdqKPd9CViyH5wJoSKsCDjUlzL8DxuGp3P1FsGY36NJDAa18jLZcaHAUUuTj+JB8IAo8zWgBNvBF7A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", + "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/tailwindcss": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.6.tgz", - "integrity": "sha512-1uRHzPB+Vzu57ocybfZ4jh5Q3SdlH7XW23J5sQoM9LhE9eIOlzxer/3XPSsycvih3rboRsvt0QCmzSrqyOYUIA==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", + "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/tailwindcss/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", + "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.13.0" + "node": ">=18" } }, - "node_modules/tailwindcss/node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", + "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", - "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", + "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", + "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", + "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", + "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", + "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", + "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.8" + "node": ">=18" } }, - "node_modules/tiny-inflate": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", - "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", + "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", + "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=8.0" + "node": ">=18" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", + "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=0.6" + "node": ">=18" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", + "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "node_modules/trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", + "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", + "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/tsconfck": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.1.tgz", - "integrity": "sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==", - "bin": { - "tsconfck": "bin/tsconfck.js" - }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", + "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^18 || >=20" - }, - "peerDependencies": { - "typescript": "^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=18" } }, - "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, - "node_modules/tsx": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.16.2.tgz", - "integrity": "sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==", + "node_modules/tsx/node_modules/esbuild": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", + "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", "dev": true, - "dependencies": { - "esbuild": "~0.21.5", - "get-tsconfig": "^4.7.5" - }, + "hasInstallScript": true, "bin": { - "tsx": "dist/cli.mjs" + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=18.0.0" + "node": ">=18" }, "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/tuf-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", - "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "@esbuild/aix-ppc64": "0.23.0", + "@esbuild/android-arm": "0.23.0", + "@esbuild/android-arm64": "0.23.0", + "@esbuild/android-x64": "0.23.0", + "@esbuild/darwin-arm64": "0.23.0", + "@esbuild/darwin-x64": "0.23.0", + "@esbuild/freebsd-arm64": "0.23.0", + "@esbuild/freebsd-x64": "0.23.0", + "@esbuild/linux-arm": "0.23.0", + "@esbuild/linux-arm64": "0.23.0", + "@esbuild/linux-ia32": "0.23.0", + "@esbuild/linux-loong64": "0.23.0", + "@esbuild/linux-mips64el": "0.23.0", + "@esbuild/linux-ppc64": "0.23.0", + "@esbuild/linux-riscv64": "0.23.0", + "@esbuild/linux-s390x": "0.23.0", + "@esbuild/linux-x64": "0.23.0", + "@esbuild/netbsd-x64": "0.23.0", + "@esbuild/openbsd-arm64": "0.23.0", + "@esbuild/openbsd-x64": "0.23.0", + "@esbuild/sunos-x64": "0.23.0", + "@esbuild/win32-arm64": "0.23.0", + "@esbuild/win32-ia32": "0.23.0", + "@esbuild/win32-x64": "0.23.0" + } + }, + "node_modules/turndown": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.0.tgz", + "integrity": "sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A==", "dependencies": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "@mixmark-io/domino": "^2.2.0" } }, "node_modules/tween-functions": { @@ -11179,14 +8755,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", @@ -11230,42 +8798,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/unist-util-find-after": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", @@ -11389,14 +8921,6 @@ "node": ">= 10.0.0" } }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "engines": { - "node": ">=8" - } - }, "node_modules/update-browserslist-db": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", @@ -11426,55 +8950,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/use-sync-external-store": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", @@ -11488,23 +8963,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/vfile": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", @@ -11546,12 +9004,12 @@ } }, "node_modules/vite": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", - "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.0.tgz", + "integrity": "sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==", "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.39", + "postcss": "^8.4.40", "rollup": "^4.13.0" }, "bin": { @@ -11571,6 +9029,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -11588,6 +9047,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -11621,15 +9083,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -11679,51 +9132,6 @@ "node": ">=4" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", @@ -11894,34 +9302,8 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, "node_modules/yallist": { "version": "3.1.1", @@ -11972,9 +9354,9 @@ } }, "node_modules/zod-to-json-schema": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.1.tgz", - "integrity": "sha512-oT9INvydob1XV0v1d2IadrR74rLtDInLvDFfAa1CG0Pmg/vxATk7I2gSelfj271mbzeM4Da0uuDQE/Nkj3DWNw==", + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.2.tgz", + "integrity": "sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==", "peerDependencies": { "zod": "^3.23.3" } diff --git a/src/data/guides/how-to-become-frontend-developer.md b/src/data/guides/how-to-become-frontend-developer.md new file mode 100644 index 000000000..d289608de --- /dev/null +++ b/src/data/guides/how-to-become-frontend-developer.md @@ -0,0 +1,306 @@ +--- +title: 'How to Become a Front-End Developer in 7 Steps' +description: 'Learn how to become a front-end developer in 7 clear steps. Start your coding journey with practical tips and resources today!' +authorId: kamran +excludedBySlug: '/frontend/how-to-become-frontend-developer' +seo: + title: 'How to become a Front-End Developer in 7 Steps' + description: 'Learn how to become a front-end developer in 7 clear steps. Start your coding journey with practical tips and resources today!' + ogImageUrl: 'https://assets.roadmap.sh/guest/how-to-become-frontend-developer-i23nx.jpg' +isNew: true +type: 'textual' +date: 2024-08-15 +sitemap: + priority: 0.7 + changefreq: 'weekly' +tags: + - 'guide' + - 'textual-guide' + - 'guide-sitemap' +--- + +![How to become a frontend developer.](https://assets.roadmap.sh/guest/how-to-become-frontend-developer-i23nx.jpg) + +Front-end developers **(also referred to as front-end engineers or client-side developers)** create the user interface (UI) and user experience (UX) of web pages and web applications. Using HTML, CSS, and JavaScript, they transform static designs into functional web pages. They create interactive and visual elements that users interact with directly, including buttons, forms, and navigation menus. + +[Front-end developers](https://roadmap.sh/frontend) are a crucial part of any team. They ensure that websites are user-friendly, load fast, and rank high on search engines. So, companies seek skilled front-end developers who can create dynamic and responsive websites. + +However, becoming a front-end developer isn't just about jumping straight into coding. It's a deliberate process that involves following specific steps. + +**TL;DR**: Become a front-end developer in 7 steps: + +- **Step 1**: Learn web development fundamentals. +- **Step 2**: Practice building projects. +- **Step 3**: Learn the version control systems and the command line. +- **Step 4**: Learn front-end frameworks and libraries. +- **Step 5**: Study the accessibility and responsive design principles +- **Step 6:** Join online communities and attend events. +- **Step 7**: Build a portfolio and apply for jobs. + +The above steps will give you the skills to become a proficient front-end developer. This guide will provide a deep dive into the steps and benefits of working in a front-end position. + +## Benefits of pursuing a career in front-end development + +The job market requires skilled professionals to create dynamic websites and web applications. This demand makes front-end development a role filled with numerous career opportunities. + +Some of the benefits of pursuing a career in front-end development include: + +- High demand and employment stability. +- Flexible career. +- Competitive earning potential. + +### High demand and employment stability + +Front-end development is a highly sought-after skill set in the tech industry. The demand isn't limited to a particular sector; it extends to healthcare, e-commerce, gaming, etc., making it a lucrative career choice. + +![Job Outlook for Front-End Developers](https://assets.roadmap.sh/guest/job-outlook-frontend-engineer-tvm05.jpeg) + +[BLS (Bureau of Labor Statistics)](https://www.bls.gov/ooh/computer-and-information-technology/web-developers.htm) projects a 16% increase in web developer jobs from 2022 to 2032. This rate exceeds the average for all other jobs by a significant margin. So, there will always be a need for front-end developers, which means job security and a steady career path. + +### Flexible career + +The front-end development field offers many benefits, one of which is flexibility. You can work as a freelancer, remotely, or in a hybrid role – whatever works best for you! Or, if you prefer, you can go with a more traditional office setup. This flexibility gives you the power to: + +- Work from anywhere on the planet as long as you can access the Internet. +- Find projects and clients that align with your interests and goals. +- Connect with global teams and build your professional network. + +### Competitive earning potential + +Front-end development provides a financially rewarding career path with competitive salaries. As per Glassdoor, front-end developers make an average salary of $85,432 in the United States. + +![Frontend Developer Salary](https://assets.roadmap.sh/guest/frontend-engineer-salary-smqar.PNG) + +However, how much you earn can depend on your experience, the size of the company, and where you're looking for a job. + +## Become a front-end developer in 7 steps +![How to become a frontend developer in 7 steps](https://assets.roadmap.sh/guest/how-to-become-frontend-developer-in-7-steps-2gigl.jpeg) + +The number of online resources available to learn front-end development can be overwhelming. It's hard for aspiring front-end developers to know where to start. However, roadmap.sh provides a clear step-by-step [front-end roadmap](https://roadmap.sh/frontend) to help you learn. + +The guide breaks it down so you don't have to guess and gives you all you need to learn front-end development. The steps below present a concise version of the front-end roadmap. + +### Step 1: Learn web development fundamentals + +![Web development fundamentals](https://assets.roadmap.sh/guest/learn-web-fundementals-bg7c8.jpeg) + +The first step toward becoming a front-end developer is to learn the fundamentals. These are the foundations for everything you create on the web. + +It involves learning: + +- **HTML (Hyper Text Markup Language)**: For structuring the content on a webpage. HTML is the blueprint or skeletal structure of a website. It defines the different elements of websites, like headings, paragraphs, and images. +- **CSS (Cascading Style Sheets):** For styling the content on a webpage. It is a styling language that controls the layout and appearance of HTML-based web pages. With CSS, you can add colors, fonts, and more to your web pages. +- **JavaScript**: [JavaScript](https://roadmap.sh/javascript) adds interactivity and functionality to web pages. It is a programming language that makes HTML and CSS static websites functional. Thanks to JavaScript, web pages can respond to user actions. For example, you can achieve your desired outcome when you click a button or submit a form on a website. + +Building beautiful websites and applications begins with learning HTML, CSS, and JavaScript. It gives you many job options in web development and lets you create your own website! + +### Step 2: Practice building projects + +Coding is like playing video games: you have to put in a lot of practice to become proficient. So, don't just watch or read tutorials about coding concepts daily–apply them! It will improve your programming skills. If all you do is learn without practicing, you will be an expert in theory but an amateur in practice. + +Write code regularly and work on building projects, no matter how small. Follow a learning, practicing, and repetition cycle to enhance your skills. As you work on small projects, you'll gain experience with HTML, CSS, and JavaScript. + +Some ways to practice building projects include: + +- **Personal projects**: Build projects that address a problem or individual needs. These include tribute pages, calculators, or to-do list applications. +- Join a technical team or find a coding partner to work on a project together. +- **Project work**: Work on a client project or contribute to open-source projects on GitHub. It will allow you to learn from others, contribute to existing code, and connect with new people. +- **Code challenges**: Participate in code challenges on platforms like [HackerRank](https://www.hackerrank.com/) and [LeetCode](https://leetcode.com/). These sites provide various exercises for practicing [front-end and building websites](https://cesscode.hashnode.dev/resources-to-help-you-practice-web-development). + +As you practice coding consistently, you will face a lot of issues. The more problems you solve, the better you become. + +### Step 3: Learn the version control systems and the command line. + +As a front-end developer, learning version control systems **(VCS)** and the command line is vital. They make it easier for you to: + +- Track and manage source code modifications. +- Work with others on the same project. +- Streamline your workflow and automate tasks. + +![Version control systems](https://assets.roadmap.sh/guest/version-control-systems-qwtx6.jpeg) + +Examples of version control systems include Git **(e.g., GitHub, GitLab, Bitbucket).** Git enables you to: + +- Create and manage repositories +- Create branches and merge code +- Commit changes and track source code revisions + +When you become skilled at using Git, you'll work and deploy projects faster. This documentation provides a detailed guide to help you learn everything you need to know about [Git](https://github.com/git-guides). + +### Step 4: Learn front-end frameworks and libraries + +Learning front-end frameworks and libraries is essential for a front-end developer. It will make your job easier and help you build faster websites and applications. + +![Front-end frameworks and libraries](https://assets.roadmap.sh/guest/frontend-frameworks-and-libraries-8vplh.jpeg) + +Examples of front-end development frameworks and libraries include: + +- **CSS libraries**: CSS libraries are pre-designed CSS templates for styling websites and applications. They provide ready-made design solutions, such as responsive layouts and button styling. Examples of CSS libraries are Bootstrap and TailwindCSS. They help you to work faster, keep your design consistent, and not write too much CSS code from scratch. +- **JavaScript frameworks:** JavaScript frameworks are more extensive collections of code. They are building blocks for creating web applications and providing structure and functionality. Their pre-defined structure quickens development for creating complex web applications. Popular JavaScript frameworks include [Angular](https://roadmap.sh/angular) and [Vue.js](https://roadmap.sh/vue). +- **JavaScript libraries:** JavaScript libraries are similar to CSS libraries. Examples of JavaScript libraries are Chart.js and [React](https://roadmap.sh/react). They offer pre-built functions for performing tasks like DOM manipulation and event handling. + +Before learning a front-end framework or library, ensure you understand HTML, CSS, and JavaScript. It will give you an in-depth understanding of how frameworks and libraries work. + +### Step 5: Study the accessibility and responsive design principles + +Becoming an expert frontend developer requires understanding accessibility and responsive design principles. These principles ensure that everyone can use your website and that it looks good on all devices. + +Responsive design involves creating websites that are: + +- Adaptable to several screen sizes and devices, e.g., laptops, tablets, and smartphones. +- Able to deliver the best possible user experience on various devices. + +Accessible design involves creating websites that are: + +- Usable by a wide range of users, including users with disabilities. +- Following guidelines and standards of accessibility. + +Understanding these principles demonstrates your commitment to best practices for front-end development. As a result, you become a better front-end developer and more job-ready. + +### Step 6: Join developer communities and attend events + +Attending developer events and joining a community is essential for aspiring front-end developers. The best part? You can join in from your work desk **(online)** or look for events nearby **(offline)** that work with your plans. These include conferences, meet-ups, and online forums like the [roadmap community.](https://discord.com/invite/cJpEt5Qbwa) + +By joining a developer community and attending tech events, you'll: + +- Become part of a supportive community. +- Get access to resources and tools that can help simplify your development process. +- Participate in workshops and sessions that will expand your skills. +- Connect with colleagues to learn about new opportunities. + +### Step 7: Build a portfolio and apply for jobs + +The final step in becoming a front-end developer is to build an online portfolio and apply for jobs. Portfolios are visual representations of your skills, and they should include: + +- Real-world projects that showcase your skills in HTML, CSS, JavaScript, React and more. These projects could include anything from basic websites to complex web applications. However, it's advisable to include complex projects like an e-commerce application. +- Open source contributions code. +- Code examples to demonstrate your problem-solving skills. + +Once you've built a solid portfolio, it's time to apply for a front-end developer job. This process includes writing a cover letter and resume and preparing for interviews. This roadmap.sh guide will help you prepare for these interviews: [Top](https://roadmap.sh/questions/frontend) [Front End Developer Interview Questions](https://roadmap.sh/questions/frontend). + +But remember, front-end development is a continuous learning process. So, it's essential to keep learning during and after a job search to keep up with new tools and trends. + +## Responsibilities of a front-end developer + +Now that you've taken the steps to become a front-end developer, it's time to dive into the heart of the role. + +![Responsibilities of a front-end developer](https://assets.roadmap.sh/guest/responsibilites-of-frontend-developer-r6k0m.jpeg) + +Creating an effective website involves managing various responsibilities as a front-end developer, such as: + +- Collaboration with other teams. +- Building user interfaces. +- Responsiveness and cross-browser compatibility. +- Implementing website functionality and interactivity. + +### Collaboration with other teams + +![Collaboration with other teams](https://assets.roadmap.sh/guest/collaboration-with-other-teams-04way.jpeg) + +Front-end development is usually not done alone. It is a team effort! It involves everyone working together and communicating well to ensure a successful project. As a front-end developer, you will work with several teams, such as: + +- **Back-end developers**: [Back-end developers](https://roadmap.sh/backend) build the server side of websites and web applications. They handle many functionalities you don't see on a website or web application. These functionalities include developing APIs **(application program interfaces)** and managing server-side logic. Front-end and back-end developers collaborate to create a functional and secure website. +- **UI designers**: UI designers create the visual elements of websites and applications. They design the color scheme, layout, and interactive elements like buttons. Front-end developers collaborate with UI designers to understand the design requirements. They use their technical skills to turn these designs into functional, interactive websites. + +### Building user interfaces + +The responsibility of creating user interfaces (UIs) falls to front-end developers. Building UIs begins after the front-end developer understands the design requirements. It involves transforming design concepts into functional and interactive websites. + +The processes involved in building UIs include: + +- Writing clean, maintainable, and efficient code. +- **Accessibility and performance optimization**: Front-end developers must prioritize accessibility. All users, including users with disabilities, must be able to access the UI. They must consider color contrast, keyboard navigation, and other accessibility features. Also, they should optimize performance by using lazy loading methods for fast-load times. +- **Testing and iteration.** Testing the UI for bugs and usability issues is essential. It ensures the interface is easy to use and meets the desired quality. + +### Responsiveness and cross-browser compatibility + +Front-end developers are responsible for ensuring project responsiveness and cross-browser compatibility. It often takes place when building user interfaces. + +This process involves building a website and web application that: + +- Adjust to various devices and screen sizes **(responsive web design)**. +- Function consistently in different web browsers, like Chrome and Firefox **(cross-browser compatibility)**. + +### Implementing website functionality and interactivity + +Front-end developers are responsible for implementing website functionality and interactivity. This step often follows the designer's completion of the user interface layout. The process involves making user-friendly UIs that boost user experience and engagement. + +It involves several steps, like: + +- Writing JavaScript code to create interactive features. These interactive features include: + - Form validation - To check if the web user fills the form fields correctly. + - Interactive elements like image sliders, clickable buttons, and dropdown menus. + +- Using CSS animations or JavaScript transitions for interactive responses. These transitions and animations include: + - Smooth scrolling animations for a better browsing experience. + - Animated dropdown menus for easy-to-use web navigation. + +## Frequently asked questions (FAQ): Becoming a front-end developer +![Frequently asked questions: Becoming a front-end developer](https://assets.roadmap.sh/guest/frontend-developer-faqs-zhhns.jpeg) + +The process of becoming a front-end developer may pose some questions to you. The following are some answers to common questions to get you started: + +### Do I need any prior knowledge to start learning front-end development? + +No, learning front-end development does not require any prior knowledge. But it's good to have a basic idea of how computers and the internet work. [roadmap.sh](http://roadmap.sh) provides a clear step-by-step [front-end roadmap](https://roadmap.sh/frontend) to help you get started. + +### Is a degree in Computer Science necessary to become a front-end developer? + +Nope, you don't need a Computer Science degree. Many front-end developers are self-taught and have learned through online resources. An impressive portfolio is the key to demonstrating your front-end development skills. + +### Which languages should I study to learn front-end development? + +The following are the main coding languages used in front-end development: + +- **HTML (Hypertext Markup Language)**: For structuring the content on a webpage. +- **CSS (Cascading Style Sheets)**: For styling the content on a webpage. +- **JavaScript**: for adding interactivity and functionality to web pages + +### How skilled in these coding languages must I be to land my first job? + +To secure your first job as a front-end developer, you must be proficient in HTML, CSS, and JavaScript. It will allow you to create a portfolio site that shows your coding skills to employers. + +### Is HTML, CSS, and JavaScript enough for a front-end developer? + +HTML, CSS, and JavaScript are fundamental knowledge for any front-end developer. However, knowledge of frameworks and libraries like React is also essential. + +### Which skills are vital for a professional front-end developer? + +The following are some of the essential front-end developer skills: + +- Solid understanding of core web development technologies, e.g., HTML, CSS, and JavaScript. +- Proficient in using version control systems, e.g., Git. +- Practical experience with front-end frameworks and libraries such as React and TailwindCSS. +- **Soft skills**: Communication, problem-solving, and collaboration skills. + +### How long does it take to become a frontend developer? + +How long it takes to become a front-end developer depends on how much time you spend learning. But if you are consistent, you can master the basics in a couple of months and more advanced skills in a year or two. + +### Is it possible for me to become a frontend developer on my own? + +Yes, you can learn how to become a frontend developer by using online resources. + +### Can I learn front-end development in 2 months? + +You can pick up the basics of frontend development in 2 months. However, getting really good at it takes more time. + +### What is the difference between a frontend developer and a back-end developer? + +Frontend developer develops user interfaces and user experiences for web applications and websites. They use coding languages like HTML, CSS, and JavaScript to create visual elements you can see and directly interact with on your phone. Examples of these visual elements include Buttons, forms, and text. + +Backend developers create the invisible elements on a web page, like database structures and queries. They create the back-end logic that keeps the website running smoothly using programming languages like Python and Java. + +### Who is a full-stack developer? + +A full-stack developer specializes in both frontend and backend development. + +### Does a front-end developer need to know backend development? + +Though it is not required, having a grasp of the basics of backend development can be helpful. It makes it easier to work with backend developers and better understand how the web works. + +## What next? + +To become a front-end developer, you need a mix of skills, dedication, and the right guidance. If you follow the steps in this guide, you'll be on track to kickstart an excellent front-end career. Stay on track with a personalized learning plan available on roadmap.sh. + +roadmap.sh will keep you focused and help you reach your maximum potential as a front-end developer. It has numerous resources that will help you learn front-end and web development. To get started, sign up, create a [front-end roadmap plan](https://roadmap.sh/frontend), and begin studying. You can also share the roadmap with your study buddies. \ No newline at end of file diff --git a/src/pages/frontend/how-to-become-frontend-developer.astro b/src/pages/frontend/how-to-become-frontend-developer.astro new file mode 100644 index 000000000..5a2f32954 --- /dev/null +++ b/src/pages/frontend/how-to-become-frontend-developer.astro @@ -0,0 +1,31 @@ +--- +import GuideContent from '../../components/Guide/GuideContent.astro'; +import GuideHeader from '../../components/GuideHeader.astro'; +import BaseLayout from '../../layouts/BaseLayout.astro'; +import { getGuideById } from '../../lib/guide'; +import { getOpenGraphImageUrl } from '../../lib/open-graph'; +import { replaceVariables } from '../../lib/markdown'; + +const guideId = 'how-to-become-frontend-developer'; +const guide = await getGuideById(guideId); + +const { frontmatter: guideData } = guide!; + +const ogImageUrl = + guideData.seo.ogImageUrl || + getOpenGraphImageUrl({ + group: 'guide', + resourceId: guideId, + }); +--- + + + + + From 0d5355018ba5e963ef1872ba4e8f24e105430ce3 Mon Sep 17 00:00:00 2001 From: Stavros Siamantas Date: Fri, 16 Aug 2024 10:14:10 +0300 Subject: [PATCH 005/120] Add content to git/github roadmap (up to git-worktree) (#6587) * Add content to git/github roadmap (up to git-worktree) * Apply suggestions from code review add links to topics with no links. --------- Co-authored-by: dsh --- .../content/--hard@V_joZNpQsS9G9PI-o-GmC.md | 8 ++++++- .../content/--mixed@qis7Z5VRxMcOmbesQlegZ.md | 6 ++++- .../content/--soft@Uc7FyfAKpDFRGRNHwztFo.md | 6 ++++- .../adding--updating@x4bnsPVTiX2xOCSyrgWpF.md | 9 +++++++- .../automations@TNBz5755PhI6iKxTQTqcS.md | 9 +++++++- .../between-branches@O-zoAWkDvyn7B8_TmY257.md | 7 +++++- .../between-commits@Rwpeltygwzcf6hnuZNURE.md | 7 +++++- .../branch-naming@ks1Pip-RM-UWD6zuF2j4n.md | 9 +++++++- .../branching-basics@bXfCUG3h1TIFPgD4WUDph.md | 9 +++++++- ...hing-dependencies@HMNhzzV6ApTKj4I_FOmUB.md | 14 +++++++++++- .../checkout-branch@PtRo-wGiNAagZ6CykfvMr.md | 2 +- .../checkout-tags@62E1tDMXB6K74OEN0WsS0.md | 2 +- ...y-picking-commits@eFf2fesrs-1aVM5tH3ORQ.md | 2 +- ...clean-git-history@i3AbARgzQtxtlB-1AS8zv.md | 2 +- ...t-vs-server-hooks@zsU6R2zvJKnYNU2ac4o4p.md | 4 ++-- ...ning-repositories@1Koej79yTv-OAswVZwgGq.md | 4 ++-- .../code-reviews@xLB2fhsOm0Vu3xg_PusJB.md | 3 +-- ...oration-on-github@d_GNnB6PBINz1jxGNWAE-.md | 4 ++-- .../collaboration@bXfCUG3h1TIFPgD4WUDph.md | 2 +- ...borators--members@_ft-uvXt6s_xrcMT3fbSF.md | 7 +++++- .../collaborators@r-u1vTpUyuvsB0revOU0C.md | 5 ++--- .../commit-messages@7lRUYWNSpHvJ-QyIE8RMa.md | 2 +- .../commit-msg@jzYjHx-gIKSP8dQUTqWVw.md | 9 +++++++- ...ommitting-changes@2_z3R7seCvQVj-Na4H1SV.md | 6 ++--- ...bution-guidelines@pJ-najh7dXhhYA_0bDiR5.md | 4 ++-- .../creating-account@i7fIIHcBEk473te8bniJ5.md | 5 ++--- .../creating-branch@OegitQ5Ngjvd3ZfMpfrkM.md | 4 ++-- ...ting-repositories@c_FO6xMixrrMo6iisfsvl.md | 4 ++-- .../deleting-branch@1uDenoQ6zu7CT69FR2iQB.md | 4 ++-- .../detached-head@0cLf7FiI9CX--UX45sm2f.md | 9 +++++++- .../documentation@D2WIExwfSnkAPIa5O-Hp5.md | 17 +++++++++++++- ...forward-vs-non-ff@agtPWS8j6i6wQPk10cy8E.md | 4 ++-- ...tch-without-merge@Gybnekbd1rJKTOf4hJ4Sh.md | 10 ++++++++- ...orking-vs-cloning@l1Wf7Pe_ah8ycCgslfSK4.md | 2 +- .../git-attributes@CGj_UX5JMOOCKinedsNRc.md | 10 ++++++++- .../git-bisect@ExXuwTQSI_lg4SRGW3Iu1.md | 10 ++++++++- ...it-commit---amend@NjPnEXLf1Lt9qzgxccogv.md | 10 ++++++++- .../git-config@NMCWgzhhfUvFOMO5GbF_u.md | 2 +- .../git-hooks@pqBV7BMAs0z6qpfZeW2XP.md | 15 ++++++++++++- .../content/git-init@1iOkbO5juk2LO-WZHx_W6.md | 4 ++-- .../content/git-lfs@zdunaucVe8J1tKf_z-NQo.md | 9 +++++++- .../git-log-options@qFEonbCMLri8iA0yONwuf.md | 22 ++++++++++++++++++- .../git-patch@sFf1PdFfmEdQxsEntfeFq.md | 9 +++++++- .../git-push---force@OQOmxg9mCfcjt80hpvXkA.md | 9 +++++++- .../git-rebase@HMEfUFNu_Wp_Pac7VWHr-.md | 4 ++-- .../git-reflog@hru0sL1-D4bJSQI1efEyU.md | 4 ++-- .../git-remotes@aWx9WHUrgofcTr8B-fQYe.md | 9 +++++++- .../git-reset@igrR7LguU1jemg_mf_AD6.md | 9 +++++++- .../git-revert@dLr55Om7IOvI53c1DgTKc.md | 15 ++++++++++++- .../git-stash-basics@X9K3PBpGsMoXkJsKdJPI7.md | 15 ++++++++++++- .../git-vs-other-vcs@_jSTrYN9G8EsGHkbusKPU.md | 13 ++++++++++- .../git-worktree@4dxVN81rXWn6VZqK99yq0.md | 9 +++++++- .../staged-changes@mzjtCdpke1ayHcEuS-YUS.md | 4 +++- .../unstaged-changes@uxqJzQFRcALqatNRIWR0w.md | 7 +++++- 54 files changed, 318 insertions(+), 72 deletions(-) diff --git a/src/data/roadmaps/git-github/content/--hard@V_joZNpQsS9G9PI-o-GmC.md b/src/data/roadmaps/git-github/content/--hard@V_joZNpQsS9G9PI-o-GmC.md index c53f6d395..e0750509f 100644 --- a/src/data/roadmaps/git-github/content/--hard@V_joZNpQsS9G9PI-o-GmC.md +++ b/src/data/roadmaps/git-github/content/--hard@V_joZNpQsS9G9PI-o-GmC.md @@ -1 +1,7 @@ -# --hard \ No newline at end of file +# --hard + +With this option, both the HEAD pointer and the working directory's contents are updated to match the specified commit. Any changes made since then will be lost. + +Visit the following resources to learn more: + +- [@official@--hard documentation](https://git-scm.com/docs/git-reset#Documentation/git-reset.txt---hard) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/--mixed@qis7Z5VRxMcOmbesQlegZ.md b/src/data/roadmaps/git-github/content/--mixed@qis7Z5VRxMcOmbesQlegZ.md index 9d95d2ae8..d0d7f10db 100644 --- a/src/data/roadmaps/git-github/content/--mixed@qis7Z5VRxMcOmbesQlegZ.md +++ b/src/data/roadmaps/git-github/content/--mixed@qis7Z5VRxMcOmbesQlegZ.md @@ -1 +1,5 @@ -# --mixed \ No newline at end of file +# --mixed + +When using mixed mode, the HEAD pointer is moved to the specified commit. However, files in your working directory remain as they were before the reset. The staging area (index) is updated to match the specified commit. + +- [@official@--mixed documentation](https://git-scm.com/docs/git-reset#Documentation/git-reset.txt---hard) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/--soft@Uc7FyfAKpDFRGRNHwztFo.md b/src/data/roadmaps/git-github/content/--soft@Uc7FyfAKpDFRGRNHwztFo.md index 5d89cb133..58ee556f0 100644 --- a/src/data/roadmaps/git-github/content/--soft@Uc7FyfAKpDFRGRNHwztFo.md +++ b/src/data/roadmaps/git-github/content/--soft@Uc7FyfAKpDFRGRNHwztFo.md @@ -1 +1,5 @@ -# --soft \ No newline at end of file +# --soft + +In this mode, only the HEAD pointer is moved to the specified commit. The files in your working directory are not modified, but they remain as they were when you started the reset. + +- [@official@--soft documentation](https://git-scm.com/docs/git-reset#Documentation/git-reset.txt---hard) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/adding--updating@x4bnsPVTiX2xOCSyrgWpF.md b/src/data/roadmaps/git-github/content/adding--updating@x4bnsPVTiX2xOCSyrgWpF.md index 8778b8d2e..a5329769f 100644 --- a/src/data/roadmaps/git-github/content/adding--updating@x4bnsPVTiX2xOCSyrgWpF.md +++ b/src/data/roadmaps/git-github/content/adding--updating@x4bnsPVTiX2xOCSyrgWpF.md @@ -1 +1,8 @@ -# Adding / Updating \ No newline at end of file +# Adding / Updating + +To add a submodule to a repository, use `git submodule add https://github.com/user/submodule-repo.git`, which is the typical format for specifying the URL of the submodule repository. This creates a new folder for the submodule and checks it out at the specified revision. To update an existing submodule to its latest commit, run `git submodule update`. If you want to pull in changes from upstream while keeping your submodule's history intact, use `git submodule sync` followed by `git submodule update`. + +Visit the following resources to learn more: + +- [@article@Git submodules](https://www.atlassian.com/git/tutorials/git-submodule) +- [@article@Working with submodules](https://github.blog/open-source/git/working-with-submodules/) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/automations@TNBz5755PhI6iKxTQTqcS.md b/src/data/roadmaps/git-github/content/automations@TNBz5755PhI6iKxTQTqcS.md index 2d389b8e7..d944a2c62 100644 --- a/src/data/roadmaps/git-github/content/automations@TNBz5755PhI6iKxTQTqcS.md +++ b/src/data/roadmaps/git-github/content/automations@TNBz5755PhI6iKxTQTqcS.md @@ -1 +1,8 @@ -# Automations \ No newline at end of file +# Automations + +To add automation to your GitHub project, use built-in workflows that can trigger actions such as setting fields on item changes or archiving items meeting specific criteria, and also configure automatic item addition from repositories based on matching criteria. + +Visit the following resources to learn more: + +- [@official@Automating your project](https://docs.github.com/en/issues/planning-and-tracking-with-projects/automating-your-project) +- [@video@GitHub Project Management - Create GitHub Project Board & Automations](https://www.youtube.com/watch?v=oPQgFxHcjAw&t=600s) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/between-branches@O-zoAWkDvyn7B8_TmY257.md b/src/data/roadmaps/git-github/content/between-branches@O-zoAWkDvyn7B8_TmY257.md index c18b4787f..15b35a3aa 100644 --- a/src/data/roadmaps/git-github/content/between-branches@O-zoAWkDvyn7B8_TmY257.md +++ b/src/data/roadmaps/git-github/content/between-branches@O-zoAWkDvyn7B8_TmY257.md @@ -1 +1,6 @@ -# Between Branches \ No newline at end of file +# Between Branches + +When comparing the differences between two branches, such as a feature branch and its upstream parent branch, use `git diff ..`. This command displays the changes made on the feature branch relative to the parent branch. It's useful for reviewing the impact of new features or changes before merging them into your mainline. + +- [@article@How to compare branches in Git diff](https://scribehow.com/shared/How_to_Compare_Branches_in_GitHub__xsotezV-S1O-GL0PquqJwQ) +- [@article@How can I see the differences between two branches?](https://stackoverflow.com/questions/9834689/how-can-i-see-the-differences-between-two-branches) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/between-commits@Rwpeltygwzcf6hnuZNURE.md b/src/data/roadmaps/git-github/content/between-commits@Rwpeltygwzcf6hnuZNURE.md index 0f8b18565..30f34c837 100644 --- a/src/data/roadmaps/git-github/content/between-commits@Rwpeltygwzcf6hnuZNURE.md +++ b/src/data/roadmaps/git-github/content/between-commits@Rwpeltygwzcf6hnuZNURE.md @@ -1 +1,6 @@ -# Between Commits \ No newline at end of file +# Between Commits + +To compare two specific commits in your Git history, use git diff followed by the hashes of the commits. This will show you the changes made between those two points, including added, modified, and deleted lines. + +- [@article@Comparing changes with Git diff](https://refine.dev/blog/git-diff-command/) +- [@video@Git Diff 2 Different Commits, Tags or Branches](https://www.youtube.com/watch?v=uq5VWPDCtFo) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/branch-naming@ks1Pip-RM-UWD6zuF2j4n.md b/src/data/roadmaps/git-github/content/branch-naming@ks1Pip-RM-UWD6zuF2j4n.md index 2abb36153..4ba9e5638 100644 --- a/src/data/roadmaps/git-github/content/branch-naming@ks1Pip-RM-UWD6zuF2j4n.md +++ b/src/data/roadmaps/git-github/content/branch-naming@ks1Pip-RM-UWD6zuF2j4n.md @@ -1 +1,8 @@ -# Branch Naming \ No newline at end of file +# Branch Naming + +A well-defined branch naming convention is essential for maintaining a clean and organized Git workflow. It's recommended to use descriptive and meaningful names that clearly indicate the purpose of each branch. For example, using prefixes like `feature/`, `fix/`, or `docs/` can help identify whether a branch is related to new feature development, bug fixes, or documentation updates. Additionally, including the issue or task ID (e.g., `issue/123`) can provide context and make it easier for team members to find relevant information. By following a consistent naming convention, you can improve collaboration, reduce confusion, and increase the overall efficiency of your Git workflow. + +Visit the following resources to learn more: + +- [@article@Naming conventions for Git Branches — a Cheatsheet](https://medium.com/@abhay.pixolo/naming-conventions-for-git-branches-a-cheatsheet-8549feca2534) +- [@article@Git Branching Naming Convention: Best Practices to Follow](https://phoenixnap.com/kb/git-branch-name-convention) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/branching-basics@bXfCUG3h1TIFPgD4WUDph.md b/src/data/roadmaps/git-github/content/branching-basics@bXfCUG3h1TIFPgD4WUDph.md index aaf4ecc8a..d1fda79f9 100644 --- a/src/data/roadmaps/git-github/content/branching-basics@bXfCUG3h1TIFPgD4WUDph.md +++ b/src/data/roadmaps/git-github/content/branching-basics@bXfCUG3h1TIFPgD4WUDph.md @@ -1 +1,8 @@ -# Branching Basics \ No newline at end of file +# Branching Basics + +Branches in Git serve as separate lines of development that allow multiple features or changes to be worked on simultaneously without affecting the main codebase. With branches, you can create isolated environments for different tasks, collaborate with others, and manage complex workflows. + +Visit the following resources to learn more: + +- [@official@Git Branching - Basic Branching and Merging](https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging) +- [@video@Git Branches Tutorial](https://www.youtube.com/watch?v=e2IbNHi4uCI) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/caching-dependencies@HMNhzzV6ApTKj4I_FOmUB.md b/src/data/roadmaps/git-github/content/caching-dependencies@HMNhzzV6ApTKj4I_FOmUB.md index 32922bd2d..3ba65d469 100644 --- a/src/data/roadmaps/git-github/content/caching-dependencies@HMNhzzV6ApTKj4I_FOmUB.md +++ b/src/data/roadmaps/git-github/content/caching-dependencies@HMNhzzV6ApTKj4I_FOmUB.md @@ -1 +1,13 @@ -# Caching Dependencies \ No newline at end of file +# Caching Dependencies + +GitHub Actions provides a caching feature that allows you to store and reuse dependencies between workflows, reducing the time it takes to run your actions. By caching dependencies, you can: +- Reuse compiled code +- Store database connections +- Reduce network traffic + +It is highly recommended to not store any sensitive information in the cache. For example, sensitive information can include access tokens or login credentials stored in a file in the cache path. + +Visit the following resources to learn more: + +- [@official@Caching dependencies to speed up workflows](https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/caching-dependencies-to-speed-up-workflows) +- [@video@Cache Management with GitHub actions](https://www.youtube.com/watch?v=7PVUjRXUY0o) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/checkout-branch@PtRo-wGiNAagZ6CykfvMr.md b/src/data/roadmaps/git-github/content/checkout-branch@PtRo-wGiNAagZ6CykfvMr.md index 4c36dafd4..9272fd458 100644 --- a/src/data/roadmaps/git-github/content/checkout-branch@PtRo-wGiNAagZ6CykfvMr.md +++ b/src/data/roadmaps/git-github/content/checkout-branch@PtRo-wGiNAagZ6CykfvMr.md @@ -2,7 +2,7 @@ In Git, to "checkout" from a branch means to switch your working directory to that branch, making it the active branch. This updates your files to match the state of that branch and allows you to work on it. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@git-checkout](https://git-scm.com/docs/git-checkout) - [@article@git-commands-checkout](https://www.git-tower.com/learn/git/commands/git-checkout) diff --git a/src/data/roadmaps/git-github/content/checkout-tags@62E1tDMXB6K74OEN0WsS0.md b/src/data/roadmaps/git-github/content/checkout-tags@62E1tDMXB6K74OEN0WsS0.md index 3c6c1fc92..fbabdf30a 100644 --- a/src/data/roadmaps/git-github/content/checkout-tags@62E1tDMXB6K74OEN0WsS0.md +++ b/src/data/roadmaps/git-github/content/checkout-tags@62E1tDMXB6K74OEN0WsS0.md @@ -2,7 +2,7 @@ Tags in Git are typically used to mark specific points in history, such as a release version. Checking out a tag means switching your working directory to the state of the repository at the point in time when that tag was created. -Learn more from the following resources: +Visit the following resources to learn more: - [@article@How To Checkout Git Tags](https://devconnected.com/how-to-checkout-git-tags/) - [@article@What is git tag, How to create tags & How to checkout git remote tag(s)](https://stackoverflow.com/questions/35979642/what-is-git-tag-how-to-create-tags-how-to-checkout-git-remote-tags) diff --git a/src/data/roadmaps/git-github/content/cherry-picking-commits@eFf2fesrs-1aVM5tH3ORQ.md b/src/data/roadmaps/git-github/content/cherry-picking-commits@eFf2fesrs-1aVM5tH3ORQ.md index c6273ecb8..08a46604b 100644 --- a/src/data/roadmaps/git-github/content/cherry-picking-commits@eFf2fesrs-1aVM5tH3ORQ.md +++ b/src/data/roadmaps/git-github/content/cherry-picking-commits@eFf2fesrs-1aVM5tH3ORQ.md @@ -2,7 +2,7 @@ Cherry-picking in Git allows you to apply a specific commit from one branch to another, without merging the entire branch. This is useful when you want to bring in a specific feature or fix from one branch to another without incorporating all the changes from the source branch. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@git-cherry-pick-docs](https://git-scm.com/docs/git-cherry-pick) - [@article@Git cherry pick](https://www.atlassian.com/git/tutorials/cherry-pick) diff --git a/src/data/roadmaps/git-github/content/clean-git-history@i3AbARgzQtxtlB-1AS8zv.md b/src/data/roadmaps/git-github/content/clean-git-history@i3AbARgzQtxtlB-1AS8zv.md index 2e4b1432e..b86ebfda3 100644 --- a/src/data/roadmaps/git-github/content/clean-git-history@i3AbARgzQtxtlB-1AS8zv.md +++ b/src/data/roadmaps/git-github/content/clean-git-history@i3AbARgzQtxtlB-1AS8zv.md @@ -7,7 +7,7 @@ Cleaning up Git history can make your commit history more readable, concise, and - To be able to deploy any commit on your development branch using your CI/CD system - If you are handling mobile app releases and you are responsible for figuring out what feature is in which release. -Learn more from the following resources: +Visit the following resources to learn more: - [@article@Clean GIT history — a Step by Step Guide](https://medium.com/@catalinaturlea/clean-git-history-a-step-by-step-guide-eefc0ad8696d) - [@video@Git best practice tip: clean commit history](https://youtu.be/bZpiVijzd2g?si=8lJTlR3LfY9ZUd77) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/client-vs-server-hooks@zsU6R2zvJKnYNU2ac4o4p.md b/src/data/roadmaps/git-github/content/client-vs-server-hooks@zsU6R2zvJKnYNU2ac4o4p.md index 7c3f165ab..802ed0063 100644 --- a/src/data/roadmaps/git-github/content/client-vs-server-hooks@zsU6R2zvJKnYNU2ac4o4p.md +++ b/src/data/roadmaps/git-github/content/client-vs-server-hooks@zsU6R2zvJKnYNU2ac4o4p.md @@ -2,8 +2,8 @@ Like many other Version Control Systems, Git has a way to fire off custom scripts when certain important actions occur. There are two groups of these hooks: client-side and server-side. Client-side hooks are triggered by operations such as committing and merging, while server-side hooks run on network operations such as receiving pushed commits. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@Git Hooks](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks#:~:text=There%20are%20two%20groups%20of,for%20all%20sorts%20of%20reasons.) - [@article@Git Hooks: The Powerful Tool You're Probably Not Using](https://dev.to/algodame/git-hooks-the-powerful-tool-youre-probably-not-using-but-should-be-1lec) -- [@video@Client vs Server Hooks](https://youtu.be/egfuwOe8nXc?si=IkbLCr-3eGE9x6cY) +- [@video@Client vs Server Hooks](https://youtu.be/egfuwOe8nXc?si=IkbLCr-3eGE9x6cY) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/cloning-repositories@1Koej79yTv-OAswVZwgGq.md b/src/data/roadmaps/git-github/content/cloning-repositories@1Koej79yTv-OAswVZwgGq.md index 9d30a35b5..cbb82058e 100644 --- a/src/data/roadmaps/git-github/content/cloning-repositories@1Koej79yTv-OAswVZwgGq.md +++ b/src/data/roadmaps/git-github/content/cloning-repositories@1Koej79yTv-OAswVZwgGq.md @@ -1,9 +1,9 @@ # Cloning Repositories Cloning a repository in Git and GitHub involves creating a local copy of a remote repository on your computer. This allows you to work on the project locally, commit changes, and later push those changes back to the remote repository. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@Git clone](https://git-scm.com/docs/git-clone/en) - [@official@Cloning a repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) - [@article@Clone a git respository](https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-clone) -- [@video@Cloning remote respository into local machine](https://youtu.be/xeQih8LVtZM?si=djlyTDpLNS0oyqQH) +- [@video@Cloning remote respository into local machine](https://youtu.be/xeQih8LVtZM?si=djlyTDpLNS0oyqQH) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/code-reviews@xLB2fhsOm0Vu3xg_PusJB.md b/src/data/roadmaps/git-github/content/code-reviews@xLB2fhsOm0Vu3xg_PusJB.md index 791d9cf89..f5ba875a6 100644 --- a/src/data/roadmaps/git-github/content/code-reviews@xLB2fhsOm0Vu3xg_PusJB.md +++ b/src/data/roadmaps/git-github/content/code-reviews@xLB2fhsOm0Vu3xg_PusJB.md @@ -1,6 +1,5 @@ # Code Reviews - The purpose of a code review in software development is to help ensure that the code meets the organization’s standards and requirements, is of high quality, and is maintainable. In addition to identifying errors and bugs, code reviews also promote a culture of learning and collaboration among the development team. Some of the benefits of code reviews include: @@ -10,7 +9,7 @@ Some of the benefits of code reviews include: - Boost collaboration, communication, and knowledge sharing among developers by providing a forum to discuss code and ask questions, share ideas and best practices, and learn from each other. - Ensure that the code is maintainable by identifying any software maintenance issues and suggesting improvements. -Learn more from the following links: +Visit the following resources to learn more: - [@article@A practical guide for better, faster code reviews](https://github.com/mawrkus/pull-request-review-guide) - [@article@How to improve code with code reviews](https://github.com/resources/articles/software-development/how-to-improve-code-with-code-reviews) diff --git a/src/data/roadmaps/git-github/content/collaboration-on-github@d_GNnB6PBINz1jxGNWAE-.md b/src/data/roadmaps/git-github/content/collaboration-on-github@d_GNnB6PBINz1jxGNWAE-.md index 442350452..515370dcf 100644 --- a/src/data/roadmaps/git-github/content/collaboration-on-github@d_GNnB6PBINz1jxGNWAE-.md +++ b/src/data/roadmaps/git-github/content/collaboration-on-github@d_GNnB6PBINz1jxGNWAE-.md @@ -2,8 +2,8 @@ Collaboration on GitHub is a powerful way for multiple people to work together on the same project, using Git as the version control system. GitHub provides various tools and workflows that make collaboration efficient and organized. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@How to collaborate in a GitHub project](https://gist.github.com/neklaf/9002d3acccf6b6e448db5c4c4e8764c0) - [@article@Best Practices for collaborating in github](https://www.gitkraken.com/blog/collaborate-on-github) -- [@article@Working with GitHub in VS Code](https://code.visualstudio.com/docs/sourcecontrol/github) +- [@article@Working with GitHub in VS Code](https://code.visualstudio.com/docs/sourcecontrol/github) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/collaboration@bXfCUG3h1TIFPgD4WUDph.md b/src/data/roadmaps/git-github/content/collaboration@bXfCUG3h1TIFPgD4WUDph.md index 17f86d485..08a2b5fea 100644 --- a/src/data/roadmaps/git-github/content/collaboration@bXfCUG3h1TIFPgD4WUDph.md +++ b/src/data/roadmaps/git-github/content/collaboration@bXfCUG3h1TIFPgD4WUDph.md @@ -2,7 +2,7 @@ When working on projects with others, Git provides tools to facilitate collaboration through forking repositories using `git clone` or `git fork`, cloning them locally with git clone, managing pull requests with `git request-pull`, and resolving merge conflicts. To contribute effectively, follow established contributing guides and respect open-source licences that govern how contributors' work may be used by others. -Learn more from the following resources: +Visit the following resources to learn more: - [@article@Git Fork and Git Clone: The difference and why it's important!](https://dev.to/danielasaboro/git-fork-and-clone-whats-the-difference-190c) - [@article@About pull requests](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) diff --git a/src/data/roadmaps/git-github/content/collaborators--members@_ft-uvXt6s_xrcMT3fbSF.md b/src/data/roadmaps/git-github/content/collaborators--members@_ft-uvXt6s_xrcMT3fbSF.md index 096652d43..025df8f50 100644 --- a/src/data/roadmaps/git-github/content/collaborators--members@_ft-uvXt6s_xrcMT3fbSF.md +++ b/src/data/roadmaps/git-github/content/collaborators--members@_ft-uvXt6s_xrcMT3fbSF.md @@ -1 +1,6 @@ -# Collaborators / Members \ No newline at end of file +# Collaborators / Members + +In GitHub, collaborators and members refer to individuals who contribute to or have access to your repository. Collaborators are users who have been granted permission to contribute code, make changes, and push updates to your repository, whereas members are the owners of a repository, including organization owners who have full control over their team's repositories. Members can be either individual collaborators or part of an organization team, with varying levels of access and permissions based on their role within the team. + +- [@article@Inviting collaborators to a personal repository](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-access-to-your-personal-repositories/inviting-collaborators-to-a-personal-repository) +-[@official@REST API endpoints for collaborators](https://docs.github.com/en/rest/collaborators/collaborators?apiVersion=2022-11-28) diff --git a/src/data/roadmaps/git-github/content/collaborators@r-u1vTpUyuvsB0revOU0C.md b/src/data/roadmaps/git-github/content/collaborators@r-u1vTpUyuvsB0revOU0C.md index 2fb5a3e7b..6bd5812e6 100644 --- a/src/data/roadmaps/git-github/content/collaborators@r-u1vTpUyuvsB0revOU0C.md +++ b/src/data/roadmaps/git-github/content/collaborators@r-u1vTpUyuvsB0revOU0C.md @@ -2,11 +2,10 @@ Collaborators in GitHub are users who have been granted direct access to a repository by the repository owner or organization administrators. Collaborators can perform actions like pushing commits, creating branches, and managing issues or pull requests, depending on the permissions granted to them. They are typically added to private repositories or to public repositories where more control over contributions is needed. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@How to add collaborators to your personal projects](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-access-to-your-personal-repositories/inviting-collaborators-to-a-personal-repository) - [@official@Adding outside collaborators to repositories in your organization](https://docs.github.com/en/organizations/managing-user-access-to-your-organizations-repositories/managing-outside-collaborators/adding-outside-collaborators-to-repositories-in-your-organization) - [@article@What are github collaborators](https://www.geeksforgeeks.org/what-are-github-collaborators/) - [@article@How to Add Collaborators to Your GitHub Repository](https://www.blinkops.com/blog/how-to-add-collaborators-to-your-github-repository) -- [@video@Using Github for Team collaboration](https://youtu.be/4nyIS58ORWw?si=yK5LCONNVm9OIUK5) - +- [@video@Using Github for Team collaboration](https://youtu.be/4nyIS58ORWw?si=yK5LCONNVm9OIUK5) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/commit-messages@7lRUYWNSpHvJ-QyIE8RMa.md b/src/data/roadmaps/git-github/content/commit-messages@7lRUYWNSpHvJ-QyIE8RMa.md index dcd1abf0f..871521c79 100644 --- a/src/data/roadmaps/git-github/content/commit-messages@7lRUYWNSpHvJ-QyIE8RMa.md +++ b/src/data/roadmaps/git-github/content/commit-messages@7lRUYWNSpHvJ-QyIE8RMa.md @@ -2,7 +2,7 @@ A Git commit message is a brief explanation of the changes introduced in a particular commit. It helps others (and your future self) understand the purpose of the changes and the context behind them. Writing clear and informative commit messages is an important practice for maintaining a well-organized and easily navigable project history. -Learn more from the following resources: +Visit the following resources to learn more: - [@article@How to Write Better Git Commit Messages](https://www.freecodecamp.org/news/how-to-write-better-git-commit-messages/) - [@article@Writing good commit messages](https://www.theodinproject.com/lessons/foundations-commit-messages) diff --git a/src/data/roadmaps/git-github/content/commit-msg@jzYjHx-gIKSP8dQUTqWVw.md b/src/data/roadmaps/git-github/content/commit-msg@jzYjHx-gIKSP8dQUTqWVw.md index 2fd5297f0..6c9ccf16d 100644 --- a/src/data/roadmaps/git-github/content/commit-msg@jzYjHx-gIKSP8dQUTqWVw.md +++ b/src/data/roadmaps/git-github/content/commit-msg@jzYjHx-gIKSP8dQUTqWVw.md @@ -1 +1,8 @@ -# commit-msg \ No newline at end of file +# commit-msg + +The commit-msg hook is a client-side hook that runs after you've committed changes to your repository. It's typically used to validate or modify the commit message before it's recorded in the Git history. + +Visit the following resources to learn more: + +- [@article@A Git-Hook for Commit Messages Validation - No Husky, Just JS](https://dev.to/mbarzeev/a-git-hook-for-commit-messages-validation-no-husky-just-js-1hni) +- [@video@Git Hooks Made Easy: Create a Custom 'commit-msg' Hook Script](https://www.youtube.com/watch?v=yH1lBm5t97s) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/committing-changes@2_z3R7seCvQVj-Na4H1SV.md b/src/data/roadmaps/git-github/content/committing-changes@2_z3R7seCvQVj-Na4H1SV.md index 73d2cf2a7..2a5a169a1 100644 --- a/src/data/roadmaps/git-github/content/committing-changes@2_z3R7seCvQVj-Na4H1SV.md +++ b/src/data/roadmaps/git-github/content/committing-changes@2_z3R7seCvQVj-Na4H1SV.md @@ -1,8 +1,8 @@ # Committing Changes -Committing changes in Git is a crucial part of version control, allowing you to save your progress and record a snapshot of your project's current state +Committing changes in Git is a crucial part of version control, allowing you to save your progress and record a snapshot of your project's current state. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@How git commit works](https://github.com/git-guides/git-commit) -- [@article@Git commit](https://www.atlassian.com/git/tutorials/saving-changes/git-commit) +- [@article@Git commit](https://www.atlassian.com/git/tutorials/saving-changes/git-commit) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/contribution-guidelines@pJ-najh7dXhhYA_0bDiR5.md b/src/data/roadmaps/git-github/content/contribution-guidelines@pJ-najh7dXhhYA_0bDiR5.md index 27171b0c2..20d77b3e3 100644 --- a/src/data/roadmaps/git-github/content/contribution-guidelines@pJ-najh7dXhhYA_0bDiR5.md +++ b/src/data/roadmaps/git-github/content/contribution-guidelines@pJ-najh7dXhhYA_0bDiR5.md @@ -2,9 +2,9 @@ Contribution guidelines are essential for collaborative projects on GitHub as they help streamline collaboration, set expectations for contributions, and maintain the project's quality and consistency. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@Setting guidelines for respository contributors](https://docs.github.com/articles/setting-guidelines-for-repository-contributors) - [@official@Contributing Guidelines](https://github.blog/news-insights/contributing-guidelines/) - [@official@Contributing Guides: A Template](https://github.com/nayafia/contributing-template) -- [@article@How to Build a CONTRIBUTING.md](https://mozillascience.github.io/working-open-workshop/contributing/) +- [@article@How to Build a CONTRIBUTING.md](https://mozillascience.github.io/working-open-workshop/contributing/) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/creating-account@i7fIIHcBEk473te8bniJ5.md b/src/data/roadmaps/git-github/content/creating-account@i7fIIHcBEk473te8bniJ5.md index 7249c0d07..2c1eaf559 100644 --- a/src/data/roadmaps/git-github/content/creating-account@i7fIIHcBEk473te8bniJ5.md +++ b/src/data/roadmaps/git-github/content/creating-account@i7fIIHcBEk473te8bniJ5.md @@ -1,8 +1,7 @@ # Creating Account -To get started with GitHub, you'll need to create a free personal account on GitHub.com and verify your email address. -Every person who uses GitHub.com signs in to a personal account. Your personal account is your identity on GitHub.com and has a username and profile. +To get started with GitHub, you'll need to create a free personal account on GitHub.com and verify your email address. Every person who uses GitHub.com signs in to a personal account. Your personal account is your identity on GitHub.com and has a username and profile. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@Creating an account on GitHub](https://docs.github.com/en/get-started/start-your-journey/creating-an-account-on-github) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/creating-branch@OegitQ5Ngjvd3ZfMpfrkM.md b/src/data/roadmaps/git-github/content/creating-branch@OegitQ5Ngjvd3ZfMpfrkM.md index 71c7dd520..289b0ecdd 100644 --- a/src/data/roadmaps/git-github/content/creating-branch@OegitQ5Ngjvd3ZfMpfrkM.md +++ b/src/data/roadmaps/git-github/content/creating-branch@OegitQ5Ngjvd3ZfMpfrkM.md @@ -2,7 +2,7 @@ Creating a branch in Git is a fundamental part of working with version control, allowing you to work on different features or fixes without affecting the main codebase. You can create branches either through the terminal or github interface -Learn more from the following resources: +Visit the following resources to learn more: - [@official@Git branch documentation](https://git-scm.com/docs/git-branch) -- [@article@Git branch](https://www.atlassian.com/git/tutorials/using-branches) +- [@article@Git branch](https://www.atlassian.com/git/tutorials/using-branches) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/creating-repositories@c_FO6xMixrrMo6iisfsvl.md b/src/data/roadmaps/git-github/content/creating-repositories@c_FO6xMixrrMo6iisfsvl.md index aa4f59223..56f4966be 100644 --- a/src/data/roadmaps/git-github/content/creating-repositories@c_FO6xMixrrMo6iisfsvl.md +++ b/src/data/roadmaps/git-github/content/creating-repositories@c_FO6xMixrrMo6iisfsvl.md @@ -2,6 +2,6 @@ Creating a Git repository means setting up a system to track changes in your project's files over time. This is crucial for version control, allowing you to manage, review, and collaborate on code efficiently. -Learn more from the following resources: +Visit the following resources to learn more: -- [@official@Quickstart for repositories - GitHub Docs](https://docs.github.com/en/repositories/creating-and-managing-repositories/quickstart-for-repositories) +- [@official@Quickstart for repositories - GitHub Docs](https://docs.github.com/en/repositories/creating-and-managing-repositories/quickstart-for-repositories) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/deleting-branch@1uDenoQ6zu7CT69FR2iQB.md b/src/data/roadmaps/git-github/content/deleting-branch@1uDenoQ6zu7CT69FR2iQB.md index e46338704..3f8d7c516 100644 --- a/src/data/roadmaps/git-github/content/deleting-branch@1uDenoQ6zu7CT69FR2iQB.md +++ b/src/data/roadmaps/git-github/content/deleting-branch@1uDenoQ6zu7CT69FR2iQB.md @@ -2,7 +2,7 @@ Deleting a Git branch means removing a line of development from your Git repository. A branch in Git is essentially a pointer to a specific commit, representing an independent line of development. When you delete a branch, you’re removing this pointer, making that line of development no longer accessible through the branch name. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@Creating and deleting branches within your repository](https://docs.github.com/articles/creating-and-deleting-branches-within-your-repository) -- [@article@How to Delete a Git Branch Both Locally and Remotely](https://www.freecodecamp.org/news/how-to-delete-a-git-branch-both-locally-and-remotely/) +- [@article@How to Delete a Git Branch Both Locally and Remotely](https://www.freecodecamp.org/news/how-to-delete-a-git-branch-both-locally-and-remotely/) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/detached-head@0cLf7FiI9CX--UX45sm2f.md b/src/data/roadmaps/git-github/content/detached-head@0cLf7FiI9CX--UX45sm2f.md index 6c1c6cf72..d2effa1fb 100644 --- a/src/data/roadmaps/git-github/content/detached-head@0cLf7FiI9CX--UX45sm2f.md +++ b/src/data/roadmaps/git-github/content/detached-head@0cLf7FiI9CX--UX45sm2f.md @@ -1 +1,8 @@ -# Detached HEAD \ No newline at end of file +# Detached HEAD + +In Git, a detached head occurs when you check out a commit directly using its hash instead of a branch name. This leaves your repository's HEAD pointer pointing directly at that commit, rather than being linked to a specific branch. To view the history and changes made in a detached head, use `git log` or `git show`. If you want to see the differences between the current detached head and another branch, use `git diff `. A detached head can be a useful temporary state for exploring specific commits or features, but it's essential to merge those changes back into a branch before sharing them with others. + +Visit the following resources to learn more: + +- [@article@How to resolve detached HEAD state in Git](https://graphite.dev/guides/how-to-resolve-detached-head-state-in-git) +- [@video@Head & Detached Head](https://www.youtube.com/watch?v=HvDjbAa9ZsY) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/documentation@D2WIExwfSnkAPIa5O-Hp5.md b/src/data/roadmaps/git-github/content/documentation@D2WIExwfSnkAPIa5O-Hp5.md index 7d8b3af51..1cc3b9e40 100644 --- a/src/data/roadmaps/git-github/content/documentation@D2WIExwfSnkAPIa5O-Hp5.md +++ b/src/data/roadmaps/git-github/content/documentation@D2WIExwfSnkAPIa5O-Hp5.md @@ -1 +1,16 @@ -# Documentation \ No newline at end of file +# Documentation + +A well-maintained repository should include documentation that helps others understand the project, its context, and how to contribute to it. This is essential for fostering a community around your project and making it easier for newcomers to join in. + +Here are some key sections of documentation that you should consider including in each repository: + +- README.md: A brief introduction to the project, explaining what it's about, why it exists, and how to get started. +- CONTRIBUTING.md: Guidelines on how others can contribute to the project, including steps for reporting issues, submitting pull requests, or suggesting new features. +- LICENSE: Information about the license under which the repository is released, ensuring users understand their rights and responsibilities when using your code. +- CHANGELOG: A history of changes made to the project over time, highlighting significant updates, bug fixes, or feature additions. + +These documents help ensure a smooth onboarding process for contributors, making it easier for them to collaborate effectively and enhance the overall project. + +Visit the following resources to learn more: + +- [@article@How to Manage Documentation in a GitHub Repository: A Guide for Junior Developers](https://dev.to/mochafreddo/how-to-manage-documentation-in-a-github-repository-a-guide-for-junior-developers-pgo) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/fast-forward-vs-non-ff@agtPWS8j6i6wQPk10cy8E.md b/src/data/roadmaps/git-github/content/fast-forward-vs-non-ff@agtPWS8j6i6wQPk10cy8E.md index 9d581cb88..79779d8f2 100644 --- a/src/data/roadmaps/git-github/content/fast-forward-vs-non-ff@agtPWS8j6i6wQPk10cy8E.md +++ b/src/data/roadmaps/git-github/content/fast-forward-vs-non-ff@agtPWS8j6i6wQPk10cy8E.md @@ -7,10 +7,10 @@ No new merge commit is created; the history is linear. A Non-Fast-Forward (No-FF) merge happens when the target branch has diverged from the branch being merged or when you explicitly choose to create a merge commit. In this case, Git creates a new commit that represents the merging of the two branches. Git creates a new merge commit that has two parent commits: one from the target branch and one from the branch being merged. The merge commit is a snapshot of the merged work, preserving the history of both branches. -Learn more from the following resources: +Visit the following resources to learn more: - [@article@Git Fast-Forward VS Non-Fast-Forward](https://leimao.github.io/blog/Git-Fast-Forward-VS-Non-Fast-Forward/) - [@article@Git Merge: To Squash Or Fast-Forward?](https://dev.to/trpricesoftware/git-merge-to-squash-or-fast-forward-3791) - [@article@Difference between a git fast forward and no fast forward](https://gist.github.com/moraisaugusto/1fa02c49b6d9833fcdf665505595ac2e) - [@video@GIT Fast Forward Visualized](https://youtu.be/DN1fNYoJgDw?si=_TZKACj4SCOuESGm) -- [@video@git merge no fast forward](https://youtu.be/X_8atqzsO8U?si=e9hMQg_aWLRMWf4O) +- [@video@git merge no fast forward](https://youtu.be/X_8atqzsO8U?si=e9hMQg_aWLRMWf4O) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/fetch-without-merge@Gybnekbd1rJKTOf4hJ4Sh.md b/src/data/roadmaps/git-github/content/fetch-without-merge@Gybnekbd1rJKTOf4hJ4Sh.md index d8aef27e0..3b6febd44 100644 --- a/src/data/roadmaps/git-github/content/fetch-without-merge@Gybnekbd1rJKTOf4hJ4Sh.md +++ b/src/data/roadmaps/git-github/content/fetch-without-merge@Gybnekbd1rJKTOf4hJ4Sh.md @@ -1 +1,9 @@ -# Fetch without Merge \ No newline at end of file +# Fetch without Merge + +Running `git fetch` retrieves changes from a remote repository into your local clone, but does not automatically merge any of these changes into your local working directory. This is different from `git pull`, which both fetches and merges remote changes. By using fetch without merge, you can ensure that your local clone is up-to-date with the latest information from the remote repository, while leaving your working directory unchanged. You can then choose to apply these changes by using merge or rebase. This approach helps maintain a clean and consistent local state, making it easier to manage and commit changes. + +Visit the following resources to learn more: + +- [@official@Git Fetch](https://git-scm.com/docs/git-fetch) +- [@article@Git fetch](https://www.atlassian.com/git/tutorials/syncing/git-fetch) +- [@video@Git Fetch | What is Git Fetch and How to Use it | Learn Git](https://www.youtube.com/watch?v=uEEcw1s_wWk) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/forking-vs-cloning@l1Wf7Pe_ah8ycCgslfSK4.md b/src/data/roadmaps/git-github/content/forking-vs-cloning@l1Wf7Pe_ah8ycCgslfSK4.md index e1fe12187..89653cdc0 100644 --- a/src/data/roadmaps/git-github/content/forking-vs-cloning@l1Wf7Pe_ah8ycCgslfSK4.md +++ b/src/data/roadmaps/git-github/content/forking-vs-cloning@l1Wf7Pe_ah8ycCgslfSK4.md @@ -4,7 +4,7 @@ Forking and cloning are two fundamental concepts in Git, particularly when worki Cloning a repository means creating a local copy of a repository that exists on a remote server (e.g., GitHub) on your local machine. This allows you to work on the project locally, make changes, and then push those changes back to the remote repository if you have the necessary permissions. Forking a repository is specific to platforms like GitHub, GitLab, and Bitbucket. When you fork a repository, you create a copy of someone else’s repository in your own account. This forked repository is independent of the original and can be modified without affecting the original project. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@The difference between forking and cloning a repository](https://github.com/orgs/community/discussions/35849) - [@article@Git fork vs. clone: What's the difference?](https://www.theserverside.com/answer/Git-fork-vs-clone-Whats-the-difference) diff --git a/src/data/roadmaps/git-github/content/git-attributes@CGj_UX5JMOOCKinedsNRc.md b/src/data/roadmaps/git-github/content/git-attributes@CGj_UX5JMOOCKinedsNRc.md index cee2a9dd2..dff5a664a 100644 --- a/src/data/roadmaps/git-github/content/git-attributes@CGj_UX5JMOOCKinedsNRc.md +++ b/src/data/roadmaps/git-github/content/git-attributes@CGj_UX5JMOOCKinedsNRc.md @@ -1 +1,9 @@ -# Git Attributes \ No newline at end of file +# Git Attributes + +Git attributes are settings stored in the .gitattributes file, controlling how Git handles files in your repository. They can influence filtering (e.g., ignoring specific files), conversion (formatting or transforming files during Git operations), and formatting (applying consistent styles). These settings can be applied to specific file types (like *.txt) or filter files based on content patterns. Attributes also define smudge patterns (highlighting differences) and ignore patterns, helping maintain a clean repository by automatically applying intended settings for certain file types. + +Visit the following resources to learn more: + +- [@official@Customizing Git - Git Attributes](https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes) +- [@opensource@gitattributes/gitattributes](https://github.com/gitattributes/gitattributes) +- [@article@The benefits of git attributes and how to set them up](https://medium.com/@cloudwala/the-benefits-of-git-attributes-and-how-to-set-them-up-87f90251b8e0) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/git-bisect@ExXuwTQSI_lg4SRGW3Iu1.md b/src/data/roadmaps/git-github/content/git-bisect@ExXuwTQSI_lg4SRGW3Iu1.md index 593230876..dd6822aa0 100644 --- a/src/data/roadmaps/git-github/content/git-bisect@ExXuwTQSI_lg4SRGW3Iu1.md +++ b/src/data/roadmaps/git-github/content/git-bisect@ExXuwTQSI_lg4SRGW3Iu1.md @@ -1 +1,9 @@ -# Git Bisect \ No newline at end of file +# Git Bisect + +Git Bisect is an interactive tool used to identify which commit in your project's history introduced a bug or regression. You start by identifying two commits: one where the issue isn't present (the "good" commit) and another where it is (the "bad" commit). Then, run `git bisect start`, followed by `git bisect good` for the good commit and `git bisect bad` for the bad commit. Git Bisect will guide you through a binary search process, asking you to test the midpoint of your current range until it identifies the exact commit that introduced the bug or regression. + +Visit the following resources to learn more: + +- [@official@Git Bisect](https://git-scm.com/docs/git-bisect) +- [@article@Using `git bisect` to find the faulty commit](https://dev.to/alvesjessica/using-git-bisect-to-find-the-faulty-commit-25gf) +- [@video@Git Bisect | How to use Git Bisect | Learn Git](https://www.youtube.com/watch?v=z-AkSXDqodc) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/git-commit---amend@NjPnEXLf1Lt9qzgxccogv.md b/src/data/roadmaps/git-github/content/git-commit---amend@NjPnEXLf1Lt9qzgxccogv.md index c54360a61..b94e35637 100644 --- a/src/data/roadmaps/git-github/content/git-commit---amend@NjPnEXLf1Lt9qzgxccogv.md +++ b/src/data/roadmaps/git-github/content/git-commit---amend@NjPnEXLf1Lt9qzgxccogv.md @@ -1 +1,9 @@ -# git commit --amend \ No newline at end of file +# git commit --amend + +`git commit --amend` is a command used to modify the most recent commit in your repository's history by updating its message, adding or removing files, or changing the commit's metadata. This allows you to correct mistakes or improve the commit's description after it has been made. When using --amend, Git will replace the existing commit with a new one that includes any changes made since the last commit, effectively "amending" the previous commit. + +Visit the following resources to learn more: + +- [@article@Changing a commit message](https://docs.github.com/en/enterprise-cloud@latest/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/changing-a-commit-message) +- [@article@Rewriting history](https://www.atlassian.com/git/tutorials/rewriting-history) +- [@video@Git Amend Tutorial: Rewrite Git History](https://www.youtube.com/watch?v=q53umU5vMkk) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/git-config@NMCWgzhhfUvFOMO5GbF_u.md b/src/data/roadmaps/git-github/content/git-config@NMCWgzhhfUvFOMO5GbF_u.md index b89d3f83b..947defbd2 100644 --- a/src/data/roadmaps/git-github/content/git-config@NMCWgzhhfUvFOMO5GbF_u.md +++ b/src/data/roadmaps/git-github/content/git-config@NMCWgzhhfUvFOMO5GbF_u.md @@ -4,7 +4,7 @@ The `git config` command is a convenience function that is used to set Git confi The most basic use case for `git config` is to invoke it with a configuration name, which will display the set value at that name. Configuration names are dot delimited strings composed of a 'section' and a 'key' based on their hierarchy. For example: `user.email` -Learn more from the following resources: +Visit the following resources to learn more: - [@official@Git - git-config Documentation](https://git-scm.com/docs/git-config) - [@article@git config | Atlassian Git Tutorial](https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-config) diff --git a/src/data/roadmaps/git-github/content/git-hooks@pqBV7BMAs0z6qpfZeW2XP.md b/src/data/roadmaps/git-github/content/git-hooks@pqBV7BMAs0z6qpfZeW2XP.md index 31b7781c2..8cdaf044d 100644 --- a/src/data/roadmaps/git-github/content/git-hooks@pqBV7BMAs0z6qpfZeW2XP.md +++ b/src/data/roadmaps/git-github/content/git-hooks@pqBV7BMAs0z6qpfZeW2XP.md @@ -1 +1,14 @@ -# Git hooks \ No newline at end of file +# Git hooks + +Git hooks are scripts that run automatically at specific points during the Git workflow, such as when you commit, push, or pull changes from a repository. These scripts can be used to perform various tasks, like validating code, formatting files, or even sending notifications. + +There are two types of Git hooks: + +- Client-side hooks: Run on your local machine before committing changes. +- Server-side hooks: Run on the remote server when you push changes. + +Visit the following resources to learn more: + +- [@official@Customizing Git - Git Hooks](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks) +- [@article@Git hooks](https://www.atlassian.com/git/tutorials/git-hooks) +- [@video@What are GitHooks? Explained in 5 minutes](https://www.youtube.com/watch?v=1OFiiPretCM) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/git-init@1iOkbO5juk2LO-WZHx_W6.md b/src/data/roadmaps/git-github/content/git-init@1iOkbO5juk2LO-WZHx_W6.md index 018643d06..76110da1b 100644 --- a/src/data/roadmaps/git-github/content/git-init@1iOkbO5juk2LO-WZHx_W6.md +++ b/src/data/roadmaps/git-github/content/git-init@1iOkbO5juk2LO-WZHx_W6.md @@ -2,7 +2,7 @@ The `git init` command creates a new Git repository. It can be used to convert an existing, unversioned project to a Git repository or initialize a new, empty repository. Most other Git commands are not available outside of an initialized repository, so this is usually the first command you'll run in a new project. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@Git - git-init Documentation](https://git-scm.com/docs/git-init) -- [@article@git init | Atlassian Git Tutorial](https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-init#:~:text=The%20git%20init%20command%20creates,run%20in%20a%20new%20project.) +- [@article@git init | Atlassian Git Tutorial](https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-init#:~:text=The%20git%20init%20command%20creates,run%20in%20a%20new%20project.) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/git-lfs@zdunaucVe8J1tKf_z-NQo.md b/src/data/roadmaps/git-github/content/git-lfs@zdunaucVe8J1tKf_z-NQo.md index dcfa7ad9a..8b91a7cb5 100644 --- a/src/data/roadmaps/git-github/content/git-lfs@zdunaucVe8J1tKf_z-NQo.md +++ b/src/data/roadmaps/git-github/content/git-lfs@zdunaucVe8J1tKf_z-NQo.md @@ -1 +1,8 @@ -# Git LFS \ No newline at end of file +# Git LFS + +Git Large File Storage (LFS) is an extension that helps manage large files by tracking metadata, not storing entire files. It allows storing and tracking binary assets like images, videos, audio files separately from your regular Git repository. By storing only metadata in your Git repository, you improve clone and push times, reducing storage usage. This approach is particularly useful for media repositories, large dataset storage, and binary asset management in game development. Note that Git LFS requires a separate server or storage system to store actual file content. + +Visit the following resources to learn more: + +- [@article@Learning About Git Large File System (LFS)](https://medium.com/swlh/learning-about-git-large-file-system-lfs-72e0c86cfbaf) +- [@video@Git LFS (Large File Storage) | Learn Git](https://www.youtube.com/watch?v=jXsvFfksvd0) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/git-log-options@qFEonbCMLri8iA0yONwuf.md b/src/data/roadmaps/git-github/content/git-log-options@qFEonbCMLri8iA0yONwuf.md index c2bbd417d..fd993165e 100644 --- a/src/data/roadmaps/git-github/content/git-log-options@qFEonbCMLri8iA0yONwuf.md +++ b/src/data/roadmaps/git-github/content/git-log-options@qFEonbCMLri8iA0yONwuf.md @@ -1 +1,21 @@ -# git log options \ No newline at end of file +# git log options + +`git log` is a command in Git that shows the commit history of your repository. It provides a detailed view of all commits, including their hashes, authors, dates, and messages. + +Here are some common git log options: + +- -2: Only show the last two commits. +- --all: Show all branches in the repository. +- --graph: Display the commit history as a graph. +- --no-color: Disable colorized output. +- --stat: Show a statistical summary of changes. +- **-S`: Only show commits with modified files. + +You can combine these options to tailor your log output to suit your needs. + +For example, `git log -2 --graph` will display the last two commits in graph form. + +Visit the following resources to learn more: + +- [@official@Git Log](https://git-scm.com/docs/git-log) +- [@article@Git Log Cheatsheet](https://elijahmanor.com/blog/git-log) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/git-patch@sFf1PdFfmEdQxsEntfeFq.md b/src/data/roadmaps/git-github/content/git-patch@sFf1PdFfmEdQxsEntfeFq.md index 6223fa71d..4f5de10e6 100644 --- a/src/data/roadmaps/git-github/content/git-patch@sFf1PdFfmEdQxsEntfeFq.md +++ b/src/data/roadmaps/git-github/content/git-patch@sFf1PdFfmEdQxsEntfeFq.md @@ -1 +1,8 @@ -# Git Patch \ No newline at end of file +# Git Patch + +In Git, a patch is a file that contains a set of changes made to a project's codebase. It's essentially a diff (difference) file that shows the modifications between two versions of a commit or a branch. However, despite its usefulness in certain contexts, the use of Git patches has declined somewhat with the advent of more modern and efficient ways to manage code changes. + +Visit the following resources to learn more: + +- [@article@Git Patch](https://www.gitkraken.com/learn/git/git-patch) +- [@article@How to generate and apply patches with git?](https://gist.github.com/nepsilon/22bc62a23f785716705c) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/git-push---force@OQOmxg9mCfcjt80hpvXkA.md b/src/data/roadmaps/git-github/content/git-push---force@OQOmxg9mCfcjt80hpvXkA.md index 5cefaa844..b901622de 100644 --- a/src/data/roadmaps/git-github/content/git-push---force@OQOmxg9mCfcjt80hpvXkA.md +++ b/src/data/roadmaps/git-github/content/git-push---force@OQOmxg9mCfcjt80hpvXkA.md @@ -1 +1,8 @@ -# git push --force \ No newline at end of file +# git push --force + +`git push --force` is a command that allows you to overwrite or "force" an existing commit on a remote repository with a new commit from your local repository. This can be useful in certain situations, such as when you need to update the remote branch with changes that were previously rejected or when you want to remove commits that are no longer relevant. However, it's essential to exercise caution when using git push --force because it can overwrite changes made by others or even your own previous work. Always verify that there are no conflicting changes on the remote repository before using this command. + +Visit the following resources to learn more: + +- [@article@Git Push Force](https://www.gitkraken.com/learn/git/problems/git-push-force) +- [@video@How to force push to GitHub?](https://www.youtube.com/watch?v=wgXbfLn-zkI) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/git-rebase@HMEfUFNu_Wp_Pac7VWHr-.md b/src/data/roadmaps/git-github/content/git-rebase@HMEfUFNu_Wp_Pac7VWHr-.md index c37e73eef..1153f0838 100644 --- a/src/data/roadmaps/git-github/content/git-rebase@HMEfUFNu_Wp_Pac7VWHr-.md +++ b/src/data/roadmaps/git-github/content/git-rebase@HMEfUFNu_Wp_Pac7VWHr-.md @@ -2,9 +2,9 @@ Git rebase is a powerful command in Git that allows you to integrate changes from one branch into another. Unlike git merge, which creates a new commit to combine the histories of two branches, git rebase moves or applies commits from one branch on top of another, effectively re-writing the commit history. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@Git - git-rebase Documentation](https://git-scm.com/docs/git-rebase) - [@article@git rebase ](https://www.atlassian.com/git/tutorials/rewriting-history/git-rebase) - [@video@git rebase - Why, When & How to fix conflicts](https://youtu.be/DkWDHzmMvyg?si=59jauQgkL-sMewzo) -- [@video@Git Rebase --interactive: EXPLAINED](https://youtu.be/H7RFt0Pxxp8?si=gLhfkVW_PmWHBQSs) +- [@video@Git Rebase --interactive: EXPLAINED](https://youtu.be/H7RFt0Pxxp8?si=gLhfkVW_PmWHBQSs) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/git-reflog@hru0sL1-D4bJSQI1efEyU.md b/src/data/roadmaps/git-github/content/git-reflog@hru0sL1-D4bJSQI1efEyU.md index 5f6131028..075ee0680 100644 --- a/src/data/roadmaps/git-github/content/git-reflog@hru0sL1-D4bJSQI1efEyU.md +++ b/src/data/roadmaps/git-github/content/git-reflog@hru0sL1-D4bJSQI1efEyU.md @@ -2,9 +2,9 @@ Git reflog is a powerful tool in Git that keeps a record of all the changes made to the branches and commits in your repository, including actions that are not part of the regular commit history, such as resetting branches or checking out commits. It's particularly useful for recovering lost commits or understanding the history of changes in your repository, even if those changes are not reflected in the normal commit history.Reflog stands for "reference log." It records when the tip of branches or other references (like HEAD) is updated in your repository. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@Git - git-reflog Documentation](https://git-scm.com/docs/git-reflog) - [@article@What is the Git Reflog? | Learn Version Control with Git](https://www.git-tower.com/learn/git/faq/what-is-git-reflog) - [@video@Learn Git Essentials 12: Git Reflog](https://youtu.be/RVu8lpS7JFY?si=eNGBpsYfHtlyPClj) -- [@video@Git Reflog Command. Get all log details of the reference using git reflog show command](https://youtu.be/I4f4pddD16g?si=0Ny7xOJgiPgdfuh6) +- [@video@Git Reflog Command. Get all log details of the reference using git reflog show command](https://youtu.be/I4f4pddD16g?si=0Ny7xOJgiPgdfuh6) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/git-remotes@aWx9WHUrgofcTr8B-fQYe.md b/src/data/roadmaps/git-github/content/git-remotes@aWx9WHUrgofcTr8B-fQYe.md index b2bb3f6f5..6895d8362 100644 --- a/src/data/roadmaps/git-github/content/git-remotes@aWx9WHUrgofcTr8B-fQYe.md +++ b/src/data/roadmaps/git-github/content/git-remotes@aWx9WHUrgofcTr8B-fQYe.md @@ -1 +1,8 @@ -# Git Remotes \ No newline at end of file +# Git Remotes + +In Git, a remote is a reference to a repository that exists on another server or system. Remotes allow you to access and interact with a copy of your repository that is stored elsewhere, making it possible to collaborate with others, share your work, and maintain multiple copies of your repository for backup and disaster recovery purposes. When you add a remote to your local repository, Git creates a reference to the remote repository, enabling you to push changes from your local repository to the remote one, pull changes from the remote to your local one, or fetch changes from the remote without updating your local copy. This enables distributed development and helps maintain a centralized version of your project's history, making it easier to track changes, manage conflicts, and ensure that everyone has access to the most up-to-date code. + +Visit the following resources to learn more: + +- [@article@About remote repositories](https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories) +- [@video@What is a Remote Repository? [Beginner Git Tutorial]](https://www.youtube.com/watch?v=Lb4yvfrX_7I) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/git-reset@igrR7LguU1jemg_mf_AD6.md b/src/data/roadmaps/git-github/content/git-reset@igrR7LguU1jemg_mf_AD6.md index 4a95f04ab..8db3f100f 100644 --- a/src/data/roadmaps/git-github/content/git-reset@igrR7LguU1jemg_mf_AD6.md +++ b/src/data/roadmaps/git-github/content/git-reset@igrR7LguU1jemg_mf_AD6.md @@ -1 +1,8 @@ -# git reset \ No newline at end of file +# git reset + +Git reset is a command that allows you to "undo" or reset your current branch to a previous state by moving its HEAD pointer, effectively discarding changes made since then. When using git reset, it's essential to specify one of the three modes: soft, hard, or mixed. The mode you choose will determine how Git interacts with files in your working directory and staging area. + +Visit the following resources to learn more: + +- [@article@Git reset](https://www.atlassian.com/git/tutorials/undoing-changes/git-reset) +- [@video@Git Reset | How to Use Git Reset | Learn Git](https://www.youtube.com/watch?v=s1idhUiCk38) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/git-revert@dLr55Om7IOvI53c1DgTKc.md b/src/data/roadmaps/git-github/content/git-revert@dLr55Om7IOvI53c1DgTKc.md index 922d46c3e..38f39e8e4 100644 --- a/src/data/roadmaps/git-github/content/git-revert@dLr55Om7IOvI53c1DgTKc.md +++ b/src/data/roadmaps/git-github/content/git-revert@dLr55Om7IOvI53c1DgTKc.md @@ -1 +1,14 @@ -# git revert \ No newline at end of file +# git revert + +Git revert is a command that allows you to "undo" or revert specific commits in your Git repository. It creates a new commit that reverses the changes made by the specified commit(s), effectively rolling back your code to a previous state. + +Here are some key things to know about `git revert`: + +- Reverts changes, not moves HEAD: Unlike `git reset`, which can move your current branch's head to a different point in history, `git revert` creates new commits that reverse the changes made by specific commit(s). +- Creates new commits: Each time you use `git revert`, it creates a new commit that undoes the specified change. This means your Git history will still contain all previous commits. +- Can be used with multiple commits: If you want to revert multiple commits, simply specify their hashes or references (e.g., branch names) separated by commas. + +Visit the following resources to learn more: + +- [@article@Git Revert](https://medium.com/@meghasharmaa704/git-revert-84727b543c17) +- [@video@Git Revert - Visualised](https://www.youtube.com/watch?v=XJqQPNudPSY) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/git-stash-basics@X9K3PBpGsMoXkJsKdJPI7.md b/src/data/roadmaps/git-github/content/git-stash-basics@X9K3PBpGsMoXkJsKdJPI7.md index d459ecde8..e9561ebfb 100644 --- a/src/data/roadmaps/git-github/content/git-stash-basics@X9K3PBpGsMoXkJsKdJPI7.md +++ b/src/data/roadmaps/git-github/content/git-stash-basics@X9K3PBpGsMoXkJsKdJPI7.md @@ -1 +1,14 @@ -# Git Stash Basics \ No newline at end of file +# Git Stash Basics + +Git stash allows you to temporarily save your changes, or "stashes", when they're not yet ready for commit. This feature is useful when you need to work on multiple tasks, and want to switch between them without committing changes that are not complete. By using `git stash`, you can quickly stash uncommitted changes, reset the working directory to a clean state, and then apply the stashed changes later when they're ready for commit. This helps avoid cluttering the commit history with incomplete work, and allows you to maintain a clean and organized repository by separating your progress on different tasks. + +To apply a stash in Git, you can use the following commands: + +- `git stash apply`: This command applies the topmost stash (the most recent one) by default. It will merge the stashed changes into your current working directory. +- `git stash apply `: If you want to specify a particular stash, you can use its name instead of default. For example, if you've stored multiple stashes and want to apply an earlier one, you can use . +- `git stash pop`: This command is similar to apply, but it also automatically deletes the applied stash from the stash list. If you need more control over which stash to apply, using pop might be a better option. + +Visit the following resources to learn more: + +- [@article@Git stash](https://www.atlassian.com/git/tutorials/saving-changes/git-stash) +- [@article@A practical guide to using the git stash command](https://opensource.com/article/21/4/git-stash) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/git-vs-other-vcs@_jSTrYN9G8EsGHkbusKPU.md b/src/data/roadmaps/git-github/content/git-vs-other-vcs@_jSTrYN9G8EsGHkbusKPU.md index 3403156db..79b1ab817 100644 --- a/src/data/roadmaps/git-github/content/git-vs-other-vcs@_jSTrYN9G8EsGHkbusKPU.md +++ b/src/data/roadmaps/git-github/content/git-vs-other-vcs@_jSTrYN9G8EsGHkbusKPU.md @@ -1 +1,12 @@ -# Git vs Other VCS \ No newline at end of file +# Git vs Other VCS + +Git has become the de facto standard for source control in software development, but it's not the only version control system (VCS) available. Here are some key differences between Git and other popular VCS: + +- Mercurial: Mercurial is a distributed VCS that uses a similar architecture to Git. However, it has a more centralized approach and doesn't use hashes for tracking changes. +- Subversion: Subversion is a centralized VCS that's often compared to Git. While both systems support branching and merging, Subversion requires a central server to manage the repository. +- Perforce: Perforce is a commercial VCS that's designed for large-scale development projects. It uses a centralized approach and has features like build automation and issue tracking. +- CVS: CVS is an older version control system that's still in use today. However, it lacks many modern features and is often considered outdated. + +Visit the following resources to learn more: + +- [@article@Git vs. Other VCS: A Comparative Analysis](https://medium.com/@pascalchinedu2000/git-vs-other-vcs-a-comparative-analysis-5cb03ad58e0e) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/git-worktree@4dxVN81rXWn6VZqK99yq0.md b/src/data/roadmaps/git-github/content/git-worktree@4dxVN81rXWn6VZqK99yq0.md index 10c701bfb..b3d220880 100644 --- a/src/data/roadmaps/git-github/content/git-worktree@4dxVN81rXWn6VZqK99yq0.md +++ b/src/data/roadmaps/git-github/content/git-worktree@4dxVN81rXWn6VZqK99yq0.md @@ -1 +1,8 @@ -# Git Worktree \ No newline at end of file +# Git Worktree + +A Git worktree allows you to create multiple working directories for a single repository, each with its own checkout and index. Unlike a regular checkout, which creates a new working directory for a specific branch and updates your IDE's configuration settings, a Git worktree does not require you to switch between branches using git checkout. This means you can have multiple branches checked out at the same time without affecting each other or requiring changes to your IDE configurations. By creating a separate worktree for each branch, you can stage changes independently and maintain distinct working directories without impacting the main repository or its working directory. + +Visit the following resources to learn more: + +- [@article@Git Worktree](https://www.gitkraken.com/learn/git/git-worktree) +- [@video@Manage Branches easily using Git Worktree](https://www.youtube.com/watch?v=cRunWRC8ye0) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/staged-changes@mzjtCdpke1ayHcEuS-YUS.md b/src/data/roadmaps/git-github/content/staged-changes@mzjtCdpke1ayHcEuS-YUS.md index 0ccce4e22..5ead195b0 100644 --- a/src/data/roadmaps/git-github/content/staged-changes@mzjtCdpke1ayHcEuS-YUS.md +++ b/src/data/roadmaps/git-github/content/staged-changes@mzjtCdpke1ayHcEuS-YUS.md @@ -1 +1,3 @@ -# Staged Changes \ No newline at end of file +# Staged Changes + +To view the changes you've staged with `git add`, but not yet committed, use `git diff --cached`. This command compares the staged files against their original versions in the repository. It's a quick way to review what you're about to commit before finalizing it. \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/unstaged-changes@uxqJzQFRcALqatNRIWR0w.md b/src/data/roadmaps/git-github/content/unstaged-changes@uxqJzQFRcALqatNRIWR0w.md index f702a7de5..aafe19caa 100644 --- a/src/data/roadmaps/git-github/content/unstaged-changes@uxqJzQFRcALqatNRIWR0w.md +++ b/src/data/roadmaps/git-github/content/unstaged-changes@uxqJzQFRcALqatNRIWR0w.md @@ -1 +1,6 @@ -# Unstaged Changes \ No newline at end of file +# Unstaged Changes + +For changes that are not yet staged with `git add`, such as untracked new files or modified existing ones, use `git diff --unified`. This command compares your working directory against the latest committed version of each file. It's a useful tool for reviewing any local modifications before deciding whether to stage them for future commits. + +- [@article@What are unstaged changes in GitHub?](https://stackoverflow.com/questions/10954329/whats-the-unstaged-changes-in-github) +- [@article@How to unstage files in Git](https://www.git-tower.com/learn/git/faq/git-unstage) \ No newline at end of file From f30772d3306b891dad7f7d420aabcaf05c81df7e Mon Sep 17 00:00:00 2001 From: Stavros Siamantas Date: Fri, 16 Aug 2024 18:12:35 +0300 Subject: [PATCH 006/120] Add content to git/github roadmap (#6605) --- .../content/--mixed@qis7Z5VRxMcOmbesQlegZ.md | 2 ++ .../basic-git-usage@PtU5Qwfzn3N1i3oRlCGoR.md | 2 +- .../between-branches@O-zoAWkDvyn7B8_TmY257.md | 2 ++ .../between-commits@Rwpeltygwzcf6hnuZNURE.md | 2 ++ ...borators--members@_ft-uvXt6s_xrcMT3fbSF.md | 4 +++- .../github-actions@AmetdCURXXob5TUsikAab.md | 4 +++- .../github-api@NV2HAXLEN7tskfgyFrbaf.md | 2 +- .../github-cli@h9cf_dh_pwjialOXOlNW-.md | 2 +- ...ithub-discussions@snWQHCQECZyUXHdn6ppIk.md | 2 +- .../github-education@pFyMiyNQ16-kP7jKaKKEU.md | 2 +- .../github-interface@qZFtRABvlBbVvsy6T00J2.md | 2 +- ...hub-organizations@RMrxQLhrINO5g4Mhxh5qS.md | 2 +- .../github-projects@DzFJDdqnSy5GeGHWOpcVo.md | 2 +- .../github-releases@YmnTrjJtqHPXbEVrP8vd7.md | 2 +- .../github-wikis@Ddkss13_qDJTquDHbVTVs.md | 2 +- .../gitignore@oz2oRAhaEQb0Fm3aRJQG8.md | 2 +- ...andling-conflicts@9Dt4Gyiiq5jteWSKxsRMK.md | 10 +++++++++- .../content/head@V8nLIvddyOKTzEjOJX5GW.md | 9 ++++++++- .../content/history@zen3RRdK9_nPAYgicRoHk.md | 8 +++++++- ...llation-and-setup@vHfpoVbOW0DHNtiy0VN4X.md | 12 +++++++++++- ...lling-git-locally@v7hCNbgPByi3YiLSs46BK.md | 15 ++++++++++++++- .../issue-management@kGnZifvXbHBf5zXIsfAQw.md | 15 ++++++++++++++- .../content/issues@crdllx5cH_seIpgVPvHg_.md | 19 ++++++++++++++++++- .../kanban-boards@RFJgfuxoVxt22QlwLI5mW.md | 11 ++++++++++- ...lling-issues--prs@y4DkB5NvTh41IeT0G2gr-.md | 15 ++++++++++++++- .../learn-the-basics@HlUUGj3dOZ68t4gIjerXh.md | 2 +- ...ear-vs-non-linear@lXC07j6dOa3rQixY1P-Ob.md | 12 +++++++++++- ...-vs-global-config@tVvxC5JQgUb_B8kOqYpD8.md | 12 +++++++++++- .../managing-remotes@sBQOInoFBU9XfkPZ-JlyT.md | 15 ++++++++++++++- .../managing-tags@NeU38WPbEphJuJ_AMkH82.md | 15 ++++++++++++++- .../content/markdown@1Ulxl4VUvRSfyCPpi-iv8.md | 15 ++++++++++++++- ...rketplace-actions@SsogoCgJIbeTD6tk8UhTe.md | 14 +++++++++++++- .../content/mentions@oWMaOWU06juoIuzXNe-wt.md | 4 +++- .../merge-strategies@0rHDUbAdXqH9zQW2VfJ8v.md | 10 +++++++++- .../merging-basics@sNuy6NMjLOEkJlqdEjFPq.md | 9 ++++++++- 35 files changed, 226 insertions(+), 32 deletions(-) diff --git a/src/data/roadmaps/git-github/content/--mixed@qis7Z5VRxMcOmbesQlegZ.md b/src/data/roadmaps/git-github/content/--mixed@qis7Z5VRxMcOmbesQlegZ.md index d0d7f10db..34eedf489 100644 --- a/src/data/roadmaps/git-github/content/--mixed@qis7Z5VRxMcOmbesQlegZ.md +++ b/src/data/roadmaps/git-github/content/--mixed@qis7Z5VRxMcOmbesQlegZ.md @@ -2,4 +2,6 @@ When using mixed mode, the HEAD pointer is moved to the specified commit. However, files in your working directory remain as they were before the reset. The staging area (index) is updated to match the specified commit. +Visit the following resources to learn more: + - [@official@--mixed documentation](https://git-scm.com/docs/git-reset#Documentation/git-reset.txt---hard) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/basic-git-usage@PtU5Qwfzn3N1i3oRlCGoR.md b/src/data/roadmaps/git-github/content/basic-git-usage@PtU5Qwfzn3N1i3oRlCGoR.md index 66d29c2dc..2ae005fcb 100644 --- a/src/data/roadmaps/git-github/content/basic-git-usage@PtU5Qwfzn3N1i3oRlCGoR.md +++ b/src/data/roadmaps/git-github/content/basic-git-usage@PtU5Qwfzn3N1i3oRlCGoR.md @@ -2,7 +2,7 @@ Starting with a new project, you'll use `git init` to initialize a repository and then make changes using `git add`. Once ready, commit your work with `git commit`. If mistakes occur, `git reset` can help correct them. You'll also interact with remote repositories, whether private or public, by adding remotes (git remote add) and managing their connections through commands like `git fetch`, `git push`, and `git pull`. -Learn more from the following resources: +Visit the following resources to learn more: - [@video@Git Tutorial for Beginners: Learn Git in 1 Hour](https://www.youtube.com/watch?v=8JJ101D3knE&t=1135s) - [@article@Git ignore](https://www.atlassian.com/git/tutorials/saving-changes/gitignore) diff --git a/src/data/roadmaps/git-github/content/between-branches@O-zoAWkDvyn7B8_TmY257.md b/src/data/roadmaps/git-github/content/between-branches@O-zoAWkDvyn7B8_TmY257.md index 15b35a3aa..6f1bab014 100644 --- a/src/data/roadmaps/git-github/content/between-branches@O-zoAWkDvyn7B8_TmY257.md +++ b/src/data/roadmaps/git-github/content/between-branches@O-zoAWkDvyn7B8_TmY257.md @@ -2,5 +2,7 @@ When comparing the differences between two branches, such as a feature branch and its upstream parent branch, use `git diff ..`. This command displays the changes made on the feature branch relative to the parent branch. It's useful for reviewing the impact of new features or changes before merging them into your mainline. +Visit the following resources to learn more: + - [@article@How to compare branches in Git diff](https://scribehow.com/shared/How_to_Compare_Branches_in_GitHub__xsotezV-S1O-GL0PquqJwQ) - [@article@How can I see the differences between two branches?](https://stackoverflow.com/questions/9834689/how-can-i-see-the-differences-between-two-branches) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/between-commits@Rwpeltygwzcf6hnuZNURE.md b/src/data/roadmaps/git-github/content/between-commits@Rwpeltygwzcf6hnuZNURE.md index 30f34c837..17778b7a4 100644 --- a/src/data/roadmaps/git-github/content/between-commits@Rwpeltygwzcf6hnuZNURE.md +++ b/src/data/roadmaps/git-github/content/between-commits@Rwpeltygwzcf6hnuZNURE.md @@ -2,5 +2,7 @@ To compare two specific commits in your Git history, use git diff followed by the hashes of the commits. This will show you the changes made between those two points, including added, modified, and deleted lines. +Visit the following resources to learn more: + - [@article@Comparing changes with Git diff](https://refine.dev/blog/git-diff-command/) - [@video@Git Diff 2 Different Commits, Tags or Branches](https://www.youtube.com/watch?v=uq5VWPDCtFo) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/collaborators--members@_ft-uvXt6s_xrcMT3fbSF.md b/src/data/roadmaps/git-github/content/collaborators--members@_ft-uvXt6s_xrcMT3fbSF.md index 025df8f50..21c18b27c 100644 --- a/src/data/roadmaps/git-github/content/collaborators--members@_ft-uvXt6s_xrcMT3fbSF.md +++ b/src/data/roadmaps/git-github/content/collaborators--members@_ft-uvXt6s_xrcMT3fbSF.md @@ -2,5 +2,7 @@ In GitHub, collaborators and members refer to individuals who contribute to or have access to your repository. Collaborators are users who have been granted permission to contribute code, make changes, and push updates to your repository, whereas members are the owners of a repository, including organization owners who have full control over their team's repositories. Members can be either individual collaborators or part of an organization team, with varying levels of access and permissions based on their role within the team. +Visit the following resources to learn more: + - [@article@Inviting collaborators to a personal repository](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-access-to-your-personal-repositories/inviting-collaborators-to-a-personal-repository) --[@official@REST API endpoints for collaborators](https://docs.github.com/en/rest/collaborators/collaborators?apiVersion=2022-11-28) +- [@official@REST API endpoints for collaborators](https://docs.github.com/en/rest/collaborators/collaborators?apiVersion=2022-11-28) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/github-actions@AmetdCURXXob5TUsikAab.md b/src/data/roadmaps/git-github/content/github-actions@AmetdCURXXob5TUsikAab.md index 0de2b32f4..08434a058 100644 --- a/src/data/roadmaps/git-github/content/github-actions@AmetdCURXXob5TUsikAab.md +++ b/src/data/roadmaps/git-github/content/github-actions@AmetdCURXXob5TUsikAab.md @@ -4,5 +4,7 @@ GitHub Actions is a very useful tool for automation, allowing developers to auto One of the best ways to learn about GitHub Actions is through the course offered by Microsoft Learn. This course is well-structured and provides practical examples that are concise and easy to understand. +Visit the following resources to learn more: + - [@course@Microsoft Learn: Introduction to GitHub Actions](https://learn.microsoft.com/en-us/collections/n5p4a5z7keznp5) -- [@course@YouTube: GitHub Actions Playlist](https://www.youtube.com/watch?v=-hVG9z0fCac&list=PLArH6NjfKsUhvGHrpag7SuPumMzQRhUKY&pp=iAQB) +- [@course@YouTube: GitHub Actions Playlist](https://www.youtube.com/watch?v=-hVG9z0fCac&list=PLArH6NjfKsUhvGHrpag7SuPumMzQRhUKY&pp=iAQB) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/github-api@NV2HAXLEN7tskfgyFrbaf.md b/src/data/roadmaps/git-github/content/github-api@NV2HAXLEN7tskfgyFrbaf.md index 5521184a1..741ce88f5 100644 --- a/src/data/roadmaps/git-github/content/github-api@NV2HAXLEN7tskfgyFrbaf.md +++ b/src/data/roadmaps/git-github/content/github-api@NV2HAXLEN7tskfgyFrbaf.md @@ -2,7 +2,7 @@ The GitHub API is a powerful tool that allows developers to interact with the GitHub platform programmatically. It provides access to various GitHub features, such as user data, repository information, and commit history, through both REST and GraphQL interfaces. The API supports authentication, implements rate limiting, and offers webhooks for real-time notifications, enabling developers to automate tasks, create custom integrations, and build applications that leverage GitHub's functionality. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@official API Docs](https://docs.github.com/en/rest?apiVersion=2022-11-28) - [@article@Getting started](https://docs.github.com/en/rest/using-the-rest-api/getting-started-with-the-rest-api?apiVersion=2022-11-28) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/github-cli@h9cf_dh_pwjialOXOlNW-.md b/src/data/roadmaps/git-github/content/github-cli@h9cf_dh_pwjialOXOlNW-.md index 1ccb67f2d..d92e7a6bd 100644 --- a/src/data/roadmaps/git-github/content/github-cli@h9cf_dh_pwjialOXOlNW-.md +++ b/src/data/roadmaps/git-github/content/github-cli@h9cf_dh_pwjialOXOlNW-.md @@ -2,7 +2,7 @@ GitHub CLI is a command-line interface tool that brings GitHub functionality to your terminal. It allows developers to interact with GitHub directly from the command line, enabling them to manage repositories, create issues, pull requests, and perform various GitHub operations without leaving their terminal environment. This powerful tool streamlines workflows, enhances productivity, and provides a seamless integration between local development and GitHub's collaborative features, making it easier for developers to incorporate GitHub into their daily coding routines. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@official GitHub CLI Docs](https://cli.github.com/) - [@video@What is the GitHub CLI?](https://www.youtube.com/watch?v=uy_PEGgUF4U) diff --git a/src/data/roadmaps/git-github/content/github-discussions@snWQHCQECZyUXHdn6ppIk.md b/src/data/roadmaps/git-github/content/github-discussions@snWQHCQECZyUXHdn6ppIk.md index bc52e5753..733f9dd36 100644 --- a/src/data/roadmaps/git-github/content/github-discussions@snWQHCQECZyUXHdn6ppIk.md +++ b/src/data/roadmaps/git-github/content/github-discussions@snWQHCQECZyUXHdn6ppIk.md @@ -2,7 +2,7 @@ GitHub Discussions is a collaborative communication feature within GitHub repositories that provides a dedicated space for community conversations, questions, and knowledge sharing. It allows team members, contributors, and users to engage in threaded discussions, share ideas, ask for help, and make announcements outside of specific code changes or issues. This feature enhances project collaboration by centralizing important conversations, reducing noise in the issue tracker, and fostering a sense of community around open-source projects or team initiatives. -Learn more from the following resources: +Visit the following resources to learn more: - [@video@What is GitHub Discussions?](https://www.youtube.com/watch?v=bErGYN3Ljz8) - [@official@official GitHub Discussions Docs](https://docs.github.com/en/discussions) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/github-education@pFyMiyNQ16-kP7jKaKKEU.md b/src/data/roadmaps/git-github/content/github-education@pFyMiyNQ16-kP7jKaKKEU.md index 1ebef25f1..520c929f7 100644 --- a/src/data/roadmaps/git-github/content/github-education@pFyMiyNQ16-kP7jKaKKEU.md +++ b/src/data/roadmaps/git-github/content/github-education@pFyMiyNQ16-kP7jKaKKEU.md @@ -2,7 +2,7 @@ GitHub Education is a program that provides free and discounted access to GitHub's developer tools, services, and resources for students, teachers, and researchers. This program aims to support education and research in software development, by making it easier for students and educators to learn, collaborate, and build projects on GitHub. By using GitHub Education, students can gain hands-on experience with real-world coding challenges, while educators can create a more engaging and interactive learning environment. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@official GitHub Education Docs](https://education.github.com/) - [@video@GitHub GitHub Education: free programs, technology, and opportunities available for Students](https://www.youtube.com/watch?v=HIVFdN9VGgw) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/github-interface@qZFtRABvlBbVvsy6T00J2.md b/src/data/roadmaps/git-github/content/github-interface@qZFtRABvlBbVvsy6T00J2.md index 4a2d39a3b..14b46849c 100644 --- a/src/data/roadmaps/git-github/content/github-interface@qZFtRABvlBbVvsy6T00J2.md +++ b/src/data/roadmaps/git-github/content/github-interface@qZFtRABvlBbVvsy6T00J2.md @@ -2,7 +2,7 @@ The GitHub interface is a web-based platform that provides a user-friendly environment for managing and collaborating on software projects. It offers a comprehensive set of tools and features accessible through an intuitive layout, including repository management, code browsing, issue tracking, pull requests, and project boards. The interface is designed to streamline workflows, facilitate team communication, and enhance productivity for developers of all skill levels. With its clean and organized structure, users can easily navigate between different sections of their projects, review code changes, manage tasks, and interact with team members, making it an essential tool for modern software development and version control. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@GitHub Desktop App](https://github.com/apps/desktop) - [@article@Getting Started with GitHub](https://digital.gov/resources/an-introduction-github/) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/github-organizations@RMrxQLhrINO5g4Mhxh5qS.md b/src/data/roadmaps/git-github/content/github-organizations@RMrxQLhrINO5g4Mhxh5qS.md index a270e98c3..7942fc542 100644 --- a/src/data/roadmaps/git-github/content/github-organizations@RMrxQLhrINO5g4Mhxh5qS.md +++ b/src/data/roadmaps/git-github/content/github-organizations@RMrxQLhrINO5g4Mhxh5qS.md @@ -2,7 +2,7 @@ GitHub Organizations are shared accounts that provide centralized management and collaboration for multiple projects and teams. They offer enhanced administrative controls, allowing owners to create teams with specific access permissions, manage member roles, and oversee repositories at scale. Organizations facilitate better project coordination, resource sharing, and team communication, making them ideal for businesses, open-source projects, and large-scale collaborations. With features like team discussions, project boards, and audit logs, GitHub Organizations streamline workflow management and foster a more structured and secure development environment. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@About Organizations](https://docs.github.com/en/organizations/collaborating-with-groups-in-organizations/about-organizations) - [@video@Set up a GitHub Organization](https://www.youtube.com/watch?v=XowSSIhJFuk) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/github-projects@DzFJDdqnSy5GeGHWOpcVo.md b/src/data/roadmaps/git-github/content/github-projects@DzFJDdqnSy5GeGHWOpcVo.md index c64d91fb0..ec50b44d4 100644 --- a/src/data/roadmaps/git-github/content/github-projects@DzFJDdqnSy5GeGHWOpcVo.md +++ b/src/data/roadmaps/git-github/content/github-projects@DzFJDdqnSy5GeGHWOpcVo.md @@ -2,7 +2,7 @@ GitHub Projects is a flexible project management tool integrated directly into GitHub repositories. It allows teams to create customizable project boards, track issues and pull requests, and manage workflows using Kanban-style columns or table views. With features like automated workflows, custom fields, and various visualization options, GitHub Projects helps teams organize, prioritize, and track work across multiple repositories. This tool enhances collaboration, increases transparency, and streamlines project management processes, making it easier for developers and stakeholders to stay aligned on project goals and progress. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@About Projects](https://docs.github.com/en/issues/planning-and-tracking-with-projects/learning-about-projects/about-projects) - [@video@How to use Projects Roadmap](https://www.youtube.com/watch?v=D80u__nYYWw) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/github-releases@YmnTrjJtqHPXbEVrP8vd7.md b/src/data/roadmaps/git-github/content/github-releases@YmnTrjJtqHPXbEVrP8vd7.md index c76dd74c1..ddd31d2eb 100644 --- a/src/data/roadmaps/git-github/content/github-releases@YmnTrjJtqHPXbEVrP8vd7.md +++ b/src/data/roadmaps/git-github/content/github-releases@YmnTrjJtqHPXbEVrP8vd7.md @@ -2,7 +2,7 @@ GitHub Releases is a feature that allows developers to package and distribute software versions to users. It provides a way to create tagged points in a repository's history, attach binary files (such as compiled executables or packaged code), and include release notes. This feature makes it easy to track and manage different versions of a project, share pre-compiled binaries with users who may not want to build from source, and communicate changes and updates to the community. GitHub Releases integrates seamlessly with Git tags and can be automated as part of a continuous integration and deployment pipeline. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@About Releases](https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases) - [@article@REST API endpoints for releases](https://docs.github.com/en/rest/releases/releases?apiVersion=2022-11-28) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/github-wikis@Ddkss13_qDJTquDHbVTVs.md b/src/data/roadmaps/git-github/content/github-wikis@Ddkss13_qDJTquDHbVTVs.md index db7a9b424..0ec044cb6 100644 --- a/src/data/roadmaps/git-github/content/github-wikis@Ddkss13_qDJTquDHbVTVs.md +++ b/src/data/roadmaps/git-github/content/github-wikis@Ddkss13_qDJTquDHbVTVs.md @@ -2,7 +2,7 @@ GitHub Wikis are collaborative documentation spaces integrated directly into GitHub repositories. They provide a platform for teams to create, edit, and organize project-related information, such as documentation, guidelines, and FAQs. Wikis support Markdown formatting, making it easy to structure content and include images or links. With version control and the ability to clone wiki repositories, teams can collaboratively maintain up-to-date documentation alongside their code, enhancing project understanding and facilitating knowledge sharing among contributors and users. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@About Wikis](https://docs.github.com/en/communities/documenting-your-project-with-wikis/about-wikis) - [@article@Documenting your project with Wikis](https://docs.github.com/en/communities/documenting-your-project-with-wikis) diff --git a/src/data/roadmaps/git-github/content/gitignore@oz2oRAhaEQb0Fm3aRJQG8.md b/src/data/roadmaps/git-github/content/gitignore@oz2oRAhaEQb0Fm3aRJQG8.md index 2479a2fab..6067bff9c 100644 --- a/src/data/roadmaps/git-github/content/gitignore@oz2oRAhaEQb0Fm3aRJQG8.md +++ b/src/data/roadmaps/git-github/content/gitignore@oz2oRAhaEQb0Fm3aRJQG8.md @@ -2,7 +2,7 @@ Ignored files are tracked in a special file named `.gitignore` that is checked in at the root of your repository. There is no explicit git ignore command: instead the `.gitignore` file must be edited and committed by hand when you have new files that you wish to ignore. `.gitignore` files contain patterns that are matched against file names in your repository to determine whether or not they should be ignored. -Learn more from the following resources: +Visit the following resources to learn more: - [@official@gitignore Documentation](https://git-scm.com/docs/gitignore/en) - [@article@.gitignore file - ignoring files in Git | Atlassian Git Tutorial](https://www.atlassian.com/git/tutorials/saving-changes/gitignore) diff --git a/src/data/roadmaps/git-github/content/handling-conflicts@9Dt4Gyiiq5jteWSKxsRMK.md b/src/data/roadmaps/git-github/content/handling-conflicts@9Dt4Gyiiq5jteWSKxsRMK.md index f4dc596d7..521f61df4 100644 --- a/src/data/roadmaps/git-github/content/handling-conflicts@9Dt4Gyiiq5jteWSKxsRMK.md +++ b/src/data/roadmaps/git-github/content/handling-conflicts@9Dt4Gyiiq5jteWSKxsRMK.md @@ -1 +1,9 @@ -# Handling Conflicts \ No newline at end of file +# Handling Conflicts + +When multiple developers work on the same project simultaneously, conflicts can arise during the merging process. This occurs when changes made by different individuals overlap or contradict each other in a specific code file. In such situations, Git's conflict resolution mechanism comes into play, allowing users to manually resolve these issues and merge the conflicting changes. + +Visit the following resources to learn more: + +- [@article@Resolving a merge conflict using the command line](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/addressing-merge-conflicts/resolving-a-merge-conflict-using-the-command-line) +- [@article@Resolve merge conflicts in Visual Studio](https://learn.microsoft.com/en-us/visualstudio/version-control/git-resolve-conflicts?view=vs-2022) +- [@video@Resolve Git MERGE CONFLICTS: The Definitive Guide](https://www.youtube.com/watch?v=Sqsz1-o7nXk) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/head@V8nLIvddyOKTzEjOJX5GW.md b/src/data/roadmaps/git-github/content/head@V8nLIvddyOKTzEjOJX5GW.md index 73f340a32..70969c9a4 100644 --- a/src/data/roadmaps/git-github/content/head@V8nLIvddyOKTzEjOJX5GW.md +++ b/src/data/roadmaps/git-github/content/head@V8nLIvddyOKTzEjOJX5GW.md @@ -1 +1,8 @@ -# HEAD \ No newline at end of file +# HEAD + +The `HEAD` file is at the core of how Git knows the SHA-1 of the last commit when running commands like `git branch `. It serves as a symbolic reference, pointing to the current branch. However, in rare cases, HEAD can contain the actual SHA-1 value of a Git object, such as when checking out a tag, commit, or remote branch, which puts your repository in a "detached HEAD" state. + +Visit the following resources to learn more: + +- [@official@Git Internals - Git References - The HEAD](https://git-scm.com/book/en/v2/Git-Internals-Git-References#:~:text=want%20to%20create.-,The%20HEAD,-The%20question%20now) +- [@video@Learn Git Essentials: Head & Detached Head](https://www.youtube.com/watch?v=HvDjbAa9ZsY) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/history@zen3RRdK9_nPAYgicRoHk.md b/src/data/roadmaps/git-github/content/history@zen3RRdK9_nPAYgicRoHk.md index 8d32e8eac..f1d991aa8 100644 --- a/src/data/roadmaps/git-github/content/history@zen3RRdK9_nPAYgicRoHk.md +++ b/src/data/roadmaps/git-github/content/history@zen3RRdK9_nPAYgicRoHk.md @@ -1 +1,7 @@ -# History \ No newline at end of file +# History + +The history of a Git repository is a record of all commits made over time, including changes to files, commit messages, and metadata. This history is stored as a series of snapshots, with each commit representing a new version of the codebase. + +Visit the following resources to learn more: + +- [@official@Git Basics - Viewing the Commit History](https://git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-History) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/installation-and-setup@vHfpoVbOW0DHNtiy0VN4X.md b/src/data/roadmaps/git-github/content/installation-and-setup@vHfpoVbOW0DHNtiy0VN4X.md index e575b1c63..472dd064a 100644 --- a/src/data/roadmaps/git-github/content/installation-and-setup@vHfpoVbOW0DHNtiy0VN4X.md +++ b/src/data/roadmaps/git-github/content/installation-and-setup@vHfpoVbOW0DHNtiy0VN4X.md @@ -1 +1,11 @@ -# Installation and Setup \ No newline at end of file +# Installation and Setup + +The GitHub CLI can be installed on Windows, macOS, and Linux operating systems. Installation options include downloading binaries directly from the release page or using package managers (such as homebrew, pip, etc). + +Once installed, setting up the GitHub CLI typically involves authenticating with your GitHub account by running `gh auth login` in your terminal. This step is essential for linking your GitHub credentials to the CLI, allowing you to interact with your repositories and perform various actions. + +Visit the following resources to learn more: + +- [@official@GitHub CLI - Installation](https://github.com/cli/cli?tab=readme-ov-file#installation) +- [@official@GitHub CLI - Release](https://github.com/cli/cli/releases/) +- [@official@GitHub CLI quickstart](https://docs.github.com/en/github-cli/github-cli/quickstart) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/installing-git-locally@v7hCNbgPByi3YiLSs46BK.md b/src/data/roadmaps/git-github/content/installing-git-locally@v7hCNbgPByi3YiLSs46BK.md index 7546e9e98..c28f74d6e 100644 --- a/src/data/roadmaps/git-github/content/installing-git-locally@v7hCNbgPByi3YiLSs46BK.md +++ b/src/data/roadmaps/git-github/content/installing-git-locally@v7hCNbgPByi3YiLSs46BK.md @@ -1 +1,14 @@ -# Installing Git Locally \ No newline at end of file +# Installing Git Locally + +To use Git on your local machine, you need to install it first. The installation process varies depending on your operating system: + +- On Windows: Download the binary from the official Git or GitHub release page and follow the installation instructions. +- On macOS (using Homebrew): Run `brew install git` in your terminal. +- On Linux: Run `sudo apt-get install git` or `sudo yum install git` depending on your distribution. + +Once installed, you can verify the Git version by running `git --version` in your terminal. This will display the currently installed Git version. + +Visit the following resources to learn more: + +- [@official@Git - Downloads](https://git-scm.com/downloads) +- [@article@Install Git](https://github.com/git-guides/install-git) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/issue-management@kGnZifvXbHBf5zXIsfAQw.md b/src/data/roadmaps/git-github/content/issue-management@kGnZifvXbHBf5zXIsfAQw.md index 81448b9b1..0b3d7892a 100644 --- a/src/data/roadmaps/git-github/content/issue-management@kGnZifvXbHBf5zXIsfAQw.md +++ b/src/data/roadmaps/git-github/content/issue-management@kGnZifvXbHBf5zXIsfAQw.md @@ -1 +1,14 @@ -# Issue Management \ No newline at end of file +# Issue Management + +The GitHub CLI provides a range of features for managing issues within your repository. Here are some key actions you can perform: + +- Listing issues: Run `gh issue list` to view a list of all open and closed issues. +- Creating issues: Use `gh issue create --title "Issue Title" --body "Issue body"` to create a new issue with the specified title and body. +- Assigning issues: Run `gh issue assign ` to assign an issue to a specific user. +- Labelling issues: Use `gh issue label ` to add a label to an existing issue. +- Closing issues: Run `gh issue close ` to mark an issue as closed. + +Visit the following resources to learn more: + +- [@official@gh issue](https://cli.github.com/manual/gh_issue) +- [@video@Manage GitHub Issues From The Command Line Using GitHub CLI](https://www.youtube.com/watch?v=nuCQiP41jU0) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/issues@crdllx5cH_seIpgVPvHg_.md b/src/data/roadmaps/git-github/content/issues@crdllx5cH_seIpgVPvHg_.md index 6c7be6f39..65d714b13 100644 --- a/src/data/roadmaps/git-github/content/issues@crdllx5cH_seIpgVPvHg_.md +++ b/src/data/roadmaps/git-github/content/issues@crdllx5cH_seIpgVPvHg_.md @@ -1 +1,18 @@ -# Issues \ No newline at end of file +# Issues + +On GitHub, an issue is a way to track and report bugs, feature requests, or other problems with a repository. Here are some key aspects of issues: + +- Creating issues: Users can create new issues by submitting a form on the repository's Issues page. +- Issue titles and descriptions: Each issue has a title and body (description), which provide context for the problem or request. +- Assignees: Issues can be assigned to specific users, who are then responsible for addressing the issue. +- Labels: Labels are used to categorize issues by topic, priority, or other criteria. This helps filter and organize issues within a repository. +- States: Issues have states that reflect their status, such as "Open", "Closed", or "Pending". +- Comments: Users can comment on existing issues to discuss or provide additional context. +- Labels and milestones: Issues can be associated with labels (topics) and milestones (deadlines), which help filter and prioritize them. + +Issues are a core feature of GitHub repositories, enabling teams to collaborate effectively on resolving problems and implementing new features. + +Visit the following resources to learn more: + +- [@official@About Issues](https://docs.github.com/en/issues/tracking-your-work-with-issues/about-issues) +- [@video@What is GitHub Issues?](https://www.youtube.com/watch?v=6HWw7rhwvtY) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/kanban-boards@RFJgfuxoVxt22QlwLI5mW.md b/src/data/roadmaps/git-github/content/kanban-boards@RFJgfuxoVxt22QlwLI5mW.md index 1d812a8f3..4c1b8e378 100644 --- a/src/data/roadmaps/git-github/content/kanban-boards@RFJgfuxoVxt22QlwLI5mW.md +++ b/src/data/roadmaps/git-github/content/kanban-boards@RFJgfuxoVxt22QlwLI5mW.md @@ -1 +1,10 @@ -# Kanban Boards \ No newline at end of file +# Kanban Boards + +On GitHub, Kanban boards provide a visual representation of issues as they move through the development process. + +A Kanban board typically has columns representing different stages or states, such as "To-Do", "In-Progress", and "Done". Each issue is represented by a card on the board, which can be moved between columns as its state changes. Users can drag and drop issue cards to move them from one column to another, reflecting progress or completion. + +Visit the following resources to learn more: + +- [@official@Projects - Boards - Changing the layout of a view](https://docs.github.com/en/issues/planning-and-tracking-with-projects/customizing-views-in-your-project/changing-the-layout-of-a-view) +- [@video@GitHub Project Management - Create GitHub Project Board & Automations](https://www.youtube.com/watch?v=oPQgFxHcjAw) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/labelling-issues--prs@y4DkB5NvTh41IeT0G2gr-.md b/src/data/roadmaps/git-github/content/labelling-issues--prs@y4DkB5NvTh41IeT0G2gr-.md index c4caf4051..740c79771 100644 --- a/src/data/roadmaps/git-github/content/labelling-issues--prs@y4DkB5NvTh41IeT0G2gr-.md +++ b/src/data/roadmaps/git-github/content/labelling-issues--prs@y4DkB5NvTh41IeT0G2gr-.md @@ -1 +1,14 @@ -# Labelling Issues / PRs \ No newline at end of file +# Labelling Issues / PRs + +On GitHub, labels are a way to categorize issues and pull requests (PRs) by topic, priority, or other criteria. Some common labels used are: + +- `Bug` +- `Duplicate` +- `Enhancement` +- `Feature request` +- `High priority` +- `Needs feedback` + +Visit the following resources to learn more: + +- [@official@Managing labels](https://docs.github.com/en/issues/using-labels-and-milestones-to-track-work/managing-labels) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/learn-the-basics@HlUUGj3dOZ68t4gIjerXh.md b/src/data/roadmaps/git-github/content/learn-the-basics@HlUUGj3dOZ68t4gIjerXh.md index cf50892ad..3d3f2bd26 100644 --- a/src/data/roadmaps/git-github/content/learn-the-basics@HlUUGj3dOZ68t4gIjerXh.md +++ b/src/data/roadmaps/git-github/content/learn-the-basics@HlUUGj3dOZ68t4gIjerXh.md @@ -2,7 +2,7 @@ A Version Control System (VCS) is a tool that helps developers manage changes to their code over time. It allows multiple versions of a project to exist simultaneously, making it easier to collaborate with others and maintain a record of all modifications. -Learn more from the following resources: +Visit the following resources to learn more: - [@article@What is version control?](https://www.atlassian.com/git/tutorials/what-is-version-control) - [@article@What is Git? - The Complete Guide to Git](https://www.datacamp.com/blog/all-about-git) diff --git a/src/data/roadmaps/git-github/content/linear-vs-non-linear@lXC07j6dOa3rQixY1P-Ob.md b/src/data/roadmaps/git-github/content/linear-vs-non-linear@lXC07j6dOa3rQixY1P-Ob.md index 39f733120..57e61d1e2 100644 --- a/src/data/roadmaps/git-github/content/linear-vs-non-linear@lXC07j6dOa3rQixY1P-Ob.md +++ b/src/data/roadmaps/git-github/content/linear-vs-non-linear@lXC07j6dOa3rQixY1P-Ob.md @@ -1 +1,11 @@ -# Linear vs Non-Linear \ No newline at end of file +# Linear vs Non-Linear + +In Git, linear and non-linear history refer to different ways of managing commit history. + +- Linear history: A repository with a linear history has commits that are applied in a single, sequential order. +- Non-linear history: A repository with a non-linear history allows multiple branches or lines of development, which can be merged back into the main branch at different points. + +Visit the following resources to learn more: + +- [@article@Linear vs Non-Linear History](https://idiv-biodiversity.github.io/git-knowledge-base/linear-vs-nonlinear.html) +- [@article@Linear git history - Part I](https://jun-sheng.medium.com/linear-git-history-part-i-b97184dde252#:~:text=The%20benefit%20of%20having%20a%20linear%20git%20history&text=It%20is%20easier%20to%20understand,bisect%20to%20track%20a%20bug.) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/local-vs-global-config@tVvxC5JQgUb_B8kOqYpD8.md b/src/data/roadmaps/git-github/content/local-vs-global-config@tVvxC5JQgUb_B8kOqYpD8.md index 5eefab112..bfc8c4e8c 100644 --- a/src/data/roadmaps/git-github/content/local-vs-global-config@tVvxC5JQgUb_B8kOqYpD8.md +++ b/src/data/roadmaps/git-github/content/local-vs-global-config@tVvxC5JQgUb_B8kOqYpD8.md @@ -1 +1,11 @@ -# Local vs Global Config \ No newline at end of file +# Local vs Global Config + +To manage local and global configuration settings, you can use the git config command with the --local and --global options. + +- Local configuration: Run `git config --local [key] [value]` to set a local configuration setting for the current repository. +- Global configuration: Use `git config --global [key] [value]` to set a global configuration setting that applies to all repositories on your system. + +Visit the following resources to learn more: + +- [@official@Customizing Git - Git Configuration](https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration) +- [@article@A step-by-step guide to setting up global Git config properties](https://medium.com/geekculture/a-step-by-step-guide-to-setting-up-git-config-global-properties-db6dbce30fa8) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/managing-remotes@sBQOInoFBU9XfkPZ-JlyT.md b/src/data/roadmaps/git-github/content/managing-remotes@sBQOInoFBU9XfkPZ-JlyT.md index 6c9f868f4..f07958922 100644 --- a/src/data/roadmaps/git-github/content/managing-remotes@sBQOInoFBU9XfkPZ-JlyT.md +++ b/src/data/roadmaps/git-github/content/managing-remotes@sBQOInoFBU9XfkPZ-JlyT.md @@ -1 +1,14 @@ -# Managing Remotes \ No newline at end of file +# Managing Remotes + +In Git, a remote repository refers to a copy of a project's source code stored on a server or other machine. + +- Adding remotes: Use `git remote add [name] [url]` to add a new remote repository. This allows you to track changes and push/pull updates from the remote. +- Listing remotes: Run `git remote -v` to list all configured remotes with their URLs. +- Renaming remotes: Update the name of an existing remote using `git remote rename [old-name] [new-name]`. +- Deleting remotes: Remove a remote repository with `git remote remove [name]`. + +Managing remotes is essential for collaborating on projects or tracking changes from upstream sources. + +Visit the following resources to learn more: + +- [@official@Managing remote repositories](https://docs.github.com/en/get-started/getting-started-with-git/managing-remote-repositories) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/managing-tags@NeU38WPbEphJuJ_AMkH82.md b/src/data/roadmaps/git-github/content/managing-tags@NeU38WPbEphJuJ_AMkH82.md index ec70c5e10..2a3d30ae9 100644 --- a/src/data/roadmaps/git-github/content/managing-tags@NeU38WPbEphJuJ_AMkH82.md +++ b/src/data/roadmaps/git-github/content/managing-tags@NeU38WPbEphJuJ_AMkH82.md @@ -1 +1,14 @@ -# Managing Tags \ No newline at end of file +# Managing Tags + +In Git, a tag is a named reference to a specific commit in the project's history. + +- Creating tags: Use `git tag [name] [commit-hash]` to create a new tag. You can also use `git tag -a [name] -m "[message]" [commit-hash]` for annotated tags. +- Listing tags: Run `git tag` to display all existing tags. +- Deleting tags: Remove an existing tag with `git tag -d [tag-name]`. + +Tags can be used for marking releases, milestones, or other significant events in a project's history. + +Visit the following resources to learn more: + +- [@official@Git Basics - Tagging](https://git-scm.com/book/en/v2/Git-Basics-Tagging) +- [@article@Git — Use Tags for Versioning and Release Management](https://medium.com/@KeyurRamoliya/git-use-tags-for-versioning-and-release-management-09aca9631eee) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/markdown@1Ulxl4VUvRSfyCPpi-iv8.md b/src/data/roadmaps/git-github/content/markdown@1Ulxl4VUvRSfyCPpi-iv8.md index 9bb15a14b..0d12eedb2 100644 --- a/src/data/roadmaps/git-github/content/markdown@1Ulxl4VUvRSfyCPpi-iv8.md +++ b/src/data/roadmaps/git-github/content/markdown@1Ulxl4VUvRSfyCPpi-iv8.md @@ -1 +1,14 @@ -# Markdown \ No newline at end of file +# Markdown + +Markdown is a simple way to add formatting to text without using HTML tags or other complex syntax. It's easy to read and write, making it suitable for documentation, README files, and more. Some basic GitHub Markdown features include: + +- Basic syntax: Use headers (`# Heading`), bold/italic text (**bold**, *italic*), and lists (- item) to format text. +- Links: Create links with `[text](url)` or `[text][ref]`. +- Images: Embed images with `[![alt-text](image-url)]`. + +By using Markdown, you can easily format text within your GitHub repository, making it easier to read and understand for yourself and others. + +Visit the following resources to learn more: + +- [@official@Basic writing and formatting syntax](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax) +- [@article@Markdown Cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/marketplace-actions@SsogoCgJIbeTD6tk8UhTe.md b/src/data/roadmaps/git-github/content/marketplace-actions@SsogoCgJIbeTD6tk8UhTe.md index cf3830cdc..024a93a5a 100644 --- a/src/data/roadmaps/git-github/content/marketplace-actions@SsogoCgJIbeTD6tk8UhTe.md +++ b/src/data/roadmaps/git-github/content/marketplace-actions@SsogoCgJIbeTD6tk8UhTe.md @@ -1 +1,13 @@ -# Marketplace Actions \ No newline at end of file +# Marketplace Actions + +The GitHub Marketplace offers a wide range of pre-built actions that can be used to automate tasks and workflows within your repository. + +- Automate tasks: Use marketplace actions to automate tasks such as testing, deployment, or security. +- Customize workflows: Create custom workflows using marketplace actions to tailor the build process to specific needs. +- Streamline development: By automating repetitive tasks, developers can focus on code quality and collaboration. + +These actions are created by the GitHub community and can be easily added to your workflow to enhance productivity and efficiency. + +Visit the following resources to learn more: + +- [@official@GitHub MarketPlace - Actions](https://github.com/marketplace?type=actions) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/mentions@oWMaOWU06juoIuzXNe-wt.md b/src/data/roadmaps/git-github/content/mentions@oWMaOWU06juoIuzXNe-wt.md index 8142a126d..a1e620944 100644 --- a/src/data/roadmaps/git-github/content/mentions@oWMaOWU06juoIuzXNe-wt.md +++ b/src/data/roadmaps/git-github/content/mentions@oWMaOWU06juoIuzXNe-wt.md @@ -1 +1,3 @@ -# Mentions \ No newline at end of file +# Mentions + +Mentions on GitHub allow you to notify specific users or teams about comments, issues, pull requests, or other activities. This feature improves collaboration by encouraging participation and discussion among team members, increasing visibility of important topics, and streamlining communication within your repository. To use mentions, simply type `@username` or `@teamname` in a comment, and GitHub will auto-complete the mention as you type, automatically linking their username to the comment and notifying them about the discussion. \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/merge-strategies@0rHDUbAdXqH9zQW2VfJ8v.md b/src/data/roadmaps/git-github/content/merge-strategies@0rHDUbAdXqH9zQW2VfJ8v.md index e170e6f2e..fc5c5b3ed 100644 --- a/src/data/roadmaps/git-github/content/merge-strategies@0rHDUbAdXqH9zQW2VfJ8v.md +++ b/src/data/roadmaps/git-github/content/merge-strategies@0rHDUbAdXqH9zQW2VfJ8v.md @@ -1 +1,9 @@ -# Merge Strategies \ No newline at end of file +# Merge Strategies + +When combining changes from one branch into another, Git provides various merge strategies to choose from. These methods allow for flexibility and customization in integrating code updates into your main branch. The available options include: + +- Fast Forward (FF) +- Non-Fast Forward +- Rebase +- Squash +- Cherry Picking \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/merging-basics@sNuy6NMjLOEkJlqdEjFPq.md b/src/data/roadmaps/git-github/content/merging-basics@sNuy6NMjLOEkJlqdEjFPq.md index 4f4b789bd..eeaf57a62 100644 --- a/src/data/roadmaps/git-github/content/merging-basics@sNuy6NMjLOEkJlqdEjFPq.md +++ b/src/data/roadmaps/git-github/content/merging-basics@sNuy6NMjLOEkJlqdEjFPq.md @@ -1 +1,8 @@ -# Merging Basics \ No newline at end of file +# Merging Basics + +A merge in Git is the process of combining changes from one branch into another. When you want to integrate updates from one branch (the source) into another branch (the target), you need to perform a merge. This involves resolving conflicts between the two branches, if any exist. The goal of merging is to create a new commit that represents the combined changes from both branches, resulting in a single, cohesive history for your project. + +Visit the following resources to learn more: + +- [@official@Git Branching - Basic Merging](https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging#:~:text=into%20master%20later.-,Basic%20Merging,-Suppose%20you%E2%80%99ve%20decided) +- [@article@Git merge](https://www.atlassian.com/git/tutorials/using-branches/git-merge) \ No newline at end of file From a3682f3d37b808bc1bf4c9342957ec27ac7e274b Mon Sep 17 00:00:00 2001 From: dsh Date: Fri, 16 Aug 2024 16:13:03 +0100 Subject: [PATCH 007/120] Add content to git hook and readme sections (#6603) --- .../content/post-checkout@SANEQI2rgOtsMQyn4qUCq.md | 8 +++++++- .../content/post-update@buxb5TpzQ-xxn0vqtGdS3.md | 8 +++++++- .../content/pr-from-a-fork@8lXXVFkgK6n5IHaYkYe3l.md | 9 ++++++++- .../content/pr-guidelines@GwDNk2HBjASr_NWIL4G3-.md | 9 ++++++++- .../content/pre-commit@HhpAIzYMlMiQ9msrYZyDB.md | 9 ++++++++- .../content/pre-push@j5kWEUKwBFg5EMm8-61K9.md | 10 +++++++++- .../content/private-vs-public@HEqBbw_A4ZbJI5zEy8ViN.md | 8 +++++++- .../content/profile-readme@KbVvFVQ4k77R2_ddsc7WT.md | 10 +++++++++- .../content/project-planning@q0zy_hXav5iXw8LpGVJVd.md | 9 ++++++++- .../content/project-readme@WIVr7JxO1AJTNObW8mtY3.md | 9 ++++++++- 10 files changed, 79 insertions(+), 10 deletions(-) diff --git a/src/data/roadmaps/git-github/content/post-checkout@SANEQI2rgOtsMQyn4qUCq.md b/src/data/roadmaps/git-github/content/post-checkout@SANEQI2rgOtsMQyn4qUCq.md index a2693ef7d..23f0b8183 100644 --- a/src/data/roadmaps/git-github/content/post-checkout@SANEQI2rgOtsMQyn4qUCq.md +++ b/src/data/roadmaps/git-github/content/post-checkout@SANEQI2rgOtsMQyn4qUCq.md @@ -1 +1,7 @@ -# post-checkout \ No newline at end of file +# post-checkout + +Git post-checkout hooks are scripts that run automatically after a successful `git checkout` operation. These hooks provide a way to customize Git's behavior and perform specific actions when switching branches or updating the working directory. Post-checkout hooks can be used for tasks such as updating dependencies, regenerating files, or adjusting project settings based on the newly checked-out branch. They offer developers a powerful tool to automate workflows and maintain consistency across different branches in a Git repository. + +Visit the following resources to learn more: + +- [@official@Post-checkout hooks](https://git-scm.com/docs/githooks#_post_checkout) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/post-update@buxb5TpzQ-xxn0vqtGdS3.md b/src/data/roadmaps/git-github/content/post-update@buxb5TpzQ-xxn0vqtGdS3.md index 0f627474c..09bc67a65 100644 --- a/src/data/roadmaps/git-github/content/post-update@buxb5TpzQ-xxn0vqtGdS3.md +++ b/src/data/roadmaps/git-github/content/post-update@buxb5TpzQ-xxn0vqtGdS3.md @@ -1 +1,7 @@ -# post-update \ No newline at end of file +# post-update + +Git post-update hooks are scripts that run automatically after a successful push to a repository. These hooks are executed on the remote repository and are typically used for server-side tasks such as updating other services, triggering continuous integration processes, or notifying team members about changes. Post-update hooks provide a powerful mechanism for automating workflows and maintaining consistency across different parts of a project's infrastructure, making them an essential tool for streamlining development processes and enhancing collaboration in Git-based projects. + +Visit the following resources to learn more: + +- [@official@Post-update hooks](https://git-scm.com/docs/githooks#post-update) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/pr-from-a-fork@8lXXVFkgK6n5IHaYkYe3l.md b/src/data/roadmaps/git-github/content/pr-from-a-fork@8lXXVFkgK6n5IHaYkYe3l.md index 71b5b84f5..93aec6eb4 100644 --- a/src/data/roadmaps/git-github/content/pr-from-a-fork@8lXXVFkgK6n5IHaYkYe3l.md +++ b/src/data/roadmaps/git-github/content/pr-from-a-fork@8lXXVFkgK6n5IHaYkYe3l.md @@ -1 +1,8 @@ -# PR from a Fork \ No newline at end of file +# PR from a Fork + +Creating a pull request from a fork on GitHub is a common workflow for contributing to open-source projects or collaborating on repositories you don't have direct write access to. After forking the original repository to your GitHub account, you can make changes in your fork, commit them, and then create a pull request to propose these changes to the original repository. This process allows project maintainers to review your contributions, discuss any necessary modifications, and ultimately merge your changes into the main project if they're approved. It's an essential feature that facilitates collaboration and code review in distributed development environments. + +Visit the following resources to learn more: + +- [@official@Creating a pull request from a fork](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork) +- [@video@How to Create a Pull Request from a Fork on GitHub](https://www.youtube.com/watch?v=a_FLqX3vGR4) diff --git a/src/data/roadmaps/git-github/content/pr-guidelines@GwDNk2HBjASr_NWIL4G3-.md b/src/data/roadmaps/git-github/content/pr-guidelines@GwDNk2HBjASr_NWIL4G3-.md index 84b6287c0..6d1eada20 100644 --- a/src/data/roadmaps/git-github/content/pr-guidelines@GwDNk2HBjASr_NWIL4G3-.md +++ b/src/data/roadmaps/git-github/content/pr-guidelines@GwDNk2HBjASr_NWIL4G3-.md @@ -1 +1,8 @@ -# PR Guidelines \ No newline at end of file +# PR Guidelines + +Pull Request (PR) guidelines are essential for maintaining a smooth and efficient code review process in collaborative development environments. These guidelines typically outline best practices for creating, formatting, and submitting PRs, ensuring that changes are well-documented, easy to review, and align with the project's standards. They may cover aspects such as PR size, commit message formatting, documentation requirements, and testing expectations. By establishing clear PR guidelines, teams can streamline their workflow, improve code quality, and facilitate effective communication among contributors. + +Visit the following resources to learn more: + +- [@official@Best practices for pull requests](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/getting-started/best-practices-for-pull-requests) +- [@article@Pull Request Guidelines](https://opensource.creativecommons.org/contributing-code/pr-guidelines/) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/pre-commit@HhpAIzYMlMiQ9msrYZyDB.md b/src/data/roadmaps/git-github/content/pre-commit@HhpAIzYMlMiQ9msrYZyDB.md index ede66d28b..e7ffbd389 100644 --- a/src/data/roadmaps/git-github/content/pre-commit@HhpAIzYMlMiQ9msrYZyDB.md +++ b/src/data/roadmaps/git-github/content/pre-commit@HhpAIzYMlMiQ9msrYZyDB.md @@ -1 +1,8 @@ -# pre-commit \ No newline at end of file +# pre-commit + +Git pre-commit hooks are scripts that run automatically before a commit is created, allowing developers to enforce code quality standards and catch issues early in the development process. These hooks can perform tasks such as linting, formatting, running tests, or checking for sensitive information, ensuring that only clean and compliant code is committed to the repository. By intercepting the commit process, pre-commit hooks help maintain code consistency, reduce errors, and streamline the overall development workflow, making them a valuable tool for enforcing best practices and improving code quality across a project. + +Visit the following resources to learn more: + +- [@opensource@pre-commit/pre-commit](https://github.com/pre-commit/pre-commit) +- [@official@Git Hooks](https://www.atlassian.com/git/tutorials/git-hooks) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/pre-push@j5kWEUKwBFg5EMm8-61K9.md b/src/data/roadmaps/git-github/content/pre-push@j5kWEUKwBFg5EMm8-61K9.md index f50fac16d..ef45f789e 100644 --- a/src/data/roadmaps/git-github/content/pre-push@j5kWEUKwBFg5EMm8-61K9.md +++ b/src/data/roadmaps/git-github/content/pre-push@j5kWEUKwBFg5EMm8-61K9.md @@ -1 +1,9 @@ -# pre-push \ No newline at end of file +# pre-push + +Git pre-push hooks are scripts that run automatically before a push operation is executed, providing a final checkpoint to validate changes before they are shared with a remote repository. These hooks allow developers to perform last-minute checks, such as running tests, linting code, or verifying commit messages, to ensure that only high-quality and compliant code is pushed. By intercepting the push process, pre-push hooks help maintain code integrity, prevent accidental pushes of incomplete or broken code, and enforce project-specific rules, making them a valuable tool for maintaining code quality and consistency across distributed development teams. + + +Visit the following resources to learn more: + +- [@article@pre-push hooks](https://dev.to/jameson/pre-push-hooks-42g5) +- [@video@Detect secrets with a pre-commit git hook](https://www.youtube.com/watch?v=8bDKn3y7Br4) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/private-vs-public@HEqBbw_A4ZbJI5zEy8ViN.md b/src/data/roadmaps/git-github/content/private-vs-public@HEqBbw_A4ZbJI5zEy8ViN.md index dbc038bdf..ccb9de50f 100644 --- a/src/data/roadmaps/git-github/content/private-vs-public@HEqBbw_A4ZbJI5zEy8ViN.md +++ b/src/data/roadmaps/git-github/content/private-vs-public@HEqBbw_A4ZbJI5zEy8ViN.md @@ -1 +1,7 @@ -# Private vs Public \ No newline at end of file +# Private vs Public + +GitHub offers both private and public repositories, each serving different purposes in software development. Public repositories are visible to everyone on the internet, making them ideal for open-source projects, collaboration, and showcasing work to a wider audience. They encourage community contributions and can help developers build their portfolios. Private repositories, on the other hand, are only accessible to the repository owner and designated collaborators. These are suitable for proprietary code, sensitive projects, or work that's not ready for public consumption. Private repositories offer greater control over access and visibility, making them essential for businesses and individuals who need to keep their code confidential. + +Visit the following resources to learn more: + +- [@official@About project visibility](https://docs.github.com/en/repositories/creating-and-managing-repositories/about-repositories#about-repository-visibility) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/profile-readme@KbVvFVQ4k77R2_ddsc7WT.md b/src/data/roadmaps/git-github/content/profile-readme@KbVvFVQ4k77R2_ddsc7WT.md index e1223905a..6a530772c 100644 --- a/src/data/roadmaps/git-github/content/profile-readme@KbVvFVQ4k77R2_ddsc7WT.md +++ b/src/data/roadmaps/git-github/content/profile-readme@KbVvFVQ4k77R2_ddsc7WT.md @@ -1 +1,9 @@ -# Profile Readme \ No newline at end of file +# Profile Readme + +A GitHub Profile README is a special repository that allows users to showcase their skills, projects, and personality directly on their GitHub profile. To create one, you need to make a new repository with the same name as your GitHub username. This repository should contain a README.md file, which GitHub will automatically display on your profile page. The README can be customized with Markdown formatting, allowing you to add text, images, links, and even dynamic content like GitHub stats or recent blog posts. This feature provides a unique opportunity to make your GitHub profile more engaging and informative for visitors, effectively serving as a personalized landing page for your GitHub presence. + + +Visit the following resources to learn more: + +- [@official@Managing your profile README](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/managing-your-profile-readme) +- [@video@GitHub Profile README](https://www.youtube.com/watch?v=KhGWbt1dAKQ) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/project-planning@q0zy_hXav5iXw8LpGVJVd.md b/src/data/roadmaps/git-github/content/project-planning@q0zy_hXav5iXw8LpGVJVd.md index 7bc43e2f8..7e58ad77f 100644 --- a/src/data/roadmaps/git-github/content/project-planning@q0zy_hXav5iXw8LpGVJVd.md +++ b/src/data/roadmaps/git-github/content/project-planning@q0zy_hXav5iXw8LpGVJVd.md @@ -1 +1,8 @@ -# Project Planning \ No newline at end of file +# Project Planning + +Project planning on GitHub is a comprehensive process that leverages the platform's built-in tools to organize, track, and manage software development projects efficiently. It typically involves using features such as Issues for task tracking, Projects for kanban-style boards, Milestones for grouping related issues and pull requests, and Labels for categorization. These tools, combined with GitHub's collaborative features like pull requests and code reviews, enable teams to create structured workflows, set priorities, assign tasks, and monitor progress throughout the development lifecycle. By centralizing project management within the same platform used for version control, GitHub streamlines communication and enhances productivity for development teams of all sizes. + +Visit the following resources to learn more: + +- [@official@Project planning for developers](https://github.com/features/issues) +- [@video@GitHub Project Management](https://www.youtube.com/watch?v=oPQgFxHcjAw) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/project-readme@WIVr7JxO1AJTNObW8mtY3.md b/src/data/roadmaps/git-github/content/project-readme@WIVr7JxO1AJTNObW8mtY3.md index d21c2948a..1b19574e9 100644 --- a/src/data/roadmaps/git-github/content/project-readme@WIVr7JxO1AJTNObW8mtY3.md +++ b/src/data/roadmaps/git-github/content/project-readme@WIVr7JxO1AJTNObW8mtY3.md @@ -1 +1,8 @@ -# Project Readme \ No newline at end of file +# Project Readme + +A GitHub project README is a crucial document that serves as the front page of a repository, providing essential information about the project. It typically includes a brief description of the project's purpose, installation instructions, usage guidelines, and contribution procedures. A well-crafted README helps visitors quickly understand the project's goals, how to get started, and how they can participate. It often contains badges indicating build status, code coverage, and other metrics, as well as links to documentation, issue trackers, and community channels. By effectively communicating the project's value and guiding new users and potential contributors, a good README significantly enhances a project's visibility, adoption, and collaboration potential on GitHub. + +Visit the following resources to learn more: + +- [@official@About READMEs](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-readmes) +- [@article@How to write a good README](https://bulldogjob.com/readme/how-to-write-a-good-readme-for-your-github-project) \ No newline at end of file From 217396d5579ed6a77320350a8f107e91d902ad87 Mon Sep 17 00:00:00 2001 From: Obiechina Emmanuel <94564639+chibuike-19@users.noreply.github.com> Date: Fri, 16 Aug 2024 19:11:58 +0100 Subject: [PATCH 008/120] Add git/github content (#6609) * Added content to custom-validators topic * Added contents to 10 git & github topics * Apply suggestions from code review styling clean up * Added contents to 10 git and github topics * Update src/data/roadmaps/git-github/content/committing-changes@2_z3R7seCvQVj-Na4H1SV.md * Update src/data/roadmaps/git-github/content/creating-account@i7fIIHcBEk473te8bniJ5.md * Update src/data/roadmaps/git-github/content/creating-branch@OegitQ5Ngjvd3ZfMpfrkM.md * Update src/data/roadmaps/git-github/content/creating-repositories@c_FO6xMixrrMo6iisfsvl.md * Update src/data/roadmaps/git-github/content/deleting-branch@1uDenoQ6zu7CT69FR2iQB.md * Update src/data/roadmaps/git-github/content/fast-forward-vs-non-ff@agtPWS8j6i6wQPk10cy8E.md * Update src/data/roadmaps/git-github/content/forking-vs-cloning@l1Wf7Pe_ah8ycCgslfSK4.md * Update src/data/roadmaps/git-github/content/git-rebase@HMEfUFNu_Wp_Pac7VWHr-.md * Added contents to 7 git and github topics --------- Co-authored-by: dsh Co-authored-by: Kamran Ahmed --- .../committing-changes@2_z3R7seCvQVj-Na4H1SV.md | 2 +- .../content/creating-account@i7fIIHcBEk473te8bniJ5.md | 2 +- .../content/creating-branch@OegitQ5Ngjvd3ZfMpfrkM.md | 2 +- .../creating-repositories@c_FO6xMixrrMo6iisfsvl.md | 2 +- .../content/deleting-branch@1uDenoQ6zu7CT69FR2iQB.md | 2 +- .../fast-forward-vs-non-ff@agtPWS8j6i6wQPk10cy8E.md | 2 +- .../content/pull-requests@s3MzDYFPMASqiS8UnvWzW.md | 10 +++++++++- .../pushing--pulling-changes@ZVMCh9om37ee1qsecFa-N.md | 10 +++++++++- .../content/pushing-tags@E3HAGNM-kXLL4Oci5JzpQ.md | 10 +++++++++- .../content/reactions@XstmIysIi_lWo6RzszLBt.md | 8 +++++++- .../git-github/content/rebase@99FVJ3Zs8n6lr8L95mG6g.md | 8 +++++++- .../content/renaming-branch@_dPOVUbxApx0pfKPH8fgr.md | 9 ++++++++- .../git-github/content/squash@Z-srOhYFGVEKDexlJ6cjt.md | 10 +++++++++- 13 files changed, 64 insertions(+), 13 deletions(-) diff --git a/src/data/roadmaps/git-github/content/committing-changes@2_z3R7seCvQVj-Na4H1SV.md b/src/data/roadmaps/git-github/content/committing-changes@2_z3R7seCvQVj-Na4H1SV.md index 2a5a169a1..4033a1991 100644 --- a/src/data/roadmaps/git-github/content/committing-changes@2_z3R7seCvQVj-Na4H1SV.md +++ b/src/data/roadmaps/git-github/content/committing-changes@2_z3R7seCvQVj-Na4H1SV.md @@ -5,4 +5,4 @@ Committing changes in Git is a crucial part of version control, allowing you to Visit the following resources to learn more: - [@official@How git commit works](https://github.com/git-guides/git-commit) -- [@article@Git commit](https://www.atlassian.com/git/tutorials/saving-changes/git-commit) \ No newline at end of file +- [@article@Git commit](https://www.atlassian.com/git/tutorials/saving-changes/git-commit) diff --git a/src/data/roadmaps/git-github/content/creating-account@i7fIIHcBEk473te8bniJ5.md b/src/data/roadmaps/git-github/content/creating-account@i7fIIHcBEk473te8bniJ5.md index 2c1eaf559..24cb75609 100644 --- a/src/data/roadmaps/git-github/content/creating-account@i7fIIHcBEk473te8bniJ5.md +++ b/src/data/roadmaps/git-github/content/creating-account@i7fIIHcBEk473te8bniJ5.md @@ -4,4 +4,4 @@ To get started with GitHub, you'll need to create a free personal account on Git Visit the following resources to learn more: -- [@official@Creating an account on GitHub](https://docs.github.com/en/get-started/start-your-journey/creating-an-account-on-github) \ No newline at end of file +- [@official@Creating an account on GitHub](https://docs.github.com/en/get-started/start-your-journey/creating-an-account-on-github) diff --git a/src/data/roadmaps/git-github/content/creating-branch@OegitQ5Ngjvd3ZfMpfrkM.md b/src/data/roadmaps/git-github/content/creating-branch@OegitQ5Ngjvd3ZfMpfrkM.md index 289b0ecdd..61e19c5c7 100644 --- a/src/data/roadmaps/git-github/content/creating-branch@OegitQ5Ngjvd3ZfMpfrkM.md +++ b/src/data/roadmaps/git-github/content/creating-branch@OegitQ5Ngjvd3ZfMpfrkM.md @@ -5,4 +5,4 @@ Creating a branch in Git is a fundamental part of working with version control, Visit the following resources to learn more: - [@official@Git branch documentation](https://git-scm.com/docs/git-branch) -- [@article@Git branch](https://www.atlassian.com/git/tutorials/using-branches) \ No newline at end of file +- [@article@Git branch](https://www.atlassian.com/git/tutorials/using-branches) diff --git a/src/data/roadmaps/git-github/content/creating-repositories@c_FO6xMixrrMo6iisfsvl.md b/src/data/roadmaps/git-github/content/creating-repositories@c_FO6xMixrrMo6iisfsvl.md index 56f4966be..ed9f24690 100644 --- a/src/data/roadmaps/git-github/content/creating-repositories@c_FO6xMixrrMo6iisfsvl.md +++ b/src/data/roadmaps/git-github/content/creating-repositories@c_FO6xMixrrMo6iisfsvl.md @@ -4,4 +4,4 @@ Creating a Git repository means setting up a system to track changes in your pro Visit the following resources to learn more: -- [@official@Quickstart for repositories - GitHub Docs](https://docs.github.com/en/repositories/creating-and-managing-repositories/quickstart-for-repositories) \ No newline at end of file +- [@official@Quickstart for repositories - GitHub Docs](https://docs.github.com/en/repositories/creating-and-managing-repositories/quickstart-for-repositories) diff --git a/src/data/roadmaps/git-github/content/deleting-branch@1uDenoQ6zu7CT69FR2iQB.md b/src/data/roadmaps/git-github/content/deleting-branch@1uDenoQ6zu7CT69FR2iQB.md index 3f8d7c516..3cf1eeced 100644 --- a/src/data/roadmaps/git-github/content/deleting-branch@1uDenoQ6zu7CT69FR2iQB.md +++ b/src/data/roadmaps/git-github/content/deleting-branch@1uDenoQ6zu7CT69FR2iQB.md @@ -5,4 +5,4 @@ Deleting a Git branch means removing a line of development from your Git reposit Visit the following resources to learn more: - [@official@Creating and deleting branches within your repository](https://docs.github.com/articles/creating-and-deleting-branches-within-your-repository) -- [@article@How to Delete a Git Branch Both Locally and Remotely](https://www.freecodecamp.org/news/how-to-delete-a-git-branch-both-locally-and-remotely/) \ No newline at end of file +- [@article@How to Delete a Git Branch Both Locally and Remotely](https://www.freecodecamp.org/news/how-to-delete-a-git-branch-both-locally-and-remotely/) diff --git a/src/data/roadmaps/git-github/content/fast-forward-vs-non-ff@agtPWS8j6i6wQPk10cy8E.md b/src/data/roadmaps/git-github/content/fast-forward-vs-non-ff@agtPWS8j6i6wQPk10cy8E.md index 79779d8f2..dc9e1a719 100644 --- a/src/data/roadmaps/git-github/content/fast-forward-vs-non-ff@agtPWS8j6i6wQPk10cy8E.md +++ b/src/data/roadmaps/git-github/content/fast-forward-vs-non-ff@agtPWS8j6i6wQPk10cy8E.md @@ -13,4 +13,4 @@ Visit the following resources to learn more: - [@article@Git Merge: To Squash Or Fast-Forward?](https://dev.to/trpricesoftware/git-merge-to-squash-or-fast-forward-3791) - [@article@Difference between a git fast forward and no fast forward](https://gist.github.com/moraisaugusto/1fa02c49b6d9833fcdf665505595ac2e) - [@video@GIT Fast Forward Visualized](https://youtu.be/DN1fNYoJgDw?si=_TZKACj4SCOuESGm) -- [@video@git merge no fast forward](https://youtu.be/X_8atqzsO8U?si=e9hMQg_aWLRMWf4O) \ No newline at end of file +- [@video@git merge no fast forward](https://youtu.be/X_8atqzsO8U?si=e9hMQg_aWLRMWf4O) diff --git a/src/data/roadmaps/git-github/content/pull-requests@s3MzDYFPMASqiS8UnvWzW.md b/src/data/roadmaps/git-github/content/pull-requests@s3MzDYFPMASqiS8UnvWzW.md index a0d01e5f6..34c89c744 100644 --- a/src/data/roadmaps/git-github/content/pull-requests@s3MzDYFPMASqiS8UnvWzW.md +++ b/src/data/roadmaps/git-github/content/pull-requests@s3MzDYFPMASqiS8UnvWzW.md @@ -1 +1,9 @@ -# Pull Requests \ No newline at end of file +# Pull Requests + +A pull request is a proposal to merge a set of changes from one branch into another. In a pull request, collaborators can review and discuss the proposed set of changes before they integrate the changes into the main codebase. Pull requests display the differences, or diffs, between the content in the source branch and the content in the target branch. + +Visit the following resources to learn more: + +- [@official@Creating a pull request](https://docs.github.com/articles/creating-a-pull-request) +- [@article@Pull Requests](https://www.atlassian.com/git/tutorials/making-a-pull-request#:~:text=In%20their%20simplest%20form%2C%20pull,request%20via%20their%20Bitbucket%20account.) +- [@video@GitHub Pull Request in 100 Seconds ](https://youtu.be/8lGpZkjnkt4?si=qbCQ8Uvzn9GN2koL) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/pushing--pulling-changes@ZVMCh9om37ee1qsecFa-N.md b/src/data/roadmaps/git-github/content/pushing--pulling-changes@ZVMCh9om37ee1qsecFa-N.md index 3f315aac8..eee7e88e4 100644 --- a/src/data/roadmaps/git-github/content/pushing--pulling-changes@ZVMCh9om37ee1qsecFa-N.md +++ b/src/data/roadmaps/git-github/content/pushing--pulling-changes@ZVMCh9om37ee1qsecFa-N.md @@ -1 +1,9 @@ -# Pushing / Pulling Changes \ No newline at end of file +# Pushing / Pulling Changes + +When you pull changes in Git, you're fetching and integrating changes from a remote repository into your local repository. This operation updates your local branch with the latest changes from the remote branch. Whereas When you push changes in Git, you're sending your local commits to a remote repository, such as GitHub, GitLab, or Bitbucket. This operation updates the remote repository with your latest changes. + +Visit the following resources to learn more: + +- [@official@Pushing commits to a remote repository](https://docs.github.com/en/get-started/using-git/pushing-commits-to-a-remote-repository) +- [@article@A Comprehensive Guide to git pull and git push](https://dev.to/alexmercedcoder/mastering-git-a-comprehensive-guide-to-git-pull-and-git-push-2eo3) +- [@article@GIT Push and Pull Tutorial](https://www.datacamp.com/tutorial/git-push-pull) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/pushing-tags@E3HAGNM-kXLL4Oci5JzpQ.md b/src/data/roadmaps/git-github/content/pushing-tags@E3HAGNM-kXLL4Oci5JzpQ.md index fc053c88e..7998bccc0 100644 --- a/src/data/roadmaps/git-github/content/pushing-tags@E3HAGNM-kXLL4Oci5JzpQ.md +++ b/src/data/roadmaps/git-github/content/pushing-tags@E3HAGNM-kXLL4Oci5JzpQ.md @@ -1 +1,9 @@ -# Pushing Tags \ No newline at end of file +# Pushing Tags + +Pushing tags in Git is the process of sharing your local tags with a remote repository. Tags in Git are used to mark specific points in the repository's history, typically to signify a release or a milestone. + +Visit the following resources to learn more: + +- [@article@Tagging in git](https://git-scm.com/book/en/Git-Basics-Tagging) +- [@article@How to Push Git Tags to Remote](https://kodekloud.com/blog/how-to-push-git-tags-to-remote/) +- [@article@Git Push Tag to Remote Guide](https://phoenixnap.com/kb/git-push-tag) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/reactions@XstmIysIi_lWo6RzszLBt.md b/src/data/roadmaps/git-github/content/reactions@XstmIysIi_lWo6RzszLBt.md index 45f975fe9..592e02873 100644 --- a/src/data/roadmaps/git-github/content/reactions@XstmIysIi_lWo6RzszLBt.md +++ b/src/data/roadmaps/git-github/content/reactions@XstmIysIi_lWo6RzszLBt.md @@ -1 +1,7 @@ -# Reactions \ No newline at end of file +# Reactions + +Reactions in GitHub are a way for users to express their feelings or opinions about issues, pull requests, comments, and other discussions without adding additional comments. They are similar to "likes" or "emojis" on social media platforms, providing a quick and non-verbal way to engage with content. + +Visit the following resources to learn more: + +- [@official@Add Reactions to Pull Requests, Issues, and Comments](https://github.blog/news-insights/product-news/add-reactions-to-pull-requests-issues-and-comments/) \ No newline at end of file diff --git a/src/data/roadmaps/git-github/content/rebase@99FVJ3Zs8n6lr8L95mG6g.md b/src/data/roadmaps/git-github/content/rebase@99FVJ3Zs8n6lr8L95mG6g.md index ac1078166..707e0c8de 100644 --- a/src/data/roadmaps/git-github/content/rebase@99FVJ3Zs8n6lr8L95mG6g.md +++ b/src/data/roadmaps/git-github/content/rebase@99FVJ3Zs8n6lr8L95mG6g.md @@ -1 +1,7 @@ -# Rebase \ No newline at end of file +# Rebase + +Rebasing in Git is a powerful and potentially complex feature used to reorganize or modify a series of commits. The primary purpose of rebasing is to create a cleaner, more linear project history by moving or combining changes from one branch onto another. + +Visit the following resources to learn more: + +- [@official@Rebasing](https://git-scm.com/book/en/Git-Branching-Rebasing) diff --git a/src/data/roadmaps/git-github/content/renaming-branch@_dPOVUbxApx0pfKPH8fgr.md b/src/data/roadmaps/git-github/content/renaming-branch@_dPOVUbxApx0pfKPH8fgr.md index 23f57625b..3836e15c0 100644 --- a/src/data/roadmaps/git-github/content/renaming-branch@_dPOVUbxApx0pfKPH8fgr.md +++ b/src/data/roadmaps/git-github/content/renaming-branch@_dPOVUbxApx0pfKPH8fgr.md @@ -1 +1,8 @@ -# Renaming Branch \ No newline at end of file +# Renaming Branch + +Renaming a branch in Git means changing the name of a branch to something different while preserving its history and the commits it contains. The branch itself remains the same in terms of the code and history it tracks, but the reference (the name by which you refer to it) is updated + +Visit the following resources to learn more: + +- [@official@Renaming a branch - GitHub Docs](https://docs.github.com/github/administering-a-repository/renaming-a-branch) +- [@article@Git Rename Branch – How to Change a Local Branch Name](https://www.freecodecamp.org/news/git-rename-branch-how-to-change-a-local-branch-name/) diff --git a/src/data/roadmaps/git-github/content/squash@Z-srOhYFGVEKDexlJ6cjt.md b/src/data/roadmaps/git-github/content/squash@Z-srOhYFGVEKDexlJ6cjt.md index 65d6e5b7b..5580d8d87 100644 --- a/src/data/roadmaps/git-github/content/squash@Z-srOhYFGVEKDexlJ6cjt.md +++ b/src/data/roadmaps/git-github/content/squash@Z-srOhYFGVEKDexlJ6cjt.md @@ -1 +1,9 @@ -# Squash \ No newline at end of file +# Squash + +Squashing in Git, refers to the process of combining multiple commits into a single commit. This is often done to create a cleaner and more concise commit history, especially before merging a feature branch into the main branch. + +Visit the following resources to learn more: + +- [@article@Git Squash Commits](https://www.freecodecamp.org/news/git-squash-commits/) +- [@article@How to Squash Commits in Git](https://medium.com/iosnesia/how-to-squash-commits-in-git-e73a41248211) +- [@video@GIT Tutorial - How to Squash Commits](https://youtu.be/viY1BbKZhSI?si=kORsEzQvCRFGauQa) \ No newline at end of file From b49c67248003a48655544076352726c0fee5f16c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 17 Aug 2024 01:35:10 +0100 Subject: [PATCH 009/120] chore: update roadmap content json (#6596) Co-authored-by: kamranahmedse --- public/roadmap-content/android.json | 20 +- public/roadmap-content/angular.json | 17 +- public/roadmap-content/computer-science.json | 2 +- public/roadmap-content/cyber-security.json | 30 +- public/roadmap-content/devops.json | 2 +- public/roadmap-content/devrel.json | 15 +- public/roadmap-content/git-github.json | 1525 +++++++++++++++--- public/roadmap-content/react.json | 12 +- public/roadmap-content/sql.json | 4 +- 9 files changed, 1383 insertions(+), 244 deletions(-) diff --git a/public/roadmap-content/android.json b/public/roadmap-content/android.json index b01b769eb..74d862009 100644 --- a/public/roadmap-content/android.json +++ b/public/roadmap-content/android.json @@ -215,8 +215,14 @@ }, "znvZp24L-PcQwkSObtixs": { "title": "TextView", - "description": "", - "links": [] + "description": "TextView is a widget that is seen in every android application. This widget is used to display simple text within the android application.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Android developers: TextView", + "url": "https://developer.android.com/reference/android/widget/TextView", + "type": "article" + } + ] }, "2iDJrxjXOt7o2fPp2HfRl": { "title": "Fragments", @@ -258,8 +264,14 @@ }, "BVgO9n7tGlVdiS72-hFSd": { "title": "Toast", - "description": "", - "links": [] + "description": "A `toast` provides simple feedback about an operation in a small popup. It only fills the amount of space required for the message and the current activity remains visible and interactive. Toasts automatically disappear after a timeout.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Android developers: Toast", + "url": "https://developer.android.com/guide/topics/ui/notifiers/toasts", + "type": "article" + } + ] }, "A4rtNULX_MoV93IH1Lgqw": { "title": "ImageView", diff --git a/public/roadmap-content/angular.json b/public/roadmap-content/angular.json index 81c1ed229..5e577d161 100644 --- a/public/roadmap-content/angular.json +++ b/public/roadmap-content/angular.json @@ -357,8 +357,14 @@ }, "BCq5sgWQLiw0f7u7ZSAd2": { "title": "Module Architecture", - "description": "", - "links": [] + "description": "Angular’s module architecture organizes an application into cohesive units called NgModules, each defined by the @NgModule decorator. These modules group related components, directives, pipes, and services to encapsulate functionality and promote modular development. The root module (AppModule) is the entry point, bootstrapping the application and importing essential modules like BrowserModule. Feature modules encapsulate specific functionalities and can be eagerly or lazily loaded to improve performance and manageability. Shared modules group reusable components and services to prevent code duplication. The @NgModule metadata includes properties like imports, declarations, exports, providers, and bootstrap, which help manage dependencies, declarations, visibility, service providers, and the root component. This modular approach enhances code organization, scalability, and maintainability in Angular applications.\n\nVisit following resources to learn more:", + "links": [ + { + "title": "Angular Architecture", + "url": "https://dev.to/digitaldino/angular-architecture-39no", + "type": "article" + } + ] }, "ex8FOKrUlbu4MuEq2czyW": { "title": "Creating Components", @@ -383,17 +389,12 @@ }, "9YhTXybJw2gszlqFeBtW3": { "title": "Creating Modules", - "description": "Creating modules in Angular helps organize your application into manageable, cohesive units. Each module can encapsulate related components, directives, pipes, and services. Here's a detailed guide on how to create and use modules in Angular.\n\nCreation Methods:\n\n* Generate Modules: Use ng generate module module-name.\n \n \n* Define Modules: Use @NgModule decorator to declare components, import other modules, and export components.\n \n \n* Create and Add Components: Generate and add components to the module.\n \n \n* Import Modules: Import your new module into app.module.ts or other feature modules.\n \n \n* Feature Modules: Use feature modules for large applications to manage related functionalities.\n \n \n\nVisit the following resources to learn more:", + "description": "Creating modules in Angular helps organize your application into manageable, cohesive units. Each module can encapsulate related components, directives, pipes, and services. Here's a detailed guide on how to create and use modules in Angular.\n\nVisit the following resources to learn more:", "links": [ { "title": "Angular Official Docs (Feature Modules)", "url": "https://angular.dev/guide/ngmodules/feature-modules", "type": "article" - }, - { - "title": "How to Create a new module in Angular", - "url": "https://www.geeksforgeeks.org/how-to-create-a-new-module-in-angular/", - "type": "article" } ] }, diff --git a/public/roadmap-content/computer-science.json b/public/roadmap-content/computer-science.json index f722fa8f5..588a7bcd5 100644 --- a/public/roadmap-content/computer-science.json +++ b/public/roadmap-content/computer-science.json @@ -3177,7 +3177,7 @@ ] }, "YMO9oD_sbzyDZPNU2xZwe": { - "title": "Cloud Design Ptterns", + "title": "Cloud Design Patterns", "description": "These design patterns are useful for building reliable, scalable, secure applications in the cloud.\n\nThe link below has cloud design patterns where each pattern describes the problem that the pattern addresses, considerations for applying the pattern, and an example based on Microsoft Azure. Most patterns include code samples or snippets that show how to implement the pattern on Azure. However, most patterns are relevant to any distributed system, whether hosted on Azure or other cloud platforms.\n\nVisit the following resources to learn more:", "links": [ { diff --git a/public/roadmap-content/cyber-security.json b/public/roadmap-content/cyber-security.json index e61a20e75..8a40643c3 100644 --- a/public/roadmap-content/cyber-security.json +++ b/public/roadmap-content/cyber-security.json @@ -1900,18 +1900,36 @@ }, "ZEgxmvjWPp5NofLFz_FTJ": { "title": "Impersonation", - "description": "", - "links": [] + "description": "Impersonation in cybersecurity refers to an attack technique where a threat actor pretends to be a legitimate person or entity to deceive individuals, systems, or organizations. This tactic is commonly used in social engineering attacks to gain unauthorized access to sensitive information, resources, or systems.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "What is an Impersonation Attack?", + "url": "https://www.upguard.com/blog/impersonation-attack", + "type": "article" + } + ] }, "dcvuKHq0nHgHLcLwtl4IJ": { "title": "Watering Hole Attack", - "description": "", - "links": [] + "description": "Watering Hole Attack is a type of cyberattack where the attacker targets a specific group of users by compromising a website or online resource that they are known to frequently visit. The name \"watering hole\" comes from the idea of predators waiting by a water source to attack prey, similar to how attackers wait for their targets to visit a compromised site.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "What is a watering hole attack?", + "url": "https://www.techtarget.com/searchsecurity/definition/watering-hole-attack", + "type": "article" + } + ] }, "cO70zHvHgBAH29khF-hBW": { "title": "Drive by Attack", - "description": "", - "links": [] + "description": "Drive-by Attack is a type of cyberattack where malicious code is automatically downloaded and executed on a user's system simply by visiting a compromised or malicious website. The user does not need to click on anything or interact with the page; just loading the website is enough to trigger the attack.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "What is a Drive-By Attack?", + "url": "https://www.ericom.com/glossary/what-is-a-drive-by-attack/", + "type": "article" + } + ] }, "0LeDwj_tMaXjQBBOUJ5CL": { "title": "Typo Squatting", diff --git a/public/roadmap-content/devops.json b/public/roadmap-content/devops.json index c533f33a7..2f00a911c 100644 --- a/public/roadmap-content/devops.json +++ b/public/roadmap-content/devops.json @@ -3052,7 +3052,7 @@ } ] }, - "datadog@BHny2Emf96suhAlltiEro.md": { + "BHny2Emf96suhAlltiEro": { "title": "Datadog", "description": "", "links": [] diff --git a/public/roadmap-content/devrel.json b/public/roadmap-content/devrel.json index d381c9f04..89b922528 100644 --- a/public/roadmap-content/devrel.json +++ b/public/roadmap-content/devrel.json @@ -433,8 +433,19 @@ }, "GvmXdWiwITgWzx_f5_ick": { "title": "Building a Community", - "description": "", - "links": [] + "description": "Online developer communities have become the heart of successful DevTools (Developer Tools) go-to-market (GTM) strategies. They provide a platform for developers to connect, collaborate, learn, and share their expertise, ultimately fostering loyalty, driving product adoption, and fueling innovation.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Building and Nurturing Online Developer Communities: The Ultimate Guide", + "url": "https://www.doc-e.ai/post/building-and-nurturing-online-developer-communities-the-ultimate-guide", + "type": "article" + }, + { + "title": "10 Proven Strategies for Building a Developer Community That Thrives: A Guide to Inclusion & Engagement", + "url": "https://dev.to/swati1267/10-proven-strategies-for-building-a-developer-community-that-thrives-a-guide-to-inclusion-engagement-21cm", + "type": "article" + } + ] }, "UKi3waPx2pozvZf2aQ52s": { "title": "Identifying Audience", diff --git a/public/roadmap-content/git-github.json b/public/roadmap-content/git-github.json index 2e7cf29d6..c791f3b30 100644 --- a/public/roadmap-content/git-github.json +++ b/public/roadmap-content/git-github.json @@ -1,7 +1,7 @@ { "HlUUGj3dOZ68t4gIjerXh": { "title": "Learn the Basics", - "description": "A Version Control System (VCS) is a tool that helps developers manage changes to their code over time. It allows multiple versions of a project to exist simultaneously, making it easier to collaborate with others and maintain a record of all modifications.\n\nLearn more from the following resources:", + "description": "A Version Control System (VCS) is a tool that helps developers manage changes to their code over time. It allows multiple versions of a project to exist simultaneously, making it easier to collaborate with others and maintain a record of all modifications.\n\nVisit the following resources to learn more:", "links": [ { "title": "What is version control?", @@ -37,32 +37,82 @@ }, "bY6b1GV2XQQ52NOx8gWFj": { "title": "What is Version Control?", - "description": "", - "links": [] + "description": "Version control is a system that manages and tracks changes to files over time, allowing multiple people to collaborate on a project while maintaining a history of all modifications. It records changes to files, such as code, documents, or configuration files, and stores them in a repository. With version control, developers can revert to previous versions, compare differences between versions, and understand the evolution of a project. It supports features like branching, where different lines of development can occur independently, and merging, which combines changes from different branches. Overall, version control ensures that changes are organized, recoverable, and easily managed, making it a critical tool in software development and collaborative projects.\n\nLearn more from the following resources:", + "links": [ + { + "title": "What is version control?", + "url": "https://www.atlassian.com/git/tutorials/what-is-version-control", + "type": "article" + }, + { + "title": "What is Git? Explained in 2 minutes", + "url": "https://www.youtube.com/watch?v=2ReR1YJrNOM", + "type": "video" + } + ] }, "dhIx1GnynvbSUriqYLUt0": { "title": "Why use Version Control?", - "description": "", - "links": [] + "description": "Using version control is essential for managing changes in software development, as it enables tracking of modifications, collaboration, and maintaining a history of your project. It allows multiple developers to work on the same codebase simultaneously without overwriting each other's work, providing a clear record of who made changes and why. Version control systems facilitate rollback to previous versions if issues arise, and they support branching and merging, which are crucial for experimenting with new features and managing different stages of development. Overall, version control ensures code quality, accountability, and efficient collaboration in projects.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Benefits of using version control", + "url": "https://www.techrepublic.com/article/version-control-benefits/", + "type": "article" + }, + { + "title": "What is version control and why is it important?", + "url": "https://start.docuware.com/blog/document-management/what-is-version-control-why-is-it-important", + "type": "article" + } + ] }, "_jSTrYN9G8EsGHkbusKPU": { "title": "Git vs Other VCS", - "description": "", - "links": [] + "description": "Git has become the de facto standard for source control in software development, but it's not the only version control system (VCS) available. Here are some key differences between Git and other popular VCS:\n\n* Mercurial: Mercurial is a distributed VCS that uses a similar architecture to Git. However, it has a more centralized approach and doesn't use hashes for tracking changes.\n* Subversion: Subversion is a centralized VCS that's often compared to Git. While both systems support branching and merging, Subversion requires a central server to manage the repository.\n* Perforce: Perforce is a commercial VCS that's designed for large-scale development projects. It uses a centralized approach and has features like build automation and issue tracking.\n* CVS: CVS is an older version control system that's still in use today. However, it lacks many modern features and is often considered outdated.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git vs. Other VCS: A Comparative Analysis", + "url": "https://medium.com/@pascalchinedu2000/git-vs-other-vcs-a-comparative-analysis-5cb03ad58e0e", + "type": "article" + } + ] }, "v7hCNbgPByi3YiLSs46BK": { "title": "Installing Git Locally", - "description": "", - "links": [] + "description": "To use Git on your local machine, you need to install it first. The installation process varies depending on your operating system:\n\n* On Windows: Download the binary from the official Git or GitHub release page and follow the installation instructions.\n* On macOS (using Homebrew): Run `brew install git` in your terminal.\n* On Linux: Run `sudo apt-get install git` or `sudo yum install git` depending on your distribution.\n\nOnce installed, you can verify the Git version by running `git --version` in your terminal. This will display the currently installed Git version.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git - Downloads", + "url": "https://git-scm.com/downloads", + "type": "article" + }, + { + "title": "Install Git", + "url": "https://github.com/git-guides/install-git", + "type": "article" + } + ] }, "PtU5Qwfzn3N1i3oRlCGoR": { "title": "What is a Repository", - "description": "", - "links": [] + "description": "A repository is a storage location for your project's code, documentation, and other files. It serves as a central hub for collaboration, version control, and code management. It allows multiple people to work on the same project without overwriting each other's work.\n\nLearn more from the following resources:", + "links": [ + { + "title": "About repositories", + "url": "hhttps://docs.github.com/en/repositories/creating-and-managing-repositories/about-repositories", + "type": "article" + }, + { + "title": "What is a repository?", + "url": "https://www.gitkraken.com/learn/git/tutorials/what-is-a-git-repository", + "type": "article" + } + ] }, "1iOkbO5juk2LO-WZHx_W6": { "title": "git init", - "description": "The `git init` command creates a new Git repository. It can be used to convert an existing, unversioned project to a Git repository or initialize a new, empty repository. Most other Git commands are not available outside of an initialized repository, so this is usually the first command you'll run in a new project.\n\nLearn more from the following resources:", + "description": "The `git init` command creates a new Git repository. It can be used to convert an existing, unversioned project to a Git repository or initialize a new, empty repository. Most other Git commands are not available outside of an initialized repository, so this is usually the first command you'll run in a new project.\n\nVisit the following resources to learn more:", "links": [ { "title": "Git - git-init Documentation", @@ -78,7 +128,7 @@ }, "NMCWgzhhfUvFOMO5GbF_u": { "title": "git config", - "description": "The `git config` command is a convenience function that is used to set Git configuration values on a global or local project level. These configuration levels correspond to .gitconfig text files. Executing `git config` will modify a configuration text file.\n\nThe most basic use case for `git config` is to invoke it with a configuration name, which will display the set value at that name. Configuration names are dot delimited strings composed of a 'section' and a 'key' based on their hierarchy. For example: `user.email`\n\nLearn more from the following resources:", + "description": "The `git config` command is a convenience function that is used to set Git configuration values on a global or local project level. These configuration levels correspond to .gitconfig text files. Executing `git config` will modify a configuration text file.\n\nThe most basic use case for `git config` is to invoke it with a configuration name, which will display the set value at that name. Configuration names are dot delimited strings composed of a 'section' and a 'key' based on their hierarchy. For example: `user.email`\n\nVisit the following resources to learn more:", "links": [ { "title": "Git - git-config Documentation", @@ -104,13 +154,30 @@ }, "tVvxC5JQgUb_B8kOqYpD8": { "title": "Local vs Global Config", - "description": "", - "links": [] + "description": "To manage local and global configuration settings, you can use the git config command with the --local and --global options.\n\n* Local configuration: Run `git config --local [key] [value]` to set a local configuration setting for the current repository.\n* Global configuration: Use `git config --global [key] [value]` to set a global configuration setting that applies to all repositories on your system.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Customizing Git - Git Configuration", + "url": "https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration", + "type": "article" + }, + { + "title": "A step-by-step guide to setting up global Git config properties", + "url": "https://medium.com/geekculture/a-step-by-step-guide-to-setting-up-git-config-global-properties-db6dbce30fa8", + "type": "article" + } + ] }, "Sv36oxTZwlUv-i1K28NeP": { "title": "Working Directory", - "description": "", - "links": [] + "description": "A working directory in Git is the local environment where files are stored and modified as part of a project. It reflects the current state of the project's files, allowing developers to edit, add, or delete files. Changes made in the working directory can be staged for commit, which means they're prepared for inclusion in the next commit. The working directory is connected to the Git repository, and it helps manage the differences between the committed history and the current state of the files. It plays a central role in tracking changes, testing, and developing new features.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Git vs Working Directory", + "url": "https://codesweetly.com/git-vs-working-directory/", + "type": "article" + } + ] }, "h71Tx3nkfUrnhaqcHlDkQ": { "title": "Staging Area", @@ -119,12 +186,23 @@ }, "2_z3R7seCvQVj-Na4H1SV": { "title": "Committing Changes", - "description": "", - "links": [] + "description": "Committing changes in Git is a crucial part of version control, allowing you to save your progress and record a snapshot of your project's current state.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "How git commit works", + "url": "https://github.com/git-guides/git-commit", + "type": "article" + }, + { + "title": "Git commit", + "url": "https://www.atlassian.com/git/tutorials/saving-changes/git-commit", + "type": "article" + } + ] }, "oz2oRAhaEQb0Fm3aRJQG8": { "title": ".gitignore", - "description": "Ignored files are tracked in a special file named `.gitignore` that is checked in at the root of your repository. There is no explicit git ignore command: instead the `.gitignore` file must be edited and committed by hand when you have new files that you wish to ignore. `.gitignore` files contain patterns that are matched against file names in your repository to determine whether or not they should be ignored.\n\nLearn more from the following resources:", + "description": "Ignored files are tracked in a special file named `.gitignore` that is checked in at the root of your repository. There is no explicit git ignore command: instead the `.gitignore` file must be edited and committed by hand when you have new files that you wish to ignore. `.gitignore` files contain patterns that are matched against file names in your repository to determine whether or not they should be ignored.\n\nVisit the following resources to learn more:", "links": [ { "title": "gitignore Documentation", @@ -145,32 +223,87 @@ }, "IfUm5D_zNaUKMd4HX4Fi4": { "title": "Viewing Commit History", - "description": "", - "links": [] + "description": "Viewing commit history is a crucial aspect of Git, allowing users to examine the chronological record of repository changes. This feature is essential for understanding project evolution, tracking modifications, and facilitating effective team collaboration. Git provides various commands like `git log` and its options (e.g., `--oneline`, `--graph`, `--patch`, `--stat`) to display commit history in different formats. Users can filter commits by author, date range, and other criteria. By regularly reviewing commit history and following best practices such as writing clear commit messages and using tags, developers can gain valuable insights into their project's development and make informed decisions about future changes.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git Basics - Viewing the Commit History", + "url": "https://git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-History", + "type": "article" + }, + { + "title": "How to Use Git Log to View Commit History", + "url": "https://www.freecodecamp.org/news/git-log-command/", + "type": "article" + } + ] }, "bXfCUG3h1TIFPgD4WUDph": { "title": "Branching Basics", - "description": "", - "links": [] + "description": "Branches in Git serve as separate lines of development that allow multiple features or changes to be worked on simultaneously without affecting the main codebase. With branches, you can create isolated environments for different tasks, collaborate with others, and manage complex workflows.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git Branching - Basic Branching and Merging", + "url": "https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging", + "type": "article" + }, + { + "title": "Git Branches Tutorial", + "url": "https://www.youtube.com/watch?v=e2IbNHi4uCI", + "type": "video" + } + ] }, "OegitQ5Ngjvd3ZfMpfrkM": { "title": "Creating Branch", - "description": "", - "links": [] + "description": "Creating a branch in Git is a fundamental part of working with version control, allowing you to work on different features or fixes without affecting the main codebase. You can create branches either through the terminal or github interface\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git branch documentation", + "url": "https://git-scm.com/docs/git-branch", + "type": "article" + }, + { + "title": "Git branch", + "url": "https://www.atlassian.com/git/tutorials/using-branches", + "type": "article" + } + ] }, "_dPOVUbxApx0pfKPH8fgr": { "title": "Renaming Branch", - "description": "", - "links": [] + "description": "Renaming a branch in Git means changing the name of a branch to something different while preserving its history and the commits it contains. The branch itself remains the same in terms of the code and history it tracks, but the reference (the name by which you refer to it) is updated\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Renaming a branch - GitHub Docs", + "url": "https://docs.github.com/github/administering-a-repository/renaming-a-branch", + "type": "article" + }, + { + "title": "Git Rename Branch – How to Change a Local Branch Name", + "url": "https://www.freecodecamp.org/news/git-rename-branch-how-to-change-a-local-branch-name/", + "type": "article" + } + ] }, "1uDenoQ6zu7CT69FR2iQB": { "title": "Deleting Branch", - "description": "", - "links": [] + "description": "Deleting a Git branch means removing a line of development from your Git repository. A branch in Git is essentially a pointer to a specific commit, representing an independent line of development. When you delete a branch, you’re removing this pointer, making that line of development no longer accessible through the branch name.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Creating and deleting branches within your repository", + "url": "https://docs.github.com/articles/creating-and-deleting-branches-within-your-repository", + "type": "article" + }, + { + "title": "How to Delete a Git Branch Both Locally and Remotely", + "url": "https://www.freecodecamp.org/news/how-to-delete-a-git-branch-both-locally-and-remotely/", + "type": "article" + } + ] }, "PtRo-wGiNAagZ6CykfvMr": { "title": "Checkout Branch", - "description": "In Git, to \"checkout\" from a branch means to switch your working directory to that branch, making it the active branch. This updates your files to match the state of that branch and allows you to work on it.\n\nLearn more from the following resources:", + "description": "In Git, to \"checkout\" from a branch means to switch your working directory to that branch, making it the active branch. This updates your files to match the state of that branch and allows you to work on it.\n\nVisit the following resources to learn more:", "links": [ { "title": "git-checkout", @@ -191,23 +324,51 @@ }, "sNuy6NMjLOEkJlqdEjFPq": { "title": "Merging Basics", - "description": "", - "links": [] + "description": "A merge in Git is the process of combining changes from one branch into another. When you want to integrate updates from one branch (the source) into another branch (the target), you need to perform a merge. This involves resolving conflicts between the two branches, if any exist. The goal of merging is to create a new commit that represents the combined changes from both branches, resulting in a single, cohesive history for your project.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git Branching - Basic Merging", + "url": "https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging#:~:text=into%20master%20later.-,Basic%20Merging,-Suppose%20you%E2%80%99ve%20decided", + "type": "article" + }, + { + "title": "Git merge", + "url": "https://www.atlassian.com/git/tutorials/using-branches/git-merge", + "type": "article" + } + ] }, "NeSvgS2yA5x8qbcJHrV__": { "title": "GitHub Essentials", - "description": "", + "description": "GitHub Essentials refers to the core features and functionalities that form the foundation of GitHub's version control and collaboration platform. These essentials include repositories for storing and managing code, branches for parallel development, pull requests for code review and merging, issues for tracking tasks and bugs, and collaborative tools like project boards and wikis. Understanding and mastering these fundamental components allows developers to effectively manage their projects, collaborate with team members, and contribute to open-source initiatives, making GitHub an indispensable tool in modern software development workflows.", "links": [] }, "i7fIIHcBEk473te8bniJ5": { "title": "Creating Account", - "description": "", - "links": [] + "description": "To get started with GitHub, you'll need to create a free personal account on [GitHub.com](http://GitHub.com) and verify your email address. Every person who uses [GitHub.com](http://GitHub.com) signs in to a personal account. Your personal account is your identity on [GitHub.com](http://GitHub.com) and has a username and profile.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Creating an account on GitHub", + "url": "https://docs.github.com/en/get-started/start-your-journey/creating-an-account-on-github", + "type": "article" + } + ] }, "qZFtRABvlBbVvsy6T00J2": { "title": "GitHub Interface", - "description": "", - "links": [] + "description": "The GitHub interface is a web-based platform that provides a user-friendly environment for managing and collaborating on software projects. It offers a comprehensive set of tools and features accessible through an intuitive layout, including repository management, code browsing, issue tracking, pull requests, and project boards. The interface is designed to streamline workflows, facilitate team communication, and enhance productivity for developers of all skill levels. With its clean and organized structure, users can easily navigate between different sections of their projects, review code changes, manage tasks, and interact with team members, making it an essential tool for modern software development and version control.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "GitHub Desktop App", + "url": "https://github.com/apps/desktop", + "type": "article" + }, + { + "title": "Getting Started with GitHub", + "url": "https://digital.gov/resources/an-introduction-github/", + "type": "article" + } + ] }, "GS3f1FKFVKT0-GJQrgCm8": { "title": "Setting up Profile", @@ -216,42 +377,114 @@ }, "c_FO6xMixrrMo6iisfsvl": { "title": "Creating Repositories", - "description": "", - "links": [] + "description": "Creating a Git repository means setting up a system to track changes in your project's files over time. This is crucial for version control, allowing you to manage, review, and collaborate on code efficiently.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Quickstart for repositories - GitHub Docs", + "url": "https://docs.github.com/en/repositories/creating-and-managing-repositories/quickstart-for-repositories", + "type": "article" + } + ] }, "KbVvFVQ4k77R2_ddsc7WT": { "title": "Profile Readme", - "description": "", - "links": [] + "description": "A GitHub Profile README is a special repository that allows users to showcase their skills, projects, and personality directly on their GitHub profile. To create one, you need to make a new repository with the same name as your GitHub username. This repository should contain a [README.md](http://README.md) file, which GitHub will automatically display on your profile page. The README can be customized with Markdown formatting, allowing you to add text, images, links, and even dynamic content like GitHub stats or recent blog posts. This feature provides a unique opportunity to make your GitHub profile more engaging and informative for visitors, effectively serving as a personalized landing page for your GitHub presence.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Managing your profile README", + "url": "https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/managing-your-profile-readme", + "type": "article" + }, + { + "title": "GitHub Profile README", + "url": "https://www.youtube.com/watch?v=KhGWbt1dAKQ", + "type": "video" + } + ] }, "HEqBbw_A4ZbJI5zEy8ViN": { "title": "Private vs Public", - "description": "", - "links": [] + "description": "GitHub offers both private and public repositories, each serving different purposes in software development. Public repositories are visible to everyone on the internet, making them ideal for open-source projects, collaboration, and showcasing work to a wider audience. They encourage community contributions and can help developers build their portfolios. Private repositories, on the other hand, are only accessible to the repository owner and designated collaborators. These are suitable for proprietary code, sensitive projects, or work that's not ready for public consumption. Private repositories offer greater control over access and visibility, making them essential for businesses and individuals who need to keep their code confidential.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "About project visibility", + "url": "https://docs.github.com/en/repositories/creating-and-managing-repositories/about-repositories#about-repository-visibility", + "type": "article" + } + ] }, "aWx9WHUrgofcTr8B-fQYe": { "title": "Git Remotes", - "description": "", - "links": [] + "description": "In Git, a remote is a reference to a repository that exists on another server or system. Remotes allow you to access and interact with a copy of your repository that is stored elsewhere, making it possible to collaborate with others, share your work, and maintain multiple copies of your repository for backup and disaster recovery purposes. When you add a remote to your local repository, Git creates a reference to the remote repository, enabling you to push changes from your local repository to the remote one, pull changes from the remote to your local one, or fetch changes from the remote without updating your local copy. This enables distributed development and helps maintain a centralized version of your project's history, making it easier to track changes, manage conflicts, and ensure that everyone has access to the most up-to-date code.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "About remote repositories", + "url": "https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories", + "type": "article" + }, + { + "title": "What is a Remote Repository? [Beginner Git Tutorial]", + "url": "https://www.youtube.com/watch?v=Lb4yvfrX_7I", + "type": "video" + } + ] }, "sBQOInoFBU9XfkPZ-JlyT": { "title": "Managing Remotes", - "description": "", - "links": [] + "description": "In Git, a remote repository refers to a copy of a project's source code stored on a server or other machine.\n\n* Adding remotes: Use `git remote add [name] [url]` to add a new remote repository. This allows you to track changes and push/pull updates from the remote.\n* Listing remotes: Run `git remote -v` to list all configured remotes with their URLs.\n* Renaming remotes: Update the name of an existing remote using `git remote rename [old-name] [new-name]`.\n* Deleting remotes: Remove a remote repository with `git remote remove [name]`.\n\nManaging remotes is essential for collaborating on projects or tracking changes from upstream sources.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Managing remote repositories", + "url": "https://docs.github.com/en/get-started/getting-started-with-git/managing-remote-repositories", + "type": "article" + } + ] }, "ZVMCh9om37ee1qsecFa-N": { "title": "Pushing / Pulling Changes", - "description": "", - "links": [] + "description": "When you pull changes in Git, you're fetching and integrating changes from a remote repository into your local repository. This operation updates your local branch with the latest changes from the remote branch. Whereas When you push changes in Git, you're sending your local commits to a remote repository, such as GitHub, GitLab, or Bitbucket. This operation updates the remote repository with your latest changes.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Pushing commits to a remote repository", + "url": "https://docs.github.com/en/get-started/using-git/pushing-commits-to-a-remote-repository", + "type": "article" + }, + { + "title": "A Comprehensive Guide to git pull and git push", + "url": "https://dev.to/alexmercedcoder/mastering-git-a-comprehensive-guide-to-git-pull-and-git-push-2eo3", + "type": "article" + }, + { + "title": "GIT Push and Pull Tutorial", + "url": "https://www.datacamp.com/tutorial/git-push-pull", + "type": "article" + } + ] }, "Gybnekbd1rJKTOf4hJ4Sh": { "title": "Fetch without Merge", - "description": "", - "links": [] + "description": "Running `git fetch` retrieves changes from a remote repository into your local clone, but does not automatically merge any of these changes into your local working directory. This is different from `git pull`, which both fetches and merges remote changes. By using fetch without merge, you can ensure that your local clone is up-to-date with the latest information from the remote repository, while leaving your working directory unchanged. You can then choose to apply these changes by using merge or rebase. This approach helps maintain a clean and consistent local state, making it easier to manage and commit changes.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git Fetch", + "url": "https://git-scm.com/docs/git-fetch", + "type": "article" + }, + { + "title": "Git fetch", + "url": "https://www.atlassian.com/git/tutorials/syncing/git-fetch", + "type": "article" + }, + { + "title": "Git Fetch | What is Git Fetch and How to Use it | Learn Git", + "url": "https://www.youtube.com/watch?v=uEEcw1s_wWk", + "type": "video" + } + ] }, "d_GNnB6PBINz1jxGNWAE-": { "title": "Collaboration on GitHub", - "description": "Collaboration on GitHub is a powerful way for multiple people to work together on the same project, using Git as the version control system. GitHub provides various tools and workflows that make collaboration efficient and organized.\n\nLearn more from the following resources:", + "description": "Collaboration on GitHub is a powerful way for multiple people to work together on the same project, using Git as the version control system. GitHub provides various tools and workflows that make collaboration efficient and organized.\n\nVisit the following resources to learn more:", "links": [ { "title": "How to collaborate in a GitHub project", @@ -272,17 +505,49 @@ }, "l1Wf7Pe_ah8ycCgslfSK4": { "title": "Forking vs Cloning", - "description": "", - "links": [] + "description": "Forking and cloning are two fundamental concepts in Git, particularly when working with repositories hosted on platforms like GitHub, GitLab, or Bitbucket. While both actions involve copying a repository, they serve different purposes and have distinct workflows. Cloning a repository means creating a local copy of a repository that exists on a remote server (e.g., GitHub) on your local machine. This allows you to work on the project locally, make changes, and then push those changes back to the remote repository if you have the necessary permissions. Forking a repository is specific to platforms like GitHub, GitLab, and Bitbucket. When you fork a repository, you create a copy of someone else’s repository in your own account. This forked repository is independent of the original and can be modified without affecting the original project.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "The difference between forking and cloning a repository", + "url": "https://github.com/orgs/community/discussions/35849", + "type": "article" + }, + { + "title": "Git fork vs. clone: What's the difference?", + "url": "https://www.theserverside.com/answer/Git-fork-vs-clone-Whats-the-difference", + "type": "article" + }, + { + "title": "Git Fork vs. Git Clone: What's the Difference?", + "url": "https://youtu.be/6YQxkxw8nhE?si=mJNvcaB4lQccsU57", + "type": "video" + }, + { + "title": "GitHub Forking vs Cloning: Key Differences Explained", + "url": "https://youtu.be/yQSjqYs2UBE?si=3BKYtWmkLIMWvA6G", + "type": "video" + } + ] }, "crdllx5cH_seIpgVPvHg_": { "title": "Issues", - "description": "", - "links": [] + "description": "On GitHub, an issue is a way to track and report bugs, feature requests, or other problems with a repository. Here are some key aspects of issues:\n\n* Creating issues: Users can create new issues by submitting a form on the repository's Issues page.\n* Issue titles and descriptions: Each issue has a title and body (description), which provide context for the problem or request.\n* Assignees: Issues can be assigned to specific users, who are then responsible for addressing the issue.\n* Labels: Labels are used to categorize issues by topic, priority, or other criteria. This helps filter and organize issues within a repository.\n* States: Issues have states that reflect their status, such as \"Open\", \"Closed\", or \"Pending\".\n* Comments: Users can comment on existing issues to discuss or provide additional context.\n* Labels and milestones: Issues can be associated with labels (topics) and milestones (deadlines), which help filter and prioritize them.\n\nIssues are a core feature of GitHub repositories, enabling teams to collaborate effectively on resolving problems and implementing new features.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "About Issues", + "url": "https://docs.github.com/en/issues/tracking-your-work-with-issues/about-issues", + "type": "article" + }, + { + "title": "What is GitHub Issues?", + "url": "https://www.youtube.com/watch?v=6HWw7rhwvtY", + "type": "video" + } + ] }, "1Koej79yTv-OAswVZwgGq": { "title": "Cloning Repositories", - "description": "Cloning a repository in Git and GitHub involves creating a local copy of a remote repository on your computer. This allows you to work on the project locally, commit changes, and later push those changes back to the remote repository.\n\nLearn more from the following resources:", + "description": "Cloning a repository in Git and GitHub involves creating a local copy of a remote repository on your computer. This allows you to work on the project locally, commit changes, and later push those changes back to the remote repository.\n\nVisit the following resources to learn more:", "links": [ { "title": "Git clone", @@ -313,15 +578,26 @@ }, "8lXXVFkgK6n5IHaYkYe3l": { "title": "PR from a Fork", - "description": "", - "links": [] - }, - "r-u1vTpUyuvsB0revOU0C": { - "title": "Collaborators", - "description": "Collaborators in GitHub are users who have been granted direct access to a repository by the repository owner or organization administrators. Collaborators can perform actions like pushing commits, creating branches, and managing issues or pull requests, depending on the permissions granted to them. They are typically added to private repositories or to public repositories where more control over contributions is needed.\n\nLearn more from the following resources:", + "description": "Creating a pull request from a fork on GitHub is a common workflow for contributing to open-source projects or collaborating on repositories you don't have direct write access to. After forking the original repository to your GitHub account, you can make changes in your fork, commit them, and then create a pull request to propose these changes to the original repository. This process allows project maintainers to review your contributions, discuss any necessary modifications, and ultimately merge your changes into the main project if they're approved. It's an essential feature that facilitates collaboration and code review in distributed development environments.\n\nVisit the following resources to learn more:", "links": [ { - "title": "How to add collaborators to your personal projects", + "title": "Creating a pull request from a fork", + "url": "https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork", + "type": "article" + }, + { + "title": "How to Create a Pull Request from a Fork on GitHub", + "url": "https://www.youtube.com/watch?v=a_FLqX3vGR4", + "type": "video" + } + ] + }, + "r-u1vTpUyuvsB0revOU0C": { + "title": "Collaborators", + "description": "Collaborators in GitHub are users who have been granted direct access to a repository by the repository owner or organization administrators. Collaborators can perform actions like pushing commits, creating branches, and managing issues or pull requests, depending on the permissions granted to them. They are typically added to private repositories or to public repositories where more control over contributions is needed.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "How to add collaborators to your personal projects", "url": "https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-access-to-your-personal-repositories/inviting-collaborators-to-a-personal-repository", "type": "article" }, @@ -349,8 +625,14 @@ }, "y4DkB5NvTh41IeT0G2gr-": { "title": "Labelling Issues / PRs", - "description": "", - "links": [] + "description": "On GitHub, labels are a way to categorize issues and pull requests (PRs) by topic, priority, or other criteria. Some common labels used are:\n\n* `Bug`\n* `Duplicate`\n* `Enhancement`\n* `Feature request`\n* `High priority`\n* `Needs feedback`\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Managing labels", + "url": "https://docs.github.com/en/issues/using-labels-and-milestones-to-track-work/managing-labels", + "type": "article" + } + ] }, "dQS1V0zZxeKhHhUo3STBK": { "title": "Saved Replies", @@ -359,42 +641,112 @@ }, "oWMaOWU06juoIuzXNe-wt": { "title": "Mentions", - "description": "", + "description": "Mentions on GitHub allow you to notify specific users or teams about comments, issues, pull requests, or other activities. This feature improves collaboration by encouraging participation and discussion among team members, increasing visibility of important topics, and streamlining communication within your repository. To use mentions, simply type `@username` or `@teamname` in a comment, and GitHub will auto-complete the mention as you type, automatically linking their username to the comment and notifying them about the discussion.", "links": [] }, "XstmIysIi_lWo6RzszLBt": { "title": "Reactions", - "description": "", - "links": [] + "description": "Reactions in GitHub are a way for users to express their feelings or opinions about issues, pull requests, comments, and other discussions without adding additional comments. They are similar to \"likes\" or \"emojis\" on social media platforms, providing a quick and non-verbal way to engage with content.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Add Reactions to Pull Requests, Issues, and Comments", + "url": "https://github.blog/news-insights/product-news/add-reactions-to-pull-requests-issues-and-comments/", + "type": "article" + } + ] }, "0rHDUbAdXqH9zQW2VfJ8v": { "title": "Merge Strategies", - "description": "", + "description": "When combining changes from one branch into another, Git provides various merge strategies to choose from. These methods allow for flexibility and customization in integrating code updates into your main branch. The available options include:\n\n* Fast Forward (FF)\n* Non-Fast Forward\n* Rebase\n* Squash\n* Cherry Picking", "links": [] }, "agtPWS8j6i6wQPk10cy8E": { "title": "Fast-Forward vs Non-FF", - "description": "", - "links": [] + "description": "In Git, when you merge branches, there are two primary types of merges: Fast-Forward and Non-Fast-Forward (No-FF). These terms describe how Git handles the history and pointers when merging branches. Understanding the difference between these two types of merges is crucial for managing your project's commit history effectively.\n\nA Fast-Forward merge occurs when the branch you are merging into (often main or master) has not diverged from the branch you are merging (often a feature branch). In other words, the commit history of the target branch is a strict subset of the branch being merged. In a Fast-Forward merge, Git simply moves the pointer of the target branch forward to the latest commit on the branch being merged. No new merge commit is created; the history is linear.\n\nA Non-Fast-Forward (No-FF) merge happens when the target branch has diverged from the branch being merged or when you explicitly choose to create a merge commit. In this case, Git creates a new commit that represents the merging of the two branches. Git creates a new merge commit that has two parent commits: one from the target branch and one from the branch being merged. The merge commit is a snapshot of the merged work, preserving the history of both branches.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git Fast-Forward VS Non-Fast-Forward", + "url": "https://leimao.github.io/blog/Git-Fast-Forward-VS-Non-Fast-Forward/", + "type": "article" + }, + { + "title": "Git Merge: To Squash Or Fast-Forward?", + "url": "https://dev.to/trpricesoftware/git-merge-to-squash-or-fast-forward-3791", + "type": "article" + }, + { + "title": "Difference between a git fast forward and no fast forward", + "url": "https://gist.github.com/moraisaugusto/1fa02c49b6d9833fcdf665505595ac2e", + "type": "article" + }, + { + "title": "GIT Fast Forward Visualized", + "url": "https://youtu.be/DN1fNYoJgDw?si=_TZKACj4SCOuESGm", + "type": "video" + }, + { + "title": "git merge no fast forward", + "url": "https://youtu.be/X_8atqzsO8U?si=e9hMQg_aWLRMWf4O", + "type": "video" + } + ] }, "9Dt4Gyiiq5jteWSKxsRMK": { "title": "Handling Conflicts", - "description": "", - "links": [] + "description": "When multiple developers work on the same project simultaneously, conflicts can arise during the merging process. This occurs when changes made by different individuals overlap or contradict each other in a specific code file. In such situations, Git's conflict resolution mechanism comes into play, allowing users to manually resolve these issues and merge the conflicting changes.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Resolving a merge conflict using the command line", + "url": "https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/addressing-merge-conflicts/resolving-a-merge-conflict-using-the-command-line", + "type": "article" + }, + { + "title": "Resolve merge conflicts in Visual Studio", + "url": "https://learn.microsoft.com/en-us/visualstudio/version-control/git-resolve-conflicts?view=vs-2022", + "type": "article" + }, + { + "title": "Resolve Git MERGE CONFLICTS: The Definitive Guide", + "url": "https://www.youtube.com/watch?v=Sqsz1-o7nXk", + "type": "video" + } + ] }, "99FVJ3Zs8n6lr8L95mG6g": { "title": "Rebase", - "description": "", - "links": [] + "description": "Rebasing in Git is a powerful and potentially complex feature used to reorganize or modify a series of commits. The primary purpose of rebasing is to create a cleaner, more linear project history by moving or combining changes from one branch onto another.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Rebasing", + "url": "https://git-scm.com/book/en/Git-Branching-Rebasing", + "type": "article" + } + ] }, "Z-srOhYFGVEKDexlJ6cjt": { "title": "Squash", - "description": "", - "links": [] + "description": "Squashing in Git, refers to the process of combining multiple commits into a single commit. This is often done to create a cleaner and more concise commit history, especially before merging a feature branch into the main branch.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git Squash Commits", + "url": "https://www.freecodecamp.org/news/git-squash-commits/", + "type": "article" + }, + { + "title": "How to Squash Commits in Git", + "url": "https://medium.com/iosnesia/how-to-squash-commits-in-git-e73a41248211", + "type": "article" + }, + { + "title": "GIT Tutorial - How to Squash Commits", + "url": "https://youtu.be/viY1BbKZhSI?si=kORsEzQvCRFGauQa", + "type": "video" + } + ] }, "eFf2fesrs-1aVM5tH3ORQ": { "title": "Cherry Picking Commits", - "description": "Cherry-picking in Git allows you to apply a specific commit from one branch to another, without merging the entire branch. This is useful when you want to bring in a specific feature or fix from one branch to another without incorporating all the changes from the source branch.\n\nLearn more from the following resources:", + "description": "Cherry-picking in Git allows you to apply a specific commit from one branch to another, without merging the entire branch. This is useful when you want to bring in a specific feature or fix from one branch to another without incorporating all the changes from the source branch.\n\nVisit the following resources to learn more:", "links": [ { "title": "git-cherry-pick-docs", @@ -415,7 +767,7 @@ }, "7lRUYWNSpHvJ-QyIE8RMa": { "title": "Commit Messages", - "description": "A Git commit message is a brief explanation of the changes introduced in a particular commit. It helps others (and your future self) understand the purpose of the changes and the context behind them. Writing clear and informative commit messages is an important practice for maintaining a well-organized and easily navigable project history.\n\nLearn more from the following resources:", + "description": "A Git commit message is a brief explanation of the changes introduced in a particular commit. It helps others (and your future self) understand the purpose of the changes and the context behind them. Writing clear and informative commit messages is an important practice for maintaining a well-organized and easily navigable project history.\n\nVisit the following resources to learn more:", "links": [ { "title": "How to Write Better Git Commit Messages", @@ -446,17 +798,39 @@ }, "ks1Pip-RM-UWD6zuF2j4n": { "title": "Branch Naming", - "description": "", - "links": [] + "description": "A well-defined branch naming convention is essential for maintaining a clean and organized Git workflow. It's recommended to use descriptive and meaningful names that clearly indicate the purpose of each branch. For example, using prefixes like `feature/`, `fix/`, or `docs/` can help identify whether a branch is related to new feature development, bug fixes, or documentation updates. Additionally, including the issue or task ID (e.g., `issue/123`) can provide context and make it easier for team members to find relevant information. By following a consistent naming convention, you can improve collaboration, reduce confusion, and increase the overall efficiency of your Git workflow.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Naming conventions for Git Branches — a Cheatsheet", + "url": "https://medium.com/@abhay.pixolo/naming-conventions-for-git-branches-a-cheatsheet-8549feca2534", + "type": "article" + }, + { + "title": "Git Branching Naming Convention: Best Practices to Follow", + "url": "https://phoenixnap.com/kb/git-branch-name-convention", + "type": "article" + } + ] }, "GwDNk2HBjASr_NWIL4G3-": { "title": "PR Guidelines", - "description": "", - "links": [] + "description": "Pull Request (PR) guidelines are essential for maintaining a smooth and efficient code review process in collaborative development environments. These guidelines typically outline best practices for creating, formatting, and submitting PRs, ensuring that changes are well-documented, easy to review, and align with the project's standards. They may cover aspects such as PR size, commit message formatting, documentation requirements, and testing expectations. By establishing clear PR guidelines, teams can streamline their workflow, improve code quality, and facilitate effective communication among contributors.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Best practices for pull requests", + "url": "https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/getting-started/best-practices-for-pull-requests", + "type": "article" + }, + { + "title": "Pull Request Guidelines", + "url": "https://opensource.creativecommons.org/contributing-code/pr-guidelines/", + "type": "article" + } + ] }, "xLB2fhsOm0Vu3xg_PusJB": { "title": "Code Reviews", - "description": "The purpose of a code review in software development is to help ensure that the code meets the organization’s standards and requirements, is of high quality, and is maintainable. In addition to identifying errors and bugs, code reviews also promote a culture of learning and collaboration among the development team.\n\nSome of the benefits of code reviews include:\n\n* Increase code quality by identifying defects in the code and issues such as security vulnerabilities and performance problems—before developers merge the code into an upstream branch.\n* Ensure compliance with organizational standards, regulations, and the team’s code style.\n* Save time and money by detecting issues earlier in the software development process before they become more complex and expensive to fix.\n* Boost collaboration, communication, and knowledge sharing among developers by providing a forum to discuss code and ask questions, share ideas and best practices, and learn from each other.\n* Ensure that the code is maintainable by identifying any software maintenance issues and suggesting improvements.\n\nLearn more from the following links:", + "description": "The purpose of a code review in software development is to help ensure that the code meets the organization’s standards and requirements, is of high quality, and is maintainable. In addition to identifying errors and bugs, code reviews also promote a culture of learning and collaboration among the development team.\n\nSome of the benefits of code reviews include:\n\n* Increase code quality by identifying defects in the code and issues such as security vulnerabilities and performance problems—before developers merge the code into an upstream branch.\n* Ensure compliance with organizational standards, regulations, and the team’s code style.\n* Save time and money by detecting issues earlier in the software development process before they become more complex and expensive to fix.\n* Boost collaboration, communication, and knowledge sharing among developers by providing a forum to discuss code and ask questions, share ideas and best practices, and learn from each other.\n* Ensure that the code is maintainable by identifying any software maintenance issues and suggesting improvements.\n\nVisit the following resources to learn more:", "links": [ { "title": "A practical guide for better, faster code reviews", @@ -472,32 +846,81 @@ }, "pJ-najh7dXhhYA_0bDiR5": { "title": "Contribution Guidelines", - "description": "", - "links": [] + "description": "Contribution guidelines are essential for collaborative projects on GitHub as they help streamline collaboration, set expectations for contributions, and maintain the project's quality and consistency.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Setting guidelines for respository contributors", + "url": "https://docs.github.com/articles/setting-guidelines-for-repository-contributors", + "type": "article" + }, + { + "title": "Contributing Guidelines", + "url": "https://github.blog/news-insights/contributing-guidelines/", + "type": "article" + }, + { + "title": "Contributing Guides: A Template", + "url": "https://github.com/nayafia/contributing-template", + "type": "article" + }, + { + "title": "How to Build a CONTRIBUTING.md", + "url": "https://mozillascience.github.io/working-open-workshop/contributing/", + "type": "article" + } + ] }, "D2WIExwfSnkAPIa5O-Hp5": { "title": "Documentation", - "description": "", - "links": [] + "description": "A well-maintained repository should include documentation that helps others understand the project, its context, and how to contribute to it. This is essential for fostering a community around your project and making it easier for newcomers to join in.\n\nHere are some key sections of documentation that you should consider including in each repository:\n\n* [README.md](http://README.md): A brief introduction to the project, explaining what it's about, why it exists, and how to get started.\n* [CONTRIBUTING.md](http://CONTRIBUTING.md): Guidelines on how others can contribute to the project, including steps for reporting issues, submitting pull requests, or suggesting new features.\n* LICENSE: Information about the license under which the repository is released, ensuring users understand their rights and responsibilities when using your code.\n* CHANGELOG: A history of changes made to the project over time, highlighting significant updates, bug fixes, or feature additions.\n\nThese documents help ensure a smooth onboarding process for contributors, making it easier for them to collaborate effectively and enhance the overall project.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "How to Manage Documentation in a GitHub Repository: A Guide for Junior Developers", + "url": "https://dev.to/mochafreddo/how-to-manage-documentation-in-a-github-repository-a-guide-for-junior-developers-pgo", + "type": "article" + } + ] }, "1Ulxl4VUvRSfyCPpi-iv8": { "title": "Markdown", - "description": "", - "links": [] + "description": "Markdown is a simple way to add formatting to text without using HTML tags or other complex syntax. It's easy to read and write, making it suitable for documentation, README files, and more. Some basic GitHub Markdown features include:\n\n* Basic syntax: Use headers (`# Heading`), bold/italic text (**bold**, _italic_), and lists (- item) to format text.\n* Links: Create links with `[text](url)` or `[text][ref]`.\n* Images: Embed images with `[![alt-text](image-url)]`.\n\nBy using Markdown, you can easily format text within your GitHub repository, making it easier to read and understand for yourself and others.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Basic writing and formatting syntax", + "url": "https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax", + "type": "article" + }, + { + "title": "Markdown Cheatsheet", + "url": "https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet", + "type": "article" + } + ] }, "WIVr7JxO1AJTNObW8mtY3": { "title": "Project Readme", - "description": "", - "links": [] + "description": "A GitHub project README is a crucial document that serves as the front page of a repository, providing essential information about the project. It typically includes a brief description of the project's purpose, installation instructions, usage guidelines, and contribution procedures. A well-crafted README helps visitors quickly understand the project's goals, how to get started, and how they can participate. It often contains badges indicating build status, code coverage, and other metrics, as well as links to documentation, issue trackers, and community channels. By effectively communicating the project's value and guiding new users and potential contributors, a good README significantly enhances a project's visibility, adoption, and collaboration potential on GitHub.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "About READMEs", + "url": "https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-readmes", + "type": "article" + }, + { + "title": "How to write a good README", + "url": "https://bulldogjob.com/readme/how-to-write-a-good-readme-for-your-github-project", + "type": "article" + } + ] }, - "Ddkss13_qDJTquDHbVTVs": { + "github-wikis@lONqOqD-4slxa9B5i9ADX.md": { "title": "GitHub Wikis", "description": "", "links": [] }, "i3AbARgzQtxtlB-1AS8zv": { "title": "Clean Git History", - "description": "Cleaning up Git history can make your commit history more readable, concise, and organized. Here are some of the reasons why you'd want to clean your git history:\n\n* makes it easy to decipher the order of the commits in your repository\n* It facilitates finding commits that might have introduced bugs and enable rollback if necessary\n* To be able to deploy any commit on your development branch using your CI/CD system\n* If you are handling mobile app releases and you are responsible for figuring out what feature is in which release.\n\nLearn more from the following resources:", + "description": "Cleaning up Git history can make your commit history more readable, concise, and organized. Here are some of the reasons why you'd want to clean your git history:\n\n* makes it easy to decipher the order of the commits in your repository\n* It facilitates finding commits that might have introduced bugs and enable rollback if necessary\n* To be able to deploy any commit on your development branch using your CI/CD system\n* If you are handling mobile app releases and you are responsible for figuring out what feature is in which release.\n\nVisit the following resources to learn more:", "links": [ { "title": "Clean GIT history — a Step by Step Guide", @@ -513,18 +936,40 @@ }, "yMx3LdadPz4g25CL3N8da": { "title": "Working in a Team", - "description": "", + "description": "Working in a team on GitHub involves collaborative development using Git's distributed version control system. Team members can work on separate branches, create pull requests for code reviews, and merge changes into the main codebase. GitHub's features like issues, projects, and discussions facilitate communication and project management. Effective teamwork on GitHub requires clear communication, adherence to agreed-upon workflows, and proper use of Git commands to manage code changes and resolve conflicts. This collaborative approach enables teams to work efficiently on complex projects, maintain code quality, and track progress effectively.\n\nGitHub also offers an organization and team management interface, allowing teams to manage projects, members, and collaboration settings.", "links": [] }, "RMrxQLhrINO5g4Mhxh5qS": { "title": "GitHub Organizations", - "description": "", - "links": [] + "description": "GitHub Organizations are shared accounts that provide centralized management and collaboration for multiple projects and teams. They offer enhanced administrative controls, allowing owners to create teams with specific access permissions, manage member roles, and oversee repositories at scale. Organizations facilitate better project coordination, resource sharing, and team communication, making them ideal for businesses, open-source projects, and large-scale collaborations. With features like team discussions, project boards, and audit logs, GitHub Organizations streamline workflow management and foster a more structured and secure development environment.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "About Organizations", + "url": "https://docs.github.com/en/organizations/collaborating-with-groups-in-organizations/about-organizations", + "type": "article" + }, + { + "title": "Set up a GitHub Organization", + "url": "https://www.youtube.com/watch?v=XowSSIhJFuk", + "type": "video" + } + ] }, "_ft-uvXt6s_xrcMT3fbSF": { "title": "Collaborators / Members", - "description": "", - "links": [] + "description": "In GitHub, collaborators and members refer to individuals who contribute to or have access to your repository. Collaborators are users who have been granted permission to contribute code, make changes, and push updates to your repository, whereas members are the owners of a repository, including organization owners who have full control over their team's repositories. Members can be either individual collaborators or part of an organization team, with varying levels of access and permissions based on their role within the team.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Inviting collaborators to a personal repository", + "url": "https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-access-to-your-personal-repositories/inviting-collaborators-to-a-personal-repository", + "type": "article" + }, + { + "title": "REST API endpoints for collaborators", + "url": "https://docs.github.com/en/rest/collaborators/collaborators?apiVersion=2022-11-28", + "type": "article" + } + ] }, "wydgCxR5VnieBpRolXt8i": { "title": "Teams within Organization", @@ -533,18 +978,51 @@ }, "DzFJDdqnSy5GeGHWOpcVo": { "title": "GitHub Projects", - "description": "", - "links": [] + "description": "GitHub Projects is a flexible project management tool integrated directly into GitHub repositories. It allows teams to create customizable project boards, track issues and pull requests, and manage workflows using Kanban-style columns or table views. With features like automated workflows, custom fields, and various visualization options, GitHub Projects helps teams organize, prioritize, and track work across multiple repositories. This tool enhances collaboration, increases transparency, and streamlines project management processes, making it easier for developers and stakeholders to stay aligned on project goals and progress.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "About Projects", + "url": "https://docs.github.com/en/issues/planning-and-tracking-with-projects/learning-about-projects/about-projects", + "type": "article" + }, + { + "title": "How to use Projects Roadmap", + "url": "https://www.youtube.com/watch?v=D80u__nYYWw", + "type": "video" + } + ] }, "q0zy_hXav5iXw8LpGVJVd": { "title": "Project Planning", - "description": "", - "links": [] + "description": "Project planning on GitHub is a comprehensive process that leverages the platform's built-in tools to organize, track, and manage software development projects efficiently. It typically involves using features such as Issues for task tracking, Projects for kanban-style boards, Milestones for grouping related issues and pull requests, and Labels for categorization. These tools, combined with GitHub's collaborative features like pull requests and code reviews, enable teams to create structured workflows, set priorities, assign tasks, and monitor progress throughout the development lifecycle. By centralizing project management within the same platform used for version control, GitHub streamlines communication and enhances productivity for development teams of all sizes.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Project planning for developers", + "url": "https://github.com/features/issues", + "type": "article" + }, + { + "title": "GitHub Project Management", + "url": "https://www.youtube.com/watch?v=oPQgFxHcjAw", + "type": "video" + } + ] }, "RFJgfuxoVxt22QlwLI5mW": { "title": "Kanban Boards", - "description": "", - "links": [] + "description": "On GitHub, Kanban boards provide a visual representation of issues as they move through the development process.\n\nA Kanban board typically has columns representing different stages or states, such as \"To-Do\", \"In-Progress\", and \"Done\". Each issue is represented by a card on the board, which can be moved between columns as its state changes. Users can drag and drop issue cards to move them from one column to another, reflecting progress or completion.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Projects - Boards - Changing the layout of a view", + "url": "https://docs.github.com/en/issues/planning-and-tracking-with-projects/customizing-views-in-your-project/changing-the-layout-of-a-view", + "type": "article" + }, + { + "title": "GitHub Project Management - Create GitHub Project Board & Automations", + "url": "https://www.youtube.com/watch?v=oPQgFxHcjAw", + "type": "video" + } + ] }, "sxvT2hGko2PDRBoBrCGWD": { "title": "Roadmaps", @@ -553,43 +1031,126 @@ }, "TNBz5755PhI6iKxTQTqcS": { "title": "Automations", - "description": "", - "links": [] + "description": "To add automation to your GitHub project, use built-in workflows that can trigger actions such as setting fields on item changes or archiving items meeting specific criteria, and also configure automatic item addition from repositories based on matching criteria.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Automating your project", + "url": "https://docs.github.com/en/issues/planning-and-tracking-with-projects/automating-your-project", + "type": "article" + }, + { + "title": "GitHub Project Management - Create GitHub Project Board & Automations", + "url": "https://www.youtube.com/watch?v=oPQgFxHcjAw&t=600s", + "type": "video" + } + ] }, "snWQHCQECZyUXHdn6ppIk": { "title": "GitHub Discussions", - "description": "", - "links": [] + "description": "GitHub Discussions is a collaborative communication feature within GitHub repositories that provides a dedicated space for community conversations, questions, and knowledge sharing. It allows team members, contributors, and users to engage in threaded discussions, share ideas, ask for help, and make announcements outside of specific code changes or issues. This feature enhances project collaboration by centralizing important conversations, reducing noise in the issue tracker, and fostering a sense of community around open-source projects or team initiatives.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "official GitHub Discussions Docs", + "url": "https://docs.github.com/en/discussions", + "type": "article" + }, + { + "title": "What is GitHub Discussions?", + "url": "https://www.youtube.com/watch?v=bErGYN3Ljz8", + "type": "video" + } + ] }, "X9K3PBpGsMoXkJsKdJPI7": { "title": "Git Stash Basics", - "description": "", - "links": [] + "description": "Git stash allows you to temporarily save your changes, or \"stashes\", when they're not yet ready for commit. This feature is useful when you need to work on multiple tasks, and want to switch between them without committing changes that are not complete. By using `git stash`, you can quickly stash uncommitted changes, reset the working directory to a clean state, and then apply the stashed changes later when they're ready for commit. This helps avoid cluttering the commit history with incomplete work, and allows you to maintain a clean and organized repository by separating your progress on different tasks.\n\nTo apply a stash in Git, you can use the following commands:\n\n* `git stash apply`: This command applies the topmost stash (the most recent one) by default. It will merge the stashed changes into your current working directory.\n* `git stash apply `: If you want to specify a particular stash, you can use its name instead of default. For example, if you've stored multiple stashes and want to apply an earlier one, you can use .\n* `git stash pop`: This command is similar to apply, but it also automatically deletes the applied stash from the stash list. If you need more control over which stash to apply, using pop might be a better option.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git stash", + "url": "https://www.atlassian.com/git/tutorials/saving-changes/git-stash", + "type": "article" + }, + { + "title": "A practical guide to using the git stash command", + "url": "https://opensource.com/article/21/4/git-stash", + "type": "article" + } + ] }, "zen3RRdK9_nPAYgicRoHk": { "title": "History", - "description": "", - "links": [] + "description": "The history of a Git repository is a record of all commits made over time, including changes to files, commit messages, and metadata. This history is stored as a series of snapshots, with each commit representing a new version of the codebase.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git Basics - Viewing the Commit History", + "url": "https://git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-History", + "type": "article" + } + ] }, "lXC07j6dOa3rQixY1P-Ob": { "title": "Linear vs Non-Linear", - "description": "", - "links": [] + "description": "In Git, linear and non-linear history refer to different ways of managing commit history.\n\n* Linear history: A repository with a linear history has commits that are applied in a single, sequential order.\n* Non-linear history: A repository with a non-linear history allows multiple branches or lines of development, which can be merged back into the main branch at different points.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Linear vs Non-Linear History", + "url": "https://idiv-biodiversity.github.io/git-knowledge-base/linear-vs-nonlinear.html", + "type": "article" + }, + { + "title": "Linear git history - Part I", + "url": "https://jun-sheng.medium.com/linear-git-history-part-i-b97184dde252#:~:text=The%20benefit%20of%20having%20a%20linear%20git%20history&text=It%20is%20easier%20to%20understand,bisect%20to%20track%20a%20bug.", + "type": "article" + } + ] }, "V8nLIvddyOKTzEjOJX5GW": { "title": "HEAD", - "description": "", - "links": [] + "description": "The `HEAD` file is at the core of how Git knows the SHA-1 of the last commit when running commands like `git branch `. It serves as a symbolic reference, pointing to the current branch. However, in rare cases, HEAD can contain the actual SHA-1 value of a Git object, such as when checking out a tag, commit, or remote branch, which puts your repository in a \"detached HEAD\" state.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git Internals - Git References - The HEAD", + "url": "https://git-scm.com/book/en/v2/Git-Internals-Git-References#:~:text=want%20to%20create.-,The%20HEAD,-The%20question%20now", + "type": "article" + }, + { + "title": "Learn Git Essentials: Head & Detached Head", + "url": "https://www.youtube.com/watch?v=HvDjbAa9ZsY", + "type": "video" + } + ] }, "0cLf7FiI9CX--UX45sm2f": { "title": "Detached HEAD", - "description": "", - "links": [] + "description": "In Git, a detached head occurs when you check out a commit directly using its hash instead of a branch name. This leaves your repository's HEAD pointer pointing directly at that commit, rather than being linked to a specific branch. To view the history and changes made in a detached head, use `git log` or `git show`. If you want to see the differences between the current detached head and another branch, use `git diff `. A detached head can be a useful temporary state for exploring specific commits or features, but it's essential to merge those changes back into a branch before sharing them with others.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "How to resolve detached HEAD state in Git", + "url": "https://graphite.dev/guides/how-to-resolve-detached-head-state-in-git", + "type": "article" + }, + { + "title": "Head & Detached Head", + "url": "https://www.youtube.com/watch?v=HvDjbAa9ZsY", + "type": "video" + } + ] }, "qFEonbCMLri8iA0yONwuf": { "title": "git log options", - "description": "", - "links": [] + "description": "`git log` is a command in Git that shows the commit history of your repository. It provides a detailed view of all commits, including their hashes, authors, dates, and messages.\n\nHere are some common git log options:\n\n* \\-2: Only show the last two commits.\n* \\--all: Show all branches in the repository.\n* \\--graph: Display the commit history as a graph.\n* \\--no-color: Disable colorized output.\n* \\--stat: Show a statistical summary of changes.\n* \\*\\*-S\\`: Only show commits with modified files.\n\nYou can combine these options to tailor your log output to suit your needs.\n\nFor example, `git log -2 --graph` will display the last two commits in graph form.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git Log", + "url": "https://git-scm.com/docs/git-log", + "type": "article" + }, + { + "title": "Git Log Cheatsheet", + "url": "https://elijahmanor.com/blog/git-log", + "type": "article" + } + ] }, "0Yi4cryT2v2SGBjouOas3": { "title": "Undoing Changes", @@ -598,53 +1159,126 @@ }, "dLr55Om7IOvI53c1DgTKc": { "title": "git revert", - "description": "", - "links": [] + "description": "Git revert is a command that allows you to \"undo\" or revert specific commits in your Git repository. It creates a new commit that reverses the changes made by the specified commit(s), effectively rolling back your code to a previous state.\n\nHere are some key things to know about `git revert`:\n\n* Reverts changes, not moves HEAD: Unlike `git reset`, which can move your current branch's head to a different point in history, `git revert` creates new commits that reverse the changes made by specific commit(s).\n* Creates new commits: Each time you use `git revert`, it creates a new commit that undoes the specified change. This means your Git history will still contain all previous commits.\n* Can be used with multiple commits: If you want to revert multiple commits, simply specify their hashes or references (e.g., branch names) separated by commas.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git Revert", + "url": "https://medium.com/@meghasharmaa704/git-revert-84727b543c17", + "type": "article" + }, + { + "title": "Git Revert - Visualised", + "url": "https://www.youtube.com/watch?v=XJqQPNudPSY", + "type": "video" + } + ] }, "igrR7LguU1jemg_mf_AD6": { "title": "git reset", - "description": "", - "links": [] + "description": "Git reset is a command that allows you to \"undo\" or reset your current branch to a previous state by moving its HEAD pointer, effectively discarding changes made since then. When using git reset, it's essential to specify one of the three modes: soft, hard, or mixed. The mode you choose will determine how Git interacts with files in your working directory and staging area.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git reset", + "url": "https://www.atlassian.com/git/tutorials/undoing-changes/git-reset", + "type": "article" + }, + { + "title": "Git Reset | How to Use Git Reset | Learn Git", + "url": "https://www.youtube.com/watch?v=s1idhUiCk38", + "type": "video" + } + ] }, "Uc7FyfAKpDFRGRNHwztFo": { "title": "--soft", - "description": "", - "links": [] + "description": "In this mode, only the HEAD pointer is moved to the specified commit. The files in your working directory are not modified, but they remain as they were when you started the reset.", + "links": [ + { + "title": "--soft documentation", + "url": "https://git-scm.com/docs/git-reset#Documentation/git-reset.txt---hard", + "type": "article" + } + ] }, "V_joZNpQsS9G9PI-o-GmC": { "title": "--hard", - "description": "", - "links": [] + "description": "With this option, both the HEAD pointer and the working directory's contents are updated to match the specified commit. Any changes made since then will be lost.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "--hard documentation", + "url": "https://git-scm.com/docs/git-reset#Documentation/git-reset.txt---hard", + "type": "article" + } + ] }, "qis7Z5VRxMcOmbesQlegZ": { "title": "--mixed", - "description": "", - "links": [] + "description": "When using mixed mode, the HEAD pointer is moved to the specified commit. However, files in your working directory remain as they were before the reset. The staging area (index) is updated to match the specified commit.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "--mixed documentation", + "url": "https://git-scm.com/docs/git-reset#Documentation/git-reset.txt---hard", + "type": "article" + } + ] }, "-0zQvCHG8jS_ghSjmTeIx": { "title": "Viewing Diffs", - "description": "", + "description": "Viewing diffs in Git is crucial for understanding the changes made to your code. This is especially important when collaborating with others or reviewing your own work over time. Diffs show you exactly what lines have been added, modified, or removed between different versions of your files. This feature helps in code review processes, troubleshooting issues, and maintaining a clear history of your project's evolution. Git provides various commands and tools to view these differences, making it easier to track and manage changes effectively.", "links": [] }, "Rwpeltygwzcf6hnuZNURE": { "title": "Between Commits", - "description": "", - "links": [] + "description": "To compare two specific commits in your Git history, use git diff followed by the hashes of the commits. This will show you the changes made between those two points, including added, modified, and deleted lines.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Comparing changes with Git diff", + "url": "https://refine.dev/blog/git-diff-command/", + "type": "article" + }, + { + "title": "Git Diff 2 Different Commits, Tags or Branches", + "url": "https://www.youtube.com/watch?v=uq5VWPDCtFo", + "type": "video" + } + ] }, "O-zoAWkDvyn7B8_TmY257": { "title": "Between Branches", - "description": "", - "links": [] + "description": "When comparing the differences between two branches, such as a feature branch and its upstream parent branch, use `git diff ..`. This command displays the changes made on the feature branch relative to the parent branch. It's useful for reviewing the impact of new features or changes before merging them into your mainline.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "How to compare branches in Git diff", + "url": "https://scribehow.com/shared/How_to_Compare_Branches_in_GitHub__xsotezV-S1O-GL0PquqJwQ", + "type": "article" + }, + { + "title": "How can I see the differences between two branches?", + "url": "https://stackoverflow.com/questions/9834689/how-can-i-see-the-differences-between-two-branches", + "type": "article" + } + ] }, "mzjtCdpke1ayHcEuS-YUS": { "title": "Staged Changes", - "description": "", + "description": "To view the changes you've staged with `git add`, but not yet committed, use `git diff --cached`. This command compares the staged files against their original versions in the repository. It's a quick way to review what you're about to commit before finalizing it.", "links": [] }, "uxqJzQFRcALqatNRIWR0w": { "title": "Unstaged Changes", - "description": "", - "links": [] + "description": "For changes that are not yet staged with `git add`, such as untracked new files or modified existing ones, use `git diff --unified`. This command compares your working directory against the latest committed version of each file. It's a useful tool for reviewing any local modifications before deciding whether to stage them for future commits.", + "links": [ + { + "title": "What are unstaged changes in GitHub?", + "url": "https://stackoverflow.com/questions/10954329/whats-the-unstaged-changes-in-github", + "type": "article" + }, + { + "title": "How to unstage files in Git", + "url": "https://www.git-tower.com/learn/git/faq/git-unstage", + "type": "article" + } + ] }, "sOoC-XxEoIvwKct00oKlX": { "title": "Rewriting History", @@ -653,13 +1287,50 @@ }, "NjPnEXLf1Lt9qzgxccogv": { "title": "git commit --amend", - "description": "", - "links": [] + "description": "`git commit --amend` is a command used to modify the most recent commit in your repository's history by updating its message, adding or removing files, or changing the commit's metadata. This allows you to correct mistakes or improve the commit's description after it has been made. When using --amend, Git will replace the existing commit with a new one that includes any changes made since the last commit, effectively \"amending\" the previous commit.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Changing a commit message", + "url": "https://docs.github.com/en/enterprise-cloud@latest/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/changing-a-commit-message", + "type": "article" + }, + { + "title": "Rewriting history", + "url": "https://www.atlassian.com/git/tutorials/rewriting-history", + "type": "article" + }, + { + "title": "Git Amend Tutorial: Rewrite Git History", + "url": "https://www.youtube.com/watch?v=q53umU5vMkk", + "type": "video" + } + ] }, "HMEfUFNu_Wp_Pac7VWHr-": { "title": "git rebase", - "description": "", - "links": [] + "description": "Git rebase is a powerful command in Git that allows you to integrate changes from one branch into another. Unlike git merge, which creates a new commit to combine the histories of two branches, git rebase moves or applies commits from one branch on top of another, effectively re-writing the commit history.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git - git-rebase Documentation", + "url": "https://git-scm.com/docs/git-rebase", + "type": "article" + }, + { + "title": "git rebase ", + "url": "https://www.atlassian.com/git/tutorials/rewriting-history/git-rebase", + "type": "article" + }, + { + "title": "git rebase - Why, When & How to fix conflicts", + "url": "https://youtu.be/DkWDHzmMvyg?si=59jauQgkL-sMewzo", + "type": "video" + }, + { + "title": "Git Rebase --interactive: EXPLAINED", + "url": "https://youtu.be/H7RFt0Pxxp8?si=gLhfkVW_PmWHBQSs", + "type": "video" + } + ] }, "BKVA6Q7DXemAYjyQOA0nh": { "title": "git filter-branch", @@ -668,8 +1339,19 @@ }, "OQOmxg9mCfcjt80hpvXkA": { "title": "git push --force", - "description": "", - "links": [] + "description": "`git push --force` is a command that allows you to overwrite or \"force\" an existing commit on a remote repository with a new commit from your local repository. This can be useful in certain situations, such as when you need to update the remote branch with changes that were previously rejected or when you want to remove commits that are no longer relevant. However, it's essential to exercise caution when using git push --force because it can overwrite changes made by others or even your own previous work. Always verify that there are no conflicting changes on the remote repository before using this command.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git Push Force", + "url": "https://www.gitkraken.com/learn/git/problems/git-push-force", + "type": "article" + }, + { + "title": "How to force push to GitHub?", + "url": "https://www.youtube.com/watch?v=wgXbfLn-zkI", + "type": "video" + } + ] }, "iFJBF-EEnLjQVsFSXjo_i": { "title": "Tagging", @@ -678,17 +1360,44 @@ }, "NeU38WPbEphJuJ_AMkH82": { "title": "Managing Tags", - "description": "", - "links": [] + "description": "In Git, a tag is a named reference to a specific commit in the project's history.\n\n* Creating tags: Use `git tag [name] [commit-hash]` to create a new tag. You can also use `git tag -a [name] -m \"[message]\" [commit-hash]` for annotated tags.\n* Listing tags: Run `git tag` to display all existing tags.\n* Deleting tags: Remove an existing tag with `git tag -d [tag-name]`.\n\nTags can be used for marking releases, milestones, or other significant events in a project's history.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git Basics - Tagging", + "url": "https://git-scm.com/book/en/v2/Git-Basics-Tagging", + "type": "article" + }, + { + "title": "Git — Use Tags for Versioning and Release Management", + "url": "https://medium.com/@KeyurRamoliya/git-use-tags-for-versioning-and-release-management-09aca9631eee", + "type": "article" + } + ] }, "E3HAGNM-kXLL4Oci5JzpQ": { "title": "Pushing Tags", - "description": "", - "links": [] + "description": "Pushing tags in Git is the process of sharing your local tags with a remote repository. Tags in Git are used to mark specific points in the repository's history, typically to signify a release or a milestone.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Tagging in git", + "url": "https://git-scm.com/book/en/Git-Basics-Tagging", + "type": "article" + }, + { + "title": "How to Push Git Tags to Remote", + "url": "https://kodekloud.com/blog/how-to-push-git-tags-to-remote/", + "type": "article" + }, + { + "title": "Git Push Tag to Remote Guide", + "url": "https://phoenixnap.com/kb/git-push-tag", + "type": "article" + } + ] }, "62E1tDMXB6K74OEN0WsS0": { "title": "Checkout Tags", - "description": "Tags in Git are typically used to mark specific points in history, such as a release version. Checking out a tag means switching your working directory to the state of the repository at the point in time when that tag was created.\n\nLearn more from the following resources:", + "description": "Tags in Git are typically used to mark specific points in history, such as a release version. Checking out a tag means switching your working directory to the state of the repository at the point in time when that tag was created.\n\nVisit the following resources to learn more:", "links": [ { "title": "How To Checkout Git Tags", @@ -709,22 +1418,60 @@ }, "YmnTrjJtqHPXbEVrP8vd7": { "title": "GitHub Releases", - "description": "", - "links": [] + "description": "GitHub Releases is a feature that allows developers to package and distribute software versions to users. It provides a way to create tagged points in a repository's history, attach binary files (such as compiled executables or packaged code), and include release notes. This feature makes it easy to track and manage different versions of a project, share pre-compiled binaries with users who may not want to build from source, and communicate changes and updates to the community. GitHub Releases integrates seamlessly with Git tags and can be automated as part of a continuous integration and deployment pipeline.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "About Releases", + "url": "https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases", + "type": "article" + }, + { + "title": "REST API endpoints for releases", + "url": "https://docs.github.com/en/rest/releases/releases?apiVersion=2022-11-28", + "type": "article" + } + ] }, "pqBV7BMAs0z6qpfZeW2XP": { "title": "Git hooks", - "description": "", - "links": [] + "description": "Git hooks are scripts that run automatically at specific points during the Git workflow, such as when you commit, push, or pull changes from a repository. These scripts can be used to perform various tasks, like validating code, formatting files, or even sending notifications.\n\nThere are two types of Git hooks:\n\n* Client-side hooks: Run on your local machine before committing changes.\n* Server-side hooks: Run on the remote server when you push changes.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Customizing Git - Git Hooks", + "url": "https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks", + "type": "article" + }, + { + "title": "Git hooks", + "url": "https://www.atlassian.com/git/tutorials/git-hooks", + "type": "article" + }, + { + "title": "What are GitHooks? Explained in 5 minutes", + "url": "https://www.youtube.com/watch?v=1OFiiPretCM", + "type": "video" + } + ] }, "v7uabKuMQPOD_hBIaHOVT": { "title": "What and Why?", - "description": "", - "links": [] + "description": "Git hooks are customizable scripts that Git executes automatically before or after specific events, such as committing, pushing, or merging. These hooks allow developers to automate tasks, enforce coding standards, run tests, or perform other actions at crucial points in the Git workflow. By leveraging git hooks, teams can enhance their development process, maintain code quality, and ensure consistency across projects. Hooks can be implemented locally or shared among team members, providing a powerful mechanism for streamlining workflows and enforcing best practices throughout the development lifecycle.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Git Hooks", + "url": "https://www.atlassian.com/git/tutorials/git-hooks", + "type": "article" + }, + { + "title": "What are Git Hooks?", + "url": "https://www.youtube.com/watch?v=1OFiiPretCM", + "type": "video" + } + ] }, "zsU6R2zvJKnYNU2ac4o4p": { "title": "Client vs Server Hooks", - "description": "Like many other Version Control Systems, Git has a way to fire off custom scripts when certain important actions occur. There are two groups of these hooks: client-side and server-side. Client-side hooks are triggered by operations such as committing and merging, while server-side hooks run on network operations such as receiving pushed commits.\n\nLearn more from the following resources:", + "description": "Like many other Version Control Systems, Git has a way to fire off custom scripts when certain important actions occur. There are two groups of these hooks: client-side and server-side. Client-side hooks are triggered by operations such as committing and merging, while server-side hooks run on network operations such as receiving pushed commits.\n\nVisit the following resources to learn more:", "links": [ { "title": "Git Hooks", @@ -745,28 +1492,73 @@ }, "jzYjHx-gIKSP8dQUTqWVw": { "title": "commit-msg", - "description": "", - "links": [] + "description": "The commit-msg hook is a client-side hook that runs after you've committed changes to your repository. It's typically used to validate or modify the commit message before it's recorded in the Git history.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "A Git-Hook for Commit Messages Validation - No Husky, Just JS", + "url": "https://dev.to/mbarzeev/a-git-hook-for-commit-messages-validation-no-husky-just-js-1hni", + "type": "article" + }, + { + "title": "Git Hooks Made Easy: Create a Custom 'commit-msg' Hook Script", + "url": "https://www.youtube.com/watch?v=yH1lBm5t97s", + "type": "video" + } + ] }, "SANEQI2rgOtsMQyn4qUCq": { "title": "post-checkout", - "description": "", - "links": [] + "description": "Git post-checkout hooks are scripts that run automatically after a successful `git checkout` operation. These hooks provide a way to customize Git's behavior and perform specific actions when switching branches or updating the working directory. Post-checkout hooks can be used for tasks such as updating dependencies, regenerating files, or adjusting project settings based on the newly checked-out branch. They offer developers a powerful tool to automate workflows and maintain consistency across different branches in a Git repository.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Post-checkout hooks", + "url": "https://git-scm.com/docs/githooks#_post_checkout", + "type": "article" + } + ] }, "buxb5TpzQ-xxn0vqtGdS3": { "title": "post-update", - "description": "", - "links": [] + "description": "Git post-update hooks are scripts that run automatically after a successful push to a repository. These hooks are executed on the remote repository and are typically used for server-side tasks such as updating other services, triggering continuous integration processes, or notifying team members about changes. Post-update hooks provide a powerful mechanism for automating workflows and maintaining consistency across different parts of a project's infrastructure, making them an essential tool for streamlining development processes and enhancing collaboration in Git-based projects.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Post-update hooks", + "url": "https://git-scm.com/docs/githooks#post-update", + "type": "article" + } + ] }, "HhpAIzYMlMiQ9msrYZyDB": { "title": "pre-commit", - "description": "", - "links": [] + "description": "Git pre-commit hooks are scripts that run automatically before a commit is created, allowing developers to enforce code quality standards and catch issues early in the development process. These hooks can perform tasks such as linting, formatting, running tests, or checking for sensitive information, ensuring that only clean and compliant code is committed to the repository. By intercepting the commit process, pre-commit hooks help maintain code consistency, reduce errors, and streamline the overall development workflow, making them a valuable tool for enforcing best practices and improving code quality across a project.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "pre-commit/pre-commit", + "url": "https://github.com/pre-commit/pre-commit", + "type": "opensource" + }, + { + "title": "Git Hooks", + "url": "https://www.atlassian.com/git/tutorials/git-hooks", + "type": "article" + } + ] }, "j5kWEUKwBFg5EMm8-61K9": { "title": "pre-push", - "description": "", - "links": [] + "description": "Git pre-push hooks are scripts that run automatically before a push operation is executed, providing a final checkpoint to validate changes before they are shared with a remote repository. These hooks allow developers to perform last-minute checks, such as running tests, linting code, or verifying commit messages, to ensure that only high-quality and compliant code is pushed. By intercepting the push process, pre-push hooks help maintain code integrity, prevent accidental pushes of incomplete or broken code, and enforce project-specific rules, making them a valuable tool for maintaining code quality and consistency across distributed development teams.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "pre-push hooks", + "url": "https://dev.to/jameson/pre-push-hooks-42g5", + "type": "article" + }, + { + "title": "Detect secrets with a pre-commit git hook", + "url": "https://www.youtube.com/watch?v=8bDKn3y7Br4", + "type": "video" + } + ] }, "fjAFNjNNbPOzme9Uk_fDV": { "title": "Submodules", @@ -774,24 +1566,73 @@ "links": [] }, "x4bnsPVTiX2xOCSyrgWpF": { - "title": "Adding / Updating", - "description": "", - "links": [] + "title": "Adding / Updating", + "description": "To add a submodule to a repository, use `git submodule add https://github.com/user/submodule-repo.git`, which is the typical format for specifying the URL of the submodule repository. This creates a new folder for the submodule and checks it out at the specified revision. To update an existing submodule to its latest commit, run `git submodule update`. If you want to pull in changes from upstream while keeping your submodule's history intact, use `git submodule sync` followed by `git submodule update`.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git submodules", + "url": "https://www.atlassian.com/git/tutorials/git-submodule", + "type": "article" + }, + { + "title": "Working with submodules", + "url": "https://github.blog/open-source/git/working-with-submodules/", + "type": "article" + } + ] }, "d0-u_-_vtPK8tnUpnj_NB": { "title": "What and Why use?", - "description": "", - "links": [] + "description": "Git submodules are a feature that allows you to include one Git repository within another. They are useful for managing external dependencies or shared components across projects.\n\nKey points:\n\n1. Separate repositories with independent histories\n2. Parent repository tracks specific submodule commits\n3. Enables code reuse and modular project structure\n4. Helps manage dependencies and keep main repository focused\n5. Facilitates collaboration on complex projects\n\nBenefits:\n\n* Including third-party libraries\n* Sharing common code\n* Managing multi-component projects\n* Keeping main repository lightweight\n\nNote: While powerful, submodules can add complexity to your workflow, so careful consideration is needed before implementation.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Git Submodules: Core Concept, Workflows, and Tips", + "url": "https://www.atlassian.com/git/tutorials/git-submodule", + "type": "article" + }, + { + "title": "Git Submodules Tutorial", + "url": "https://www.youtube.com/watch?v=gSlXo2iLBro", + "type": "video" + } + ] }, "h9cf_dh_pwjialOXOlNW-": { "title": "GitHub CLI", - "description": "", - "links": [] + "description": "GitHub CLI is a command-line interface tool that brings GitHub functionality to your terminal. It allows developers to interact with GitHub directly from the command line, enabling them to manage repositories, create issues, pull requests, and perform various GitHub operations without leaving their terminal environment. This powerful tool streamlines workflows, enhances productivity, and provides a seamless integration between local development and GitHub's collaborative features, making it easier for developers to incorporate GitHub into their daily coding routines.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "official GitHub CLI Docs", + "url": "https://cli.github.com/", + "type": "article" + }, + { + "title": "What is the GitHub CLI?", + "url": "https://www.youtube.com/watch?v=uy_PEGgUF4U", + "type": "video" + } + ] }, "vHfpoVbOW0DHNtiy0VN4X": { "title": "Installation and Setup", - "description": "", - "links": [] + "description": "The GitHub CLI can be installed on Windows, macOS, and Linux operating systems. Installation options include downloading binaries directly from the release page or using package managers (such as homebrew, pip, etc).\n\nOnce installed, setting up the GitHub CLI typically involves authenticating with your GitHub account by running `gh auth login` in your terminal. This step is essential for linking your GitHub credentials to the CLI, allowing you to interact with your repositories and perform various actions.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "GitHub CLI - Installation", + "url": "https://github.com/cli/cli?tab=readme-ov-file#installation", + "type": "article" + }, + { + "title": "GitHub CLI - Release", + "url": "https://github.com/cli/cli/releases/", + "type": "article" + }, + { + "title": "GitHub CLI quickstart", + "url": "https://docs.github.com/en/github-cli/github-cli/quickstart", + "type": "article" + } + ] }, "lw4zHuhtxIO4kDvbyiVfq": { "title": "Repository management", @@ -800,17 +1641,44 @@ }, "kGnZifvXbHBf5zXIsfAQw": { "title": "Issue Management", - "description": "", - "links": [] + "description": "The GitHub CLI provides a range of features for managing issues within your repository. Here are some key actions you can perform:\n\n* Listing issues: Run `gh issue list` to view a list of all open and closed issues.\n* Creating issues: Use `gh issue create --title \"Issue Title\" --body \"Issue body\"` to create a new issue with the specified title and body.\n* Assigning issues: Run `gh issue assign ` to assign an issue to a specific user.\n* Labelling issues: Use `gh issue label ` to add a label to an existing issue.\n* Closing issues: Run `gh issue close ` to mark an issue as closed.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "gh issue", + "url": "https://cli.github.com/manual/gh_issue", + "type": "article" + }, + { + "title": "Manage GitHub Issues From The Command Line Using GitHub CLI", + "url": "https://www.youtube.com/watch?v=nuCQiP41jU0", + "type": "video" + } + ] }, "s3MzDYFPMASqiS8UnvWzW": { "title": "Pull Requests", - "description": "", - "links": [] + "description": "A pull request is a proposal to merge a set of changes from one branch into another. In a pull request, collaborators can review and discuss the proposed set of changes before they integrate the changes into the main codebase. Pull requests display the differences, or diffs, between the content in the source branch and the content in the target branch.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Creating a pull request", + "url": "https://docs.github.com/articles/creating-a-pull-request", + "type": "article" + }, + { + "title": "Pull Requests", + "url": "https://www.atlassian.com/git/tutorials/making-a-pull-request#:~:text=In%20their%20simplest%20form%2C%20pull,request%20via%20their%20Bitbucket%20account.", + "type": "article" + }, + { + "title": "GitHub Pull Request in 100 Seconds ", + "url": "https://youtu.be/8lGpZkjnkt4?si=qbCQ8Uvzn9GN2koL", + "type": "video" + } + ] }, "AmetdCURXXob5TUsikAab": { "title": "GitHub Actions", - "description": "GitHub Actions is a very useful tool for automation, allowing developers to automate tasks within the software development lifecycle directly on GitHub.\n\nOne of the best ways to learn about GitHub Actions is through the course offered by Microsoft Learn. This course is well-structured and provides practical examples that are concise and easy to understand.", + "description": "GitHub Actions is a very useful tool for automation, allowing developers to automate tasks within the software development lifecycle directly on GitHub.\n\nOne of the best ways to learn about GitHub Actions is through the course offered by Microsoft Learn. This course is well-structured and provides practical examples that are concise and easy to understand.\n\nVisit the following resources to learn more:", "links": [ { "title": "Microsoft Learn: Introduction to GitHub Actions", @@ -826,13 +1694,35 @@ }, "p6rq3lQ9YRrTqwcc31O23": { "title": "YAML Syntax", - "description": "", - "links": [] + "description": "YAML (YAML Ain't Markup Language) is a human-readable data serialization standard for all programming languages. It is designed to be easily readable by humans while also being machine-parsable. Key features of YAML include:\n\n1. Simplicity: YAML uses a minimalist syntax with significant whitespace and indentation.\n \n2. Versatility: It can represent various data types, including scalars, lists, and associative arrays.\n \n3. Readability: Its clear, concise format makes it easy for both humans and machines to understand.\n \n4. Language-independent: YAML can be used with any programming language that has a YAML parser.\n \n\nYAML is commonly used for:\n\n* Configuration files: Many applications and tools use YAML for their configuration settings.\n* Data exchange: It serves as a lightweight alternative to XML or JSON for data transfer between systems.\n* Data storage: YAML can be used to store structured data in a human-readable format.\n* DevOps and CI/CD: It's widely used in tools like Docker, Kubernetes, and various CI/CD platforms for defining workflows and configurations.\n\nUnderstanding YAML syntax is crucial for working with modern development tools, especially in the realms of DevOps, cloud computing, and containerization.\n\nLearn more from the following resources:", + "links": [ + { + "title": "What is YAML?", + "url": "https://circleci.com/blog/what-is-yaml-a-beginner-s-guide/", + "type": "article" + }, + { + "title": "YAML Tutorial : A Complete Language Guide with Examples", + "url": "https://spacelift.io/blog/yaml", + "type": "article" + } + ] }, "55uHPFNwYPVZx8Cy3c985": { "title": "Workflow Triggers", - "description": "", - "links": [] + "description": "Workflow triggers are events that initiate a GitHub Actions workflow. They can be scheduled, triggered by code changes, or manually initiated. This allows for automation of tasks based on specific conditions.\n\nLearn more from the following resources:", + "links": [ + { + "title": "GitHub Actions Documentation", + "url": "https://docs.github.com/en/actions", + "type": "article" + }, + { + "title": "GitHub Actions Triggers", + "url": "https://docs.github.com/en/actions/reference/events-that-trigger-workflows", + "type": "article" + } + ] }, "uS1H9KoKGNONvETCuFBbz": { "title": "Scheduled Worfklows", @@ -841,13 +1731,35 @@ }, "6QwlY3dEvjfAOPALcWKXQ": { "title": "Workflow Runners", - "description": "", - "links": [] + "description": "Workflow runners are the environments where GitHub Actions workflows are executed. They are hosted on GitHub-hosted virtual machines (GHVMs) or self-hosted runners. Each runner has a specific configuration and capabilities, depending on its type.\n\nLearn more from the following resources:", + "links": [ + { + "title": "GitHub Actions Runners", + "url": "https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners", + "type": "article" + }, + { + "title": "GitHub Actions Self-hosted runners", + "url": "https://www.youtube.com/watch?v=aLHyPZO0Fy0", + "type": "video" + } + ] }, "BnPiTu1Jw2kIW560a2A5T": { "title": "Workflow Context", - "description": "", - "links": [] + "description": "Workflow context in GitHub Actions refers to the environment and variables that are available to a workflow. It includes information about the workflow's execution, such as the event that triggered it, the repository, and the workflow itself.\n\nLearn more from the following resources:", + "links": [ + { + "title": "GitHub Actions Contexts", + "url": "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/contexts", + "type": "article" + }, + { + "title": "Working with contexts in GitHub Actions", + "url": "https://www.youtube.com/watch?v=16WT_r0zjYE", + "type": "video" + } + ] }, "aflP7oWsQzAr4YPo2LLiQ": { "title": "Secrets and Env Vars", @@ -856,8 +1768,19 @@ }, "HMNhzzV6ApTKj4I_FOmUB": { "title": "Caching Dependencies", - "description": "", - "links": [] + "description": "GitHub Actions provides a caching feature that allows you to store and reuse dependencies between workflows, reducing the time it takes to run your actions. By caching dependencies, you can:\n\n* Reuse compiled code\n* Store database connections\n* Reduce network traffic\n\nIt is highly recommended to not store any sensitive information in the cache. For example, sensitive information can include access tokens or login credentials stored in a file in the cache path.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Caching dependencies to speed up workflows", + "url": "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/caching-dependencies-to-speed-up-workflows", + "type": "article" + }, + { + "title": "Cache Management with GitHub actions", + "url": "https://www.youtube.com/watch?v=7PVUjRXUY0o", + "type": "video" + } + ] }, "alysXC4b1hGi9ZdQ5-40y": { "title": "Storing Artifacts", @@ -866,63 +1789,205 @@ }, "jc4R1zhd1YeCEbVuxwJWy": { "title": "Workflow Status", - "description": "", - "links": [] + "description": "Workflow status in GitHub Actions refers to the current state of a workflow run. It can be one of the following:\n\n* Pending: The workflow is waiting for an event to trigger it.\n* In Progress: The workflow is currently running.\n* Completed: The workflow has finished running.\n* Failed: The workflow has failed due to an error.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Adding a workflow status badge to your repository", + "url": "https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/monitoring-workflows/adding-a-workflow-status-badge", + "type": "article" + } + ] }, "SsogoCgJIbeTD6tk8UhTe": { "title": "Marketplace Actions", - "description": "", - "links": [] + "description": "The GitHub Marketplace offers a wide range of pre-built actions that can be used to automate tasks and workflows within your repository.\n\n* Automate tasks: Use marketplace actions to automate tasks such as testing, deployment, or security.\n* Customize workflows: Create custom workflows using marketplace actions to tailor the build process to specific needs.\n* Streamline development: By automating repetitive tasks, developers can focus on code quality and collaboration.\n\nThese actions are created by the GitHub community and can be easily added to your workflow to enhance productivity and efficiency.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "GitHub MarketPlace - Actions", + "url": "https://github.com/marketplace?type=actions", + "type": "article" + } + ] }, "PUnYNBrAZWoZiopjtNgnA": { "title": "Usecases", - "description": "", - "links": [] + "description": "GitHub Actions offer a wide range of automation possibilities for your development workflow. Here are some common use cases:\n\n1. Continuous Integration (CI): Automatically build and test your code on every push or pull request.\n2. Continuous Deployment (CD): Automatically deploy your application to various environments after successful builds.\n3. Code Quality Checks: Run linters, formatters, and other code quality tools automatically.\n4. Dependency Updates: Automatically create pull requests for outdated dependencies.\n5. Issue and PR Management: Automatically label, assign, or close issues and pull requests based on certain conditions.\n6. Scheduled Tasks: Run periodic maintenance tasks, backups, or data processing jobs.\n7. Security Scanning: Perform automated security checks on your codebase and dependencies.\n8. Documentation Generation: Automatically generate and publish documentation for your project.\n9. Cross-platform Testing: Test your code on multiple operating systems and environments simultaneously.\n10. Release Management: Automate the creation of release notes and asset uploads for new versions.\n\nThese use cases demonstrate how GitHub Actions can streamline your development process, improve code quality, and increase productivity.\n\nLearn more from the following resources:", + "links": [ + { + "title": "GitHub Actions Documentation", + "url": "https://docs.github.com/en/actions", + "type": "article" + }, + { + "title": "How GitHub Actions 10x my productivity", + "url": "https://www.youtube.com/watch?v=yfBtjLxn_6k", + "type": "article" + } + ] }, "Ni3HKVLanFvSrJ3u8i5I1": { "title": "What are these?", - "description": "", - "links": [] + "description": "GitHub Actions is a powerful automation and continuous integration/continuous deployment (CI/CD) platform provided by GitHub. It allows developers to create custom workflows that automatically build, test, and deploy their code directly from their GitHub repositories. These workflows are triggered by specific events, such as push requests, pull requests, or scheduled tasks. GitHub Actions enables teams to streamline their development processes, improve code quality, and accelerate software delivery by automating repetitive tasks and integrating various tools and services seamlessly within their development pipeline.\n\nLearn more from the following resources:", + "links": [ + { + "title": "Understanding GitHub Actions", + "url": "https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions", + "type": "article" + }, + { + "title": "GitHub Actions Tutorial - Basic Concepts and CI/CD Pipeline with Docker", + "url": "https://www.youtube.com/watch?v=R8_veQiYBjI", + "type": "video" + } + ] }, "Y0EWgPsS4kZxH3y53jNxY": { "title": "Use in Automation", - "description": "", - "links": [] + "description": "GitHub CLI is a powerful tool for automating GitHub-related tasks directly from the command line. It enables developers to streamline workflows and integrate GitHub processes into scripts and automated systems.\n\nKey uses in automation:\n\n1. CI/CD: Automate PR creation, review, merging, and release management\n2. Issue and Project Management: Create, update, and close issues; manage project boards\n3. Repository Management: Clone repos, create forks, manage settings and collaborators\n4. GitHub Actions Integration: Trigger and monitor workflows, manage secrets\n5. Scripting and Batch Operations: Perform bulk actions across multiple repositories\n\nTo use GitHub CLI in automation:\n\n1. Install GitHub CLI\n2. Authenticate with your GitHub account\n3. Learn basic commands and syntax\n4. Integrate CLI commands into scripts or automation tools\n\nLearn more from the following resources:", + "links": [ + { + "title": "GitHub CLI documentation", + "url": "https://cli.github.com/manual/", + "type": "article" + }, + { + "title": "Automating your workflow with GitHub CLI", + "url": "https://github.blog/2021-03-11-scripting-with-github-cli/", + "type": "article" + } + ] }, "sFf1PdFfmEdQxsEntfeFq": { "title": "Git Patch", - "description": "", - "links": [] + "description": "In Git, a patch is a file that contains a set of changes made to a project's codebase. It's essentially a diff (difference) file that shows the modifications between two versions of a commit or a branch. However, despite its usefulness in certain contexts, the use of Git patches has declined somewhat with the advent of more modern and efficient ways to manage code changes.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git Patch", + "url": "https://www.gitkraken.com/learn/git/git-patch", + "type": "article" + }, + { + "title": "How to generate and apply patches with git?", + "url": "https://gist.github.com/nepsilon/22bc62a23f785716705c", + "type": "article" + } + ] }, "hru0sL1-D4bJSQI1efEyU": { "title": "Git Reflog", - "description": "", - "links": [] + "description": "Git reflog is a powerful tool in Git that keeps a record of all the changes made to the branches and commits in your repository, including actions that are not part of the regular commit history, such as resetting branches or checking out commits. It's particularly useful for recovering lost commits or understanding the history of changes in your repository, even if those changes are not reflected in the normal commit history.Reflog stands for \"reference log.\" It records when the tip of branches or other references (like HEAD) is updated in your repository.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git - git-reflog Documentation", + "url": "https://git-scm.com/docs/git-reflog", + "type": "article" + }, + { + "title": "What is the Git Reflog? | Learn Version Control with Git", + "url": "https://www.git-tower.com/learn/git/faq/what-is-git-reflog", + "type": "article" + }, + { + "title": "Learn Git Essentials 12: Git Reflog", + "url": "https://youtu.be/RVu8lpS7JFY?si=eNGBpsYfHtlyPClj", + "type": "video" + }, + { + "title": "Git Reflog Command. Get all log details of the reference using git reflog show command", + "url": "https://youtu.be/I4f4pddD16g?si=0Ny7xOJgiPgdfuh6", + "type": "video" + } + ] }, "ExXuwTQSI_lg4SRGW3Iu1": { "title": "Git Bisect", - "description": "", - "links": [] + "description": "Git Bisect is an interactive tool used to identify which commit in your project's history introduced a bug or regression. You start by identifying two commits: one where the issue isn't present (the \"good\" commit) and another where it is (the \"bad\" commit). Then, run `git bisect start`, followed by `git bisect good` for the good commit and `git bisect bad` for the bad commit. Git Bisect will guide you through a binary search process, asking you to test the midpoint of your current range until it identifies the exact commit that introduced the bug or regression.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git Bisect", + "url": "https://git-scm.com/docs/git-bisect", + "type": "article" + }, + { + "title": "Using git bisect to find the faulty commit", + "url": "https://dev.to/alvesjessica/using-git-bisect-to-find-the-faulty-commit-25gf", + "type": "article" + }, + { + "title": "Git Bisect | How to use Git Bisect | Learn Git", + "url": "https://www.youtube.com/watch?v=z-AkSXDqodc", + "type": "video" + } + ] }, "4dxVN81rXWn6VZqK99yq0": { "title": "Git Worktree", - "description": "", - "links": [] + "description": "A Git worktree allows you to create multiple working directories for a single repository, each with its own checkout and index. Unlike a regular checkout, which creates a new working directory for a specific branch and updates your IDE's configuration settings, a Git worktree does not require you to switch between branches using git checkout. This means you can have multiple branches checked out at the same time without affecting each other or requiring changes to your IDE configurations. By creating a separate worktree for each branch, you can stage changes independently and maintain distinct working directories without impacting the main repository or its working directory.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Git Worktree", + "url": "https://www.gitkraken.com/learn/git/git-worktree", + "type": "article" + }, + { + "title": "Manage Branches easily using Git Worktree", + "url": "https://www.youtube.com/watch?v=cRunWRC8ye0", + "type": "video" + } + ] }, "CGj_UX5JMOOCKinedsNRc": { "title": "Git Attributes", - "description": "", - "links": [] + "description": "Git attributes are settings stored in the .gitattributes file, controlling how Git handles files in your repository. They can influence filtering (e.g., ignoring specific files), conversion (formatting or transforming files during Git operations), and formatting (applying consistent styles). These settings can be applied to specific file types (like \\*.txt) or filter files based on content patterns. Attributes also define smudge patterns (highlighting differences) and ignore patterns, helping maintain a clean repository by automatically applying intended settings for certain file types.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "gitattributes/gitattributes", + "url": "https://github.com/gitattributes/gitattributes", + "type": "opensource" + }, + { + "title": "Customizing Git - Git Attributes", + "url": "https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes", + "type": "article" + }, + { + "title": "The benefits of git attributes and how to set them up", + "url": "https://medium.com/@cloudwala/the-benefits-of-git-attributes-and-how-to-set-them-up-87f90251b8e0", + "type": "article" + } + ] }, "zdunaucVe8J1tKf_z-NQo": { "title": "Git LFS", - "description": "", - "links": [] + "description": "Git Large File Storage (LFS) is an extension that helps manage large files by tracking metadata, not storing entire files. It allows storing and tracking binary assets like images, videos, audio files separately from your regular Git repository. By storing only metadata in your Git repository, you improve clone and push times, reducing storage usage. This approach is particularly useful for media repositories, large dataset storage, and binary asset management in game development. Note that Git LFS requires a separate server or storage system to store actual file content.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "Learning About Git Large File System (LFS)", + "url": "https://medium.com/swlh/learning-about-git-large-file-system-lfs-72e0c86cfbaf", + "type": "article" + }, + { + "title": "Git LFS (Large File Storage) | Learn Git", + "url": "https://www.youtube.com/watch?v=jXsvFfksvd0", + "type": "video" + } + ] }, "NV2HAXLEN7tskfgyFrbaf": { "title": "GitHub API", - "description": "The GitHub API is a powerful tool that allows developers to interact with the GitHub platform programmatically. It provides access to various GitHub features, such as user data, repository information, and commit history.", - "links": [] + "description": "The GitHub API is a powerful tool that allows developers to interact with the GitHub platform programmatically. It provides access to various GitHub features, such as user data, repository information, and commit history, through both REST and GraphQL interfaces. The API supports authentication, implements rate limiting, and offers webhooks for real-time notifications, enabling developers to automate tasks, create custom integrations, and build applications that leverage GitHub's functionality.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "official API Docs", + "url": "https://docs.github.com/en/rest?apiVersion=2022-11-28", + "type": "article" + }, + { + "title": "Getting started", + "url": "https://docs.github.com/en/rest/using-the-rest-api/getting-started-with-the-rest-api?apiVersion=2022-11-28", + "type": "article" + } + ] }, "lSCnKhmRr6xrKVYxO8idD": { "title": "REST API", @@ -1155,8 +2220,19 @@ }, "pFyMiyNQ16-kP7jKaKKEU": { "title": "GitHub Education", - "description": "GitHub Education is a program that provides free and discounted access to GitHub's developer tools, services, and resources for students, teachers, and researchers. This program aims to support education and research in software development, by making it easier for students and educators to learn, collaborate, and build projects on GitHub. By using GitHub Education, students can gain hands-on experience with real-world coding challenges, while educators can create a more engaging and interactive learning environment.", - "links": [] + "description": "GitHub Education is a program that provides free and discounted access to GitHub's developer tools, services, and resources for students, teachers, and researchers. This program aims to support education and research in software development, by making it easier for students and educators to learn, collaborate, and build projects on GitHub. By using GitHub Education, students can gain hands-on experience with real-world coding challenges, while educators can create a more engaging and interactive learning environment.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "official GitHub Education Docs", + "url": "https://education.github.com/", + "type": "article" + }, + { + "title": "GitHub GitHub Education: free programs, technology, and opportunities available for Students", + "url": "https://www.youtube.com/watch?v=HIVFdN9VGgw", + "type": "video" + } + ] }, "XRSVRl6iHncMmgSXoB7Lq": { "title": "Student Developer Pack", @@ -1269,5 +2345,16 @@ "type": "video" } ] + }, + "Ddkss13_qDJTquDHbVTVs": { + "title": "CITATION files", + "description": "You can add a CITATION.cff file to the root of a repository to let others know how you would like them to cite your work. The citation file format is plain text with human- and machine-readable citation information.\n\nVisit the following resources to learn more:", + "links": [ + { + "title": "CITATION Files Documentation", + "url": "https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-citation-files", + "type": "article" + } + ] } } \ No newline at end of file diff --git a/public/roadmap-content/react.json b/public/roadmap-content/react.json index 9c9e51aea..f55db6218 100644 --- a/public/roadmap-content/react.json +++ b/public/roadmap-content/react.json @@ -1403,13 +1403,23 @@ }, "W-atg_Msa9uPLr6RXAKSb": { "title": "Frameworks", - "description": "Server-side rendering (SSR) is a technique for rendering a JavaScript application on the server, rather than in the browser. This can improve the performance and user experience of a web application, as the initial render of the application is done on the server and the content is sent to the browser as a fully-rendered HTML page.\n\nThere are several frameworks and libraries available for server-side rendering React applications, most common being:\n\nNext.JS\n-------\n\nNext.js is a React framework for building full-stack web applications. You use React Components to build user interfaces, and Next.js for additional features and optimizations.\n\n* [@article@Next.js](https://nextjs.org/)\n* [@video@Next.js 14 Full Course 2024](https://www.youtube.com/watch?v=wm5gMKuwSYk)\n\nRemix.JS\n--------\n\nRemix is a full stack web framework that lets you focus on the user interface and work back through web standards to deliver a fast, slick, and resilient user experience. People are gonna love using your stuff.", + "description": "Server-side rendering (SSR) is a technique for rendering a JavaScript application on the server, rather than in the browser. This can improve the performance and user experience of a web application, as the initial render of the application is done on the server and the content is sent to the browser as a fully-rendered HTML page.\n\nThere are several frameworks and libraries available for server-side rendering React applications, most common being Next.js and Remix:\n\nVisit the following resources to learn more:", "links": [ + { + "title": "Next.js", + "url": "https://nextjs.org/", + "type": "article" + }, { "title": "Remix", "url": "https://remix.run/", "type": "article" }, + { + "title": "Next.js 14 Full Course 2024", + "url": "https://www.youtube.com/watch?v=wm5gMKuwSYk", + "type": "video" + }, { "title": "Remix Crash Course", "url": "https://www.youtube.com/watch?v=RBYJTop1e-g", diff --git a/public/roadmap-content/sql.json b/public/roadmap-content/sql.json index 87d91751d..6d7268668 100644 --- a/public/roadmap-content/sql.json +++ b/public/roadmap-content/sql.json @@ -119,7 +119,7 @@ "description": "", "links": [] }, - "insert@mPj6BiK5FKKkIQ9WsWEo6.md": { + "mPj6BiK5FKKkIQ9WsWEo6": { "title": "INSERT", "description": "", "links": [] @@ -129,7 +129,7 @@ "description": "", "links": [] }, - "delete@ddtVaA4Ls6qRj-7OtTSIH.md": { + "ddtVaA4Ls6qRj-7OtTSIH": { "title": "DELETE", "description": "", "links": [] From ec06adb01a44b0a281dd8370a838c58b4265ca7a Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Sat, 17 Aug 2024 01:39:53 +0100 Subject: [PATCH 010/120] Update discord URL --- src/pages/discord.astro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/discord.astro b/src/pages/discord.astro index f00cac2c9..df02f1f1f 100644 --- a/src/pages/discord.astro +++ b/src/pages/discord.astro @@ -1,6 +1,6 @@ --- export const prerender = false; -const discordLink = 'https://discord.gg/ZrSpJ8zH'; +const discordLink = 'https://discord.gg/GBY7zEc3uB'; return Astro.redirect(discordLink); --- From 7643cca066b6282ea8994745f2d589db88b975f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Oliveira?= <53203742+andreluis-oliveira@users.noreply.github.com> Date: Fri, 16 Aug 2024 21:42:26 -0300 Subject: [PATCH 011/120] [suggestion] swap CEH and CISSP positions (#6612) * Update dns.md - Fix the YouTube video link error and update the video title. * Update understand-cia-triad.md * Update comptia-security.md - Fix all broken links. - Update Exam Details. - Add new links. - Remove outdated links. * Update comptia-network.md - Update Exam Details. - Preparation Resources. - New links. * Update dnssec.md - summarized content. - relevant links. * Update apt.md - New section - Added a new link * Update comptia-a.md - Updated Professor Messer's link - New links added * Apply suggestions from code review * Update attck.md - new content. - relevant links. * Update src/data/roadmaps/cyber-security/content/attck@auR7fNyd77W2UA-PjXeJS.md * Update linux.md, comptia-linux.md and understand-the-osi-model.md Update linux.md - New Links - Remove Google Analytics parameters from link Update comptia-linux.md - Links updated Update understand-the-osi-model.md - New link * Update cissp.md - new resources links * Update src/data/roadmaps/cyber-security/content/cissp@BqvijNoRzSGYLCMP-6hhr.md * update basics-of-ids-and-ips.md - new links * update endpoint-security.md - new links * update edr.md - new text and links. update ssl-and-tls-basics.md - new links update ssl--tls.md - new links update dropbox.md - official link * ipsec.md - new content - new link kali-linux.md - new content linux.md - fix typo * Update src/data/roadmaps/cyber-security/content/kali-linux@w6wXkoLrv0_d-Ah0txUHd.md * change the CEH position to CISSP This is a suggestion, I believe that CEH appears as a highlight due to the larger space and this bothers many people. CISSP is a top professional-level certification in the field of cybersecurity and the the most respected certificate in the IT security field. He really deserves his place in the spotlight. --------- Co-authored-by: dsh Co-authored-by: Kamran Ahmed --- src/data/roadmaps/cyber-security/cyber-security.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/data/roadmaps/cyber-security/cyber-security.json b/src/data/roadmaps/cyber-security/cyber-security.json index 6278b9994..496b8b742 100644 --- a/src/data/roadmaps/cyber-security/cyber-security.json +++ b/src/data/roadmaps/cyber-security/cyber-security.json @@ -1749,7 +1749,7 @@ "focusable": true }, { - "id": "BqvijNoRzSGYLCMP-6hhr", + "id": "AAo7DXB7hyBzO6p05gx1i", "type": "subtopic", "position": { "x": -390.0291449445003, @@ -1757,7 +1757,7 @@ }, "selected": false, "data": { - "label": "CISSP", + "label": "CEH", "style": { "fontSize": 17, "justifyContent": "flex-start", @@ -2045,7 +2045,7 @@ "selectable": true }, { - "id": "AAo7DXB7hyBzO6p05gx1i", + "id": "BqvijNoRzSGYLCMP-6hhr", "type": "subtopic", "position": { "x": -389.24003999212795, @@ -2053,7 +2053,7 @@ }, "selected": false, "data": { - "label": "CEH", + "label": "CISSP", "style": { "fontSize": 17, "justifyContent": "flex-start", @@ -12001,4 +12001,4 @@ "focusable": true } ] -} \ No newline at end of file +} From 4951984ff11c5fd5606922c327be62d11116866a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vedansh=20=E2=9C=A8?= Date: Sat, 17 Aug 2024 16:24:05 +0530 Subject: [PATCH 012/120] Update git log content (#6625) * Improve `git-log-options` * Update src/data/roadmaps/git-github/content/git-log-options@qFEonbCMLri8iA0yONwuf.md --------- Co-authored-by: Kamran Ahmed --- .../git-log-options@qFEonbCMLri8iA0yONwuf.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/data/roadmaps/git-github/content/git-log-options@qFEonbCMLri8iA0yONwuf.md b/src/data/roadmaps/git-github/content/git-log-options@qFEonbCMLri8iA0yONwuf.md index fd993165e..90ac1c45e 100644 --- a/src/data/roadmaps/git-github/content/git-log-options@qFEonbCMLri8iA0yONwuf.md +++ b/src/data/roadmaps/git-github/content/git-log-options@qFEonbCMLri8iA0yONwuf.md @@ -4,12 +4,13 @@ Here are some common git log options: -- -2: Only show the last two commits. -- --all: Show all branches in the repository. -- --graph: Display the commit history as a graph. -- --no-color: Disable colorized output. -- --stat: Show a statistical summary of changes. -- **-S`: Only show commits with modified files. +- `-2`: Only show the last two commits. +- `--all`: Show all branches in the repository. +- `--graph`: Display the commit history as a graph. +- `--pretty`: Enable clean colorized output. +- `--no-color`: Disable colorized output. +- `--stat`: Show a statistical summary of changes. +- `**-S`: Only show commits with modified files. You can combine these options to tailor your log output to suit your needs. @@ -18,4 +19,4 @@ For example, `git log -2 --graph` will display the last two commits in graph for Visit the following resources to learn more: - [@official@Git Log](https://git-scm.com/docs/git-log) -- [@article@Git Log Cheatsheet](https://elijahmanor.com/blog/git-log) \ No newline at end of file +- [@article@Git Log Cheatsheet](https://elijahmanor.com/blog/git-log) From 998e6510a6f814c7e1458c22ae3d389832470464 Mon Sep 17 00:00:00 2001 From: SheySafiAllah <58422301+SheydaSafiallah@users.noreply.github.com> Date: Sat, 17 Aug 2024 14:24:38 +0330 Subject: [PATCH 013/120] Add javascript article (#6624) --- src/data/roadmaps/devops/content/bash@syBIAL1mHbJLnTBoSxXI7.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/data/roadmaps/devops/content/bash@syBIAL1mHbJLnTBoSxXI7.md b/src/data/roadmaps/devops/content/bash@syBIAL1mHbJLnTBoSxXI7.md index c440361fa..1bed30145 100644 --- a/src/data/roadmaps/devops/content/bash@syBIAL1mHbJLnTBoSxXI7.md +++ b/src/data/roadmaps/devops/content/bash@syBIAL1mHbJLnTBoSxXI7.md @@ -1,4 +1,5 @@ # Bash scripting - [@article@Interactive Shell Scripting Tutorial](https://www.learnshell.org/en/Welcome) -- [@feed@Explore top posts about Bash](https://app.daily.dev/tags/bash?ref=roadmapsh) \ No newline at end of file +- [@article@Bash Scripting Tutorial](https://www.javatpoint.com/bash) +- [@feed@Explore top posts about Bash](https://app.daily.dev/tags/bash?ref=roadmapsh) From 2d98e1beae8ef950b662d2b4cb908f60c9e1b2f8 Mon Sep 17 00:00:00 2001 From: Maximo Comperatore <131000419+pyoneerC@users.noreply.github.com> Date: Sat, 17 Aug 2024 07:55:02 -0300 Subject: [PATCH 014/120] Add x frame resource (#6621) --- .../best-practices/api-security/content/x-frame-options-deny.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/data/best-practices/api-security/content/x-frame-options-deny.md b/src/data/best-practices/api-security/content/x-frame-options-deny.md index bf6e7450b..70217a521 100644 --- a/src/data/best-practices/api-security/content/x-frame-options-deny.md +++ b/src/data/best-practices/api-security/content/x-frame-options-deny.md @@ -3,3 +3,5 @@ > Send `X-Frame-Options: deny` header. The `X-Frame-Options` header prevents the page from being displayed in an iframe, which is commonly used in clickjacking attacks. By setting the value of this header to `deny`, you are telling the browser not to display the page in any iframe. This helps prevent the page from being embedded within an attacker's website and reduces the risk of clickjacking attacks. + +- [@video@Tutorial - X-Frame-Options HTTP Header and Click-Jacking](https://www.youtube.com/watch?v=Els0GRj0CQM) \ No newline at end of file From 2c2e9b6e8c472e722e09f9b830145731ebea3f7e Mon Sep 17 00:00:00 2001 From: Maximo Comperatore <131000419+pyoneerC@users.noreply.github.com> Date: Sat, 17 Aug 2024 07:55:35 -0300 Subject: [PATCH 015/120] Add graphql resource (#6620) * graphql in 100 seconds * Update src/data/roadmaps/backend/content/graphql@zp3bq38tMnutT2N0tktOW.md --------- Co-authored-by: Kamran Ahmed --- .../roadmaps/backend/content/graphql@zp3bq38tMnutT2N0tktOW.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/roadmaps/backend/content/graphql@zp3bq38tMnutT2N0tktOW.md b/src/data/roadmaps/backend/content/graphql@zp3bq38tMnutT2N0tktOW.md index b7cbb78bc..153d3e0d6 100644 --- a/src/data/roadmaps/backend/content/graphql@zp3bq38tMnutT2N0tktOW.md +++ b/src/data/roadmaps/backend/content/graphql@zp3bq38tMnutT2N0tktOW.md @@ -11,4 +11,5 @@ GraphQL is widely used in modern web and mobile applications, and it is supporte Visit the following resources to learn more: - [@official@GraphQL Official Website](https://graphql.org/) +- [@video@Tutorial - GraphQL Explained in 100 Seconds](https://www.youtube.com/watch?v=eIQh02xuVw4) - [@feed@Explore top posts about GraphQL](https://app.daily.dev/tags/graphql?ref=roadmapsh) From 61973681338c306cc9b1a57c95a32c63284ac70a Mon Sep 17 00:00:00 2001 From: Maximo Comperatore <131000419+pyoneerC@users.noreply.github.com> Date: Sat, 17 Aug 2024 07:55:56 -0300 Subject: [PATCH 016/120] Add content to timescale db (#6619) --- .../backend/content/timescale@WiAK70I0z-_bzbWNwiHUd.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/data/roadmaps/backend/content/timescale@WiAK70I0z-_bzbWNwiHUd.md b/src/data/roadmaps/backend/content/timescale@WiAK70I0z-_bzbWNwiHUd.md index 40e824338..586b56e59 100644 --- a/src/data/roadmaps/backend/content/timescale@WiAK70I0z-_bzbWNwiHUd.md +++ b/src/data/roadmaps/backend/content/timescale@WiAK70I0z-_bzbWNwiHUd.md @@ -1 +1,9 @@ -# TimeScale \ No newline at end of file +# TimeScale + +TimescaleDB is an open-source time-series database built on top of PostgreSQL, designed for efficiently storing and querying time-series data. + +It introduces the concept of hypertables, which automatically partition data by time and space, making it ideal for high-volume data scenarios like monitoring, IoT, and financial analytics. + +TimescaleDB combines the power of relational databases with the performance of a specialized time-series solution, offering advanced features like continuous aggregates, real-time analytics, and seamless integration with PostgreSQL's ecosystem. + +It's a robust choice for developers looking to manage time-series data in scalable and efficient ways. \ No newline at end of file From 1168ac7fe7ba12103f21ff83322cdfab02e95283 Mon Sep 17 00:00:00 2001 From: falc <76709589+falcolnic@users.noreply.github.com> Date: Sat, 17 Aug 2024 13:58:18 +0300 Subject: [PATCH 017/120] Add content for evil twin (#6613) * Update evil-twin@O1fY2n40yjZtJUEeoItKr.md * Update src/data/roadmaps/cyber-security/content/evil-twin@O1fY2n40yjZtJUEeoItKr.md * Update src/data/roadmaps/cyber-security/content/evil-twin@O1fY2n40yjZtJUEeoItKr.md --------- Co-authored-by: Kamran Ahmed --- .../evil-twin@O1fY2n40yjZtJUEeoItKr.md | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/data/roadmaps/cyber-security/content/evil-twin@O1fY2n40yjZtJUEeoItKr.md b/src/data/roadmaps/cyber-security/content/evil-twin@O1fY2n40yjZtJUEeoItKr.md index e69de29bb..61de1ad1f 100644 --- a/src/data/roadmaps/cyber-security/content/evil-twin@O1fY2n40yjZtJUEeoItKr.md +++ b/src/data/roadmaps/cyber-security/content/evil-twin@O1fY2n40yjZtJUEeoItKr.md @@ -0,0 +1,21 @@ +# What is Evil Twin attack + +An Evil Twin is a type of wireless network attack where an attacker sets up a rogue Wi-Fi access point that mimics a legitimate Wi-Fi network. The rogue access point has the same SSID (network name) as the legitimate network, making it difficult for users to distinguish between the two. The attacker's goal is to trick users into connecting to the rogue access point, allowing them to intercept sensitive information, inject malware, or launch other types of attacks. + +## Types of Evil Twin Attacks + +- **Captive Portal Attack:** The most common evil twin attack scenario is an attack using Captive Portals, this is a common scenario where an attacker creates a fake captive portal that mimics the legitimate network's login page. +The goal is to trick users into entering their credentials, which the attacker can then use to gain access to the network. +- **Man-in-the-Middle (MitM) Attack:** In this scenario, the attacker intercepts communication between the user's device and the legitimate network. The attacker can then inject malware, steal sensitive information, or modify data in real-time. +- **SSL Stripping Attack:** The attacker downgrades the user's connection from HTTPS to HTTP, allowing them to intercept sensitive information, such as login credentials or credit card numbers. +- **Malware Injection:** The attacker injects malware into the user's device, which can then spread to other devices on the network. + +## How Evil Twin Attacks are Carried Out + +- **Rogue Access Point:** The attacker sets up a rogue access point with the same SSID as the legitimate network. This can be done using a laptop, a portable Wi-Fi router, or even a compromised device on the network. +- **Wi-Fi Scanning:** The attacker uses specialized software to scan for nearby Wi-Fi networks and identify potential targets. +- **Network Sniffing:** The attacker uses network sniffing tools to capture and analyze network traffic, allowing them to identify vulnerabilities and intercept sensitive information. + +Visit the following resources to learn more: + +- [@website@Common tool - airgeddon](https://www.kali.org/tools/airgeddon/) From 38afa2631f247adc9066069beb605c9014650f3d Mon Sep 17 00:00:00 2001 From: Abdelrahman Omar <128975938+abd0-omar@users.noreply.github.com> Date: Sat, 17 Aug 2024 13:58:54 +0300 Subject: [PATCH 018/120] Add linked list resource (#6608) Add "Too Many Linked Lists" book to Rust LinkedList resources --- .../101-language-basics/103-data-structures/110-linked-list.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/roadmaps/rust/content/101-language-basics/103-data-structures/110-linked-list.md b/src/data/roadmaps/rust/content/101-language-basics/103-data-structures/110-linked-list.md index 3b57e1d82..124930269 100644 --- a/src/data/roadmaps/rust/content/101-language-basics/103-data-structures/110-linked-list.md +++ b/src/data/roadmaps/rust/content/101-language-basics/103-data-structures/110-linked-list.md @@ -5,3 +5,4 @@ The **Linked List** in Rust is a sequence of nodes where each node consists of a Learn more from the following links: - [@official@LinkedList in std::collections - Rust](https://doc.rust-lang.org/std/collections/struct.LinkedList.html) +- [@opensource@Too Many Linked Lists](https://rust-unofficial.github.io/too-many-lists/) From 8a5c0eeb5f262f41e1d17c7bda1c9efaf9b42f5e Mon Sep 17 00:00:00 2001 From: abayram <38274063+abdullahbayram@users.noreply.github.com> Date: Sat, 17 Aug 2024 13:55:53 +0200 Subject: [PATCH 019/120] Add content to react native (#6607) * docs(update): add TypeScript next to JavaScript in the introduction definition * docs(add): add content about integration with existing apps. * Update src/data/roadmaps/react-native/content/100-introduction/100-what-is-react-native.md * Update src/data/roadmaps/react-native/content/100-introduction/index.md * Update src/data/roadmaps/react-native/content/100-introduction/101-why-react-native.md --------- Co-authored-by: Kamran Ahmed --- .../content/100-introduction/100-what-is-react-native.md | 2 +- .../content/100-introduction/101-why-react-native.md | 5 +++-- .../roadmaps/react-native/content/100-introduction/index.md | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/data/roadmaps/react-native/content/100-introduction/100-what-is-react-native.md b/src/data/roadmaps/react-native/content/100-introduction/100-what-is-react-native.md index 420894c00..3cfcbaf8d 100644 --- a/src/data/roadmaps/react-native/content/100-introduction/100-what-is-react-native.md +++ b/src/data/roadmaps/react-native/content/100-introduction/100-what-is-react-native.md @@ -1,6 +1,6 @@ # React Native -React Native is a popular open-source framework developed by Facebook for building mobile applications using JavaScript and React. It enables developers to build native mobile apps for iOS and Android platforms using a single codebase, which significantly speeds up development without compromising on the performance and usability of the apps. +React Native is a popular open-source framework developed by Facebook for building mobile applications using JavaScript (or TypeScript) and React. It enables developers to build native mobile apps for iOS and Android platforms using a single codebase, which significantly speeds up development without compromising on the performance and usability of the apps. With React Native, you write components with JSX, a syntax that combines JavaScript and XML. These components can map to native UI elements like views, text, images, and more. diff --git a/src/data/roadmaps/react-native/content/100-introduction/101-why-react-native.md b/src/data/roadmaps/react-native/content/100-introduction/101-why-react-native.md index bfce6a013..117fb3432 100644 --- a/src/data/roadmaps/react-native/content/100-introduction/101-why-react-native.md +++ b/src/data/roadmaps/react-native/content/100-introduction/101-why-react-native.md @@ -1,9 +1,10 @@ # Why React Native? -React Native is a widely popular framework for building native mobile applications using JavaScript and React. There are plenty of reasons why you would want to choose React Native for your next mobile app development project: +React Native is a widely popular framework for building native mobile applications using JavaScript (or TypeScript) and React. There are plenty of reasons why you would want to choose React Native for your next mobile app development project: - **Code Reusability:** React Native allows you to share a significant amount of your codebase between iOS and Android platforms. This not only reduces the development time but also makes it easier to maintain the app. - **Familiar React Concepts:** If you're already familiar with ReactJS, React Native will feel right at home for you. Since it's based on React, the same principles of components and state management apply in React Native too. - **Native Performance:** React Native apps deliver near-native performance as the framework works directly with native components like Views and Text, thus eliminating the need for WebView or other similar intermediaries. - **Vast Ecosystem:** React Native enjoys a huge community and vast ecosystem that includes a wide range of libraries and tools that simplify and accelerate the development process. Additionally, Facebook and other major companies actively contribute to the growth and improvement of React Native. -- **Hot Reloading:** React Native supports hot-reloading, which means you can see the changes you make in your code directly on the device/emulator without having to recompile or rebuild the app entirely. This makes for a faster and more efficient development process. \ No newline at end of file +- **Hot Reloading:** React Native supports hot-reloading, which means you can see the changes you make in your code directly on the device/emulator without having to recompile or rebuild the app entirely. This makes for a faster and more efficient development process. +- **Integration with Existing Apps:** Can be incorporated into existing mobile applications, providing flexibility to extend only parts of an app. diff --git a/src/data/roadmaps/react-native/content/100-introduction/index.md b/src/data/roadmaps/react-native/content/100-introduction/index.md index 5a051f219..e0220d492 100644 --- a/src/data/roadmaps/react-native/content/100-introduction/index.md +++ b/src/data/roadmaps/react-native/content/100-introduction/index.md @@ -1,6 +1,6 @@ # Introduction -React Native is an open-source framework developed by Facebook that allows developers to build mobile applications using JavaScript and React. It enables building apps for both iOS and Android platforms by offering a shared codebase, which significantly reduces development time and effort. +React Native is an open-source framework developed by Facebook that allows developers to build mobile applications using JavaScript (or TypeScript) and React. It enables building apps for both iOS and Android platforms by offering a shared codebase, which significantly reduces development time and effort. Visit the following resources to learn more: From 1981568501cd27145131ee87bae365d3e305d773 Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sat, 17 Aug 2024 17:59:35 +0600 Subject: [PATCH 020/120] feat: implement project status (#6513) * wip * wip * wip * fix: button width * Add stepper component * Refactor project stepper * Refactor stepper * Refactor stepper * Update clicker * Refactor project stepper * Add projects tip popup * Add start project modal * Submission requirement modalg * Requirement verification functionality * Update project submission * Voting and active timeline * Finalize project solution stepper * Update empty project page * Add user avatars * Solutions listing page * Update tab design * Fix styles for loading and pagination * Redesign project page header * Make project page responsive * Make project pages responsive * Update the leaving roadmap page * Start project modal updates --------- Co-authored-by: Kamran Ahmed --- .astro/settings.json | 2 +- src/components/Modal.tsx | 4 +- src/components/OpenSourceStat.astro | 2 +- src/components/Projects/EmptySolutions.tsx | 29 ++ .../Projects/LeavingRoadmapWarningModal.tsx | 64 ++++ .../Projects/ListProjectSolutions.tsx | 327 ++++++++++++++++++ src/components/Projects/LoadingSolutions.tsx | 44 +++ src/components/Projects/ProjectTabs.tsx | 69 ++++ src/components/Projects/StartProjectModal.tsx | 169 +++++++++ .../Projects/StatusStepper/MilestoneStep.tsx | 37 ++ .../Projects/StatusStepper/ProjectStepper.tsx | 245 +++++++++++++ .../Projects/StatusStepper/StepperAction.tsx | 51 +++ .../StatusStepper/StepperStepSeparator.tsx | 17 + .../Projects/SubmissionRequirement.tsx | 44 +++ .../Projects/SubmitProjectModal.tsx | 299 ++++++++++++++++ src/components/Projects/VoteButton.tsx | 30 ++ src/components/TeamDropdown/TeamDropdown.tsx | 27 -- src/hooks/use-sticky-stuck.tsx | 29 ++ src/layouts/BaseLayout.astro | 5 +- src/lib/date.ts | 6 +- src/lib/is-mobile.ts | 6 + src/pages/projects/[projectId].astro | 129 ------- src/pages/projects/[projectId]/index.astro | 94 +++++ .../projects/[projectId]/solutions.astro | 66 ++++ 24 files changed, 1633 insertions(+), 162 deletions(-) create mode 100644 src/components/Projects/EmptySolutions.tsx create mode 100644 src/components/Projects/LeavingRoadmapWarningModal.tsx create mode 100644 src/components/Projects/ListProjectSolutions.tsx create mode 100644 src/components/Projects/LoadingSolutions.tsx create mode 100644 src/components/Projects/ProjectTabs.tsx create mode 100644 src/components/Projects/StartProjectModal.tsx create mode 100644 src/components/Projects/StatusStepper/MilestoneStep.tsx create mode 100644 src/components/Projects/StatusStepper/ProjectStepper.tsx create mode 100644 src/components/Projects/StatusStepper/StepperAction.tsx create mode 100644 src/components/Projects/StatusStepper/StepperStepSeparator.tsx create mode 100644 src/components/Projects/SubmissionRequirement.tsx create mode 100644 src/components/Projects/SubmitProjectModal.tsx create mode 100644 src/components/Projects/VoteButton.tsx create mode 100644 src/hooks/use-sticky-stuck.tsx delete mode 100644 src/pages/projects/[projectId].astro create mode 100644 src/pages/projects/[projectId]/index.astro create mode 100644 src/pages/projects/[projectId]/solutions.astro diff --git a/.astro/settings.json b/.astro/settings.json index 166c25ab1..76d2425cb 100644 --- a/.astro/settings.json +++ b/.astro/settings.json @@ -3,6 +3,6 @@ "enabled": false }, "_variables": { - "lastUpdateCheck": 1723501110773 + "lastUpdateCheck": 1723855511353 } } \ No newline at end of file diff --git a/src/components/Modal.tsx b/src/components/Modal.tsx index ac28c9e7c..d8167ff7a 100644 --- a/src/components/Modal.tsx +++ b/src/components/Modal.tsx @@ -33,7 +33,7 @@ export function Modal(props: ModalProps) { return (
@@ -46,7 +46,7 @@ export function Modal(props: ModalProps) {
diff --git a/src/components/OpenSourceStat.astro b/src/components/OpenSourceStat.astro index e95a94bd8..f6e2bb063 100644 --- a/src/components/OpenSourceStat.astro +++ b/src/components/OpenSourceStat.astro @@ -44,7 +44,7 @@ const isDiscordMembers = text.toLowerCase() === 'discord members'; }

{value}

diff --git a/src/components/Projects/EmptySolutions.tsx b/src/components/Projects/EmptySolutions.tsx new file mode 100644 index 000000000..dcaf5b591 --- /dev/null +++ b/src/components/Projects/EmptySolutions.tsx @@ -0,0 +1,29 @@ +import { Blocks, CodeXml } from 'lucide-react'; + +type EmptySolutionsProps = { + projectId: string; +}; + +export function EmptySolutions(props: EmptySolutionsProps) { + const { projectId } = props; + + return ( +
+ +

+ No solutions submitted yet +

+

+ Be the first to submit a solution for this project +

+ +
+ ); +} diff --git a/src/components/Projects/LeavingRoadmapWarningModal.tsx b/src/components/Projects/LeavingRoadmapWarningModal.tsx new file mode 100644 index 000000000..9a48846df --- /dev/null +++ b/src/components/Projects/LeavingRoadmapWarningModal.tsx @@ -0,0 +1,64 @@ +import { ArrowUpRight, X } from 'lucide-react'; +import { Modal } from '../Modal'; +import { SubmissionRequirement } from './SubmissionRequirement.tsx'; + +type LeavingRoadmapWarningModalProps = { + onClose: () => void; + onContinue: () => void; +}; + +export function LeavingRoadmapWarningModal( + props: LeavingRoadmapWarningModalProps, +) { + const { onClose, onContinue } = props; + + return ( + +

Leaving roadmap.sh

+

+ You are about to visit the project solution on GitHub. We recommend you + to follow these tips before you leave. +

+ +
+

+ Make sure to come back and{' '} + leave an upvote{' '} + if you liked the solution. It helps the author and the community. +

+ +

+ If you have feedback on the solution, open an issue or a pull request + on the{' '} + + solution repository + + . +

+ +

+ Downvote the solution if it is{' '} + + incorrect or misleading + + . It helps the community. It helps the community. +

+
+ + + + +
+ ); +} diff --git a/src/components/Projects/ListProjectSolutions.tsx b/src/components/Projects/ListProjectSolutions.tsx new file mode 100644 index 000000000..28542a88f --- /dev/null +++ b/src/components/Projects/ListProjectSolutions.tsx @@ -0,0 +1,327 @@ +import { useEffect, useState } from 'react'; +import { useToast } from '../../hooks/use-toast'; +import { httpGet, httpPost } from '../../lib/http'; +import { LoadingSolutions } from './LoadingSolutions'; +import { EmptySolutions } from './EmptySolutions'; +import { ThumbsDown, ThumbsUp } from 'lucide-react'; +import { getRelativeTimeString } from '../../lib/date'; +import { Pagination } from '../Pagination/Pagination'; +import { deleteUrlParam, getUrlParams, setUrlParams } from '../../lib/browser'; +import { pageProgressMessage } from '../../stores/page'; +import { LeavingRoadmapWarningModal } from './LeavingRoadmapWarningModal'; +import { isLoggedIn } from '../../lib/jwt'; +import { showLoginPopup } from '../../lib/popup'; +import { VoteButton } from './VoteButton.tsx'; +import { GitHubIcon } from '../ReactIcons/GitHubIcon.tsx'; +import { cn } from '../../lib/classname.ts'; + +export interface ProjectStatusDocument { + _id?: string; + + userId: string; + projectId: string; + + startedAt?: Date; + submittedAt?: Date; + repositoryUrl?: string; + + upvotes: number; + downvotes: number; + + isVisible?: boolean; + + updated1t: Date; +} + +const allowedVoteType = ['upvote', 'downvote'] as const; +export type AllowedVoteType = (typeof allowedVoteType)[number]; + +type ListProjectSolutionsResponse = { + data: (ProjectStatusDocument & { + user: { + id: string; + name: string; + avatar: string; + }; + voteType?: AllowedVoteType | 'none'; + })[]; + totalCount: number; + totalPages: number; + currPage: number; + perPage: number; +}; + +type QueryParams = { + p?: string; +}; + +type PageState = { + currentPage: number; +}; + +const VISITED_SOLUTIONS_KEY = 'visited-project-solutions'; + +type ListProjectSolutionsProps = { + projectId: string; +}; + +const submittedAlternatives = [ + 'submitted their solution', + 'got it done', + 'submitted their take', + 'finished the project', + 'submitted their work', + 'completed the project', + 'got it done', + 'delivered their project', + 'handed in their solution', + 'provided their deliverables', + 'submitted their approach', + 'sent in their project', + 'presented their take', + 'shared their completed task', + 'submitted their approach', + 'completed it', + 'finalized their solution', + 'delivered their approach', + 'turned in their project', + 'submitted their final draft', + 'delivered their solution', +]; + +export function ListProjectSolutions(props: ListProjectSolutionsProps) { + const { projectId } = props; + + const toast = useToast(); + const [pageState, setPageState] = useState({ + currentPage: 0, + }); + + const [isLoading, setIsLoading] = useState(true); + const [solutions, setSolutions] = useState(); + const [alreadyVisitedSolutions, setAlreadyVisitedSolutions] = useState< + Record + >({}); + const [showLeavingRoadmapModal, setShowLeavingRoadmapModal] = useState< + ListProjectSolutionsResponse['data'][number] | null + >(null); + + const loadSolutions = async (page = 1) => { + const { response, error } = await httpGet( + `${import.meta.env.PUBLIC_API_URL}/v1-list-project-solutions/${projectId}`, + { + currPage: page, + }, + ); + + if (error || !response) { + toast.error(error?.message || 'Failed to load project solutions'); + setIsLoading(false); + return; + } + + setSolutions(response); + }; + + const handleSubmitVote = async ( + solutionId: string, + voteType: AllowedVoteType, + ) => { + if (!isLoggedIn()) { + showLoginPopup(); + return; + } + + pageProgressMessage.set('Submitting vote...'); + const { response, error } = await httpPost( + `${import.meta.env.PUBLIC_API_URL}/v1-vote-project/${solutionId}`, + { + voteType, + }, + ); + + if (error || !response) { + toast.error(error?.message || 'Failed to submit vote'); + pageProgressMessage.set(''); + return; + } + + pageProgressMessage.set(''); + setSolutions((prev) => { + if (!prev) { + return prev; + } + + return { + ...prev, + data: prev.data.map((solution) => { + if (solution._id === solutionId) { + return { + ...solution, + upvotes: response?.upvotes || 0, + downvotes: response?.downvotes || 0, + voteType, + }; + } + + return solution; + }), + }; + }); + }; + + useEffect(() => { + const queryParams = getUrlParams() as QueryParams; + const alreadyVisitedSolutions = JSON.parse( + localStorage.getItem(VISITED_SOLUTIONS_KEY) || '{}', + ); + + setAlreadyVisitedSolutions(alreadyVisitedSolutions); + setPageState({ + currentPage: +(queryParams.p || '1'), + }); + }, []); + + useEffect(() => { + setIsLoading(true); + if (!pageState.currentPage) { + return; + } + + if (pageState.currentPage !== 1) { + setUrlParams({ + p: String(pageState.currentPage), + }); + } else { + deleteUrlParam('p'); + } + + loadSolutions(pageState.currentPage).finally(() => { + setIsLoading(false); + }); + }, [pageState]); + + if (isLoading) { + return ; + } + + const isEmpty = solutions?.data.length === 0; + if (isEmpty) { + return ; + } + + const leavingRoadmapModal = showLeavingRoadmapModal ? ( + setShowLeavingRoadmapModal(null)} + onContinue={() => { + const visitedSolutions = { + ...alreadyVisitedSolutions, + [showLeavingRoadmapModal._id!]: true, + }; + localStorage.setItem( + VISITED_SOLUTIONS_KEY, + JSON.stringify(visitedSolutions), + ); + + window.open(showLeavingRoadmapModal.repositoryUrl, '_blank'); + }} + /> + ) : null; + + return ( +
+ {leavingRoadmapModal} + +
+ {solutions?.data.map((solution, counter) => { + const isVisited = alreadyVisitedSolutions[solution._id!]; + const avatar = solution.user.avatar || ''; + + return ( +
+
+ {solution.user.name} + + {solution.user.name} + + + {submittedAlternatives[ + counter % submittedAlternatives.length + ] || 'submitted their solution'} + {' '} + + {getRelativeTimeString(solution?.submittedAt!)} + +
+ +
+ + { + handleSubmitVote(solution._id!, 'upvote'); + }} + /> + + { + handleSubmitVote(solution._id!, 'downvote'); + }} + /> + + + { + e.preventDefault(); + setShowLeavingRoadmapModal(solution); + }} + target="_blank" + href={solution.repositoryUrl} + > + + Visit Solution + +
+
+ ); + })} +
+ + {(solutions?.totalPages || 0) > 1 && ( +
+ { + setPageState({ + ...pageState, + currentPage: page, + }); + }} + /> +
+ )} +
+ ); +} diff --git a/src/components/Projects/LoadingSolutions.tsx b/src/components/Projects/LoadingSolutions.tsx new file mode 100644 index 000000000..f327fd81e --- /dev/null +++ b/src/components/Projects/LoadingSolutions.tsx @@ -0,0 +1,44 @@ +import { isMobileScreen } from '../../lib/is-mobile.ts'; + +export function LoadingSolutions() { + const totalCount = isMobileScreen() ? 3 : 11; + + const loadingRow = ( +
  • + + + + + + + + +
  • + ); + + return ( +
      + {loadingRow} + {loadingRow} + {loadingRow} + {loadingRow} + {loadingRow} + {loadingRow} + {loadingRow} + {loadingRow} + {loadingRow} + {loadingRow} + {loadingRow} +
    + ); +} diff --git a/src/components/Projects/ProjectTabs.tsx b/src/components/Projects/ProjectTabs.tsx new file mode 100644 index 000000000..9c9931d0d --- /dev/null +++ b/src/components/Projects/ProjectTabs.tsx @@ -0,0 +1,69 @@ +import { cn } from '../../lib/classname'; +import { + Blocks, + BoxSelect, + type LucideIcon, + StickyNote, + Text, +} from 'lucide-react'; + +export const allowedProjectTabs = ['details', 'solutions'] as const; +export type AllowedProjectTab = (typeof allowedProjectTabs)[number]; + +type TabButtonProps = { + text: string; + icon: LucideIcon; + smText?: string; + isActive?: boolean; + href: string; +}; + +function TabButton(props: TabButtonProps) { + const { text, icon: ButtonIcon, smText, isActive, href } = props; + + return ( + + {ButtonIcon && } + {text} + {smText && {smText}} + + {isActive && ( + + )} + + ); +} + +type ProjectTabsProps = { + activeTab: AllowedProjectTab; + projectId: string; +}; + +export function ProjectTabs(props: ProjectTabsProps) { + const { activeTab, projectId } = props; + + return ( +
    + + +
    + ); +} diff --git a/src/components/Projects/StartProjectModal.tsx b/src/components/Projects/StartProjectModal.tsx new file mode 100644 index 000000000..69212ee6e --- /dev/null +++ b/src/components/Projects/StartProjectModal.tsx @@ -0,0 +1,169 @@ +import { Check, CopyIcon, ServerCrash } from 'lucide-react'; +import { Modal } from '../Modal'; +import { getRelativeTimeString } from '../../lib/date'; +import { useEffect, useState } from 'react'; +import { Spinner } from '../ReactIcons/Spinner.tsx'; +import { httpPost } from '../../lib/http.ts'; +import { CheckIcon } from '../ReactIcons/CheckIcon.tsx'; +import { useCopyText } from '../../hooks/use-copy-text.ts'; + +type StepLabelProps = { + label: string; +}; + +function StepLabel(props: StepLabelProps) { + const { label } = props; + + return ( + + {label} + + ); +} + +type StartProjectModalProps = { + projectId: string; + onClose: () => void; + startedAt?: Date; + onStarted: (startedAt: Date) => void; +}; + +export function StartProjectModal(props: StartProjectModalProps) { + const { onClose, startedAt, onStarted, projectId } = props; + + const [isStartingProject, setIsStartingProject] = useState(true); + const [error, setError] = useState(); + + const { isCopied, copyText } = useCopyText(); + + const projectUrl = `${import.meta.env.PUBLIC_APP_URL}/projects/${projectId}`; + + const formattedStartedAt = startedAt ? getRelativeTimeString(startedAt) : ''; + + async function handleStartProject() { + if (!projectId || startedAt) { + return; + } + + setIsStartingProject(true); + const { response, error } = await httpPost<{ + startedAt: Date; + }>(`${import.meta.env.PUBLIC_API_URL}/v1-start-project/${projectId}`, {}); + + if (error || !response) { + setError(error?.message || 'Failed to start project'); + setIsStartingProject(false); + return; + } + + onStarted(response.startedAt); + } + + useEffect(() => { + handleStartProject().finally(() => setIsStartingProject(false)); + }, []); + + if (error) { + return ( + +
    + +

    {error}

    +
    +
    + ); + } + + if (isStartingProject) { + return ( + +
    + +

    Starting project ..

    +
    +
    + ); + } + + return ( + +

    + + Project started{' '} + {formattedStartedAt} +

    +

    + Start Building +

    +

    + Follow these steps to complete the project. +

    + +
    +

    + 1. Create a new public repository on GitHub. +

    + +

    + 2. Complete the project according to the requirements and push your code + to the GitHub repository. +

    + +

    + 3. Add a README file with instructions to run the project and the{' '} + +

    +

    + 4. Once done, submit your solution to help the others learn and get feedback + from the community. +

    +
    + +
    +

    + If you get stuck, you can always ask for help in the community{' '} + + chat on discord + + . +

    +
    + + +
    + ); +} diff --git a/src/components/Projects/StatusStepper/MilestoneStep.tsx b/src/components/Projects/StatusStepper/MilestoneStep.tsx new file mode 100644 index 000000000..cb7f965e5 --- /dev/null +++ b/src/components/Projects/StatusStepper/MilestoneStep.tsx @@ -0,0 +1,37 @@ +import { Check, type LucideIcon } from 'lucide-react'; + +type MilestoneStepProps = { + icon: LucideIcon; + text: string; + isCompleted?: boolean; + isActive?: boolean; +}; + +export function MilestoneStep(props: MilestoneStepProps) { + const { icon: DisplayIcon, text, isActive = false, isCompleted } = props; + + if (isActive) { + return ( + + + {text} + + ); + } + + if (isCompleted) { + return ( + + + {text} + + ); + } + + return ( + + + {text} + + ); +} diff --git a/src/components/Projects/StatusStepper/ProjectStepper.tsx b/src/components/Projects/StatusStepper/ProjectStepper.tsx new file mode 100644 index 000000000..dee1a485d --- /dev/null +++ b/src/components/Projects/StatusStepper/ProjectStepper.tsx @@ -0,0 +1,245 @@ +import { Flag, Play, Send } from 'lucide-react'; +import { useEffect, useRef, useState } from 'react'; +import { cn } from '../../../lib/classname.ts'; +import { useStickyStuck } from '../../../hooks/use-sticky-stuck.tsx'; +import { StepperAction } from './StepperAction.tsx'; +import { StepperStepSeparator } from './StepperStepSeparator.tsx'; +import { MilestoneStep } from './MilestoneStep.tsx'; +import { httpGet } from '../../../lib/http.ts'; +import { StartProjectModal } from '../StartProjectModal.tsx'; +import { getRelativeTimeString } from '../../../lib/date.ts'; +import { isLoggedIn } from '../../../lib/jwt.ts'; +import { showLoginPopup } from '../../../lib/popup.ts'; +import { SubmitProjectModal } from '../SubmitProjectModal.tsx'; + +type ProjectStatusResponse = { + id?: string; + + startedAt?: Date; + submittedAt?: Date; + repositoryUrl?: string; + + upvotes: number; + downvotes: number; +}; + +type ProjectStepperProps = { + projectId: string; +}; + +export function ProjectStepper(props: ProjectStepperProps) { + const { projectId } = props; + + const stickyElRef = useRef(null); + const isSticky = useStickyStuck(stickyElRef, 8); + + const [isStartingProject, setIsStartingProject] = useState(false); + const [isSubmittingProject, setIsSubmittingProject] = useState(false); + + const [error, setError] = useState(null); + const [activeStep, setActiveStep] = useState(0); + const [isLoadingStatus, setIsLoadingStatus] = useState(true); + const [projectStatus, setProjectStatus] = useState({ + upvotes: 0, + downvotes: 0, + }); + + async function loadProjectStatus() { + setIsLoadingStatus(true); + + const { response, error } = await httpGet( + `${import.meta.env.PUBLIC_API_URL}/v1-project-status/${projectId}`, + {}, + ); + + if (error || !response) { + setError(error?.message || 'Error loading project status'); + setIsLoadingStatus(false); + return; + } + + const { startedAt, submittedAt, upvotes } = response; + + if (upvotes >= 10) { + setActiveStep(4); + } else if (upvotes >= 5) { + setActiveStep(3); + } else if (submittedAt) { + setActiveStep(2); + } else if (startedAt) { + setActiveStep(1); + } + + setProjectStatus(response); + setIsLoadingStatus(false); + } + + useEffect(() => { + loadProjectStatus().finally(() => {}); + }, []); + + return ( +
    + {isSubmittingProject && ( + setIsSubmittingProject(false)} + projectId={projectId} + onSubmit={(response) => { + const { repositoryUrl, submittedAt } = response; + + setProjectStatus({ + ...projectStatus, + repositoryUrl, + submittedAt, + }); + + setActiveStep(2); + }} + repositoryUrl={projectStatus.repositoryUrl} + /> + )} + {isStartingProject && ( + { + setProjectStatus({ + ...projectStatus, + startedAt, + }); + setActiveStep(1); + }} + startedAt={projectStatus?.startedAt} + onClose={() => setIsStartingProject(false)} + /> + )} + + {error && ( +
    + {error} +
    + )} + {isLoadingStatus && ( +
    + )} +
    + {activeStep === 0 && ( + <> + Start building, submit solution and get feedback from the community. + + )} + {activeStep === 1 && ( + <> + Started working{' '} + + {getRelativeTimeString(projectStatus.startedAt!)} + + . Follow{' '} + {' '} + to get most out of it. + + )} + {activeStep >= 2 && ( + <> + Congrats on submitting your solution.{' '} + + + )} +
    + +
    + 0} + icon={Play} + text={activeStep > 0 ? 'Started Working' : 'Start Working'} + number={1} + onClick={() => { + if (!isLoggedIn()) { + showLoginPopup(); + return; + } + + setIsStartingProject(true); + }} + /> + 0} /> + 1} + icon={Send} + onClick={() => { + if (!isLoggedIn()) { + showLoginPopup(); + return; + } + + setIsSubmittingProject(true); + }} + text={activeStep > 1 ? 'Submitted' : 'Submit Solution'} + number={2} + /> + 1} /> + 2} + icon={Flag} + text={ + activeStep == 2 + ? `${projectStatus.upvotes} / 5 upvotes` + : `5 upvotes` + } + /> + 2} /> + 3} + icon={Flag} + text={ + activeStep == 3 + ? `${projectStatus.upvotes} / 10 upvotes` + : activeStep > 3 + ? `${projectStatus.upvotes} upvotes` + : `10 upvotes` + } + /> +
    +
    + ); +} diff --git a/src/components/Projects/StatusStepper/StepperAction.tsx b/src/components/Projects/StatusStepper/StepperAction.tsx new file mode 100644 index 000000000..a6555fe13 --- /dev/null +++ b/src/components/Projects/StatusStepper/StepperAction.tsx @@ -0,0 +1,51 @@ +import { Check, type LucideIcon } from 'lucide-react'; + +type StepperActionProps = { + isActive?: boolean; + isCompleted?: boolean; + onClick?: () => void; + icon: LucideIcon; + text: string; + number: number; +}; + +export function StepperAction(props: StepperActionProps) { + const { + isActive, + onClick = () => null, + isCompleted, + icon: DisplayIcon, + text, + number, + } = props; + + if (isActive) { + return ( + + ); + } + + if (isCompleted) { + return ( + + + {text} + + ); + } + + return ( + + + {number} + + {text} + + ); +} diff --git a/src/components/Projects/StatusStepper/StepperStepSeparator.tsx b/src/components/Projects/StatusStepper/StepperStepSeparator.tsx new file mode 100644 index 000000000..b169daab6 --- /dev/null +++ b/src/components/Projects/StatusStepper/StepperStepSeparator.tsx @@ -0,0 +1,17 @@ +import { cn } from '../../../lib/classname.ts'; + +type StepperStepSeparatorProps = { + isActive: boolean; +}; + +export function StepperStepSeparator(props: StepperStepSeparatorProps) { + const { isActive } = props; + + return ( + + ); +} diff --git a/src/components/Projects/SubmissionRequirement.tsx b/src/components/Projects/SubmissionRequirement.tsx new file mode 100644 index 000000000..778efc9a1 --- /dev/null +++ b/src/components/Projects/SubmissionRequirement.tsx @@ -0,0 +1,44 @@ +import type { ReactNode } from 'react'; +import { cn } from '../../lib/classname.ts'; +import { CheckIcon, CircleDashed, Loader, Loader2, X } from 'lucide-react'; +import { Spinner } from '../ReactIcons/Spinner.tsx'; + +type SubmissionRequirementProps = { + status: 'pending' | 'success' | 'error'; + children: ReactNode; + isLoading?: boolean; +}; + +export function SubmissionRequirement(props: SubmissionRequirementProps) { + const { status, isLoading = false, children } = props; + + return ( +
    + {!isLoading && ( + <> + {status === 'pending' ? ( + + ) : status === 'success' ? ( + + ) : ( + + )} + + )} + + {isLoading && ( + + )} + {children} +
    + ); +} diff --git a/src/components/Projects/SubmitProjectModal.tsx b/src/components/Projects/SubmitProjectModal.tsx new file mode 100644 index 000000000..ac8b84e4c --- /dev/null +++ b/src/components/Projects/SubmitProjectModal.tsx @@ -0,0 +1,299 @@ +import { CheckIcon, CopyIcon, X } from 'lucide-react'; +import { CheckIcon as ReactCheckIcon } from '../ReactIcons/CheckIcon.tsx'; +import { Modal } from '../Modal'; +import { type FormEvent, useState } from 'react'; +import { httpPost } from '../../lib/http'; +import { GitHubIcon } from '../ReactIcons/GitHubIcon.tsx'; +import { SubmissionRequirement } from './SubmissionRequirement.tsx'; +import { useCopyText } from '../../hooks/use-copy-text.ts'; + +type SubmitProjectResponse = { + repositoryUrl: string; + submittedAt: Date; +}; + +type VerificationChecksType = { + repositoryExists: 'pending' | 'success' | 'error'; + readmeExists: 'pending' | 'success' | 'error'; + projectUrlExists: 'pending' | 'success' | 'error'; +}; + +type SubmitProjectModalProps = { + onClose: () => void; + projectId: string; + repositoryUrl?: string; + onSubmit: (response: SubmitProjectResponse) => void; +}; + +export function SubmitProjectModal(props: SubmitProjectModalProps) { + const { + onClose, + projectId, + onSubmit, + repositoryUrl: defaultRepositoryUrl = '', + } = props; + + const { isCopied, copyText } = useCopyText(); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(''); + const [successMessage, setSuccessMessage] = useState(''); + const [repoUrl, setRepoUrl] = useState(defaultRepositoryUrl); + const [verificationChecks, setVerificationChecks] = + useState({ + repositoryExists: defaultRepositoryUrl ? 'success' : 'pending', + readmeExists: defaultRepositoryUrl ? 'success' : 'pending', + projectUrlExists: defaultRepositoryUrl ? 'success' : 'pending', + }); + + const projectUrl = `${import.meta.env.DEV ? 'http://localhost:3000' : 'https://roadmap.sh'}/projects/${projectId}`; + + const handleSubmit = async (e: FormEvent) => { + e.preventDefault(); + try { + setVerificationChecks({ + repositoryExists: 'pending', + readmeExists: 'pending', + projectUrlExists: 'pending', + }); + + setIsLoading(true); + setError(''); + setSuccessMessage(''); + + if (!repoUrl) { + setVerificationChecks({ + repositoryExists: 'error', + readmeExists: 'pending', + projectUrlExists: 'pending', + }); + + throw new Error('Repository URL is required'); + } + + const repoUrlParts = repoUrl + .replace(/https?:\/\/(www\.)?github\.com/, '') + .split('/'); + const username = repoUrlParts[1]; + const repoName = repoUrlParts[2]; + + if (!username || !repoName) { + setVerificationChecks({ + repositoryExists: 'error', + readmeExists: 'pending', + projectUrlExists: 'pending', + }); + + throw new Error('Invalid GitHub repository URL'); + } + + const mainApiUrl = `https://api.github.com/repos/${username}/${repoName}`; + + const allContentsUrl = `${mainApiUrl}/contents`; + const allContentsResponse = await fetch(allContentsUrl); + if (!allContentsResponse.ok) { + setVerificationChecks({ + repositoryExists: 'error', + readmeExists: 'pending', + projectUrlExists: 'pending', + }); + + if (allContentsResponse?.status === 404) { + throw new Error( + 'Repository not found. Make sure it exists and is public.', + ); + } + + throw new Error('Failed to fetch repository contents'); + } + + const allContentsData = await allContentsResponse.json(); + if (!Array.isArray(allContentsData)) { + setVerificationChecks({ + repositoryExists: 'error', + readmeExists: 'pending', + projectUrlExists: 'pending', + }); + + throw new Error('Failed to fetch repository contents'); + } + + const readmeFile = allContentsData.find( + (file) => file.name.toLowerCase() === 'readme.md', + ); + if (!readmeFile || !readmeFile.url) { + setVerificationChecks({ + repositoryExists: 'success', + readmeExists: 'error', + projectUrlExists: 'pending', + }); + + throw new Error('Readme file not found'); + } + + const readmeUrl = readmeFile.url; + const response = await fetch(readmeUrl); + if (!response.ok || response.status === 404) { + setVerificationChecks({ + repositoryExists: 'success', + readmeExists: 'error', + projectUrlExists: 'pending', + }); + + throw new Error('Readme file not found'); + } + + const data = await response.json(); + if (!data.content) { + setVerificationChecks({ + repositoryExists: 'success', + readmeExists: 'error', + projectUrlExists: 'pending', + }); + + throw new Error('Readme file not found'); + } + + const readmeContent = window.atob(data.content); + if (!readmeContent.includes(projectUrl)) { + setVerificationChecks({ + repositoryExists: 'success', + readmeExists: 'success', + projectUrlExists: 'error', + }); + + throw new Error('Add the project page URL to the readme file'); + } + + setVerificationChecks({ + repositoryExists: 'success', + readmeExists: 'success', + projectUrlExists: 'success', + }); + + const submitProjectUrl = `${import.meta.env.PUBLIC_API_URL}/v1-submit-project/${projectId}`; + const { response: submitResponse, error } = + await httpPost(submitProjectUrl, { + repositoryUrl: repoUrl, + }); + + if (error || !submitResponse) { + throw new Error( + error?.message || 'Error submitting project. Please try again!', + ); + } + + setSuccessMessage('Solution submitted successfully!'); + setIsLoading(false); + + onSubmit(submitResponse); + } catch (error: any) { + console.error(error); + setError(error?.message || 'Failed to verify repository'); + setIsLoading(false); + } + }; + + if (successMessage) { + return ( + +
    + +

    {successMessage}

    +
    +
    + ); + } + + return ( + +

    + Submit Solution URL +

    +

    + Submit the URL of your GitHub repository with the solution. +

    + +
    + + URL must point to a public GitHub repository + + + Repository must contain a README file + + + README file must contain the{' '} + + +
    + +
    + setRepoUrl(e.target.value)} + /> + + + {error && ( +

    {error}

    + )} + + {successMessage && ( +

    + {successMessage} +

    + )} +
    + + +
    + ); +} diff --git a/src/components/Projects/VoteButton.tsx b/src/components/Projects/VoteButton.tsx new file mode 100644 index 000000000..3b047ae79 --- /dev/null +++ b/src/components/Projects/VoteButton.tsx @@ -0,0 +1,30 @@ +import { cn } from '../../lib/classname.ts'; +import { type LucideIcon, ThumbsUp } from 'lucide-react'; + +type VoteButtonProps = { + icon: LucideIcon; + isActive: boolean; + count: number; + onClick: () => void; +}; +export function VoteButton(props: VoteButtonProps) { + const { icon: VoteIcon, isActive, count, onClick } = props; + return ( + + ); +} diff --git a/src/components/TeamDropdown/TeamDropdown.tsx b/src/components/TeamDropdown/TeamDropdown.tsx index e4979d72b..9d6c1c82e 100644 --- a/src/components/TeamDropdown/TeamDropdown.tsx +++ b/src/components/TeamDropdown/TeamDropdown.tsx @@ -32,24 +32,6 @@ export function TeamDropdown() { const user = useAuth(); const { teamId } = useTeamId(); - const [shouldShowTeamsIndicator, setShouldShowTeamsIndicator] = - useState(false); - - useEffect(() => { - // Show team dropdown "New" indicator to first 3 refreshes - const viewedTeamsCount = localStorage.getItem('viewedTeamsCount'); - const viewedTeamsCountNumber = parseInt(viewedTeamsCount || '0', 10); - const shouldShowTeamIndicator = viewedTeamsCountNumber < 5; - - setShouldShowTeamsIndicator(shouldShowTeamIndicator); - if (shouldShowTeamIndicator) { - localStorage.setItem( - 'viewedTeamsCount', - (viewedTeamsCountNumber + 1).toString(), - ); - } - }, []); - const teamList = useStore($teamList); const currentTeam = useStore($currentTeam); @@ -102,15 +84,6 @@ export function TeamDropdown() {
    Choose Team - - {shouldShowTeamsIndicator && ( - - - - - - - )}