[{"data":1,"prerenderedAt":883},["ShallowReactive",2],{"navigation_docs":3,"-guide-repositories":80,"-guide-repositories-surround":878},[4,56],{"title":5,"path":6,"stem":7,"children":8,"icon":55},"Guide","\u002Fguide","1.guide\u002F01.index",[9,11,15,19,23,27,31,35,39,43,47,51],{"title":10,"path":6,"stem":7},"Getting Started",{"title":12,"path":13,"stem":14},"Authentication","\u002Fguide\u002Fauth","1.guide\u002F02.auth",{"title":16,"path":17,"stem":18},"Repositories","\u002Fguide\u002Frepositories","1.guide\u002F03.repositories",{"title":20,"path":21,"stem":22},"Issues","\u002Fguide\u002Fissues","1.guide\u002F04.issues",{"title":24,"path":25,"stem":26},"Pull requests","\u002Fguide\u002Fpull-requests","1.guide\u002F05.pull-requests",{"title":28,"path":29,"stem":30},"Review threads","\u002Fguide\u002Fthreads","1.guide\u002F06.threads",{"title":32,"path":33,"stem":34},"Commits and CI","\u002Fguide\u002Fcommits","1.guide\u002F07.commits",{"title":36,"path":37,"stem":38},"Contribution templates","\u002Fguide\u002Ftemplates","1.guide\u002F08.templates",{"title":40,"path":41,"stem":42},"Code search","\u002Fguide\u002Fcode-search","1.guide\u002F09.code-search",{"title":44,"path":45,"stem":46},"Agents","\u002Fguide\u002Fagents","1.guide\u002F10.agents",{"title":48,"path":49,"stem":50},"Custom providers","\u002Fguide\u002Fcustom","1.guide\u002F11.custom",{"title":52,"path":53,"stem":54},"Explorer","\u002Fguide\u002Fexplorer","1.guide\u002F12.explorer","i-lucide-book-open",{"title":57,"path":58,"stem":59,"children":60,"icon":79},"Platforms","\u002Fplatforms","2.platforms\u002F0.index",[61,63,67,71,75],{"title":62,"path":58,"stem":59},"Overview",{"title":64,"path":65,"stem":66},"GitHub","\u002Fplatforms\u002Fgithub","2.platforms\u002F01.github",{"title":68,"path":69,"stem":70},"GitLab","\u002Fplatforms\u002Fgitlab","2.platforms\u002F02.gitlab",{"title":72,"path":73,"stem":74},"Gitea","\u002Fplatforms\u002Fgitea","2.platforms\u002F03.gitea",{"title":76,"path":77,"stem":78},"GitBucket","\u002Fplatforms\u002Fgitbucket","2.platforms\u002F04.gitbucket","i-lucide-library",{"id":81,"title":16,"body":82,"description":871,"extension":872,"links":873,"meta":874,"navigation":708,"path":17,"seo":876,"stem":18,"__hash__":877},"docs\u002F1.guide\u002F03.repositories.md",{"type":83,"value":84,"toc":864},"minimark",[85,90,221,230,234,518,539,543,562,566,569,645,663,666,777,784,788,791,854,860],[86,87,89],"h2",{"id":88},"get-and-list","Get and list",[91,92,97],"pre",{"className":93,"code":94,"language":95,"meta":96,"style":96},"language-ts shiki shiki-themes github-light github-light poimandres","const repo = await forge.repos.get(\"nitrojs\", \"nitro\");\nconst page = await forge.repos.list(\"nitrojs\", { page: 1, perPage: 30 });\n","ts","",[98,99,100,163],"code",{"__ignoreMap":96},[101,102,105,109,113,116,120,124,128,131,133,137,140,144,148,150,153,155,158,160],"span",{"class":103,"line":104},"line",1,[101,106,108],{"class":107},"s1TYA","const",[101,110,112],{"class":111},"saoiD"," repo",[101,114,115],{"class":107}," =",[101,117,119],{"class":118},"sZW6a"," await",[101,121,123],{"class":122},"spVlQ"," forge",[101,125,127],{"class":126},"sKlNE",".",[101,129,130],{"class":122},"repos",[101,132,127],{"class":126},[101,134,136],{"class":135},"sULi6","get",[101,138,139],{"class":126},"(",[101,141,143],{"class":142},"scVjq","\"",[101,145,147],{"class":146},"sQ7BG","nitrojs",[101,149,143],{"class":142},[101,151,152],{"class":126},", ",[101,154,143],{"class":142},[101,156,157],{"class":146},"nitro",[101,159,143],{"class":142},[101,161,162],{"class":126},");\n",[101,164,166,168,171,173,175,177,179,181,183,186,188,190,192,194,197,200,203,207,210,213,215,218],{"class":103,"line":165},2,[101,167,108],{"class":107},[101,169,170],{"class":111}," page",[101,172,115],{"class":107},[101,174,119],{"class":118},[101,176,123],{"class":122},[101,178,127],{"class":126},[101,180,130],{"class":122},[101,182,127],{"class":126},[101,184,185],{"class":135},"list",[101,187,139],{"class":126},[101,189,143],{"class":142},[101,191,147],{"class":146},[101,193,143],{"class":142},[101,195,196],{"class":126},", {",[101,198,170],{"class":199},"snHMy",[101,201,202],{"class":126},":",[101,204,206],{"class":205},"siHFe"," 1",[101,208,209],{"class":126},",",[101,211,212],{"class":199}," perPage",[101,214,202],{"class":126},[101,216,217],{"class":205}," 30",[101,219,220],{"class":126}," });\n",[222,223,224,226,227,229],"p",{},[98,225,136],{}," reads fresh every time. ",[98,228,185],{}," reads one page of an owner's repositories.",[86,231,233],{"id":232},"the-shape","The shape",[91,235,237],{"className":93,"code":236,"language":95,"meta":96,"style":96},"interface Repository {\n  id: string; \u002F\u002F always a string, even when the API sends a number\n  name: string;\n  fullName: string; \u002F\u002F \"owner\u002Fname\"\n  description: string; \u002F\u002F \"\" when the platform has none\n  private: boolean;\n  defaultBranch: string;\n  url: string;\n  cloneUrl: string;\n  isFork: boolean;\n  parent: { fullName: string; url: string } | null; \u002F\u002F null when not a fork, or hidden\n  viewerPermission: \"none\" | \"read\" | \"triage\" | \"write\" | \"maintain\" | \"admin\" | null;\n  owner: { login: string; avatarUrl: string };\n}\n",[98,238,239,251,270,283,298,313,326,338,350,362,374,415,483,512],{"__ignoreMap":96},[101,240,241,244,248],{"class":103,"line":104},[101,242,243],{"class":107},"interface",[101,245,247],{"class":246},"sCrqT"," Repository",[101,249,250],{"class":126}," {\n",[101,252,253,257,259,263,266],{"class":103,"line":165},[101,254,256],{"class":255},"s0VbO","  id",[101,258,202],{"class":107},[101,260,262],{"class":261},"s8yaW"," string",[101,264,265],{"class":126},"; ",[101,267,269],{"class":268},"sjhu3","\u002F\u002F always a string, even when the API sends a number\n",[101,271,273,276,278,280],{"class":103,"line":272},3,[101,274,275],{"class":255},"  name",[101,277,202],{"class":107},[101,279,262],{"class":261},[101,281,282],{"class":126},";\n",[101,284,286,289,291,293,295],{"class":103,"line":285},4,[101,287,288],{"class":255},"  fullName",[101,290,202],{"class":107},[101,292,262],{"class":261},[101,294,265],{"class":126},[101,296,297],{"class":268},"\u002F\u002F \"owner\u002Fname\"\n",[101,299,301,304,306,308,310],{"class":103,"line":300},5,[101,302,303],{"class":255},"  description",[101,305,202],{"class":107},[101,307,262],{"class":261},[101,309,265],{"class":126},[101,311,312],{"class":268},"\u002F\u002F \"\" when the platform has none\n",[101,314,316,319,321,324],{"class":103,"line":315},6,[101,317,318],{"class":255},"  private",[101,320,202],{"class":107},[101,322,323],{"class":261}," boolean",[101,325,282],{"class":126},[101,327,329,332,334,336],{"class":103,"line":328},7,[101,330,331],{"class":255},"  defaultBranch",[101,333,202],{"class":107},[101,335,262],{"class":261},[101,337,282],{"class":126},[101,339,341,344,346,348],{"class":103,"line":340},8,[101,342,343],{"class":255},"  url",[101,345,202],{"class":107},[101,347,262],{"class":261},[101,349,282],{"class":126},[101,351,353,356,358,360],{"class":103,"line":352},9,[101,354,355],{"class":255},"  cloneUrl",[101,357,202],{"class":107},[101,359,262],{"class":261},[101,361,282],{"class":126},[101,363,365,368,370,372],{"class":103,"line":364},10,[101,366,367],{"class":255},"  isFork",[101,369,202],{"class":107},[101,371,323],{"class":261},[101,373,282],{"class":126},[101,375,377,380,382,385,388,390,392,394,397,399,401,404,407,410,412],{"class":103,"line":376},11,[101,378,379],{"class":255},"  parent",[101,381,202],{"class":107},[101,383,384],{"class":126}," { ",[101,386,387],{"class":255},"fullName",[101,389,202],{"class":107},[101,391,262],{"class":261},[101,393,265],{"class":126},[101,395,396],{"class":255},"url",[101,398,202],{"class":107},[101,400,262],{"class":261},[101,402,403],{"class":126}," } ",[101,405,406],{"class":107},"|",[101,408,409],{"class":261}," null",[101,411,265],{"class":126},[101,413,414],{"class":268},"\u002F\u002F null when not a fork, or hidden\n",[101,416,418,421,423,426,429,431,434,436,439,441,443,445,448,450,452,454,457,459,461,463,466,468,470,472,475,477,479,481],{"class":103,"line":417},12,[101,419,420],{"class":255},"  viewerPermission",[101,422,202],{"class":107},[101,424,425],{"class":142}," \"",[101,427,428],{"class":146},"none",[101,430,143],{"class":142},[101,432,433],{"class":107}," |",[101,435,425],{"class":142},[101,437,438],{"class":146},"read",[101,440,143],{"class":142},[101,442,433],{"class":107},[101,444,425],{"class":142},[101,446,447],{"class":146},"triage",[101,449,143],{"class":142},[101,451,433],{"class":107},[101,453,425],{"class":142},[101,455,456],{"class":146},"write",[101,458,143],{"class":142},[101,460,433],{"class":107},[101,462,425],{"class":142},[101,464,465],{"class":146},"maintain",[101,467,143],{"class":142},[101,469,433],{"class":107},[101,471,425],{"class":142},[101,473,474],{"class":146},"admin",[101,476,143],{"class":142},[101,478,433],{"class":107},[101,480,409],{"class":261},[101,482,282],{"class":126},[101,484,486,489,491,493,496,498,500,502,505,507,509],{"class":103,"line":485},13,[101,487,488],{"class":255},"  owner",[101,490,202],{"class":107},[101,492,384],{"class":126},[101,494,495],{"class":255},"login",[101,497,202],{"class":107},[101,499,262],{"class":261},[101,501,265],{"class":126},[101,503,504],{"class":255},"avatarUrl",[101,506,202],{"class":107},[101,508,262],{"class":261},[101,510,511],{"class":126}," };\n",[101,513,515],{"class":103,"line":514},14,[101,516,517],{"class":126},"}\n",[222,519,520,521,524,525,528,529,532,533,535,536,538],{},"Two fields deserve a sentence. ",[98,522,523],{},"parent"," is the immediate upstream of a fork, ",[98,526,527],{},"null"," when there is none or the platform hides it. ",[98,530,531],{},"viewerPermission"," is your highest role on the repo. ",[98,534,527],{}," means the platform said nothing about access, not that you have none. Anonymous calls always get ",[98,537,527],{},", do not read anything into it.",[86,540,542],{"id":541},"owners-that-are-groups","Owners that are groups",[222,544,545,546,549,550,553,554,557,558,561],{},"On GitLab, ",[98,547,548],{},"\u002Fusers\u002F:owner\u002Fprojects"," is a 404 for a group. ",[98,551,552],{},"repos.list"," falls back to ",[98,555,556],{},"\u002Fgroups\u002F:owner\u002Fprojects"," on that one status and re throws everything else, so a real 404 stays a ",[98,559,560],{},"NotFoundError"," instead of turning into a second guess.",[86,563,565],{"id":564},"pagination","Pagination",[222,567,568],{},"Every list returns:",[91,570,572],{"className":93,"code":571,"language":95,"meta":96,"style":96},"interface PageResult\u003CT> {\n  items: T[];\n  hasNextPage: boolean;\n  nextPage?: number;\n  totalCount?: number; \u002F\u002F when the platform counts\n}\n",[98,573,574,590,603,614,627,641],{"__ignoreMap":96},[101,575,576,578,581,584,587],{"class":103,"line":104},[101,577,243],{"class":107},[101,579,580],{"class":246}," PageResult",[101,582,583],{"class":126},"\u003C",[101,585,586],{"class":246},"T",[101,588,589],{"class":126},"> {\n",[101,591,592,595,597,600],{"class":103,"line":165},[101,593,594],{"class":255},"  items",[101,596,202],{"class":107},[101,598,599],{"class":246}," T",[101,601,602],{"class":126},"[];\n",[101,604,605,608,610,612],{"class":103,"line":272},[101,606,607],{"class":255},"  hasNextPage",[101,609,202],{"class":107},[101,611,323],{"class":261},[101,613,282],{"class":126},[101,615,616,619,622,625],{"class":103,"line":285},[101,617,618],{"class":255},"  nextPage",[101,620,621],{"class":107},"?:",[101,623,624],{"class":261}," number",[101,626,282],{"class":126},[101,628,629,632,634,636,638],{"class":103,"line":300},[101,630,631],{"class":255},"  totalCount",[101,633,621],{"class":107},[101,635,624],{"class":261},[101,637,265],{"class":126},[101,639,640],{"class":268},"\u002F\u002F when the platform counts\n",[101,642,643],{"class":103,"line":315},[101,644,517],{"class":126},[222,646,647,648,651,652,655,656,659,660,127],{},"GitHub and Gitea say what is next in a ",[98,649,650],{},"Link"," header, GitLab in ",[98,653,654],{},"x-next-page",". Both are read for you. ",[98,657,658],{},"nextPage"," is the number you pass back as ",[98,661,662],{},"page",[222,664,665],{},"To walk everything:",[91,667,669],{"className":93,"code":668,"language":95,"meta":96,"style":96},"import { fetchAllPages, paginate } from \"@agntn\u002Fforges\";\n\nconst all = await fetchAllPages(fetcher, url); \u002F\u002F one array\nfor await (const page of paginate(fetcher, url)) {\n  \u002F\u002F one page at a time\n}\n",[98,670,671,704,710,738,768,773],{"__ignoreMap":96},[101,672,673,677,680,683,685,688,691,695,697,700,702],{"class":103,"line":104},[101,674,676],{"class":675},"sP0CR","import",[101,678,679],{"class":126}," {",[101,681,682],{"class":199}," fetchAllPages",[101,684,209],{"class":126},[101,686,687],{"class":199}," paginate",[101,689,690],{"class":126}," }",[101,692,694],{"class":693},"stCPd"," from",[101,696,425],{"class":142},[101,698,699],{"class":146},"@agntn\u002Fforges",[101,701,143],{"class":142},[101,703,282],{"class":126},[101,705,706],{"class":103,"line":165},[101,707,709],{"emptyLinePlaceholder":708},true,"\n",[101,711,712,714,717,719,721,723,725,728,730,732,735],{"class":103,"line":272},[101,713,108],{"class":107},[101,715,716],{"class":111}," all",[101,718,115],{"class":107},[101,720,119],{"class":118},[101,722,682],{"class":135},[101,724,139],{"class":126},[101,726,727],{"class":122},"fetcher",[101,729,152],{"class":126},[101,731,396],{"class":122},[101,733,734],{"class":126},"); ",[101,736,737],{"class":268},"\u002F\u002F one array\n",[101,739,740,743,745,748,750,752,755,757,759,761,763,765],{"class":103,"line":285},[101,741,742],{"class":693},"for",[101,744,119],{"class":693},[101,746,747],{"class":126}," (",[101,749,108],{"class":107},[101,751,170],{"class":111},[101,753,754],{"class":107}," of",[101,756,687],{"class":135},[101,758,139],{"class":126},[101,760,727],{"class":122},[101,762,152],{"class":126},[101,764,396],{"class":122},[101,766,767],{"class":126},")) {\n",[101,769,770],{"class":103,"line":300},[101,771,772],{"class":268},"  \u002F\u002F one page at a time\n",[101,774,775],{"class":103,"line":315},[101,776,517],{"class":126},[222,778,779,780,127],{},"Both take a raw fetcher and a URL. They are the pieces the providers are built from, exported for ",[781,782,783],"a",{"href":49},"custom ones",[86,785,787],{"id":786},"caching","Caching",[222,789,790],{},"Stable reads go through an LRU, five minutes and five hundred entries by default, scoped to the base URL and a hash of the token. Repository, issue, pull request, comment and user item reads skip it, because you call those to check current state and a stale answer there is worse than no cache. Lists use it.",[91,792,794],{"className":93,"code":793,"language":95,"meta":96,"style":96},"const forge = createProvider(\"github\", {\n  cache: { ttl: 60_000, enabled: true },\n});\n",[98,795,796,819,849],{"__ignoreMap":96},[101,797,798,800,802,804,807,809,811,814,816],{"class":103,"line":104},[101,799,108],{"class":107},[101,801,123],{"class":111},[101,803,115],{"class":107},[101,805,806],{"class":135}," createProvider",[101,808,139],{"class":126},[101,810,143],{"class":142},[101,812,813],{"class":146},"github",[101,815,143],{"class":142},[101,817,818],{"class":126},", {\n",[101,820,821,824,826,828,831,833,836,838,841,843,846],{"class":103,"line":165},[101,822,823],{"class":199},"  cache",[101,825,202],{"class":126},[101,827,679],{"class":126},[101,829,830],{"class":199}," ttl",[101,832,202],{"class":126},[101,834,835],{"class":205}," 60_000",[101,837,209],{"class":126},[101,839,840],{"class":199}," enabled",[101,842,202],{"class":126},[101,844,845],{"class":205}," true",[101,847,848],{"class":126}," },\n",[101,850,851],{"class":103,"line":272},[101,852,853],{"class":126},"});\n",[222,855,856,859],{},[98,857,858],{},"cache.enabled: false"," turns it off for one provider. Mutations never touch it.",[861,862,863],"style",{},"html pre.shiki code .s1TYA, html code.shiki .s1TYA{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#91B4D5}html pre.shiki code .saoiD, html code.shiki .saoiD{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#E4F0FB}html pre.shiki code .sZW6a, html code.shiki .sZW6a{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#5DE4C7C0}html pre.shiki code .spVlQ, html code.shiki .spVlQ{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E4F0FB}html pre.shiki code .sKlNE, html code.shiki .sKlNE{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#A6ACCD}html pre.shiki code .sULi6, html code.shiki .sULi6{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#E4F0FBD0}html pre.shiki code .scVjq, html code.shiki .scVjq{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#A6ACCD}html pre.shiki code .sQ7BG, html code.shiki .sQ7BG{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#5DE4C7}html pre.shiki code .snHMy, html code.shiki .snHMy{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#ADD7FF}html pre.shiki code .siHFe, html code.shiki .siHFe{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#5DE4C7}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sCrqT, html code.shiki .sCrqT{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#A6ACCDC0}html pre.shiki code .s0VbO, html code.shiki .s0VbO{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#A6ACCD}html pre.shiki code .s8yaW, html code.shiki .s8yaW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#A6ACCDC0}html pre.shiki code .sjhu3, html code.shiki .sjhu3{--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#767C9DB0;--shiki-dark-font-style:italic}html pre.shiki code .sP0CR, html code.shiki .sP0CR{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#5DE4C7}html pre.shiki code .stCPd, html code.shiki .stCPd{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#A6ACCD}",{"title":96,"searchDepth":165,"depth":165,"links":865},[866,867,868,869,870],{"id":88,"depth":165,"text":89},{"id":232,"depth":165,"text":233},{"id":541,"depth":165,"text":542},{"id":564,"depth":165,"text":565},{"id":786,"depth":165,"text":787},"One Repository shape from every platform, with fork state, the immediate parent and the viewer's role when the platform says.","md",null,{"icon":875},"i-lucide-folder-git-2",{"title":16,"description":871},"K5erBCQhkwPCIRckZfUSD9laSKU0ExOqFQ7sxjPzbWM",[879,881],{"title":12,"path":13,"stem":14,"description":880,"children":-1},"Where the token comes from, in which order, and how to point a provider at a self hosted instance.",{"title":20,"path":21,"stem":22,"description":882,"children":-1},"List, search, read, create and comment on issues with the same options on every platform.",1788525967449]