diff --git a/.changeset/dry-flies-raise.md b/.changeset/dry-flies-raise.md new file mode 100644 index 000000000..e391a7fb5 --- /dev/null +++ b/.changeset/dry-flies-raise.md @@ -0,0 +1,5 @@ +--- +"openapi-metadata": patch +--- + +Add comments for better documentation and add new exports diff --git a/.changeset/honest-coats-relax.md b/.changeset/honest-coats-relax.md new file mode 100644 index 000000000..a88e9356d --- /dev/null +++ b/.changeset/honest-coats-relax.md @@ -0,0 +1,5 @@ +--- +"openapi-metadata": patch +--- + +Merge properly operations together diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 42177cdb0..8556147d0 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -3,6 +3,8 @@ import en from "./en"; import zh from "./zh"; import ja from "./ja"; import shared from "./shared"; +import { transformerTwoslash } from "@shikijs/vitepress-twoslash"; +import { ModuleKind, ModuleResolutionKind } from "typescript"; // https://vitepress.dev/reference/site-config export default defineConfig({ @@ -12,4 +14,16 @@ export default defineConfig({ zh: { label: "简体中文", ...zh }, ja: { label: "日本語", ...ja }, }, + markdown: { + codeTransformers: [ + transformerTwoslash({ + twoslashOptions: { + compilerOptions: { + experimentalDecorators: true, + moduleResolution: ModuleResolutionKind.Bundler, + }, + }, + }), + ], + }, }); diff --git a/docs/.vitepress/en.ts b/docs/.vitepress/en.ts index 31a6ccaec..6bf392490 100644 --- a/docs/.vitepress/en.ts +++ b/docs/.vitepress/en.ts @@ -102,15 +102,23 @@ export default defineConfig({ }, { text: "openapi-metadata", - base: "/openapi-metadata", items: [ - { text: "Getting Started", link: "/" }, - { text: "Decorators", link: "/decorators" }, - { text: "Metadata", link: "/metadata" }, - { text: "Type loader", link: "/type-loader" }, - { text: "UI Integrations", link: "/ui" }, - { text: "Examples", link: "/examples" }, - { text: "About", link: "/about" }, + { text: "Getting Started", link: "/openapi-metadata" }, + { text: "Decorators", link: "/openapi-metadata/decorators" }, + { text: "Metadata", link: "/openapi-metadata/metadata" }, + { text: "Type loader", link: "/openapi-metadata/type-loader" }, + { text: "UI Integrations", link: "/openapi-metadata/ui" }, + { + text: "Integrations", + items: [ + { + text: "AdonisJS", + link: "https://friendsofadonis.com/docs/openapi", + }, + ], + }, + { text: "Examples", link: "/openapi-metadata/examples" }, + { text: "About", link: "/openapi-metadata/about" }, ], }, ], diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index 1e34476fd..ba8d8c291 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -3,12 +3,15 @@ import type { Theme } from "vitepress"; import DefaultTheme from "vitepress/theme"; import CustomLayout from "./CustomLayout.vue"; import SponsorList from "./SponsorList.vue"; +import TwoslashFloatingVue from "@shikijs/vitepress-twoslash/client"; import "./style.css"; +import "@shikijs/vitepress-twoslash/style.css"; export default { extends: DefaultTheme, Layout: CustomLayout, enhanceApp({ app, router, siteData }) { app.component("SponsorList", SponsorList); + app.use(TwoslashFloatingVue); }, } satisfies Theme; diff --git a/docs/data/contributors.json b/docs/data/contributors.json index dcf6c2953..888df2f7d 100644 --- a/docs/data/contributors.json +++ b/docs/data/contributors.json @@ -1 +1 @@ -{"openapi-typescript":[{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1733108475828},{"username":"psmyrdek","name":"Przemek Smyrdek","avatar":"https://avatars.githubusercontent.com/u/6187417?v=4","links":[{"icon":"github","link":"https://github.com/psmyrdek"}],"lastFetch":1733108475937},{"username":"enmand","name":"Dan Enman","avatar":"https://avatars.githubusercontent.com/u/432487?v=4","links":[{"icon":"github","link":"https://github.com/enmand"}],"lastFetch":1733108476048},{"username":"atlefren","name":"Atle Frenvik Sveen","avatar":"https://avatars.githubusercontent.com/u/1829927?v=4","links":[{"icon":"github","link":"https://github.com/atlefren"}],"lastFetch":1733108476148},{"username":"tpdewolf","name":"Tim de Wolf","avatar":"https://avatars.githubusercontent.com/u/4455209?v=4","links":[{"icon":"github","link":"https://github.com/tpdewolf"}],"lastFetch":1733108476270},{"username":"tombarton","name":"Tom Barton","avatar":"https://avatars.githubusercontent.com/u/6222711?v=4","links":[{"icon":"github","link":"https://github.com/tombarton"}],"lastFetch":1733108476376},{"username":"svnv","name":"Sven Nicolai Viig","avatar":"https://avatars.githubusercontent.com/u/1080888?v=4","links":[{"icon":"github","link":"https://github.com/svnv"}],"lastFetch":1733108476503},{"username":"sorin-davidoi","name":"Sorin Davidoi","avatar":"https://avatars.githubusercontent.com/u/2109702?v=4","links":[{"icon":"github","link":"https://github.com/sorin-davidoi"}],"lastFetch":1733108476621},{"username":"scvnathan","name":"Nathan Schneirov","avatar":"https://avatars.githubusercontent.com/u/73474?v=4","links":[{"icon":"github","link":"https://github.com/scvnathan"}],"lastFetch":1733108476744},{"username":"lbenie","name":"Lucien Bénié","avatar":"https://avatars.githubusercontent.com/u/7316046?v=4","links":[{"icon":"github","link":"https://github.com/lbenie"}],"lastFetch":1733108476850},{"username":"bokub","name":"Boris K","avatar":"https://avatars.githubusercontent.com/u/17952318?v=4","links":[{"icon":"github","link":"https://github.com/bokub"}],"lastFetch":1733108476974},{"username":"antonk52","name":"Anton Kastritskii","avatar":"https://avatars.githubusercontent.com/u/5817809?v=4","links":[{"icon":"github","link":"https://github.com/antonk52"}],"lastFetch":1733108477094},{"username":"tshelburne","name":"Tim Shelburne","avatar":"https://avatars.githubusercontent.com/u/1202267?v=4","links":[{"icon":"github","link":"https://github.com/tshelburne"}],"lastFetch":1733108477206},{"username":"typeofweb","name":"Michał Miszczyszyn","avatar":"https://avatars.githubusercontent.com/u/1338731?v=4","links":[{"icon":"github","link":"https://github.com/typeofweb"}],"lastFetch":1733108477313},{"username":"skh-","name":"Sam K Hall","avatar":"https://avatars.githubusercontent.com/u/1292598?v=4","links":[{"icon":"github","link":"https://github.com/skh-"}],"lastFetch":1733108477432},{"username":"BlooJeans","name":"Matt Jeanes","avatar":"https://avatars.githubusercontent.com/u/1751182?v=4","links":[{"icon":"github","link":"https://github.com/BlooJeans"}],"lastFetch":1733108477548},{"username":"selbekk","name":"Kristofer Giltvedt Selbekk","avatar":"https://avatars.githubusercontent.com/u/1307267?v=4","links":[{"icon":"github","link":"https://github.com/selbekk"}],"lastFetch":1733108477666},{"username":"Mause","name":"Elliana May","avatar":"https://avatars.githubusercontent.com/u/1405026?v=4","links":[{"icon":"github","link":"https://github.com/Mause"}],"lastFetch":1733108477775},{"username":"henhal","name":"Henrik Hall","avatar":"https://avatars.githubusercontent.com/u/9608258?v=4","links":[{"icon":"github","link":"https://github.com/henhal"}],"lastFetch":1733108477913},{"username":"gr2m","name":"Gregor Martynus","avatar":"https://avatars.githubusercontent.com/u/39992?v=4","links":[{"icon":"github","link":"https://github.com/gr2m"}],"lastFetch":1733108478030},{"username":"samdbmg","name":"Sam Mesterton-Gibbons","avatar":"https://avatars.githubusercontent.com/u/408983?v=4","links":[{"icon":"github","link":"https://github.com/samdbmg"}],"lastFetch":1733108478190},{"username":"rendall","name":"Rendall","avatar":"https://avatars.githubusercontent.com/u/293263?v=4","links":[{"icon":"github","link":"https://github.com/rendall"}],"lastFetch":1733108478336},{"username":"robertmassaioli","name":"Robert Massaioli","avatar":"https://avatars.githubusercontent.com/u/149178?v=4","links":[{"icon":"github","link":"https://github.com/robertmassaioli"}],"lastFetch":1733108478446},{"username":"jankuca","name":"Jan Kuča","avatar":"https://avatars.githubusercontent.com/u/367262?v=4","links":[{"icon":"github","link":"https://github.com/jankuca"}],"lastFetch":1733108478567},{"username":"th-m","name":"Thomas Valadez","avatar":"https://avatars.githubusercontent.com/u/13792029?v=4","links":[{"icon":"github","link":"https://github.com/th-m"}],"lastFetch":1733108478698},{"username":"asithade","name":"Asitha de Silva","avatar":"https://avatars.githubusercontent.com/u/3814354?v=4","links":[{"icon":"github","link":"https://github.com/asithade"}],"lastFetch":1733108478814},{"username":"misha-erm","name":"Misha","avatar":"https://avatars.githubusercontent.com/u/8783498?v=4","links":[{"icon":"github","link":"https://github.com/misha-erm"}],"lastFetch":1733108478918},{"username":"radist2s","name":"Alex Batalov","avatar":"https://avatars.githubusercontent.com/u/725645?v=4","links":[{"icon":"github","link":"https://github.com/radist2s"}],"lastFetch":1733108479027},{"username":"FedeBev","name":"Federico Bevione","avatar":"https://avatars.githubusercontent.com/u/22151395?v=4","links":[{"icon":"github","link":"https://github.com/FedeBev"}],"lastFetch":1733108479138},{"username":"yamacent","name":"Daisuke Yamamoto","avatar":"https://avatars.githubusercontent.com/u/8544439?v=4","links":[{"icon":"github","link":"https://github.com/yamacent"}],"lastFetch":1733108479248},{"username":"dnalborczyk","name":null,"avatar":"https://avatars.githubusercontent.com/u/2903325?v=4","links":[{"icon":"github","link":"https://github.com/dnalborczyk"}],"lastFetch":1733108479356},{"username":"FabioWanner","name":null,"avatar":"https://avatars.githubusercontent.com/u/46821078?v=4","links":[{"icon":"github","link":"https://github.com/FabioWanner"}],"lastFetch":1733108479463},{"username":"ashsmith","name":"Ash Smith","avatar":"https://avatars.githubusercontent.com/u/1086841?v=4","links":[{"icon":"github","link":"https://github.com/ashsmith"}],"lastFetch":1733108479568},{"username":"mehalter","name":"Micah Halter","avatar":"https://avatars.githubusercontent.com/u/1591837?v=4","links":[{"icon":"github","link":"https://github.com/mehalter"}],"lastFetch":1733108479671},{"username":"Chrg1001","name":"chrg1001","avatar":"https://avatars.githubusercontent.com/u/40189653?v=4","links":[{"icon":"github","link":"https://github.com/Chrg1001"}],"lastFetch":1733108479785},{"username":"sharmarajdaksh","name":"Dakshraj Sharma","avatar":"https://avatars.githubusercontent.com/u/33689528?v=4","links":[{"icon":"github","link":"https://github.com/sharmarajdaksh"}],"lastFetch":1733108479908},{"username":"shuluster","name":"Shaosu Liu","avatar":"https://avatars.githubusercontent.com/u/1707910?v=4","links":[{"icon":"github","link":"https://github.com/shuluster"}],"lastFetch":1733108480051},{"username":"FDiskas","name":"Vytenis","avatar":"https://avatars.githubusercontent.com/u/468006?v=4","links":[{"icon":"github","link":"https://github.com/FDiskas"}],"lastFetch":1733108480172},{"username":"ericzorn93","name":"Eric Zorn","avatar":"https://avatars.githubusercontent.com/u/22532542?v=4","links":[{"icon":"github","link":"https://github.com/ericzorn93"}],"lastFetch":1733108480288},{"username":"mbelsky","name":"Max Belsky","avatar":"https://avatars.githubusercontent.com/u/3923527?v=4","links":[{"icon":"github","link":"https://github.com/mbelsky"}],"lastFetch":1733108480402},{"username":"techbech","name":"Peter Bech","avatar":"https://avatars.githubusercontent.com/u/1520592?v=4","links":[{"icon":"github","link":"https://github.com/techbech"}],"lastFetch":1733108480520},{"username":"rustyconover","name":"Rusty Conover","avatar":"https://avatars.githubusercontent.com/u/731941?v=4","links":[{"icon":"github","link":"https://github.com/rustyconover"}],"lastFetch":1733108480639},{"username":"bunkscene","name":"Dave Carlson","avatar":"https://avatars.githubusercontent.com/u/2693678?v=4","links":[{"icon":"github","link":"https://github.com/bunkscene"}],"lastFetch":1733108480744},{"username":"ottomated","name":null,"avatar":"https://avatars.githubusercontent.com/u/31470743?v=4","links":[{"icon":"github","link":"https://github.com/ottomated"}],"lastFetch":1733108480856},{"username":"sadfsdfdsa","name":"Artem Shuvaev","avatar":"https://avatars.githubusercontent.com/u/28733669?v=4","links":[{"icon":"github","link":"https://github.com/sadfsdfdsa"}],"lastFetch":1733108480967},{"username":"ajaishankar","name":null,"avatar":"https://avatars.githubusercontent.com/u/328008?v=4","links":[{"icon":"github","link":"https://github.com/ajaishankar"}],"lastFetch":1733108481075},{"username":"dominikdosoudil","name":"Dominik Dosoudil","avatar":"https://avatars.githubusercontent.com/u/15929942?v=4","links":[{"icon":"github","link":"https://github.com/dominikdosoudil"}],"lastFetch":1733108481229},{"username":"kgtkr","name":"kgtkr","avatar":"https://avatars.githubusercontent.com/u/17868838?v=4","links":[{"icon":"github","link":"https://github.com/kgtkr"}],"lastFetch":1733108481363},{"username":"berzi","name":null,"avatar":"https://avatars.githubusercontent.com/u/32619123?v=4","links":[{"icon":"github","link":"https://github.com/berzi"}],"lastFetch":1733108481475},{"username":"PhilipTrauner","name":"philip trauner","avatar":"https://avatars.githubusercontent.com/u/9287847?v=4","links":[{"icon":"github","link":"https://github.com/PhilipTrauner"}],"lastFetch":1733108481590},{"username":"Powell-v2","name":"Pavel Yermolin","avatar":"https://avatars.githubusercontent.com/u/25308326?v=4","links":[{"icon":"github","link":"https://github.com/Powell-v2"}],"lastFetch":1733108481712},{"username":"duncanbeevers","name":"Duncan Beevers","avatar":"https://avatars.githubusercontent.com/u/7367?v=4","links":[{"icon":"github","link":"https://github.com/duncanbeevers"}],"lastFetch":1733108481849},{"username":"tkukushkin","name":"Timofei Kukushkin","avatar":"https://avatars.githubusercontent.com/u/1482516?v=4","links":[{"icon":"github","link":"https://github.com/tkukushkin"}],"lastFetch":1733108481971},{"username":"Semigradsky","name":"Dmitry Semigradsky","avatar":"https://avatars.githubusercontent.com/u/1198848?v=4","links":[{"icon":"github","link":"https://github.com/Semigradsky"}],"lastFetch":1733108482081},{"username":"MrLeebo","name":"Jeremy Liberman","avatar":"https://avatars.githubusercontent.com/u/2754163?v=4","links":[{"icon":"github","link":"https://github.com/MrLeebo"}],"lastFetch":1733108482220},{"username":"axelhzf","name":"Axel Hernández Ferrera","avatar":"https://avatars.githubusercontent.com/u/175627?v=4","links":[{"icon":"github","link":"https://github.com/axelhzf"}],"lastFetch":1733108482343},{"username":"imagoiq","name":"Loïc Fürhoff","avatar":"https://avatars.githubusercontent.com/u/12294151?v=4","links":[{"icon":"github","link":"https://github.com/imagoiq"}],"lastFetch":1733108482458},{"username":"BTMPL","name":"Bartosz Szczeciński","avatar":"https://avatars.githubusercontent.com/u/247153?v=4","links":[{"icon":"github","link":"https://github.com/BTMPL"}],"lastFetch":1733108482567},{"username":"HiiiiD","name":"Marco Salomone","avatar":"https://avatars.githubusercontent.com/u/61231210?v=4","links":[{"icon":"github","link":"https://github.com/HiiiiD"}],"lastFetch":1733108482693},{"username":"yacinehmito","name":"Yacine Hmito","avatar":"https://avatars.githubusercontent.com/u/6893840?v=4","links":[{"icon":"github","link":"https://github.com/yacinehmito"}],"lastFetch":1733108482824},{"username":"sajadtorkamani","name":"Sajad Torkamani","avatar":"https://avatars.githubusercontent.com/u/9380313?v=4","links":[{"icon":"github","link":"https://github.com/sajadtorkamani"}],"lastFetch":1733108482938},{"username":"mvdbeek","name":"Marius van den Beek","avatar":"https://avatars.githubusercontent.com/u/6804901?v=4","links":[{"icon":"github","link":"https://github.com/mvdbeek"}],"lastFetch":1733108483062},{"username":"sgrimm","name":"Steven Grimm","avatar":"https://avatars.githubusercontent.com/u/1248649?v=4","links":[{"icon":"github","link":"https://github.com/sgrimm"}],"lastFetch":1733108483176},{"username":"Swiftwork","name":"Erik Hughes","avatar":"https://avatars.githubusercontent.com/u/455178?v=4","links":[{"icon":"github","link":"https://github.com/Swiftwork"}],"lastFetch":1733108483285},{"username":"mtth","name":"Matthieu Monsch","avatar":"https://avatars.githubusercontent.com/u/1216372?v=4","links":[{"icon":"github","link":"https://github.com/mtth"}],"lastFetch":1733108483406},{"username":"mitchell-merry","name":"Mitchell Merry","avatar":"https://avatars.githubusercontent.com/u/8567231?v=4","links":[{"icon":"github","link":"https://github.com/mitchell-merry"}],"lastFetch":1733108483529},{"username":"qnp","name":"François Risoud","avatar":"https://avatars.githubusercontent.com/u/6012554?v=4","links":[{"icon":"github","link":"https://github.com/qnp"}],"lastFetch":1733108483635},{"username":"shoffmeister","name":null,"avatar":"https://avatars.githubusercontent.com/u/3868036?v=4","links":[{"icon":"github","link":"https://github.com/shoffmeister"}],"lastFetch":1733108483747},{"username":"liangskyli","name":"liangsky","avatar":"https://avatars.githubusercontent.com/u/31531283?v=4","links":[{"icon":"github","link":"https://github.com/liangskyli"}],"lastFetch":1733108483865},{"username":"happycollision","name":"Don Denton","avatar":"https://avatars.githubusercontent.com/u/3663628?v=4","links":[{"icon":"github","link":"https://github.com/happycollision"}],"lastFetch":1733108483978},{"username":"ysmood","name":"Yad Smood","avatar":"https://avatars.githubusercontent.com/u/1415488?v=4","links":[{"icon":"github","link":"https://github.com/ysmood"}],"lastFetch":1733108484096},{"username":"barakalon","name":"barak","avatar":"https://avatars.githubusercontent.com/u/12398927?v=4","links":[{"icon":"github","link":"https://github.com/barakalon"}],"lastFetch":1733108484213},{"username":"horaklukas","name":"Lukáš Horák","avatar":"https://avatars.githubusercontent.com/u/996088?v=4","links":[{"icon":"github","link":"https://github.com/horaklukas"}],"lastFetch":1733108484332},{"username":"pvanagtmaal","name":null,"avatar":"https://avatars.githubusercontent.com/u/5946464?v=4","links":[{"icon":"github","link":"https://github.com/pvanagtmaal"}],"lastFetch":1733108484459},{"username":"toomuchdesign","name":"Andrea Carraro","avatar":"https://avatars.githubusercontent.com/u/4573549?v=4","links":[{"icon":"github","link":"https://github.com/toomuchdesign"}],"lastFetch":1733108484570},{"username":"psychedelicious","name":"psychedelicious","avatar":"https://avatars.githubusercontent.com/u/4822129?v=4","links":[{"icon":"github","link":"https://github.com/psychedelicious"}],"lastFetch":1733108484780},{"username":"tkrotoff","name":"Tanguy Krotoff","avatar":"https://avatars.githubusercontent.com/u/643434?v=4","links":[{"icon":"github","link":"https://github.com/tkrotoff"}],"lastFetch":1733108484896},{"username":"pimveldhuisen","name":"Pim Veldhuisen","avatar":"https://avatars.githubusercontent.com/u/3043834?v=4","links":[{"icon":"github","link":"https://github.com/pimveldhuisen"}],"lastFetch":1733108485025},{"username":"asvishnyakov","name":"Aleksandr Vishniakov","avatar":"https://avatars.githubusercontent.com/u/6369252?v=4","links":[{"icon":"github","link":"https://github.com/asvishnyakov"}],"lastFetch":1733108485194},{"username":"SchabaJo","name":null,"avatar":"https://avatars.githubusercontent.com/u/138689813?v=4","links":[{"icon":"github","link":"https://github.com/SchabaJo"}],"lastFetch":1733108485336},{"username":"AhsanFazal","name":"Ahsan Fazal","avatar":"https://avatars.githubusercontent.com/u/7458046?v=4","links":[{"icon":"github","link":"https://github.com/AhsanFazal"}],"lastFetch":1733108485463},{"username":"ElForastero","name":"Eugene Dzhumak","avatar":"https://avatars.githubusercontent.com/u/5102818?v=4","links":[{"icon":"github","link":"https://github.com/ElForastero"}],"lastFetch":1733108485587},{"username":"msgadi","name":"Mohammed Gadi","avatar":"https://avatars.githubusercontent.com/u/9037086?v=4","links":[{"icon":"github","link":"https://github.com/msgadi"}],"lastFetch":1733108485702},{"username":"muttonchop","name":"Adam K","avatar":"https://avatars.githubusercontent.com/u/1037657?v=4","links":[{"icon":"github","link":"https://github.com/muttonchop"}],"lastFetch":1733108485834},{"username":"christoph-fricke","name":"Christoph Fricke","avatar":"https://avatars.githubusercontent.com/u/23103835?v=4","links":[{"icon":"github","link":"https://github.com/christoph-fricke"}],"lastFetch":1733108485953},{"username":"JorrinKievit","name":"Jorrin","avatar":"https://avatars.githubusercontent.com/u/43169049?v=4","links":[{"icon":"github","link":"https://github.com/JorrinKievit"}],"lastFetch":1733108486078},{"username":"WickyNilliams","name":"Nick Williams","avatar":"https://avatars.githubusercontent.com/u/1091390?v=4","links":[{"icon":"github","link":"https://github.com/WickyNilliams"}],"lastFetch":1733108486208},{"username":"hrsh7th","name":"hrsh7th","avatar":"https://avatars.githubusercontent.com/u/629908?v=4","links":[{"icon":"github","link":"https://github.com/hrsh7th"}],"lastFetch":1733108486324},{"username":"davidleger95","name":"David Leger","avatar":"https://avatars.githubusercontent.com/u/10498708?v=4","links":[{"icon":"github","link":"https://github.com/davidleger95"}],"lastFetch":1729913934448},{"username":"phk422","name":"Hongkun","avatar":"https://avatars.githubusercontent.com/u/59734322?v=4","links":[{"icon":"github","link":"https://github.com/phk422"}],"lastFetch":1733108486445},{"username":"mzronek","name":"Matthias Zronek","avatar":"https://avatars.githubusercontent.com/u/3847700?v=4","links":[{"icon":"github","link":"https://github.com/mzronek"}],"lastFetch":1733108486565},{"username":"raurfang","name":"Łukasz Wiśniewski","avatar":"https://avatars.githubusercontent.com/u/867241?v=4","links":[{"icon":"github","link":"https://github.com/raurfang"}],"lastFetch":1733108486673},{"username":"JeanRemiDelteil","name":"Jean-Rémi Delteil","avatar":"https://avatars.githubusercontent.com/u/9743907?v=4","links":[{"icon":"github","link":"https://github.com/JeanRemiDelteil"}],"lastFetch":1733108486776},{"username":"TzviPM","name":"Tzvi Melamed","avatar":"https://avatars.githubusercontent.com/u/1950680?v=4","links":[{"icon":"github","link":"https://github.com/TzviPM"}],"lastFetch":1733108486900},{"username":"LucaSchwan","name":"ehrenschwan","avatar":"https://avatars.githubusercontent.com/u/25820532?v=4","links":[{"icon":"github","link":"https://github.com/LucaSchwan"}],"lastFetch":1733108487011},{"username":"nzapponi","name":"Niccolo Zapponi","avatar":"https://avatars.githubusercontent.com/u/20582065?v=4","links":[{"icon":"github","link":"https://github.com/nzapponi"}],"lastFetch":1733108487118},{"username":"luchsamapparat","name":"Marvin Luchs","avatar":"https://avatars.githubusercontent.com/u/875017?v=4","links":[{"icon":"github","link":"https://github.com/luchsamapparat"}],"lastFetch":1733108487257},{"username":"nmacmunn","name":"Neil MacMunn","avatar":"https://avatars.githubusercontent.com/u/849964?v=4","links":[{"icon":"github","link":"https://github.com/nmacmunn"}],"lastFetch":1733108487370}],"openapi-fetch":[{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1733108475833},{"username":"fergusean","name":null,"avatar":"https://avatars.githubusercontent.com/u/1029297?v=4","links":[{"icon":"github","link":"https://github.com/fergusean"}],"lastFetch":1733108475979},{"username":"shinzui","name":"Nadeem Bitar","avatar":"https://avatars.githubusercontent.com/u/519?v=4","links":[{"icon":"github","link":"https://github.com/shinzui"}],"lastFetch":1733108476125},{"username":"ezpuzz","name":"Emory Petermann","avatar":"https://avatars.githubusercontent.com/u/672182?v=4","links":[{"icon":"github","link":"https://github.com/ezpuzz"}],"lastFetch":1733108476234},{"username":"KotoriK","name":null,"avatar":"https://avatars.githubusercontent.com/u/52659125?v=4","links":[{"icon":"github","link":"https://github.com/KotoriK"}],"lastFetch":1733108476341},{"username":"fletchertyler914","name":"Tyler Fletcher","avatar":"https://avatars.githubusercontent.com/u/3344498?v=4","links":[{"icon":"github","link":"https://github.com/fletchertyler914"}],"lastFetch":1733108476448},{"username":"nholik","name":"Nicklos Holik","avatar":"https://avatars.githubusercontent.com/u/2022214?v=4","links":[{"icon":"github","link":"https://github.com/nholik"}],"lastFetch":1733108476566},{"username":"roj1512","name":null,"avatar":"https://avatars.githubusercontent.com/u/175297870?v=4","links":[{"icon":"github","link":"https://github.com/roj1512"}],"lastFetch":1733108476669},{"username":"nickcaballero","name":"Nick Caballero","avatar":"https://avatars.githubusercontent.com/u/355976?v=4","links":[{"icon":"github","link":"https://github.com/nickcaballero"}],"lastFetch":1733108476807},{"username":"hd-o","name":"Hadrian de Oliveira","avatar":"https://avatars.githubusercontent.com/u/58871222?v=4","links":[{"icon":"github","link":"https://github.com/hd-o"}],"lastFetch":1733108476922},{"username":"kecrily","name":"Percy Ma","avatar":"https://avatars.githubusercontent.com/u/45708948?v=4","links":[{"icon":"github","link":"https://github.com/kecrily"}],"lastFetch":1733108477037},{"username":"psychedelicious","name":"psychedelicious","avatar":"https://avatars.githubusercontent.com/u/4822129?v=4","links":[{"icon":"github","link":"https://github.com/psychedelicious"}],"lastFetch":1733108477170},{"username":"muttonchop","name":"Adam K","avatar":"https://avatars.githubusercontent.com/u/1037657?v=4","links":[{"icon":"github","link":"https://github.com/muttonchop"}],"lastFetch":1733108477285},{"username":"marcomuser","name":"Marco Muser","avatar":"https://avatars.githubusercontent.com/u/64737396?v=4","links":[{"icon":"github","link":"https://github.com/marcomuser"}],"lastFetch":1733108477399},{"username":"HugeLetters","name":"Evgenii Perminov","avatar":"https://avatars.githubusercontent.com/u/119697239?v=4","links":[{"icon":"github","link":"https://github.com/HugeLetters"}],"lastFetch":1733108477521},{"username":"Fumaz","name":"alex","avatar":"https://avatars.githubusercontent.com/u/45318608?v=4","links":[{"icon":"github","link":"https://github.com/Fumaz"}],"lastFetch":1733108477631},{"username":"darwish","name":"Mike Darwish","avatar":"https://avatars.githubusercontent.com/u/292570?v=4","links":[{"icon":"github","link":"https://github.com/darwish"}],"lastFetch":1733108477739},{"username":"kaechele","name":"Felix Kaechele","avatar":"https://avatars.githubusercontent.com/u/454490?v=4","links":[{"icon":"github","link":"https://github.com/kaechele"}],"lastFetch":1733108477862},{"username":"phk422","name":"Hongkun","avatar":"https://avatars.githubusercontent.com/u/59734322?v=4","links":[{"icon":"github","link":"https://github.com/phk422"}],"lastFetch":1733108477988},{"username":"mikestopcontinues","name":"Mike Stop Continues","avatar":"https://avatars.githubusercontent.com/u/150434?v=4","links":[{"icon":"github","link":"https://github.com/mikestopcontinues"}],"lastFetch":1733108478104},{"username":"JE-Lee","name":"maurice","avatar":"https://avatars.githubusercontent.com/u/19794813?v=4","links":[{"icon":"github","link":"https://github.com/JE-Lee"}],"lastFetch":1733108478207},{"username":"vipentti","name":"Ville Penttinen","avatar":"https://avatars.githubusercontent.com/u/4726680?v=4","links":[{"icon":"github","link":"https://github.com/vipentti"}],"lastFetch":1733108478314},{"username":"armandabric","name":"Armand Abric","avatar":"https://avatars.githubusercontent.com/u/95120?v=4","links":[{"icon":"github","link":"https://github.com/armandabric"}],"lastFetch":1733108478448},{"username":"illright","name":"Lev Chelyadinov","avatar":"https://avatars.githubusercontent.com/u/15035286?v=4","links":[{"icon":"github","link":"https://github.com/illright"}],"lastFetch":1733108478561}],"openapi-react-query":[{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1733108475836},{"username":"kerwanp","name":"Martin Paucot","avatar":"https://avatars.githubusercontent.com/u/36955373?v=4","links":[{"icon":"github","link":"https://github.com/kerwanp"}],"lastFetch":1733108475960},{"username":"yoshi2no","name":"yoshi2no","avatar":"https://avatars.githubusercontent.com/u/57059705?v=4","links":[{"icon":"github","link":"https://github.com/yoshi2no"}],"lastFetch":1733108476080},{"username":"elaygelbart","name":"Elay Gelbart","avatar":"https://avatars.githubusercontent.com/u/88675154?v=4","links":[{"icon":"github","link":"https://github.com/elaygelbart"}],"lastFetch":1730904973287},{"username":"HugeLetters","name":"Evgenii Perminov","avatar":"https://avatars.githubusercontent.com/u/119697239?v=4","links":[{"icon":"github","link":"https://github.com/HugeLetters"}],"lastFetch":1733108476202}],"swr-openapi":[{"username":"htunnicliff","name":"Hunter Tunnicliff","avatar":"https://avatars.githubusercontent.com/u/7614039?v=4","links":[{"icon":"github","link":"https://github.com/htunnicliff"}],"lastFetch":1733108475840}],"openapi-metadata":[{"username":"kerwanp","name":"Martin Paucot","avatar":"https://avatars.githubusercontent.com/u/36955373?v=4","links":[{"icon":"github","link":"https://github.com/kerwanp"}],"lastFetch":1733108475838},{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1733108475974}]} \ No newline at end of file +{"openapi-typescript":[{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1734600070672},{"username":"psmyrdek","name":"Przemek Smyrdek","avatar":"https://avatars.githubusercontent.com/u/6187417?v=4","links":[{"icon":"github","link":"https://github.com/psmyrdek"}],"lastFetch":1734600070854},{"username":"enmand","name":"Dan Enman","avatar":"https://avatars.githubusercontent.com/u/432487?v=4","links":[{"icon":"github","link":"https://github.com/enmand"}],"lastFetch":1734600071027},{"username":"atlefren","name":"Atle Frenvik Sveen","avatar":"https://avatars.githubusercontent.com/u/1829927?v=4","links":[{"icon":"github","link":"https://github.com/atlefren"}],"lastFetch":1734600071202},{"username":"tpdewolf","name":"Tim de Wolf","avatar":"https://avatars.githubusercontent.com/u/4455209?v=4","links":[{"icon":"github","link":"https://github.com/tpdewolf"}],"lastFetch":1734600071368},{"username":"tombarton","name":"Tom Barton","avatar":"https://avatars.githubusercontent.com/u/6222711?v=4","links":[{"icon":"github","link":"https://github.com/tombarton"}],"lastFetch":1734600071556},{"username":"svnv","name":"Sven Nicolai Viig","avatar":"https://avatars.githubusercontent.com/u/1080888?v=4","links":[{"icon":"github","link":"https://github.com/svnv"}],"lastFetch":1734600071729},{"username":"sorin-davidoi","name":"Sorin Davidoi","avatar":"https://avatars.githubusercontent.com/u/2109702?v=4","links":[{"icon":"github","link":"https://github.com/sorin-davidoi"}],"lastFetch":1734600071904},{"username":"scvnathan","name":"Nathan Schneirov","avatar":"https://avatars.githubusercontent.com/u/73474?v=4","links":[{"icon":"github","link":"https://github.com/scvnathan"}],"lastFetch":1734600072080},{"username":"lbenie","name":"Lucien Bénié","avatar":"https://avatars.githubusercontent.com/u/7316046?v=4","links":[{"icon":"github","link":"https://github.com/lbenie"}],"lastFetch":1734600072254},{"username":"bokub","name":"Boris","avatar":"https://avatars.githubusercontent.com/u/17952318?v=4","links":[{"icon":"github","link":"https://github.com/bokub"}],"lastFetch":1734600072427},{"username":"antonk52","name":"Anton Kastritskii","avatar":"https://avatars.githubusercontent.com/u/5817809?v=4","links":[{"icon":"github","link":"https://github.com/antonk52"}],"lastFetch":1734600072590},{"username":"tshelburne","name":"Tim Shelburne","avatar":"https://avatars.githubusercontent.com/u/1202267?v=4","links":[{"icon":"github","link":"https://github.com/tshelburne"}],"lastFetch":1734600072769},{"username":"typeofweb","name":"Michał Miszczyszyn","avatar":"https://avatars.githubusercontent.com/u/1338731?v=4","links":[{"icon":"github","link":"https://github.com/typeofweb"}],"lastFetch":1734600072966},{"username":"skh-","name":"Sam K Hall","avatar":"https://avatars.githubusercontent.com/u/1292598?v=4","links":[{"icon":"github","link":"https://github.com/skh-"}],"lastFetch":1734600073150},{"username":"BlooJeans","name":"Matt Jeanes","avatar":"https://avatars.githubusercontent.com/u/1751182?v=4","links":[{"icon":"github","link":"https://github.com/BlooJeans"}],"lastFetch":1734600073307},{"username":"selbekk","name":"Kristofer Giltvedt Selbekk","avatar":"https://avatars.githubusercontent.com/u/1307267?v=4","links":[{"icon":"github","link":"https://github.com/selbekk"}],"lastFetch":1734600073484},{"username":"Mause","name":"Elliana May","avatar":"https://avatars.githubusercontent.com/u/1405026?v=4","links":[{"icon":"github","link":"https://github.com/Mause"}],"lastFetch":1734600073641},{"username":"henhal","name":"Henrik Hall","avatar":"https://avatars.githubusercontent.com/u/9608258?v=4","links":[{"icon":"github","link":"https://github.com/henhal"}],"lastFetch":1734600073859},{"username":"gr2m","name":"Gregor Martynus","avatar":"https://avatars.githubusercontent.com/u/39992?v=4","links":[{"icon":"github","link":"https://github.com/gr2m"}],"lastFetch":1734600074035},{"username":"samdbmg","name":"Sam Mesterton-Gibbons","avatar":"https://avatars.githubusercontent.com/u/408983?v=4","links":[{"icon":"github","link":"https://github.com/samdbmg"}],"lastFetch":1734600074211},{"username":"rendall","name":"Rendall","avatar":"https://avatars.githubusercontent.com/u/293263?v=4","links":[{"icon":"github","link":"https://github.com/rendall"}],"lastFetch":1734600074396},{"username":"robertmassaioli","name":"Robert Massaioli","avatar":"https://avatars.githubusercontent.com/u/149178?v=4","links":[{"icon":"github","link":"https://github.com/robertmassaioli"}],"lastFetch":1734600074580},{"username":"jankuca","name":"Jan Kuča","avatar":"https://avatars.githubusercontent.com/u/367262?v=4","links":[{"icon":"github","link":"https://github.com/jankuca"}],"lastFetch":1734600074748},{"username":"th-m","name":"Thomas Valadez","avatar":"https://avatars.githubusercontent.com/u/13792029?v=4","links":[{"icon":"github","link":"https://github.com/th-m"}],"lastFetch":1734600075008},{"username":"asithade","name":"Asitha de Silva","avatar":"https://avatars.githubusercontent.com/u/3814354?v=4","links":[{"icon":"github","link":"https://github.com/asithade"}],"lastFetch":1734600075177},{"username":"misha-erm","name":"Misha","avatar":"https://avatars.githubusercontent.com/u/8783498?v=4","links":[{"icon":"github","link":"https://github.com/misha-erm"}],"lastFetch":1734600075382},{"username":"radist2s","name":"Alex Batalov","avatar":"https://avatars.githubusercontent.com/u/725645?v=4","links":[{"icon":"github","link":"https://github.com/radist2s"}],"lastFetch":1734600075582},{"username":"FedeBev","name":"Federico Bevione","avatar":"https://avatars.githubusercontent.com/u/22151395?v=4","links":[{"icon":"github","link":"https://github.com/FedeBev"}],"lastFetch":1734600075756},{"username":"yamacent","name":"Daisuke Yamamoto","avatar":"https://avatars.githubusercontent.com/u/8544439?v=4","links":[{"icon":"github","link":"https://github.com/yamacent"}],"lastFetch":1734600075933},{"username":"dnalborczyk","name":null,"avatar":"https://avatars.githubusercontent.com/u/2903325?v=4","links":[{"icon":"github","link":"https://github.com/dnalborczyk"}],"lastFetch":1734600076097},{"username":"FabioWanner","name":null,"avatar":"https://avatars.githubusercontent.com/u/46821078?v=4","links":[{"icon":"github","link":"https://github.com/FabioWanner"}],"lastFetch":1734600076267},{"username":"ashsmith","name":"Ash Smith","avatar":"https://avatars.githubusercontent.com/u/1086841?v=4","links":[{"icon":"github","link":"https://github.com/ashsmith"}],"lastFetch":1734600076462},{"username":"mehalter","name":"Micah Halter","avatar":"https://avatars.githubusercontent.com/u/1591837?v=4","links":[{"icon":"github","link":"https://github.com/mehalter"}],"lastFetch":1734600076646},{"username":"Chrg1001","name":"chrg1001","avatar":"https://avatars.githubusercontent.com/u/40189653?v=4","links":[{"icon":"github","link":"https://github.com/Chrg1001"}],"lastFetch":1734600076838},{"username":"sharmarajdaksh","name":"Dakshraj Sharma","avatar":"https://avatars.githubusercontent.com/u/33689528?v=4","links":[{"icon":"github","link":"https://github.com/sharmarajdaksh"}],"lastFetch":1734600076995},{"username":"shuluster","name":"Shaosu Liu","avatar":"https://avatars.githubusercontent.com/u/1707910?v=4","links":[{"icon":"github","link":"https://github.com/shuluster"}],"lastFetch":1734600077160},{"username":"FDiskas","name":"Vytenis","avatar":"https://avatars.githubusercontent.com/u/468006?v=4","links":[{"icon":"github","link":"https://github.com/FDiskas"}],"lastFetch":1734600077322},{"username":"ericzorn93","name":"Eric Zorn","avatar":"https://avatars.githubusercontent.com/u/22532542?v=4","links":[{"icon":"github","link":"https://github.com/ericzorn93"}],"lastFetch":1734600077512},{"username":"mbelsky","name":"Max Belsky","avatar":"https://avatars.githubusercontent.com/u/3923527?v=4","links":[{"icon":"github","link":"https://github.com/mbelsky"}],"lastFetch":1734600077682},{"username":"techbech","name":"Peter Bech","avatar":"https://avatars.githubusercontent.com/u/1520592?v=4","links":[{"icon":"github","link":"https://github.com/techbech"}],"lastFetch":1734600077855},{"username":"rustyconover","name":"Rusty Conover","avatar":"https://avatars.githubusercontent.com/u/731941?v=4","links":[{"icon":"github","link":"https://github.com/rustyconover"}],"lastFetch":1734600078032},{"username":"bunkscene","name":"Dave Carlson","avatar":"https://avatars.githubusercontent.com/u/2693678?v=4","links":[{"icon":"github","link":"https://github.com/bunkscene"}],"lastFetch":1734600078206},{"username":"ottomated","name":null,"avatar":"https://avatars.githubusercontent.com/u/31470743?v=4","links":[{"icon":"github","link":"https://github.com/ottomated"}],"lastFetch":1734600078401},{"username":"sadfsdfdsa","name":"Artem Shuvaev","avatar":"https://avatars.githubusercontent.com/u/28733669?v=4","links":[{"icon":"github","link":"https://github.com/sadfsdfdsa"}],"lastFetch":1734600078574},{"username":"ajaishankar","name":null,"avatar":"https://avatars.githubusercontent.com/u/328008?v=4","links":[{"icon":"github","link":"https://github.com/ajaishankar"}],"lastFetch":1734600078730},{"username":"dominikdosoudil","name":"Dominik Dosoudil","avatar":"https://avatars.githubusercontent.com/u/15929942?v=4","links":[{"icon":"github","link":"https://github.com/dominikdosoudil"}],"lastFetch":1734600078910},{"username":"kgtkr","name":"kgtkr","avatar":"https://avatars.githubusercontent.com/u/17868838?v=4","links":[{"icon":"github","link":"https://github.com/kgtkr"}],"lastFetch":1734600079118},{"username":"berzi","name":null,"avatar":"https://avatars.githubusercontent.com/u/32619123?v=4","links":[{"icon":"github","link":"https://github.com/berzi"}],"lastFetch":1734600079290},{"username":"PhilipTrauner","name":"philip trauner","avatar":"https://avatars.githubusercontent.com/u/9287847?v=4","links":[{"icon":"github","link":"https://github.com/PhilipTrauner"}],"lastFetch":1734600079441},{"username":"Powell-v2","name":"Pavel Yermolin","avatar":"https://avatars.githubusercontent.com/u/25308326?v=4","links":[{"icon":"github","link":"https://github.com/Powell-v2"}],"lastFetch":1734600079634},{"username":"duncanbeevers","name":"Duncan Beevers","avatar":"https://avatars.githubusercontent.com/u/7367?v=4","links":[{"icon":"github","link":"https://github.com/duncanbeevers"}],"lastFetch":1734600079807},{"username":"tkukushkin","name":"Timofei Kukushkin","avatar":"https://avatars.githubusercontent.com/u/1482516?v=4","links":[{"icon":"github","link":"https://github.com/tkukushkin"}],"lastFetch":1734600080026},{"username":"Semigradsky","name":"Dmitry Semigradsky","avatar":"https://avatars.githubusercontent.com/u/1198848?v=4","links":[{"icon":"github","link":"https://github.com/Semigradsky"}],"lastFetch":1734600080223},{"username":"MrLeebo","name":"Jeremy Liberman","avatar":"https://avatars.githubusercontent.com/u/2754163?v=4","links":[{"icon":"github","link":"https://github.com/MrLeebo"}],"lastFetch":1734600080389},{"username":"axelhzf","name":"Axel Hernández Ferrera","avatar":"https://avatars.githubusercontent.com/u/175627?v=4","links":[{"icon":"github","link":"https://github.com/axelhzf"}],"lastFetch":1734600080552},{"username":"imagoiq","name":"Loïc Fürhoff","avatar":"https://avatars.githubusercontent.com/u/12294151?v=4","links":[{"icon":"github","link":"https://github.com/imagoiq"}],"lastFetch":1734600080731},{"username":"BTMPL","name":"Bartosz Szczeciński","avatar":"https://avatars.githubusercontent.com/u/247153?v=4","links":[{"icon":"github","link":"https://github.com/BTMPL"}],"lastFetch":1734600080902},{"username":"HiiiiD","name":"Marco Salomone","avatar":"https://avatars.githubusercontent.com/u/61231210?v=4","links":[{"icon":"github","link":"https://github.com/HiiiiD"}],"lastFetch":1734600081069},{"username":"yacinehmito","name":"Yacine Hmito","avatar":"https://avatars.githubusercontent.com/u/6893840?v=4","links":[{"icon":"github","link":"https://github.com/yacinehmito"}],"lastFetch":1734600081246},{"username":"sajadtorkamani","name":"Sajad Torkamani","avatar":"https://avatars.githubusercontent.com/u/9380313?v=4","links":[{"icon":"github","link":"https://github.com/sajadtorkamani"}],"lastFetch":1734600081444},{"username":"mvdbeek","name":"Marius van den Beek","avatar":"https://avatars.githubusercontent.com/u/6804901?v=4","links":[{"icon":"github","link":"https://github.com/mvdbeek"}],"lastFetch":1734600081613},{"username":"sgrimm","name":"Steven Grimm","avatar":"https://avatars.githubusercontent.com/u/1248649?v=4","links":[{"icon":"github","link":"https://github.com/sgrimm"}],"lastFetch":1734600081779},{"username":"Swiftwork","name":"Erik Hughes","avatar":"https://avatars.githubusercontent.com/u/455178?v=4","links":[{"icon":"github","link":"https://github.com/Swiftwork"}],"lastFetch":1734600081949},{"username":"mtth","name":"Matthieu Monsch","avatar":"https://avatars.githubusercontent.com/u/1216372?v=4","links":[{"icon":"github","link":"https://github.com/mtth"}],"lastFetch":1734600082114},{"username":"mitchell-merry","name":"Mitchell Merry","avatar":"https://avatars.githubusercontent.com/u/8567231?v=4","links":[{"icon":"github","link":"https://github.com/mitchell-merry"}],"lastFetch":1734600082294},{"username":"qnp","name":"François Risoud","avatar":"https://avatars.githubusercontent.com/u/6012554?v=4","links":[{"icon":"github","link":"https://github.com/qnp"}],"lastFetch":1734600082459},{"username":"shoffmeister","name":null,"avatar":"https://avatars.githubusercontent.com/u/3868036?v=4","links":[{"icon":"github","link":"https://github.com/shoffmeister"}],"lastFetch":1734600082612},{"username":"liangskyli","name":"liangsky","avatar":"https://avatars.githubusercontent.com/u/31531283?v=4","links":[{"icon":"github","link":"https://github.com/liangskyli"}],"lastFetch":1734600082778},{"username":"happycollision","name":"Don Denton","avatar":"https://avatars.githubusercontent.com/u/3663628?v=4","links":[{"icon":"github","link":"https://github.com/happycollision"}],"lastFetch":1734600082973},{"username":"ysmood","name":"Yad Smood","avatar":"https://avatars.githubusercontent.com/u/1415488?v=4","links":[{"icon":"github","link":"https://github.com/ysmood"}],"lastFetch":1734600083134},{"username":"barakalon","name":"barak","avatar":"https://avatars.githubusercontent.com/u/12398927?v=4","links":[{"icon":"github","link":"https://github.com/barakalon"}],"lastFetch":1734600083324},{"username":"horaklukas","name":"Lukáš Horák","avatar":"https://avatars.githubusercontent.com/u/996088?v=4","links":[{"icon":"github","link":"https://github.com/horaklukas"}],"lastFetch":1734600083485},{"username":"pvanagtmaal","name":null,"avatar":"https://avatars.githubusercontent.com/u/5946464?v=4","links":[{"icon":"github","link":"https://github.com/pvanagtmaal"}],"lastFetch":1734600083660},{"username":"toomuchdesign","name":"Andrea Carraro","avatar":"https://avatars.githubusercontent.com/u/4573549?v=4","links":[{"icon":"github","link":"https://github.com/toomuchdesign"}],"lastFetch":1734600083824},{"username":"psychedelicious","name":"psychedelicious","avatar":"https://avatars.githubusercontent.com/u/4822129?v=4","links":[{"icon":"github","link":"https://github.com/psychedelicious"}],"lastFetch":1734600084026},{"username":"tkrotoff","name":"Tanguy Krotoff","avatar":"https://avatars.githubusercontent.com/u/643434?v=4","links":[{"icon":"github","link":"https://github.com/tkrotoff"}],"lastFetch":1734600084213},{"username":"pimveldhuisen","name":"Pim Veldhuisen","avatar":"https://avatars.githubusercontent.com/u/3043834?v=4","links":[{"icon":"github","link":"https://github.com/pimveldhuisen"}],"lastFetch":1734600084370},{"username":"asvishnyakov","name":"Aleksandr Vishniakov","avatar":"https://avatars.githubusercontent.com/u/6369252?v=4","links":[{"icon":"github","link":"https://github.com/asvishnyakov"}],"lastFetch":1734600084545},{"username":"SchabaJo","name":null,"avatar":"https://avatars.githubusercontent.com/u/138689813?v=4","links":[{"icon":"github","link":"https://github.com/SchabaJo"}],"lastFetch":1734600084720},{"username":"AhsanFazal","name":"Ahsan Fazal","avatar":"https://avatars.githubusercontent.com/u/7458046?v=4","links":[{"icon":"github","link":"https://github.com/AhsanFazal"}],"lastFetch":1734600084892},{"username":"ElForastero","name":"Eugene Dzhumak","avatar":"https://avatars.githubusercontent.com/u/5102818?v=4","links":[{"icon":"github","link":"https://github.com/ElForastero"}],"lastFetch":1734600085046},{"username":"msgadi","name":"Mohammed Gadi","avatar":"https://avatars.githubusercontent.com/u/9037086?v=4","links":[{"icon":"github","link":"https://github.com/msgadi"}],"lastFetch":1734600085216},{"username":"muttonchop","name":"Adam K","avatar":"https://avatars.githubusercontent.com/u/1037657?v=4","links":[{"icon":"github","link":"https://github.com/muttonchop"}],"lastFetch":1734600085383},{"username":"christoph-fricke","name":"Christoph Fricke","avatar":"https://avatars.githubusercontent.com/u/23103835?v=4","links":[{"icon":"github","link":"https://github.com/christoph-fricke"}],"lastFetch":1734600085553},{"username":"JorrinKievit","name":"Jorrin","avatar":"https://avatars.githubusercontent.com/u/43169049?v=4","links":[{"icon":"github","link":"https://github.com/JorrinKievit"}],"lastFetch":1734600085722},{"username":"WickyNilliams","name":"Nick Williams","avatar":"https://avatars.githubusercontent.com/u/1091390?v=4","links":[{"icon":"github","link":"https://github.com/WickyNilliams"}],"lastFetch":1734600085919},{"username":"hrsh7th","name":"hrsh7th","avatar":"https://avatars.githubusercontent.com/u/629908?v=4","links":[{"icon":"github","link":"https://github.com/hrsh7th"}],"lastFetch":1734600086085},{"username":"davidleger95","name":"David Leger","avatar":"https://avatars.githubusercontent.com/u/10498708?v=4","links":[{"icon":"github","link":"https://github.com/davidleger95"}],"lastFetch":1729913934448},{"username":"phk422","name":"Hongkun","avatar":"https://avatars.githubusercontent.com/u/59734322?v=4","links":[{"icon":"github","link":"https://github.com/phk422"}],"lastFetch":1734600086253},{"username":"mzronek","name":"Matthias Zronek","avatar":"https://avatars.githubusercontent.com/u/3847700?v=4","links":[{"icon":"github","link":"https://github.com/mzronek"}],"lastFetch":1734600086428},{"username":"raurfang","name":"Łukasz Wiśniewski","avatar":"https://avatars.githubusercontent.com/u/867241?v=4","links":[{"icon":"github","link":"https://github.com/raurfang"}],"lastFetch":1734600086587},{"username":"JeanRemiDelteil","name":"Jean-Rémi Delteil","avatar":"https://avatars.githubusercontent.com/u/9743907?v=4","links":[{"icon":"github","link":"https://github.com/JeanRemiDelteil"}],"lastFetch":1734600086799},{"username":"TzviPM","name":"Tzvi Melamed","avatar":"https://avatars.githubusercontent.com/u/1950680?v=4","links":[{"icon":"github","link":"https://github.com/TzviPM"}],"lastFetch":1734600086987},{"username":"LucaSchwan","name":"ehrenschwan","avatar":"https://avatars.githubusercontent.com/u/25820532?v=4","links":[{"icon":"github","link":"https://github.com/LucaSchwan"}],"lastFetch":1734600087163},{"username":"nzapponi","name":"Niccolo Zapponi","avatar":"https://avatars.githubusercontent.com/u/20582065?v=4","links":[{"icon":"github","link":"https://github.com/nzapponi"}],"lastFetch":1734600087335},{"username":"luchsamapparat","name":"Marvin Luchs","avatar":"https://avatars.githubusercontent.com/u/875017?v=4","links":[{"icon":"github","link":"https://github.com/luchsamapparat"}],"lastFetch":1734600087527},{"username":"nmacmunn","name":"Neil MacMunn","avatar":"https://avatars.githubusercontent.com/u/849964?v=4","links":[{"icon":"github","link":"https://github.com/nmacmunn"}],"lastFetch":1734600087756}],"openapi-fetch":[{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1734600070626},{"username":"fergusean","name":null,"avatar":"https://avatars.githubusercontent.com/u/1029297?v=4","links":[{"icon":"github","link":"https://github.com/fergusean"}],"lastFetch":1734600070821},{"username":"shinzui","name":"Nadeem Bitar","avatar":"https://avatars.githubusercontent.com/u/519?v=4","links":[{"icon":"github","link":"https://github.com/shinzui"}],"lastFetch":1734600071000},{"username":"ezpuzz","name":"Emory Petermann","avatar":"https://avatars.githubusercontent.com/u/672182?v=4","links":[{"icon":"github","link":"https://github.com/ezpuzz"}],"lastFetch":1734600071191},{"username":"KotoriK","name":null,"avatar":"https://avatars.githubusercontent.com/u/52659125?v=4","links":[{"icon":"github","link":"https://github.com/KotoriK"}],"lastFetch":1734600071365},{"username":"fletchertyler914","name":"Tyler Fletcher","avatar":"https://avatars.githubusercontent.com/u/3344498?v=4","links":[{"icon":"github","link":"https://github.com/fletchertyler914"}],"lastFetch":1734600071575},{"username":"nholik","name":"Nicklos Holik","avatar":"https://avatars.githubusercontent.com/u/2022214?v=4","links":[{"icon":"github","link":"https://github.com/nholik"}],"lastFetch":1734600071737},{"username":"roj1512","name":null,"avatar":"https://avatars.githubusercontent.com/u/175297870?v=4","links":[{"icon":"github","link":"https://github.com/roj1512"}],"lastFetch":1734600071906},{"username":"nickcaballero","name":"Nick Caballero","avatar":"https://avatars.githubusercontent.com/u/355976?v=4","links":[{"icon":"github","link":"https://github.com/nickcaballero"}],"lastFetch":1734600072077},{"username":"hd-o","name":"Hadrian de Oliveira","avatar":"https://avatars.githubusercontent.com/u/58871222?v=4","links":[{"icon":"github","link":"https://github.com/hd-o"}],"lastFetch":1734600072250},{"username":"kecrily","name":"Percy Ma","avatar":"https://avatars.githubusercontent.com/u/45708948?v=4","links":[{"icon":"github","link":"https://github.com/kecrily"}],"lastFetch":1734600072412},{"username":"psychedelicious","name":"psychedelicious","avatar":"https://avatars.githubusercontent.com/u/4822129?v=4","links":[{"icon":"github","link":"https://github.com/psychedelicious"}],"lastFetch":1734600072584},{"username":"muttonchop","name":"Adam K","avatar":"https://avatars.githubusercontent.com/u/1037657?v=4","links":[{"icon":"github","link":"https://github.com/muttonchop"}],"lastFetch":1734600072749},{"username":"marcomuser","name":"Marco Muser","avatar":"https://avatars.githubusercontent.com/u/64737396?v=4","links":[{"icon":"github","link":"https://github.com/marcomuser"}],"lastFetch":1734600072924},{"username":"HugeLetters","name":"Evgenii Perminov","avatar":"https://avatars.githubusercontent.com/u/119697239?v=4","links":[{"icon":"github","link":"https://github.com/HugeLetters"}],"lastFetch":1734600073095},{"username":"Fumaz","name":"alex","avatar":"https://avatars.githubusercontent.com/u/45318608?v=4","links":[{"icon":"github","link":"https://github.com/Fumaz"}],"lastFetch":1734600073281},{"username":"darwish","name":"Mike Darwish","avatar":"https://avatars.githubusercontent.com/u/292570?v=4","links":[{"icon":"github","link":"https://github.com/darwish"}],"lastFetch":1734600073509},{"username":"kaechele","name":"Felix Kaechele","avatar":"https://avatars.githubusercontent.com/u/454490?v=4","links":[{"icon":"github","link":"https://github.com/kaechele"}],"lastFetch":1734600073699},{"username":"phk422","name":"Hongkun","avatar":"https://avatars.githubusercontent.com/u/59734322?v=4","links":[{"icon":"github","link":"https://github.com/phk422"}],"lastFetch":1734600073886},{"username":"mikestopcontinues","name":"Mike Stop Continues","avatar":"https://avatars.githubusercontent.com/u/150434?v=4","links":[{"icon":"github","link":"https://github.com/mikestopcontinues"}],"lastFetch":1734600074057},{"username":"JE-Lee","name":"maurice","avatar":"https://avatars.githubusercontent.com/u/19794813?v=4","links":[{"icon":"github","link":"https://github.com/JE-Lee"}],"lastFetch":1734600074230},{"username":"vipentti","name":"Ville Penttinen","avatar":"https://avatars.githubusercontent.com/u/4726680?v=4","links":[{"icon":"github","link":"https://github.com/vipentti"}],"lastFetch":1734600074400},{"username":"armandabric","name":"Armand Abric","avatar":"https://avatars.githubusercontent.com/u/95120?v=4","links":[{"icon":"github","link":"https://github.com/armandabric"}],"lastFetch":1734600074558},{"username":"illright","name":"Lev Chelyadinov","avatar":"https://avatars.githubusercontent.com/u/15035286?v=4","links":[{"icon":"github","link":"https://github.com/illright"}],"lastFetch":1734600074741}],"openapi-react-query":[{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1734600070645},{"username":"kerwanp","name":"Martin Paucot","avatar":"https://avatars.githubusercontent.com/u/36955373?v=4","links":[{"icon":"github","link":"https://github.com/kerwanp"}],"lastFetch":1734600070841},{"username":"yoshi2no","name":"yoshi2no","avatar":"https://avatars.githubusercontent.com/u/57059705?v=4","links":[{"icon":"github","link":"https://github.com/yoshi2no"}],"lastFetch":1734600071055},{"username":"elaygelbart","name":"Elay Gelbart","avatar":"https://avatars.githubusercontent.com/u/88675154?v=4","links":[{"icon":"github","link":"https://github.com/elaygelbart"}],"lastFetch":1730904973287},{"username":"HugeLetters","name":"Evgenii Perminov","avatar":"https://avatars.githubusercontent.com/u/119697239?v=4","links":[{"icon":"github","link":"https://github.com/HugeLetters"}],"lastFetch":1734600071262}],"swr-openapi":[{"username":"htunnicliff","name":"Hunter Tunnicliff","avatar":"https://avatars.githubusercontent.com/u/7614039?v=4","links":[{"icon":"github","link":"https://github.com/htunnicliff"}],"lastFetch":1734600070680}],"openapi-metadata":[{"username":"kerwanp","name":"Martin Paucot","avatar":"https://avatars.githubusercontent.com/u/36955373?v=4","links":[{"icon":"github","link":"https://github.com/kerwanp"}],"lastFetch":1734600070676},{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1734600070876}]} \ No newline at end of file diff --git a/docs/openapi-metadata/decorators.md b/docs/openapi-metadata/decorators.md index ad5a28729..c7d827944 100644 --- a/docs/openapi-metadata/decorators.md +++ b/docs/openapi-metadata/decorators.md @@ -8,18 +8,48 @@ Decorators are used to enrich your OpenAPI specifications. They can be applied o > For more information about the decorators, you can directly refer to the [source code](https://github.com/openapi-ts/openapi-typescript/packages/openapi-metadata/src/decorators). -| Decorator | Usage | Description | -| ----------------------- | ------------------- | ------------------------------------------------------------------------ | -| `@ApiBody` | Method | Sets the requestBody of the operation. | -| `@ApiCookie` | Controller / Method | Adds a cookie parameter to the operation(s). | -| `@ApiExcludeController` | Method | Excludes the operations of this controller from the document generation. | -| `@ApiExcludeOperation` | Method | Excludes this operation from the document generation. | -| `@ApiExtraModels` | Controller | Adds extra models to be loaded in the schema. | -| `@ApiHeader` | Controller / Method | Adds a header parameter to the operation(s). | -| `@ApiOperation` | Method | Configures an operation. | -| `@ApiParam` | Controller / Method | Adds a path parameter to the operation(s). | -| `@ApiProperty` | Model | Configures a schema property property. | -| `@ApiQuery` | Controller / Method | Adds a query parameter to the operation(s). | -| `@ApiResponse` | Controller / Method | Adds a response to the operation(s). | -| `@ApiSecurity` | Controller / Method | Sets the security scheme to the operation(s). | -| `@ApiTags` | Controller / Method | Adds tags to the operation(s). | +_You can hover the following code snippet to get information about each decorator._ + +```ts twoslash +// @noErrors +// ---cut--- +import { + ApiBody, + ApiCookie, + ApiExcludeController, + ApiExcludeOperation, + ApiExtraModels, + ApiHeader, + ApiOperation, + ApiParam, + ApiProperty, + ApiPropertyOptional, + ApiQuery, + ApiResponse, + ApiSecurity, + ApiBasicAuth, + ApiOauth2, + ApiBearerAuth, + ApiCookieAuth, + ApiTags +} from 'openapi-metadata/decorators' +// ---cut--- +@ApiBody() +@ApiCookie() +@ApiExcludeController() +@ApiExcludeOperation() +@ApiExtraModels() +@ApiHeader() +@ApiOperation() +@ApiParam() +@ApiProperty() +@ApiPropertyOptional() +@ApiQuery() +@ApiResponse() +@ApiSecurity() +@ApiBasicAuth() +@ApiOAuth2() +@ApiBearerAuth() +@ApiCookieAuth() +@ApiTags() +``` diff --git a/docs/openapi-metadata/examples.md b/docs/openapi-metadata/examples.md index 1f9091c9b..ac8bc4caa 100644 --- a/docs/openapi-metadata/examples.md +++ b/docs/openapi-metadata/examples.md @@ -8,7 +8,8 @@ This library is made to be used through an integration with your favorite framew ## Express -```ts +```ts twoslash +// @noErrors import express from "express"; import { generateDocument } from "openapi-metadata"; import { generateScalarUI } from "openapi-metadata/ui"; @@ -29,7 +30,8 @@ app.get("/api/docs", (req, res) => { ## Fastify -```ts +```ts twoslash +// @noErrors import fastify from "fastify"; import { generateDocument } from "openapi-metadata"; import { generateScalarUI } from "openapi-metadata/ui"; diff --git a/docs/openapi-metadata/index.md b/docs/openapi-metadata/index.md index 24b35bc64..21d661d81 100644 --- a/docs/openapi-metadata/index.md +++ b/docs/openapi-metadata/index.md @@ -8,14 +8,15 @@ title: "Getting started" ::: code-group -```ts [users_controller.ts] +```ts [users_controller.ts] twoslash +// @noErrors import { ApiOperation, ApiResponse } from "openapi-metadata/decorators"; import User from "./user"; class UsersController { @ApiOperation({ - method: "get", - pattern: "/users", + methods: ["get"], + path: "/users", summary: "List users" }) @ApiResponse({ type: [User] }) @@ -25,7 +26,7 @@ class UsersController { } ``` -```ts [user.ts] +```ts [user.ts] twoslash import { ApiProperty } from "openapi-metadata/decorators"; class User { @@ -40,7 +41,8 @@ class User { } ``` -```ts [index.ts] +```ts [index.ts] twoslash +// @noErrors import "reflect-metadata"; import { generateDocument } from "openapi-metadata"; import UsersController from "./users_controller"; @@ -49,7 +51,7 @@ const document = await generateDocument({ controllers: [UsersController], document: { info: { - name: "My Api", + title: "My Api", version: "1.0.0", }, }, @@ -109,21 +111,21 @@ To get started, you can use the `generateDocument` function to create an (almost ::: code-group -```ts [index.ts] +```ts [index.ts] twoslash import "reflect-metadata"; import { generateDocument } from "openapi-metadata"; -const builder = await generateDocument({ +const document = await generateDocument({ controllers: [], document: { info: { - name: "My API", + title: "My API", version: "1.0.0", }, }, }); -console.log(document.build()); // <- Your generated OpenAPI specifications +console.log(document); // <- Your generated OpenAPI specifications ``` ::: @@ -135,14 +137,15 @@ In the following example we have a `UsersController` which declares an operation ::: code-group -```ts [controllers/users_controller.ts] +```ts [controllers/users_controller.ts] twoslash +// @noErrors import { ApiOperation, ApiResponse } from "openapi-metadata/decorators"; import User from "../schemas/user"; export default class UsersController { @ApiOperation({ - method: "get", - pattern: "/users", + methods: ["get"], + path: "/users", summary: "List users", }) @ApiResponse({ type: [User] }) @@ -164,7 +167,7 @@ By using the `@ApiProperty` decorator on class we can define the properties of o ::: code-group -```ts [schemas/user.ts] +```ts [schemas/user.ts] twoslash import { ApiProperty } from "openapi-metadata/decorators"; export default class User { @@ -184,18 +187,19 @@ export default class User { ::: -### Add the controller to the generated document +### Register your controller -Now that we have our controller ready, we can use it to generate our document. +Now that we have our controller ready, we can include it when generating our document. ::: code-group -```ts [index.ts] +```ts [index.ts] twoslash +// @noErrors import "reflect-metadata"; import { generateDocument } from "openapi-metadata"; import UsersController from "./controllers/users_controller.ts"; -const builder = await generateDocument({ +const document = await generateDocument({ controllers: [UsersController], document: { info: { @@ -205,9 +209,7 @@ const builder = await generateDocument({ }, }); -console.log(document.build()); // <- Your generated OpenAPI specifications +console.log(document); // <- Your generated OpenAPI specifications ``` ::: - -### Going further diff --git a/docs/openapi-metadata/ui.md b/docs/openapi-metadata/ui.md index 2fc67c720..104da61a0 100644 --- a/docs/openapi-metadata/ui.md +++ b/docs/openapi-metadata/ui.md @@ -8,7 +8,7 @@ title: UI integrations ## [Scalar](https://scalar.com) -```ts +```ts twoslash import { generateScalarUI } from "openapi-metadata/ui"; generateScalarUI("http://localhost:3000/api"); @@ -16,7 +16,7 @@ generateScalarUI("http://localhost:3000/api"); ## [Swagger UI](https://swagger.io/tools/swagger-ui/) -```ts +```ts twoslash import { generateSwaggerUI } from "openapi-metadata/ui"; generateSwaggerUI("http://localhost:3000/api"); @@ -24,7 +24,7 @@ generateSwaggerUI("http://localhost:3000/api"); ## [Rapidoc](https://rapidocweb.com/) -```ts +```ts twoslash import { generateRapidocUI } from "openapi-metadata/ui"; generateRapidocUI("http://localhost:3000/api"); diff --git a/docs/package.json b/docs/package.json index 7e3cf85db..7b26c899f 100644 --- a/docs/package.json +++ b/docs/package.json @@ -9,6 +9,8 @@ "update-contributors": "node scripts/update-contributors.js" }, "devDependencies": { - "vitepress": "1.5.0" + "vitepress": "1.5.0", + "@shikijs/vitepress-twoslash": "^1.22.2", + "openapi-metadata": "workspace:*" } } diff --git a/packages/openapi-metadata/src/decorators/api-body.ts b/packages/openapi-metadata/src/decorators/api-body.ts index b3f72d21d..82ff495cb 100644 --- a/packages/openapi-metadata/src/decorators/api-body.ts +++ b/packages/openapi-metadata/src/decorators/api-body.ts @@ -3,6 +3,12 @@ import { type OperationBodyMetadata, OperationBodyMetadataStorage } from "../met export type ApiBodyOptions = SetOptional; +/** + * Configures the request body. + * Can be applied to Controllers and Operations. + * + * @see https://swagger.io/specification/#request-body-object + */ export function ApiBody(options: ApiBodyOptions): MethodDecorator { return (target, propertyKey) => { OperationBodyMetadataStorage.defineMetadata( diff --git a/packages/openapi-metadata/src/decorators/api-cookie.ts b/packages/openapi-metadata/src/decorators/api-cookie.ts index 057dfc04e..e43aa28ff 100644 --- a/packages/openapi-metadata/src/decorators/api-cookie.ts +++ b/packages/openapi-metadata/src/decorators/api-cookie.ts @@ -2,6 +2,12 @@ import { type OperationParameterMetadata, OperationParameterMetadataStorage } fr export type ApiCookieOptions = Omit; +/** + * Configures a cookie parameter. + * Can be applied to Operations and Controllers. + * + * @see https://swagger.io/specification/#parameter-object + */ export function ApiCookie(options: ApiCookieOptions) { return (target: Object, propertyKey?: string | symbol) => { OperationParameterMetadataStorage.mergeMetadata(target, [{ in: "cookie", ...options }], propertyKey); diff --git a/packages/openapi-metadata/src/decorators/api-exclude.ts b/packages/openapi-metadata/src/decorators/api-exclude.ts index 0837ede04..d87b878b9 100644 --- a/packages/openapi-metadata/src/decorators/api-exclude.ts +++ b/packages/openapi-metadata/src/decorators/api-exclude.ts @@ -1,11 +1,19 @@ import { ExcludeMetadataStorage } from "../metadata/exclude.js"; +/** + * Exclude this Controller from the generated schema. + * Useful when working with framework integrations that autoload controllers. + */ export function ApiExcludeController(): ClassDecorator { return (target) => { ExcludeMetadataStorage.defineMetadata(target, true); }; } +/** + * Exclude this Operation from the generated schema. + * Useful when working with framework integrations that autoload controllers. + */ export function ApiExcludeOperation(): MethodDecorator { return (target, propertyKey) => { ExcludeMetadataStorage.defineMetadata(target, true, propertyKey); diff --git a/packages/openapi-metadata/src/decorators/api-extra-models.ts b/packages/openapi-metadata/src/decorators/api-extra-models.ts index 3e13fc61f..6ab28952b 100644 --- a/packages/openapi-metadata/src/decorators/api-extra-models.ts +++ b/packages/openapi-metadata/src/decorators/api-extra-models.ts @@ -1,6 +1,10 @@ import { ExtraModelsMetadataStorage } from "../metadata/extra-models.js"; import type { Thunk, TypeValue } from "../types.js"; +/** + * Adds extra models to the generated schema that are not used anywhere else. + * Useful when you want to share models that are not used by your operations. + */ export function ApiExtraModels(...models: (TypeValue | Thunk)[]) { return (target: Object) => { ExtraModelsMetadataStorage.mergeMetadata(target, models); diff --git a/packages/openapi-metadata/src/decorators/api-header.ts b/packages/openapi-metadata/src/decorators/api-header.ts index b3509503e..f921a8bf9 100644 --- a/packages/openapi-metadata/src/decorators/api-header.ts +++ b/packages/openapi-metadata/src/decorators/api-header.ts @@ -2,6 +2,12 @@ import { type OperationParameterMetadata, OperationParameterMetadataStorage } fr export type ApiHeaderOptions = Omit; +/** + * Configures a header parameter. + * Can be applied to Operations and Controllers. + * + * @see https://swagger.io/specification/#parameter-object + */ export function ApiHeader(options: ApiHeaderOptions) { return (target: Object, propertyKey?: string | symbol) => { OperationParameterMetadataStorage.mergeMetadata(target, [{ in: "header", ...options }], propertyKey); diff --git a/packages/openapi-metadata/src/decorators/api-operation.ts b/packages/openapi-metadata/src/decorators/api-operation.ts index 1f32590a2..99d210fc8 100644 --- a/packages/openapi-metadata/src/decorators/api-operation.ts +++ b/packages/openapi-metadata/src/decorators/api-operation.ts @@ -2,6 +2,12 @@ import { type OperationMetadata, OperationMetadataStorage } from "../metadata/op export type ApiOperationOptions = OperationMetadata; +/** + * Configures a new operation. + * When multiple methods are defined, multiple operations will be added to the document. + * + * @see https://swagger.io/specification/#operation-object + */ export function ApiOperation(options: ApiOperationOptions): MethodDecorator { return (target, propertyKey) => { OperationMetadataStorage.defineMetadata(target, options, propertyKey); diff --git a/packages/openapi-metadata/src/decorators/api-param.ts b/packages/openapi-metadata/src/decorators/api-param.ts index 0ae4c4ea5..b564a83bf 100644 --- a/packages/openapi-metadata/src/decorators/api-param.ts +++ b/packages/openapi-metadata/src/decorators/api-param.ts @@ -2,6 +2,12 @@ import { type OperationParameterMetadata, OperationParameterMetadataStorage } fr export type ApiParamOptions = Omit; +/** + * Configures a path parameter. + * Can be applied to Operations and Controllers. + * + * @see https://swagger.io/specification/#parameter-object + */ export function ApiParam(options: ApiParamOptions) { return function (target: Object, propertyKey?: string | symbol) { OperationParameterMetadataStorage.mergeMetadata(target, [{ in: "path", ...options }], propertyKey); diff --git a/packages/openapi-metadata/src/decorators/api-property.ts b/packages/openapi-metadata/src/decorators/api-property.ts index ca10ee4b0..234037ee2 100644 --- a/packages/openapi-metadata/src/decorators/api-property.ts +++ b/packages/openapi-metadata/src/decorators/api-property.ts @@ -5,6 +5,12 @@ import { findType } from "../utils/metadata.js"; export type ApiPropertyOptions = Partial; +/** + * Configures this class member as a property of the schema. + * Can be applied to properties, getters and methods. + * + * @see https://swagger.io/specification/#schema-object + */ export function ApiProperty(options?: ApiPropertyOptions): PropertyDecorator; export function ApiProperty(options?: ApiPropertyOptions): MethodDecorator; export function ApiProperty(options?: ApiPropertyOptions): PropertyDecorator | MethodDecorator { @@ -37,6 +43,12 @@ export function ApiProperty(options?: ApiPropertyOptions): PropertyDecorator | M }; } +/** + * Configures this class member as an optional property of the schema. + * Can be applied to properties, getters and methods. + * + * @see https://swagger.io/specification/#schema-object + */ export function ApiPropertyOptional(options?: Omit): PropertyDecorator; export function ApiPropertyOptional(options?: Omit): MethodDecorator; export function ApiPropertyOptional( diff --git a/packages/openapi-metadata/src/decorators/api-query.ts b/packages/openapi-metadata/src/decorators/api-query.ts index caba1bb44..75e2d4e9d 100644 --- a/packages/openapi-metadata/src/decorators/api-query.ts +++ b/packages/openapi-metadata/src/decorators/api-query.ts @@ -2,6 +2,12 @@ import { type OperationParameterMetadata, OperationParameterMetadataStorage } fr export type ApiQueryOptions = Omit; +/** + * Configures a query parameter. + * Can be applied to Operations and Controllers. + * + * @see https://swagger.io/specification/#parameter-object + */ export function ApiQuery(options: ApiQueryOptions) { return function (target: Object, propertyKey?: string | symbol) { OperationParameterMetadataStorage.mergeMetadata(target, [{ in: "query", ...options }], propertyKey); diff --git a/packages/openapi-metadata/src/decorators/api-response.ts b/packages/openapi-metadata/src/decorators/api-response.ts index 80135f203..9b71d462a 100644 --- a/packages/openapi-metadata/src/decorators/api-response.ts +++ b/packages/openapi-metadata/src/decorators/api-response.ts @@ -3,6 +3,12 @@ import { type OperationResponseMetadata, OperationResponseMetadataStorage } from export type ApiResponseOptions = SetOptional; +/** + * Configures a response. + * Can be applied to Controllers and Operations. + * + * @see https://swagger.io/specification/#response-object + */ export function ApiResponse(options: ApiResponseOptions) { return function (target: Object, propertyKey?: string | symbol) { const metadata = { diff --git a/packages/openapi-metadata/src/decorators/api-security.ts b/packages/openapi-metadata/src/decorators/api-security.ts index 6067d2426..00dc7e495 100644 --- a/packages/openapi-metadata/src/decorators/api-security.ts +++ b/packages/openapi-metadata/src/decorators/api-security.ts @@ -1,5 +1,11 @@ import { OperationSecurityMetadataStorage } from "../metadata/operation-security.js"; +/** + * Configures security requirements. + * Can be applied to Controllers and Operations. + * + * @see https://swagger.io/specification/#security-requirement-object + */ export function ApiSecurity(name: string, ...scopes: string[]) { return (target: Object, propertyKey?: string | symbol) => { OperationSecurityMetadataStorage.mergeMetadata( @@ -12,18 +18,42 @@ export function ApiSecurity(name: string, ...scopes: string[]) { }; } +/** + * Configures Basic auth security requirement. + * Can be applied to Controllers and Operations. + * + * @see https://swagger.io/specification/#security-requirement-object + */ export function ApiBasicAuth() { return ApiSecurity("basic"); } +/** + * Configures Bearer auth security requirement. + * Can be applied to Controllers and Operations. + * + * @see https://swagger.io/specification/#security-requirement-object + */ export function ApiBearerAuth() { return ApiSecurity("bearer"); } +/** + * Configures Cookie auth security requirement. + * Can be applied to Controllers and Operations. + * + * @see https://swagger.io/specification/#security-requirement-object + */ export function ApiCookieAuth() { return ApiSecurity("cookie"); } +/** + * Configures OAuth2 auth security requirement. + * Can be applied to Controllers and Operations. + * + * @see https://swagger.io/specification/#security-requirement-object + */ export function ApiOauth2(...scopes: string[]) { return ApiSecurity("oauth2", ...scopes); } diff --git a/packages/openapi-metadata/src/decorators/api-tags.ts b/packages/openapi-metadata/src/decorators/api-tags.ts index e0db2e12f..ae0e74a2a 100644 --- a/packages/openapi-metadata/src/decorators/api-tags.ts +++ b/packages/openapi-metadata/src/decorators/api-tags.ts @@ -1,5 +1,9 @@ import { OperationMetadataStorage } from "../metadata/operation.js"; +/** + * Configures tags used to grouping operations. + * Can be applied to Controllers and Operations. + */ export function ApiTags(...tags: string[]) { return (target: Object, propertyKey?: string | symbol) => { OperationMetadataStorage.mergeMetadata(target, { tags }, propertyKey); diff --git a/packages/openapi-metadata/src/decorators/index.ts b/packages/openapi-metadata/src/decorators/index.ts index 0594158dd..745d1677d 100644 --- a/packages/openapi-metadata/src/decorators/index.ts +++ b/packages/openapi-metadata/src/decorators/index.ts @@ -1,12 +1,18 @@ export { ApiBody } from "./api-body.js"; export { ApiCookie } from "./api-cookie.js"; +export { ApiExcludeController, ApiExcludeOperation } from "./api-exclude.js"; +export { ApiExtraModels } from "./api-extra-models.js"; export { ApiHeader } from "./api-header.js"; export { ApiOperation } from "./api-operation.js"; export { ApiParam } from "./api-param.js"; export { ApiProperty, ApiPropertyOptional } from "./api-property.js"; export { ApiQuery } from "./api-query.js"; export { ApiResponse } from "./api-response.js"; -export { ApiSecurity } from "./api-security.js"; +export { + ApiSecurity, + ApiBasicAuth, + ApiOauth2, + ApiBearerAuth, + ApiCookieAuth, +} from "./api-security.js"; export { ApiTags } from "./api-tags.js"; -export { ApiExcludeController, ApiExcludeOperation } from "./api-exclude.js"; -export { ApiExtraModels } from "./api-extra-models.js"; diff --git a/packages/openapi-metadata/src/generators/operation-response.ts b/packages/openapi-metadata/src/generators/operation-response.ts index 37119c4c6..93ebd3a0e 100644 --- a/packages/openapi-metadata/src/generators/operation-response.ts +++ b/packages/openapi-metadata/src/generators/operation-response.ts @@ -7,13 +7,13 @@ export async function generateOperationResponse( context: Context, metadata: OperationResponseMetadata, ): Promise { - const { type, schema: s, enum: e, ...response } = metadata as any; + const { type, schema: s, enum: e, mediaType, status, ...response } = metadata; return { description: "", ...response, content: { - [metadata.mediaType]: { + [mediaType]: { schema: await loadType(context, metadata), }, }, diff --git a/packages/openapi-metadata/src/generators/operation.ts b/packages/openapi-metadata/src/generators/operation.ts index fe8341191..a04fee3eb 100644 --- a/packages/openapi-metadata/src/generators/operation.ts +++ b/packages/openapi-metadata/src/generators/operation.ts @@ -8,8 +8,6 @@ import { generateOperationParameters } from "./operation-parameters.js"; import { OperationResponseMetadataStorage } from "../metadata/operation-response.js"; import { generateOperationResponse } from "./operation-response.js"; import { OperationSecurityMetadataStorage } from "../metadata/operation-security.js"; -import { ExtraModelsMetadataStorage } from "../metadata/extra-models.js"; -import { loadType } from "../loaders/type.js"; export async function generateOperation( context: Context, @@ -21,29 +19,26 @@ export async function generateOperation( const target = controller.prototype; - const extraModels = ExtraModelsMetadataStorage.getMetadata(target); - - await Promise.all(extraModels.map((m) => loadType(context, { type: m }))); - const body = OperationBodyMetadataStorage.getMetadata(target, propertyKey); if (body) { operation.requestBody = await generateOperationBody(context, body); } - const parameters = OperationParameterMetadataStorage.getMetadata(target, propertyKey); + const parameters = OperationParameterMetadataStorage.getMetadata(target, propertyKey, true); operation.parameters = []; for (const parameter of parameters) { operation.parameters.push(await generateOperationParameters(context, parameter)); } - const responses = OperationResponseMetadataStorage.getMetadata(target, propertyKey); + const responses = OperationResponseMetadataStorage.getMetadata(target, propertyKey, true); for (const [status, response] of Object.entries(responses)) { operation.responses[status] = await generateOperationResponse(context, response); } const security = OperationSecurityMetadataStorage.getMetadata(target, propertyKey, true); - operation.security = [security]; + // TODO: Check what the difference between `[{ auth1: {} }, {auth2: {} }]` and `[{ auth1: {}, auth2: {}}]` + operation.security = Object.keys(security).length > 0 ? [security] : []; return operation; } diff --git a/packages/openapi-metadata/src/generators/paths.ts b/packages/openapi-metadata/src/generators/paths.ts index d91d2b67e..05b6e2385 100644 --- a/packages/openapi-metadata/src/generators/paths.ts +++ b/packages/openapi-metadata/src/generators/paths.ts @@ -1,7 +1,8 @@ import type { OpenAPIV3 } from "openapi-types"; import type { Context } from "../context.js"; import { generateOperation } from "./operation.js"; -import { ExcludeMetadataStorage, OperationMetadataStorage } from "../metadata/index.js"; +import { ExcludeMetadataStorage, ExtraModelsMetadataStorage, OperationMetadataStorage } from "../metadata/index.js"; +import { loadType } from "../loaders/type.js"; export async function generatePaths(context: Context, controllers: Function[]): Promise { const paths: OpenAPIV3.PathsObject = {}; @@ -9,8 +10,13 @@ export async function generatePaths(context: Context, controllers: Function[]): for (const controller of controllers) { const target = controller.prototype; const keys = Object.getOwnPropertyNames(target); + + // Loads extra models defined on this controller + const extraModels = ExtraModelsMetadataStorage.getMetadata(target); + await Promise.all(extraModels.map((m) => loadType(context, { type: m }))); + for (const key of keys) { - const metadata = OperationMetadataStorage.getMetadata(target, key); + const metadata = OperationMetadataStorage.getMetadata(target, key, true); if (!metadata) { continue; } diff --git a/packages/openapi-metadata/src/index.ts b/packages/openapi-metadata/src/index.ts index 5ae9692f6..488ba1e06 100644 --- a/packages/openapi-metadata/src/index.ts +++ b/packages/openapi-metadata/src/index.ts @@ -1,5 +1,7 @@ import type { OpenAPIV3 } from "openapi-types"; export { generateDocument } from "./generators/document.js"; +export { getSchemaPath } from "./utils/schema.js"; + export type { TypeLoaderFn } from "./types.js"; export type OpenAPIDocument = OpenAPIV3.Document; diff --git a/packages/openapi-metadata/src/loaders/type.ts b/packages/openapi-metadata/src/loaders/type.ts index 9277a9285..6d9d3171a 100644 --- a/packages/openapi-metadata/src/loaders/type.ts +++ b/packages/openapi-metadata/src/loaders/type.ts @@ -4,9 +4,12 @@ import type { TypeLoaderFn, TypeOptions } from "../types.js"; import type { SetRequired } from "type-fest"; import { getEnumType, getEnumValues } from "../utils/enum.js"; import { PropertyMetadataStorage } from "../metadata/property.js"; -import { schemaPath } from "../utils/schema.js"; +import { getSchemaPath } from "../utils/schema.js"; import { isThunk } from "../utils/metadata.js"; +/** + * Type loader to load primitive types. + */ export const PrimitiveTypeLoader: TypeLoaderFn = async (_context, value) => { if (typeof value === "string") { return { type: value }; @@ -28,6 +31,9 @@ export const PrimitiveTypeLoader: TypeLoaderFn = async (_context, value) => { } }; +/** + * Type loader to load array types. + */ export const ArrayTypeLoader: TypeLoaderFn = async (context, value) => { if (!Array.isArray(value)) { return; @@ -59,6 +65,9 @@ export const ArrayTypeLoader: TypeLoaderFn = async (context, value) => { }; }; +/** + * Type loader to load classes as SchemaObject. + */ export const ClassTypeLoader: TypeLoaderFn = async (context, value) => { if (typeof value !== "function" || !value.prototype) { return; @@ -67,7 +76,7 @@ export const ClassTypeLoader: TypeLoaderFn = async (context, value) => { const model = value.name; if (context.schemas[model]) { - return { $ref: schemaPath(model) }; + return { $ref: getSchemaPath(model) }; } const schema: SetRequired = { @@ -96,9 +105,12 @@ export const ClassTypeLoader: TypeLoaderFn = async (context, value) => { } } - return { $ref: schemaPath(model) }; + return { $ref: getSchemaPath(model) }; }; +/** + * Transforms a type option into a SchemaObject or ReferenceObject. + */ export async function loadType( context: Context, options: TypeOptions, @@ -125,7 +137,7 @@ export async function loadType( const thunk = isThunk(options.type); const value = thunk ? (options.type as Function)(context) : options.type; - for (const loader of [PrimitiveTypeLoader, ...context.typeLoaders, ClassTypeLoader]) { + for (const loader of [PrimitiveTypeLoader, ArrayTypeLoader, ...context.typeLoaders, ClassTypeLoader]) { const result = await loader(context, value, options.type); if (result) { return result; diff --git a/packages/openapi-metadata/src/metadata/operation-security.ts b/packages/openapi-metadata/src/metadata/operation-security.ts index 45b2b53ed..1fe24ea69 100644 --- a/packages/openapi-metadata/src/metadata/operation-security.ts +++ b/packages/openapi-metadata/src/metadata/operation-security.ts @@ -5,7 +5,7 @@ export type OperationSecurityMetadata = OpenAPIV3.SecurityRequirementObject; export const OperationSecurityMetadataKey = Symbol("OperationSecurity"); -export const OperationSecurityMetadataStorage = createMetadataStorage( +export const OperationSecurityMetadataStorage = createMetadataStorage( OperationSecurityMetadataKey, {}, ); diff --git a/packages/openapi-metadata/src/metadata/operation.ts b/packages/openapi-metadata/src/metadata/operation.ts index 3965524b4..a2aafe188 100644 --- a/packages/openapi-metadata/src/metadata/operation.ts +++ b/packages/openapi-metadata/src/metadata/operation.ts @@ -3,7 +3,15 @@ import type { HttpMethods } from "../types.js"; import { createMetadataStorage } from "./factory.js"; export type OperationMetadata = Omit & { + /** + * Operation path. + * Can include parameters. + */ path?: string; + + /** + * Available methods for this operation. + */ methods?: HttpMethods[]; }; diff --git a/packages/openapi-metadata/src/ui/rapidoc.ts b/packages/openapi-metadata/src/ui/rapidoc.ts index 442267e6f..345c8b332 100644 --- a/packages/openapi-metadata/src/ui/rapidoc.ts +++ b/packages/openapi-metadata/src/ui/rapidoc.ts @@ -1,3 +1,8 @@ +/** + * Generates HTML to display Rapidoc UI. + * + * @see https://rapidocweb.com/ + */ export function generateRapidocUI(url: string) { return ` diff --git a/packages/openapi-metadata/src/ui/scalar.ts b/packages/openapi-metadata/src/ui/scalar.ts index 240fdad14..1d7e9a87c 100644 --- a/packages/openapi-metadata/src/ui/scalar.ts +++ b/packages/openapi-metadata/src/ui/scalar.ts @@ -1,3 +1,8 @@ +/** + * Generates HTML to display Scalar UI. + * + * @see https://scalar.com/ + */ export function generateScalarUI(url: string) { return ` diff --git a/packages/openapi-metadata/src/ui/swagger.ts b/packages/openapi-metadata/src/ui/swagger.ts index 159c20954..fb05519e5 100644 --- a/packages/openapi-metadata/src/ui/swagger.ts +++ b/packages/openapi-metadata/src/ui/swagger.ts @@ -2,6 +2,11 @@ export type GenerateSwaggerUIOptions = { persistAuthorization?: boolean; }; +/** + * Generates HTML to display Swagger UI. + * + * @see https://swagger.io/tools/swagger-ui/ + */ export function generateSwaggerUI(url: string, options?: GenerateSwaggerUIOptions) { const swaggerOptions = { url, diff --git a/packages/openapi-metadata/src/utils/enum.ts b/packages/openapi-metadata/src/utils/enum.ts index 079ccb8cd..666fc85a0 100644 --- a/packages/openapi-metadata/src/utils/enum.ts +++ b/packages/openapi-metadata/src/utils/enum.ts @@ -1,9 +1,15 @@ import type { EnumTypeValue } from "../types.js"; +/** + * Returns primitive type from values of an enum. + */ export function getEnumType(values: (string | number)[]): "string" | "number" { return values.some((v) => typeof v === "string") ? "string" : "number"; } +/** + * Returns values of an enum. + */ export function getEnumValues(enumType: EnumTypeValue) { if (Array.isArray(enumType)) { return enumType; diff --git a/packages/openapi-metadata/src/utils/metadata.ts b/packages/openapi-metadata/src/utils/metadata.ts index 395e2a066..13f19a224 100644 --- a/packages/openapi-metadata/src/utils/metadata.ts +++ b/packages/openapi-metadata/src/utils/metadata.ts @@ -3,7 +3,10 @@ import type { TypeValue } from "../types.js"; import { NoExplicitTypeError } from "../errors/no-explicit-type.js"; import { ReflectMetadataMissingError } from "../errors/reflect-metadata-missing.js"; -export function ensureReflectMetadataExists() { +/** + * Asserts that `reflect-metadata` exists. + */ +export function assertReflectMetadata() { if (typeof Reflect !== "object" || typeof Reflect.getMetadata !== "function") { throw new ReflectMetadataMissingError(); } @@ -18,8 +21,11 @@ export type FindTypeOptions = { propertyKey: string; }; +/** + * Returns the type inferred from class member. + */ export function findType({ metadataKey, prototype, propertyKey }: FindTypeOptions) { - ensureReflectMetadataExists(); + assertReflectMetadata(); const reflectedType: Function | undefined = Reflect.getMetadata(metadataKey, prototype, propertyKey); if (!reflectedType) { @@ -31,6 +37,12 @@ export function findType({ metadataKey, prototype, propertyKey }: FindTypeOption const IS_THUNK_REG = /.+=>[\w\d\s\t\n\r]*/; +/** + * Asserts that a value is a thunk value. + * + * @example isThunk('hello') === false + * @example isThunk(() => 'hello') === true + */ export function isThunk(value: any): boolean { if (typeof value !== "function") { return false; @@ -38,11 +50,3 @@ export function isThunk(value: any): boolean { return Boolean(IS_THUNK_REG.exec(value)); } - -export function typeToString(value: TypeValue) { - if (typeof value === "function") { - return value.name; - } - - return value.toString(); -} diff --git a/packages/openapi-metadata/src/utils/schema.ts b/packages/openapi-metadata/src/utils/schema.ts index ef1dfb0b3..a2c0e8e48 100644 --- a/packages/openapi-metadata/src/utils/schema.ts +++ b/packages/openapi-metadata/src/utils/schema.ts @@ -1,4 +1,7 @@ -export function schemaPath(model: string | Function): string { +/** + * Returns schema path from a class constructor or a schema name. + */ +export function getSchemaPath(model: string | Function): string { const modelName = typeof model === "string" ? model : model.name; return `#/components/schemas/${modelName}`; } diff --git a/packages/openapi-metadata/test/decorators.test.ts b/packages/openapi-metadata/test/decorators.test.ts index 989d9cee4..b193be263 100644 --- a/packages/openapi-metadata/test/decorators.test.ts +++ b/packages/openapi-metadata/test/decorators.test.ts @@ -134,12 +134,13 @@ test("@ApiTags", () => { @ApiTags("Root") class MyController { @ApiTags("Hello", "World") + @ApiTags("Foo", "Bar") operation() {} } const metadata = OperationMetadataStorage.getMetadata(MyController.prototype, "operation", true); - expect(metadata.tags).toEqual(["Root", "Hello", "World"]); + expect(metadata.tags).toEqual(["Root", "Foo", "Bar", "Hello", "World"]); }); test("@ApiSecurity", () => { diff --git a/packages/openapi-metadata/test/e2e.test.ts b/packages/openapi-metadata/test/e2e.test.ts new file mode 100644 index 000000000..9cd64b4b1 --- /dev/null +++ b/packages/openapi-metadata/test/e2e.test.ts @@ -0,0 +1,165 @@ +import "reflect-metadata"; +import { generateDocument } from "../src/index.js"; +import UsersController from "./fixtures/controllers/users_controller.js"; +import type { OpenAPIV3 } from "openapi-types"; + +test("simple schema", async () => { + const document = await generateDocument({ + controllers: [UsersController], + document: { + info: { + title: "Test API", + version: "1.0.0", + }, + }, + }); + + expect(document).toEqual({ + openapi: "3.0.0", + info: { + title: "Test API", + version: "1.0.0", + }, + paths: { + "/users": { + get: { + summary: "List users", + parameters: [ + { + in: "query", + name: "page", + schema: { + type: "string", + }, + }, + ], + responses: { + default: { + description: "", + content: { + "application/json": { + schema: { + type: "array", + items: { + $ref: "#/components/schemas/User", + }, + }, + }, + }, + }, + "404": { + description: "Not found", + content: { + "application/json": { + schema: { + type: "object", + }, + }, + }, + }, + }, + security: [], + tags: ["Users", "List"], + }, + post: { + summary: "Create user", + parameters: [], + requestBody: { + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/User", + }, + }, + }, + }, + responses: { + default: { + description: "", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/User", + }, + }, + }, + }, + "404": { + description: "Not found", + content: { + "application/json": { + schema: { + type: "object", + }, + }, + }, + }, + }, + security: [], + tags: ["Users", "Create"], + }, + }, + "/users/{id}": { + get: { + summary: "Show user", + parameters: [], + responses: { + default: { + description: "", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/User", + }, + }, + }, + }, + "404": { + description: "Not found", + content: { + "application/json": { + schema: { + type: "object", + }, + }, + }, + }, + }, + security: [], + tags: ["Users", "Show"], + }, + }, + }, + components: { + schemas: { + User: { + type: "object", + properties: { + id: { + type: "number", + }, + posts: { + type: "array", + items: { + $ref: "#/components/schemas/Post", + }, + }, + }, + required: ["id", "posts"], + }, + Post: { + type: "object", + properties: { + id: { + type: "number", + }, + author: { + $ref: "#/components/schemas/User", + }, + }, + required: ["id", "author"], + }, + }, + }, + } satisfies OpenAPIV3.Document); +}); diff --git a/packages/openapi-metadata/test/fixtures/controllers/users_controller.ts b/packages/openapi-metadata/test/fixtures/controllers/users_controller.ts new file mode 100644 index 000000000..dd000fee8 --- /dev/null +++ b/packages/openapi-metadata/test/fixtures/controllers/users_controller.ts @@ -0,0 +1,51 @@ +import { ApiBody } from "../../../src/decorators/api-body.js"; +import { ApiOperation } from "../../../src/decorators/api-operation.js"; +import { ApiQuery } from "../../../src/decorators/api-query.js"; +import { ApiResponse } from "../../../src/decorators/api-response.js"; +import { ApiTags } from "../../../src/decorators/api-tags.js"; +import User from "../schemas/user.js"; + +@ApiTags("Users") +@ApiResponse({ + status: 404, + description: "Not found", + type: "object", +}) +export default class UsersController { + @ApiTags("List") + @ApiOperation({ + summary: "List users", + methods: ["get"], + path: "/users", + }) + @ApiResponse({ + type: [User], + }) + @ApiQuery({ name: "page" }) + index() {} + + @ApiTags("Show") + @ApiOperation({ + summary: "Show user", + methods: ["get"], + path: "/users/{id}", + }) + @ApiResponse({ + type: User, + }) + show() {} + + @ApiTags("Create") + @ApiOperation({ + summary: "Create user", + methods: ["post"], + path: "/users", + }) + @ApiBody({ + type: User, + }) + @ApiResponse({ + type: User, + }) + create() {} +} diff --git a/packages/openapi-metadata/test/fixtures/schemas/post.ts b/packages/openapi-metadata/test/fixtures/schemas/post.ts new file mode 100644 index 000000000..391779e2e --- /dev/null +++ b/packages/openapi-metadata/test/fixtures/schemas/post.ts @@ -0,0 +1,10 @@ +import { ApiProperty } from "../../../src/decorators/api-property.js"; +import User from "./user.js"; + +export default class Post { + @ApiProperty() + declare id: number; + + @ApiProperty({ type: () => User }) + declare author: User; +} diff --git a/packages/openapi-metadata/test/fixtures/schemas/user.ts b/packages/openapi-metadata/test/fixtures/schemas/user.ts new file mode 100644 index 000000000..dd95af508 --- /dev/null +++ b/packages/openapi-metadata/test/fixtures/schemas/user.ts @@ -0,0 +1,10 @@ +import { ApiProperty } from "../../../src/decorators/api-property.js"; +import Post from "./post.js"; + +export default class User { + @ApiProperty() + declare id: number; + + @ApiProperty({ type: () => [Post] }) + declare posts: Post[]; +} diff --git a/packages/openapi-metadata/test/loaders/array.test.ts b/packages/openapi-metadata/test/loaders/array.test.ts index c78a6b085..8d2e83d39 100644 --- a/packages/openapi-metadata/test/loaders/array.test.ts +++ b/packages/openapi-metadata/test/loaders/array.test.ts @@ -1,4 +1,6 @@ +import "reflect-metadata"; import type { Context } from "../../src/context.js"; +import { ApiProperty } from "../../src/decorators/api-property.js"; import { ArrayTypeLoader } from "../../src/loaders/type.js"; let error: string | undefined = undefined; @@ -21,6 +23,20 @@ test("simple array", async () => { }); }); +test("model", async () => { + class User { + @ApiProperty() + declare id: string; + } + + expect(await ArrayTypeLoader(context, [User])).toEqual({ + type: "array", + items: { + $ref: "#/components/schemas/User", + }, + }); +}); + test("empty array should warn", async () => { // @ts-expect-error expect(await ArrayTypeLoader(context, [])).toEqual(undefined); diff --git a/packages/openapi-metadata/test/loaders/loader.test.ts b/packages/openapi-metadata/test/loaders/loader.test.ts new file mode 100644 index 000000000..f83ec8566 --- /dev/null +++ b/packages/openapi-metadata/test/loaders/loader.test.ts @@ -0,0 +1,53 @@ +import type { Context } from "../../src/context.js"; +import { loadType } from "../../src/loaders/type.js"; + +const context: Context = { + schemas: {}, + typeLoaders: [], + logger: { + warn: () => {}, + }, +}; + +test("array", async () => { + expect(await loadType(context, { type: [String] })).toEqual({ + type: "array", + items: { + type: "string", + }, + }); +}); + +test("primitive", async () => { + expect(await loadType(context, { type: Number })).toEqual({ + type: "number", + }); +}); + +test("enum", async () => { + expect(await loadType(context, { enum: ["openapi", "graphql"] })).toEqual({ + type: "string", + enum: ["openapi", "graphql"], + }); + + expect(await loadType(context, { enum: [24, 69] })).toEqual({ + type: "number", + enum: [24, 69], + }); +}); + +test("raw schema", async () => { + expect( + await loadType(context, { + schema: { type: "string", description: "test" }, + }), + ).toEqual({ + type: "string", + description: "test", + }); + + expect(await loadType(context, { enum: [24, 69] })).toEqual({ + type: "number", + enum: [24, 69], + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f157008a2..dcffedf1e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,6 +47,12 @@ importers: docs: devDependencies: + '@shikijs/vitepress-twoslash': + specifier: ^1.22.2 + version: 1.22.2(typescript@5.7.2) + openapi-metadata: + specifier: workspace:* + version: link:../packages/openapi-metadata vitepress: specifier: 1.5.0 version: 1.5.0(@algolia/client-search@5.15.0)(@types/node@22.10.1)(@types/react@18.3.12)(axios@1.7.8)(change-case@5.4.4)(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.13.0)(typescript@5.7.2) @@ -1042,6 +1048,15 @@ packages: cpu: [x64] os: [win32] + '@floating-ui/core@1.6.8': + resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} + + '@floating-ui/dom@1.1.1': + resolution: {integrity: sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==} + + '@floating-ui/utils@0.2.8': + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + '@iconify-json/simple-icons@1.2.13': resolution: {integrity: sha512-rRQjMoIt/kPfaD+fnBC9YZQpso3hkn8xPeadl+YWhscJ5SVUCdB9oTeR9VIpt+/5Yi8vEkh2UOWFPq4lz3ee2A==} @@ -1405,21 +1420,39 @@ packages: cpu: [x64] os: [win32] + '@shikijs/core@1.22.2': + resolution: {integrity: sha512-bvIQcd8BEeR1yFvOYv6HDiyta2FFVePbzeowf5pPS1avczrPK+cjmaxxh0nx5QzbON7+Sv0sQfQVciO7bN72sg==} + '@shikijs/core@1.24.0': resolution: {integrity: sha512-6pvdH0KoahMzr6689yh0QJ3rCgF4j1XsXRHNEeEN6M4xJTfQ6QPWrmHzIddotg+xPJUPEPzYzYCKzpYyhTI6Gw==} + '@shikijs/engine-javascript@1.22.2': + resolution: {integrity: sha512-iOvql09ql6m+3d1vtvP8fLCVCK7BQD1pJFmHIECsujB0V32BJ0Ab6hxk1ewVSMFA58FI0pR2Had9BKZdyQrxTw==} + '@shikijs/engine-javascript@1.24.0': resolution: {integrity: sha512-ZA6sCeSsF3Mnlxxr+4wGEJ9Tto4RHmfIS7ox8KIAbH0MTVUkw3roHPHZN+LlJMOHJJOVupe6tvuAzRpN8qK1vA==} + '@shikijs/engine-oniguruma@1.22.2': + resolution: {integrity: sha512-GIZPAGzQOy56mGvWMoZRPggn0dTlBf1gutV5TdceLCZlFNqWmuc7u+CzD0Gd9vQUTgLbrt0KLzz6FNprqYAxlA==} + '@shikijs/engine-oniguruma@1.24.0': resolution: {integrity: sha512-Eua0qNOL73Y82lGA4GF5P+G2+VXX9XnuUxkiUuwcxQPH4wom+tE39kZpBFXfUuwNYxHSkrSxpB1p4kyRW0moSg==} '@shikijs/transformers@1.24.0': resolution: {integrity: sha512-Qf/hby+PRPkoHncjYnJf5svK1aCsOUtQhuLzKPnmeXJtuUZCmbH0pTpdNtXe9tgln/RHlyRJnv7q46HHS1sO0Q==} + '@shikijs/twoslash@1.22.2': + resolution: {integrity: sha512-4R3A7aH/toZgtlveXHKk01nIsvn8hjAfPJ1aT550zcV4qK6vK/tfaEyYtaljOaY1wig2l5+8sKjNSEz3PcSiEw==} + + '@shikijs/types@1.22.2': + resolution: {integrity: sha512-NCWDa6LGZqTuzjsGfXOBWfjS/fDIbDdmVDug+7ykVe1IKT4c1gakrvlfFYp5NhAXH/lyqLM8wsAPo5wNy73Feg==} + '@shikijs/types@1.24.0': resolution: {integrity: sha512-aptbEuq1Pk88DMlCe+FzXNnBZ17LCiLIGWAeCWhoFDzia5Q5Krx3DgnULLiouSdd6+LUM39XwXGppqYE0Ghtug==} + '@shikijs/vitepress-twoslash@1.22.2': + resolution: {integrity: sha512-F4cS9l6QTt/ILlz+S871bOido2CK8Xwdnl4q9gHdnTuZlN1PHAMRZbAOvYAtokvouPp9aZ2W7NtNa+CNCn3yPQ==} + '@shikijs/vscode-textmate@9.3.0': resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} @@ -1603,6 +1636,9 @@ packages: '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/degit@2.8.6': resolution: {integrity: sha512-y0M7sqzsnHB6cvAeTCBPrCQNQiZe8U4qdzf8uBVmOWYap5MMTN/gB2iEqrIqFiYcsyvP74GnGD5tgsHttielFw==} @@ -1639,6 +1675,9 @@ packages: '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} @@ -1678,6 +1717,11 @@ packages: '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + '@typescript/vfs@1.6.0': + resolution: {integrity: sha512-hvJUjNVeBMp77qPINuUvYXj4FyWeeMMKZkxEATEU3hqBAQ7qdTBCUFT7Sp0Zu0faeEtFf+ldXxMEDr/bk73ISg==} + peerDependencies: + typescript: '*' + '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -2098,6 +2142,9 @@ packages: character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -2314,6 +2361,9 @@ packages: decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -2567,6 +2617,15 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + floating-vue@5.2.2: + resolution: {integrity: sha512-afW+h2CFafo+7Y9Lvw/xsqjaQlKLdJV7h1fCHfcYQ1C4SVMlu7OAekqWgu5d4SgvkBVU0pVpLlVsrSTBURFRkg==} + peerDependencies: + '@nuxt/kit': ^3.2.0 + vue: ^3.2.0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + focus-trap@7.6.2: resolution: {integrity: sha512-9FhUxK1hVju2+AiQIDJ5Dd//9R2n2RAfJ0qfhF4IHGHgcoEUTMpbTeG/zbEuwaiYXfuAH6XE0/aCyxDdRM+W5w==} @@ -3025,6 +3084,9 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -3067,6 +3129,9 @@ packages: mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + marked-terminal@7.2.1: resolution: {integrity: sha512-rQ1MoMFXZICWNsKMiiHwP/Z+92PLKskTPXj+e7uwXmuMPkNn7iTqC+IvDekVm1MPeC9wYQeLxeFaOvudRR/XbQ==} engines: {node: '>=16.0.0'} @@ -3078,9 +3143,42 @@ packages: engines: {node: '>= 16'} hasBin: true + mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + mdast-util-to-hast@13.2.0: resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} @@ -3106,21 +3204,81 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} + micromark-core-commonmark@2.0.2: + resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + micromark-util-character@2.1.1: resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + micromark-util-encode@2.0.1: resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + micromark-util-sanitize-uri@2.0.1: resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + micromark-util-subtokenize@2.0.2: + resolution: {integrity: sha512-xKxhkB62vwHUuuxHe9Xqty3UaAsizV2YKq5OV344u3hFBbf8zIYrhYOWhAQb94MtMPkjTOzzjJ/hid9/dR5vFA==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} micromark-util-types@2.0.1: resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + micromark@4.0.1: + resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -3328,6 +3486,9 @@ packages: oniguruma-to-es@0.7.0: resolution: {integrity: sha512-HRaRh09cE0gRS3+wi2zxekB+I5L8C/gN60S+vb11eADHUaB/q4u8wGGOX3GvwvitG8ixaeycZfeoyruKQzUgNg==} + oniguruma-to-js@0.4.3: + resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} + openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} @@ -3642,6 +3803,9 @@ packages: regex-utilities@2.3.0: resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + regex@4.4.0: + resolution: {integrity: sha512-uCUSuobNVeqUupowbdZub6ggI5/JZkYyJdDogddJr60L764oxC2pMZov1fQ3wM9bdyzUILDG+Sqx6NAKAz9rKQ==} + regex@5.0.2: resolution: {integrity: sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==} @@ -3751,6 +3915,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shiki@1.22.2: + resolution: {integrity: sha512-3IZau0NdGKXhH2bBlUk4w1IHNxPh6A5B2sUpyY+8utLu2j/h1QpFkAaUA1bAMxOWWGtTWcAh531vnS4NJKS/lA==} + shiki@1.24.0: resolution: {integrity: sha512-qIneep7QRwxRd5oiHb8jaRzH15V/S8F3saCXOdjwRLgozZJr5x2yeBhQtqkO3FSzQDwYEFAYuifg4oHjpDghrg==} @@ -4143,6 +4310,19 @@ packages: resolution: {integrity: sha512-DUHWQAcC8BTiUZDRzAYGvpSpGLiaOQPfYXlCieQbwUvmml/LRGIe3raKdrOPOoiX0DYlzxs2nH6BoWJoZrj8hA==} hasBin: true + twoslash-protocol@0.2.12: + resolution: {integrity: sha512-5qZLXVYfZ9ABdjqbvPc4RWMr7PrpPaaDSeaYY55vl/w1j6H6kzsWK/urAEIXlzYlyrFmyz1UbwIt+AA0ck+wbg==} + + twoslash-vue@0.2.12: + resolution: {integrity: sha512-kxH60DLn2QBcN2wjqxgMDkyRgmPXsytv7fJIlsyFMDPSkm1/lMrI/UMrNAshNaRHcI+hv8x3h/WBgcvlb2RNAQ==} + peerDependencies: + typescript: '*' + + twoslash@0.2.12: + resolution: {integrity: sha512-tEHPASMqi7kqwfJbkk7hc/4EhlrKCSLcur+TcvYki3vhIfaRMXnXjaYFgXpoZRbT6GdprD4tGuVBEmTpUgLBsw==} + peerDependencies: + typescript: '*' + type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -4398,6 +4578,11 @@ packages: '@vue/composition-api': optional: true + vue-resize@2.0.0-alpha.1: + resolution: {integrity: sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg==} + peerDependencies: + vue: ^3.0.0 + vue-tsc@2.1.6: resolution: {integrity: sha512-f98dyZp5FOukcYmbFpuSCJ4Z0vHSOSmxGttZJCsFeX0M4w/Rsq0s4uKXjcSRsZqsRgQa6z7SfuO+y0HVICE57Q==} hasBin: true @@ -5197,6 +5382,16 @@ snapshots: '@esbuild/win32-x64@0.24.0': optional: true + '@floating-ui/core@1.6.8': + dependencies: + '@floating-ui/utils': 0.2.8 + + '@floating-ui/dom@1.1.1': + dependencies: + '@floating-ui/core': 1.6.8 + + '@floating-ui/utils@0.2.8': {} + '@iconify-json/simple-icons@1.2.13': dependencies: '@iconify/types': 2.0.0 @@ -5503,6 +5698,15 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.28.0': optional: true + '@shikijs/core@1.22.2': + dependencies: + '@shikijs/engine-javascript': 1.22.2 + '@shikijs/engine-oniguruma': 1.22.2 + '@shikijs/types': 1.22.2 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.3 + '@shikijs/core@1.24.0': dependencies: '@shikijs/engine-javascript': 1.24.0 @@ -5512,12 +5716,23 @@ snapshots: '@types/hast': 3.0.4 hast-util-to-html: 9.0.3 + '@shikijs/engine-javascript@1.22.2': + dependencies: + '@shikijs/types': 1.22.2 + '@shikijs/vscode-textmate': 9.3.0 + oniguruma-to-js: 0.4.3 + '@shikijs/engine-javascript@1.24.0': dependencies: '@shikijs/types': 1.24.0 '@shikijs/vscode-textmate': 9.3.0 oniguruma-to-es: 0.7.0 + '@shikijs/engine-oniguruma@1.22.2': + dependencies: + '@shikijs/types': 1.22.2 + '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/engine-oniguruma@1.24.0': dependencies: '@shikijs/types': 1.24.0 @@ -5527,11 +5742,41 @@ snapshots: dependencies: shiki: 1.24.0 + '@shikijs/twoslash@1.22.2(typescript@5.7.2)': + dependencies: + '@shikijs/core': 1.22.2 + '@shikijs/types': 1.22.2 + twoslash: 0.2.12(typescript@5.7.2) + transitivePeerDependencies: + - supports-color + - typescript + + '@shikijs/types@1.22.2': + dependencies: + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + '@shikijs/types@1.24.0': dependencies: '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 + '@shikijs/vitepress-twoslash@1.22.2(typescript@5.7.2)': + dependencies: + '@shikijs/twoslash': 1.22.2(typescript@5.7.2) + floating-vue: 5.2.2(vue@3.5.13(typescript@5.7.2)) + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm: 3.0.0 + mdast-util-to-hast: 13.2.0 + shiki: 1.22.2 + twoslash: 0.2.12(typescript@5.7.2) + twoslash-vue: 0.2.12(typescript@5.7.2) + vue: 3.5.13(typescript@5.7.2) + transitivePeerDependencies: + - '@nuxt/kit' + - supports-color + - typescript + '@shikijs/vscode-textmate@9.3.0': {} '@sindresorhus/is@4.6.0': {} @@ -5713,6 +5958,10 @@ snapshots: '@types/cookie@0.6.0': {} + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + '@types/degit@2.8.6': {} '@types/estree@1.0.6': {} @@ -5744,6 +5993,8 @@ snapshots: '@types/minimist@1.2.5': {} + '@types/ms@0.7.34': {} + '@types/node@12.20.55': {} '@types/node@22.10.1': @@ -5782,6 +6033,13 @@ snapshots: '@types/web-bluetooth@0.0.20': {} + '@typescript/vfs@1.6.0(typescript@5.7.2)': + dependencies: + debug: 4.3.7(supports-color@9.4.0) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + '@ungap/structured-clone@1.2.0': {} '@vitejs/plugin-react-swc@3.7.2(@swc/helpers@0.5.13)(vite@6.0.1(@types/node@22.10.1)(jiti@2.4.1)(yaml@2.5.1))': @@ -6289,6 +6547,8 @@ snapshots: character-entities-legacy@3.0.0: {} + character-entities@2.0.2: {} + chardet@0.7.0: {} check-error@2.1.1: {} @@ -6494,6 +6754,10 @@ snapshots: decimal.js@10.4.3: optional: true + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + deep-eql@5.0.2: {} deepmerge@4.3.1: {} @@ -6802,6 +7066,12 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + floating-vue@5.2.2(vue@3.5.13(typescript@5.7.2)): + dependencies: + '@floating-ui/dom': 1.1.1 + vue: 3.5.13(typescript@5.7.2) + vue-resize: 2.0.0-alpha.1(vue@3.5.13(typescript@5.7.2)) + focus-trap@7.6.2: dependencies: tabbable: 6.2.0 @@ -7274,6 +7544,8 @@ snapshots: strip-ansi: 7.1.0 wrap-ansi: 9.0.0 + longest-streak@3.1.0: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -7312,6 +7584,8 @@ snapshots: mark.js@8.11.1: {} + markdown-table@3.0.4: {} + marked-terminal@7.2.1(marked@9.1.6): dependencies: ansi-escapes: 7.0.0 @@ -7325,6 +7599,92 @@ snapshots: marked@9.1.6: {} + mdast-util-find-and-replace@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.1 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.1.0 + + mdast-util-gfm-footnote@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + mdast-util-to-hast@13.2.0: dependencies: '@types/hast': 3.0.4 @@ -7337,6 +7697,22 @@ snapshots: unist-util-visit: 5.0.0 vfile: 6.0.3 + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdn-data@2.0.30: {} media-typer@0.3.0: {} @@ -7364,23 +7740,154 @@ snapshots: methods@1.1.2: {} + micromark-core-commonmark@2.0.2: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.1 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.1 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.1 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.1 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.1 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.1 + + micromark-util-character@2.1.0: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.1 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.0 + + micromark-util-encode@2.0.0: {} + micromark-util-encode@2.0.1: {} + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.1 + + micromark-util-sanitize-uri@2.0.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-sanitize-uri@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-encode: 2.0.1 micromark-util-symbol: 2.0.1 + micromark-util-subtokenize@2.0.2: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.1 + + micromark-util-symbol@2.0.0: {} + micromark-util-symbol@2.0.1: {} micromark-util-types@2.0.1: {} + micromark@4.0.1: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.7(supports-color@9.4.0) + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.1 + transitivePeerDependencies: + - supports-color + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -7572,6 +8079,10 @@ snapshots: regex: 5.0.2 regex-recursion: 4.3.0 + oniguruma-to-js@0.4.3: + dependencies: + regex: 4.4.0 + openapi-types@12.1.3: {} openapi-typescript-codegen@0.25.0: @@ -7841,6 +8352,8 @@ snapshots: regex-utilities@2.3.0: {} + regex@4.4.0: {} + regex@5.0.2: dependencies: regex-utilities: 2.3.0 @@ -8001,6 +8514,15 @@ snapshots: shebang-regex@3.0.0: {} + shiki@1.22.2: + dependencies: + '@shikijs/core': 1.22.2 + '@shikijs/engine-javascript': 1.22.2 + '@shikijs/engine-oniguruma': 1.22.2 + '@shikijs/types': 1.22.2 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + shiki@1.24.0: dependencies: '@shikijs/core': 1.24.0 @@ -8397,6 +8919,25 @@ snapshots: turbo-windows-64: 2.3.3 turbo-windows-arm64: 2.3.3 + twoslash-protocol@0.2.12: {} + + twoslash-vue@0.2.12(typescript@5.7.2): + dependencies: + '@vue/language-core': 2.1.6(typescript@5.7.2) + twoslash: 0.2.12(typescript@5.7.2) + twoslash-protocol: 0.2.12 + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + twoslash@0.2.12(typescript@5.7.2): + dependencies: + '@typescript/vfs': 1.6.0(typescript@5.7.2) + twoslash-protocol: 0.2.12 + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + type-fest@0.21.3: {} type-fest@1.4.0: {} @@ -8644,6 +9185,10 @@ snapshots: dependencies: vue: 3.5.13(typescript@5.7.2) + vue-resize@2.0.0-alpha.1(vue@3.5.13(typescript@5.7.2)): + dependencies: + vue: 3.5.13(typescript@5.7.2) + vue-tsc@2.1.6(typescript@5.7.2): dependencies: '@volar/typescript': 2.4.7