[{"data":1,"prerenderedAt":1060},["ShallowReactive",2],{"navigation_docs":3,"-guides-testing":195,"-guides-testing-surround":1055},[4,23,65,87,133,155,173],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":22},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,14,18],{"title":11,"path":12,"stem":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":15,"path":16,"stem":17},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":19,"path":20,"stem":21},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start",false,{"title":24,"icon":25,"path":26,"stem":27,"children":28,"page":22},"Guides","i-lucide-compass","\u002Fguides","2.guides",[29,33,37,41,45,49,53,57,61],{"title":30,"path":31,"stem":32},"Authenticate","\u002Fguides\u002Fauthentication","2.guides\u002F1.authentication",{"title":34,"path":35,"stem":36},"Work with several forges","\u002Fguides\u002Fmultiple-forges","2.guides\u002F2.multiple-forges",{"title":38,"path":39,"stem":40},"Configure from the environment","\u002Fguides\u002Fenvironment","2.guides\u002F3.environment",{"title":42,"path":43,"stem":44},"Receive webhooks","\u002Fguides\u002Fwebhooks","2.guides\u002F4.webhooks",{"title":46,"path":47,"stem":48},"Check what a forge supports","\u002Fguides\u002Fcapabilities","2.guides\u002F5.capabilities",{"title":50,"path":51,"stem":52},"Handle errors and rate limits","\u002Fguides\u002Ferrors","2.guides\u002F6.errors",{"title":54,"path":55,"stem":56},"Page through results","\u002Fguides\u002Fpagination","2.guides\u002F7.pagination",{"title":58,"path":59,"stem":60},"Browser bundles","\u002Fguides\u002Fbundling","2.guides\u002F8.bundling",{"title":62,"path":63,"stem":64},"Test your code","\u002Fguides\u002Ftesting","2.guides\u002F9.testing",{"title":66,"icon":67,"path":68,"stem":69,"children":70,"page":22},"Concepts","i-lucide-lightbulb","\u002Fconcepts","3.concepts",[71,75,79,83],{"title":72,"path":73,"stem":74},"Data model","\u002Fconcepts\u002Fdata-model","3.concepts\u002F1.data-model",{"title":76,"path":77,"stem":78},"Capabilities","\u002Fconcepts\u002Fcapabilities","3.concepts\u002F2.capabilities",{"title":80,"path":81,"stem":82},"Providers and factories","\u002Fconcepts\u002Fproviders","3.concepts\u002F3.providers",{"title":84,"path":85,"stem":86},"Events","\u002Fconcepts\u002Fevents","3.concepts\u002F4.events",{"title":88,"icon":89,"path":90,"stem":91,"children":92,"page":22},"Providers","i-lucide-server","\u002Fproviders","4.providers",[93,97,101,105,109,113,117,121,125,129],{"title":94,"path":95,"stem":96},"Azure DevOps","\u002Fproviders\u002Fazure-devops","4.providers\u002Fazure-devops",{"title":98,"path":99,"stem":100},"Bitbucket Cloud","\u002Fproviders\u002Fbitbucket","4.providers\u002Fbitbucket",{"title":102,"path":103,"stem":104},"Cursor Origin","\u002Fproviders\u002Fcursor-origin","4.providers\u002Fcursor-origin",{"title":106,"path":107,"stem":108},"Forgejo and Codeberg","\u002Fproviders\u002Fforgejo","4.providers\u002Fforgejo",{"title":110,"path":111,"stem":112},"Gitea","\u002Fproviders\u002Fgitea","4.providers\u002Fgitea",{"title":114,"path":115,"stem":116},"Gitee","\u002Fproviders\u002Fgitee","4.providers\u002Fgitee",{"title":118,"path":119,"stem":120},"GitHub","\u002Fproviders\u002Fgithub","4.providers\u002Fgithub",{"title":122,"path":123,"stem":124},"GitLab","\u002Fproviders\u002Fgitlab","4.providers\u002Fgitlab",{"title":126,"path":127,"stem":128},"pushin.eu","\u002Fproviders\u002Fpushin","4.providers\u002Fpushin",{"title":130,"path":131,"stem":132},"Tangled","\u002Fproviders\u002Ftangled","4.providers\u002Ftangled",{"title":134,"icon":135,"path":136,"stem":137,"children":138,"page":22},"Reference","i-lucide-book-marked","\u002Freference","5.reference",[139,143,147,151],{"title":140,"path":141,"stem":142},"Provider API","\u002Freference\u002Fprovider-api","5.reference\u002F1.provider-api",{"title":144,"path":145,"stem":146},"Capability matrix","\u002Freference\u002Fcapability-matrix","5.reference\u002F2.capability-matrix",{"title":148,"path":149,"stem":150},"Errors","\u002Freference\u002Ferrors","5.reference\u002F3.errors",{"title":152,"path":153,"stem":154},"JSON Schemas","\u002Freference\u002Fjson-schemas","5.reference\u002F5.json-schemas",{"title":156,"icon":157,"path":158,"stem":159,"children":160,"page":22},"Examples","i-lucide-boxes","\u002Fexamples","6.examples",[161,165,169],{"title":162,"path":163,"stem":164},"Inbox CLI","\u002Fexamples\u002Finbox-cli","6.examples\u002F1.inbox-cli",{"title":166,"path":167,"stem":168},"Label bot","\u002Fexamples\u002Flabel-bot","6.examples\u002F2.label-bot",{"title":170,"path":171,"stem":172},"Release digest","\u002Fexamples\u002Frelease-digest","6.examples\u002F3.release-digest",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":22},"Contributing","i-lucide-git-pull-request","\u002Fcontributing","7.contributing",[179,183,187,191],{"title":180,"path":181,"stem":182},"Contribution guide","\u002Fcontributing\u002Fguidelines","7.contributing\u002F1.guidelines",{"title":184,"path":185,"stem":186},"Write a provider","\u002Fcontributing\u002Fwrite-a-provider","7.contributing\u002F2.write-a-provider",{"title":188,"path":189,"stem":190},"Record fixtures","\u002Fcontributing\u002Frecord-fixtures","7.contributing\u002F3.record-fixtures",{"title":192,"path":193,"stem":194},"Contributors","\u002Fcontributing\u002Fcontributors","7.contributing\u002F4.contributors",{"id":196,"title":62,"body":197,"description":1048,"extension":1049,"links":1050,"meta":1051,"navigation":315,"path":63,"seo":1053,"stem":64,"__hash__":1054},"docs\u002F2.guides\u002F9.testing.md",{"type":198,"value":199,"toc":1043},"minimark",[200,216,221,242,612,627,631,641,1015,1021,1025,1039],[201,202,203,207,208,211,212,215],"p",{},[204,205,206],"code",{},"forges"," ships two test helpers. ",[204,209,210],{},"forges\u002Ffake"," is an in-memory forge. ",[204,213,214],{},"forges\u002Ftesting"," replays recorded HTTP responses. Leave both out of production bundles.",[217,218,220],"h2",{"id":219},"use-the-in-memory-forge","Use the in-memory forge",[201,222,223,226,227,230,231,233,234,237,238,241],{},[204,224,225],{},"fake()"," has the full provider API. Seed it, run your code and assert on ",[204,228,229],{},"store",". Every write updates ",[204,232,229],{}," and appends a ",[204,235,236],{},"ForgeEvent"," to ",[204,239,240],{},"store.events",":",[243,244,249],"pre",{"className":245,"code":246,"language":247,"meta":248,"style":248},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { fake } from 'forges\u002Ffake'\nimport { expect, it } from 'vitest'\n\nit('closes stale issues', async () => {\n  const forge = fake({\n    seed: {\n      threads: [\n        {\n          repo: 'acme\u002Fwidgets',\n          kind: 'issue',\n          title: 'Crash on start',\n          labels: ['stale'],\n        },\n      ],\n    },\n  })\n\n  await closeStale(forge.create())\n\n  expect(forge.store.events.map(event => event.action)).toEqual([\n    'closed',\n  ])\n})\n","ts","",[204,250,251,283,310,317,350,370,380,391,397,415,432,449,472,478,486,492,501,506,529,534,585,598,604],{"__ignoreMap":248},[252,253,256,260,264,268,271,274,277,280],"span",{"class":254,"line":255},"line",1,[252,257,259],{"class":258},"s7zQu","import",[252,261,263],{"class":262},"sMK4o"," {",[252,265,267],{"class":266},"sTEyZ"," fake",[252,269,270],{"class":262}," }",[252,272,273],{"class":258}," from",[252,275,276],{"class":262}," '",[252,278,210],{"class":279},"sfazB",[252,281,282],{"class":262},"'\n",[252,284,286,288,290,293,296,299,301,303,305,308],{"class":254,"line":285},2,[252,287,259],{"class":258},[252,289,263],{"class":262},[252,291,292],{"class":266}," expect",[252,294,295],{"class":262},",",[252,297,298],{"class":266}," it",[252,300,270],{"class":262},[252,302,273],{"class":258},[252,304,276],{"class":262},[252,306,307],{"class":279},"vitest",[252,309,282],{"class":262},[252,311,313],{"class":254,"line":312},3,[252,314,316],{"emptyLinePlaceholder":315},true,"\n",[252,318,320,324,327,330,333,335,337,341,344,347],{"class":254,"line":319},4,[252,321,323],{"class":322},"s2Zo4","it",[252,325,326],{"class":266},"(",[252,328,329],{"class":262},"'",[252,331,332],{"class":279},"closes stale issues",[252,334,329],{"class":262},[252,336,295],{"class":262},[252,338,340],{"class":339},"spNyl"," async",[252,342,343],{"class":262}," ()",[252,345,346],{"class":339}," =>",[252,348,349],{"class":262}," {\n",[252,351,353,356,359,362,364,367],{"class":254,"line":352},5,[252,354,355],{"class":339},"  const",[252,357,358],{"class":266}," forge",[252,360,361],{"class":262}," =",[252,363,267],{"class":322},[252,365,326],{"class":366},"swJcz",[252,368,369],{"class":262},"{\n",[252,371,373,376,378],{"class":254,"line":372},6,[252,374,375],{"class":366},"    seed",[252,377,241],{"class":262},[252,379,349],{"class":262},[252,381,383,386,388],{"class":254,"line":382},7,[252,384,385],{"class":366},"      threads",[252,387,241],{"class":262},[252,389,390],{"class":366}," [\n",[252,392,394],{"class":254,"line":393},8,[252,395,396],{"class":262},"        {\n",[252,398,400,403,405,407,410,412],{"class":254,"line":399},9,[252,401,402],{"class":366},"          repo",[252,404,241],{"class":262},[252,406,276],{"class":262},[252,408,409],{"class":279},"acme\u002Fwidgets",[252,411,329],{"class":262},[252,413,414],{"class":262},",\n",[252,416,418,421,423,425,428,430],{"class":254,"line":417},10,[252,419,420],{"class":366},"          kind",[252,422,241],{"class":262},[252,424,276],{"class":262},[252,426,427],{"class":279},"issue",[252,429,329],{"class":262},[252,431,414],{"class":262},[252,433,435,438,440,442,445,447],{"class":254,"line":434},11,[252,436,437],{"class":366},"          title",[252,439,241],{"class":262},[252,441,276],{"class":262},[252,443,444],{"class":279},"Crash on start",[252,446,329],{"class":262},[252,448,414],{"class":262},[252,450,452,455,457,460,462,465,467,470],{"class":254,"line":451},12,[252,453,454],{"class":366},"          labels",[252,456,241],{"class":262},[252,458,459],{"class":366}," [",[252,461,329],{"class":262},[252,463,464],{"class":279},"stale",[252,466,329],{"class":262},[252,468,469],{"class":366},"]",[252,471,414],{"class":262},[252,473,475],{"class":254,"line":474},13,[252,476,477],{"class":262},"        },\n",[252,479,481,484],{"class":254,"line":480},14,[252,482,483],{"class":366},"      ]",[252,485,414],{"class":262},[252,487,489],{"class":254,"line":488},15,[252,490,491],{"class":262},"    },\n",[252,493,495,498],{"class":254,"line":494},16,[252,496,497],{"class":262},"  }",[252,499,500],{"class":366},")\n",[252,502,504],{"class":254,"line":503},17,[252,505,316],{"emptyLinePlaceholder":315},[252,507,509,512,515,517,520,523,526],{"class":254,"line":508},18,[252,510,511],{"class":258},"  await",[252,513,514],{"class":322}," closeStale",[252,516,326],{"class":366},[252,518,519],{"class":266},"forge",[252,521,522],{"class":262},".",[252,524,525],{"class":322},"create",[252,527,528],{"class":366},"())\n",[252,530,532],{"class":254,"line":531},19,[252,533,316],{"emptyLinePlaceholder":315},[252,535,537,540,542,544,546,548,550,553,555,558,560,564,566,569,571,574,577,579,582],{"class":254,"line":536},20,[252,538,539],{"class":322},"  expect",[252,541,326],{"class":366},[252,543,519],{"class":266},[252,545,522],{"class":262},[252,547,229],{"class":266},[252,549,522],{"class":262},[252,551,552],{"class":266},"events",[252,554,522],{"class":262},[252,556,557],{"class":322},"map",[252,559,326],{"class":366},[252,561,563],{"class":562},"sHdIc","event",[252,565,346],{"class":339},[252,567,568],{"class":266}," event",[252,570,522],{"class":262},[252,572,573],{"class":266},"action",[252,575,576],{"class":366},"))",[252,578,522],{"class":262},[252,580,581],{"class":322},"toEqual",[252,583,584],{"class":366},"([\n",[252,586,588,591,594,596],{"class":254,"line":587},21,[252,589,590],{"class":262},"    '",[252,592,593],{"class":279},"closed",[252,595,329],{"class":262},[252,597,414],{"class":262},[252,599,601],{"class":254,"line":600},22,[252,602,603],{"class":366},"  ])\n",[252,605,607,610],{"class":254,"line":606},23,[252,608,609],{"class":262},"}",[252,611,500],{"class":266},[201,613,614,615,618,619,622,623,626],{},"To match a real forge, pass ",[204,616,617],{},"capabilities"," with the capabilities of a real provider, or ",[204,620,621],{},"support"," to override single verbs, for example ",[204,624,625],{},"{ 'threads.addLabels': false }",". Your fallback paths then run in tests.",[217,628,630],{"id":629},"replay-recorded-responses","Replay recorded responses",[201,632,633,636,637,640],{},[204,634,635],{},"fixtureFetch()"," serves recorded responses to a real provider, so the provider's parsing runs in your test. ",[204,638,639],{},"signDelivery()"," signs a webhook body with the scheme of a forge:",[243,642,644],{"className":245,"code":643,"language":247,"meta":248,"style":248},"import { readFile } from 'node:fs\u002Fpromises'\nimport { github } from 'forges\u002Fgithub'\nimport {\n  fixtureFetch,\n  loadFixtures,\n  signDelivery,\n} from 'forges\u002Ftesting'\n\nconst { fetch, calls } = fixtureFetch(\n  await loadFixtures(new URL('.\u002Ffixtures\u002F', import.meta.url)),\n)\nconst forge = github({ fetch, webhookSecret: 'secret' }).create()\n\nconst body = await readFile(\n  new URL('.\u002Ffixtures\u002Fissue-opened.json', import.meta.url),\n  'utf8',\n)\nconst headers = await signDelivery('github', body, 'secret', {\n  'x-github-event': 'issues',\n})\nconst events = await forge.webhooks.ingest({ headers, body })\n",[204,645,646,666,686,692,699,706,713,725,729,754,795,799,844,848,864,895,907,911,951,971,977],{"__ignoreMap":248},[252,647,648,650,652,655,657,659,661,664],{"class":254,"line":255},[252,649,259],{"class":258},[252,651,263],{"class":262},[252,653,654],{"class":266}," readFile",[252,656,270],{"class":262},[252,658,273],{"class":258},[252,660,276],{"class":262},[252,662,663],{"class":279},"node:fs\u002Fpromises",[252,665,282],{"class":262},[252,667,668,670,672,675,677,679,681,684],{"class":254,"line":285},[252,669,259],{"class":258},[252,671,263],{"class":262},[252,673,674],{"class":266}," github",[252,676,270],{"class":262},[252,678,273],{"class":258},[252,680,276],{"class":262},[252,682,683],{"class":279},"forges\u002Fgithub",[252,685,282],{"class":262},[252,687,688,690],{"class":254,"line":312},[252,689,259],{"class":258},[252,691,349],{"class":262},[252,693,694,697],{"class":254,"line":319},[252,695,696],{"class":266},"  fixtureFetch",[252,698,414],{"class":262},[252,700,701,704],{"class":254,"line":352},[252,702,703],{"class":266},"  loadFixtures",[252,705,414],{"class":262},[252,707,708,711],{"class":254,"line":372},[252,709,710],{"class":266},"  signDelivery",[252,712,414],{"class":262},[252,714,715,717,719,721,723],{"class":254,"line":382},[252,716,609],{"class":262},[252,718,273],{"class":258},[252,720,276],{"class":262},[252,722,214],{"class":279},[252,724,282],{"class":262},[252,726,727],{"class":254,"line":393},[252,728,316],{"emptyLinePlaceholder":315},[252,730,731,734,736,739,741,744,746,748,751],{"class":254,"line":399},[252,732,733],{"class":339},"const",[252,735,263],{"class":262},[252,737,738],{"class":266}," fetch",[252,740,295],{"class":262},[252,742,743],{"class":266}," calls ",[252,745,609],{"class":262},[252,747,361],{"class":262},[252,749,750],{"class":322}," fixtureFetch",[252,752,753],{"class":266},"(\n",[252,755,756,758,761,763,766,769,771,773,776,778,780,783,785,788,790,793],{"class":254,"line":417},[252,757,511],{"class":258},[252,759,760],{"class":322}," loadFixtures",[252,762,326],{"class":266},[252,764,765],{"class":262},"new",[252,767,768],{"class":322}," URL",[252,770,326],{"class":266},[252,772,329],{"class":262},[252,774,775],{"class":279},".\u002Ffixtures\u002F",[252,777,329],{"class":262},[252,779,295],{"class":262},[252,781,782],{"class":258}," import",[252,784,522],{"class":262},[252,786,787],{"class":266},"meta",[252,789,522],{"class":262},[252,791,792],{"class":266},"url))",[252,794,414],{"class":262},[252,796,797],{"class":254,"line":434},[252,798,500],{"class":266},[252,800,801,803,806,809,811,813,816,818,820,823,825,827,830,832,834,837,839,841],{"class":254,"line":451},[252,802,733],{"class":339},[252,804,805],{"class":266}," forge ",[252,807,808],{"class":262},"=",[252,810,674],{"class":322},[252,812,326],{"class":266},[252,814,815],{"class":262},"{",[252,817,738],{"class":266},[252,819,295],{"class":262},[252,821,822],{"class":366}," webhookSecret",[252,824,241],{"class":262},[252,826,276],{"class":262},[252,828,829],{"class":279},"secret",[252,831,329],{"class":262},[252,833,270],{"class":262},[252,835,836],{"class":266},")",[252,838,522],{"class":262},[252,840,525],{"class":322},[252,842,843],{"class":266},"()\n",[252,845,846],{"class":254,"line":474},[252,847,316],{"emptyLinePlaceholder":315},[252,849,850,852,855,857,860,862],{"class":254,"line":480},[252,851,733],{"class":339},[252,853,854],{"class":266}," body ",[252,856,808],{"class":262},[252,858,859],{"class":258}," await",[252,861,654],{"class":322},[252,863,753],{"class":266},[252,865,866,869,871,873,875,878,880,882,884,886,888,890,893],{"class":254,"line":488},[252,867,868],{"class":262},"  new",[252,870,768],{"class":322},[252,872,326],{"class":266},[252,874,329],{"class":262},[252,876,877],{"class":279},".\u002Ffixtures\u002Fissue-opened.json",[252,879,329],{"class":262},[252,881,295],{"class":262},[252,883,782],{"class":258},[252,885,522],{"class":262},[252,887,787],{"class":266},[252,889,522],{"class":262},[252,891,892],{"class":266},"url)",[252,894,414],{"class":262},[252,896,897,900,903,905],{"class":254,"line":494},[252,898,899],{"class":262},"  '",[252,901,902],{"class":279},"utf8",[252,904,329],{"class":262},[252,906,414],{"class":262},[252,908,909],{"class":254,"line":503},[252,910,500],{"class":266},[252,912,913,915,918,920,922,925,927,929,932,934,936,939,941,943,945,947,949],{"class":254,"line":508},[252,914,733],{"class":339},[252,916,917],{"class":266}," headers ",[252,919,808],{"class":262},[252,921,859],{"class":258},[252,923,924],{"class":322}," signDelivery",[252,926,326],{"class":266},[252,928,329],{"class":262},[252,930,931],{"class":279},"github",[252,933,329],{"class":262},[252,935,295],{"class":262},[252,937,938],{"class":266}," body",[252,940,295],{"class":262},[252,942,276],{"class":262},[252,944,829],{"class":279},[252,946,329],{"class":262},[252,948,295],{"class":262},[252,950,349],{"class":262},[252,952,953,955,958,960,962,964,967,969],{"class":254,"line":531},[252,954,899],{"class":262},[252,956,957],{"class":366},"x-github-event",[252,959,329],{"class":262},[252,961,241],{"class":262},[252,963,276],{"class":262},[252,965,966],{"class":279},"issues",[252,968,329],{"class":262},[252,970,414],{"class":262},[252,972,973,975],{"class":254,"line":536},[252,974,609],{"class":262},[252,976,500],{"class":266},[252,978,979,981,984,986,988,990,992,995,997,1000,1002,1004,1007,1009,1011,1013],{"class":254,"line":587},[252,980,733],{"class":339},[252,982,983],{"class":266}," events ",[252,985,808],{"class":262},[252,987,859],{"class":258},[252,989,358],{"class":266},[252,991,522],{"class":262},[252,993,994],{"class":266},"webhooks",[252,996,522],{"class":262},[252,998,999],{"class":322},"ingest",[252,1001,326],{"class":266},[252,1003,815],{"class":262},[252,1005,1006],{"class":266}," headers",[252,1008,295],{"class":262},[252,1010,854],{"class":266},[252,1012,609],{"class":262},[252,1014,500],{"class":266},[201,1016,1017,1020],{},[204,1018,1019],{},"calls"," records every request the provider made, including ones that no fixture matched. Use it to assert that a capability check prevented a write.",[217,1022,1024],{"id":1023},"record-your-own-fixtures","Record your own fixtures",[201,1026,1027,1030,1031,1034,1035,1038],{},[204,1028,1029],{},"recordingFetch()"," wraps ",[204,1032,1033],{},"fetch"," and collects each response as a fixture that you can save and replay. It doesn't record request headers, but it does record URLs and response bodies, which can hold tokens. Pass a ",[204,1036,1037],{},"redact"," function to clean each fixture before you save it.",[1040,1041,1042],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}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);}",{"title":248,"searchDepth":285,"depth":285,"links":1044},[1045,1046,1047],{"id":219,"depth":285,"text":220},{"id":629,"depth":285,"text":630},{"id":1023,"depth":285,"text":1024},"Run your code against an in-memory forge or recorded responses.","md",null,{"icon":1052},"i-lucide-flask-conical",{"title":62,"description":1048},"7djVDkGZINcDpNoAeF_1rc_8BwSjnoyUbbJyvr6hzts",[1056,1058],{"title":58,"path":59,"stem":60,"description":1057,"children":-1},"Keep forges small in a browser bundle, and see how CI checks the sizes.",{"title":72,"path":73,"stem":74,"description":1059,"children":-1},"How refs, threads, notifications and events describe the same things on every forge.",1791294003829]