[{"data":1,"prerenderedAt":1064},["ShallowReactive",2],{"page:\u002Fdocs\u002F5.x\u002Fhow-to\u002Fpublish-a-plugin":3},{"id":4,"title":5,"body":6,"description":1046,"extension":1047,"frontmatter":1048,"heading":5,"meta":1055,"navigation":1057,"order":1052,"path":1058,"seo":1059,"sitemap":1060,"source":1061,"stem":1062,"__hash__":1063},"docs\u002Fdocs\u002F5.x\u002Fhow-to\u002Fpublish-a-plugin.md","Publish a plugin",{"type":7,"value":8,"toc":1035},"minimark",[9,24],[10,11,12,13,17,18,23],"p",{},"Publish a plugin to npm, then list it in the Kubb registry so users can install it with ",[14,15,16],"code",{},"kubb add"," and find it in Studio. Start from a working plugin with tests, such as the one from ",[19,20,22],"a",{"href":21},"\u002Fdocs\u002F5.x\u002Ftutorials\u002Fcreating-plugins","Create and extend a plugin",". Adapters and parsers follow the same steps.",[25,26,28,33,40,77,80,253,260,511,531,538,542,551,809,830,866,870,877,908,920,931,934,937,941,944,975,995,999,1002,1021,1025],"steps",{"level":27},"2",[29,30,32],"h2",{"id":31},"build-the-package","Build the package",[10,34,35,36,39],{},"Export the factory from a package entrypoint. Use a ",[14,37,38],{},".js"," extension for the relative import so the compiled ESM works in Node:",[41,42,47],"pre",{"language":43,"filename":44,"code":45,"class":46},"typescript","src\u002Findex.ts","export { pluginExample } from '.\u002Fplugin.js'","highlights",[14,48,50],{"class":49},"language-typescript",[51,52,55,59,63,67,70,73],"span",{"class":53,"style":54},"line","display: inline",[51,56,58],{"style":57},"color:#d73a49;--hls-dark:#f97583","export ",[51,60,62],{"style":61},"color:#005cc5;--hls-dark:#79b8ff","{ ",[51,64,66],{"style":65},"color:#24292e;--hls-dark:#e1e4e8","pluginExample ",[51,68,69],{"style":61},"} ",[51,71,72],{"style":57},"from ",[51,74,76],{"style":75},"color:#032f62;--hls-dark:#9ecbff","'.\u002Fplugin.js'",[10,78,79],{},"Create a TypeScript build config:",[41,81,85],{"language":82,"filename":83,"code":84,"class":46},"json","tsconfig.json","{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"NodeNext\",\n    \"moduleResolution\": \"NodeNext\",\n    \"strict\": true,\n    \"declaration\": true,\n    \"skipLibCheck\": true,\n    \"rootDir\": \"src\",\n    \"outDir\": \"dist\"\n  },\n  \"include\": [\"src\u002Findex.ts\", \"src\u002Fplugin.ts\"]\n}",[14,86,88,93,94,93,107,93,123,93,137,93,150,93,164,93,177,93,190,93,204,93,216,93,225,93,249],{"class":87},"language-json",[51,89,90],{"class":53,"style":54},[51,91,92],{"style":61},"{","\n",[51,95,96,99,102,105],{"class":53,"style":54},[51,97,98],{"style":61},"  ",[51,100,101],{"style":61},"\"compilerOptions\"",[51,103,104],{"style":57},": ",[51,106,92],{"style":61},[51,108,109,112,115,117,120],{"class":53,"style":54},[51,110,111],{"style":61},"    ",[51,113,114],{"style":61},"\"target\"",[51,116,104],{"style":57},[51,118,119],{"style":75},"\"ES2022\"",[51,121,122],{"style":57},",",[51,124,125,127,130,132,135],{"class":53,"style":54},[51,126,111],{"style":57},[51,128,129],{"style":61},"\"module\"",[51,131,104],{"style":57},[51,133,134],{"style":75},"\"NodeNext\"",[51,136,122],{"style":57},[51,138,139,141,144,146,148],{"class":53,"style":54},[51,140,111],{"style":57},[51,142,143],{"style":61},"\"moduleResolution\"",[51,145,104],{"style":57},[51,147,134],{"style":75},[51,149,122],{"style":57},[51,151,152,154,157,159,162],{"class":53,"style":54},[51,153,111],{"style":57},[51,155,156],{"style":61},"\"strict\"",[51,158,104],{"style":57},[51,160,161],{"style":61},"true",[51,163,122],{"style":57},[51,165,166,168,171,173,175],{"class":53,"style":54},[51,167,111],{"style":57},[51,169,170],{"style":61},"\"declaration\"",[51,172,104],{"style":57},[51,174,161],{"style":61},[51,176,122],{"style":57},[51,178,179,181,184,186,188],{"class":53,"style":54},[51,180,111],{"style":57},[51,182,183],{"style":61},"\"skipLibCheck\"",[51,185,104],{"style":57},[51,187,161],{"style":61},[51,189,122],{"style":57},[51,191,192,194,197,199,202],{"class":53,"style":54},[51,193,111],{"style":57},[51,195,196],{"style":61},"\"rootDir\"",[51,198,104],{"style":57},[51,200,201],{"style":75},"\"src\"",[51,203,122],{"style":57},[51,205,206,208,211,213],{"class":53,"style":54},[51,207,111],{"style":57},[51,209,210],{"style":61},"\"outDir\"",[51,212,104],{"style":57},[51,214,215],{"style":75},"\"dist\"",[51,217,218,220,223],{"class":53,"style":54},[51,219,98],{"style":75},[51,221,222],{"style":61},"}",[51,224,122],{"style":57},[51,226,227,229,232,234,237,240,243,246],{"class":53,"style":54},[51,228,98],{"style":57},[51,230,231],{"style":61},"\"include\"",[51,233,104],{"style":57},[51,235,236],{"style":61},"[",[51,238,239],{"style":75},"\"src\u002Findex.ts\"",[51,241,242],{"style":57},", ",[51,244,245],{"style":75},"\"src\u002Fplugin.ts\"",[51,247,248],{"style":61},"]",[51,250,251],{"class":53,"style":54},[51,252,222],{"style":61},[10,254,255,256,259],{},"Add the following fields to your existing ",[14,257,258],{},"package.json",", keeping the development dependencies installed earlier. Replace the package name with an available name you own before publishing:",[41,261,264],{"language":82,"filename":262,"code":263,"class":46},"package.json fields","{\n  \"name\": \"kubb-plugin-example\",\n  \"version\": \"1.0.0\",\n  \"type\": \"module\",\n  \"files\": [\"dist\", \"kubb-extension.json\", \"docs\"],\n  \"scripts\": {\n    \"build\": \"tsc -p tsconfig.json\",\n    \"test\": \"vitest run src\u002Fplugin.test.ts\",\n    \"prepack\": \"npm run build && npm test\"\n  },\n  \"exports\": {\n    \".\": {\n      \"types\": \".\u002Fdist\u002Findex.d.ts\",\n      \"import\": \".\u002Fdist\u002Findex.js\"\n    },\n    \".\u002Fkubb-extension.json\": \".\u002Fkubb-extension.json\",\n    \".\u002Fpackage.json\": \".\u002Fpackage.json\"\n  },\n  \"peerDependencies\": { \"kubb\": \"^5.0.0\" }\n}",[14,265,266,93,270,93,284,93,298,93,311,93,338,93,349,93,363,93,377,93,389,93,397,93,408,93,419,93,434,93,446,93,454,93,467,93,478,93,486,93,507],{"class":87},[51,267,268],{"class":53,"style":54},[51,269,92],{"style":61},[51,271,272,274,277,279,282],{"class":53,"style":54},[51,273,98],{"style":61},[51,275,276],{"style":61},"\"name\"",[51,278,104],{"style":57},[51,280,281],{"style":75},"\"kubb-plugin-example\"",[51,283,122],{"style":57},[51,285,286,288,291,293,296],{"class":53,"style":54},[51,287,98],{"style":57},[51,289,290],{"style":61},"\"version\"",[51,292,104],{"style":57},[51,294,295],{"style":75},"\"1.0.0\"",[51,297,122],{"style":57},[51,299,300,302,305,307,309],{"class":53,"style":54},[51,301,98],{"style":57},[51,303,304],{"style":61},"\"type\"",[51,306,104],{"style":57},[51,308,129],{"style":75},[51,310,122],{"style":57},[51,312,313,315,318,320,322,324,326,329,331,334,336],{"class":53,"style":54},[51,314,98],{"style":57},[51,316,317],{"style":61},"\"files\"",[51,319,104],{"style":57},[51,321,236],{"style":61},[51,323,215],{"style":75},[51,325,242],{"style":57},[51,327,328],{"style":75},"\"kubb-extension.json\"",[51,330,242],{"style":57},[51,332,333],{"style":75},"\"docs\"",[51,335,248],{"style":61},[51,337,122],{"style":57},[51,339,340,342,345,347],{"class":53,"style":54},[51,341,98],{"style":57},[51,343,344],{"style":61},"\"scripts\"",[51,346,104],{"style":57},[51,348,92],{"style":61},[51,350,351,353,356,358,361],{"class":53,"style":54},[51,352,111],{"style":61},[51,354,355],{"style":61},"\"build\"",[51,357,104],{"style":57},[51,359,360],{"style":75},"\"tsc -p tsconfig.json\"",[51,362,122],{"style":57},[51,364,365,367,370,372,375],{"class":53,"style":54},[51,366,111],{"style":57},[51,368,369],{"style":61},"\"test\"",[51,371,104],{"style":57},[51,373,374],{"style":75},"\"vitest run src\u002Fplugin.test.ts\"",[51,376,122],{"style":57},[51,378,379,381,384,386],{"class":53,"style":54},[51,380,111],{"style":57},[51,382,383],{"style":61},"\"prepack\"",[51,385,104],{"style":57},[51,387,388],{"style":75},"\"npm run build && npm test\"",[51,390,391,393,395],{"class":53,"style":54},[51,392,98],{"style":75},[51,394,222],{"style":61},[51,396,122],{"style":57},[51,398,399,401,404,406],{"class":53,"style":54},[51,400,98],{"style":57},[51,402,403],{"style":61},"\"exports\"",[51,405,104],{"style":57},[51,407,92],{"style":61},[51,409,410,412,415,417],{"class":53,"style":54},[51,411,111],{"style":61},[51,413,414],{"style":61},"\".\"",[51,416,104],{"style":57},[51,418,92],{"style":61},[51,420,421,424,427,429,432],{"class":53,"style":54},[51,422,423],{"style":61},"      ",[51,425,426],{"style":61},"\"types\"",[51,428,104],{"style":57},[51,430,431],{"style":75},"\".\u002Fdist\u002Findex.d.ts\"",[51,433,122],{"style":57},[51,435,436,438,441,443],{"class":53,"style":54},[51,437,423],{"style":57},[51,439,440],{"style":61},"\"import\"",[51,442,104],{"style":57},[51,444,445],{"style":75},"\".\u002Fdist\u002Findex.js\"",[51,447,448,450,452],{"class":53,"style":54},[51,449,111],{"style":75},[51,451,222],{"style":61},[51,453,122],{"style":57},[51,455,456,458,461,463,465],{"class":53,"style":54},[51,457,111],{"style":57},[51,459,460],{"style":61},"\".\u002Fkubb-extension.json\"",[51,462,104],{"style":57},[51,464,460],{"style":75},[51,466,122],{"style":57},[51,468,469,471,474,476],{"class":53,"style":54},[51,470,111],{"style":57},[51,472,473],{"style":61},"\".\u002Fpackage.json\"",[51,475,104],{"style":57},[51,477,473],{"style":75},[51,479,480,482,484],{"class":53,"style":54},[51,481,98],{"style":75},[51,483,222],{"style":61},[51,485,122],{"style":57},[51,487,488,490,493,495,497,500,502,505],{"class":53,"style":54},[51,489,98],{"style":57},[51,491,492],{"style":61},"\"peerDependencies\"",[51,494,104],{"style":57},[51,496,62],{"style":61},[51,498,499],{"style":61},"\"kubb\"",[51,501,104],{"style":57},[51,503,504],{"style":75},"\"^5.0.0\" ",[51,506,222],{"style":61},[51,508,509],{"class":53,"style":54},[51,510,222],{"style":61},[10,512,513,516,517,520,521,524,525,527,528,530],{},[14,514,515],{},"files"," ships the manifest and the docs folder you add next. The ",[14,518,519],{},"exports"," entries keep ",[14,522,523],{},"kubb-extension.json"," and ",[14,526,258],{}," importable, because an ",[14,529,519],{}," map hides every path it does not list.",[10,532,533,534,537],{},"Keep ",[14,535,536],{},"kubb"," as a development dependency so you can build and test locally. The peer dependency asks users for a compatible Kubb version.",[29,539,541],{"id":540},"add-the-manifest","Add the manifest",[10,543,544,545,547,548,550],{},"Create ",[14,546,523],{}," at the package root. It tells the registry, ",[14,549,16],{},", and Studio what the package is and which factory to call:",[41,552,554],{"language":82,"filename":523,"code":553,"class":46},"{\n  \"$schema\": \"https:\u002F\u002Fkubb.dev\u002Fschemas\u002Fkubb-extension.json\",\n  \"kind\": \"plugin\",\n  \"name\": \"plugin-example\",\n  \"export\": \"pluginExample\",\n  \"displayName\": \"Example\",\n  \"description\": \"Writes a comment with the HTTP method and path of every operation.\",\n  \"maintainers\": [{ \"name\": \"Acme\", \"github\": \"acme\" }],\n  \"compatibility\": { \"kubb\": \">=5.8.3\", \"node\": \">=22\" },\n  \"options\": [\n    {\n      \"key\": \"prefix\",\n      \"path\": [\"prefix\"],\n      \"label\": \"Prefix\",\n      \"description\": \"Text written at the start of every comment.\",\n      \"type\": \"text\"\n    }\n  ]\n}",[14,555,556,93,560,93,574,93,588,93,601,93,615,93,629,93,643,93,677,93,709,93,720,93,725,93,739,93,756,93,770,93,783,93,794,93,800,93,805],{"class":87},[51,557,558],{"class":53,"style":54},[51,559,92],{"style":61},[51,561,562,564,567,569,572],{"class":53,"style":54},[51,563,98],{"style":61},[51,565,566],{"style":61},"\"$schema\"",[51,568,104],{"style":57},[51,570,571],{"style":75},"\"https:\u002F\u002Fkubb.dev\u002Fschemas\u002Fkubb-extension.json\"",[51,573,122],{"style":57},[51,575,576,578,581,583,586],{"class":53,"style":54},[51,577,98],{"style":57},[51,579,580],{"style":61},"\"kind\"",[51,582,104],{"style":57},[51,584,585],{"style":75},"\"plugin\"",[51,587,122],{"style":57},[51,589,590,592,594,596,599],{"class":53,"style":54},[51,591,98],{"style":57},[51,593,276],{"style":61},[51,595,104],{"style":57},[51,597,598],{"style":75},"\"plugin-example\"",[51,600,122],{"style":57},[51,602,603,605,608,610,613],{"class":53,"style":54},[51,604,98],{"style":57},[51,606,607],{"style":61},"\"export\"",[51,609,104],{"style":57},[51,611,612],{"style":75},"\"pluginExample\"",[51,614,122],{"style":57},[51,616,617,619,622,624,627],{"class":53,"style":54},[51,618,98],{"style":57},[51,620,621],{"style":61},"\"displayName\"",[51,623,104],{"style":57},[51,625,626],{"style":75},"\"Example\"",[51,628,122],{"style":57},[51,630,631,633,636,638,641],{"class":53,"style":54},[51,632,98],{"style":57},[51,634,635],{"style":61},"\"description\"",[51,637,104],{"style":57},[51,639,640],{"style":75},"\"Writes a comment with the HTTP method and path of every operation.\"",[51,642,122],{"style":57},[51,644,645,647,650,652,655,657,659,662,664,667,669,672,675],{"class":53,"style":54},[51,646,98],{"style":57},[51,648,649],{"style":61},"\"maintainers\"",[51,651,104],{"style":57},[51,653,654],{"style":61},"[{ ",[51,656,276],{"style":61},[51,658,104],{"style":57},[51,660,661],{"style":75},"\"Acme\"",[51,663,242],{"style":57},[51,665,666],{"style":61},"\"github\"",[51,668,104],{"style":57},[51,670,671],{"style":75},"\"acme\" ",[51,673,674],{"style":61},"}]",[51,676,122],{"style":57},[51,678,679,681,684,686,688,690,692,695,697,700,702,705,707],{"class":53,"style":54},[51,680,98],{"style":57},[51,682,683],{"style":61},"\"compatibility\"",[51,685,104],{"style":57},[51,687,62],{"style":61},[51,689,499],{"style":61},[51,691,104],{"style":57},[51,693,694],{"style":75},"\">=5.8.3\"",[51,696,242],{"style":57},[51,698,699],{"style":61},"\"node\"",[51,701,104],{"style":57},[51,703,704],{"style":75},"\">=22\" ",[51,706,222],{"style":61},[51,708,122],{"style":57},[51,710,711,713,716,718],{"class":53,"style":54},[51,712,98],{"style":57},[51,714,715],{"style":61},"\"options\"",[51,717,104],{"style":57},[51,719,236],{"style":61},[51,721,722],{"class":53,"style":54},[51,723,724],{"style":61},"    {",[51,726,727,729,732,734,737],{"class":53,"style":54},[51,728,423],{"style":61},[51,730,731],{"style":61},"\"key\"",[51,733,104],{"style":57},[51,735,736],{"style":75},"\"prefix\"",[51,738,122],{"style":57},[51,740,741,743,746,748,750,752,754],{"class":53,"style":54},[51,742,423],{"style":57},[51,744,745],{"style":61},"\"path\"",[51,747,104],{"style":57},[51,749,236],{"style":61},[51,751,736],{"style":75},[51,753,248],{"style":61},[51,755,122],{"style":57},[51,757,758,760,763,765,768],{"class":53,"style":54},[51,759,423],{"style":57},[51,761,762],{"style":61},"\"label\"",[51,764,104],{"style":57},[51,766,767],{"style":75},"\"Prefix\"",[51,769,122],{"style":57},[51,771,772,774,776,778,781],{"class":53,"style":54},[51,773,423],{"style":57},[51,775,635],{"style":61},[51,777,104],{"style":57},[51,779,780],{"style":75},"\"Text written at the start of every comment.\"",[51,782,122],{"style":57},[51,784,785,787,789,791],{"class":53,"style":54},[51,786,423],{"style":57},[51,788,304],{"style":61},[51,790,104],{"style":57},[51,792,793],{"style":75},"\"text\"",[51,795,796,798],{"class":53,"style":54},[51,797,111],{"style":75},[51,799,222],{"style":61},[51,801,802],{"class":53,"style":54},[51,803,804],{"style":61},"  ]",[51,806,807],{"class":53,"style":54},[51,808,222],{"style":61},[10,810,811,812,815,816,524,819,822,823,825,826,829],{},"Set ",[14,813,814],{},"name"," to the plugin's ",[14,817,818],{},"meta.name",[14,820,821],{},"export"," to the factory that ",[14,824,44],{}," exports. Add an ",[14,827,828],{},"options"," entry for each option users should edit in Studio.",[10,831,832,833,836,837,840,841,844,845,853,854,858,859,524,862,865],{},"Give ",[14,834,835],{},"meta.compatibility"," in ",[14,838,839],{},"src\u002Fplugin.ts"," the same ranges, ",[14,842,843],{},"{ kubb: '>=5.8.3', node: '>=22' }",", so Kubb checks them at runtime too. With a bundler, ",[19,846,848,849,852],{"href":847},"\u002Fdocs\u002F5.x\u002Freference\u002Fkit\u002Fmanifest#import-compatibility-into-meta","import ",[14,850,851],{},"compatibility"," from the manifest"," instead. ",[19,855,857],{"href":856},"\u002Fdocs\u002F5.x\u002Freference\u002Fkit\u002Fmanifest","Extension manifest"," lists every field, including ",[14,860,861],{},"maintainers",[14,863,864],{},"dependencies",".",[29,867,869],{"id":868},"write-the-docs","Write the docs",[10,871,872,873,876],{},"Create a ",[14,874,875],{},"docs\u002F"," folder next to the manifest. kubb.dev renders it as the extension's page, and Studio shows the overview as its summary:",[41,878,881],{"language":879,"filename":875,"code":880,"class":46},"text","docs\u002F\n├── overview.md        required\n├── options.md         optional\n└── guides\u002F\n    └── \u003Cid>.md        optional, one file per how-to guide",[14,882,884,93,888,93,893,93,898,93,903],{"class":883},"language-text",[51,885,886],{"class":53,"style":54},[51,887,875],{"style":65},[51,889,890],{"class":53,"style":54},[51,891,892],{"style":65},"├── overview.md        required",[51,894,895],{"class":53,"style":54},[51,896,897],{"style":65},"├── options.md         optional",[51,899,900],{"class":53,"style":54},[51,901,902],{"style":65},"└── guides\u002F",[51,904,905],{"class":53,"style":54},[51,906,907],{"style":65},"    └── \u003Cid>.md        optional, one file per how-to guide",[10,909,910,911,914,915,919],{},"Start each file with a ",[14,912,913],{},"#"," title and a one-paragraph description. ",[19,916,918],{"href":917},"\u002Fdocs\u002F5.x\u002Freference\u002Fkit\u002Fextension-docs","Extension docs"," lists the naming rules and the Markdown that renders.",[10,921,922,923,926,927,930],{},"In ",[14,924,925],{},"overview.md",", say what the extension does, how it works when that is not obvious, the setup it needs, and the options and limits worth knowing. Put the full option reference in ",[14,928,929],{},"options.md"," and each task in its own guide.",[10,932,933],{},"Leave out install commands, because the page already shows how to install.",[10,935,936],{},"Keep a README with installation and a Kubb config example, and include a license file.",[29,938,940],{"id":939},"check-the-tarball","Check the tarball",[10,942,943],{},"Build, inspect the files npm would include, and create a local tarball:",[41,945,949],{"language":946,"filename":947,"code":948,"class":46},"shell","Terminal","npm run build\nnpm pack --dry-run\nnpm pack",[14,950,952,93,961,93,968],{"class":951},"language-shell",[51,953,954,958],{"class":53,"style":54},[51,955,957],{"style":956},"color:#6f42c1;--hls-dark:#b392f0","npm ",[51,959,960],{"style":65},"run build",[51,962,963,965],{"class":53,"style":54},[51,964,957],{"style":956},[51,966,967],{"style":65},"pack --dry-run",[51,969,970,972],{"class":53,"style":54},[51,971,957],{"style":956},[51,973,974],{"style":65},"pack",[10,976,977,978,981,982,984,985,987,988,990,991,994],{},"The dry run should list the ",[14,979,980],{},"dist\u002F"," files, ",[14,983,523],{},", the ",[14,986,875],{}," files, and ",[14,989,258],{},", but no fixture, tests, or generated client files. ",[14,992,993],{},"prepack"," runs the build and both tests first.",[29,996,998],{"id":997},"publish-to-npm","Publish to npm",[10,1000,1001],{},"When the tarball looks right and the package name and version are correct, sign in to npm and publish:",[41,1003,1005],{"language":946,"filename":947,"code":1004,"class":46},"npm login\nnpm publish --access public",[14,1006,1007,93,1014],{"class":951},[51,1008,1009,1011],{"class":53,"style":54},[51,1010,957],{"style":956},[51,1012,1013],{"style":65},"login",[51,1015,1016,1018],{"class":53,"style":54},[51,1017,957],{"style":956},[51,1019,1020],{"style":65},"publish --access public",[29,1022,1024],{"id":1023},"submit-to-the-registry","Submit to the registry",[10,1026,1027,1028,1030,1031,1034],{},"Submit the package so users can install it with ",[14,1029,16],{},". ",[19,1032,1024],{"href":1033},"\u002Fdocs\u002F5.x\u002Fhow-to\u002Fsubmit-to-the-registry"," covers the submission issue, the review, how new versions reach users, and publishing from a GitHub release instead of npm.",{"title":1036,"searchDepth":1037,"depth":1037,"links":1038},"",5,[1039,1041,1042,1043,1044,1045],{"id":31,"depth":1040,"text":32},2,{"id":540,"depth":1040,"text":541},{"id":868,"depth":1040,"text":869},{"id":939,"depth":1040,"text":940},{"id":997,"depth":1040,"text":998},{"id":1023,"depth":1040,"text":1024},"Build a Kubb plugin as an npm package with a kubb-extension.json manifest and a docs folder, publish it, and submit it to the Kubb registry.","md",{"layout":1049,"title":5,"description":1046,"outline":1050,"order":1052,"navigation":1053},"doc",[1040,1051],3,7,{"title":5,"icon":1054},"i-iconoir-upload",{"layout":1049,"outline":1056},[1040,1051],{"title":5,"icon":1054},"\u002Fdocs\u002F5.x\u002Fhow-to\u002Fpublish-a-plugin",{"title":5,"description":1046},{"loc":1058},"kubb-labs\u002Fkubb\u002Fdocs\u002F5.x\u002Fhow-to\u002Fpublish-a-plugin.md","docs\u002F5.x\u002Fhow-to\u002Fpublish-a-plugin","_mt38pQxEvoiwvDdwIaHKm677hxQKOaTH90Ue6vjPrw",1793288238691]