[{"data":1,"prerenderedAt":431},["ShallowReactive",2],{"category-tools":3},[4],{"id":5,"title":6,"body":7,"categories":413,"coverImage":417,"date":418,"description":419,"extension":420,"meta":421,"navigation":295,"path":422,"seo":423,"stem":424,"sticky":295,"tags":425,"__hash__":430},"articles/generare-sdk-javascript-waterline-con-aquasdk.md","AquaSDK: Genera SDK JavaScript in stile Waterline da specifiche OpenAPI",{"type":8,"value":9,"toc":403},"minimark",[10,23,28,56,60,65,132,184,188,226,230,318,322,329,340,344,363,366,371,391,399],[11,12,13,14,18,19,22],"p",{},"Nel mondo dello sviluppo moderno, la capacità di ",[15,16,17],"strong",{},"integrare rapidamente API"," è tanto cruciale quanto frustrante. Quante ore abbiamo perso a scrivere manualmente client SDK pieni di boilerplate? È per risolvere questo problema che ho creato ",[15,20,21],{},"AquaSDK",", uno strumento open-source che genera automaticamente SDK JavaScript con sintassi fluida e intuitiva partendo da qualsiasi specifica OpenAPI.",[24,25,27],"h2",{"id":26},"perché-automatizzare-la-generazione-di-sdk","Perché automatizzare la generazione di SDK?",[29,30,31,38,44,50],"ul",{},[32,33,34,37],"li",{},[15,35,36],{},"⏱️ Riduzione del 70% del tempo di sviluppo"," per integrazioni API",[32,39,40,43],{},[15,41,42],{},"🔒 Consistenza automatica"," tra documentazione OpenAPI e implementazione",[32,45,46,49],{},[15,47,48],{},"🚀 Esperienza developer-friendly"," con sintassi simile a Waterline ORM",[32,51,52,55],{},[15,53,54],{},"💡 Supporto nativo a Promise/async"," per codice asincrono pulito",[24,57,59],{"id":58},"funzionalità-avanzate-per-sviluppatori","Funzionalità avanzate per sviluppatori",[61,62,64],"h3",{"id":63},"per-gli-integratori-api","Per gli Integratori API",[29,66,67,118,126],{},[32,68,69,72,75,76],{},[15,70,71],{},"Sintassi a catena fluida",[73,74],"br",{},"\nInteragisci con le API come se utilizzassi un ORM:",[77,78,83],"pre",{"className":79,"code":80,"language":81,"meta":82,"style":82},"language-javascript shiki shiki-themes github-light github-dark","await api.utenti\n  .find({ ruolo: 'admin', iscrizione: { '>': '2024-01-01' } })\n  .limit(10)\n  .populate('ordini')\n  .execute();\n","javascript","",[84,85,86,94,100,106,112],"code",{"__ignoreMap":82},[87,88,91],"span",{"class":89,"line":90},"line",1,[87,92,93],{},"await api.utenti\n",[87,95,97],{"class":89,"line":96},2,[87,98,99],{},"  .find({ ruolo: 'admin', iscrizione: { '>': '2024-01-01' } })\n",[87,101,103],{"class":89,"line":102},3,[87,104,105],{},"  .limit(10)\n",[87,107,109],{"class":89,"line":108},4,[87,110,111],{},"  .populate('ordini')\n",[87,113,115],{"class":89,"line":114},5,[87,116,117],{},"  .execute();\n",[32,119,120,123,125],{},[15,121,122],{},"Validazione automatica",[73,124],{},"\nControllo degli input basato sugli schemi OpenAPI prima delle chiamate API",[32,127,128,131],{},[15,129,130],{},"Generazione completa dell'SDK","*\nAquaSDK non si limita a produrre semplici wrapper API. Ogni SDK generato include:",[77,133,137],{"className":134,"code":135,"language":136,"meta":82,"style":82},"language-bash shiki shiki-themes github-light github-dark","├── README.md # Documentazione automatica con esempi d'uso\n├── models/   # Modelli dati validati basati sugli schemi OpenAPI\n├── resources/ # Controller pronti per ogni endpoint API\n└── utils/     # Helper per query complesse\n","bash",[84,138,139,153,163,173],{"__ignoreMap":82},[87,140,141,145,149],{"class":89,"line":90},[87,142,144],{"class":143},"sScJk","├──",[87,146,148],{"class":147},"sZZnC"," README.md",[87,150,152],{"class":151},"sJ8bj"," # Documentazione automatica con esempi d'uso\n",[87,154,155,157,160],{"class":89,"line":96},[87,156,144],{"class":143},[87,158,159],{"class":147}," models/",[87,161,162],{"class":151},"   # Modelli dati validati basati sugli schemi OpenAPI\n",[87,164,165,167,170],{"class":89,"line":102},[87,166,144],{"class":143},[87,168,169],{"class":147}," resources/",[87,171,172],{"class":151}," # Controller pronti per ogni endpoint API\n",[87,174,175,178,181],{"class":89,"line":108},[87,176,177],{"class":143},"└──",[87,179,180],{"class":147}," utils/",[87,182,183],{"class":151},"     # Helper per query complesse\n",[61,185,187],{"id":186},"per-i-maintainer","Per i Maintainer",[29,189,190,218],{},[32,191,192,195],{},[15,193,194],{},"Configurazione plug-and-play",[77,196,198],{"className":134,"code":197,"language":136,"meta":82,"style":82},"generate-sdk ./swagger.json ./sdk 1.0.0 --verbose\n",[84,199,200],{"__ignoreMap":82},[87,201,202,205,208,211,215],{"class":89,"line":90},[87,203,204],{"class":143},"generate-sdk",[87,206,207],{"class":147}," ./swagger.json",[87,209,210],{"class":147}," ./sdk",[87,212,214],{"class":213},"sj4cs"," 1.0.0",[87,216,217],{"class":213}," --verbose\n",[32,219,220,223,225],{},[15,221,222],{},"Integrazione CI/CD",[73,224],{},"\nRigenera automaticamente l'SDK ad ogni aggiornamento dell'API",[24,227,229],{"id":228},"come-iniziare-in-3-passi","Come iniziare in 3 passi",[231,232,233,255,278],"ol",{},[32,234,235,236],{},"Installa il pacchetto globale:",[77,237,239],{"className":134,"code":238,"language":136,"meta":82,"style":82},"npm install -g aquasdk\n",[84,240,241],{"__ignoreMap":82},[87,242,243,246,249,252],{"class":89,"line":90},[87,244,245],{"class":143},"npm",[87,247,248],{"class":147}," install",[87,250,251],{"class":213}," -g",[87,253,254],{"class":147}," aquasdk\n",[32,256,257,258],{},"Genera il tuo SDK:",[77,259,261],{"className":134,"code":260,"language":136,"meta":82,"style":82},"generate-sdk ./api-spec.yaml ./sdk --version 1.0.0\n",[84,262,263],{"__ignoreMap":82},[87,264,265,267,270,272,275],{"class":89,"line":90},[87,266,204],{"class":143},[87,268,269],{"class":147}," ./api-spec.yaml",[87,271,210],{"class":147},[87,273,274],{"class":213}," --version",[87,276,277],{"class":213}," 1.0.0\n",[32,279,280,281],{},"Integra nel tuo progetto:",[77,282,284],{"className":79,"code":283,"language":81,"meta":82,"style":82},"import API from './sdk';\n\nconst api = new API({\n  baseUrl: 'https://api.azienda.com',\n  auth: { token: process.env.API_KEY }\n});\n",[84,285,286,291,297,302,307,312],{"__ignoreMap":82},[87,287,288],{"class":89,"line":90},[87,289,290],{},"import API from './sdk';\n",[87,292,293],{"class":89,"line":96},[87,294,296],{"emptyLinePlaceholder":295},true,"\n",[87,298,299],{"class":89,"line":102},[87,300,301],{},"const api = new API({\n",[87,303,304],{"class":89,"line":108},[87,305,306],{},"  baseUrl: 'https://api.azienda.com',\n",[87,308,309],{"class":89,"line":114},[87,310,311],{},"  auth: { token: process.env.API_KEY }\n",[87,313,315],{"class":89,"line":314},6,[87,316,317],{},"});\n",[24,319,321],{"id":320},"perché-open-source","Perché open-source?",[11,323,324,325,328],{},"AquaSDK è rilasciato sotto licenza ",[15,326,327],{},"GPL-3.0"," perché credo che:",[29,330,331,334,337],{},[32,332,333],{},"Gli strumenti fondamentali per lo sviluppo debbano essere accessibili a tutti",[32,335,336],{},"La collaborazione comunitaria produce soluzioni migliori",[32,338,339],{},"La trasparenza genera fiducia",[24,341,343],{"id":342},"prossimi-sviluppi","Prossimi sviluppi",[29,345,348,357],{"className":346},[347],"contains-task-list",[32,349,352,356],{"className":350},[351],"task-list-item",[353,354],"input",{"disabled":295,"type":355},"checkbox"," Generazione automatica di documentazione SDK",[32,358,360,362],{"className":359},[351],[353,361],{"disabled":295,"type":355}," Supporto Typescript",[364,365],"hr",{},[11,367,368],{},[15,369,370],{},"Vuoi provare AquaSDK o contribuire al progetto?",[29,372,373,383],{},[32,374,375,376],{},"🐙 GitHub: ",[377,378,382],"a",{"href":379,"rel":380},"https://github.com/enricodeleo/aquasdk",[381],"nofollow","github.com/enricodeleo/aquasdk",[32,384,385,386],{},"📦 npm: ",[377,387,390],{"href":388,"rel":389},"https://www.npmjs.com/package/aquasdk",[381],"npmjs.com/package/aquasdk",[11,392,393,394,398],{},"Per integrazioni enterprise o supporto personalizzato, ",[377,395,397],{"href":396},"mailto:hello@enricodeleo.com","contattami direttamente",".",[400,401,402],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":82,"searchDepth":96,"depth":96,"links":404},[405,406,410,411,412],{"id":26,"depth":96,"text":27},{"id":58,"depth":96,"text":59,"children":407},[408,409],{"id":63,"depth":102,"text":64},{"id":186,"depth":102,"text":187},{"id":228,"depth":96,"text":229},{"id":320,"depth":96,"text":321},{"id":342,"depth":96,"text":343},[414,415,416],"dev","tools","api","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/aquasdk-cover.jpg","2025-03-11T17:00:00.000Z","Come trasformare qualsiasi specifica OpenAPI in un SDK JavaScript intuitivo con sintassi simile a Waterline ORM: la soluzione per integrazioni API veloci e senza boilerplate","md",{},"/generare-sdk-javascript-waterline-con-aquasdk",{"title":6,"description":419},"generare-sdk-javascript-waterline-con-aquasdk",[81,426,427,428,429],"openapi","sdk","rest","developer-tools","77iS9QYVT1OJ4NuE9EjRe48k0fsby1X1WLULVndW9Zg",1777303094710]