[{"data":1,"prerenderedAt":1511},["ShallowReactive",2],{"page:\u002Fdocs\u002F5.x\u002Ftutorials\u002Fcreating-plugins":3},{"id":4,"title":5,"body":6,"description":1493,"extension":1494,"frontmatter":1495,"heading":5,"meta":1502,"navigation":1504,"order":1488,"path":1505,"seo":1506,"sitemap":1507,"source":1508,"stem":1509,"__hash__":1510},"docs\u002Fdocs\u002F5.x\u002Ftutorials\u002Fcreating-plugins.md","Create a Kubb plugin",{"type":7,"value":8,"toc":1483},"minimark",[9,18],[10,11,12,13,17],"p",{},"Build a plugin that writes ",[14,15,16],"code",{},"listPets.ts"," containing the method and path of one API operation, then test its output. You need Node.js 22.22 or higher, npm, and TypeScript knowledge.",[19,20,22,27,100,111,115,122,246,250,285,790,796,800,803,913,926,929,945,953,957,969,1465,1468,1480],"steps",{"level":21},"2",[23,24,26],"h2",{"id":25},"_1-create-a-project","Create a project",[28,29,34],"pre",{"language":30,"filename":31,"code":32,"class":33},"shell","Terminal","mkdir kubb-first-plugin\ncd kubb-first-plugin\nnpm init -y\nnpm pkg set type=module\nnpm install -D kubb typescript @types\u002Fnode vitest\nmkdir src","highlights",[14,35,37,50,51,50,58,50,66,50,80,50,93],{"class":36},"language-shell",[38,39,42,46],"span",{"class":40,"style":41},"line","display: inline",[38,43,45],{"style":44},"color:#6f42c1;--hls-dark:#b392f0","mkdir ",[38,47,49],{"style":48},"color:#24292e;--hls-dark:#e1e4e8","kubb-first-plugin","\n",[38,52,53,56],{"class":40,"style":41},[38,54,55],{"style":44},"cd ",[38,57,49],{"style":48},[38,59,60,63],{"class":40,"style":41},[38,61,62],{"style":44},"npm ",[38,64,65],{"style":48},"init -y",[38,67,68,70,73,77],{"class":40,"style":41},[38,69,62],{"style":44},[38,71,72],{"style":48},"pkg set type",[38,74,76],{"style":75},"color:#d73a49;--hls-dark:#f97583","=",[38,78,79],{"style":48},"module",[38,81,82,84,87,90],{"class":40,"style":41},[38,83,62],{"style":44},[38,85,86],{"style":48},"install -D kubb typescript ",[38,88,89],{"style":48},"@",[38,91,92],{"style":48},"types\u002Fnode vitest",[38,94,95,97],{"class":40,"style":41},[38,96,45],{"style":44},[38,98,99],{"style":48},"src",[10,101,102,103,106,107,110],{},"All authoring APIs come from ",[14,104,105],{},"kubb\u002Fkit",", included with ",[14,108,109],{},"kubb",".",[23,112,114],{"id":113},"_2-add-the-specification","Add the specification",[10,116,117,118,121],{},"Create ",[14,119,120],{},"petStore.yaml"," in the project root:",[28,123,126],{"language":124,"filename":120,"code":125,"class":33},"yaml","openapi: 3.0.3\ninfo:\n  title: Pets\n  version: 1.0.0\npaths:\n  \u002Fpets:\n    get:\n      operationId: listPets\n      responses:\n        '200':\n          description: A list of pets",[14,127,129,50,141,50,149,50,163,50,175,50,182,50,191,50,201,50,214,50,223,50,233],{"class":128},"language-yaml",[38,130,131,135,138],{"class":40,"style":41},[38,132,134],{"style":133},"color:#005cc5;--hls-dark:#79b8ff","openapi",[38,136,137],{"style":75},": ",[38,139,140],{"style":133},"3.0.3",[38,142,143,146],{"class":40,"style":41},[38,144,145],{"style":133},"info",[38,147,148],{"style":75},":",[38,150,151,154,157,159],{"class":40,"style":41},[38,152,153],{"style":75},"  ",[38,155,156],{"style":133},"title",[38,158,137],{"style":75},[38,160,162],{"style":161},"color:#032f62;--hls-dark:#9ecbff","Pets",[38,164,165,167,170,172],{"class":40,"style":41},[38,166,153],{"style":161},[38,168,169],{"style":133},"version",[38,171,137],{"style":75},[38,173,174],{"style":133},"1.0.0",[38,176,177,180],{"class":40,"style":41},[38,178,179],{"style":133},"paths",[38,181,148],{"style":75},[38,183,184,186,189],{"class":40,"style":41},[38,185,153],{"style":75},[38,187,188],{"style":133},"\u002Fpets",[38,190,148],{"style":75},[38,192,193,196,199],{"class":40,"style":41},[38,194,195],{"style":75},"    ",[38,197,198],{"style":133},"get",[38,200,148],{"style":75},[38,202,203,206,209,211],{"class":40,"style":41},[38,204,205],{"style":75},"      ",[38,207,208],{"style":133},"operationId",[38,210,137],{"style":75},[38,212,213],{"style":161},"listPets",[38,215,216,218,221],{"class":40,"style":41},[38,217,205],{"style":161},[38,219,220],{"style":133},"responses",[38,222,148],{"style":75},[38,224,225,228,231],{"class":40,"style":41},[38,226,227],{"style":75},"        ",[38,229,230],{"style":133},"'200'",[38,232,148],{"style":75},[38,234,235,238,241,243],{"class":40,"style":41},[38,236,237],{"style":75},"          ",[38,239,240],{"style":133},"description",[38,242,137],{"style":75},[38,244,245],{"style":161},"A list of pets",[23,247,249],{"id":248},"_3-create-the-plugin","Create the plugin",[10,251,252,255,256,259,260,263,264,267,268,270,271,274,275,278,279,284],{},[14,253,254],{},"defineExtension"," with ",[14,257,258],{},"kind: 'plugin'"," takes the plugin's ",[14,261,262],{},"meta"," and a ",[14,265,266],{},"setup"," function. Register a generator and resolver in ",[14,269,266],{}," with the ",[14,272,273],{},"setResolver"," and ",[14,276,277],{},"addGenerator"," ",[280,281,283],"a",{"href":282},"\u002Fdocs\u002F5.x\u002Freference\u002Fkit\u002Fplugins#setup-context","composables",", then return the plugin's options:",[28,286,290],{"language":287,"filename":288,"code":289,"class":33},"typescript","src\u002Fplugin.ts","import { addGenerator, ast, createResolver, defineExtension, defineGenerator, setResolver } from 'kubb\u002Fkit'\n\nconst resolver = createResolver({ pluginName: 'plugin-example' })\n\nconst operationsGenerator = defineGenerator({\n  name: 'operation-comments',\n  operation(node, ctx) {\n    const name = ctx.resolver.name(node.operationId)\n    return [\n      ast.factory.createFile({\n        baseName: `${name}.ts`,\n        path: `${ctx.root}\u002F${name}.ts`,\n        sources: [\n          ast.factory.createSource({\n            nodes: [ast.factory.createText(`\u002F\u002F ${node.method} ${node.path}\\n`)],\n          }),\n        ],\n      }),\n    ]\n  },\n})\n\nexport const pluginExample = defineExtension({\n  kind: 'plugin',\n  meta: { name: 'plugin-example', version: '1.0.0' },\n  setup(options) {\n    setResolver(resolver)\n    addGenerator(operationsGenerator)\n    return options\n  },\n})",[14,291,293,50,337,50,339,50,366,50,368,50,382,50,397,50,418,50,451,50,461,50,479,50,504,50,539,50,550,50,567,50,628,50,636,50,645,50,653,50,659,50,666,50,670,50,672,50,688,50,702,50,732,50,745,50,757,50,770,50,778,50,786],{"class":292},"language-typescript",[38,294,295,298,301,303,306,309,311,314,316,318,320,323,325,328,331,334],{"class":40,"style":41},[38,296,297],{"style":75},"import ",[38,299,300],{"style":133},"{ ",[38,302,277],{"style":48},[38,304,305],{"style":75},", ",[38,307,308],{"style":48},"ast",[38,310,305],{"style":75},[38,312,313],{"style":48},"createResolver",[38,315,305],{"style":75},[38,317,254],{"style":48},[38,319,305],{"style":75},[38,321,322],{"style":48},"defineGenerator",[38,324,305],{"style":75},[38,326,327],{"style":48},"setResolver ",[38,329,330],{"style":133},"} ",[38,332,333],{"style":75},"from ",[38,335,336],{"style":161},"'kubb\u002Fkit'",[38,338],{"class":40,"style":41},[38,340,341,344,347,350,352,355,358,360,363],{"class":40,"style":41},[38,342,343],{"style":75},"const ",[38,345,346],{"style":48},"resolver ",[38,348,349],{"style":75},"= ",[38,351,313],{"style":44},[38,353,354],{"style":133},"({ ",[38,356,357],{"style":133},"pluginName",[38,359,137],{"style":75},[38,361,362],{"style":161},"'plugin-example' ",[38,364,365],{"style":133},"})",[38,367],{"class":40,"style":41},[38,369,370,372,375,377,379],{"class":40,"style":41},[38,371,343],{"style":75},[38,373,374],{"style":48},"operationsGenerator ",[38,376,349],{"style":75},[38,378,322],{"style":44},[38,380,381],{"style":133},"({",[38,383,384,386,389,391,394],{"class":40,"style":41},[38,385,153],{"style":133},[38,387,388],{"style":133},"name",[38,390,137],{"style":75},[38,392,393],{"style":161},"'operation-comments'",[38,395,396],{"style":75},",",[38,398,399,401,404,407,410,412,415],{"class":40,"style":41},[38,400,153],{"style":75},[38,402,403],{"style":44},"operation",[38,405,406],{"style":133},"(",[38,408,409],{"style":48},"node",[38,411,305],{"style":75},[38,413,414],{"style":48},"ctx",[38,416,417],{"style":133},") {",[38,419,420,422,424,427,429,431,433,436,438,440,442,444,446,448],{"class":40,"style":41},[38,421,195],{"style":133},[38,423,343],{"style":75},[38,425,426],{"style":48},"name ",[38,428,349],{"style":75},[38,430,414],{"style":48},[38,432,110],{"style":75},[38,434,435],{"style":133},"resolver",[38,437,110],{"style":75},[38,439,388],{"style":44},[38,441,406],{"style":133},[38,443,409],{"style":48},[38,445,110],{"style":75},[38,447,208],{"style":133},[38,449,450],{"style":133},")",[38,452,453,455,458],{"class":40,"style":41},[38,454,195],{"style":133},[38,456,457],{"style":75},"return ",[38,459,460],{"style":133},"[",[38,462,463,465,467,469,472,474,477],{"class":40,"style":41},[38,464,205],{"style":133},[38,466,308],{"style":48},[38,468,110],{"style":75},[38,470,471],{"style":133},"factory",[38,473,110],{"style":75},[38,475,476],{"style":44},"createFile",[38,478,381],{"style":133},[38,480,481,483,486,488,491,494,496,499,502],{"class":40,"style":41},[38,482,227],{"style":133},[38,484,485],{"style":133},"baseName",[38,487,137],{"style":75},[38,489,490],{"style":161},"`",[38,492,493],{"style":48},"${",[38,495,388],{"style":48},[38,497,498],{"style":48},"}",[38,500,501],{"style":161},".ts`",[38,503,396],{"style":75},[38,505,506,508,511,513,515,517,519,521,524,526,529,531,533,535,537],{"class":40,"style":41},[38,507,227],{"style":75},[38,509,510],{"style":133},"path",[38,512,137],{"style":75},[38,514,490],{"style":161},[38,516,493],{"style":48},[38,518,414],{"style":48},[38,520,110],{"style":75},[38,522,523],{"style":133},"root",[38,525,498],{"style":48},[38,527,528],{"style":161},"\u002F",[38,530,493],{"style":48},[38,532,388],{"style":48},[38,534,498],{"style":48},[38,536,501],{"style":161},[38,538,396],{"style":75},[38,540,541,543,546,548],{"class":40,"style":41},[38,542,227],{"style":75},[38,544,545],{"style":133},"sources",[38,547,137],{"style":75},[38,549,460],{"style":133},[38,551,552,554,556,558,560,562,565],{"class":40,"style":41},[38,553,237],{"style":133},[38,555,308],{"style":48},[38,557,110],{"style":75},[38,559,471],{"style":133},[38,561,110],{"style":75},[38,563,564],{"style":44},"createSource",[38,566,381],{"style":133},[38,568,569,572,575,577,579,581,583,585,587,590,592,595,597,599,601,604,606,608,610,612,614,616,618,621,623,626],{"class":40,"style":41},[38,570,571],{"style":133},"            ",[38,573,574],{"style":133},"nodes",[38,576,137],{"style":75},[38,578,460],{"style":133},[38,580,308],{"style":48},[38,582,110],{"style":75},[38,584,471],{"style":133},[38,586,110],{"style":75},[38,588,589],{"style":44},"createText",[38,591,406],{"style":133},[38,593,594],{"style":161},"`\u002F\u002F ",[38,596,493],{"style":48},[38,598,409],{"style":48},[38,600,110],{"style":75},[38,602,603],{"style":133},"method",[38,605,498],{"style":48},[38,607,278],{"style":161},[38,609,493],{"style":48},[38,611,409],{"style":48},[38,613,110],{"style":75},[38,615,510],{"style":133},[38,617,498],{"style":48},[38,619,620],{"style":161},"\\n",[38,622,490],{"style":161},[38,624,625],{"style":133},")]",[38,627,396],{"style":75},[38,629,630,632,634],{"class":40,"style":41},[38,631,237],{"style":75},[38,633,365],{"style":133},[38,635,396],{"style":75},[38,637,638,640,643],{"class":40,"style":41},[38,639,227],{"style":75},[38,641,642],{"style":133},"]",[38,644,396],{"style":75},[38,646,647,649,651],{"class":40,"style":41},[38,648,205],{"style":75},[38,650,365],{"style":133},[38,652,396],{"style":75},[38,654,655,657],{"class":40,"style":41},[38,656,195],{"style":75},[38,658,642],{"style":133},[38,660,661,664],{"class":40,"style":41},[38,662,663],{"style":133},"  }",[38,665,396],{"style":75},[38,667,668],{"class":40,"style":41},[38,669,365],{"style":133},[38,671],{"class":40,"style":41},[38,673,674,677,679,682,684,686],{"class":40,"style":41},[38,675,676],{"style":75},"export ",[38,678,343],{"style":75},[38,680,681],{"style":48},"pluginExample ",[38,683,349],{"style":75},[38,685,254],{"style":44},[38,687,381],{"style":133},[38,689,690,692,695,697,700],{"class":40,"style":41},[38,691,153],{"style":133},[38,693,694],{"style":133},"kind",[38,696,137],{"style":75},[38,698,699],{"style":161},"'plugin'",[38,701,396],{"style":75},[38,703,704,706,708,710,712,714,716,719,721,723,725,728,730],{"class":40,"style":41},[38,705,153],{"style":75},[38,707,262],{"style":133},[38,709,137],{"style":75},[38,711,300],{"style":133},[38,713,388],{"style":133},[38,715,137],{"style":75},[38,717,718],{"style":161},"'plugin-example'",[38,720,305],{"style":75},[38,722,169],{"style":133},[38,724,137],{"style":75},[38,726,727],{"style":161},"'1.0.0' ",[38,729,498],{"style":133},[38,731,396],{"style":75},[38,733,734,736,738,740,743],{"class":40,"style":41},[38,735,153],{"style":75},[38,737,266],{"style":44},[38,739,406],{"style":133},[38,741,742],{"style":48},"options",[38,744,417],{"style":133},[38,746,747,749,751,753,755],{"class":40,"style":41},[38,748,195],{"style":133},[38,750,273],{"style":44},[38,752,406],{"style":133},[38,754,435],{"style":48},[38,756,450],{"style":133},[38,758,759,761,763,765,768],{"class":40,"style":41},[38,760,195],{"style":133},[38,762,277],{"style":44},[38,764,406],{"style":133},[38,766,767],{"style":48},"operationsGenerator",[38,769,450],{"style":133},[38,771,772,774,776],{"class":40,"style":41},[38,773,195],{"style":133},[38,775,457],{"style":75},[38,777,742],{"style":48},[38,779,780,782,784],{"class":40,"style":41},[38,781,153],{"style":48},[38,783,498],{"style":133},[38,785,396],{"style":75},[38,787,788],{"class":40,"style":41},[38,789,365],{"style":133},[10,791,792,793,795],{},"The ",[14,794,403],{}," handler writes a comment containing the operation's HTTP method and path.",[23,797,799],{"id":798},"_4-generate","Generate",[10,801,802],{},"Register the plugin in your config:",[28,804,807],{"language":287,"filename":805,"code":806,"class":33},"kubb.config.ts","import { defineConfig } from 'kubb\u002Fconfig'\nimport { pluginExample } from '.\u002Fsrc\u002Fplugin'\n\nexport default defineConfig({\n  input: '.\u002FpetStore.yaml',\n  output: { path: '.\u002Fsrc\u002Fgen' },\n  plugins: [pluginExample()],\n})",[14,808,809,50,825,50,840,50,842,50,854,50,868,50,890,50,909],{"class":292},[38,810,811,813,815,818,820,822],{"class":40,"style":41},[38,812,297],{"style":75},[38,814,300],{"style":133},[38,816,817],{"style":48},"defineConfig ",[38,819,330],{"style":133},[38,821,333],{"style":75},[38,823,824],{"style":161},"'kubb\u002Fconfig'",[38,826,827,829,831,833,835,837],{"class":40,"style":41},[38,828,297],{"style":75},[38,830,300],{"style":133},[38,832,681],{"style":48},[38,834,330],{"style":133},[38,836,333],{"style":75},[38,838,839],{"style":161},"'.\u002Fsrc\u002Fplugin'",[38,841],{"class":40,"style":41},[38,843,844,846,849,852],{"class":40,"style":41},[38,845,676],{"style":75},[38,847,848],{"style":75},"default ",[38,850,851],{"style":44},"defineConfig",[38,853,381],{"style":133},[38,855,856,858,861,863,866],{"class":40,"style":41},[38,857,153],{"style":133},[38,859,860],{"style":133},"input",[38,862,137],{"style":75},[38,864,865],{"style":161},"'.\u002FpetStore.yaml'",[38,867,396],{"style":75},[38,869,870,872,875,877,879,881,883,886,888],{"class":40,"style":41},[38,871,153],{"style":75},[38,873,874],{"style":133},"output",[38,876,137],{"style":75},[38,878,300],{"style":133},[38,880,510],{"style":133},[38,882,137],{"style":75},[38,884,885],{"style":161},"'.\u002Fsrc\u002Fgen' ",[38,887,498],{"style":133},[38,889,396],{"style":75},[38,891,892,894,897,899,901,904,907],{"class":40,"style":41},[38,893,153],{"style":75},[38,895,896],{"style":133},"plugins",[38,898,137],{"style":75},[38,900,460],{"style":133},[38,902,903],{"style":44},"pluginExample",[38,905,906],{"style":133},"()]",[38,908,396],{"style":75},[38,910,911],{"class":40,"style":41},[38,912,365],{"style":133},[28,914,916],{"language":30,"filename":31,"code":915,"class":33},"npx kubb generate",[14,917,918],{"class":36},[38,919,920,923],{"class":40,"style":41},[38,921,922],{"style":44},"npx ",[38,924,925],{"style":48},"kubb generate",[10,927,928],{},"Read the generated file:",[28,930,932],{"language":30,"filename":31,"code":931,"class":33},"node -e \"console.log(require('node:fs').readFileSync('src\u002Fgen\u002FlistPets.ts', 'utf8'))\"",[14,933,934],{"class":36},[38,935,936,939,942],{"class":40,"style":41},[38,937,938],{"style":44},"node ",[38,940,941],{"style":48},"-e ",[38,943,944],{"style":161},"\"console.log(require('node:fs').readFileSync('src\u002Fgen\u002FlistPets.ts', 'utf8'))\"",[10,946,947,948,274,951,110],{},"It contains a comment naming ",[14,949,950],{},"GET",[14,952,188],{},[23,954,956],{"id":955},"_5-test-the-output","Test the output",[10,958,959,960,963,964,966,967,110],{},"Run an in-process build with memory storage and a small fixture. ",[14,961,962],{},"createKubb"," from ",[14,965,109],{}," supplies the same adapter and parser defaults as ",[14,968,851],{},[28,970,973],{"language":287,"filename":971,"code":972,"class":33},"src\u002Fplugin.test.ts","import { describe, expect, it } from 'vitest'\nimport { createKubb } from 'kubb'\nimport { memoryStorage } from 'kubb\u002Fkit'\nimport { pluginExample } from '.\u002Fplugin'\n\nconst input = {\n  openapi: '3.0.3',\n  info: { title: 'Pets', version: '1.0.0' },\n  paths: {\n    '\u002Fpets': {\n      get: {\n        operationId: 'listPets',\n        responses: { '200': { description: 'A list of pets' } },\n      },\n    },\n  },\n}\n\ndescribe('pluginExample', () => {\n  it('emits an operation comment', async () => {\n    const { files, storage } = await createKubb({\n      input,\n      output: { path: '.\u002Fgen' },\n      storage: memoryStorage(),\n      plugins: [pluginExample()],\n    }).build()\n\n    const file = files.find((file) => file.baseName === 'listPets.ts')\n    expect(file).toBeDefined()\n    expect(await storage.readItem(file!.path)).toContain('\u002Fpets')\n  })\n})",[14,974,975,50,1001,50,1017,50,1032,50,1047,50,1049,50,1061,50,1074,50,1103,50,1113,50,1124,50,1134,50,1147,50,1175,50,1183,50,1191,50,1199,50,1203,50,1205,50,1224,50,1247,50,1274,50,1282,50,1303,50,1320,50,1336,50,1349,50,1351,50,1395,50,1414,50,1456,50,1461],{"class":292},[38,976,977,979,981,984,986,989,991,994,996,998],{"class":40,"style":41},[38,978,297],{"style":75},[38,980,300],{"style":133},[38,982,983],{"style":48},"describe",[38,985,305],{"style":75},[38,987,988],{"style":48},"expect",[38,990,305],{"style":75},[38,992,993],{"style":48},"it ",[38,995,330],{"style":133},[38,997,333],{"style":75},[38,999,1000],{"style":161},"'vitest'",[38,1002,1003,1005,1007,1010,1012,1014],{"class":40,"style":41},[38,1004,297],{"style":75},[38,1006,300],{"style":133},[38,1008,1009],{"style":48},"createKubb ",[38,1011,330],{"style":133},[38,1013,333],{"style":75},[38,1015,1016],{"style":161},"'kubb'",[38,1018,1019,1021,1023,1026,1028,1030],{"class":40,"style":41},[38,1020,297],{"style":75},[38,1022,300],{"style":133},[38,1024,1025],{"style":48},"memoryStorage ",[38,1027,330],{"style":133},[38,1029,333],{"style":75},[38,1031,336],{"style":161},[38,1033,1034,1036,1038,1040,1042,1044],{"class":40,"style":41},[38,1035,297],{"style":75},[38,1037,300],{"style":133},[38,1039,681],{"style":48},[38,1041,330],{"style":133},[38,1043,333],{"style":75},[38,1045,1046],{"style":161},"'.\u002Fplugin'",[38,1048],{"class":40,"style":41},[38,1050,1051,1053,1056,1058],{"class":40,"style":41},[38,1052,343],{"style":75},[38,1054,1055],{"style":48},"input ",[38,1057,349],{"style":75},[38,1059,1060],{"style":133},"{",[38,1062,1063,1065,1067,1069,1072],{"class":40,"style":41},[38,1064,153],{"style":133},[38,1066,134],{"style":133},[38,1068,137],{"style":75},[38,1070,1071],{"style":161},"'3.0.3'",[38,1073,396],{"style":75},[38,1075,1076,1078,1080,1082,1084,1086,1088,1091,1093,1095,1097,1099,1101],{"class":40,"style":41},[38,1077,153],{"style":75},[38,1079,145],{"style":133},[38,1081,137],{"style":75},[38,1083,300],{"style":133},[38,1085,156],{"style":133},[38,1087,137],{"style":75},[38,1089,1090],{"style":161},"'Pets'",[38,1092,305],{"style":75},[38,1094,169],{"style":133},[38,1096,137],{"style":75},[38,1098,727],{"style":161},[38,1100,498],{"style":133},[38,1102,396],{"style":75},[38,1104,1105,1107,1109,1111],{"class":40,"style":41},[38,1106,153],{"style":75},[38,1108,179],{"style":133},[38,1110,137],{"style":75},[38,1112,1060],{"style":133},[38,1114,1115,1117,1120,1122],{"class":40,"style":41},[38,1116,195],{"style":133},[38,1118,1119],{"style":161},"'\u002Fpets'",[38,1121,137],{"style":75},[38,1123,1060],{"style":133},[38,1125,1126,1128,1130,1132],{"class":40,"style":41},[38,1127,205],{"style":133},[38,1129,198],{"style":133},[38,1131,137],{"style":75},[38,1133,1060],{"style":133},[38,1135,1136,1138,1140,1142,1145],{"class":40,"style":41},[38,1137,227],{"style":133},[38,1139,208],{"style":133},[38,1141,137],{"style":75},[38,1143,1144],{"style":161},"'listPets'",[38,1146,396],{"style":75},[38,1148,1149,1151,1153,1155,1157,1159,1161,1163,1165,1167,1170,1173],{"class":40,"style":41},[38,1150,227],{"style":75},[38,1152,220],{"style":133},[38,1154,137],{"style":75},[38,1156,300],{"style":133},[38,1158,230],{"style":161},[38,1160,137],{"style":75},[38,1162,300],{"style":133},[38,1164,240],{"style":133},[38,1166,137],{"style":75},[38,1168,1169],{"style":161},"'A list of pets' ",[38,1171,1172],{"style":133},"} }",[38,1174,396],{"style":75},[38,1176,1177,1179,1181],{"class":40,"style":41},[38,1178,205],{"style":75},[38,1180,498],{"style":133},[38,1182,396],{"style":75},[38,1184,1185,1187,1189],{"class":40,"style":41},[38,1186,195],{"style":75},[38,1188,498],{"style":133},[38,1190,396],{"style":75},[38,1192,1193,1195,1197],{"class":40,"style":41},[38,1194,153],{"style":75},[38,1196,498],{"style":133},[38,1198,396],{"style":75},[38,1200,1201],{"class":40,"style":41},[38,1202,498],{"style":133},[38,1204],{"class":40,"style":41},[38,1206,1207,1209,1211,1214,1216,1219,1222],{"class":40,"style":41},[38,1208,983],{"style":44},[38,1210,406],{"style":133},[38,1212,1213],{"style":161},"'pluginExample'",[38,1215,305],{"style":75},[38,1217,1218],{"style":133},"() ",[38,1220,1221],{"style":75},"=> ",[38,1223,1060],{"style":133},[38,1225,1226,1228,1231,1233,1236,1238,1241,1243,1245],{"class":40,"style":41},[38,1227,153],{"style":133},[38,1229,1230],{"style":44},"it",[38,1232,406],{"style":133},[38,1234,1235],{"style":161},"'emits an operation comment'",[38,1237,305],{"style":75},[38,1239,1240],{"style":75},"async ",[38,1242,1218],{"style":133},[38,1244,1221],{"style":75},[38,1246,1060],{"style":133},[38,1248,1249,1251,1253,1255,1258,1260,1263,1265,1267,1270,1272],{"class":40,"style":41},[38,1250,195],{"style":133},[38,1252,343],{"style":75},[38,1254,300],{"style":133},[38,1256,1257],{"style":48},"files",[38,1259,305],{"style":75},[38,1261,1262],{"style":48},"storage ",[38,1264,330],{"style":133},[38,1266,349],{"style":75},[38,1268,1269],{"style":75},"await ",[38,1271,962],{"style":44},[38,1273,381],{"style":133},[38,1275,1276,1278,1280],{"class":40,"style":41},[38,1277,205],{"style":133},[38,1279,860],{"style":48},[38,1281,396],{"style":75},[38,1283,1284,1286,1288,1290,1292,1294,1296,1299,1301],{"class":40,"style":41},[38,1285,205],{"style":75},[38,1287,874],{"style":133},[38,1289,137],{"style":75},[38,1291,300],{"style":133},[38,1293,510],{"style":133},[38,1295,137],{"style":75},[38,1297,1298],{"style":161},"'.\u002Fgen' ",[38,1300,498],{"style":133},[38,1302,396],{"style":75},[38,1304,1305,1307,1310,1312,1315,1318],{"class":40,"style":41},[38,1306,205],{"style":75},[38,1308,1309],{"style":133},"storage",[38,1311,137],{"style":75},[38,1313,1314],{"style":44},"memoryStorage",[38,1316,1317],{"style":133},"()",[38,1319,396],{"style":75},[38,1321,1322,1324,1326,1328,1330,1332,1334],{"class":40,"style":41},[38,1323,205],{"style":75},[38,1325,896],{"style":133},[38,1327,137],{"style":75},[38,1329,460],{"style":133},[38,1331,903],{"style":44},[38,1333,906],{"style":133},[38,1335,396],{"style":75},[38,1337,1338,1340,1342,1344,1347],{"class":40,"style":41},[38,1339,195],{"style":75},[38,1341,365],{"style":133},[38,1343,110],{"style":75},[38,1345,1346],{"style":44},"build",[38,1348,1317],{"style":133},[38,1350],{"class":40,"style":41},[38,1352,1353,1355,1357,1360,1362,1364,1366,1369,1372,1375,1378,1380,1382,1384,1387,1390,1393],{"class":40,"style":41},[38,1354,195],{"style":133},[38,1356,343],{"style":75},[38,1358,1359],{"style":48},"file ",[38,1361,349],{"style":75},[38,1363,1257],{"style":48},[38,1365,110],{"style":75},[38,1367,1368],{"style":44},"find",[38,1370,1371],{"style":133},"((",[38,1373,1374],{"style":48},"file",[38,1376,1377],{"style":133},") ",[38,1379,1221],{"style":75},[38,1381,1374],{"style":48},[38,1383,110],{"style":75},[38,1385,1386],{"style":133},"baseName ",[38,1388,1389],{"style":75},"=== ",[38,1391,1392],{"style":161},"'listPets.ts'",[38,1394,450],{"style":133},[38,1396,1397,1399,1401,1403,1405,1407,1409,1412],{"class":40,"style":41},[38,1398,195],{"style":133},[38,1400,988],{"style":44},[38,1402,406],{"style":133},[38,1404,1374],{"style":48},[38,1406,450],{"style":133},[38,1408,110],{"style":75},[38,1410,1411],{"style":44},"toBeDefined",[38,1413,1317],{"style":133},[38,1415,1416,1418,1420,1422,1424,1426,1428,1431,1433,1435,1438,1440,1442,1445,1447,1450,1452,1454],{"class":40,"style":41},[38,1417,195],{"style":133},[38,1419,988],{"style":44},[38,1421,406],{"style":133},[38,1423,1269],{"style":75},[38,1425,1309],{"style":48},[38,1427,110],{"style":75},[38,1429,1430],{"style":44},"readItem",[38,1432,406],{"style":133},[38,1434,1374],{"style":48},[38,1436,1437],{"style":75},"!",[38,1439,110],{"style":75},[38,1441,510],{"style":133},[38,1443,1444],{"style":133},"))",[38,1446,110],{"style":75},[38,1448,1449],{"style":44},"toContain",[38,1451,406],{"style":133},[38,1453,1119],{"style":161},[38,1455,450],{"style":133},[38,1457,1458],{"class":40,"style":41},[38,1459,1460],{"style":133},"  })",[38,1462,1463],{"class":40,"style":41},[38,1464,365],{"style":133},[10,1466,1467],{},"Run the test:",[28,1469,1471],{"language":30,"filename":31,"code":1470,"class":33},"npx vitest run src\u002Fplugin.test.ts",[14,1472,1473],{"class":36},[38,1474,1475,1477],{"class":40,"style":41},[38,1476,922],{"style":44},[38,1478,1479],{"style":48},"vitest run src\u002Fplugin.test.ts",[10,1481,1482],{},"Vitest reports one passing test. It checks the generated file in memory without writing to disk.",{"title":1484,"searchDepth":1485,"depth":1485,"links":1486},"",5,[1487,1489,1490,1491,1492],{"id":25,"depth":1488,"text":26},2,{"id":113,"depth":1488,"text":114},{"id":248,"depth":1488,"text":249},{"id":798,"depth":1488,"text":799},{"id":955,"depth":1488,"text":956},"Build a Kubb plugin that writes the method and path of one API operation to a file, then test its output in memory with createKubb and Vitest.","md",{"layout":1496,"title":5,"description":1493,"outline":1497,"order":1488,"navigation":1499},"doc",[1488,1498],3,{"title":1500,"icon":1501},"Create a plugin","i-iconoir-ev-plug",{"layout":1496,"outline":1503},[1488,1498],{"title":1500,"icon":1501},"\u002Fdocs\u002F5.x\u002Ftutorials\u002Fcreating-plugins",{"title":5,"description":1493},{"loc":1505},"kubb-labs\u002Fkubb\u002Fdocs\u002F5.x\u002Ftutorials\u002Fcreating-plugins.md","docs\u002F5.x\u002Ftutorials\u002Fcreating-plugins","yGFk1_3ib-NLRbpBR1MZmTKiJuB72H8fRdJP_O8bABs",1792931642313]