mulink 1.1.5 → 1.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/core/types.ts","../../src/utils/logger.ts","../../src/utils/version-checker.ts","../../src/core/schema-parser.ts","../../src/generators/nextjs/api-client-generator.ts","../../src/utils/naming-helpers.ts","../../src/generators/nextjs/schema-generator.ts","../../src/generators/nextjs/action-generator.ts","../../src/generators/nextjs/hook-generator.ts","../../src/generators/nextjs/auth-generator.ts","../../src/core/schema-analyzer.ts","../../src/generators/nextjs/nextauth-generator.ts","../../src/generators/nextjs/middleware-generator.ts","../../src/generators/nextjs/upload-generator.ts","../../src/generators/nextjs/error-handler-generator.ts","../../src/generators/nextjs/sse-generator.ts","../../src/generators/nextjs/index.ts","../../src/utils/file-manager.ts","../../src/core/bridge-core.ts","../../src/config/configuration-loader.ts"],"names":["LogLevel","path","z","fs"],"mappings":";;;;;;;;;AA6WO,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAAA,EA7WvC;AA6WuC,IAAA,MAAA,CAAA,IAAA,EAAA,aAAA,CAAA;AAAA;AAAA,EACrB,IAAA;AAAA,EACA,OAAA;AAAA,EAEhB,WAAA,CACE,OAAA,EACA,IAAA,EACA,OAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AACF;AAEO,IAAM,eAAA,GAAN,cAA8B,WAAA,CAAY;AAAA,EA7XjD;AA6XiD,IAAA,MAAA,CAAA,IAAA,EAAA,iBAAA,CAAA;AAAA;AAAA,EAC/B,MAAA;AAAA,EAEhB,WAAA,CACE,SACA,MAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,oBAAoB,MAAM,CAAA;AACzC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AACF;AAEO,IAAM,gBAAA,GAAN,cAA+B,WAAA,CAAY;AAAA,EAzYlD;AAyYkD,IAAA,MAAA,CAAA,IAAA,EAAA,kBAAA,CAAA;AAAA;AAAA,EAChC,SAAA;AAAA,EAEhB,WAAA,CACE,SACA,SAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,oBAAA,EAAsB,EAAE,SAAA,EAAW,CAAA;AAClD,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AACF;AAEO,IAAM,eAAA,GAAN,cAA8B,WAAA,CAAY;AAAA,EArZjD;AAqZiD,IAAA,MAAA,CAAA,IAAA,EAAA,iBAAA,CAAA;AAAA;AAAA,EAC/B,IAAA;AAAA,EAEhB,WAAA,CACE,SACA,IAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,kBAAA,EAAoB,EAAE,IAAA,EAAM,CAAA;AAC3C,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF;;;AC/ZO,IAAK,QAAA,qBAAAA,SAAAA,KAAL;AACL,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AAJU,EAAA,OAAAA,SAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA;AAcZ,IAAM,MAAA,GAAS;AAAA,EACb,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,KAAA,EAAO,UAAA;AAAA,EACP,MAAA,EAAQ,UAAA;AAAA,EACR,IAAA,EAAM,UAAA;AAAA,EACN,IAAA,EAAM,UAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEA,SAAS,QAAA,CAAS,MAAc,KAAA,EAAoC;AAClE,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAO,OAAO,IAAA;AAClC,EAAA,OAAO,CAAA,EAAG,OAAO,KAAK,CAAC,GAAG,IAAI,CAAA,EAAG,OAAO,KAAK,CAAA,CAAA;AAC/C;AAHS,MAAA,CAAA,QAAA,EAAA,UAAA,CAAA;AAKF,IAAM,eAAN,MAAmB;AAAA,EA9B1B;AA8B0B,IAAA,MAAA,CAAA,IAAA,EAAA,cAAA,CAAA;AAAA;AAAA,EACjB,OAAA;AAAA,EAEP,WAAA,CAAY,OAAA,GAAyB,EAAC,EAAG;AACvC,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,EAAA;AAAA,MACR,SAAA,EAAW,IAAA;AAAA,MACX,MAAA,EAAQ,IAAA;AAAA,MACR,GAAG;AAAA,KACL;AAAA,EACF;AAAA,EAEQ,UAAU,KAAA,EAA0B;AAC1C,IAAA,OAAO,KAAA,IAAS,KAAK,OAAA,CAAQ,KAAA;AAAA,EAC/B;AAAA,EAEQ,aAAA,CAAc,KAAA,EAAiB,OAAA,EAAA,GAAoB,IAAA,EAAyB;AAClF,IAAA,IAAI,SAAA,GAAY,OAAA;AAEhB,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,MAAA,SAAA,GAAY,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,IAAA,CACvB,IAAI,CAAA,GAAA,KAAQ,OAAO,QAAQ,QAAA,GAAW,IAAA,CAAK,UAAU,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA,GAAI,MAAA,CAAO,GAAG,CAAE,CAAA,CACjF,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,IACd;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,MAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,MAAA,SAAA,GAAY,CAAA,CAAA,EAAI,SAAS,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA;AAAA,IACzC;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,SAAA,GAAY,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,MAAM,IAAI,SAAS,CAAA,CAAA;AAAA,IACjD;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEA,KAAA,CAAM,YAAoB,IAAA,EAAuB;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,CAAA,aAAc,EAAG;AACrC,IAAA,MAAM,YAAY,IAAA,CAAK,aAAA,CAAc,CAAA,cAAgB,OAAA,EAAS,GAAG,IAAI,CAAA;AACrE,IAAA,OAAA,CAAQ,KAAA,CAAM,KAAK,OAAA,CAAQ,MAAA,GAAS,SAAS,SAAA,EAAW,MAAM,IAAI,SAAS,CAAA;AAAA,EAC7E;AAAA,EAEA,IAAA,CAAK,YAAoB,IAAA,EAAuB;AAC9C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,CAAA,YAAa,EAAG;AACpC,IAAA,MAAM,YAAY,IAAA,CAAK,aAAA,CAAc,CAAA,aAAe,OAAA,EAAS,GAAG,IAAI,CAAA;AACpE,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,GAAS,SAAS,SAAA,EAAW,MAAM,IAAI,SAAS,CAAA;AAAA,EAC5E;AAAA,EAEA,OAAA,CAAQ,YAAoB,IAAA,EAAuB;AACjD,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,CAAA,YAAa,EAAG;AACpC,IAAA,MAAM,YAAY,IAAA,CAAK,aAAA,CAAc,CAAA,aAAe,OAAA,EAAS,GAAG,IAAI,CAAA;AACpE,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,GAAS,SAAS,SAAA,EAAW,OAAO,IAAI,SAAS,CAAA;AAAA,EAC7E;AAAA,EAEA,IAAA,CAAK,YAAoB,IAAA,EAAuB;AAC9C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,CAAA,YAAa,EAAG;AACpC,IAAA,MAAM,YAAY,IAAA,CAAK,aAAA,CAAc,CAAA,aAAe,OAAA,EAAS,GAAG,IAAI,CAAA;AACpE,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,GAAS,SAAS,SAAA,EAAW,QAAQ,IAAI,SAAS,CAAA;AAAA,EAC9E;AAAA,EAEA,KAAA,CAAM,YAAoB,IAAA,EAAuB;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,CAAA,aAAc,EAAG;AACrC,IAAA,MAAM,YAAY,IAAA,CAAK,aAAA,CAAc,CAAA,cAAgB,OAAA,EAAS,GAAG,IAAI,CAAA;AACrE,IAAA,OAAA,CAAQ,KAAA,CAAM,KAAK,OAAA,CAAQ,MAAA,GAAS,SAAS,SAAA,EAAW,KAAK,IAAI,SAAS,CAAA;AAAA,EAC5E;AAAA,EAEA,QAAQ,OAAA,EAIN;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAC,OAAA,CAAQ,OAAO,KAAA,EAAO;AACjD,MAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,MAAA,OAAO;AAAA,QACL,OAAA,kBAAS,MAAA,CAAA,CAAA,GAAA,KAAO,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,CAAA,OAAA,EAAK,GAAA,IAAO,OAAA,IAAW,EAAE,CAAA,CAAA,EAAI,OAAO,CAAC,CAAA,EAAjE,SAAA,CAAA;AAAA,QACT,IAAA,kBAAM,MAAA,CAAA,CAAA,GAAA,KAAO,OAAA,CAAQ,KAAA,CAAM,QAAA,CAAS,CAAA,OAAA,EAAK,GAAA,IAAO,OAAA,IAAW,EAAE,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,EAAjE,MAAA,CAAA;AAAA,QACN,sBAAM,MAAA,CAAA,MAAM;AAAA,QAAC,CAAA,EAAP,MAAA;AAAA,OACR;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,CAAC,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAG,CAAA;AAChE,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,MAAM,QAAA,GAAW,YAAY,MAAM;AACjC,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAA,EAAK,QAAA,CAAS,MAAA,CAAO,CAAA,EAAA,GAAM,MAAA,CAAO,MAAM,CAAA,EAAG,MAAM,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAA,IACtF,GAAG,GAAG,CAAA;AAEN,IAAA,OAAO;AAAA,MACL,yBAAS,MAAA,CAAA,CAAA,GAAA,KAAO;AACd,QAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAA,EAAK,QAAA,CAAS,QAAA,EAAK,OAAO,CAAC,CAAA,CAAA,EAAI,GAAA,IAAO,OAAA,IAAW,EAAE;AAAA,CAAI,CAAA;AAAA,MAC9E,CAAA,EAHS,SAAA,CAAA;AAAA,MAIT,sBAAM,MAAA,CAAA,CAAA,GAAA,KAAO;AACX,QAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAA,EAAK,QAAA,CAAS,QAAA,EAAK,KAAK,CAAC,CAAA,CAAA,EAAI,GAAA,IAAO,OAAA,IAAW,EAAE;AAAA,CAAI,CAAA;AAAA,MAC5E,CAAA,EAHM,MAAA,CAAA;AAAA,MAIN,sBAAM,MAAA,CAAA,MAAM;AACV,QAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,MAC3B,CAAA,EAHM,MAAA;AAAA,KAIR;AAAA,EACF;AACF;AChHO,IAAM,iBAAN,MAAqB;AAAA,EArB5B;AAqB4B,IAAA,MAAA,CAAA,IAAA,EAAA,gBAAA,CAAA;AAAA;AAAA,EAClB,MAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,KAAA,uBAAmE,GAAA,EAAI;AAAA,EAC9D,cAAA,GAAiB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAAA;AAAA,EAEjD,WAAA,CAAY,WAAA,EAAqB,cAAA,EAAwB,MAAA,EAAuB;AAC9E,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,cAAA,GAAiB,cAAA;AACtB,IAAA,IAAA,CAAK,SAAS,MAAA,IAAU,IAAI,aAAa,EAAE,MAAA,EAAQ,2BAAoB,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,GAA+C;AACnD,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,KAAK,gBAAA,EAAiB;AACrC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,yBAAyB,CAAA;AAG3C,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,kBAAA,EAAmB;AAEpD,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,gCAAgC,CAAA;AAClD,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,WAAA,GAA2B;AAAA,QAC/B,SAAS,IAAA,CAAK,cAAA;AAAA,QACd,MAAA,EAAQ,aAAA;AAAA,QACR,UAAA,EAAY,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,gBAAgB,aAAa,CAAA;AAAA,QACrE,eAAA,EAAiB,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,gBAAgB,aAAa;AAAA,OAC5E;AAGA,MAAA,IAAA,CAAK,aAAa,WAAW,CAAA;AAE7B,MAAA,OAAO,WAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,uBAAA,EAAyB,KAAK,CAAA;AAChD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,GAAuC;AACrC,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AAGxB,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAA,EAAK,gBAAgB,CAAC,CAAA,EAAG;AAC3C,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAA,EAAK,WAAW,CAAC,CAAA,EAAG;AACtC,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAA,EAAK,WAAW,CAAC,CAAA,EAAG;AACtC,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAA,EAAK,mBAAmB,CAAC,CAAA,EAAG;AAC9C,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAA,EAAK,cAAc,CAAC,CAAA,EAAG;AACzC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,WAAA,EAAkC;AAClD,IAAA,MAAM,cAAA,GAAiB,KAAK,oBAAA,EAAqB;AAEjD,IAAA,QAAQ,cAAA;AAAgB,MACtB,KAAK,MAAA;AACH,QAAA,OAAO,CAAA,aAAA,EAAgB,KAAK,WAAW,CAAA,CAAA;AAAA,MACzC,KAAK,MAAA;AACH,QAAA,OAAO,CAAA,YAAA,EAAe,KAAK,WAAW,CAAA,CAAA;AAAA,MACxC,KAAK,KAAA;AACH,QAAA,OAAO,CAAA,WAAA,EAAc,KAAK,WAAW,CAAA,CAAA;AAAA,MACvC,KAAK,KAAA;AAAA,MACL;AACE,QAAA,OAAO,CAAA,WAAA,EAAc,KAAK,WAAW,CAAA,CAAA;AAAA;AACzC,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,WAAA,EAAkC;AACjD,IAAA,IAAI,CAAC,YAAY,eAAA,EAAiB;AAChC,MAAA,OAAO,CAAA,wCAAA,EAAsC,YAAY,OAAO,CAAA,CAAA,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,iBAAA,CAAkB,WAAW,CAAA;AACzD,IAAA,OAAO,CAAA,4BAAA,EAAwB,WAAA,CAAY,OAAO,CAAA,QAAA,EAAM,YAAY,MAAM;;AAAA,QAAA,EAEpE,cAAc,CAAA,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAMA,yBAAA,CAA0B,WAAA,EAA0B,OAAA,GAIhD,EAAC,EAAS;AACZ,IAAA,MAAM,EAAE,cAAA,GAAiB,KAAA,EAAO,QAAQ,KAAA,EAAO,YAAA,GAAe,OAAM,GAAI,OAAA;AAExE,IAAA,IAAI,CAAC,WAAA,CAAY,eAAA,IAAmB,CAAC,cAAA,IAAkB,CAAC,KAAA,EAAO;AAC7D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,YAAY,eAAA,EAAiB;AAC/B,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,CAAiB,WAAW,CAAA;AACjD,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,MAC1B;AAAA,IAEF,WAAW,cAAA,EAAgB;AACzB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,CAAiB,WAAW,CAAA;AACjD,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAA,GAA6C;AACzD,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,CAAA,2BAAA,EAA8B,IAAA,CAAK,WAAW,CAAA,CAAA;AAElE,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,WAAA,EAAa;AAAA,QACxC,OAAA,EAAS;AAAA,UACP,QAAA,EAAU,kBAAA;AAAA,UACV,cAAc,CAAA,EAAG,IAAA,CAAK,WAAW,CAAA,CAAA,EAAI,KAAK,cAAc,CAAA;AAAA;AAC1D,OACD,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,MAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,MACnE;AAEA,MAAA,MAAM,WAAA,GAA8B,MAAM,QAAA,CAAS,IAAA,EAAK;AACxD,MAAA,OAAO,WAAA,CAAY,WAAW,CAAA,CAAE,MAAA;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,iCAAA,EAAmC,KAAK,CAAA;AAC1D,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,CAAkB,SAAiB,MAAA,EAAyB;AAClE,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AAC9C,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAE5C,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,aAAa,MAAA,EAAQ,WAAA,CAAY,MAAM,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1E,QAAA,MAAM,WAAA,GAAc,YAAA,CAAa,CAAC,CAAA,IAAK,CAAA;AACvC,QAAA,MAAM,UAAA,GAAa,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA;AAErC,QAAA,IAAI,aAAa,WAAA,EAAa;AAC5B,UAAA,OAAO,IAAA;AAAA,QACT,CAAA,MAAA,IAAW,aAAa,WAAA,EAAa;AACnC,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,KAAK,CAAA;AACrD,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,OAAA,EAA2B;AAE9C,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAClD,IAAA,OAAO,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAA,IAAA,KAAQ;AACzC,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA;AAC7B,MAAA,OAAO,KAAA,CAAM,GAAG,CAAA,GAAI,CAAA,GAAI,GAAA;AAAA,IAC1B,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,GAAuC;AAC7C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,WAAW,CAAA;AAC9C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,GAAA,GAAM,MAAA,CAAO,SAAA,GAAY,IAAA,CAAK,cAAA,EAAgB;AAChD,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AAClC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,WAAA,EAAgC;AACnD,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,WAAA,EAAa;AAAA,MAC/B,IAAA,EAAM,WAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA;AAAI,KACrB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AACF;AAKO,SAAS,2BAA2B,MAAA,EAAuC;AAChF,EAAA,MAAM,WAAA,GAAc,QAAA;AAGpB,EAAA,IAAI,cAAA,GAAiB,OAAA;AAErB,EAAA,IAAI;AAEF,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,EAAW,IAAA,EAAM,MAAM,cAAc,CAAA;AAC1D,IAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACvB,MAAA,MAAM,SAAS,YAAA,CAAa,OAAA,EAAS,EAAE,QAAA,EAAU,SAAS,CAAA;AAC1D,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAC7B,MAAA,IAAI,GAAA,IAAO,IAAI,OAAA,EAAS;AACtB,QAAA,cAAA,GAAiB,GAAA,CAAI,OAAA;AAAA,MACvB;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,cAAc,CAAA;AACjD,MAAA,IAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AACtB,QAAA,MAAM,SAAS,YAAA,CAAa,MAAA,EAAQ,EAAE,QAAA,EAAU,SAAS,CAAA;AACzD,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAC7B,QAAA,IAAI,GAAA,IAAO,IAAI,OAAA,EAAS;AACtB,UAAA,cAAA,GAAiB,GAAA,CAAI,OAAA;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,MAAA,IAAU,IAAI,aAAa,EAAE,MAAA,EAAQ,2BAAoB,CAAA;AACnE,IAAA,CAAA,CAAE,KAAA,CAAM,4EAA4E,GAAG,CAAA;AAAA,EACzF;AAEA,EAAA,OAAO,IAAI,cAAA,CAAe,WAAA,EAAa,cAAA,EAAgB,MAAM,CAAA;AAC/D;AAhCgB,MAAA,CAAA,0BAAA,EAAA,4BAAA,CAAA;AAqChB,eAAsB,qBAAA,CAAsB,OAAA,GAKxC,EAAC,EAAgC;AACnC,EAAA,MAAM,EAAE,iBAAiB,KAAA,EAAO,KAAA,GAAQ,OAAO,YAAA,GAAe,KAAA,EAAO,QAAO,GAAI,OAAA;AAEhF,EAAA,MAAM,cAAA,GAAiB,2BAA2B,MAAM,CAAA;AACxD,EAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,eAAA,EAAgB;AAEzD,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,cAAA,CAAe,0BAA0B,WAAA,EAAa,EAAE,cAAA,EAAgB,KAAA,EAAO,cAAc,CAAA;AAAA,EAC/F;AAEA,EAAA,OAAO,WAAA;AACT;AAhBsB,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;ACvSf,IAAM,sBAAN,MAA0B;AAAA,EAnBjC;AAmBiC,IAAA,MAAA,CAAA,IAAA,EAAA,qBAAA,CAAA;AAAA;AAAA,EACvB,WAAA,uBAAkB,GAAA,EAA6B;AAAA,EAGvD,MAAM,MAAM,SAAA,EAA6C;AAEvD,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AACnC,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAAA,IACvC;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA;AACjD,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AAGtD,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAA,EAAW,YAAY,CAAA;AAC5C,MAAA,OAAO,YAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,wBAAA,EAA2B,OAAO,IAAI,SAAS,CAAA;AAAA,IAC5E;AAAA,EACF;AAAA,EAEA,MAAc,YAAY,SAAA,EAA6C;AACrE,IAAA,MAAM,iBAAiB,0BAAA,EAA2B;AAClD,IAAA,MAAM,cAAA,GAAiB,eAAe,iBAAA,EAAkB;AACxD,IAAA,IAAI,CAAC,SAAA,EAAW,IAAA,EAAK,EAAG;AACtB,MAAA,MAAM,IAAI,gBAAA,CAAiB,4CAAA,EAA8C,SAAS,CAAA;AAAA,IACpF;AAEA,IAAA,IAAI,SAAA,CAAU,UAAA,CAAW,MAAM,CAAA,EAAG;AAEhC,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,GAAK,CAAA;AAE5D,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,SAAA,EAAW;AAAA,UACtC,OAAA,EAAS;AAAA,YACP,QAAA,EAAU,+CAAA;AAAA,YACV,YAAA,EAAc,UAAU,cAAc,CAAA;AAAA,WACxC;AAAA,UACA,QAAQ,UAAA,CAAW;AAAA,SACpB,CAAA;AAED,QAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,gBAAA;AAAA,YACR,CAAA,wBAAA,EAA2B,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA,CAAA;AAAA,YACjE;AAAA,WACF;AAAA,QACF;AAEA,QAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AAC5D,QAAA,IAAI,CAAC,WAAA,CAAY,QAAA,CAAS,kBAAkB,KAAK,CAAC,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,IAAK,CAAC,WAAA,CAAY,QAAA,CAAS,WAAW,CAAA,EAAG;AAChI,UAAA,MAAM,IAAI,gBAAA;AAAA,YACR,6BAA6B,WAAW,CAAA,wBAAA,CAAA;AAAA,YACxC;AAAA,WACF;AAAA,QACF;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,UAAA,MAAM,IAAI,gBAAA,CAAiB,6CAAA,EAA+C,SAAS,CAAA;AAAA,QACrF;AAEA,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,QAAA,IAAI,iBAAiB,gBAAA,EAAkB;AACrC,UAAA,MAAM,KAAA;AAAA,QACR;AAEA,QAAA,IAAI,KAAA,YAAiB,UAAU,KAAA,CAAM,IAAA,KAAS,gBAAgB,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,CAAA,EAAI;AAChG,UAAA,MAAM,IAAI,gBAAA,CAAiB,2DAAA,EAA6D,SAAS,CAAA;AAAA,QACnG;AACA,QAAA,MAAM,YAAA,GAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAC9D,QAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,eAAA,EAAkB,YAAY,IAAI,SAAS,CAAA;AAAA,MACxE;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,yEAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,cAAc,QAAA,EAAqD;AAC/E,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AAC3C,IAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,iBAAA,CAAkB,QAAA,EAAU,OAAO,CAAA;AAEnE,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,QAAA,EAAU,kBAAA;AAAA,MACV,WAAA,EAAa,kBAAA;AAAA,MACb,SAAA,EAAW,IAAA,CAAK,gBAAA,CAAiB,kBAAkB,CAAA;AAAA,MACnD,OAAA,EAAS,IAAA,CAAK,cAAA,CAAe,kBAAkB,CAAA;AAAA,MAC/C,QAAA,EAAU,IAAA,CAAK,eAAA,CAAgB,kBAAkB,CAAA;AAAA,MACjD,OAAA,EAAS,IAAA,CAAK,cAAA,CAAe,kBAAA,EAAoB,QAAQ,CAAA;AAAA,MACzD,QAAA,EAAU,IAAA,CAAK,eAAA,CAAgB,kBAAkB;AAAA,KACnD;AAAA,EACF;AAAA,EAEQ,cAAc,QAAA,EAAkD;AACtE,IAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC7C,MAAA,MAAM,IAAI,gBAAA,CAAiB,sCAAA,EAAwC,SAAS,CAAA;AAAA,IAC9E;AAEA,IAAA,IAAI,aAAa,QAAA,EAAU;AACzB,MAAA,MAAM,iBAAkB,QAAA,CAAiB,OAAA;AACzC,MAAA,IAAI,OAAO,cAAA,KAAmB,QAAA,IAAY,cAAA,CAAe,UAAA,CAAW,IAAI,CAAA,EAAG;AACzE,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,6BAAA,EAAgC,cAAc,IAAI,SAAS,CAAA;AAAA,IACxF,CAAA,MAAA,IAAW,aAAa,QAAA,EAAU;AAChC,MAAA,MAAM,iBAAkB,QAAA,CAAiB,OAAA;AACzC,MAAA,IAAI,OAAO,mBAAmB,QAAA,EAAU;AACtC,QAAA,IAAI,cAAA,CAAe,UAAA,CAAW,KAAK,CAAA,EAAG,OAAO,KAAA;AAC7C,QAAA,IAAI,cAAA,CAAe,UAAA,CAAW,KAAK,CAAA,EAAG,OAAO,KAAA;AAC7C,QAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,6BAAA,EAAgC,cAAc,IAAI,SAAS,CAAA;AAAA,MACxF;AACA,MAAA,MAAM,IAAI,gBAAA,CAAiB,gCAAA,EAAkC,SAAS,CAAA;AAAA,IACxE;AAEA,IAAA,MAAM,IAAI,gBAAA,CAAiB,oFAAA,EAAsF,SAAS,CAAA;AAAA,EAC5H;AAAA,EAEQ,iBAAA,CACN,UACA,OAAA,EACoB;AACpB,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,OAAO,IAAA,CAAK,cAAc,QAA8B,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,cAAc,KAAA,EAA+C;AACnE,IAAA,MAAM,KAAA,GAA4B;AAAA,MAChC,OAAA,EAAS,OAAA;AAAA,MACT,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,OAAA,EAAS,MAAM,IAAA,GACX;AAAA,QACE;AAAA,UACE,GAAA,EAAK,CAAA,EAAG,KAAA,CAAM,OAAA,GAAU,CAAC,CAAA,IAAK,OAAO,CAAA,GAAA,EAAM,KAAA,CAAM,IAAI,CAAA,EAAG,KAAA,CAAM,YAAY,EAAE,CAAA;AAAA;AAC9E,UAEF,EAAC;AAAA,MACL,OAAO,EAAC;AAAA,MACR,UAAA,EAAY;AAAA,QACV,SAAS,EAAC;AAAA,QACV,iBAAiB;AAAC;AACpB,KACF;AAGA,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,KAAA,MAAW,CAACC,OAAM,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,EAAG;AAC1D,QAAA,IAAI,CAAC,QAAA,EAAU;AAEf,QAAA,MAAM,aAAuC,EAAC;AAG9C,QAAA,IAAI,SAAS,UAAA,EAAY;AACvB,UAAA,UAAA,CAAW,UAAA,GAAa,QAAA,CAAS,UAAA,CAAW,GAAA,CAAI,CAAA,KAAA,KAAS;AACvD,YAAA,IAAI,UAAU,KAAA,EAAO;AACnB,cAAA,OAAO,KAAA;AAAA,YACT,CAAA,MAAO;AACL,cAAA,MAAM,OAAA,GAAU,KAAA;AAChB,cAAA,MAAM,OAAA,GAAqC;AAAA,gBACzC,MAAM,OAAA,CAAQ,IAAA;AAAA,gBACd,IAAI,OAAA,CAAQ,EAAA;AAAA,gBACZ,UAAU,OAAA,CAAQ,QAAA;AAAA,gBAClB,aAAa,OAAA,CAAQ,WAAA;AAAA,gBACrB,UAAA,EAAY,QAAQ,cAAc,CAAA;AAAA,gBAClC,MAAA,EAAQ;AAAA,kBACN,MAAM,OAAA,CAAQ,IAAA;AAAA,kBACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,kBAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,kBACjB,SAAS,OAAA,CAAQ,OAAA;AAAA,kBACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,kBACnB,WAAW,OAAA,CAAQ,SAAA;AAAA,kBACnB,SAAS,OAAA,CAAQ,OAAA;AAAA,kBACjB,MAAM,OAAA,CAAQ;AAAA;AAChB,eACF;AACA,cAAA,OAAO,OAAA;AAAA,YACT;AAAA,UACF,CAAC,CAAA;AAAA,QACH;AAEA,QAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC1D,UAAA,IAAI,WAAW,YAAA,IAAgB,CAAC,SAAA,IAAa,OAAO,cAAc,QAAA,EAAU;AAE5E,UAAA,MAAM,WAAA,GAAc,SAAA;AACpB,UAAA,MAAM,WAAA,GAAyC;AAAA,YAC7C,aAAa,WAAA,CAAY,WAAA;AAAA,YACzB,SAAS,WAAA,CAAY,OAAA;AAAA,YACrB,aAAa,WAAA,CAAY,WAAA;AAAA,YACzB,MAAM,WAAA,CAAY,IAAA;AAAA,YAClB,YAAY,WAAA,CAAY,UAAA;AAAA,YACxB,YAAY,EAAC;AAAA,YACb,WAAW;AAAC,WACd;AAGA,UAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,YAAA,KAAA,MAAW,KAAA,IAAS,YAAY,UAAA,EAAY;AAC1C,cAAA,IAAI,UAAU,KAAA,EAAO;AACnB,gBAAA,WAAA,CAAY,UAAA,CAAY,KAAK,KAAkC,CAAA;AAAA,cACjE,CAAA,MAAO;AACL,gBAAA,MAAM,OAAA,GAAU,KAAA;AAChB,gBAAA,IAAI,OAAA,CAAQ,OAAO,MAAA,EAAQ;AAEzB,kBAAA,WAAA,CAAY,WAAA,GAAc;AAAA,oBACxB,UAAU,OAAA,CAAQ,QAAA;AAAA,oBAClB,aAAa,OAAA,CAAQ,WAAA;AAAA,oBACrB,OAAA,EAAS;AAAA,sBACP,kBAAA,EAAoB;AAAA,wBAClB,QAAQ,OAAA,CAAQ;AAAA;AAClB;AACF,mBACF;AAAA,gBACF,CAAA,MAAO;AAEL,kBAAA,MAAM,OAAA,GAAqC;AAAA,oBACzC,MAAM,OAAA,CAAQ,IAAA;AAAA,oBACd,IAAI,OAAA,CAAQ,EAAA;AAAA,oBACZ,UAAU,OAAA,CAAQ,QAAA;AAAA,oBAClB,aAAa,OAAA,CAAQ,WAAA;AAAA,oBACrB,UAAA,EAAY,QAAQ,cAAc,CAAA;AAAA,oBAClC,MAAA,EAAQ;AAAA,sBACN,MAAM,OAAA,CAAQ,IAAA;AAAA,sBACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,sBAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,sBACjB,SAAS,OAAA,CAAQ,OAAA;AAAA,sBACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,sBACnB,WAAW,OAAA,CAAQ,SAAA;AAAA,sBACnB,SAAS,OAAA,CAAQ,OAAA;AAAA,sBACjB,MAAM,OAAA,CAAQ;AAAA;AAChB,mBACF;AACA,kBAAA,WAAA,CAAY,UAAA,CAAY,KAAK,OAAO,CAAA;AAAA,gBACtC;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAGA,UAAA,IAAI,YAAY,SAAA,EAAW;AACzB,YAAA,KAAA,MAAW,CAAC,YAAY,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1E,cAAA,IAAI,CAAC,QAAA,EAAU;AAEf,cAAA,IAAI,UAAU,QAAA,EAAU;AACtB,gBAAA,WAAA,CAAY,SAAA,CAAU,UAAU,CAAA,GAAI,QAAA;AAAA,cACtC,CAAA,MAAO;AACL,gBAAA,MAAM,UAAA,GAAa,QAAA;AACnB,gBAAA,MAAM,UAAA,GAAuC;AAAA,kBAC3C,aAAa,UAAA,CAAW,WAAA;AAAA,kBACxB,OAAA,EAAS,WAAW,MAAA,GAChB;AAAA,oBACE,kBAAA,EAAoB;AAAA,sBAClB,QAAQ,UAAA,CAAW;AAAA;AACrB,mBACF,GACA;AAAA,iBACN;AACA,gBAAA,WAAA,CAAY,SAAA,CAAU,UAAU,CAAA,GAAI,UAAA;AAAA,cACtC;AAAA,YACF;AAAA,UACF;AAGA,UAAA,IAAI,YAAY,QAAA,EAAU;AACxB,YAAA,WAAA,CAAY,WAAW,WAAA,CAAY,QAAA;AAAA,UACrC;AAEA,UAAA,UAAA,CAAW,MAAwC,CAAA,GAAI,WAAA;AAAA,QACzD;AAEA,QAAA,KAAA,CAAM,KAAA,CAAMA,KAAI,CAAA,GAAI,UAAA;AAAA,MACtB;AAAA,IACF;AAGA,IAAA,IAAI,MAAM,WAAA,EAAa;AACrB,MAAA,KAAA,CAAM,UAAA,CAAY,UAAU,KAAA,CAAM,WAAA;AAAA,IACpC;AAGA,IAAA,IAAI,MAAM,mBAAA,EAAqB;AAC7B,MAAA,KAAA,MAAW,CAAC,MAAM,cAAc,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,mBAAmB,CAAA,EAAG;AAC9E,QAAA,MAAM,QAAA,GAAW,cAAA;AACjB,QAAA,IAAI,QAAA;AAEJ,QAAA,QAAQ,SAAS,IAAA;AAAM,UACrB,KAAK,OAAA;AACH,YAAA,QAAA,GAAW;AAAA,cACT,IAAA,EAAM,MAAA;AAAA,cACN,MAAA,EAAQ;AAAA,aACV;AACA,YAAA;AAAA,UACF,KAAK,QAAA;AACH,YAAA,QAAA,GAAW;AAAA,cACT,IAAA,EAAM,QAAA;AAAA,cACN,MAAM,QAAA,CAAS,IAAA;AAAA,cACf,IAAI,QAAA,CAAS;AAAA,aACf;AACA,YAAA;AAAA,UACF,KAAK,QAAA;AACH,YAAA,QAAA,GAAW;AAAA,cACT,IAAA,EAAM,QAAA;AAAA,cACN,KAAA,EAAO;AAAA,gBACL,QAAA,EACE,QAAA,CAAS,IAAA,KAAS,UAAA,GACd;AAAA,kBACE,kBAAkB,QAAA,CAAS,gBAAA;AAAA,kBAC3B,MAAA,EAAQ,QAAA,CAAS,MAAA,IAAU;AAAC,iBAC9B,GACA,MAAA;AAAA,gBACN,QAAA,EACE,QAAA,CAAS,IAAA,KAAS,UAAA,GACd;AAAA,kBACE,UAAU,QAAA,CAAS,QAAA;AAAA,kBACnB,MAAA,EAAQ,QAAA,CAAS,MAAA,IAAU;AAAC,iBAC9B,GACA,MAAA;AAAA,gBACN,iBAAA,EACE,QAAA,CAAS,IAAA,KAAS,aAAA,GACd;AAAA,kBACE,UAAU,QAAA,CAAS,QAAA;AAAA,kBACnB,MAAA,EAAQ,QAAA,CAAS,MAAA,IAAU;AAAC,iBAC9B,GACA,MAAA;AAAA,gBACN,iBAAA,EACE,QAAA,CAAS,IAAA,KAAS,YAAA,GACd;AAAA,kBACE,kBAAkB,QAAA,CAAS,gBAAA;AAAA,kBAC3B,UAAU,QAAA,CAAS,QAAA;AAAA,kBACnB,MAAA,EAAQ,QAAA,CAAS,MAAA,IAAU;AAAC,iBAC9B,GACA;AAAA;AACR,aACF;AACA,YAAA;AAAA,UACF;AACE,YAAA;AAAA;AAGJ,QAAA,KAAA,CAAM,UAAA,CAAY,eAAA,CAAiB,IAAI,CAAA,GAAI,QAAA;AAAA,MAC7C;AAAA,IACF;AAGA,IAAA,IAAI,MAAM,QAAA,EAAU;AAClB,MAAA,KAAA,CAAM,WAAW,KAAA,CAAM,QAAA;AAAA,IACzB;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,iBAAiB,QAAA,EAAuD;AAC9E,IAAA,MAAM,YAAqC,EAAC;AAE5C,IAAA,IAAI,CAAC,QAAA,CAAS,KAAA,EAAO,OAAO,SAAA;AAE5B,IAAA,KAAA,MAAW,CAACA,OAAM,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC7D,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,MAAM,OAAA,GAAwB,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,OAAA,EAAS,QAAA,EAAU,QAAQ,SAAS,CAAA;AAEzF,MAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,QAAA,MAAM,SAAA,GAAY,QAAA,CAChB,MAAA,CAAO,WAAA,EACT,CAAA;AACA,QAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,QAAA,MAAM,QAAA,GAAkC;AAAA,UACtC,EAAA,EACE,SAAA,CAAU,WAAA,IACV,CAAA,EAAG,MAAA,CAAO,WAAA,EAAa,CAAA,CAAA,EAAIA,KAAAA,CAAK,OAAA,CAAQ,eAAA,EAAiB,GAAG,CAAC,CAAA,CAAA;AAAA,UAC/D,IAAA,EAAAA,KAAAA;AAAA,UACA,MAAA;AAAA,UACA,aAAa,SAAA,CAAU,WAAA;AAAA,UACvB,SAAS,SAAA,CAAU,OAAA;AAAA,UACnB,aAAa,SAAA,CAAU,WAAA;AAAA,UACvB,IAAA,EAAM,SAAA,CAAU,IAAA,IAAQ,EAAC;AAAA,UACzB,YAAY,IAAA,CAAK,iBAAA,CAAkB,UAAU,UAAA,EAAY,QAAA,CAAS,YAAY,QAAQ,CAAA;AAAA,UACtF,WAAA,EAAa,IAAA,CAAK,kBAAA,CAAmB,SAAA,CAAU,aAAa,QAAQ,CAAA;AAAA,UACpE,SAAA,EAAW,IAAA,CAAK,gBAAA,CAAiB,SAAA,CAAU,WAAW,QAAQ,CAAA;AAAA,UAC9D,QAAA,EAAU,SAAA,CAAU,QAAA,IAAY,EAAC;AAAA,UACjC,UAAA,EAAY,UAAU,UAAA,IAAc,KAAA;AAAA,UACpC,QAAA,EAAU,IAAA,CAAK,uBAAA,CAAwB,SAAS;AAAA,SAClD;AAEA,QAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,MACzB;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEQ,iBAAA,CACN,eAAA,EACA,UAAA,EACA,QAAA,EACuB;AACvB,IAAA,MAAM,aAAoC,EAAC;AAI3C,IAAA,MAAM,SAAA,GAAY,CAAC,GAAI,UAAA,IAAc,EAAC,EAAI,GAAI,eAAA,IAAmB,EAAG,CAAA;AAQpE,IAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,IAAI,UAAU,KAAA,EAAO;AAEnB,QAAA,OAAA,CAAQ,GAAA,CAAI,0BAAA,EAA4B,KAAA,CAAM,IAAI,CAAA;AAClD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAiC;AAAA,QACrC,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,IAAI,KAAA,CAAM,EAAA;AAAA,QACV,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,EAAA,KAAO,MAAA;AAAA,QACzC,MAAA,EAAQ,IAAA,CAAK,kBAAA,CAAmB,KAAA,CAAM,QAAQ,QAAQ,CAAA;AAAA,QACtD,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,UAAA,EAAY,MAAM,UAAA,IAAc;AAAA,OAClC;AAQA,MAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,IAC3B;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEQ,kBAAA,CACN,aACA,QAAA,EACmC;AACnC,IAAA,IAAI,CAAC,WAAA,IAAe,MAAA,IAAU,WAAA,EAAa,OAAO,MAAA;AAElD,IAAA,MAAM,UAAiC,EAAC;AAExC,IAAA,IAAI,YAAY,OAAA,EAAS;AACvB,MAAA,KAAA,MAAW,CAAC,WAAW,eAAe,CAAA,IAAK,OAAO,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA,EAAG;AAC9E,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,IAAA,EAAM,SAAA;AAAA,UACN,MAAA,EAAQ,IAAA,CAAK,kBAAA,CAAmB,eAAA,CAAgB,QAAQ,QAAQ,CAAA;AAAA,UAChE,UAAU,eAAA,CAAgB;AAAA,SAC3B,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,YAAY,QAAA,IAAY,KAAA;AAAA,MAClC,aAAa,WAAA,CAAY,WAAA;AAAA,MACzB;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,gBAAA,CACN,WACA,QAAA,EACyB;AACzB,IAAA,IAAI,CAAC,SAAA,EAAW,OAAO,EAAC;AAExB,IAAA,MAAM,eAAwC,EAAC;AAE/C,IAAA,KAAA,MAAW,CAAC,UAAA,EAAY,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC9D,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,IAAI,UAAU,QAAA,EAAU;AAExB,MAAA,MAAM,UAAiC,EAAC;AAExC,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,KAAA,MAAW,CAAC,WAAW,eAAe,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AAC3E,UAAA,IAAI,CAAC,eAAA,EAAiB;AAEtB,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,IAAA,EAAM,SAAA;AAAA,YACN,MAAA,EAAQ,IAAA,CAAK,kBAAA,CAAmB,eAAA,CAAgB,QAAQ,QAAQ,CAAA;AAAA,YAChE,UAAU,eAAA,CAAgB;AAAA,WAC3B,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,YAAA,CAAa,IAAA,CAAK;AAAA,QAChB,UAAA;AAAA,QACA,aAAa,QAAA,CAAS,WAAA;AAAA,QACtB,OAAA,EAAS,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU;AAAA,OACzC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEQ,eAAe,QAAA,EAAkD;AACvE,IAAA,MAAM,UAA8B,EAAC;AAErC,IAAA,IAAI,QAAA,CAAS,YAAY,OAAA,EAAS;AAChC,MAAA,KAAA,MAAW,CAAC,MAAM,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,EAAG;AACxE,QAAA,IAAI,UAAU,MAAA,EAAQ;AAEtB,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,IAAA;AAAA,UACA,MAAA,EAAQ,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAQ,QAAQ,CAAA;AAAA,UAChD,aAAa,MAAA,CAAO,WAAA;AAAA,UACpB,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,UAAA,EAAY,OAAO,UAAA,IAAc;AAAA,SAClC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,gBAAgB,QAAA,EAA0D;AAChF,IAAA,MAAM,WAAuC,EAAC;AAE9C,IAAA,IAAI,QAAA,CAAS,YAAY,eAAA,EAAiB;AACxC,MAAA,KAAA,MAAW,CAAC,MAAM,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,UAAA,CAAW,eAAe,CAAA,EAAG;AAChF,QAAA,IAAI,UAAU,MAAA,EAAQ;AAEtB,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAA;AAAA,UACA,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,MAAA,EAAQ,QAAA,IAAY,MAAA,GAAS,MAAA,CAAO,MAAA,GAAS,MAAA;AAAA,UAC7C,YAAA,EAAc,cAAA,IAAkB,MAAA,GAAS,MAAA,CAAO,YAAA,GAAe,MAAA;AAAA,UAC/D,KAAA,EAAO,OAAA,IAAW,MAAA,GAAS,MAAA,CAAO,KAAA,GAAQ;AAAA,SAC3C,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,cAAA,CACN,UACA,WAAA,EACoB;AACpB,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA,EAAG;AACnD,MAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,MAAW;AAAA,QACrC,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,WAAW,MAAA,CAAO;AAAA,OACpB,CAAE,CAAA;AAAA,IACJ;AAGA,IAAA,IAAI,UAAU,WAAA,EAAa;AACzB,MAAA,MAAM,KAAA,GAAQ,WAAA;AACd,MAAA,OAAO;AAAA,QACL;AAAA,UACE,GAAA,EAAK,CAAA,EAAG,KAAA,CAAM,OAAA,GAAU,CAAC,CAAA,IAAK,OAAO,CAAA,GAAA,EAAM,KAAA,CAAM,IAAI,CAAA,EAAG,KAAA,CAAM,YAAY,EAAE,CAAA,CAAA;AAAA,UAC5E,WAAA,EAAa;AAAA;AACf,OACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEQ,gBAAgB,QAAA,EAA8B;AACpD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,SAAS,IAAA,CAAK,KAAA;AAAA,MACrB,OAAA,EAAS,SAAS,IAAA,CAAK,OAAA;AAAA,MACvB,WAAA,EAAa,SAAS,IAAA,CAAK,WAAA;AAAA,MAC3B,OAAA,EAAS,SAAS,IAAA,CAAK,OAAA;AAAA,MACvB,OAAA,EAAS,SAAS,IAAA,CAAK,OAAA;AAAA,MACvB,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAAA,EACF;AAAA,EAEQ,wBAAwB,SAAA,EAAwD;AACtF,IAAA,OAAO;AAAA,MACL,cAAe,SAAA,CAAU,QAAA,IAAY,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,IAAM,KAAA;AAAA,MACvE,aAAA,EAAe,SAAA;AAAA,MACf,gBAAA,EAAkB,SAAA,CAAU,IAAA,IAAQ,EAAC;AAAA,MACrC,SAAA,EAAW,KAAA;AAAA,MACX,UAAA,EAAY,IAAA,CAAK,aAAA,CAAc,SAAS;AAAA,KAC1C;AAAA,EACF;AAAA,EAEQ,cAAc,SAAA,EAA+C;AACnE,IAAA,IAAI,CAAC,SAAA,CAAU,WAAA,IAAe,MAAA,IAAU,SAAA,CAAU,aAAa,OAAO,KAAA;AAEtE,IAAA,MAAM,OAAA,GAAU,UAAU,WAAA,CAAY,OAAA;AACtC,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA,CAAE,IAAA;AAAA,MAChC,eACE,SAAA,CAAU,QAAA,CAAS,qBAAqB,CAAA,IAAK,SAAA,CAAU,SAAS,0BAA0B;AAAA,KAC9F;AAAA,EACF;AAAA,EAEQ,gBAAA,CACN,KACA,QAAA,EACoC;AAEpC,IAAA,MAAM,UAAU,GAAA,CAAI,OAAA,CAAQ,MAAM,EAAE,CAAA,CAAE,MAAM,GAAG,CAAA;AAE/C,IAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,KAAM,aAAA,EAAe;AAEhC,MAAA,MAAM,UAAA,GAAa,QAAQ,CAAC,CAAA;AAC5B,MAAA,IAAI,CAAC,YAAY,OAAO,MAAA;AACxB,MAAA,OAAO,QAAA,CAAS,UAAA,EAAY,OAAA,GAAU,UAAU,CAAA;AAAA,IAClD,CAAA,MAAA,IAAW,QAAQ,CAAC,CAAA,KAAM,gBAAgB,OAAA,CAAQ,CAAC,MAAM,SAAA,EAAW;AAElE,MAAA,MAAM,UAAA,GAAa,QAAQ,CAAC,CAAA;AAC5B,MAAA,IAAI,CAAC,YAAY,OAAO,MAAA;AACxB,MAAA,OAAO,QAAA,CAAS,UAAA,EAAY,OAAA,GAAU,UAAU,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,kBAAA,CACN,QACA,QAAA,EACkB;AAClB,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,CAAA,CAAE,GAAA,EAAI;AAE1B,IAAA,IAAI,UAAU,MAAA,EAAQ;AAEpB,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACtC,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAI/C,MAAA,MAAM,SAAA,GAAY,EAAE,GAAA,EAAI;AAExB,MAAC,UAAkB,UAAA,GAAa,UAAA;AAChC,MAAA,OAAO,SAAA;AAAA,IACT;AAEA,IAAA,QAAQ,OAAO,IAAA;AAAM,MACnB,KAAK,QAAA;AACH,QAAA,IAAI,YAAA,GAAe,EAAE,MAAA,EAAO;AAC5B,QAAA,IAAI,MAAA,CAAO,cAAc,MAAA,EAAW;AAClC,UAAA,YAAA,GAAe,YAAA,CAAa,GAAA;AAAA,YAC1B,MAAA,CAAO,SAAA;AAAA,YACP,CAAA,kBAAA,EAAqB,OAAO,SAAS,CAAA;AAAA,WACvC;AAAA,QACF;AACA,QAAA,IAAI,MAAA,CAAO,cAAc,MAAA,EAAW;AAClC,UAAA,YAAA,GAAe,YAAA,CAAa,GAAA;AAAA,YAC1B,MAAA,CAAO,SAAA;AAAA,YACP,CAAA,kBAAA,EAAqB,OAAO,SAAS,CAAA;AAAA,WACvC;AAAA,QACF;AACA,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,YAAA,GAAe,aAAa,KAAA,CAAM,IAAI,OAAO,MAAA,CAAO,OAAO,GAAG,gBAAgB,CAAA;AAAA,QAChF;AACA,QAAA,IAAI,MAAA,CAAO,WAAW,OAAA,EAAS;AAC7B,UAAA,YAAA,GAAe,YAAA,CAAa,MAAM,sBAAsB,CAAA;AAAA,QAC1D;AACA,QAAA,IAAI,MAAA,CAAO,MAAA,KAAW,KAAA,IAAS,MAAA,CAAO,WAAW,KAAA,EAAO;AACtD,UAAA,YAAA,GAAe,YAAA,CAAa,IAAI,oBAAoB,CAAA;AAAA,QACtD;AACA,QAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAQ;AAC5B,UAAA,YAAA,GAAe,YAAA,CAAa,KAAK,qBAAqB,CAAA;AAAA,QACxD;AACA,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,OAAO,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,IAA6B,CAAA;AAAA,QACpD;AACA,QAAA,OAAO,YAAA;AAAA,MAET,KAAK,QAAA;AAAA,MACL,KAAK,SAAA;AACH,QAAA,IAAI,YAAA,GAAe,MAAA,CAAO,IAAA,KAAS,SAAA,GAAY,CAAA,CAAE,QAAO,CAAE,GAAA,EAAI,GAAI,CAAA,CAAE,MAAA,EAAO;AAC3E,QAAA,IAAI,MAAA,CAAO,YAAY,MAAA,EAAW;AAChC,UAAA,YAAA,GAAe,aAAa,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,iBAAA,EAAoB,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAAA,QACtF;AACA,QAAA,IAAI,MAAA,CAAO,YAAY,MAAA,EAAW;AAChC,UAAA,YAAA,GAAe,aAAa,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,iBAAA,EAAoB,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAAA,QACtF;AACA,QAAA,OAAO,YAAA;AAAA,MAET,KAAK,SAAA;AACH,QAAA,OAAO,EAAE,OAAA,EAAQ;AAAA,MAEnB,KAAK,OAAA;AACH,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,OAAO,QAAQ,CAAA;AACjE,QAAA,IAAI,WAAA,GAAc,CAAA,CAAE,KAAA,CAAM,UAAU,CAAA;AACpC,QAAA,IAAI,MAAA,CAAO,aAAa,MAAA,EAAW;AACjC,UAAA,WAAA,GAAc,WAAA,CAAY,GAAA;AAAA,YACxB,MAAA,CAAO,QAAA;AAAA,YACP,CAAA,QAAA,EAAW,OAAO,QAAQ,CAAA,eAAA;AAAA,WAC5B;AAAA,QACF;AACA,QAAA,IAAI,MAAA,CAAO,aAAa,MAAA,EAAW;AACjC,UAAA,WAAA,GAAc,WAAA,CAAY,GAAA;AAAA,YACxB,MAAA,CAAO,QAAA;AAAA,YACP,CAAA,QAAA,EAAW,OAAO,QAAQ,CAAA,cAAA;AAAA,WAC5B;AAAA,QACF;AACA,QAAA,OAAO,WAAA;AAAA,MAET,KAAK,QAAA;AACH,QAAA,IAAI,OAAO,UAAA,EAAY;AACrB,UAAA,MAAM,QAAqC,EAAC;AAC5C,UAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,IAAY,EAAC;AAErC,UAAA,KAAA,MAAW,CAAC,UAAU,UAAU,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AACtE,YAAA,IAAI,aAAA,GAAgB,IAAA,CAAK,kBAAA,CAAmB,UAAA,EAAY,QAAQ,CAAA;AAChE,YAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,EAAG;AAChC,cAAA,aAAA,GAAgB,cAAc,QAAA,EAAS;AAAA,YACzC;AACA,YAAA,KAAA,CAAM,QAAQ,CAAA,GAAI,aAAA;AAAA,UACpB;AAEA,UAAA,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACvB;AACA,QAAA,OAAO,EAAE,MAAA,CAAO,CAAA,CAAE,QAAO,EAAG,CAAA,CAAE,KAAK,CAAA;AAAA,MAErC;AACE,QAAA,OAAO,EAAE,GAAA,EAAI;AAAA;AACjB,EACF;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AACF;;;AC/uBO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,aAAA,EAAoC;AAApC,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAAA,EAAqC;AAAA,EATpE;AAQgC,IAAA,MAAA,CAAA,IAAA,EAAA,oBAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMtB,gBAAgB,YAAA,EAA8B;AACpD,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,aAAA,CAAc,SAAA,IAAa,WAAA;AACxD,IAAA,MAAM,SAAA,GAAY,aAAa,UAAA,CAAW,GAAG,IAAI,YAAA,CAAa,KAAA,CAAM,CAAC,CAAA,GAAI,YAAA;AACzE,IAAA,IAAI,cAAA,GAAiB,eAAA;AACrB,IAAA,IAAI,cAAA,CAAe,UAAA,CAAW,MAAM,CAAA,EAAG;AACrC,MAAA,cAAA,GAAiB,cAAA,CAAe,UAAU,CAAC,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,CAAA,EAAA,EAAK,cAAc,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,SAAS,OAAA,EAAsD;AACnE,IAAA,MAAM,EAAE,QAAO,GAAI,OAAA;AACnB,IAAA,MAAM,iBAAkC,EAAC;AAGzC,IAAA,cAAA,CAAe,IAAA,CAAK,IAAA,CAAK,0BAAA,EAA4B,CAAA;AAGrD,IAAA,cAAA,CAAe,KAAK,GAAG,IAAA,CAAK,uBAAA,CAAwB,MAAA,CAAO,SAAS,CAAC,CAAA;AAGrE,IAAA,cAAA,CAAe,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,SAAS,CAAC,CAAA;AAG7D,IAAA,cAAA,CAAe,IAAA,CAAK,IAAA,CAAK,uBAAA,EAAyB,CAAA;AAElD,IAAA,OAAO,cAAA;AAAA,EACT;AAAA,EAEQ,0BAAA,GAA4C;AAClD,IAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,IAAA,CAAK,aAAA;AAC3B,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,eAAA,CAAgB,YAAY,CAAA;AACzD,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,YAAA;AACnC,IAAA,MAAM,WAAA,GAAc,MAAM,WAAA,IAAe,MAAA;AAEzC,IAAA,MAAM,OAAA,GAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,mFAAA,EAgRiE,GAAA,EAAK,WAAW,2BAA2B,CAAA;AAAA,0BAAA,EACpG,GAAA,EAAK,WAAW,GAAK;AAAA,0BAAA,EACrB,GAAA,EAAK,WAAW,CAAC;AAAA,0BAAA,EACjB,IAAA,CAAK,UAAU,GAAA,EAAK,OAAA,IAAW,EAAC,EAAG,IAAA,EAAM,CAAC,CAAC;AAAA,6BAAA,EACxC,GAAA,EAAK,aAAa,qBAAqB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,EA4D9D,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,OAAA,GACrB,CAAA;AAAA,yCAAA,EAC+B,QAAQ,CAAA;AAAA,qCAAA,EACZ,WAAW,CAAA;AAAA,2CAAA,EACL,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAAA,GAa5C,gCACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","file":"chunk-UMUBEOOK.js","sourcesContent":["import type { OpenAPIV3, OpenAPIV2 } from 'openapi-types';\r\nimport type { z } from 'zod';\r\n\r\n// Re-export commonly used types for convenience\r\nexport type { z } from 'zod';\r\nexport type { OpenAPIV3, OpenAPIV2 } from 'openapi-types';\r\n\r\n// Core Configuration Types\r\nexport interface BridgeConfiguration {\r\n /** OpenAPI schema URL or file path */\r\n schema: string;\r\n /** Output directory for generated files */\r\n outputDir: string;\r\n /** Framework configuration */\r\n framework: FrameworkConfiguration;\r\n /** API configuration */\r\n api: ApiConfiguration;\r\n /** Authentication configuration */\r\n auth?: AuthConfiguration;\r\n /** Caching configuration */\r\n cache?: CacheConfiguration;\r\n /** File upload configuration */\r\n uploads?: UploadConfiguration;\r\n /** Development options */\r\n dev?: DevelopmentConfiguration;\r\n /** Plugin configurations */\r\n plugins?: PluginConfiguration[];\r\n /** Custom type mappings */\r\n typeMappings?: Record<string, string>;\r\n /** Generation options */\r\n generation?: GenerationConfiguration;\r\n}\r\n\r\nexport interface FrameworkConfiguration {\r\n type: 'nextjs';\r\n version?: string;\r\n router: 'app' | 'pages';\r\n features: {\r\n serverActions: boolean;\r\n middleware: boolean;\r\n streaming: boolean;\r\n revalidation: boolean;\r\n };\r\n /** Streaming configuration */\r\n streaming?: StreamingConfiguration;\r\n}\r\n\r\nexport interface ApiConfiguration {\r\n baseUrl: string;\r\n timeout: number;\r\n retries: number;\r\n headers?: Record<string, string>;\r\n interceptors?: {\r\n request?: string[];\r\n response?: string[];\r\n };\r\n /** Next.js 16: Custom user agent for fetch requests */\r\n userAgent?: string;\r\n /** Custom error handler configuration */\r\n errorHandling?: ErrorHandlingConfiguration;\r\n /** Custom middleware imports */\r\n customMiddleware?: CustomMiddlewareConfiguration[];\r\n}\r\n\r\nexport interface ErrorHandlingConfiguration {\r\n /** Enable automatic auth error handling */\r\n enableAuthErrorHandling?: boolean;\r\n /** Path to custom auth error handler (default: @/lib/auth-error-handler) */\r\n authErrorHandlerPath?: string;\r\n /** Generate auth error handler if it doesn't exist */\r\n generateAuthErrorHandler?: boolean;\r\n /** Custom error handler paths */\r\n customHandlers?: Record<string, string>;\r\n}\r\n\r\nexport interface CustomMiddlewareConfiguration {\r\n /** Middleware name */\r\n name: string;\r\n /** Import path for the middleware */\r\n importPath: string;\r\n /** Whether to include in default middleware stack */\r\n includeInDefault?: boolean;\r\n /** Middleware priority (lower = earlier in stack) */\r\n priority?: number;\r\n}\r\n\r\nexport interface AuthConfiguration {\r\n enabled: boolean;\r\n provider: 'next-auth' | 'clerk' | 'custom';\r\n middleware?: boolean;\r\n publicPaths?: string[];\r\n /** Path to auth utility (default: @/lib/auth) */\r\n authPath?: string;\r\n /** Custom auth token getter function name */\r\n tokenGetter?: string;\r\n /** OAuth providers configuration */\r\n oauth?: {\r\n enabled: boolean;\r\n providers?: ('google' | 'github' | 'discord' | 'microsoft' | 'apple')[];\r\n /** Custom OAuth callback URL */\r\n callbackUrl?: string;\r\n };\r\n /** MFA (Multi-Factor Authentication) configuration */\r\n mfa?: {\r\n enabled: boolean;\r\n /** Support TOTP (Time-based One-Time Password) */\r\n totp?: boolean;\r\n /** Support backup codes */\r\n backupCodes?: boolean;\r\n };\r\n /** Passkeys (WebAuthn) configuration */\r\n passkeys?: {\r\n enabled: boolean;\r\n /** Require user verification */\r\n requireUserVerification?: boolean;\r\n /** Timeout in milliseconds */\r\n timeout?: number;\r\n };\r\n /** Session configuration */\r\n session?: {\r\n /** Session strategy: 'jwt' or 'database' */\r\n strategy?: 'jwt' | 'database';\r\n /** Maximum session age in seconds */\r\n maxAge?: number;\r\n /** JWT maximum age in seconds */\r\n jwtMaxAge?: number;\r\n };\r\n /** Token refresh configuration */\r\n tokenRefresh?: {\r\n /** Enable automatic token refresh */\r\n enabled?: boolean;\r\n /** Refresh token before expiry (in seconds) */\r\n refreshBeforeExpiry?: number;\r\n };\r\n /** Account status checking */\r\n accountStatus?: {\r\n /** Check account status on token refresh */\r\n checkOnRefresh?: boolean;\r\n /** Auto-logout on account suspension */\r\n autoLogoutOnSuspension?: boolean;\r\n };\r\n}\r\n\r\nexport interface CacheConfiguration {\r\n strategy: 'memory' | 'redis' | 'database';\r\n ttl: number;\r\n tags: boolean;\r\n revalidation: 'time' | 'on-demand' | 'both';\r\n /** Next.js 16: Enable cache tags for granular invalidation */\r\n cacheTags?: boolean;\r\n /** Next.js 16: Enable connection keep-alive for persistent connections */\r\n persistentConnections?: boolean;\r\n}\r\n\r\nexport interface DevelopmentConfiguration {\r\n logging: boolean;\r\n validation: boolean;\r\n mocking: boolean;\r\n watch: boolean;\r\n hotReload?: boolean;\r\n}\r\n\r\nexport interface PluginConfiguration {\r\n name: string;\r\n options?: Record<string, unknown>;\r\n}\r\n\r\nexport interface GenerationConfiguration {\r\n typescript: boolean;\r\n strict: boolean;\r\n comments: boolean;\r\n documentation?: boolean;\r\n examples: boolean;\r\n tests: boolean;\r\n}\r\n\r\nexport interface UploadConfiguration {\r\n enabled: boolean;\r\n strategy: 'standard' | 'external' | 'presigned';\r\n provider?: 'uploadthing' | 'vercel-blob' | 'standard' | 's3' | 'minio';\r\n compression?: {\r\n enabled: boolean;\r\n formats?: ('gzip' | 'webp' | 'brotli')[];\r\n };\r\n security?: {\r\n maxSize?: string;\r\n allowedTypes?: string[];\r\n scan?: 'clamav' | 'none';\r\n };\r\n /** Enable presigned URL uploads (direct to S3/MinIO) */\r\n presignedUploads?: {\r\n enabled: boolean;\r\n /** Endpoint path for generating presigned URLs (e.g., '/api/v1/files/presign-upload') */\r\n presignEndpoint?: string;\r\n /** Fallback to backend upload if presigned upload fails */\r\n fallbackToBackend?: boolean;\r\n };\r\n /** Progress tracking configuration */\r\n progressTracking?: {\r\n enabled: boolean;\r\n /** Use XMLHttpRequest for better progress tracking (default: true) */\r\n useXHR?: boolean;\r\n };\r\n}\r\n\r\nexport interface StreamingConfiguration {\r\n enabled: boolean;\r\n /** Support for Server-Sent Events (SSE) */\r\n sse?: {\r\n enabled: boolean;\r\n /** Auto-reconnect on connection loss */\r\n autoReconnect?: boolean;\r\n /** Reconnect delay in milliseconds */\r\n reconnectDelay?: number;\r\n /** Maximum reconnect attempts */\r\n maxReconnectAttempts?: number;\r\n };\r\n /** Support for WebSocket streaming */\r\n websocket?: {\r\n enabled: boolean;\r\n /** WebSocket URL pattern */\r\n urlPattern?: string;\r\n };\r\n /** Support for HTTP streaming (ReadableStream) */\r\n httpStreaming?: {\r\n enabled: boolean;\r\n };\r\n}\r\n\r\n// OpenAPI Types\r\nexport type OpenApiDocument = OpenAPIV3.Document | OpenAPIV2.Document;\r\n\r\nexport interface ParsedApiSchema {\r\n version: '2.0' | '3.0' | '3.1';\r\n document: OpenAPIV3.Document;\r\n openApiSpec: OpenAPIV3.Document;\r\n endpoints: ApiEndpointDefinition[];\r\n schemas: SchemaDefinition[];\r\n security: SecuritySchemeDefinition[];\r\n servers: ServerDefinition[];\r\n metadata: SchemaMetadata;\r\n}\r\n\r\nexport interface ApiEndpointDefinition {\r\n id: string;\r\n path: string;\r\n method: HttpMethod;\r\n operationId?: string;\r\n summary?: string;\r\n description?: string;\r\n tags: string[];\r\n parameters: ParameterDefinition[];\r\n requestBody?: RequestBodyDefinition;\r\n responses: ApiResponseDefinition[];\r\n security: SecurityRequirement[];\r\n deprecated: boolean;\r\n metadata: EndpointMetadata;\r\n}\r\n\r\nexport interface ParameterDefinition {\r\n name: string;\r\n in: 'path' | 'query' | 'header' | 'cookie';\r\n required: boolean;\r\n schema: z.ZodSchema;\r\n description?: string;\r\n example?: unknown;\r\n deprecated: boolean;\r\n}\r\n\r\nexport interface RequestBodyDefinition {\r\n required: boolean;\r\n description?: string;\r\n content: MediaTypeDefinition[];\r\n}\r\n\r\nexport interface MediaTypeDefinition {\r\n type: string;\r\n schema: z.ZodSchema;\r\n examples?: Record<string, unknown>;\r\n}\r\n\r\nexport interface ApiResponseDefinition {\r\n statusCode: string;\r\n description: string;\r\n content?: MediaTypeDefinition[];\r\n headers?: Record<string, ParameterDefinition>;\r\n}\r\n\r\nexport interface SchemaDefinition {\r\n name: string;\r\n schema: z.ZodSchema;\r\n description?: string;\r\n example?: unknown;\r\n deprecated: boolean;\r\n}\r\n\r\nexport interface SecuritySchemeDefinition {\r\n name: string;\r\n type: 'apiKey' | 'http' | 'oauth2' | 'openIdConnect';\r\n scheme?: string;\r\n bearerFormat?: string;\r\n flows?: unknown;\r\n}\r\n\r\nexport interface ServerDefinition {\r\n url: string;\r\n description?: string;\r\n variables?: Record<string, unknown>;\r\n}\r\n\r\nexport interface SchemaMetadata {\r\n title: string;\r\n version: string;\r\n description?: string;\r\n contact?: unknown;\r\n license?: unknown;\r\n externalDocs?: unknown;\r\n timestamp: number;\r\n}\r\n\r\nexport interface EndpointMetadata {\r\n requiresAuth: boolean;\r\n cacheStrategy: CacheStrategy;\r\n revalidationTags: string[];\r\n rateLimit?: RateLimit;\r\n timeout?: number;\r\n streaming: boolean;\r\n fileUpload: boolean;\r\n}\r\n\r\nexport interface SecurityRequirement {\r\n [name: string]: string[];\r\n}\r\n\r\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS';\r\n\r\nexport type CacheStrategy = 'no-cache' | 'force-cache' | 'revalidate' | 'default';\r\n\r\nexport interface RateLimit {\r\n requests: number;\r\n window: number;\r\n}\r\n\r\n// Generation Context\r\nexport interface GenerationContext {\r\n config: BridgeConfiguration;\r\n schema: ParsedApiSchema;\r\n outputDir: string;\r\n timestamp: number;\r\n}\r\n\r\nexport interface GeneratedFile {\r\n path: string;\r\n content: string;\r\n type: 'typescript' | 'javascript' | 'json';\r\n metadata?: FileMetadata;\r\n}\r\n\r\nexport interface FileMetadata {\r\n exports: string[];\r\n imports: string[];\r\n dependencies: string[];\r\n}\r\n\r\n// Error Types\r\nexport class BridgeError extends Error {\r\n public readonly code: string;\r\n public readonly details?: unknown;\r\n\r\n constructor(\r\n message: string,\r\n code: string,\r\n details?: unknown\r\n ) {\r\n super(message);\r\n this.name = 'BridgeError';\r\n this.code = code;\r\n this.details = details;\r\n }\r\n}\r\n\r\nexport class ValidationError extends BridgeError {\r\n public readonly errors: z.ZodError;\r\n\r\n constructor(\r\n message: string,\r\n errors: z.ZodError\r\n ) {\r\n super(message, 'VALIDATION_ERROR', errors);\r\n this.errors = errors;\r\n }\r\n}\r\n\r\nexport class SchemaParseError extends BridgeError {\r\n public readonly schemaUrl: string;\r\n\r\n constructor(\r\n message: string,\r\n schemaUrl: string\r\n ) {\r\n super(message, 'SCHEMA_PARSE_ERROR', { schemaUrl });\r\n this.schemaUrl = schemaUrl;\r\n }\r\n}\r\n\r\nexport class GenerationError extends BridgeError {\r\n public readonly file?: string;\r\n\r\n constructor(\r\n message: string,\r\n file?: string\r\n ) {\r\n super(message, 'GENERATION_ERROR', { file });\r\n this.file = file;\r\n }\r\n}\r\n\r\n// Plugin System\r\nexport interface BridgePlugin {\r\n name: string;\r\n version: string;\r\n transform(content: string, context: GenerationContext): Promise<string>;\r\n validate?(config: BridgeConfiguration): Promise<void>;\r\n setup?(context: GenerationContext): Promise<void>;\r\n cleanup?(context: GenerationContext): Promise<void>;\r\n}\r\n\r\n// Client Types\r\nexport interface ClientConfiguration {\r\n baseUrl: string;\r\n timeout?: number;\r\n retries?: number;\r\n headers?: Record<string, string>;\r\n auth?: {\r\n type: 'bearer' | 'apiKey' | 'basic';\r\n token?: string;\r\n apiKey?: string;\r\n username?: string;\r\n password?: string;\r\n };\r\n}\r\n\r\nexport interface RequestConfiguration extends Omit<RequestInit, 'cache' | 'priority'> {\r\n timeout?: number;\r\n retries?: number;\r\n retryDelay?: number;\r\n enableCache?: boolean;\r\n deduplication?: boolean;\r\n validation?: boolean;\r\n requestCache?: RequestCache;\r\n priority?: number;\r\n circuitBreaker?: boolean;\r\n streaming?: boolean;\r\n compression?: boolean;\r\n prefetch?: boolean;\r\n background?: boolean;\r\n /** Next.js 16: Cache tags for granular invalidation */\r\n cacheTags?: string[];\r\n /** Next.js 16: Connection type for persistent connections */\r\n connection?: 'keep-alive' | 'close';\r\n /** Next.js 16: Update cache tags dynamically */\r\n updateTag?: (tag: string) => void;\r\n}\r\n\r\nexport interface ClientResponse<T = any> {\r\n data: T;\r\n status: number;\r\n statusText: string;\r\n headers: Headers;\r\n cached?: boolean;\r\n retryCount?: number;\r\n responseTime?: number;\r\n fromCache?: boolean;\r\n compressed?: boolean;\r\n etag?: string;\r\n}\r\n\r\nexport interface StreamingResponse<T = any> {\r\n data: AsyncIterable<T>;\r\n status: number;\r\n statusText: string;\r\n headers: Headers;\r\n controller: AbortController;\r\n}\r\n","export enum LogLevel {\r\n DEBUG = 0,\r\n INFO = 1,\r\n WARN = 2,\r\n ERROR = 3,\r\n}\r\n\r\nexport interface LoggerOptions {\r\n level?: LogLevel;\r\n prefix?: string;\r\n timestamp?: boolean;\r\n colors?: boolean;\r\n}\r\n\r\nconst colors = {\r\n reset: '\\x1b[0m',\r\n bright: '\\x1b[1m',\r\n red: '\\x1b[31m',\r\n green: '\\x1b[32m',\r\n yellow: '\\x1b[33m',\r\n blue: '\\x1b[34m',\r\n cyan: '\\x1b[36m',\r\n gray: '\\x1b[90m',\r\n};\r\n\r\nfunction colorize(text: string, color: keyof typeof colors): string {\r\n if (!process.stdout.isTTY) return text;\r\n return `${colors[color]}${text}${colors.reset}`;\r\n}\r\n\r\nexport class BridgeLogger {\r\n public options: Required<LoggerOptions>;\r\n\r\n constructor(options: LoggerOptions = {}) {\r\n this.options = {\r\n level: LogLevel.INFO,\r\n prefix: '',\r\n timestamp: true,\r\n colors: true,\r\n ...options,\r\n };\r\n }\r\n\r\n private shouldLog(level: LogLevel): boolean {\r\n return level >= this.options.level;\r\n }\r\n\r\n private formatMessage(level: LogLevel, message: string, ...args: unknown[]): string {\r\n let formatted = message;\r\n\r\n if (args.length > 0) {\r\n formatted = `${message} ${args\r\n .map(arg => (typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg)))\r\n .join(' ')}`;\r\n }\r\n\r\n if (this.options.timestamp) {\r\n const timestamp = new Date().toISOString();\r\n formatted = `[${timestamp}] ${formatted}`;\r\n }\r\n\r\n if (this.options.prefix) {\r\n formatted = `${this.options.prefix} ${formatted}`;\r\n }\r\n\r\n return formatted;\r\n }\r\n\r\n debug(message: string, ...args: unknown[]): void {\r\n if (!this.shouldLog(LogLevel.DEBUG)) return;\r\n const formatted = this.formatMessage(LogLevel.DEBUG, message, ...args);\r\n console.debug(this.options.colors ? colorize(formatted, 'gray') : formatted);\r\n }\r\n\r\n info(message: string, ...args: unknown[]): void {\r\n if (!this.shouldLog(LogLevel.INFO)) return;\r\n const formatted = this.formatMessage(LogLevel.INFO, message, ...args);\r\n console.info(this.options.colors ? colorize(formatted, 'blue') : formatted);\r\n }\r\n\r\n success(message: string, ...args: unknown[]): void {\r\n if (!this.shouldLog(LogLevel.INFO)) return;\r\n const formatted = this.formatMessage(LogLevel.INFO, message, ...args);\r\n console.info(this.options.colors ? colorize(formatted, 'green') : formatted);\r\n }\r\n\r\n warn(message: string, ...args: unknown[]): void {\r\n if (!this.shouldLog(LogLevel.WARN)) return;\r\n const formatted = this.formatMessage(LogLevel.WARN, message, ...args);\r\n console.warn(this.options.colors ? colorize(formatted, 'yellow') : formatted);\r\n }\r\n\r\n error(message: string, ...args: unknown[]): void {\r\n if (!this.shouldLog(LogLevel.ERROR)) return;\r\n const formatted = this.formatMessage(LogLevel.ERROR, message, ...args);\r\n console.error(this.options.colors ? colorize(formatted, 'red') : formatted);\r\n }\r\n\r\n spinner(message: string): {\r\n succeed: (msg?: string) => void;\r\n fail: (msg?: string) => void;\r\n stop: () => void;\r\n } {\r\n if (!this.options.colors || !process.stdout.isTTY) {\r\n console.log(message);\r\n return {\r\n succeed: msg => console.log(colorize(`✓ ${msg || message || ''}`, 'green')),\r\n fail: msg => console.error(colorize(`✗ ${msg || message || ''}`, 'red')),\r\n stop: () => {},\r\n };\r\n }\r\n\r\n const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\r\n let i = 0;\r\n const interval = setInterval(() => {\r\n process.stdout.write(`\\r${colorize(frames[i++ % frames.length], 'cyan')} ${message}`);\r\n }, 100);\r\n\r\n return {\r\n succeed: msg => {\r\n clearInterval(interval);\r\n process.stdout.write(`\\r${colorize('✓', 'green')} ${msg || message || ''}\\n`);\r\n },\r\n fail: msg => {\r\n clearInterval(interval);\r\n process.stdout.write(`\\r${colorize('✗', 'red')} ${msg || message || ''}\\n`);\r\n },\r\n stop: () => {\r\n clearInterval(interval);\r\n process.stdout.write('\\r');\r\n },\r\n };\r\n }\r\n}\r\n","import { BridgeLogger } from './logger';\r\nimport { existsSync, readFileSync } from 'fs';\r\nimport { join } from 'path';\r\n\r\nexport interface VersionInfo {\r\n current: string;\r\n latest: string;\r\n isOutdated: boolean;\r\n updateAvailable: boolean;\r\n}\r\n\r\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun' | 'unknown';\r\n\r\nexport interface NpmPackageInfo {\r\n name: string;\r\n version: string;\r\n 'dist-tags': {\r\n latest: string;\r\n };\r\n}\r\n\r\nexport class VersionChecker {\r\n private logger: BridgeLogger;\r\n private packageName: string;\r\n private currentVersion: string;\r\n private cache: Map<string, { data: VersionInfo; timestamp: number }> = new Map();\r\n private readonly CACHE_DURATION = 24 * 60 * 60 * 1000; // 24 hours\r\n\r\n constructor(packageName: string, currentVersion: string, logger?: BridgeLogger) {\r\n this.packageName = packageName;\r\n this.currentVersion = currentVersion;\r\n this.logger = logger || new BridgeLogger({ prefix: '🔍 Version Check' });\r\n }\r\n\r\n /**\r\n * Check if a new version is available\r\n */\r\n async checkForUpdates(): Promise<VersionInfo | null> {\r\n try {\r\n // Check cache first\r\n const cached = this.getCachedVersion();\r\n if (cached) {\r\n return cached;\r\n }\r\n\r\n this.logger.debug('Checking for updates...');\r\n \r\n // Fetch latest version from npm registry\r\n const latestVersion = await this.fetchLatestVersion();\r\n \r\n if (!latestVersion) {\r\n this.logger.debug('Could not fetch latest version');\r\n return null;\r\n }\r\n\r\n const versionInfo: VersionInfo = {\r\n current: this.currentVersion,\r\n latest: latestVersion,\r\n isOutdated: this.isVersionOutdated(this.currentVersion, latestVersion),\r\n updateAvailable: this.isVersionOutdated(this.currentVersion, latestVersion)\r\n };\r\n\r\n // Cache the result\r\n this.cacheVersion(versionInfo);\r\n\r\n return versionInfo;\r\n } catch (error) {\r\n this.logger.debug('Version check failed:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Detect the package manager being used\r\n */\r\n detectPackageManager(): PackageManager {\r\n const cwd = process.cwd();\r\n \r\n // Check for lock files in order of preference\r\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) {\r\n return 'pnpm';\r\n }\r\n if (existsSync(join(cwd, 'yarn.lock'))) {\r\n return 'yarn';\r\n }\r\n if (existsSync(join(cwd, 'bun.lockb'))) {\r\n return 'bun';\r\n }\r\n if (existsSync(join(cwd, 'package-lock.json'))) {\r\n return 'npm';\r\n }\r\n \r\n // Check for package.json to see if it's a Node.js project\r\n if (existsSync(join(cwd, 'package.json'))) {\r\n return 'npm'; // Default to npm if package.json exists\r\n }\r\n \r\n return 'unknown';\r\n }\r\n\r\n /**\r\n * Get the appropriate upgrade command for the detected package manager\r\n */\r\n getUpgradeCommand(versionInfo: VersionInfo): string {\r\n const packageManager = this.detectPackageManager();\r\n \r\n switch (packageManager) {\r\n case 'yarn':\r\n return `yarn upgrade ${this.packageName}`;\r\n case 'pnpm':\r\n return `pnpm update ${this.packageName}`;\r\n case 'bun':\r\n return `bun update ${this.packageName}`;\r\n case 'npm':\r\n default:\r\n return `npm update ${this.packageName}`;\r\n }\r\n }\r\n\r\n /**\r\n * Get a user-friendly update message\r\n */\r\n getUpdateMessage(versionInfo: VersionInfo): string {\r\n if (!versionInfo.updateAvailable) {\r\n return `✅ You're using the latest version (${versionInfo.current})`;\r\n }\r\n\r\n const upgradeCommand = this.getUpgradeCommand(versionInfo);\r\n return `🔄 Update available: ${versionInfo.current} → ${versionInfo.latest}\r\n\r\n Run: ${upgradeCommand}`;\r\n }\r\n\r\n\r\n /**\r\n * Display update notification to user\r\n */\r\n displayUpdateNotification(versionInfo: VersionInfo, options: {\r\n showIfUpToDate?: boolean;\r\n force?: boolean;\r\n professional?: boolean;\r\n } = {}): void {\r\n const { showIfUpToDate = false, force = false, professional = false } = options;\r\n\r\n if (!versionInfo.updateAvailable && !showIfUpToDate && !force) {\r\n return;\r\n }\r\n\r\n if (versionInfo.updateAvailable) {\r\n if (professional) {\r\n const message = this.getUpdateMessage(versionInfo);\r\n this.logger.warn(message);\r\n }\r\n // If professional is false, we let the banner handle the display\r\n } else if (showIfUpToDate) {\r\n const message = this.getUpdateMessage(versionInfo);\r\n this.logger.info(message);\r\n }\r\n }\r\n\r\n /**\r\n * Fetch the latest version from npm registry\r\n */\r\n private async fetchLatestVersion(): Promise<string | null> {\r\n try {\r\n const registryUrl = `https://registry.npmjs.org/${this.packageName}`;\r\n \r\n const response = await fetch(registryUrl, {\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'User-Agent': `${this.packageName}/${this.currentVersion}`\r\n }\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const packageInfo: NpmPackageInfo = await response.json();\r\n return packageInfo['dist-tags'].latest;\r\n } catch (error) {\r\n this.logger.debug('Failed to fetch latest version:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Compare two semantic versions\r\n */\r\n private isVersionOutdated(current: string, latest: string): boolean {\r\n try {\r\n const currentParts = this.parseVersion(current);\r\n const latestParts = this.parseVersion(latest);\r\n\r\n for (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {\r\n const currentPart = currentParts[i] || 0;\r\n const latestPart = latestParts[i] || 0;\r\n\r\n if (latestPart > currentPart) {\r\n return true;\r\n } else if (latestPart < currentPart) {\r\n return false;\r\n }\r\n }\r\n\r\n return false;\r\n } catch (error) {\r\n this.logger.debug('Version comparison failed:', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Parse semantic version string into array of numbers\r\n */\r\n private parseVersion(version: string): number[] {\r\n // Remove pre-release identifiers and build metadata\r\n const cleanVersion = version.replace(/[-+].*$/, '');\r\n return cleanVersion.split('.').map(part => {\r\n const num = parseInt(part, 10);\r\n return isNaN(num) ? 0 : num;\r\n });\r\n }\r\n\r\n /**\r\n * Get cached version info if available and not expired\r\n */\r\n private getCachedVersion(): VersionInfo | null {\r\n const cached = this.cache.get(this.packageName);\r\n if (!cached) {\r\n return null;\r\n }\r\n\r\n const now = Date.now();\r\n if (now - cached.timestamp > this.CACHE_DURATION) {\r\n this.cache.delete(this.packageName);\r\n return null;\r\n }\r\n\r\n return cached.data;\r\n }\r\n\r\n /**\r\n * Cache version info\r\n */\r\n private cacheVersion(versionInfo: VersionInfo): void {\r\n this.cache.set(this.packageName, {\r\n data: versionInfo,\r\n timestamp: Date.now()\r\n });\r\n }\r\n\r\n /**\r\n * Clear version cache\r\n */\r\n clearCache(): void {\r\n this.cache.clear();\r\n }\r\n\r\n /**\r\n * Get current version\r\n */\r\n getCurrentVersion(): string {\r\n return this.currentVersion;\r\n }\r\n\r\n /**\r\n * Get package name\r\n */\r\n getPackageName(): string {\r\n return this.packageName;\r\n }\r\n}\r\n\r\n/**\r\n * Create a version checker instance for the Mulink library\r\n */\r\nexport function createBridgeVersionChecker(logger?: BridgeLogger): VersionChecker {\r\n const packageName = 'mulink';\r\n // Attempt to read the package.json version dynamically so the displayed\r\n // \"current\" version always matches the installed package.\r\n let currentVersion = '0.0.0';\r\n\r\n try {\r\n // Look for package.json in project root (two levels up from src/utils)\r\n const pkgPath = join(__dirname, '..', '..', 'package.json');\r\n if (existsSync(pkgPath)) {\r\n const pkgRaw = readFileSync(pkgPath, { encoding: 'utf-8' });\r\n const pkg = JSON.parse(pkgRaw) as { version?: string };\r\n if (pkg && pkg.version) {\r\n currentVersion = pkg.version;\r\n }\r\n } else {\r\n // Fallback: try to locate package.json from process.cwd()\r\n const cwdPkg = join(process.cwd(), 'package.json');\r\n if (existsSync(cwdPkg)) {\r\n const pkgRaw = readFileSync(cwdPkg, { encoding: 'utf-8' });\r\n const pkg = JSON.parse(pkgRaw) as { version?: string };\r\n if (pkg && pkg.version) {\r\n currentVersion = pkg.version;\r\n }\r\n }\r\n }\r\n } catch (err) {\r\n const l = logger || new BridgeLogger({ prefix: '🔍 Version Check' });\r\n l.debug('Failed to read package.json for current version, falling back to default', err);\r\n }\r\n\r\n return new VersionChecker(packageName, currentVersion, logger);\r\n}\r\n\r\n/**\r\n * Check for updates and display notification\r\n */\r\nexport async function checkAndNotifyUpdates(options: {\r\n showIfUpToDate?: boolean;\r\n force?: boolean;\r\n professional?: boolean;\r\n logger?: BridgeLogger;\r\n} = {}): Promise<VersionInfo | null> {\r\n const { showIfUpToDate = false, force = false, professional = false, logger } = options;\r\n \r\n const versionChecker = createBridgeVersionChecker(logger);\r\n const versionInfo = await versionChecker.checkForUpdates();\r\n \r\n if (versionInfo) {\r\n versionChecker.displayUpdateNotification(versionInfo, { showIfUpToDate, force, professional });\r\n }\r\n \r\n return versionInfo;\r\n}\r\n","import type {\r\n OpenApiDocument,\r\n ParsedApiSchema,\r\n ApiEndpointDefinition,\r\n SchemaDefinition,\r\n SecuritySchemeDefinition,\r\n ServerDefinition,\r\n ParameterDefinition,\r\n RequestBodyDefinition,\r\n ApiResponseDefinition,\r\n MediaTypeDefinition,\r\n HttpMethod,\r\n EndpointMetadata,\r\n} from './types';\r\nimport { SchemaParseError } from './types';\r\nimport { z } from 'zod';\r\nimport type { OpenAPIV2, OpenAPIV3 } from 'openapi-types';\r\nimport { createBridgeVersionChecker } from '@/utils/version-checker';\r\n\r\nexport class OpenApiSchemaParser {\r\n private schemaCache = new Map<string, ParsedApiSchema>();\r\n\r\n\r\n async parse(schemaUrl: string): Promise<ParsedApiSchema> {\r\n // Check cache first\r\n if (this.schemaCache.has(schemaUrl)) {\r\n return this.schemaCache.get(schemaUrl)!;\r\n }\r\n\r\n try {\r\n const document = await this.fetchSchema(schemaUrl);\r\n const parsedSchema = await this.parseDocument(document);\r\n\r\n // Cache the result\r\n this.schemaCache.set(schemaUrl, parsedSchema);\r\n return parsedSchema;\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Unknown error';\r\n throw new SchemaParseError(`Failed to parse schema: ${message}`, schemaUrl);\r\n }\r\n }\r\n\r\n private async fetchSchema(schemaUrl: string): Promise<OpenApiDocument> {\r\n const versionChecker = createBridgeVersionChecker();\r\n const currentVersion = versionChecker.getCurrentVersion();\r\n if (!schemaUrl?.trim()) {\r\n throw new SchemaParseError('Schema URL is required and cannot be empty', schemaUrl);\r\n }\r\n\r\n if (schemaUrl.startsWith('http')) {\r\n // Add timeout to prevent hanging on invalid URLs\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), 10000); // 10 second timeout\r\n \r\n try {\r\n const response = await fetch(schemaUrl, {\r\n headers: {\r\n 'Accept': 'application/json, application/yaml, text/yaml',\r\n 'User-Agent': `Mulink/${currentVersion}`\r\n },\r\n signal: controller.signal\r\n });\r\n \r\n clearTimeout(timeoutId);\r\n \r\n if (!response.ok) {\r\n throw new SchemaParseError(\r\n `Failed to fetch schema: ${response.status} ${response.statusText}`,\r\n schemaUrl\r\n );\r\n }\r\n\r\n const contentType = response.headers.get('content-type') || '';\r\n if (!contentType.includes('application/json') && !contentType.includes('application/yaml') && !contentType.includes('text/yaml')) {\r\n throw new SchemaParseError(\r\n `Unsupported content type: ${contentType}. Expected JSON or YAML.`,\r\n schemaUrl\r\n );\r\n }\r\n\r\n const data = await response.json();\r\n if (!data || typeof data !== 'object') {\r\n throw new SchemaParseError('Invalid schema format: expected JSON object', schemaUrl);\r\n }\r\n\r\n return data as OpenApiDocument;\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n \r\n if (error instanceof SchemaParseError) {\r\n throw error;\r\n }\r\n // Handle timeout/abort errors\r\n if (error instanceof Error && (error.name === 'AbortError' || error.message.includes('aborted'))) {\r\n throw new SchemaParseError('Request timeout: Failed to fetch schema within 10 seconds', schemaUrl);\r\n }\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n throw new SchemaParseError(`Network error: ${errorMessage}`, schemaUrl);\r\n }\r\n } else {\r\n throw new SchemaParseError(\r\n 'File system access not implemented. Please provide a URL to the schema.',\r\n schemaUrl\r\n );\r\n }\r\n }\r\n\r\n private async parseDocument(document: OpenApiDocument): Promise<ParsedApiSchema> {\r\n const version = this.detectVersion(document);\r\n const normalizedDocument = this.normalizeDocument(document, version);\r\n\r\n return {\r\n version,\r\n document: normalizedDocument,\r\n openApiSpec: normalizedDocument,\r\n endpoints: this.extractEndpoints(normalizedDocument),\r\n schemas: this.extractSchemas(normalizedDocument),\r\n security: this.extractSecurity(normalizedDocument),\r\n servers: this.extractServers(normalizedDocument, document),\r\n metadata: this.extractMetadata(normalizedDocument),\r\n };\r\n }\r\n\r\n private detectVersion(document: OpenApiDocument): '2.0' | '3.0' | '3.1' {\r\n if (!document || typeof document !== 'object') {\r\n throw new SchemaParseError('Invalid document: expected an object', 'unknown');\r\n }\r\n\r\n if ('swagger' in document) {\r\n const swaggerVersion = (document as any).swagger;\r\n if (typeof swaggerVersion === 'string' && swaggerVersion.startsWith('2.')) {\r\n return '2.0';\r\n }\r\n throw new SchemaParseError(`Unsupported Swagger version: ${swaggerVersion}`, 'unknown');\r\n } else if ('openapi' in document) {\r\n const openApiVersion = (document as any).openapi;\r\n if (typeof openApiVersion === 'string') {\r\n if (openApiVersion.startsWith('3.1')) return '3.1';\r\n if (openApiVersion.startsWith('3.0')) return '3.0';\r\n throw new SchemaParseError(`Unsupported OpenAPI version: ${openApiVersion}`, 'unknown');\r\n }\r\n throw new SchemaParseError('Invalid OpenAPI version format', 'unknown');\r\n }\r\n \r\n throw new SchemaParseError('Unable to detect API specification version. Expected \"swagger\" or \"openapi\" field.', 'unknown');\r\n }\r\n\r\n private normalizeDocument(\r\n document: OpenApiDocument,\r\n version: '2.0' | '3.0' | '3.1'\r\n ): OpenAPIV3.Document {\r\n if (version === '2.0') {\r\n return this.convertV2ToV3(document as OpenAPIV2.Document);\r\n }\r\n return document as OpenAPIV3.Document;\r\n }\r\n\r\n private convertV2ToV3(v2Doc: OpenAPIV2.Document): OpenAPIV3.Document {\r\n const v3Doc: OpenAPIV3.Document = {\r\n openapi: '3.0.0',\r\n info: v2Doc.info,\r\n servers: v2Doc.host\r\n ? [\r\n {\r\n url: `${v2Doc.schemes?.[0] || 'https'}://${v2Doc.host}${v2Doc.basePath || ''}`,\r\n },\r\n ]\r\n : [],\r\n paths: {},\r\n components: {\r\n schemas: {},\r\n securitySchemes: {},\r\n },\r\n };\r\n\r\n // Convert paths\r\n if (v2Doc.paths) {\r\n for (const [path, pathItem] of Object.entries(v2Doc.paths)) {\r\n if (!pathItem) continue;\r\n\r\n const v3PathItem: OpenAPIV3.PathItemObject = {};\r\n\r\n // Convert path-level parameters first\r\n if (pathItem.parameters) {\r\n v3PathItem.parameters = pathItem.parameters.map(param => {\r\n if ('$ref' in param) {\r\n return param as OpenAPIV3.ReferenceObject;\r\n } else {\r\n const v2Param = param as OpenAPIV2.ParameterObject;\r\n const v3Param: OpenAPIV3.ParameterObject = {\r\n name: v2Param.name,\r\n in: v2Param.in as any,\r\n required: v2Param.required,\r\n description: v2Param.description,\r\n deprecated: v2Param['x-deprecated'],\r\n schema: {\r\n type: v2Param.type as any,\r\n format: v2Param.format,\r\n minimum: v2Param.minimum,\r\n maximum: v2Param.maximum,\r\n minLength: v2Param.minLength,\r\n maxLength: v2Param.maxLength,\r\n pattern: v2Param.pattern,\r\n enum: v2Param.enum,\r\n },\r\n };\r\n return v3Param;\r\n }\r\n });\r\n }\r\n\r\n for (const [method, operation] of Object.entries(pathItem)) {\r\n if (method === 'parameters' || !operation || typeof operation !== 'object') continue;\r\n\r\n const v2Operation = operation as OpenAPIV2.OperationObject;\r\n const v3Operation: OpenAPIV3.OperationObject = {\r\n operationId: v2Operation.operationId,\r\n summary: v2Operation.summary,\r\n description: v2Operation.description,\r\n tags: v2Operation.tags,\r\n deprecated: v2Operation.deprecated,\r\n parameters: [],\r\n responses: {},\r\n };\r\n\r\n // Convert operation-level parameters\r\n if (v2Operation.parameters) {\r\n for (const param of v2Operation.parameters) {\r\n if ('$ref' in param) {\r\n v3Operation.parameters!.push(param as OpenAPIV3.ReferenceObject);\r\n } else {\r\n const v2Param = param as OpenAPIV2.ParameterObject;\r\n if (v2Param.in === 'body') {\r\n // Convert body parameter to requestBody\r\n v3Operation.requestBody = {\r\n required: v2Param.required,\r\n description: v2Param.description,\r\n content: {\r\n 'application/json': {\r\n schema: v2Param.schema as OpenAPIV3.SchemaObject,\r\n },\r\n },\r\n };\r\n } else {\r\n // Convert other parameters\r\n const v3Param: OpenAPIV3.ParameterObject = {\r\n name: v2Param.name,\r\n in: v2Param.in as any,\r\n required: v2Param.required,\r\n description: v2Param.description,\r\n deprecated: v2Param['x-deprecated'],\r\n schema: {\r\n type: v2Param.type as any,\r\n format: v2Param.format,\r\n minimum: v2Param.minimum,\r\n maximum: v2Param.maximum,\r\n minLength: v2Param.minLength,\r\n maxLength: v2Param.maxLength,\r\n pattern: v2Param.pattern,\r\n enum: v2Param.enum,\r\n },\r\n };\r\n v3Operation.parameters!.push(v3Param);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Convert responses\r\n if (v2Operation.responses) {\r\n for (const [statusCode, response] of Object.entries(v2Operation.responses)) {\r\n if (!response) continue;\r\n\r\n if ('$ref' in response) {\r\n v3Operation.responses[statusCode] = response;\r\n } else {\r\n const v2Response = response as OpenAPIV2.ResponseObject;\r\n const v3Response: OpenAPIV3.ResponseObject = {\r\n description: v2Response.description,\r\n content: v2Response.schema\r\n ? {\r\n 'application/json': {\r\n schema: v2Response.schema as OpenAPIV3.SchemaObject,\r\n },\r\n }\r\n : undefined,\r\n };\r\n v3Operation.responses[statusCode] = v3Response;\r\n }\r\n }\r\n }\r\n\r\n // Convert security\r\n if (v2Operation.security) {\r\n v3Operation.security = v2Operation.security;\r\n }\r\n\r\n v3PathItem[method as keyof OpenAPIV3.PathItemObject] = v3Operation as any;\r\n }\r\n\r\n v3Doc.paths[path] = v3PathItem;\r\n }\r\n }\r\n\r\n // Convert definitions to components/schemas\r\n if (v2Doc.definitions) {\r\n v3Doc.components!.schemas = v2Doc.definitions as Record<string, OpenAPIV3.SchemaObject>;\r\n }\r\n\r\n // Convert security definitions\r\n if (v2Doc.securityDefinitions) {\r\n for (const [name, securityScheme] of Object.entries(v2Doc.securityDefinitions)) {\r\n const v2Scheme = securityScheme as OpenAPIV2.SecuritySchemeObject;\r\n let v3Scheme: OpenAPIV3.SecuritySchemeObject;\r\n\r\n switch (v2Scheme.type) {\r\n case 'basic':\r\n v3Scheme = {\r\n type: 'http',\r\n scheme: 'basic',\r\n };\r\n break;\r\n case 'apiKey':\r\n v3Scheme = {\r\n type: 'apiKey',\r\n name: v2Scheme.name!,\r\n in: v2Scheme.in! as 'header' | 'query' | 'cookie',\r\n };\r\n break;\r\n case 'oauth2':\r\n v3Scheme = {\r\n type: 'oauth2',\r\n flows: {\r\n implicit:\r\n v2Scheme.flow === 'implicit'\r\n ? {\r\n authorizationUrl: v2Scheme.authorizationUrl!,\r\n scopes: v2Scheme.scopes || {},\r\n }\r\n : undefined,\r\n password:\r\n v2Scheme.flow === 'password'\r\n ? {\r\n tokenUrl: v2Scheme.tokenUrl!,\r\n scopes: v2Scheme.scopes || {},\r\n }\r\n : undefined,\r\n clientCredentials:\r\n v2Scheme.flow === 'application'\r\n ? {\r\n tokenUrl: v2Scheme.tokenUrl!,\r\n scopes: v2Scheme.scopes || {},\r\n }\r\n : undefined,\r\n authorizationCode:\r\n v2Scheme.flow === 'accessCode'\r\n ? {\r\n authorizationUrl: v2Scheme.authorizationUrl!,\r\n tokenUrl: v2Scheme.tokenUrl!,\r\n scopes: v2Scheme.scopes || {},\r\n }\r\n : undefined,\r\n },\r\n };\r\n break;\r\n default:\r\n continue;\r\n }\r\n\r\n v3Doc.components!.securitySchemes![name] = v3Scheme;\r\n }\r\n }\r\n\r\n // Set global security\r\n if (v2Doc.security) {\r\n v3Doc.security = v2Doc.security;\r\n }\r\n\r\n return v3Doc;\r\n }\r\n\r\n private extractEndpoints(document: OpenAPIV3.Document): ApiEndpointDefinition[] {\r\n const endpoints: ApiEndpointDefinition[] = [];\r\n\r\n if (!document.paths) return endpoints;\r\n\r\n for (const [path, pathItem] of Object.entries(document.paths)) {\r\n if (!pathItem) continue;\r\n\r\n const methods: HttpMethod[] = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'];\r\n\r\n for (const method of methods) {\r\n const operation = pathItem[\r\n method.toLowerCase() as keyof OpenAPIV3.PathItemObject\r\n ] as OpenAPIV3.OperationObject;\r\n if (!operation) continue;\r\n\r\n const endpoint: ApiEndpointDefinition = {\r\n id:\r\n operation.operationId ||\r\n `${method.toLowerCase()}_${path.replace(/[^a-zA-Z0-9]/g, '_')}`,\r\n path,\r\n method,\r\n operationId: operation.operationId,\r\n summary: operation.summary,\r\n description: operation.description,\r\n tags: operation.tags || [],\r\n parameters: this.extractParameters(operation.parameters, pathItem.parameters, document),\r\n requestBody: this.extractRequestBody(operation.requestBody, document),\r\n responses: this.extractResponses(operation.responses, document),\r\n security: operation.security || [],\r\n deprecated: operation.deprecated || false,\r\n metadata: this.extractEndpointMetadata(operation),\r\n };\r\n\r\n endpoints.push(endpoint);\r\n }\r\n }\r\n\r\n return endpoints;\r\n }\r\n\r\n private extractParameters(\r\n operationParams?: (OpenAPIV3.ParameterObject | OpenAPIV3.ReferenceObject)[],\r\n pathParams?: (OpenAPIV3.ParameterObject | OpenAPIV3.ReferenceObject)[],\r\n document?: OpenAPIV3.Document\r\n ): ParameterDefinition[] {\r\n const parameters: ParameterDefinition[] = [];\r\n\r\n // IMPORTANT: Path-level parameters come first, then operation-level parameters\r\n // This ensures path parameters like {id} are included even if operation.parameters is empty\r\n const allParams = [...(pathParams || []), ...(operationParams || [])];\r\n\r\n // console.log(\"Extracting parameters:\", {\r\n // pathParams: pathParams?.length || 0,\r\n // operationParams: operationParams?.length || 0,\r\n // total: allParams.length,\r\n // })\r\n\r\n for (const param of allParams) {\r\n if (!param) continue;\r\n\r\n if ('$ref' in param) {\r\n // Handle reference objects - would need to resolve references\r\n console.log('Skipping $ref parameter:', param.$ref);\r\n continue;\r\n }\r\n\r\n const parameter: ParameterDefinition = {\r\n name: param.name,\r\n in: param.in as 'path' | 'query' | 'header' | 'cookie',\r\n required: param.required || param.in === 'path',\r\n schema: this.convertSchemaToZod(param.schema, document),\r\n description: param.description,\r\n example: param.example,\r\n deprecated: param.deprecated || false,\r\n };\r\n\r\n // console.log(\"Extracted parameter:\", {\r\n // name: parameter.name,\r\n // in: parameter.in,\r\n // required: parameter.required,\r\n // })\r\n\r\n parameters.push(parameter);\r\n }\r\n\r\n return parameters;\r\n }\r\n\r\n private extractRequestBody(\r\n requestBody?: OpenAPIV3.RequestBodyObject | OpenAPIV3.ReferenceObject,\r\n document?: OpenAPIV3.Document\r\n ): RequestBodyDefinition | undefined {\r\n if (!requestBody || '$ref' in requestBody) return undefined;\r\n\r\n const content: MediaTypeDefinition[] = [];\r\n\r\n if (requestBody.content) {\r\n for (const [mediaType, mediaTypeObject] of Object.entries(requestBody.content)) {\r\n content.push({\r\n type: mediaType,\r\n schema: this.convertSchemaToZod(mediaTypeObject.schema, document),\r\n examples: mediaTypeObject.examples,\r\n });\r\n }\r\n }\r\n\r\n return {\r\n required: requestBody.required || false,\r\n description: requestBody.description,\r\n content,\r\n };\r\n }\r\n\r\n private extractResponses(\r\n responses?: OpenAPIV3.ResponsesObject,\r\n document?: OpenAPIV3.Document\r\n ): ApiResponseDefinition[] {\r\n if (!responses) return [];\r\n\r\n const apiResponses: ApiResponseDefinition[] = [];\r\n\r\n for (const [statusCode, response] of Object.entries(responses)) {\r\n if (!response) continue;\r\n\r\n if ('$ref' in response) continue;\r\n\r\n const content: MediaTypeDefinition[] = [];\r\n\r\n if (response.content) {\r\n for (const [mediaType, mediaTypeObject] of Object.entries(response.content)) {\r\n if (!mediaTypeObject) continue;\r\n\r\n content.push({\r\n type: mediaType,\r\n schema: this.convertSchemaToZod(mediaTypeObject.schema, document),\r\n examples: mediaTypeObject.examples,\r\n });\r\n }\r\n }\r\n\r\n apiResponses.push({\r\n statusCode,\r\n description: response.description,\r\n content: content.length > 0 ? content : undefined,\r\n });\r\n }\r\n\r\n return apiResponses;\r\n }\r\n\r\n private extractSchemas(document: OpenAPIV3.Document): SchemaDefinition[] {\r\n const schemas: SchemaDefinition[] = [];\r\n\r\n if (document.components?.schemas) {\r\n for (const [name, schema] of Object.entries(document.components.schemas)) {\r\n if ('$ref' in schema) continue;\r\n\r\n schemas.push({\r\n name,\r\n schema: this.convertSchemaToZod(schema, document),\r\n description: schema.description,\r\n example: schema.example,\r\n deprecated: schema.deprecated || false,\r\n });\r\n }\r\n }\r\n\r\n return schemas;\r\n }\r\n\r\n private extractSecurity(document: OpenAPIV3.Document): SecuritySchemeDefinition[] {\r\n const security: SecuritySchemeDefinition[] = [];\r\n\r\n if (document.components?.securitySchemes) {\r\n for (const [name, scheme] of Object.entries(document.components.securitySchemes)) {\r\n if ('$ref' in scheme) continue;\r\n\r\n security.push({\r\n name,\r\n type: scheme.type as 'apiKey' | 'http' | 'oauth2' | 'openIdConnect',\r\n scheme: 'scheme' in scheme ? scheme.scheme : undefined,\r\n bearerFormat: 'bearerFormat' in scheme ? scheme.bearerFormat : undefined,\r\n flows: 'flows' in scheme ? scheme.flows : undefined,\r\n });\r\n }\r\n }\r\n\r\n return security;\r\n }\r\n\r\n private extractServers(\r\n document: OpenAPIV3.Document,\r\n originalDoc: OpenApiDocument\r\n ): ServerDefinition[] {\r\n if (document.servers && document.servers.length > 0) {\r\n return document.servers.map(server => ({\r\n url: server.url,\r\n description: server.description,\r\n variables: server.variables,\r\n }));\r\n }\r\n\r\n // Fallback for converted v2 documents\r\n if ('host' in originalDoc) {\r\n const v2Doc = originalDoc as OpenAPIV2.Document;\r\n return [\r\n {\r\n url: `${v2Doc.schemes?.[0] || 'https'}://${v2Doc.host}${v2Doc.basePath || ''}`,\r\n description: 'Converted from Swagger 2.0',\r\n },\r\n ];\r\n }\r\n\r\n return [];\r\n }\r\n\r\n private extractMetadata(document: OpenAPIV3.Document) {\r\n return {\r\n title: document.info.title,\r\n version: document.info.version,\r\n description: document.info.description,\r\n contact: document.info.contact,\r\n license: document.info.license,\r\n externalDocs: document.externalDocs,\r\n timestamp: Date.now(),\r\n };\r\n }\r\n\r\n private extractEndpointMetadata(operation: OpenAPIV3.OperationObject): EndpointMetadata {\r\n return {\r\n requiresAuth: (operation.security && operation.security.length > 0) || false,\r\n cacheStrategy: 'default',\r\n revalidationTags: operation.tags || [],\r\n streaming: false,\r\n fileUpload: this.hasFileUpload(operation),\r\n };\r\n }\r\n\r\n private hasFileUpload(operation: OpenAPIV3.OperationObject): boolean {\r\n if (!operation.requestBody || '$ref' in operation.requestBody) return false;\r\n\r\n const content = operation.requestBody.content;\r\n return Object.keys(content || {}).some(\r\n mediaType =>\r\n mediaType.includes('multipart/form-data') || mediaType.includes('application/octet-stream')\r\n );\r\n }\r\n\r\n private resolveReference(\r\n ref: string,\r\n document: OpenAPIV3.Document\r\n ): OpenAPIV3.SchemaObject | undefined {\r\n // Handle #/definitions/... (Swagger 2.0) and #/components/schemas/... (OpenAPI 3.0)\r\n const refPath = ref.replace('#/', '').split('/');\r\n\r\n if (refPath[0] === 'definitions') {\r\n // Swagger 2.0 style reference\r\n const schemaName = refPath[1];\r\n if (!schemaName) return undefined;\r\n return document.components?.schemas?.[schemaName] as OpenAPIV3.SchemaObject;\r\n } else if (refPath[0] === 'components' && refPath[1] === 'schemas') {\r\n // OpenAPI 3.0 style reference\r\n const schemaName = refPath[2];\r\n if (!schemaName) return undefined;\r\n return document.components?.schemas?.[schemaName] as OpenAPIV3.SchemaObject;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private convertSchemaToZod(\r\n schema?: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject,\r\n document?: OpenAPIV3.Document\r\n ): z.ZodSchema<any> {\r\n if (!schema) return z.any();\r\n\r\n if ('$ref' in schema) {\r\n // Extract schema name from reference\r\n const refParts = schema.$ref.split('/');\r\n const schemaName = refParts[refParts.length - 1];\r\n\r\n // Create a custom schema that holds the reference name\r\n // This will be resolved during code generation\r\n const refSchema = z.any();\r\n // Add custom property to track the reference\r\n (refSchema as any)._schemaRef = schemaName;\r\n return refSchema;\r\n }\r\n\r\n switch (schema.type) {\r\n case 'string':\r\n let stringSchema = z.string();\r\n if (schema.minLength !== undefined) {\r\n stringSchema = stringSchema.min(\r\n schema.minLength,\r\n `Minimum length is ${schema.minLength}`\r\n );\r\n }\r\n if (schema.maxLength !== undefined) {\r\n stringSchema = stringSchema.max(\r\n schema.maxLength,\r\n `Maximum length is ${schema.maxLength}`\r\n );\r\n }\r\n if (schema.pattern) {\r\n stringSchema = stringSchema.regex(new RegExp(schema.pattern), 'Invalid format');\r\n }\r\n if (schema.format === 'email') {\r\n stringSchema = stringSchema.email('Invalid email format');\r\n }\r\n if (schema.format === 'uri' || schema.format === 'url') {\r\n stringSchema = stringSchema.url('Invalid URL format');\r\n }\r\n if (schema.format === 'uuid') {\r\n stringSchema = stringSchema.uuid('Invalid UUID format');\r\n }\r\n if (schema.enum) {\r\n return z.enum(schema.enum as [string, ...string[]]);\r\n }\r\n return stringSchema;\r\n\r\n case 'number':\r\n case 'integer':\r\n let numberSchema = schema.type === 'integer' ? z.number().int() : z.number();\r\n if (schema.minimum !== undefined) {\r\n numberSchema = numberSchema.min(schema.minimum, `Minimum value is ${schema.minimum}`);\r\n }\r\n if (schema.maximum !== undefined) {\r\n numberSchema = numberSchema.max(schema.maximum, `Maximum value is ${schema.maximum}`);\r\n }\r\n return numberSchema;\r\n\r\n case 'boolean':\r\n return z.boolean();\r\n\r\n case 'array':\r\n const itemSchema = this.convertSchemaToZod(schema.items, document);\r\n let arraySchema = z.array(itemSchema);\r\n if (schema.minItems !== undefined) {\r\n arraySchema = arraySchema.min(\r\n schema.minItems,\r\n `Minimum ${schema.minItems} items required`\r\n );\r\n }\r\n if (schema.maxItems !== undefined) {\r\n arraySchema = arraySchema.max(\r\n schema.maxItems,\r\n `Maximum ${schema.maxItems} items allowed`\r\n );\r\n }\r\n return arraySchema;\r\n\r\n case 'object':\r\n if (schema.properties) {\r\n const shape: Record<string, z.ZodSchema> = {};\r\n const required = schema.required || [];\r\n\r\n for (const [propName, propSchema] of Object.entries(schema.properties)) {\r\n let propZodSchema = this.convertSchemaToZod(propSchema, document);\r\n if (!required.includes(propName)) {\r\n propZodSchema = propZodSchema.optional();\r\n }\r\n shape[propName] = propZodSchema;\r\n }\r\n\r\n return z.object(shape);\r\n }\r\n return z.record(z.string(), z.any());\r\n\r\n default:\r\n return z.any();\r\n }\r\n }\r\n\r\n clearCache(): void {\r\n this.schemaCache.clear();\r\n }\r\n}\r\n","import type {\r\n BridgeConfiguration,\r\n GenerationContext,\r\n GeneratedFile,\r\n ApiEndpointDefinition,\r\n ParameterDefinition,\r\n} from '@/core/types';\r\n\r\nexport class ApiClientGenerator {\r\n constructor(private readonly configuration: BridgeConfiguration) {}\r\n\r\n /**\r\n * Generate import paths based on configuration\r\n */\r\n private buildImportPath(relativePath: string): string {\r\n const outputDirectory = this.configuration.outputDir || 'generated';\r\n const cleanPath = relativePath.startsWith('/') ? relativePath.slice(1) : relativePath;\r\n let importBasePath = outputDirectory;\r\n if (importBasePath.startsWith('src/')) {\r\n importBasePath = importBasePath.substring(4);\r\n }\r\n return `@/${importBasePath}/${cleanPath}`;\r\n }\r\n\r\n async generate(context: GenerationContext): Promise<GeneratedFile[]> {\r\n const { schema } = context;\r\n const generatedFiles: GeneratedFile[] = [];\r\n\r\n // Generate enhanced base client\r\n generatedFiles.push(this.generateEnhancedBaseClient());\r\n\r\n // Generate endpoint-specific clients\r\n generatedFiles.push(...this.generateEndpointClients(schema.endpoints));\r\n\r\n // Generate main client export\r\n generatedFiles.push(this.generateMainClient(schema.endpoints));\r\n\r\n // Generate client utilities\r\n generatedFiles.push(this.generateClientUtilities());\r\n\r\n return generatedFiles;\r\n }\r\n\r\n private generateEnhancedBaseClient(): GeneratedFile {\r\n const { api, auth } = this.configuration;\r\n const authUtilsImport = this.buildImportPath('auth/utils');\r\n const authPath = auth?.authPath || '@/lib/auth';\r\n const tokenGetter = auth?.tokenGetter || 'auth';\r\n\r\n const content = `/**\r\n * The HTTP client is automatically created by \"mulink\"\r\n * \r\n * Next.js 16.0.1 Best Practices:\r\n * - Proper separation of client/server code\r\n * - Dynamic imports for server-only modules\r\n * - Works in both Server Components and Client Components\r\n * - Optimized bundle size by avoiding server-only code in client bundle\r\n */\r\nimport { z } from 'zod'\r\nimport { cache } from 'react'\r\n\r\n/**\r\n * Server-only modules interface\r\n * Next.js 16.0.1: These modules are only available on the server\r\n * We use dynamic imports to avoid bundling them in the client\r\n */\r\ntype NextHeadersModule = typeof import('next/headers')\r\ntype NextReadonlyHeaders = Awaited<ReturnType<NextHeadersModule['headers']>>\r\ntype NextReadonlyCookies = Awaited<ReturnType<NextHeadersModule['cookies']>>\r\n\r\nlet serverOnlyModules: {\r\n cookies?: () => NextReadonlyCookies\r\n headers?: () => Headers\r\n after?: (fn: () => void | Promise<void>) => void\r\n updateTag?: (tag: string) => void\r\n} | null = null\r\n\r\nfunction toMutableHeaders(source: NextReadonlyHeaders) {\r\n const mutableHeaders = new Headers()\r\n source.forEach((value, key) => {\r\n mutableHeaders.append(key, value)\r\n })\r\n return mutableHeaders\r\n}\r\n\r\n/**\r\n * Lazy load server-only modules only when needed (server-side)\r\n * Next.js 16.0.1: This ensures server-only code is not bundled in the client\r\n * \r\n * @returns Server-only modules or undefined if on client-side\r\n */\r\nasync function getServerModules() {\r\n if (serverOnlyModules !== null) return serverOnlyModules\r\n \r\n // Only attempt to import on server-side\r\n // Next.js 16.0.1: typeof window check ensures we're on the server\r\n if (typeof window === 'undefined') {\r\n try {\r\n const headersModule = await import('next/headers').catch(() => null)\r\n const serverModule = await import('next/server').catch(() => null)\r\n const cacheModule = await import('next/cache').catch(() => null)\r\n \r\n const getReadonlyHeaders = headersModule?.headers as (() => NextReadonlyHeaders) | undefined\r\n const getReadonlyCookies = headersModule?.cookies as (() => NextReadonlyCookies) | undefined\r\n serverOnlyModules = {\r\n cookies: getReadonlyCookies,\r\n headers: getReadonlyHeaders ? () => toMutableHeaders(getReadonlyHeaders()) : undefined,\r\n after: serverModule?.after,\r\n updateTag: cacheModule?.updateTag,\r\n }\r\n } catch (error) {\r\n // Server modules not available (pages router or other contexts)\r\n // Silently fail and continue without server-only features\r\n if (process.env.NODE_ENV === 'development') {\r\n console.warn('[Mulink] Server modules not available:', error)\r\n }\r\n serverOnlyModules = {\r\n cookies: undefined,\r\n headers: undefined,\r\n after: undefined,\r\n updateTag: undefined,\r\n }\r\n }\r\n } else {\r\n // Client-side: server modules not available\r\n // This is expected behavior - server modules should not be used on client\r\n serverOnlyModules = {\r\n cookies: undefined,\r\n headers: undefined,\r\n after: undefined,\r\n updateTag: undefined,\r\n }\r\n }\r\n \r\n return serverOnlyModules\r\n}\r\n\r\n// Types and interfaces\r\nexport interface RequestConfiguration extends RequestInit {\r\n timeout?: number\r\n retries?: number\r\n retryDelay?: number\r\n retryCondition?: (error: Error, attempt: number) => boolean\r\n validateResponse?: boolean\r\n responseSchema?: z.ZodSchema<any>\r\n skipAuth?: boolean\r\n skipCache?: boolean\r\n cacheKey?: string\r\n cacheTags?: string[]\r\n revalidate?: number | false\r\n connection?: 'keep-alive' | 'close'\r\n updateTag?: (tag: string) => void\r\n middleware?: RequestMiddleware[]\r\n method?: string;\r\n url?: string;\r\n baseURL?: string;\r\n onUploadProgress?: (progress: ProgressEvent) => void\r\n onDownloadProgress?: (progress: ProgressEvent) => void\r\n}\r\n\r\nexport interface ClientResponse<TData = any> {\r\n data: TData\r\n status: number\r\n statusText: string\r\n headers: Headers\r\n cached?: boolean\r\n retryCount?: number\r\n responseTime?: number\r\n requestId?: string\r\n fromCache?: boolean\r\n}\r\n\r\nexport interface RequestMiddleware {\r\n name: string\r\n onRequest?: (config: RequestConfiguration) => Promise<RequestConfiguration> | RequestConfiguration\r\n onResponse?: <T>(response: ClientResponse<T>) => Promise<ClientResponse<T>> | ClientResponse<T>\r\n onError?: (error: ApiError) => Promise<never> | never\r\n}\r\n\r\nexport interface RequestMetrics {\r\n requestId: string\r\n method: string\r\n url: string\r\n startTime: number\r\n endTime?: number\r\n duration?: number\r\n status?: number\r\n cached?: boolean\r\n retryCount?: number\r\n error?: string\r\n}\r\n\r\n// Enhanced error classes\r\nexport class ApiError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly status: number,\r\n public readonly statusText: string,\r\n public readonly response?: Response,\r\n public readonly data?: any,\r\n public readonly requestId?: string\r\n ) {\r\n super(message)\r\n this.name = 'ApiError'\r\n }\r\n\r\n get isClientError(): boolean {\r\n return this.status >= 400 && this.status < 500\r\n }\r\n\r\n get isServerError(): boolean {\r\n return this.status >= 500\r\n }\r\n\r\n get isNetworkError(): boolean {\r\n return this.status === 0\r\n }\r\n\r\n get isRetryable(): boolean {\r\n return this.isServerError || this.isNetworkError || this.status === 429\r\n }\r\n}\r\n\r\nexport class ValidationError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly errors: z.ZodError,\r\n public readonly requestId?: string\r\n ) {\r\n super(message)\r\n this.name = 'ValidationError'\r\n }\r\n}\r\n\r\nexport class TimeoutError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly timeout: number,\r\n public readonly requestId?: string\r\n ) {\r\n super(message)\r\n this.name = 'TimeoutError'\r\n }\r\n}\r\n\r\nexport class NetworkError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly originalError: Error,\r\n public readonly requestId?: string\r\n ) {\r\n super(message)\r\n this.name = 'NetworkError'\r\n }\r\n}\r\n\r\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS'\r\n\r\n// Request deduplication cache\r\nconst requestCache = new Map<string, Promise<any>>()\r\n\r\n// Metrics collection\r\nconst metricsCollector = {\r\n requests: new Map<string, RequestMetrics>(),\r\n \r\n startRequest(requestId: string, method: string, url: string): void {\r\n this.requests.set(requestId, {\r\n requestId,\r\n method,\r\n url,\r\n startTime: Date.now()\r\n })\r\n },\r\n \r\n async endRequest(requestId: string, status?: number, cached?: boolean, retryCount?: number, error?: string): Promise<void> {\r\n const metrics = this.requests.get(requestId)\r\n if (metrics) {\r\n metrics.endTime = Date.now()\r\n metrics.duration = metrics.endTime - metrics.startTime\r\n metrics.status = status\r\n metrics.cached = cached\r\n metrics.retryCount = retryCount\r\n metrics.error = error\r\n \r\n // Send metrics in background (server-side only)\r\n try {\r\n const serverModules = await getServerModules()\r\n if (serverModules?.after) {\r\n serverModules.after(async () => {\r\n await this.sendMetrics(metrics)\r\n })\r\n } else {\r\n // Client-side: send metrics immediately\r\n await this.sendMetrics(metrics)\r\n }\r\n } catch (error) {\r\n // Server modules not available, send metrics immediately\r\n await this.sendMetrics(metrics)\r\n }\r\n }\r\n },\r\n \r\n async sendMetrics(metrics: RequestMetrics): Promise<void> {\r\n if (process.env.NODE_ENV === 'development') {\r\n console.log('[API_METRICS]', metrics)\r\n }\r\n \r\n // In production, send to your analytics service\r\n // await analytics.track('api_request', metrics)\r\n }\r\n}\r\n\r\nexport class BaseApiClient {\r\n private readonly baseUrl: string\r\n private readonly defaultTimeout: number\r\n private readonly defaultRetries: number\r\n private readonly defaultHeaders: Record<string, string>\r\n private readonly defaultUserAgent: string\r\n private readonly middleware: RequestMiddleware[] = []\r\n\r\n constructor() {\r\n this.baseUrl = process.env.NEXT_PUBLIC_API_URL || process.env.API_BASE_URL || '${api?.baseUrl || 'http://localhost:3000/api'}'\r\n this.defaultTimeout = ${api?.timeout || 30000}\r\n this.defaultRetries = ${api?.retries || 3}\r\n this.defaultHeaders = ${JSON.stringify(api?.headers || {}, null, 6)}\r\n this.defaultUserAgent = '${api?.userAgent || 'Mulink-Client/3.4.5'}'\r\n \r\n // Add default middleware\r\n this.addMiddleware({\r\n name: 'request-id',\r\n onRequest: this.addRequestId.bind(this)\r\n })\r\n \r\n this.addMiddleware({\r\n name: 'security-headers',\r\n onRequest: this.addSecurityHeaders.bind(this)\r\n })\r\n }\r\n\r\n // Middleware management\r\n addMiddleware(middleware: RequestMiddleware): void {\r\n this.middleware.push(middleware)\r\n }\r\n\r\n removeMiddleware(name: string): void {\r\n const index = this.middleware.findIndex(m => m.name === name)\r\n if (index > -1) {\r\n this.middleware.splice(index, 1)\r\n }\r\n }\r\n\r\n // Enhanced authentication\r\n private async getAuthHeaders(): Promise<Record<string, string>> {\r\n const getAuthHeaders: Record<string, string> = {}\r\n \r\n try {\r\n // Get server modules (only available server-side)\r\n const serverModules = await getServerModules()\r\n \r\n // Get auth token from various sources (server-side only)\r\n if (serverModules?.cookies && serverModules.headers) {\r\n try {\r\n const cookieStore = serverModules.cookies()\r\n const headersList = serverModules.headers()\r\n \r\n // Try cookie first\r\n const tokenFromCookie = cookieStore.get('auth-token')?.value\r\n if (tokenFromCookie) {\r\n getAuthHeaders.Authorization = \\`Bearer \\${tokenFromCookie}\\`\r\n return getAuthHeaders\r\n }\r\n \r\n // Try header\r\n const tokenFromHeader = headersList.get('authorization')\r\n if (tokenFromHeader) {\r\n getAuthHeaders.Authorization = tokenFromHeader\r\n return getAuthHeaders\r\n }\r\n } catch (error) {\r\n // Server modules not available (client-side) or error accessing\r\n }\r\n }\r\n \r\n // Try external auth service\r\n ${\r\n this.configuration.auth?.enabled\r\n ? `try {\r\n const authModule = await import('${authPath}').catch(() => null)\r\n if (authModule && authModule.${tokenGetter}) {\r\n const session = await authModule.${tokenGetter}()\r\n \r\n if (session?.accessToken) {\r\n getAuthHeaders.Authorization = \\`Bearer \\${session.accessToken}\\`\r\n return getAuthHeaders\r\n }\r\n }\r\n } catch (error) {\r\n // Auth not available or error accessing\r\n if (process.env.NODE_ENV === 'development') {\r\n console.warn('[Mulink] Auth error:', error)\r\n }\r\n }`\r\n : '// No external auth configured'\r\n }\r\n } catch (error) {\r\n console.warn('Failed to get auth token:', error)\r\n }\r\n \r\n // Fallback to API key from environment\r\n const secureApiKey = process.env.NEXT_SECURE_API_KEY\r\n if (secureApiKey) {\r\n getAuthHeaders[\"Authorization\"] = \\`Api-Key \\${secureApiKey}\\`\\\r\n }\r\n \r\n return getAuthHeaders\r\n }\r\n\r\n // Security headers middleware\r\n private async addSecurityHeaders(config: RequestConfiguration): Promise<RequestConfiguration> {\r\n const securityHeaders: Record<string, string> = {}\r\n \r\n try {\r\n // Get server modules (only available server-side)\r\n const serverModules = await getServerModules()\r\n \r\n if (serverModules?.headers) {\r\n try {\r\n const headersList = serverModules.headers()\r\n \r\n // CSRF protection\r\n const csrfToken = headersList.get('x-csrf-token')\r\n if (csrfToken) {\r\n securityHeaders['X-CSRF-Token'] = csrfToken\r\n }\r\n \r\n // Request origin\r\n const origin = headersList.get('origin')\r\n if (origin) {\r\n securityHeaders['Origin'] = origin\r\n }\r\n \r\n // User agent\r\n const userAgent = headersList.get('user-agent')\r\n if (userAgent) {\r\n securityHeaders['User-Agent'] = userAgent\r\n }\r\n } catch (error) {\r\n // Server modules not available (client-side) or error accessing\r\n }\r\n }\r\n } catch (error) {\r\n // Headers not available\r\n }\r\n \r\n return {\r\n ...config,\r\n headers: {\r\n ...config.headers,\r\n ...securityHeaders\r\n }\r\n }\r\n }\r\n\r\n // Request ID middleware\r\n private async addRequestId(config: RequestConfiguration): Promise<RequestConfiguration> {\r\n const requestId = \\`req_\\${Date.now()}_\\${Math.random().toString(36).substr(2, 9)}\\`\r\n \r\n return {\r\n ...config,\r\n headers: {\r\n ...config.headers,\r\n 'X-Request-ID': requestId\r\n }\r\n }\r\n }\r\n\r\n // Enhanced URL building with validation\r\n private buildUrl(\r\n path: string, \r\n pathParameters: Record<string, string | number> = {}, \r\n queryParameters: Record<string, unknown> = {}\r\n ): string {\r\n let url = path\r\n \r\n // Replace path parameters with validation and type conversion\r\n for (const [key, value] of Object.entries(pathParameters)) {\r\n if (!value && value !== 0) {\r\n throw new ValidationError(\\`Missing required path parameter: \\${key}\\`, {} as z.ZodError)\r\n }\r\n // Convert to string for URL encoding\r\n const stringValue = typeof value === 'number' ? String(value) : String(value)\r\n url = url.replace(\\`{\\${key}}\\`, encodeURIComponent(stringValue))\r\n }\r\n \r\n // Validate no unreplaced parameters remain\r\n const unreplacedParams = url.match(/{[^}]+}/g)\r\n if (unreplacedParams) {\r\n throw new ValidationError(\r\n \\`Unreplaced path parameters: \\${unreplacedParams.join(', ')}\\`,\r\n {} as z.ZodError\r\n )\r\n }\r\n \r\n // Add query parameters with proper encoding\r\n const searchParams = new URLSearchParams()\r\n for (const [key, value] of Object.entries(queryParameters)) {\r\n if (value !== undefined && value !== null && value !== '') {\r\n if (Array.isArray(value)) {\r\n value.forEach(v => searchParams.append(key, String(v)))\r\n } else if (typeof value === 'object') {\r\n searchParams.append(key, JSON.stringify(value))\r\n } else {\r\n searchParams.append(key, String(value))\r\n }\r\n }\r\n }\r\n \r\n const queryString = searchParams.toString()\r\n const fullUrl = \\`\\${this.baseUrl}\\${url}\\${queryString ? \\`?\\${queryString}\\` : ''}\\`\r\n \r\n // URL validation\r\n try {\r\n new URL(fullUrl)\r\n } catch {\r\n throw new ValidationError(\\`Invalid URL constructed: \\${fullUrl}\\`, {} as z.ZodError)\r\n }\r\n \r\n return fullUrl\r\n }\r\n\r\n // Enhanced request execution with caching and deduplication\r\n private async executeRequest<TData>(\r\n method: HttpMethod,\r\n path: string,\r\n options: {\r\n pathParams?: Record<string, string | number>\r\n queryParams?: Record<string, unknown>\r\n body?: unknown\r\n headers?: Record<string, string>\r\n config?: RequestConfiguration\r\n responseSchema?: z.ZodSchema<TData>\r\n } = {}\r\n ): Promise<ClientResponse<TData>> {\r\n const {\r\n pathParams = {},\r\n queryParams = {},\r\n body,\r\n headers = {},\r\n config = {},\r\n responseSchema\r\n } = options\r\n\r\n const {\r\n timeout = this.defaultTimeout,\r\n retries = this.defaultRetries,\r\n retryDelay = 1000,\r\n retryCondition = (error: Error, attempt: number) => {\r\n if (error instanceof ApiError) {\r\n return error.isRetryable && attempt < retries\r\n }\r\n return attempt < retries\r\n },\r\n validateResponse = true,\r\n skipAuth = false,\r\n skipCache = false,\r\n cacheKey,\r\n cacheTags = [],\r\n revalidate = 300,\r\n connection,\r\n updateTag,\r\n middleware = [],\r\n ...fetchOptions\r\n } = config\r\n\r\n const url = this.buildUrl(path, pathParams, queryParams)\r\n const requestId = \\`req_\\${Date.now()}_\\${Math.random().toString(36).substr(2, 9)}\\`\r\n \r\n // Start metrics collection\r\n metricsCollector.startRequest(requestId, method, url)\r\n\r\n // Request deduplication for GET requests\r\n if (method === 'GET' && !skipCache) {\r\n const dedupeKey = cacheKey || \\`\\${method}:\\${url}\\`\r\n const existingRequest = requestCache.get(dedupeKey)\r\n \r\n if (existingRequest) {\r\n console.log(\\`[DEDUPE] Using existing request for \\${dedupeKey}\\`)\r\n const result = await existingRequest\r\n await metricsCollector.endRequest(requestId, result.status, true)\r\n return { ...result, fromCache: true, requestId }\r\n }\r\n \r\n // Cache the promise\r\n const requestPromise = this.executeRequestInternal<TData>(\r\n method, url, body, headers, fetchOptions, timeout, retries, \r\n retryDelay, retryCondition, validateResponse, skipAuth, \r\n responseSchema, requestId, [...this.middleware, ...middleware],\r\n cacheTags, revalidate, connection, updateTag\r\n )\r\n \r\n requestCache.set(dedupeKey, requestPromise)\r\n \r\n // Clean up cache after request completes\r\n requestPromise.finally(() => {\r\n requestCache.delete(dedupeKey)\r\n })\r\n \r\n return requestPromise\r\n }\r\n\r\n return this.executeRequestInternal<TData>(\r\n method, url, body, headers, fetchOptions, timeout, retries,\r\n retryDelay, retryCondition, validateResponse, skipAuth,\r\n responseSchema, requestId, [...this.middleware, ...middleware],\r\n cacheTags, revalidate, connection, updateTag\r\n )\r\n }\r\n\r\n // Internal request execution with middleware support\r\n private async executeRequestInternal<TData>(\r\n method: HttpMethod,\r\n url: string,\r\n body: any,\r\n headers: Record<string, string>,\r\n fetchOptions: RequestInit,\r\n timeout: number,\r\n retries: number,\r\n retryDelay: number,\r\n retryCondition: (error: Error, attempt: number) => boolean,\r\n validateResponse: boolean,\r\n skipAuth: boolean,\r\n responseSchema?: z.ZodSchema<TData>,\r\n requestId?: string,\r\n middleware: RequestMiddleware[] = [],\r\n cacheTags: string[] = [],\r\n revalidate?: number | false,\r\n connection?: 'keep-alive' | 'close',\r\n updateTag?: (tag: string) => void\r\n ): Promise<ClientResponse<TData>> {\r\n const startTime = Date.now()\r\n\r\n // Build initial request configuration\r\n let requestConfig: RequestConfiguration = {\r\n method,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json',\r\n 'User-Agent': this.defaultUserAgent,\r\n ...this.defaultHeaders,\r\n ...(skipAuth ? {} : await this.getAuthHeaders()),\r\n ...headers\r\n },\r\n ...fetchOptions\r\n }\r\n\r\n // Apply request middleware\r\n for (const mw of middleware) {\r\n if (mw.onRequest) {\r\n requestConfig = await mw.onRequest(requestConfig)\r\n }\r\n }\r\n\r\n // Add body for non-GET requests\r\n if (body && method !== 'GET' && method !== 'HEAD') {\r\n if (body instanceof FormData || body instanceof URLSearchParams) {\r\n requestConfig.body = body\r\n // Remove content-type for FormData (browser sets it with boundary)\r\n if (body instanceof FormData) {\r\n delete (requestConfig.headers as Record<string, string>)['Content-Type']\r\n }\r\n } else {\r\n requestConfig.body = JSON.stringify(body)\r\n }\r\n }\r\n\r\n // Execute with retries and middleware\r\n let lastError: Error = new Error('Unknown error')\r\n let retryCount = 0\r\n \r\n for (let attempt = 0; attempt <= retries; attempt++) {\r\n try {\r\n const controller = new AbortController()\r\n const timeoutId = setTimeout(() => {\r\n controller.abort()\r\n }, timeout)\r\n \r\n // Next.js 16.0.1: Build fetch options with cache tags and connection\r\n // Only include next options if we're on the server (Next.js App Router)\r\n const fetchInit: RequestInit & { next?: { tags?: string[]; revalidate?: number | false; connection?: string } } = {\r\n ...requestConfig,\r\n signal: controller.signal\r\n }\r\n \r\n // Add Next.js-specific options only if we have cache tags, revalidate, or connection\r\n // Next.js 16.0.1: Enhanced cache tag support with updateTag\r\n if (cacheTags && cacheTags.length > 0 || revalidate !== undefined || connection) {\r\n fetchInit.next = {}\r\n \r\n if (cacheTags && cacheTags.length > 0) {\r\n fetchInit.next.tags = cacheTags\r\n }\r\n \r\n if (revalidate !== undefined) {\r\n fetchInit.next.revalidate = revalidate === false ? false : revalidate\r\n }\r\n \r\n // Next.js 16.0.1: Connection keep-alive for persistent connections\r\n if (connection) {\r\n fetchInit.next.connection = connection\r\n }\r\n }\r\n \r\n const response = await fetch(url, fetchInit)\r\n \r\n // Next.js 16.0.1: Update cache tags dynamically using updateTag from next/cache\r\n // This allows for granular cache invalidation\r\n if (cacheTags && cacheTags.length > 0) {\r\n try {\r\n // Dynamically import updateTag only on server-side\r\n const serverModules = await getServerModules()\r\n const tagUpdater = updateTag || serverModules?.updateTag\r\n \r\n if (tagUpdater && typeof window === 'undefined') {\r\n // Update cache tags on server-side only\r\n cacheTags.forEach((tag: string) => {\r\n try {\r\n tagUpdater(tag)\r\n } catch (error) {\r\n // Silently fail if updateTag is not available\r\n if (process.env.NODE_ENV === 'development') {\r\n console.warn(\\`[Mulink] Failed to update cache tag: \\${tag}\\`, error)\r\n }\r\n }\r\n })\r\n }\r\n } catch (error) {\r\n // Silently fail if updateTag is not available (client-side or error)\r\n if (process.env.NODE_ENV === 'development') {\r\n console.warn('[Mulink] Failed to update cache tags:', error)\r\n }\r\n }\r\n }\r\n \r\n clearTimeout(timeoutId)\r\n const responseTime = Date.now() - startTime\r\n\r\n // Handle HTTP errors\r\n if (!response.ok) {\r\n const errorData = await this.parseErrorResponse(response)\r\n const apiError = new ApiError(\r\n errorData.message || \\`HTTP \\${response.status}: \\${response.statusText}\\`,\r\n response.status,\r\n response.statusText,\r\n response,\r\n errorData,\r\n requestId\r\n )\r\n\r\n // Apply error middleware\r\n for (const mw of middleware) {\r\n if (mw.onError) {\r\n await mw.onError(apiError)\r\n }\r\n }\r\n\r\n throw apiError\r\n }\r\n\r\n // Parse response\r\n const data = await this.parseResponse<TData>(response, responseSchema, validateResponse)\r\n\r\n let clientResponse: ClientResponse<TData> = {\r\n data,\r\n status: response.status,\r\n statusText: response.statusText,\r\n headers: response.headers,\r\n retryCount,\r\n responseTime,\r\n requestId\r\n }\r\n\r\n // Apply response middleware\r\n for (const mw of middleware) {\r\n if (mw.onResponse) {\r\n clientResponse = await mw.onResponse(clientResponse)\r\n }\r\n }\r\n\r\n // End metrics collection\r\n await metricsCollector.endRequest(requestId!, response.status, false, retryCount)\r\n\r\n return clientResponse\r\n } catch (error) {\r\n lastError = error as Error\r\n retryCount = attempt\r\n\r\n // Check if we should retry\r\n if (attempt < retries && retryCondition(lastError, attempt)) {\r\n // Exponential backoff with jitter\r\n const delay = retryDelay * Math.pow(2, attempt) + Math.random() * 1000\r\n await new Promise(resolve => setTimeout(resolve, delay))\r\n continue\r\n }\r\n\r\n break\r\n }\r\n }\r\n\r\n // End metrics collection with error\r\n await metricsCollector.endRequest(\r\n requestId!, \r\n undefined, \r\n false, \r\n retryCount, \r\n lastError.message\r\n )\r\n\r\n // Enhance error with context\r\n if (lastError instanceof Error && lastError.name === 'AbortError') {\r\n throw new TimeoutError(\\`Request timeout after \\${timeout}ms\\`, timeout, requestId)\r\n }\r\n\r\n if (lastError instanceof TypeError && lastError.message.includes('fetch')) {\r\n throw new NetworkError('Network request failed', lastError, requestId)\r\n }\r\n\r\n throw lastError\r\n }\r\n\r\n // Enhanced response parsing with streaming support\r\n private async parseResponse<TData>(\r\n response: Response,\r\n schema?: z.ZodSchema<TData>,\r\n shouldValidate = true\r\n ): Promise<TData> {\r\n const contentType = response.headers.get('content-type') || ''\r\n let data: any\r\n\r\n // Handle different content types\r\n if (contentType.includes('application/json')) {\r\n data = await response.json()\r\n } else if (contentType.includes('text/')) {\r\n data = await response.text()\r\n } else if (contentType.includes('application/octet-stream') || contentType.includes('application/pdf')) {\r\n data = await response.blob()\r\n } else if (contentType.includes('multipart/form-data')) {\r\n data = await response.formData()\r\n } else {\r\n // Try JSON first, fallback to text\r\n try {\r\n data = await response.json()\r\n } catch {\r\n data = await response.text()\r\n }\r\n }\r\n\r\n // Validate response if schema provided\r\n if (shouldValidate && schema) {\r\n try {\r\n return await schema.parseAsync(data)\r\n } catch (error) {\r\n if (error instanceof z.ZodError) {\r\n throw new ValidationError('Response validation failed', error)\r\n }\r\n throw error\r\n }\r\n }\r\n\r\n return data\r\n }\r\n\r\n // Enhanced error response parsing\r\n private async parseErrorResponse(response: Response): Promise<any> {\r\n try {\r\n const contentType = response.headers.get('content-type') || ''\r\n \r\n if (contentType.includes('application/json')) {\r\n return await response.json()\r\n } else if (contentType.includes('text/')) {\r\n const text = await response.text()\r\n return { message: text }\r\n } else {\r\n return { message: response.statusText }\r\n }\r\n } catch {\r\n return { message: response.statusText || 'Unknown error' }\r\n }\r\n }\r\n\r\n // Public method for making requests with caching\r\n async request<TData>(\r\n method: HttpMethod,\r\n path: string,\r\n options?: {\r\n pathParams?: Record<string, string | number>\r\n queryParams?: Record<string, unknown>\r\n body?: unknown\r\n headers?: Record<string, string>\r\n config?: RequestConfiguration\r\n responseSchema?: z.ZodSchema<TData>\r\n }\r\n ): Promise<ClientResponse<TData>> {\r\n return this.executeRequest(method, path, options)\r\n }\r\n\r\n // Cached convenience methods\r\nasync get<TData>(\r\n path: string, \r\n options?: Omit<Parameters<typeof this.request>[2], 'body'>\r\n): Promise<ClientResponse<TData>> {\r\n return cache(async () => {\r\n return this.request<TData>('GET', path, options)\r\n })()\r\n}\r\n\r\n async post<TData>(\r\n path: string, \r\n body?: unknown, \r\n options?: Omit<Parameters<typeof this.request>[2], 'body'>\r\n ): Promise<ClientResponse<TData>> {\r\n return this.request('POST', path, { ...options, body })\r\n }\r\n\r\n async put<TData>(\r\n path: string, \r\n body?: unknown, \r\n options?: Omit<Parameters<typeof this.request>[2], 'body'>\r\n ): Promise<ClientResponse<TData>> {\r\n return this.request('PUT', path, { ...options, body })\r\n }\r\n\r\n async patch<TData>(\r\n path: string, \r\n body?: unknown, \r\n options?: Omit<Parameters<typeof this.request>[2], 'body'>\r\n ): Promise<ClientResponse<TData>> {\r\n return this.request('PATCH', path, { ...options, body })\r\n }\r\n\r\n async delete<TData>(\r\n path: string, \r\n options?: Omit<Parameters<typeof this.request>[2], 'body'>\r\n ): Promise<ClientResponse<TData>> {\r\n return this.request('DELETE', path, options)\r\n }\r\n\r\n // Utility methods\r\n clearCache(): void {\r\n requestCache.clear()\r\n }\r\n\r\n getMetrics(): Map<string, RequestMetrics> {\r\n return new Map(metricsCollector.requests)\r\n }\r\n}`;\r\n\r\n return {\r\n path: 'client/base.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: [\r\n 'BaseApiClient',\r\n 'ApiError',\r\n 'ValidationError',\r\n 'TimeoutError',\r\n 'NetworkError',\r\n 'RequestConfiguration',\r\n 'ClientResponse',\r\n 'RequestMiddleware',\r\n 'HttpMethod',\r\n ],\r\n imports: ['zod', 'react'],\r\n dependencies: this.configuration.auth?.enabled ? [authUtilsImport] : [],\r\n },\r\n };\r\n }\r\n\r\n private generateClientUtilities(): GeneratedFile {\r\n const { api } = this.configuration;\r\n const errorHandling = api?.errorHandling;\r\n const enableAuthErrorHandling = errorHandling?.enableAuthErrorHandling !== false; // Default to true\r\n const authErrorHandlerPath = errorHandling?.authErrorHandlerPath || '@/lib/auth-error-handler';\r\n \r\n // Build auth error middleware if enabled\r\n const authErrorMiddlewareCode = enableAuthErrorHandling ? `\r\n// Authentication error middleware\r\n// Handles 401/403 errors and redirects to login when needed\r\nexport const authErrorMiddleware: RequestMiddleware = {\r\n name: 'auth-error',\r\n onError: async (error) => {\r\n if (typeof window === 'undefined') {\r\n throw error\r\n }\r\n\r\n const status = error.status\r\n const isAuthError = status === 401 || status === 403\r\n \r\n if (isAuthError) {\r\n const errorMessage = error.data?.detail || error.message || ''\r\n const errorCode = (error.data as any)?.error_code || ''\r\n const isInactive = status === 403 && (\r\n errorMessage.toLowerCase().includes('not active') ||\r\n errorMessage.toLowerCase().includes('inactive') ||\r\n errorMessage.toLowerCase().includes('account is not active') ||\r\n errorCode.toLowerCase() === 'user_account_inactive'\r\n )\r\n\r\n console.warn('[Auth Middleware] Authentication error detected:', {\r\n status,\r\n message: errorMessage,\r\n errorCode,\r\n isInactive,\r\n errorData: error.data,\r\n })\r\n\r\n try {\r\n const { handleAuthError } = await import('${authErrorHandlerPath}')\r\n await handleAuthError(error)\r\n throw error\r\n } catch (handlerError) {\r\n console.error('[Auth Middleware] Error in handleAuthError:', handlerError)\r\n if (typeof window !== 'undefined') {\r\n window.location.replace('/auth/signin')\r\n }\r\n throw handlerError instanceof Error ? handlerError : error\r\n }\r\n }\r\n\r\n throw error\r\n }\r\n}` : '';\r\n\r\n const defaultMiddlewareArray = enableAuthErrorHandling \r\n ? `[\r\n timingMiddleware,\r\n contentTypeMiddleware,\r\n compressionMiddleware,\r\n loggingMiddleware,\r\n authErrorMiddleware,\r\n]`\r\n : `[\r\n timingMiddleware,\r\n contentTypeMiddleware,\r\n compressionMiddleware,\r\n loggingMiddleware,\r\n]`;\r\n\r\n const content = `// Client utilities and middleware\r\nimport type { RequestMiddleware, RequestConfiguration, ClientResponse, ApiError } from './base'\r\n\r\n// Logging middleware\r\nexport const loggingMiddleware: RequestMiddleware = {\r\n name: 'logging',\r\n onRequest: async (config) => {\r\n if (process.env.NODE_ENV === 'development') {\r\n console.log(\\`[API] \\${config.method} \\${config.url || 'unknown'}\\`)\r\n }\r\n return config\r\n },\r\n onResponse: async (response) => {\r\n if (process.env.NODE_ENV === 'development') {\r\n console.log(\\`[API] Response \\${response.status} (\\${response.responseTime || 0}ms)\\`)\r\n }\r\n return response\r\n },\r\n onError: async (error) => {\r\n console.error(\\`[API] Error: \\${error.message}\\`, error)\r\n throw error\r\n }\r\n}\r\n\r\n// Retry middleware with exponential backoff\r\nexport const retryMiddleware = (maxRetries = 3, baseDelay = 1000): RequestMiddleware => ({\r\n name: 'retry',\r\n onError: async (error) => {\r\n // This would be handled by the base client's retry logic\r\n throw error\r\n }\r\n})\r\n\r\n// Cache middleware\r\nexport const cacheMiddleware = (ttl = 300): RequestMiddleware => ({\r\n name: 'cache',\r\n onRequest: async (config) => {\r\n // Add cache headers\r\n return {\r\n ...config,\r\n headers: {\r\n ...config.headers,\r\n 'Cache-Control': \\`max-age=\\${ttl}\\`\r\n }\r\n }\r\n }\r\n})\r\n\r\n// Compression middleware\r\nexport const compressionMiddleware: RequestMiddleware = {\r\n name: 'compression',\r\n onRequest: async (config) => {\r\n return {\r\n ...config,\r\n headers: {\r\n ...config.headers,\r\n 'Accept-Encoding': 'gzip, deflate, br'\r\n }\r\n }\r\n }\r\n}\r\n\r\n// Request timing middleware\r\nexport const timingMiddleware: RequestMiddleware = {\r\n name: 'timing',\r\n onRequest: async (config) => {\r\n (config as any)._startTime = Date.now()\r\n return config\r\n },\r\n onResponse: async (response) => {\r\n const startTime = (response as any)._startTime\r\n if (startTime) {\r\n response.responseTime = Date.now() - startTime\r\n }\r\n return response\r\n }\r\n}\r\n\r\n// Content type middleware\r\nexport const contentTypeMiddleware: RequestMiddleware = {\r\n name: 'content-type',\r\n onRequest: async (config) => {\r\n // Auto-detect content type based on body\r\n if (config.body) {\r\n if (config.body instanceof FormData) {\r\n // Don't set content-type for FormData (browser handles it)\r\n const headers = { ...config.headers }\r\n delete (headers as any)['Content-Type']\r\n return { ...config, headers }\r\n } else if (config.body instanceof URLSearchParams) {\r\n return {\r\n ...config,\r\n headers: {\r\n ...config.headers,\r\n 'Content-Type': 'application/x-www-form-urlencoded'\r\n }\r\n }\r\n } else if (typeof config.body === 'object') {\r\n return {\r\n ...config,\r\n headers: {\r\n ...config.headers,\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n }\r\n }\r\n return config\r\n }\r\n}\r\n\r\n// Rate limiting middleware\r\nexport const rateLimitMiddleware = (requestsPerMinute = 60): RequestMiddleware => {\r\n const requests = new Map<string, number[]>()\r\n \r\n return {\r\n name: 'rate-limit',\r\n onRequest: async (config) => {\r\n const now = Date.now()\r\n const minute = Math.floor(now / 60000)\r\n const key = \\`\\${config.method}:\\${config.url}\\`\r\n \r\n const requestTimes = requests.get(key) || []\r\n const recentRequests = requestTimes.filter(time => time === minute)\r\n \r\n if (recentRequests.length >= requestsPerMinute) {\r\n throw new Error(\\`Rate limit exceeded: \\${requestsPerMinute} requests per minute\\`)\r\n }\r\n \r\n requestTimes.push(minute)\r\n requests.set(key, requestTimes.slice(-requestsPerMinute))\r\n \r\n return config\r\n }\r\n }\r\n}\r\n${authErrorMiddlewareCode}\r\n\r\n// Default middleware stack\r\nexport const defaultMiddleware: RequestMiddleware[] = ${defaultMiddlewareArray}\r\n\r\n// Utility functions\r\nexport function createMiddlewareStack(...middleware: RequestMiddleware[]): RequestMiddleware[] {\r\n return [...defaultMiddleware, ...middleware]\r\n}\r\n\r\nexport function withMiddleware<T extends (...args: any[]) => Promise<any>>(\r\n fn: T,\r\n middleware: RequestMiddleware[]\r\n): T {\r\n return (async (...args: any[]) => {\r\n // This would integrate with the base client's middleware system\r\n return fn(...args)\r\n }) as T\r\n}`;\r\n\r\n const exports = [\r\n 'loggingMiddleware',\r\n 'retryMiddleware',\r\n 'cacheMiddleware',\r\n 'compressionMiddleware',\r\n 'timingMiddleware',\r\n 'contentTypeMiddleware',\r\n 'rateLimitMiddleware',\r\n ];\r\n \r\n if (enableAuthErrorHandling) {\r\n exports.push('authErrorMiddleware');\r\n }\r\n \r\n exports.push(\r\n 'defaultMiddleware',\r\n 'createMiddlewareStack',\r\n 'withMiddleware'\r\n );\r\n\r\n return {\r\n path: 'client/middleware.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports,\r\n imports: ['./base'],\r\n dependencies: ['./base'],\r\n },\r\n };\r\n }\r\n\r\n private generateEndpointClients(endpoints: ApiEndpointDefinition[]): GeneratedFile[] {\r\n const generatedFiles: GeneratedFile[] = [];\r\n const endpointsByTag = this.groupEndpointsByTag(endpoints);\r\n\r\n for (const [tag, tagEndpoints] of Object.entries(endpointsByTag)) {\r\n const tagName = this.toCamelCase(tag);\r\n const clientMethods = tagEndpoints\r\n .map(endpoint => this.generateEnhancedEndpointMethod(endpoint))\r\n .join('\\n\\n');\r\n\r\n const schemasImport = this.buildImportPath('schemas');\r\n\r\n // Only import schemas that are actually used\r\n const usedSchemas = new Set<string>();\r\n\r\n tagEndpoints.forEach(endpoint => {\r\n const operationName = this.getOperationName(endpoint);\r\n\r\n // Add request schema if endpoint has request body\r\n if (endpoint.requestBody) {\r\n usedSchemas.add(`${operationName}RequestSchema`);\r\n }\r\n\r\n // Always add response schema\r\n usedSchemas.add(`${operationName}ResponseSchema`);\r\n\r\n // Add params schema if endpoint has parameters\r\n if (endpoint.parameters.length > 0) {\r\n usedSchemas.add(`${operationName}ParamsSchema`);\r\n }\r\n });\r\n\r\n const schemaImportsString = Array.from(usedSchemas).join(',\\n ');\r\n\r\n const imports = [\r\n \"import { z } from 'zod'\",\r\n \"import { cache } from 'react'\",\r\n \"import { BaseApiClient } from './base'\",\r\n \"import type { ClientResponse, RequestConfiguration } from './base'\",\r\n ...(tagEndpoints.some(e => e.method === 'GET')\r\n ? [\"import { defaultMiddleware } from './middleware'\"]\r\n : []),\r\n ...(schemaImportsString\r\n ? [`import {\\n ${schemaImportsString}\\n} from '${schemasImport}'`]\r\n : []),\r\n ]\r\n .filter(Boolean)\r\n .join('\\n');\r\n\r\n const content = `${imports}\r\n\r\nexport class ${this.toPascalCase(tagName)}ApiClient extends BaseApiClient {\r\n constructor() {\r\n super()\r\n \r\n // Add tag-specific middleware\r\n this.addMiddleware({\r\n name: '${tagName}-context',\r\n onRequest: async (config) => {\r\n return {\r\n ...config,\r\n headers: {\r\n ...config.headers,\r\n 'X-API-Context': '${tagName}'\r\n }\r\n }\r\n }\r\n })\r\n }\r\n\r\n${clientMethods}\r\n}`;\r\n\r\n generatedFiles.push({\r\n path: `client/${tagName}.ts`,\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: [`${this.toPascalCase(tagName)}ApiClient`],\r\n imports: ['zod', 'react', './base', './middleware', schemasImport],\r\n dependencies: [],\r\n },\r\n });\r\n }\r\n\r\n return generatedFiles;\r\n }\r\n\r\n private getOperationName(endpoint: ApiEndpointDefinition): string {\r\n if (endpoint.operationId) {\r\n return endpoint.operationId\r\n .split('_')\r\n .map(part => this.toPascalCase(part))\r\n .join('');\r\n }\r\n\r\n const pathParts = endpoint.path\r\n .split('/')\r\n .filter(part => part && !part.startsWith('{'))\r\n .map(part => this.toPascalCase(part));\r\n\r\n const method = this.toPascalCase(endpoint.method.toLowerCase());\r\n\r\n return [...pathParts, method].join('');\r\n }\r\n\r\n private generateEnhancedEndpointMethod(endpoint: ApiEndpointDefinition): string {\r\n const methodName = this.toCamelCase(endpoint.operationId || endpoint.id);\r\n const operationName = this.getOperationName(endpoint);\r\n const pathParameters = endpoint.parameters.filter(parameter => parameter.in === 'path');\r\n const queryParameters = endpoint.parameters.filter(parameter => parameter.in === 'query');\r\n const headerParameters = endpoint.parameters.filter(parameter => parameter.in === 'header');\r\n const hasRequestBody = !!endpoint.requestBody;\r\n const hasParams = endpoint.parameters.length > 0;\r\n const isQuery = endpoint.method === 'GET';\r\n\r\n // Build parameter interface using z.infer\r\n const parameterTypes: string[] = [];\r\n\r\n if (hasParams) {\r\n parameterTypes.push(`params: z.infer<typeof ${operationName}ParamsSchema>`);\r\n }\r\n\r\n if (hasRequestBody) {\r\n parameterTypes.push(`body: z.infer<typeof ${operationName}RequestSchema>`);\r\n }\r\n\r\n parameterTypes.push('config?: RequestConfiguration');\r\n\r\n const responseType = `z.infer<typeof ${operationName}ResponseSchema>`;\r\n\r\n // Generate method documentation\r\n const documentation = [\r\n ` /**`,\r\n ` * ${endpoint.summary || endpoint.description || `${endpoint.method} ${endpoint.path}`}`,\r\n endpoint.description && endpoint.summary !== endpoint.description\r\n ? ` * ${endpoint.description}`\r\n : '',\r\n ` * @param options - Request options`,\r\n ` * @returns Promise<ClientResponse<${responseType}>>`,\r\n endpoint.deprecated ? ` * @deprecated` : '',\r\n ` * @example`,\r\n ` * const result = await client.${methodName}({`,\r\n ` * config: { timeout: 5000 }`,\r\n ` * })`,\r\n ` */`,\r\n ]\r\n .filter(Boolean)\r\n .join('\\n');\r\n\r\n // Generate validation logic\r\n const validationSteps = [];\r\n\r\n if (hasRequestBody) {\r\n validationSteps.push(` // Validate request body`);\r\n validationSteps.push(\r\n ` const validatedBody = await ${operationName}RequestSchema.parseAsync(options.body)`\r\n );\r\n }\r\n\r\n if (hasParams) {\r\n validationSteps.push(`// Validate and extract parameters`);\r\n validationSteps.push(\r\n `const validatedParams = await ${operationName}ParamsSchema.parseAsync(options.params)`\r\n );\r\n }\r\n\r\n const validationCode = validationSteps.length > 0 ? `${validationSteps.join('\\n')}\\n\\n` : '';\r\n\r\n // Build request options\r\n const requestOptions = [];\r\n\r\n if (pathParameters.length > 0) {\r\n if (hasParams) {\r\n requestOptions.push(' pathParams: validatedParams.path,');\r\n } else {\r\n requestOptions.push(' pathParams: {},');\r\n }\r\n }\r\n\r\n if (queryParameters.length > 0) {\r\n if (hasParams) {\r\n requestOptions.push('queryParams: validatedParams.query,');\r\n } else {\r\n requestOptions.push('queryParams: {},');\r\n }\r\n }\r\n\r\n if (headerParameters.length > 0) {\r\n if (hasParams) {\r\n requestOptions.push('headers: { ...options.config?.headers, ...validatedParams.headers },');\r\n } else {\r\n requestOptions.push('headers: options.config?.headers,');\r\n }\r\n }\r\n\r\n if (hasRequestBody) {\r\n requestOptions.push('body: validatedBody,');\r\n }\r\n\r\n requestOptions.push(\r\n 'config: { ...options?.config, middleware: [...defaultMiddleware, ...(options?.config?.middleware || [])] },'\r\n );\r\n requestOptions.push(`responseSchema: ${operationName}ResponseSchema`);\r\n\r\n const requestOptionsString = requestOptions.join('\\n');\r\n\r\n // Build method signature\r\n const methodSignature =\r\n parameterTypes.length > 1\r\n ? `options: {\\n ${parameterTypes.join('\\n ')}\\n }`\r\n : parameterTypes.length === 1 && parameterTypes[0].includes('config?')\r\n ? 'options?: { config?: RequestConfiguration }'\r\n : `options: { ${parameterTypes.join(', ')} }`;\r\n\r\n // For GET requests, add caching\r\n if (isQuery) {\r\n return `${documentation}\r\n ${methodName} = cache(async (${methodSignature}) => {\r\n${validationCode} return this.request<${responseType}>(\r\n '${endpoint.method}',\r\n '${endpoint.path}',\r\n {\r\n${requestOptionsString}\r\n }\r\n )\r\n })`;\r\n }\r\n\r\n // For non-GET requests\r\n return `${documentation}\r\n ${methodName} = async (${methodSignature}) => {\r\n${validationCode} return this.request<${responseType}>(\r\n '${endpoint.method}',\r\n '${endpoint.path}',\r\n {\r\n${requestOptionsString}\r\n }\r\n )\r\n }`;\r\n }\r\n\r\n private generateMainClient(endpoints: ApiEndpointDefinition[]): GeneratedFile {\r\n const endpointsByTag = this.groupEndpointsByTag(endpoints);\r\n const tagNames = Object.keys(endpointsByTag);\r\n\r\n const imports = [\r\n \"import { BaseApiClient } from './base'\",\r\n \"import { defaultMiddleware, createMiddlewareStack } from './middleware'\",\r\n ...tagNames.map(tag => {\r\n const tagName = this.toCamelCase(tag);\r\n const className = this.toPascalCase(tagName);\r\n return `import { ${className}ApiClient } from './${tagName}'`;\r\n }),\r\n ].join('\\n');\r\n\r\n const clientProperties = tagNames\r\n .map(tag => {\r\n const tagName = this.toCamelCase(tag);\r\n const className = this.toPascalCase(tagName);\r\n return ` public readonly ${tagName}: ${className}ApiClient`;\r\n })\r\n .join('\\n');\r\n\r\n const clientInitialization = tagNames\r\n .map(tag => {\r\n const tagName = this.toCamelCase(tag);\r\n const className = this.toPascalCase(tagName);\r\n return ` this.${tagName} = new ${className}ApiClient()`;\r\n })\r\n .join('\\n');\r\n\r\n const clientExports = tagNames\r\n .map(tag => {\r\n const className = this.toPascalCase(this.toCamelCase(tag));\r\n return `export { ${className}ApiClient } from './${this.toCamelCase(tag)}'`;\r\n })\r\n .join('\\n');\r\n\r\n const content = `${imports}\r\n\r\n/**\r\n * Enhanced API client with all endpoint groups\r\n * Features: Request deduplication, caching, middleware, metrics\r\n * Auto-generated from OpenAPI schema\r\n */\r\nexport class ApiClient extends BaseApiClient {\r\n${clientProperties}\r\n\r\n constructor() {\r\n super()\r\n \r\n // Initialize endpoint clients\r\n${clientInitialization}\r\n \r\n // Add global middleware\r\n createMiddlewareStack().forEach(middleware => {\r\n this.addMiddleware(middleware)\r\n })\r\n }\r\n\r\n // Utility methods\r\n async healthCheck(): Promise<{ status: 'ok' | 'error', timestamp: number, version?: string }> {\r\n try {\r\n const response = await this.get('/health')\r\n return {\r\n status: 'ok',\r\n timestamp: Date.now(),\r\n version: response.headers.get('x-api-version') || undefined\r\n }\r\n } catch {\r\n return {\r\n status: 'error',\r\n timestamp: Date.now()\r\n }\r\n }\r\n }\r\n\r\n // Get client metrics\r\n getClientMetrics() {\r\n return {\r\n requests: this.getMetrics(),\r\n cacheSize: this.getCacheSize(),\r\n uptime: Date.now() - this.startTime\r\n }\r\n }\r\n\r\n private startTime = Date.now()\r\n \r\n private getCacheSize(): number {\r\n // This would return the size of the request cache\r\n return 0\r\n }\r\n}\r\n\r\n// Export singleton instance\r\nexport const apiClient = new ApiClient()\r\n\r\n// Export individual clients for tree-shaking\r\n${clientExports}\r\n\r\n// Export types and utilities\r\nexport type { ClientResponse, RequestConfiguration, ApiError, ValidationError, TimeoutError, NetworkError } from './base'\r\nexport type { RequestMiddleware } from './base'\r\n`;\r\n\r\n return {\r\n path: 'client/index.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: [\r\n 'ApiClient',\r\n 'apiClient',\r\n 'BaseApiClient',\r\n ...tagNames.map(tag => `${this.toPascalCase(this.toCamelCase(tag))}ApiClient`),\r\n ],\r\n imports: [\r\n './base',\r\n './middleware',\r\n ...tagNames.map(tag => `./${this.toCamelCase(tag)}`),\r\n ],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n\r\n private groupEndpointsByTag(\r\n endpoints: ApiEndpointDefinition[]\r\n ): Record<string, ApiEndpointDefinition[]> {\r\n return endpoints.reduce(\r\n (accumulator, endpoint) => {\r\n const tag = endpoint.tags[0] || 'default';\r\n if (!accumulator[tag]) {\r\n accumulator[tag] = [];\r\n }\r\n accumulator[tag].push(endpoint);\r\n return accumulator;\r\n },\r\n {} as Record<string, ApiEndpointDefinition[]>\r\n );\r\n }\r\n\r\n private getTypeFromParameter(parameter: ParameterDefinition): string {\r\n const schema = parameter.schema as any;\r\n const definition = schema._def;\r\n\r\n switch (definition?.typeName) {\r\n case 'ZodString':\r\n return 'string';\r\n case 'ZodNumber':\r\n return 'number';\r\n case 'ZodBoolean':\r\n return 'boolean';\r\n case 'ZodArray':\r\n return `${this.getTypeFromParameter({ ...parameter, schema: definition.type })}[]`;\r\n case 'ZodEnum':\r\n return definition.values?.map((value: string) => `\"${value}\"`).join(' | ') || 'string';\r\n default:\r\n return 'any';\r\n }\r\n }\r\n\r\n private toCamelCase(input: string): string {\r\n return input\r\n .replace(/[-_\\s]+(.)?/g, (_, character) => (character ? character.toUpperCase() : ''))\r\n .replace(/^[A-Z]/, character => character.toLowerCase());\r\n }\r\n\r\n private toPascalCase(input: string): string {\r\n return this.toCamelCase(input).replace(/^[a-z]/, character => character.toUpperCase());\r\n }\r\n}\r\n","/**\r\n * Utility functions for consistent naming conventions\r\n */\r\n\r\n/**\r\n * Convert string to camelCase with proper handling of special characters\r\n */\r\nexport function toCamelCase(input: string): string {\r\n return input\r\n .replace(/[-_\\s]+(.)?/g, (_, character) => (character ? character.toUpperCase() : \"\"))\r\n .replace(/^[A-Z]/, (character) => character.toLowerCase())\r\n .replace(/[^a-zA-Z0-9]/g, \"\")\r\n}\r\n\r\n/**\r\n * Convert string to PascalCase with proper handling of special characters\r\n */\r\nexport function toPascalCase(input: string): string {\r\n return toCamelCase(input).replace(/^[a-z]/, (character) => character.toUpperCase())\r\n}\r\n\r\n/**\r\n * Convert OpenAPI operation ID to valid JavaScript identifier\r\n */\r\nexport function toValidIdentifier(input: string): string {\r\n return input\r\n .replace(/[-]/g, \"_\")\r\n .split(/[_\\s]+/)\r\n .map((part, index) => {\r\n const cleanPart = part.replace(/[^a-zA-Z0-9]/g, \"\")\r\n if (index === 0) {\r\n return cleanPart.toLowerCase()\r\n }\r\n return cleanPart.charAt(0).toUpperCase() + cleanPart.slice(1).toLowerCase()\r\n })\r\n .join(\"\")\r\n}\r\n\r\n/**\r\n * Convert schema name to valid export name\r\n */\r\nexport function toSchemaName(operationId: string, suffix = \"Schema\"): string {\r\n return `${toValidIdentifier(operationId)}${suffix}`\r\n}\r\n\r\n/**\r\n * Convert operation ID to hook name\r\n */\r\nexport function toHookName(operationId: string, isQuery = true): string {\r\n const baseName = toValidIdentifier(operationId)\r\n const prefix = \"use\"\r\n const suffix = isQuery ? \"\" : \"Mutation\"\r\n return `${prefix}${toPascalCase(baseName)}${suffix}`\r\n}\r\n\r\n/**\r\n * Convert operation ID to action name\r\n */\r\nexport function toActionName(operationId: string): string {\r\n return toValidIdentifier(operationId)\r\n}\r\n","import type {\r\n GenerationContext,\r\n GeneratedFile,\r\n SchemaDefinition,\r\n ApiEndpointDefinition,\r\n} from '@/core/types';\r\nimport { GenerationError } from '@/core/types';\r\nimport { toPascalCase } from '@/utils/naming-helpers';\r\n\r\nexport class SchemaGenerator {\r\n private schemaRegistry = new Map<string, string>();\r\n\r\n async generate(context: GenerationContext): Promise<GeneratedFile[]> {\r\n try {\r\n const files: GeneratedFile[] = [];\r\n\r\n // Build schema registry first\r\n this.buildSchemaRegistry(context);\r\n\r\n // Generate main schemas file\r\n files.push(await this.generateSchemasFile(context));\r\n\r\n return files;\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Unknown error';\r\n throw new GenerationError(`Failed to generate schemas: ${message}`);\r\n }\r\n }\r\n\r\n private buildSchemaRegistry(context: GenerationContext): void {\r\n // Build a registry of schema names to their Zod representations\r\n for (const schema of context.schema.schemas) {\r\n const schemaName = toPascalCase(schema.name);\r\n const exportName = `${schemaName}Schema`;\r\n this.schemaRegistry.set(schema.name, exportName);\r\n }\r\n }\r\n\r\n private orderSchemasByDependencies(schemas: SchemaDefinition[]): SchemaDefinition[] {\r\n const visited = new Set<string>();\r\n const visiting = new Set<string>();\r\n const result: SchemaDefinition[] = [];\r\n const schemaMap = new Map<string, SchemaDefinition>();\r\n const dependencyGraph = new Map<string, Set<string>>();\r\n \r\n // Separate enums from other schemas - enums should come first\r\n const enumSchemas: SchemaDefinition[] = [];\r\n const otherSchemas: SchemaDefinition[] = [];\r\n \r\n for (const schema of schemas) {\r\n const isEnum = this.isEnumSchema(schema);\r\n if (isEnum) {\r\n enumSchemas.push(schema);\r\n } else {\r\n otherSchemas.push(schema);\r\n }\r\n }\r\n \r\n // Remove duplicates and build schema map\r\n for (const schema of [...enumSchemas, ...otherSchemas]) {\r\n if (!schemaMap.has(schema.name)) {\r\n schemaMap.set(schema.name, schema);\r\n dependencyGraph.set(schema.name, new Set());\r\n }\r\n }\r\n\r\n // Build dependency graph\r\n for (const schema of [...enumSchemas, ...otherSchemas]) {\r\n const dependencies = this.findSchemaDependencies(schema);\r\n for (const dep of dependencies) {\r\n if (schemaMap.has(dep)) {\r\n dependencyGraph.get(schema.name)!.add(dep);\r\n }\r\n }\r\n }\r\n\r\n const visit = (schemaName: string) => {\r\n if (visiting.has(schemaName)) {\r\n // Circular dependency detected, skip\r\n console.warn(`Circular dependency detected for schema: ${schemaName}`);\r\n return;\r\n }\r\n if (visited.has(schemaName)) {\r\n return;\r\n }\r\n\r\n visiting.add(schemaName);\r\n const schema = schemaMap.get(schemaName);\r\n if (schema) {\r\n // Visit dependencies first\r\n const dependencies = dependencyGraph.get(schemaName) || new Set();\r\n for (const dep of dependencies) {\r\n if (schemaMap.has(dep)) {\r\n visit(dep);\r\n }\r\n }\r\n result.push(schema);\r\n }\r\n visiting.delete(schemaName);\r\n visited.add(schemaName);\r\n };\r\n\r\n // Visit all schemas in dependency order\r\n // First visit enum schemas (they have no dependencies)\r\n for (const schema of enumSchemas) {\r\n if (!visited.has(schema.name)) {\r\n visit(schema.name);\r\n }\r\n }\r\n \r\n // Then visit other schemas\r\n for (const schema of otherSchemas) {\r\n if (!visited.has(schema.name)) {\r\n visit(schema.name);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private isEnumSchema(schema: SchemaDefinition): boolean {\r\n if (!schema.schema || !(schema.schema as any)._def) {\r\n return false;\r\n }\r\n const def = (schema.schema as any)._def;\r\n return def.typeName === 'ZodEnum';\r\n }\r\n\r\n private findSchemaDependencies(schema: SchemaDefinition): string[] {\r\n const dependencies: string[] = [];\r\n const schemaObj = schema.schema as any;\r\n \r\n if (schemaObj && schemaObj._def) {\r\n this.extractDependenciesFromZodSchema(schemaObj, dependencies);\r\n }\r\n \r\n return dependencies;\r\n }\r\n\r\n private extractDependenciesFromZodSchema(zodSchema: any, dependencies: string[], visited = new Set<string>()): void {\r\n if (!zodSchema || !zodSchema._def) return;\r\n\r\n const def = zodSchema._def;\r\n \r\n // Check for schema references (improved detection)\r\n if (def._schemaRef) {\r\n const refName = def._schemaRef;\r\n // Extract base name from schema reference (e.g., \"AuthUserSchema\" -> \"AuthUser\")\r\n const baseName = refName.replace(/Schema$/, '');\r\n if (!dependencies.includes(baseName) && !visited.has(baseName)) {\r\n dependencies.push(baseName);\r\n visited.add(baseName);\r\n }\r\n return;\r\n }\r\n\r\n // Check for direct schema name references in string format\r\n if (typeof zodSchema === 'string' && zodSchema.endsWith('Schema')) {\r\n const baseName = zodSchema.replace(/Schema$/, '');\r\n if (!dependencies.includes(baseName) && !visited.has(baseName)) {\r\n dependencies.push(baseName);\r\n visited.add(baseName);\r\n }\r\n return;\r\n }\r\n\r\n // Handle different schema types\r\n switch (def.typeName) {\r\n case 'ZodObject':\r\n if (def.shape) {\r\n const shape = def.shape();\r\n for (const [key, value] of Object.entries(shape)) {\r\n this.extractDependenciesFromZodSchema(value as any, dependencies, visited);\r\n }\r\n }\r\n break;\r\n case 'ZodArray':\r\n this.extractDependenciesFromZodSchema(def.type, dependencies, visited);\r\n break;\r\n case 'ZodOptional':\r\n case 'ZodNullable':\r\n this.extractDependenciesFromZodSchema(def.innerType, dependencies, visited);\r\n break;\r\n case 'ZodUnion':\r\n if (def.options) {\r\n for (const option of def.options) {\r\n this.extractDependenciesFromZodSchema(option, dependencies, visited);\r\n }\r\n }\r\n break;\r\n case 'ZodRecord':\r\n this.extractDependenciesFromZodSchema(def.valueType, dependencies, visited);\r\n break;\r\n case 'ZodIntersection':\r\n if (def.left) {\r\n this.extractDependenciesFromZodSchema(def.left, dependencies, visited);\r\n }\r\n if (def.right) {\r\n this.extractDependenciesFromZodSchema(def.right, dependencies, visited);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n private async generateSchemasFile(context: GenerationContext): Promise<GeneratedFile> {\r\n const { schemas, endpoints } = context.schema;\r\n\r\n const imports = ['import { z } from \"zod\"'];\r\n const schemaExports: string[] = [];\r\n const schemaDefinitions: string[] = [];\r\n\r\n // Generate base schemas from definitions with dependency analysis\r\n const orderedSchemas = this.orderSchemasByDependencies(schemas);\r\n for (const schema of orderedSchemas) {\r\n const { definition, exportName } = this.generateSchemaDefinition(schema);\r\n schemaDefinitions.push(definition);\r\n schemaExports.push(exportName);\r\n }\r\n\r\n // Generate request and response schemas for each endpoint\r\n for (const endpoint of endpoints) {\r\n // console.log(`Processing endpoint: ${endpoint.method} ${endpoint.path}`, {\r\n // operationId: endpoint.operationId,\r\n // parametersCount: endpoint.parameters.length,\r\n // hasRequestBody: !!endpoint.requestBody,\r\n // parameters: endpoint.parameters.map((p) => ({ name: p.name, in: p.in, required: p.required })),\r\n // })\r\n\r\n const endpointSchemas = this.generateEndpointSchemas(endpoint);\r\n schemaDefinitions.push(...endpointSchemas.definitions);\r\n schemaExports.push(...endpointSchemas.exports);\r\n }\r\n\r\n // Generate validation helper functions\r\n const validationHelpers = this.generateValidationHelpers();\r\n\r\n // Ensure zod import is always present\r\n const contentWithImports = [\r\n ...imports,\r\n '',\r\n '// Generated schemas from OpenAPI specification',\r\n '// Base schemas, request schemas, and response schemas',\r\n '',\r\n ...schemaDefinitions,\r\n '',\r\n validationHelpers,\r\n '',\r\n ].join('\\n');\r\n \r\n // Remove unused code but preserve zod import\r\n let content = this.removeUnusedCode(contentWithImports);\r\n \r\n // Ensure zod import is present at the top\r\n if (!content.includes('import { z } from \"zod\"') && !content.includes(\"import { z } from 'zod'\")) {\r\n content = `import { z } from \"zod\"\\n\\n${ content}`;\r\n }\r\n\r\n return {\r\n path: 'schemas/index.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: schemaExports,\r\n imports: ['zod'],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n\r\n private generateEndpointSchemas(endpoint: ApiEndpointDefinition): {\r\n definitions: string[];\r\n exports: string[];\r\n } {\r\n const definitions: string[] = [];\r\n const exports: string[] = [];\r\n\r\n // Generate operation name from operationId or path + method\r\n const operationName = this.getOperationName(endpoint);\r\n\r\n // console.log(`Generating schemas for operation: ${operationName}`)\r\n\r\n // Generate request schema\r\n const requestSchema = this.generateRequestSchema(endpoint, operationName);\r\n if (requestSchema) {\r\n // console.log(`Generated request schema: ${requestSchema.exportName}`)\r\n definitions.push(requestSchema.definition);\r\n exports.push(requestSchema.exportName);\r\n }\r\n\r\n // Generate response schemas\r\n const responseSchemas = this.generateResponseSchemas(endpoint, operationName);\r\n definitions.push(...responseSchemas.definitions);\r\n exports.push(...responseSchemas.exports);\r\n\r\n // Generate parameter schema if endpoint has parameters\r\n const parameterSchema = this.generateParameterSchema(endpoint, operationName);\r\n if (parameterSchema) {\r\n // console.log(`Generated parameter schema: ${parameterSchema.exportName}`)\r\n definitions.push(parameterSchema.definition);\r\n exports.push(parameterSchema.exportName);\r\n } else {\r\n // console.log(`No parameter schema generated for ${operationName} - parameters:`, endpoint.parameters.length)\r\n }\r\n\r\n return { definitions, exports };\r\n }\r\n\r\n private getOperationName(endpoint: ApiEndpointDefinition): string {\r\n if (endpoint.operationId) {\r\n // Convert snake_case to PascalCase\r\n return endpoint.operationId\r\n .split('_')\r\n .map(part => toPascalCase(part))\r\n .join('');\r\n }\r\n\r\n // Generate from path and method\r\n const pathParts = endpoint.path\r\n .split('/')\r\n .filter(part => part && !part.startsWith('{'))\r\n .map(part => toPascalCase(part));\r\n\r\n const method = toPascalCase(endpoint.method.toLowerCase());\r\n\r\n return [...pathParts, method].join('');\r\n }\r\n\r\n private generateRequestSchema(\r\n endpoint: ApiEndpointDefinition,\r\n operationName: string\r\n ): { definition: string; exportName: string } | null {\r\n if (!endpoint.requestBody || endpoint.requestBody.content.length === 0) {\r\n return null;\r\n }\r\n\r\n const exportName = `${operationName}RequestSchema`;\r\n\r\n // Use the first content type (usually application/json)\r\n const primaryContent = endpoint.requestBody.content[0];\r\n const zodSchemaString = this.zodSchemaToString(primaryContent.schema);\r\n\r\n const definition = [\r\n `/**`,\r\n ` * Request schema for ${endpoint.method} ${endpoint.path}`,\r\n endpoint.requestBody.description ? ` * ${endpoint.requestBody.description}` : '',\r\n ` */`,\r\n `export const ${exportName} = ${zodSchemaString}`,\r\n '',\r\n `export type ${operationName}Request = z.infer<typeof ${exportName}>`,\r\n ]\r\n .filter(Boolean)\r\n .join('\\n');\r\n\r\n return { definition, exportName };\r\n }\r\n\r\n private generateResponseSchemas(\r\n endpoint: ApiEndpointDefinition,\r\n operationName: string\r\n ): { definitions: string[]; exports: string[] } {\r\n const definitions: string[] = [];\r\n const exports: string[] = [];\r\n\r\n // Group responses by success/error\r\n const successResponses = endpoint.responses.filter(\r\n r => r.statusCode.startsWith('2') || r.statusCode === 'default'\r\n );\r\n const errorResponses = endpoint.responses.filter(\r\n r => !r.statusCode.startsWith('2') && r.statusCode !== 'default'\r\n );\r\n\r\n // Generate success response schema\r\n if (successResponses.length > 0) {\r\n const successResponse = successResponses[0]; // Use first success response\r\n\r\n let zodSchemaString = 'z.void()'; // Default for responses without content (like 204 No Content)\r\n\r\n if (successResponse.content && successResponse.content.length > 0) {\r\n const primaryContent = successResponse.content[0];\r\n zodSchemaString = this.zodSchemaToString(primaryContent.schema);\r\n }\r\n\r\n const exportName = `${operationName}ResponseSchema`;\r\n\r\n const definition = [\r\n `/**`,\r\n ` * Success response schema for ${endpoint.method} ${endpoint.path}`,\r\n ` * Status: ${successResponse.statusCode}`,\r\n ` * ${successResponse.description}`,\r\n ` */`,\r\n `export const ${exportName} = ${zodSchemaString}`,\r\n '',\r\n `export type ${operationName}Response = z.infer<typeof ${exportName}>`,\r\n ].join('\\n');\r\n\r\n definitions.push(definition);\r\n exports.push(exportName);\r\n }\r\n\r\n // Generate error response schema if there are error responses\r\n if (errorResponses.length > 0) {\r\n const errorResponse = errorResponses[0]; // Use first error response\r\n if (errorResponse.content && errorResponse.content.length > 0) {\r\n const exportName = `${operationName}ErrorSchema`;\r\n const primaryContent = errorResponse.content[0];\r\n const zodSchemaString = this.zodSchemaToString(primaryContent.schema);\r\n\r\n const definition = [\r\n `/**`,\r\n ` * Error response schema for ${endpoint.method} ${endpoint.path}`,\r\n ` * Status: ${errorResponse.statusCode}`,\r\n ` * ${errorResponse.description}`,\r\n ` */`,\r\n `export const ${exportName} = ${zodSchemaString}`,\r\n '',\r\n `export type ${operationName}Error = z.infer<typeof ${exportName}>`,\r\n ].join('\\n');\r\n\r\n definitions.push(definition);\r\n exports.push(exportName);\r\n }\r\n }\r\n\r\n return { definitions, exports };\r\n }\r\n\r\n private generateParameterSchema(\r\n endpoint: ApiEndpointDefinition,\r\n operationName: string\r\n ): { definition: string; exportName: string } | null {\r\n if (endpoint.parameters.length === 0) {\r\n // console.log(`No parameters found for ${operationName}`)\r\n return null;\r\n }\r\n\r\n const exportName = `${operationName}ParamsSchema`;\r\n\r\n // Group parameters by type\r\n const pathParams = endpoint.parameters.filter(p => p.in === 'path');\r\n const queryParams = endpoint.parameters.filter(p => p.in === 'query');\r\n const headerParams = endpoint.parameters.filter(p => p.in === 'header');\r\n\r\n // console.log(`Parameter breakdown for ${operationName}:`, {\r\n // path: pathParams.length,\r\n // query: queryParams.length,\r\n // header: headerParams.length,\r\n // total: endpoint.parameters.length,\r\n // })\r\n\r\n const schemaProperties: string[] = [];\r\n\r\n if (pathParams.length > 0) {\r\n const pathShape = pathParams\r\n .map(param => {\r\n const zodSchema = this.zodSchemaToString(param.schema);\r\n const optional = param.required ? '' : '.optional()';\r\n return ` ${param.name}: ${zodSchema}${optional}`;\r\n })\r\n .join(',\\n');\r\n\r\n schemaProperties.push(` path: z.object({\\n${pathShape}\\n })`);\r\n }\r\n\r\n if (queryParams.length > 0) {\r\n const queryShape = queryParams\r\n .map(param => {\r\n const zodSchema = this.zodSchemaToString(param.schema);\r\n const optional = param.required ? '' : '.optional()';\r\n return ` ${param.name}: ${zodSchema}${optional}`;\r\n })\r\n .join(',\\n');\r\n\r\n schemaProperties.push(` query: z.object({\\n${queryShape}\\n }).optional()`);\r\n }\r\n\r\n if (headerParams.length > 0) {\r\n const headerShape = headerParams\r\n .map(param => {\r\n const zodSchema = this.zodSchemaToString(param.schema);\r\n const optional = param.required ? '' : '.optional()';\r\n return ` ${param.name}: ${zodSchema}${optional}`;\r\n })\r\n .join(',\\n');\r\n\r\n schemaProperties.push(` headers: z.object({\\n${headerShape}\\n }).optional()`);\r\n }\r\n\r\n if (schemaProperties.length === 0) {\r\n console.log(`No schema properties generated for ${operationName}`);\r\n return null;\r\n }\r\n\r\n const zodSchemaString = `z.object({\\n${schemaProperties.join(',\\n')}\\n})`;\r\n\r\n const definition = [\r\n `/**`,\r\n ` * Parameters schema for ${endpoint.method} ${endpoint.path}`,\r\n ` * Path params: ${pathParams.map(p => p.name).join(', ') || 'none'}`,\r\n ` * Query params: ${queryParams.map(p => p.name).join(', ') || 'none'}`,\r\n ` * Header params: ${headerParams.map(p => p.name).join(', ') || 'none'}`,\r\n ` */`,\r\n `export const ${exportName} = ${zodSchemaString}`,\r\n '',\r\n `export type ${operationName}Params = z.infer<typeof ${exportName}>`,\r\n ].join('\\n');\r\n\r\n return { definition, exportName };\r\n }\r\n\r\n private generateSchemaDefinition(schema: SchemaDefinition): {\r\n name: string;\r\n definition: string;\r\n exportName: string;\r\n } {\r\n const schemaName = toPascalCase(schema.name);\r\n const exportName = `${schemaName}Schema`;\r\n\r\n const zodSchemaString = this.zodSchemaToString(schema.schema);\r\n\r\n const definition = [\r\n schema.description ? `/**` : '',\r\n schema.description ? ` * ${schema.description}` : '',\r\n schema.example ? ` * @example ${JSON.stringify(schema.example, null, 2)}` : '',\r\n schema.description ? ` */` : '',\r\n `export const ${exportName} = ${zodSchemaString}`,\r\n '',\r\n `export type ${schemaName} = z.infer<typeof ${exportName}>`,\r\n ]\r\n .filter(Boolean)\r\n .join('\\n');\r\n\r\n return {\r\n name: schemaName,\r\n definition,\r\n exportName,\r\n };\r\n }\r\n\r\n private zodSchemaToString(schema: any, context?: GenerationContext): string {\r\n if (!schema || !schema._def) {\r\n // Check if this is a schema reference\r\n if (schema && (schema as any)._schemaRef) {\r\n const refName = (schema as any)._schemaRef;\r\n const registeredSchema = this.schemaRegistry.get(refName);\r\n if (registeredSchema) {\r\n return registeredSchema;\r\n }\r\n // Fallback: extract base name and add Schema suffix\r\n // Handle both \"AuthUser\" and \"AuthUserSchema\" formats\r\n const baseName = refName.endsWith('Schema') \r\n ? refName.replace(/Schema$/, '')\r\n : refName;\r\n return `${toPascalCase(baseName)}Schema`;\r\n }\r\n return 'z.any()';\r\n }\r\n\r\n const typeName = schema._def.typeName;\r\n\r\n switch (typeName) {\r\n case 'ZodString':\r\n let stringSchema = 'z.string()';\r\n const checks = schema._def.checks || [];\r\n\r\n for (const check of checks) {\r\n switch (check.kind) {\r\n case 'min':\r\n stringSchema += `.min(${check.value}, \"${check.message || `Minimum length is ${check.value}`}\")`;\r\n break;\r\n case 'max':\r\n stringSchema += `.max(${check.value}, \"${check.message || `Maximum length is ${check.value}`}\")`;\r\n break;\r\n case 'email':\r\n stringSchema += `.email(\"${check.message || 'Invalid email format'}\")`;\r\n break;\r\n case 'url':\r\n stringSchema += `.url(\"${check.message || 'Invalid URL format'}\")`;\r\n break;\r\n case 'uuid':\r\n stringSchema += `.uuid(\"${check.message || 'Invalid UUID format'}\")`;\r\n break;\r\n case 'regex':\r\n stringSchema += `.regex(${check.regex}, \"${check.message || 'Invalid format'}\")`;\r\n break;\r\n }\r\n }\r\n return stringSchema;\r\n\r\n case 'ZodNumber':\r\n let numberSchema = 'z.number()';\r\n const numberChecks = schema._def.checks || [];\r\n\r\n for (const check of numberChecks) {\r\n switch (check.kind) {\r\n case 'int':\r\n numberSchema += '.int()';\r\n break;\r\n case 'min':\r\n numberSchema += `.min(${check.value}, \"${check.message || `Minimum value is ${check.value}`}\")`;\r\n break;\r\n case 'max':\r\n numberSchema += `.max(${check.value}, \"${check.message || `Maximum value is ${check.value}`}\")`;\r\n break;\r\n }\r\n }\r\n return numberSchema;\r\n\r\n case 'ZodBoolean':\r\n return 'z.boolean()';\r\n\r\n case 'ZodArray':\r\n const elementSchema = this.zodSchemaToString(schema._def.type, context);\r\n let arraySchema = `z.array(${elementSchema})`;\r\n\r\n if (schema._def.minLength) {\r\n arraySchema += `.min(${schema._def.minLength.value}, \"${schema._def.minLength.message || `Minimum ${schema._def.minLength.value} items required`}\")`;\r\n }\r\n if (schema._def.maxLength) {\r\n arraySchema += `.max(${schema._def.maxLength.value}, \"${schema._def.maxLength.message || `Maximum ${schema._def.maxLength.value} items allowed`}\")`;\r\n }\r\n return arraySchema;\r\n\r\n case 'ZodObject':\r\n const shape = schema._def.shape();\r\n const properties: string[] = [];\r\n\r\n for (const [key, value] of Object.entries(shape)) {\r\n const propSchema = this.zodSchemaToString(value, context);\r\n properties.push(` ${key}: ${propSchema}`);\r\n }\r\n\r\n return `z.object({\\n${properties.join(',\\n')}\\n})`;\r\n\r\n case 'ZodOptional':\r\n return `${this.zodSchemaToString(schema._def.innerType, context)}.optional()`;\r\n\r\n case 'ZodEnum':\r\n const values = schema._def.values;\r\n const enumValues = values.map((v: string) => `\"${v}\"`).join(', ');\r\n return `z.enum([${enumValues}])`;\r\n\r\n case 'ZodRecord':\r\n const valueType = schema._def.valueType;\r\n const keyType = schema._def.keyType;\r\n const keyTypeString = keyType ? this.zodSchemaToString(keyType, context) : 'z.string()';\r\n return `z.record(${keyTypeString}, ${this.zodSchemaToString(valueType, context)})`;\r\n\r\n case 'ZodUnion':\r\n const options = schema._def.options;\r\n const unionTypes = options.map((option: any) => this.zodSchemaToString(option, context));\r\n return `z.union([${unionTypes.join(', ')}])`;\r\n\r\n default:\r\n // Check if this has a schema reference\r\n if ((schema as any)._schemaRef) {\r\n const refName = (schema as any)._schemaRef;\r\n const registeredSchema = this.schemaRegistry.get(refName);\r\n if (registeredSchema) {\r\n return registeredSchema;\r\n }\r\n // Extract base name (handle both \"AuthUser\" and \"AuthUserSchema\")\r\n const baseName = refName.endsWith('Schema') \r\n ? refName.replace(/Schema$/, '')\r\n : refName;\r\n return `${toPascalCase(baseName)}Schema`;\r\n }\r\n return 'z.any()';\r\n }\r\n }\r\n\r\n private generateValidationHelpers(): string {\r\n return `\r\n// Validation helper functions\r\nexport function validateSchema<T>(schema: z.ZodSchema<T>, data: unknown): {\r\n success: boolean\r\n data?: T\r\n errors?: string[]\r\n} {\r\n try {\r\n const result = schema.safeParse(data)\r\n if (result.success) {\r\n return { success: true, data: result.data }\r\n } else {\r\n return {\r\n success: false,\r\n errors: result.error.issues.map(err => \\`\\${err.path.join('.')}: \\${err.message}\\`)\r\n }\r\n }\r\n } catch (error) {\r\n return {\r\n success: false,\r\n errors: [error instanceof Error ? error.message : 'Unknown validation error']\r\n }\r\n }\r\n}\r\n\r\nexport function createValidator<T>(schema: z.ZodSchema<T>) {\r\n return (data: unknown) => validateSchema(schema, data)\r\n}\r\n\r\n// Common validation patterns\r\nexport const commonPatterns = {\r\n email: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\r\n // phone: /^\\+?[\\d\\s\\-$$$$]+$/,\r\n // url: /^https?:\\/\\/.+/,\r\n // uuid: /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\r\n}\r\n\r\n// Custom error messages\r\nexport const errorMessages = {\r\n required: 'This field is required',\r\n email: 'Please enter a valid email address',\r\n phone: 'Please enter a valid phone number',\r\n url: 'Please enter a valid URL',\r\n minLength: (min: number) => \\`Must be at least \\${min} characters\\`,\r\n maxLength: (max: number) => \\`Must be no more than \\${max} characters\\`,\r\n min: (min: number) => \\`Must be at least \\${min}\\`,\r\n max: (max: number) => \\`Must be no more than \\${max}\\`\r\n}`;\r\n }\r\n\r\n private removeUnusedCode(content: string): string {\r\n // Remove unused imports and variables\r\n const lines = content.split('\\n');\r\n const cleanedLines: string[] = [];\r\n const usedIdentifiers = new Set<string>();\r\n \r\n // Always keep 'z' from zod as it's used extensively with dot notation (z.object, z.string, etc.)\r\n usedIdentifiers.add('z');\r\n \r\n // First pass: collect all used identifiers\r\n for (const line of lines) {\r\n // Check for z. usage (z.object, z.string, z.infer, etc.)\r\n if (line.includes('z.')) {\r\n usedIdentifiers.add('z');\r\n }\r\n \r\n // Extract variable names from assignments and function calls\r\n const assignments = line.match(/(\\w+)\\s*[:=]/g);\r\n if (assignments) {\r\n assignments.forEach(match => {\r\n const identifier = match.split(/[:=]/)[0].trim();\r\n usedIdentifiers.add(identifier);\r\n });\r\n }\r\n \r\n // Extract function calls\r\n const functionCalls = line.match(/(\\w+)\\s*\\(/g);\r\n if (functionCalls) {\r\n functionCalls.forEach(match => {\r\n const identifier = match.split('(')[0].trim();\r\n usedIdentifiers.add(identifier);\r\n });\r\n }\r\n \r\n // Extract type references (z.infer<typeof Schema>)\r\n if (line.includes('z.infer')) {\r\n usedIdentifiers.add('z');\r\n }\r\n }\r\n \r\n // Second pass: filter out unused imports and variables\r\n for (const line of lines) {\r\n // Skip empty lines and comments\r\n if (line.trim() === '' || line.trim().startsWith('//')) {\r\n cleanedLines.push(line);\r\n continue;\r\n }\r\n \r\n // Check for unused imports\r\n if (line.includes('import') && line.includes('from')) {\r\n // Always keep zod imports\r\n if (line.includes('from \"zod\"') || line.includes(\"from 'zod'\")) {\r\n cleanedLines.push(line);\r\n continue;\r\n }\r\n \r\n const importMatch = line.match(/import\\s*\\{([^}]+)\\}/);\r\n if (importMatch) {\r\n const imports = importMatch[1].split(',').map(imp => imp.trim());\r\n const usedImports = imports.filter(imp => usedIdentifiers.has(imp));\r\n if (usedImports.length > 0) {\r\n cleanedLines.push(line.replace(importMatch[1], usedImports.join(', ')));\r\n } else {\r\n // Skip unused import line\r\n continue;\r\n }\r\n } else {\r\n cleanedLines.push(line);\r\n }\r\n } else {\r\n cleanedLines.push(line);\r\n }\r\n }\r\n \r\n return cleanedLines.join('\\n');\r\n }\r\n}\r\n","import type {\r\n BridgeConfiguration,\r\n GenerationContext,\r\n GeneratedFile,\r\n ApiEndpointDefinition,\r\n ParameterDefinition,\r\n} from '@/core/types';\r\nimport { toValidIdentifier, toActionName } from '@/utils/naming-helpers';\r\n\r\nexport class ActionGenerator {\r\n constructor(private readonly configuration: BridgeConfiguration) {}\r\n\r\n private get loggingEnabled(): boolean {\r\n return this.configuration.dev?.logging !== false;\r\n }\r\n\r\n private get validationEnabled(): boolean {\r\n return this.configuration.dev?.validation !== false;\r\n }\r\n\r\n private get commentsEnabled(): boolean {\r\n return this.configuration.generation?.comments !== false;\r\n }\r\n\r\n private get documentationEnabled(): boolean {\r\n return this.configuration.generation?.documentation !== false;\r\n }\r\n\r\n private commentLine(text: string, indent = 2): string {\r\n if (!this.commentsEnabled) {\r\n return '';\r\n }\r\n return `${' '.repeat(indent)}// ${text}\\n`;\r\n }\r\n\r\n private buildDocBlock(endpoint: ApiEndpointDefinition, featuresDescription: string): string {\r\n if (!this.documentationEnabled) {\r\n return '';\r\n }\r\n\r\n const summary = endpoint.summary || endpoint.description || `${endpoint.method} ${endpoint.path}`;\r\n\r\n return `/**\r\n * ${summary}\r\n * @generated from ${endpoint.method} ${endpoint.path}\r\n * Features: ${featuresDescription}\r\n */\r\n`;\r\n }\r\n\r\n private buildUtilityFunctions(): string {\r\n const parts: string[] = [];\r\n\r\n if (this.commentsEnabled) {\r\n parts.push('// Utility functions for enhanced server actions');\r\n }\r\n\r\n parts.push(`async function getClientInfo() {\r\n const headersList = await headers()\r\n const userAgent = headersList.get('user-agent') || 'unknown'\r\n const ip = headersList.get('x-forwarded-for') || headersList.get('x-real-ip') || 'unknown'\r\n \r\n return { userAgent, ip }\r\n}`);\r\n\r\n if (this.validationEnabled) {\r\n parts.push(`async function validateAndSanitizeInput<T>(schema: z.ZodSchema<T>, input: unknown): Promise<T> {\r\n try {\r\n return await schema.parseAsync(input)\r\n } catch (error) {\r\n if (error instanceof z.ZodError) {\r\n const errorMessages = error.issues.map(issue => {\r\n const path = issue.path.length > 0 ? \\`\\${issue.path.join('.')}: \\` : ''\r\n return \\`\\${path}\\${issue.message}\\`\r\n }).join(', ')\r\n throw new ActionError(\\`Input validation failed: \\${errorMessages}\\`, 'VALIDATION_ERROR')\r\n }\r\n throw new ActionError('Invalid input format', 'VALIDATION_ERROR')\r\n }\r\n}`);\r\n }\r\n\r\n const actionErrorBlock = `${this.commentsEnabled ? '// Enhanced error handling with context\\n' : ''}class ActionExecutionError extends ActionError {\r\n constructor(\r\n message: string,\r\n public readonly context: {\r\n endpoint: string\r\n method: string\r\n timestamp: number\r\n },\r\n public readonly originalError?: unknown\r\n ) {\r\n super(message, 'EXECUTION_ERROR')\r\n }\r\n}`;\r\n parts.push(actionErrorBlock);\r\n\r\n if (this.loggingEnabled) {\r\n const loggingHeader = this.commentsEnabled ? '// Logging utility for server actions\\n' : '';\r\n parts.push(`${loggingHeader}async function logActionExecution(\r\n action: string,\r\n success: boolean,\r\n duration: number,\r\n context?: Record<string, any>\r\n) {\r\n if (process.env.NODE_ENV === 'development') {\r\n console.log(\\`[ACTION] \\${action} - \\${success ? 'SUCCESS' : 'FAILED'} (\\${duration}ms)\\`, context)\r\n }\r\n \r\n${this.commentsEnabled ? \" // In production, send to your logging service\\n // await analytics.track('server_action_executed', { action, success, duration, ...context })\" : ''}\r\n}`);\r\n }\r\n\r\n return parts.join('\\n\\n');\r\n }\r\n\r\n private buildCombinedValidationSnippet(operationName: string, schemaName: string, isMultiLine: boolean = false): string {\r\n if (this.validationEnabled) {\r\n // For multi-line schemas, reconstruct inline to avoid template string issues\r\n const schemaCode = isMultiLine\r\n ? `z.object({\r\n body: ${operationName}RequestSchema,\r\n params: ${operationName}ParamsSchema\r\n })`\r\n : schemaName;\r\n return `\\n${this.commentLine('Validate and sanitize input payload', 6)} const { body, params } = await validateAndSanitizeInput(${schemaCode}, parsedInput)\r\n const validatedBody = body\r\n const validatedParams = params as z.infer<typeof ${operationName}ParamsSchema>`;\r\n }\r\n\r\n return `\\n${this.commentLine('Runtime validation disabled - trusting provided payload', 6)} const { body, params } = parsedInput as {\r\n body: z.infer<typeof ${operationName}RequestSchema>\r\n params: z.infer<typeof ${operationName}ParamsSchema>\r\n }\r\n const validatedBody = body\r\n const validatedParams = params`;\r\n }\r\n\r\n private buildBodyValidationSnippet(schemaName: string): string {\r\n if (schemaName === 'z.void()') {\r\n return '';\r\n }\r\n\r\n if (this.validationEnabled) {\r\n return `\\n${this.commentLine('Validate and sanitize request body', 6)} const validatedBody = await validateAndSanitizeInput(${schemaName}, parsedInput)`;\r\n }\r\n\r\n return `\\n${this.commentLine('Runtime validation disabled - trusting request body', 6)} const validatedBody = parsedInput as z.infer<typeof ${schemaName}>`;\r\n }\r\n\r\n private buildParamsValidationSnippet(operationName: string, schemaName: string): string {\r\n if (schemaName === 'z.void()') {\r\n return '';\r\n }\r\n\r\n if (this.validationEnabled) {\r\n return `\\n${this.commentLine('Validate and sanitize parameters', 6)} const validatedParams = await validateAndSanitizeInput(${schemaName}, parsedInput) as z.infer<typeof ${operationName}ParamsSchema>`;\r\n }\r\n\r\n return `\\n${this.commentLine('Runtime validation disabled - trusting parameters', 6)} const validatedParams = parsedInput as z.infer<typeof ${operationName}ParamsSchema>`;\r\n }\r\n\r\n private buildSuccessLoggingBlock(actionName: string, endpoint: ApiEndpointDefinition, indent: number, isStreaming = false): string {\r\n if (!this.loggingEnabled) {\r\n return '';\r\n }\r\n\r\n if (isStreaming) {\r\n return `\\n${this.commentLine('Background tasks (Next.js 15 feature)', indent)}${' '.repeat(indent)}after(async () => {\r\n${this.commentLine('Perform background tasks after response is sent', indent + 2)}${' '.repeat(indent + 2)}await logActionExecution('${actionName}', true, Date.now() - startTime, {\r\n${' '.repeat(indent + 4)}method: '${endpoint.method}',\r\n${' '.repeat(indent + 4)}path: '${endpoint.path}'\r\n${' '.repeat(indent + 2)}})\r\n${' '.repeat(indent)}})`;\r\n }\r\n\r\n return `\\n${this.commentLine('Log successful execution', indent)}${' '.repeat(indent)}const duration = Date.now() - startTime\r\n${' '.repeat(indent)}await logActionExecution('${actionName}', true, duration, {\r\n${' '.repeat(indent + 2)}method: '${endpoint.method}',\r\n${' '.repeat(indent + 2)}path: '${endpoint.path}'\r\n${' '.repeat(indent)}})`;\r\n }\r\n\r\n private buildErrorLoggingBlock(actionName: string, endpoint: ApiEndpointDefinition, indent: number): string {\r\n if (!this.loggingEnabled) {\r\n return '';\r\n }\r\n\r\n return `\\n${' '.repeat(indent)}const duration = Date.now() - startTime\r\n\\n${this.commentLine('Enhanced error logging', indent)}${' '.repeat(indent)}await logActionExecution('${actionName}', false, duration, {\r\n${' '.repeat(indent + 2)}method: '${endpoint.method}',\r\n${' '.repeat(indent + 2)}path: '${endpoint.path}',\r\n${' '.repeat(indent + 2)}error: error instanceof Error ? error.message : 'Unknown error'\r\n${' '.repeat(indent)}})`;\r\n }\r\n\r\n private buildImportPath(relativePath: string): string {\r\n const outputDirectory = this.configuration.outputDir || 'generated';\r\n const cleanPath = relativePath.startsWith('/') ? relativePath.slice(1) : relativePath;\r\n let importBasePath = outputDirectory;\r\n if (importBasePath.startsWith('src/')) {\r\n importBasePath = importBasePath.substring(4);\r\n }\r\n return `@/${importBasePath}/${cleanPath}`;\r\n }\r\n\r\n async generate(context: GenerationContext): Promise<GeneratedFile[]> {\r\n const { schema, config } = context;\r\n const generatedFiles: GeneratedFile[] = [];\r\n const endpointsByTag = this.groupEndpointsByTag(schema.endpoints);\r\n\r\n for (const [tag, endpoints] of Object.entries(endpointsByTag)) {\r\n const tagName = toValidIdentifier(tag);\r\n const actions = endpoints\r\n .map(endpoint => this.generateOptimizedServerAction(endpoint, config))\r\n .join('\\n\\n');\r\n\r\n // Determine what imports we need\r\n const usesAuth = endpoints.some(endpoint => endpoint.metadata.requiresAuth);\r\n const usesRevalidation = endpoints.some(\r\n endpoint => endpoint.metadata.revalidationTags.length > 0\r\n );\r\n const hasRedirects = endpoints.some(endpoint => endpoint.method !== 'GET');\r\n const hasRateLimit = endpoints.some(endpoint => endpoint.metadata.rateLimit);\r\n const hasFileUpload = endpoints.some(endpoint => endpoint.metadata.fileUpload);\r\n const uploadProvider = this.configuration.uploads?.provider || 'standard';\r\n const uploadStrategy = this.configuration.uploads?.strategy || 'standard';\r\n const hasStreaming = endpoints.some(endpoint => endpoint.metadata.streaming);\r\n\r\n const clientImport = this.buildImportPath('client');\r\n const safeActionImport = this.buildImportPath('lib/safe-action');\r\n const schemasImport = this.buildImportPath('schemas');\r\n\r\n // Generate proper schema imports - only import what we actually use\r\n const usedSchemas = new Set<string>();\r\n\r\n endpoints.forEach(endpoint => {\r\n const operationName = this.getOperationName(endpoint);\r\n\r\n // Check if we need request schema\r\n if (endpoint.requestBody) {\r\n usedSchemas.add(`${operationName}RequestSchema`);\r\n }\r\n\r\n // Check if we need params schema\r\n const hasAnyParams = endpoint.parameters.length > 0;\r\n if (hasAnyParams) {\r\n usedSchemas.add(`${operationName}ParamsSchema`);\r\n }\r\n\r\n // Always add response schema for type safety\r\n usedSchemas.add(`${operationName}ResponseSchema`);\r\n });\r\n\r\n const schemaImportsString = Array.from(usedSchemas).join(',\\n ');\r\n\r\n const imports = [\r\n \"'use server'\",\r\n '',\r\n \"import { z } from 'zod'\",\r\n ...(endpoints.some(e => e.method === 'GET') ? [\"import { cache } from 'react'\"] : []),\r\n ...(usesRevalidation ? [\"import { updateTag } from 'next/cache'\"] : []),\r\n ...(hasRedirects ? [\"import { redirect } from 'next/navigation'\"] : []),\r\n ...(hasStreaming ? [\"import { after } from 'next/server'\"] : []),\r\n \"import { headers } from 'next/headers'\",\r\n `import { apiClient } from '${clientImport}'`,\r\n `import { actionClientWithMeta${usesAuth || hasRateLimit ? ', authActionClient' : ''}, ActionError } from '${safeActionImport}'`,\r\n ...(schemaImportsString\r\n ? [`import {\\n ${schemaImportsString}\\n} from '${schemasImport}'`]\r\n : []),\r\n ...(hasFileUpload && uploadStrategy === 'external' && uploadProvider === 'uploadthing'\r\n ? [\"import { createUploadthing, type FileRouter } from 'uploadthing/next'\"]\r\n : []),\r\n ...(hasFileUpload && uploadStrategy === 'external' && uploadProvider === 'vercel-blob'\r\n ? [\"import { put } from '@vercel/blob'\"]\r\n : []),\r\n ...(hasRateLimit\r\n ? [\r\n \"import { Ratelimit } from '@upstash/ratelimit'\",\r\n \"import { Redis } from '@upstash/redis'\",\r\n ]\r\n : []),\r\n ]\r\n .filter(Boolean)\r\n .join('\\n');\r\n\r\n const rateLimitSetup = hasRateLimit\r\n ? `\r\n${this.commentsEnabled ? '// Rate limiting setup\\n' : ''}const redis = new Redis({\r\n url: process.env.UPSTASH_REDIS_REST_URL!,\r\n token: process.env.UPSTASH_REDIS_REST_TOKEN!,\r\n})\r\n\r\nconst ratelimit = new Ratelimit({\r\n redis,\r\n limiter: Ratelimit.slidingWindow(10, '1 m'),\r\n analytics: true,\r\n})`\r\n : '';\r\n\r\n const utilityFunctions = this.buildUtilityFunctions();\r\n\r\n const content = `${imports}\r\n${rateLimitSetup}\r\n${utilityFunctions}\r\n\r\n${actions}`;\r\n\r\n generatedFiles.push({\r\n path: `actions/${tagName}.ts`,\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: endpoints.map(endpoint => toActionName(endpoint.operationId || endpoint.id)),\r\n imports: ['next-safe-action', 'next/cache', 'next/navigation', 'next/headers'],\r\n dependencies: [schemasImport, clientImport, safeActionImport],\r\n },\r\n });\r\n }\r\n\r\n // Generate index file\r\n const indexHeader = this.commentsEnabled ? '// Auto-generated actions index\\n' : '';\r\n const indexContent = `${indexHeader}${Object.keys(endpointsByTag)\r\n .map(tag => `export * from './${toValidIdentifier(tag)}'`)\r\n .join('\\n')}`;\r\n\r\n generatedFiles.push({\r\n path: 'actions/index.ts',\r\n content: indexContent,\r\n type: 'typescript',\r\n metadata: {\r\n exports: [],\r\n imports: [],\r\n dependencies: Object.keys(endpointsByTag).map(tag => `./${toValidIdentifier(tag)}`),\r\n },\r\n });\r\n\r\n return generatedFiles;\r\n }\r\n\r\n private getOperationName(endpoint: ApiEndpointDefinition): string {\r\n if (endpoint.operationId) {\r\n // Clean the operation ID to remove duplicate prefixes\r\n let cleanOperationId = endpoint.operationId;\r\n \r\n // Remove duplicate ApiV1 prefixes\r\n cleanOperationId = cleanOperationId.replace(/^ApiV1ApiV1/, 'ApiV1');\r\n cleanOperationId = cleanOperationId.replace(/^ApiV1Api/, 'Api');\r\n \r\n return cleanOperationId\r\n .split('_')\r\n .map(part => this.toPascalCase(part))\r\n .join('');\r\n }\r\n\r\n const pathParts = endpoint.path\r\n .split('/')\r\n .filter(part => part && !part.startsWith('{'))\r\n .map(part => this.toPascalCase(part));\r\n\r\n const method = this.toPascalCase(endpoint.method.toLowerCase());\r\n\r\n return [...pathParts, method].join('');\r\n }\r\n\r\n private generateOptimizedServerAction(\r\n endpoint: ApiEndpointDefinition,\r\n config: BridgeConfiguration\r\n ): string {\r\n const actionName = toActionName(endpoint.operationId || endpoint.id);\r\n const operationName = this.getOperationName(endpoint);\r\n const hasRequestBody = !!endpoint.requestBody;\r\n const requiresAuth = endpoint.metadata.requiresAuth;\r\n const revalidationTags = endpoint.metadata.revalidationTags;\r\n const isQuery = endpoint.method === 'GET';\r\n const tagName = toValidIdentifier(endpoint.tags[0] || 'default');\r\n const hasRateLimit = endpoint.metadata.rateLimit;\r\n const hasFileUpload = endpoint.metadata.fileUpload && hasRequestBody;\r\n const uploadProvider = this.configuration.uploads?.provider || 'standard';\r\n const uploadStrategy = this.configuration.uploads?.strategy || 'standard';\r\n const isStreaming = endpoint.metadata.streaming;\r\n\r\n // Build parameter handling\r\n const pathParameters = endpoint.parameters.filter(parameter => parameter.in === 'path');\r\n const queryParameters = endpoint.parameters.filter(parameter => parameter.in === 'query');\r\n const hasAnyParams = endpoint.parameters.length > 0;\r\n const responseSchemaName = this.getResponseSchemaName(endpoint, isStreaming);\r\n // Determine schema to use\r\n let schemaName: string;\r\n let parameterProcessing = '';\r\n let requestOptionsParams = '';\r\n\r\n if (hasRequestBody && hasAnyParams) {\r\n // Complex case: both body and params\r\n schemaName = `z.object({\r\n body: ${operationName}RequestSchema,\r\n params: ${operationName}ParamsSchema\r\n })`;\r\n\r\n // Pass whether schema is multi-line to help with code generation\r\n const isMultiLineSchema = schemaName.includes('\\n');\r\n parameterProcessing = this.buildCombinedValidationSnippet(operationName, schemaName, isMultiLineSchema);\r\n\r\n requestOptionsParams = this.buildRequestOptions(pathParameters, queryParameters, true, true);\r\n } else if (hasRequestBody) {\r\n schemaName = `${operationName}RequestSchema`;\r\n parameterProcessing = this.buildBodyValidationSnippet(schemaName);\r\n\r\n requestOptionsParams = `body: validatedBody`;\r\n } else if (hasAnyParams) {\r\n schemaName = `${operationName}ParamsSchema`;\r\n parameterProcessing = this.buildParamsValidationSnippet(operationName, schemaName);\r\n\r\n requestOptionsParams = this.buildRequestOptions(pathParameters, queryParameters, false, true);\r\n } else {\r\n schemaName = 'z.void()';\r\n parameterProcessing = '';\r\n requestOptionsParams = '';\r\n }\r\n\r\n // For multi-line schemas, we need to use a type alias to avoid syntax errors\r\n // Use single-line format for parsedInputType to avoid template string issues\r\n const parsedInputType = hasRequestBody || hasAnyParams \r\n ? (schemaName.includes('\\n') \r\n ? `z.infer<typeof z.object({ body: ${operationName}RequestSchema, params: ${operationName}ParamsSchema })>`\r\n : `z.infer<typeof ${schemaName}>`)\r\n : 'void';\r\n const ctxType = requiresAuth || hasRateLimit\r\n ? '{ user?: any; ratelimit?: { remaining: number } }'\r\n : 'any';\r\n const ctxDeclaration = requiresAuth || hasRateLimit ? `ctx: ${ctxType}` : 'ctx?: any';\r\n const actionArgsType = `{\r\n parsedInput: ${parsedInputType};\r\n ${ctxDeclaration}\r\n }`;\r\n\r\n // Choose the right client based on requirements (Next.js 16.0.1: use actionClientWithMeta for metadata support)\r\n const clientName = requiresAuth || hasRateLimit ? 'authActionClient' : 'actionClientWithMeta';\r\n\r\n // Generate rate limiting code\r\n const rateLimitCode = hasRateLimit\r\n ? `\\n${this.commentLine('Rate limiting', 6)} const { userAgent, ip } = await getClientInfo()\r\n const identifier = \\`\\${ip}-\\${userAgent}\\`\r\n const { success, limit, reset, remaining } = await ratelimit.limit(identifier)\r\n \r\n if (!success) {\r\n throw new ActionError(\r\n \\`Rate limit exceeded. Try again in \\${Math.round((reset - Date.now()) / 1000)} seconds.\\`,\r\n 'RATE_LIMIT_EXCEEDED'\r\n )\r\n }`\r\n : '';\r\n\r\n // Generate revalidation code (Next.js 16.0.1: use updateTag instead of revalidateTag)\r\n const revalidationCode =\r\n revalidationTags.length > 0\r\n ? revalidationTags\r\n .map(\r\n tag =>\r\n ` updateTag('${tag}')${\r\n this.loggingEnabled ? `\\n console.log('Updated tag: ${tag}')` : ''\r\n }`\r\n )\r\n .join('\\n')\r\n : '';\r\n\r\n // Generate kebab-case name for metadata\r\n const kebabActionName = actionName\r\n .replace(/([A-Z])/g, '-$1')\r\n .toLowerCase()\r\n .replace(/^-/, '');\r\n\r\n // For GET requests, use React cache for deduplication\r\n if (isQuery) {\r\n const docBlock = this.buildDocBlock(\r\n endpoint,\r\n 'React cache, input validation, error handling'\r\n );\r\n\r\n return `${docBlock}export const ${actionName} = cache(\r\n ${clientName}\r\n .metadata({\r\n name: \"${kebabActionName}\",\r\n requiresAuth: ${requiresAuth}${\r\n hasRateLimit\r\n ? `,\r\n rateLimit: { requests: ${endpoint.metadata.rateLimit?.requests || 10}, window: \"${endpoint.metadata.rateLimit?.window || '1m'}\" }`\r\n : ''\r\n }\r\n })\r\n .schema(${schemaName})\r\n .action(async ({ parsedInput, ctx }: ${actionArgsType}) => {\r\n const startTime = Date.now()\r\n \r\n try {${rateLimitCode}${parameterProcessing}\r\n\r\n // Execute API call with enhanced error handling\r\n const response = await apiClient.${tagName}.${actionName}({${requestOptionsParams}${requestOptionsParams && !requestOptionsParams.trim().endsWith(',') ? ',' : ''}\r\n config: {\r\n timeout: ${endpoint.metadata.timeout || this.configuration.api.timeout},\r\n retries: ${this.configuration.api.retries},\r\n validateResponse: false,\r\n responseSchema: ${responseSchemaName}\r\n }\r\n })\r\n \r\n${this.buildSuccessLoggingBlock(actionName, endpoint, 8)}\r\n \r\n return response.data\r\n } catch (error) {\r\n${this.buildErrorLoggingBlock(actionName, endpoint, 8)}\r\n \r\n // Throw enhanced error with context\r\n throw new ActionExecutionError(\r\n error instanceof Error ? error.message : 'Unknown error occurred',\r\n {\r\n endpoint: '${endpoint.path}',\r\n method: '${endpoint.method}',\r\n timestamp: Date.now()\r\n },\r\n error\r\n )\r\n }\r\n })\r\n)`;\r\n }\r\n\r\n // For mutations, handle revalidation and potential redirects\r\n const redirectCode = `\r\n${this.commentLine('Handle potential redirects based on response', 8)} if (response.status === 201 && response.headers.get('location')) {\r\n const location = response.headers.get('location')!\r\n redirect(location)\r\n }`;\r\n\r\n const streamingCode = `\r\n${this.commentLine('Handle streaming responses', 8)} if (response.headers.get('content-type')?.includes('text/stream')) {\r\n${this.commentLine('Process streaming response', 10)} return response.data\r\n }`;\r\n\r\n const fileUploadCode = hasFileUpload\r\n ? uploadStrategy === 'external' && uploadProvider === 'vercel-blob'\r\n ? `\r\n${this.commentLine('Handle file uploads with Vercel Blob', 8)} if (validatedBody && typeof validatedBody === 'object' && 'file' in validatedBody) {\r\n const file = (validatedBody as any).file as File\r\n const blob = await put(file.name, file, { access: 'public' })\r\n Object.assign(validatedBody, { fileUrl: blob.url })\r\n }`\r\n : uploadStrategy === 'external' && uploadProvider === 'uploadthing'\r\n ? `\r\n${this.commentLine('Handle file uploads with UploadThing', 8)}${this.commentLine('UploadThing requires a separate route handler setup', 8)}${this.commentLine('See: https://docs.uploadthing.com/getting-started/appdir', 8)} if (validatedBody && typeof validatedBody === 'object' && 'file' in validatedBody) {\r\n${this.commentLine('UploadThing file handling should be done via their route handler', 10)}${this.commentLine('This is a placeholder - implement according to UploadThing docs', 10)} }`\r\n : `\r\n${this.commentLine('Handle file uploads with standard FormData', 8)} if (validatedBody && typeof validatedBody === 'object' && 'file' in validatedBody) {\r\n${this.commentLine('Standard file upload handling', 10)} const file = (validatedBody as any).file as File\r\n${this.commentLine('Process file with compression and validation if enabled', 10)} }`\r\n : '';\r\n\r\n const mutationDocBlock = this.buildDocBlock(\r\n endpoint,\r\n 'Input validation, revalidation, error handling'\r\n );\r\n\r\n return `${mutationDocBlock}export const ${actionName} = ${clientName}\r\n .metadata({\r\n name: \"${kebabActionName}\",\r\n requiresAuth: ${requiresAuth}${\r\n hasRateLimit\r\n ? `,\r\n rateLimit: { requests: ${endpoint.metadata.rateLimit?.requests || 10}, window: \"${endpoint.metadata.rateLimit?.window || '1m'}\" }`\r\n : ''\r\n }\r\n })\r\n .schema(${schemaName})\r\n .action(async ({ parsedInput, ctx }: ${actionArgsType}) => {\r\n const startTime = Date.now()\r\n \r\n try {${rateLimitCode}${parameterProcessing}${fileUploadCode}\r\n\r\n // Execute API call with enhanced configuration\r\n const response = await apiClient.${tagName}.${actionName}({${requestOptionsParams}${requestOptionsParams && !requestOptionsParams.trim().endsWith(',') ? ',' : ''}\r\n config: {\r\n timeout: ${endpoint.metadata.timeout || this.configuration.api.timeout},\r\n retries: ${this.configuration.api.retries},\r\n validateResponse: false,\r\n responseSchema: ${operationName}ResponseSchema\r\n }\r\n })${streamingCode}${redirectCode}\r\n\r\n ${\r\n revalidationCode\r\n ? `${this.commentLine('Revalidate cache after successful mutation', 6)}${revalidationCode}\\n`\r\n : ''\r\n }\r\n${this.buildSuccessLoggingBlock(actionName, endpoint, 6, isStreaming)}\r\n \r\n return response.data\r\n } catch (error) {\r\n${this.buildErrorLoggingBlock(actionName, endpoint, 6)}\r\n \r\n // Throw enhanced error with context\r\n throw new ActionExecutionError(\r\n error instanceof Error ? error.message : 'Unknown error occurred',\r\n {\r\n endpoint: '${endpoint.path}',\r\n method: '${endpoint.method}',\r\n timestamp: Date.now()\r\n },\r\n error\r\n )\r\n }\r\n })`;\r\n }\r\n private getResponseSchemaName(endpoint: ApiEndpointDefinition, isStreaming: boolean): string {\r\n const operationName = this.getOperationName(endpoint);\r\n\r\n if (isStreaming) {\r\n return 'z.any()'; // streaming responses don't need schema validation\r\n }\r\n\r\n // If your endpoint has a request body or parameters, assume a schema was generated\r\n const hasSchema = endpoint.requestBody || endpoint.parameters.length > 0 || true; // fallback to true\r\n return hasSchema ? `${operationName}ResponseSchema` : 'z.any()';\r\n }\r\n\r\n private buildRequestOptions(\r\n pathParameters: ParameterDefinition[],\r\n queryParameters: ParameterDefinition[],\r\n hasBody: boolean,\r\n hasParams: boolean\r\n ): string {\r\n const options: string[] = [];\r\n\r\n // Build path parameters with proper type conversion\r\n if (pathParameters.length > 0) {\r\n const pathParamEntries = pathParameters.map(param => {\r\n const paramName = param.name;\r\n const paramType = this.getParameterType(param);\r\n if (paramType === 'number') {\r\n return ` ${paramName}: Number(validatedParams.path.${paramName})`;\r\n }\r\n return ` ${paramName}: validatedParams.path.${paramName}`;\r\n });\r\n \r\n if (hasParams) {\r\n options.push(`path: {\\n${pathParamEntries.join(',\\n')}\\n }`);\r\n }\r\n }\r\n\r\n // Build query parameters\r\n if (queryParameters.length > 0) {\r\n if (hasParams) {\r\n options.push('query: validatedParams.query,');\r\n }\r\n }\r\n\r\n // Build headers if needed\r\n const headerParameters = pathParameters.filter(p => p.in === 'header');\r\n if (headerParameters.length > 0 && hasParams) {\r\n options.push('headers: validatedParams.headers,');\r\n }\r\n\r\n if (hasBody) {\r\n options.push('body: validatedBody,');\r\n }\r\n\r\n // Wrap parameters in params object if we have any parameters\r\n if (hasParams && options.length > 0) {\r\n const paramsContent = options.filter(opt => !opt.includes('body:')).join(',\\n');\r\n const bodyContent = options.filter(opt => opt.includes('body:')).join(',\\n');\r\n \r\n if (paramsContent) {\r\n return `params: {\\n${paramsContent}\\n }${bodyContent ? `,\\n${bodyContent}` : ''}`;\r\n }\r\n }\r\n\r\n return options.join('\\n');\r\n }\r\n\r\n private getParameterType(parameter: ParameterDefinition): string {\r\n const schema = parameter.schema as any;\r\n const definition = schema._def;\r\n\r\n switch (definition?.typeName) {\r\n case 'ZodString':\r\n return 'string';\r\n case 'ZodNumber':\r\n return 'number';\r\n case 'ZodBoolean':\r\n return 'boolean';\r\n case 'ZodArray':\r\n return 'array';\r\n default:\r\n return 'string';\r\n }\r\n }\r\n\r\n private groupEndpointsByTag(\r\n endpoints: ApiEndpointDefinition[]\r\n ): Record<string, ApiEndpointDefinition[]> {\r\n return endpoints.reduce(\r\n (accumulator, endpoint) => {\r\n const tag = endpoint.tags[0] || 'default';\r\n if (!accumulator[tag]) {\r\n accumulator[tag] = [];\r\n }\r\n accumulator[tag].push(endpoint);\r\n return accumulator;\r\n },\r\n {} as Record<string, ApiEndpointDefinition[]>\r\n );\r\n }\r\n\r\n private toPascalCase(str: string): string {\r\n return str\r\n .replace(/[-_\\s]+(.)?/g, (_, char) => (char ? char.toUpperCase() : ''))\r\n .replace(/^(.)/, char => char.toUpperCase());\r\n }\r\n}","import type {\r\n BridgeConfiguration,\r\n GenerationContext,\r\n GeneratedFile,\r\n ApiEndpointDefinition,\r\n} from '@/core/types';\r\nimport { toValidIdentifier, toHookName, toActionName } from '@/utils/naming-helpers';\r\n\r\nexport class HookGenerator {\r\n constructor(private readonly configuration: BridgeConfiguration) {}\r\n\r\n private buildImportPath(relativePath: string): string {\r\n const outputDirectory = this.configuration.outputDir || 'generated';\r\n const cleanPath = relativePath.startsWith('/') ? relativePath.slice(1) : relativePath;\r\n let importBasePath = outputDirectory;\r\n if (importBasePath.startsWith('src/')) {\r\n importBasePath = importBasePath.substring(4);\r\n }\r\n return `@/${importBasePath}/${cleanPath}`;\r\n }\r\n\r\n async generate(context: GenerationContext): Promise<GeneratedFile[]> {\r\n const { schema } = context;\r\n const generatedFiles: GeneratedFile[] = [];\r\n const endpointsByTag = this.groupEndpointsByTag(schema.endpoints);\r\n\r\n for (const [tag, endpoints] of Object.entries(endpointsByTag)) {\r\n const tagName = toValidIdentifier(tag);\r\n const queries = endpoints.filter(endpoint => endpoint.method === 'GET');\r\n const mutations = endpoints.filter(endpoint => endpoint.method !== 'GET');\r\n\r\n const actionsImport = this.buildImportPath(`actions/${tagName}`);\r\n const schemasImport = this.buildImportPath('schemas');\r\n\r\n const hasQueries = queries.length > 0;\r\n const hasMutations = mutations.length > 0;\r\n const hasInfiniteQueries = queries.some(\r\n endpoint => endpoint.path.includes('search') || endpoint.path.includes('list')\r\n );\r\n const hasSuspenseQueries = queries.some(endpoint => !endpoint.path.includes('search'));\r\n\r\n const usedSchemas = new Set<string>();\r\n\r\n queries.forEach(endpoint => {\r\n const operationName = this.getOperationName(endpoint);\r\n usedSchemas.add(`${operationName}ResponseSchema`);\r\n\r\n if (endpoint.parameters.length > 0) {\r\n usedSchemas.add(`${operationName}ParamsSchema`);\r\n }\r\n });\r\n\r\n mutations.forEach(endpoint => {\r\n const operationName = this.getOperationName(endpoint);\r\n usedSchemas.add(`${operationName}ResponseSchema`);\r\n\r\n if (endpoint.requestBody) {\r\n usedSchemas.add(`${operationName}RequestSchema`);\r\n }\r\n\r\n if (endpoint.parameters.length > 0) {\r\n usedSchemas.add(`${operationName}ParamsSchema`);\r\n }\r\n });\r\n\r\n const schemaImportsString = Array.from(usedSchemas).join(',\\n ');\r\n\r\n const hasSearchParams = endpoints.some(\r\n endpoint =>\r\n endpoint.path.includes('search') ||\r\n endpoint.path.includes('list') ||\r\n endpoint.parameters.some(p => p.in === 'query')\r\n );\r\n\r\n const reactQueryImports = [];\r\n if (hasQueries) reactQueryImports.push('useQuery', 'useQueryClient', 'useSuspenseQuery');\r\n if (hasMutations) reactQueryImports.push('useMutation');\r\n if (hasInfiniteQueries) reactQueryImports.push('useInfiniteQuery');\r\n\r\n const reactImports = [];\r\n if (hasMutations) reactImports.push('useOptimistic', 'useTransition');\r\n\r\n const imports = [\r\n \"'use client'\",\r\n '',\r\n ...(reactQueryImports.length > 0\r\n ? [`import { ${reactQueryImports.join(', ')} } from '@tanstack/react-query'`]\r\n : []),\r\n ...(reactImports.length > 0 ? [`import { ${reactImports.join(', ')} } from 'react'`] : []),\r\n ...(hasSearchParams\r\n ? [\"import { parseAsInteger, parseAsString, useQueryStates } from 'nuqs'\"]\r\n : []),\r\n ...((hasQueries || hasMutations) ? [\"import { toast } from 'sonner'\"] : []),\r\n `import { ${[...queries, ...mutations]\r\n .map(endpoint => toActionName(endpoint.operationId || endpoint.id))\r\n .join(', ')} } from '${actionsImport}'`,\r\n ...(schemaImportsString\r\n ? [`import {\\n ${schemaImportsString}\\n} from '${schemasImport}'`]\r\n : []),\r\n ...(schemaImportsString ? [`import type { z } from 'zod'`] : []),\r\n ]\r\n .filter(Boolean)\r\n .join('\\n');\r\n\r\n const queryHooks = queries\r\n .map(endpoint => this.generateOptimizedQueryHook(endpoint))\r\n .join('\\n\\n');\r\n const mutationHooks = mutations\r\n .map(endpoint => this.generateOptimizedMutationHook(endpoint, context))\r\n .join('\\n\\n');\r\n\r\n const exportedHooks = [\r\n ...queries.map(endpoint => toHookName(endpoint.operationId || endpoint.id, true)),\r\n ...mutations.map(endpoint => toHookName(endpoint.operationId || endpoint.id, false)),\r\n ];\r\n\r\n const content = `${imports}\r\n\r\n${\r\n hasSearchParams\r\n ? `// Search params parsers for filtering and sorting\r\nconst searchParamsParser = {\r\n page: parseAsInteger.withDefault(1),\r\n limit: parseAsInteger.withDefault(10),\r\n search: parseAsString.withDefault(''),\r\n sort: parseAsString.withDefault(''),\r\n filter: parseAsString.withDefault(''),\r\n}`\r\n : ''\r\n}\r\n\r\n// Error handling utility\r\nfunction handleActionError(error: unknown): never {\r\n const message = error instanceof Error ? error.message : 'An unexpected error occurred'\r\n toast.error(message)\r\n throw new Error(message)\r\n}\r\n\r\ntype ActionResultLike<T> = {\r\n data?: T\r\n serverError?: unknown\r\n validationErrors?: unknown\r\n}\r\n\r\nasync function resolveActionResult<T>(actionPromise: Promise<any>): Promise<T> {\r\n const result = await actionPromise\r\n if (result && typeof result === 'object') {\r\n const actionResult = result as ActionResultLike<T>\r\n if (actionResult.serverError) {\r\n const message = typeof actionResult.serverError === 'string' ? actionResult.serverError : 'Server action failed'\r\n throw new Error(message)\r\n }\r\n if (actionResult.validationErrors) {\r\n throw new Error('Validation failed, please check your input')\r\n }\r\n if (typeof actionResult.data !== 'undefined') {\r\n return actionResult.data as T\r\n }\r\n }\r\n return result as T\r\n}\r\n\r\n${queryHooks}\r\n\r\n${mutationHooks}`;\r\n\r\n generatedFiles.push({\r\n path: `hooks/${tagName}.ts`,\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: exportedHooks,\r\n imports: ['@tanstack/react-query', 'react', 'nuqs', 'sonner'],\r\n dependencies: [actionsImport, schemasImport],\r\n },\r\n });\r\n }\r\n\r\n // Generate useBridgeQuery wrapper hook\r\n generatedFiles.push(this.generateBridgeQueryHook());\r\n\r\n // Generate index file\r\n const indexContent = `// Auto-generated hooks index\r\nexport * from './useBridgeQuery'\r\n${Object.keys(endpointsByTag)\r\n .map(tag => `export * from './${toValidIdentifier(tag)}'`)\r\n .join('\\n')}`;\r\n\r\n generatedFiles.push({\r\n path: 'hooks/index.ts',\r\n content: indexContent,\r\n type: 'typescript',\r\n metadata: {\r\n exports: ['useBridgeQuery'],\r\n imports: [],\r\n dependencies: ['./useBridgeQuery', ...Object.keys(endpointsByTag).map(tag => `./${toValidIdentifier(tag)}`)],\r\n },\r\n });\r\n\r\n return generatedFiles;\r\n }\r\n\r\n private getOperationName(endpoint: ApiEndpointDefinition): string {\r\n if (endpoint.operationId) {\r\n // Clean the operation ID to remove duplicate prefixes\r\n let cleanOperationId = endpoint.operationId;\r\n \r\n // Remove duplicate ApiV1 prefixes\r\n cleanOperationId = cleanOperationId.replace(/^ApiV1ApiV1/, 'ApiV1');\r\n cleanOperationId = cleanOperationId.replace(/^ApiV1Api/, 'Api');\r\n \r\n return cleanOperationId\r\n .split('_')\r\n .map(part => this.toPascalCase(part))\r\n .join('');\r\n }\r\n\r\n const pathParts = endpoint.path\r\n .split('/')\r\n .filter(part => part && !part.startsWith('{'))\r\n .map(part => this.toPascalCase(part));\r\n\r\n const method = this.toPascalCase(endpoint.method.toLowerCase());\r\n\r\n return [...pathParts, method].join('');\r\n }\r\n\r\n private generateOptimizedQueryHook(endpoint: ApiEndpointDefinition): string {\r\n const hookName = toHookName(endpoint.operationId || endpoint.id, true);\r\n const actionName = toActionName(endpoint.operationId || endpoint.id);\r\n const operationName = this.getOperationName(endpoint);\r\n const queryKey = this.generateQueryKey(endpoint);\r\n const staleTime = this.getStaleTime(endpoint);\r\n\r\n const pathParameters = endpoint.parameters.filter(parameter => parameter.in === 'path');\r\n const queryParameters = endpoint.parameters.filter(parameter => parameter.in === 'query');\r\n const hasPageParam = queryParameters.some(param => param.name === 'page');\r\n const hasSearchParams = endpoint.path.includes('search') || endpoint.path.includes('list');\r\n const hasParams = endpoint.parameters.length > 0;\r\n\r\n const parameterTypes: string[] = [];\r\n\r\n pathParameters.forEach(param => {\r\n const isRequired = param.required ? '' : '?';\r\n const paramType = this.getTypeFromZodSchema(param.schema);\r\n parameterTypes.push(`${param.name}${isRequired}: ${paramType}`);\r\n });\r\n\r\n queryParameters.forEach(param => {\r\n const isRequired = param.required ? '' : '?';\r\n const paramType = this.getTypeFromZodSchema(param.schema);\r\n parameterTypes.push(`${param.name}${isRequired}: ${paramType}`);\r\n });\r\n\r\n const returnType = `z.infer<typeof ${operationName}ResponseSchema>`;\r\n const optionsType = `{ enabled?: boolean; suspense?: boolean; refetchInterval?: number; initialData?: ${returnType} }`;\r\n\r\n const enabledCondition =\r\n pathParameters.length > 0\r\n ? `!!${pathParameters.map(parameter => parameter.name).join(' && !!')}`\r\n : 'true';\r\n\r\n const actionCallParams = this.buildActionCallParams(endpoint, false);\r\n\r\n if (hasSearchParams) {\r\n const queryParamObject =\r\n queryParameters.length > 0\r\n ? `{ ${queryParameters.map(param => `${param.name}`).join(', ')} }`\r\n : '{}';\r\n\r\n return `/**\r\n * Optimized query hook for ${endpoint.method} ${endpoint.path}\r\n * Features: URL state sync, infinite loading, optimistic updates\r\n * @returns useQuery result with data of type ${returnType}\r\n */\r\nexport function ${hookName}(${parameterTypes.length > 0 ? `${parameterTypes.join(', ')}, ` : ''}options?: ${optionsType}) {\r\n const [searchParams] = useQueryStates(searchParamsParser)\r\n const { initialData, ...restOptions } = options ?? {}\r\n \r\n return useQuery({\r\n queryKey: [...${queryKey}, searchParams],\r\n queryFn: async ({ signal }: { signal?: AbortSignal }) => {\r\n try {\r\n const result = await resolveActionResult<${returnType}>(${actionName}(${actionCallParams.replace(queryParamObject, '{ ...searchParams }')}))\r\n return result\r\n } catch (error) {\r\n handleActionError(error)\r\n }\r\n },\r\n staleTime: ${staleTime},\r\n gcTime: ${staleTime * 2}, // React Query v5: gcTime replaces cacheTime\r\n enabled: ${enabledCondition} && (options?.enabled ?? true),\r\n refetchOnWindowFocus: true, // Refetch when window regains focus\r\n refetchOnReconnect: true, // Refetch when network reconnects\r\n refetchOnMount: 'always', // Always refetch on mount for fresh data\r\n refetchInterval: options?.refetchInterval, // Optional polling interval\r\n // React Query v5: placeholderData replaces keepPreviousData\r\n placeholderData: (previousData: ${returnType} | undefined) => previousData,\r\n retry: (failureCount: number, error: Error) => {\r\n // Don't retry on 4xx errors (client errors)\r\n if (error instanceof Error && error.message.includes('4')) return false\r\n // Retry up to 3 times for network/server errors\r\n return failureCount < 3\r\n },\r\n initialData: initialData as ${returnType} | undefined,\r\n ...restOptions\r\n })\r\n}\r\n\r\n/**\r\n * Infinite query version for paginated ${endpoint.path}\r\n * @returns useInfiniteQuery result with data of type ${returnType}\r\n */\r\nexport function ${hookName.replace('use', 'useInfinite')}(${parameterTypes.length > 0 ? `${parameterTypes.join(', ')}, ` : ''}options?: ${optionsType}) {\r\n const [searchParams] = useQueryStates(searchParamsParser)\r\n const { initialData, ...restOptions } = options ?? {}\r\n\r\n return useInfiniteQuery({\r\n queryKey: [...${queryKey}, 'infinite', searchParams],\r\n initialPageParam: 1,\r\n queryFn: async ({ pageParam = 1, signal }: { pageParam?: number; signal?: AbortSignal }) => {\r\n try {\r\n // Build query params object with only the parameters the endpoint expects\r\n const queryParams: Record<string, any> = {}\r\n ${queryParameters.map(param => {\r\n if (param.name === 'page' && hasPageParam) {\r\n return `queryParams.${param.name} = pageParam`\r\n } else if (param.name === 'limit') {\r\n return `queryParams.${param.name} = searchParams.limit`\r\n } else {\r\n return `if ('${param.name}' in searchParams) queryParams.${param.name} = searchParams.${param.name}`\r\n }\r\n }).join('\\n ')}\r\n const result = await resolveActionResult<${returnType}>(${actionName}(${actionCallParams.replace(queryParamObject, '{ query: queryParams }')}))\r\n return result\r\n } catch (error) {\r\n handleActionError(error)\r\n }\r\n },\r\n getNextPageParam: (lastPage: ${returnType}, allPages: ${returnType}[]) => {\r\n // Check if response has pagination metadata\r\n if (lastPage && typeof lastPage === 'object' && 'hasMore' in lastPage && (lastPage as any).hasMore) {\r\n return allPages.length + 1\r\n }\r\n // Fallback: check if array length matches limit (suggesting more pages)\r\n if (Array.isArray(lastPage) && lastPage.length === searchParams.limit) {\r\n return allPages.length + 1\r\n }\r\n // Check if response has total and we haven't loaded all items\r\n if (lastPage && typeof lastPage === 'object' && 'total' in lastPage && Array.isArray((lastPage as any).files || (lastPage as any).items || lastPage)) {\r\n const items = (lastPage as any).files || (lastPage as any).items || lastPage\r\n const total = (lastPage as any).total || 0\r\n const loaded = allPages.reduce((sum, page) => {\r\n const pageItems = (page as any)?.files || (page as any)?.items || (Array.isArray(page) ? page : [])\r\n return sum + (Array.isArray(pageItems) ? pageItems.length : 0)\r\n }, 0)\r\n if (loaded < total) {\r\n return allPages.length + 1\r\n }\r\n }\r\n return undefined\r\n },\r\n staleTime: ${staleTime},\r\n gcTime: ${staleTime * 2},\r\n enabled: ${enabledCondition} && (options?.enabled ?? true),\r\n refetchOnWindowFocus: true,\r\n refetchOnReconnect: true,\r\n refetchOnMount: 'always',\r\n retry: 3,\r\n ...restOptions\r\n })\r\n}\r\n\r\n/**\r\n * Suspense version for ${endpoint.path} - use in Server Components\r\n * @returns useSuspenseQuery result with data of type ${returnType}\r\n */\r\nexport function ${hookName.replace('use', 'useSuspense')}(${parameterTypes.length > 0 ? `${parameterTypes.join(', ')}, ` : ''}options?: ${optionsType}) {\r\n const { initialData, ...restOptions } = options ?? {}\r\n\r\n return useSuspenseQuery({\r\n queryKey: ${queryKey},\r\n queryFn: async () => {\r\n const result = await resolveActionResult<${returnType}>(${actionName}(${actionCallParams}))\r\n return result\r\n },\r\n staleTime: ${staleTime},\r\n initialData: initialData as ${returnType} | undefined,\r\n ...restOptions\r\n })\r\n}`;\r\n }\r\n\r\n // Regular endpoints without search/list\r\n return `/**\r\n * Optimized query hook for ${endpoint.method} ${endpoint.path}\r\n * Features: Smart caching, error handling, type safety\r\n * @returns useQuery result with data of type ${returnType}\r\n */\r\nexport function ${hookName}(${parameterTypes.length > 0 ? `${parameterTypes.join(', ')}, ` : ''}options?: ${optionsType}) {\r\n const { initialData, ...restOptions } = options ?? {}\r\n\r\n return useQuery({\r\n queryKey: ${queryKey},\r\n queryFn: async ({ signal }: { signal?: AbortSignal }) => {\r\n try {\r\n const result = await resolveActionResult<${returnType}>(${actionCallParams === '{}' ? `${actionName}()` : `${actionName}(${actionCallParams})`})\r\n return result\r\n } catch (error) {\r\n handleActionError(error)\r\n }\r\n },\r\n staleTime: ${staleTime},\r\n gcTime: ${staleTime * 2}, // React Query v5: gcTime replaces cacheTime\r\n enabled: ${enabledCondition} && (options?.enabled ?? true),\r\n refetchOnWindowFocus: true, // Refetch when window regains focus\r\n refetchOnReconnect: true, // Refetch when network reconnects\r\n refetchOnMount: 'always', // Always refetch on mount for fresh data\r\n refetchInterval: options?.refetchInterval, // Optional polling interval\r\n // React Query v5: placeholderData replaces keepPreviousData\r\n placeholderData: (previousData: ${returnType} | undefined) => previousData,\r\n retry: (failureCount: number, error: Error) => {\r\n // Don't retry on 4xx errors (client errors)\r\n if (error instanceof Error && error.message.includes('4')) return false\r\n // Retry up to 3 times for network/server errors\r\n return failureCount < 3\r\n },\r\n initialData: initialData as ${returnType} | undefined,\r\n ...restOptions\r\n })\r\n}\r\n\r\n/**\r\n * Suspense version for ${endpoint.path}\r\n * @returns useSuspenseQuery result with data of type ${returnType}\r\n */\r\nexport function ${hookName.replace('use', 'useSuspense')}(${parameterTypes.length > 0 ? `${parameterTypes.join(', ')}, ` : ''}options?: ${optionsType}) {\r\n const { initialData, ...restOptions } = options ?? {}\r\n\r\n return useSuspenseQuery({\r\n queryKey: ${queryKey},\r\n queryFn: async () => {\r\n const result = await resolveActionResult<${returnType}>(${actionCallParams === '{}' ? `${actionName}()` : `${actionName}(${actionCallParams})`})\r\n return result\r\n },\r\n staleTime: ${staleTime},\r\n initialData: initialData as ${returnType} | undefined,\r\n ...restOptions\r\n })\r\n}`;\r\n }\r\n\r\n private generateOptimizedMutationHook(endpoint: ApiEndpointDefinition, context?: GenerationContext): string {\r\n const hookName = toHookName(endpoint.operationId || endpoint.id, false);\r\n const actionName = toActionName(endpoint.operationId || endpoint.id);\r\n const operationName = this.getOperationName(endpoint);\r\n const invalidationTags = endpoint.metadata.revalidationTags || [];\r\n\r\n const hasRequestBody = !!endpoint.requestBody;\r\n const hasParams = endpoint.parameters.length > 0;\r\n\r\n let inputType: string;\r\n let variablesParam: string;\r\n\r\n if (hasRequestBody && hasParams) {\r\n // Both body and params\r\n inputType = `{ body: z.infer<typeof ${operationName}RequestSchema>, params: z.infer<typeof ${operationName}ParamsSchema> }`;\r\n variablesParam = 'variables';\r\n } else if (hasRequestBody) {\r\n inputType = `z.infer<typeof ${operationName}RequestSchema>`;\r\n variablesParam = 'variables';\r\n } else if (hasParams) {\r\n inputType = `z.infer<typeof ${operationName}ParamsSchema>`;\r\n variablesParam = 'variables';\r\n } else {\r\n inputType = 'void';\r\n variablesParam = 'undefined';\r\n }\r\n\r\n const outputType = `z.infer<typeof ${operationName}ResponseSchema>`;\r\n\r\n // Find related queries that should be invalidated\r\n const relatedQueries = this.findRelatedQueries(endpoint, context);\r\n \r\n // Build invalidation code using actual query keys\r\n const invalidationCode = this.buildInvalidationCode(endpoint, relatedQueries, invalidationTags);\r\n \r\n // Build cancel queries code\r\n const cancelQueriesCode = this.buildCancelQueriesCode(endpoint, relatedQueries);\r\n \r\n return `/**\r\n * Optimized mutation hook for ${endpoint.method} ${endpoint.path}\r\n * Features: Optimistic updates, smart invalidation, error handling\r\n * @param options - Mutation options\r\n * @returns Mutation result with enhanced features\r\n */\r\nexport function ${hookName}(options?: {\r\n onSuccess?: (data: ${outputType}, variables: ${inputType}) => void\r\n onError?: (error: Error, variables: ${inputType}) => void\r\n optimisticUpdate?: (variables: ${inputType}) => unknown\r\n showToast?: boolean\r\n}) {\r\n const queryClient = useQueryClient()\r\n const [isPending, startTransition] = useTransition()\r\n const [optimisticData, setOptimisticData] = useOptimistic<unknown, ${inputType}>(null, (_, newData) => newData)\r\n\r\n const mutation = useMutation({\r\n mutationFn: async (variables: ${inputType}): Promise<${outputType}> => {\r\n try {\r\n const result = await resolveActionResult<${outputType}>(${actionName}(${variablesParam === 'undefined' ? '' : 'variables'}))\r\n return (result ?? ({} as ${outputType}))\r\n } catch (error) {\r\n handleActionError(error)\r\n }\r\n },\r\n \r\n onMutate: async (variables: ${inputType}) => {\r\n${cancelQueriesCode}\r\n\r\n // Optimistic update (if provided)\r\n if (options?.optimisticUpdate) {\r\n const optimisticValue = options.optimisticUpdate(variables)\r\n setOptimisticData(optimisticValue as ${inputType})\r\n }\r\n \r\n return {}\r\n },\r\n \r\n onSuccess: (data, variables) => {\r\n // Show success toast\r\n if (options?.showToast !== false) {\r\n toast.success('${this.getSuccessMessage(endpoint)}')\r\n }\r\n \r\n // Custom success handler\r\n options?.onSuccess?.(data, variables)\r\n },\r\n \r\n onError: (error: Error, variables: ${inputType}) => {\r\n // Show error toast\r\n if (options?.showToast !== false) {\r\n toast.error(error.message || '${this.getErrorMessage(endpoint)}')\r\n }\r\n \r\n // Custom error handler\r\n options?.onError?.(error as Error, variables)\r\n },\r\n \r\n onSettled: async () => {\r\n // Always refetch after error or success\r\n${invalidationCode}\r\n }\r\n })\r\n\r\n return {\r\n ...mutation,\r\n mutateWithTransition: (variables: ${inputType}) => {\r\n startTransition(() => {\r\n mutation.mutate(variables)\r\n })\r\n },\r\n isPending: isPending || mutation.isPending,\r\n optimisticData\r\n }\r\n}`;\r\n }\r\n\r\n /**\r\n * Find related queries that should be invalidated when this mutation runs\r\n */\r\n private findRelatedQueries(endpoint: ApiEndpointDefinition, context?: GenerationContext): ApiEndpointDefinition[] {\r\n if (!context?.schema?.endpoints) {\r\n return [];\r\n }\r\n\r\n const relatedQueries: ApiEndpointDefinition[] = [];\r\n const seen = new Set<string>();\r\n const mutationTag = endpoint.tags[0];\r\n const mutationSegments = this.getResourceSegments(endpoint.path);\r\n const mutationResource = mutationSegments[0];\r\n\r\n // Find GET endpoints in the same tag\r\n context.schema.endpoints.forEach(queryEndpoint => {\r\n if (queryEndpoint.method !== 'GET') return;\r\n \r\n const queryId = queryEndpoint.operationId || queryEndpoint.id;\r\n if (seen.has(queryId)) return;\r\n \r\n const queryTag = queryEndpoint.tags[0];\r\n const querySegments = this.getResourceSegments(queryEndpoint.path);\r\n const queryResource = querySegments[0];\r\n \r\n // Same tag - likely related\r\n if (mutationTag && queryTag === mutationTag) {\r\n relatedQueries.push(queryEndpoint);\r\n seen.add(queryId);\r\n return;\r\n }\r\n \r\n // Same primary resource (ignoring /api/vX prefix)\r\n if (mutationResource && queryResource && mutationResource === queryResource) {\r\n relatedQueries.push(queryEndpoint);\r\n seen.add(queryId);\r\n }\r\n });\r\n\r\n return relatedQueries;\r\n }\r\n\r\n private getResourceSegments(path: string): string[] {\r\n return path\r\n .split('/')\r\n .filter(Boolean)\r\n .filter(segment => segment.toLowerCase() !== 'api' && !/^v\\d+/i.test(segment));\r\n }\r\n\r\n /**\r\n * Build invalidation code for related queries\r\n */\r\n private buildInvalidationCode(\r\n endpoint: ApiEndpointDefinition,\r\n relatedQueries: ApiEndpointDefinition[],\r\n invalidationTags: string[]\r\n ): string {\r\n const invalidations = new Set<string>();\r\n\r\n // Invalidate related queries by their query key prefixes\r\n relatedQueries.forEach(queryEndpoint => {\r\n const queryKeyPrefix = toActionName(queryEndpoint.operationId || queryEndpoint.id);\r\n invalidations.add(`queryClient.invalidateQueries({ queryKey: ['${queryKeyPrefix}'] })`);\r\n });\r\n\r\n // Also invalidate by tags if specified (for broader invalidation)\r\n invalidationTags.forEach(tag => {\r\n invalidations.add(`queryClient.invalidateQueries({ queryKey: ['${tag}'] })`);\r\n });\r\n\r\n // If no related queries found, try to infer from path\r\n if (invalidations.size === 0) {\r\n const inferredKey = this.inferQueryKeyFromPath(endpoint);\r\n if (inferredKey) {\r\n invalidations.add(`queryClient.invalidateQueries({ queryKey: ${inferredKey} })`);\r\n }\r\n }\r\n\r\n if (invalidations.size === 0) {\r\n return ' // No specific cache invalidation needed';\r\n }\r\n\r\n if (invalidations.size === 1) {\r\n const [statement] = Array.from(invalidations);\r\n return ` await ${statement}`;\r\n }\r\n\r\n return ` await Promise.all([\r\n ${Array.from(invalidations).join(',\\n ')}\r\n ])`;\r\n }\r\n\r\n /**\r\n * Build cancel queries code\r\n * Uses query key patterns to cancel all related queries regardless of parameters\r\n */\r\n private buildCancelQueriesCode(endpoint: ApiEndpointDefinition, relatedQueries: ApiEndpointDefinition[]): string {\r\n const cancels = new Set<string>();\r\n\r\n relatedQueries.forEach(queryEndpoint => {\r\n const queryKeyPrefix = toActionName(queryEndpoint.operationId || queryEndpoint.id);\r\n cancels.add(`queryClient.cancelQueries({ queryKey: ['${queryKeyPrefix}'] })`);\r\n });\r\n\r\n if (cancels.size === 0) {\r\n return ' // No queries to cancel';\r\n }\r\n\r\n if (cancels.size === 1) {\r\n const [statement] = Array.from(cancels);\r\n return ` await ${statement}`;\r\n }\r\n\r\n return ` await Promise.all([\r\n ${Array.from(cancels).join(',\\n ')}\r\n ])`;\r\n }\r\n\r\n /**\r\n * Infer query key from mutation path\r\n */\r\n private inferQueryKeyFromPath(endpoint: ApiEndpointDefinition): string | null {\r\n // Try to infer list query from mutation path\r\n // e.g., POST /api/v1/mcp/connections -> GET /api/v1/mcp/connections\r\n const path = endpoint.path;\r\n if (path.includes('/connections')) {\r\n return \"['listMcpConnectionsApiV1McpConnectionsGet']\";\r\n }\r\n if (path.includes('/tools')) {\r\n return \"['getAvailableToolsApiV1McpToolsGet']\";\r\n }\r\n if (path.includes('/status')) {\r\n return \"['getMcpStatusApiV1McpStatusGet']\";\r\n }\r\n if (path.includes('/api-key')) {\r\n return \"['getApiKeyApiV1AuthMeApiKeyGet']\";\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Get success message for toast\r\n */\r\n private getSuccessMessage(endpoint: ApiEndpointDefinition): string {\r\n const path = endpoint.path.toLowerCase();\r\n if (path.includes('create') || endpoint.method === 'POST') {\r\n return 'Created successfully';\r\n }\r\n if (path.includes('delete') || endpoint.method === 'DELETE') {\r\n return 'Deleted successfully';\r\n }\r\n if (path.includes('update') || endpoint.method === 'PUT' || endpoint.method === 'PATCH') {\r\n return 'Updated successfully';\r\n }\r\n return endpoint.summary || 'Operation completed successfully';\r\n }\r\n\r\n /**\r\n * Get error message for toast\r\n */\r\n private getErrorMessage(endpoint: ApiEndpointDefinition): string {\r\n const path = endpoint.path.toLowerCase();\r\n if (path.includes('create') || endpoint.method === 'POST') {\r\n return 'Failed to create';\r\n }\r\n if (path.includes('delete') || endpoint.method === 'DELETE') {\r\n return 'Failed to delete';\r\n }\r\n if (path.includes('update') || endpoint.method === 'PUT' || endpoint.method === 'PATCH') {\r\n return 'Failed to update';\r\n }\r\n return 'Operation failed';\r\n }\r\n\r\n private buildActionCallParams(endpoint: ApiEndpointDefinition, isMutation: boolean): string {\r\n const pathParameters = endpoint.parameters.filter(parameter => parameter.in === 'path');\r\n const queryParameters = endpoint.parameters.filter(parameter => parameter.in === 'query');\r\n const hasRequestBody = !!endpoint.requestBody;\r\n\r\n if (isMutation) {\r\n return 'variables';\r\n }\r\n\r\n const parts: string[] = [];\r\n\r\n if (pathParameters.length > 0 && queryParameters.length > 0) {\r\n const pathFields = pathParameters.map(p => `${p.name}`).join(', ');\r\n const queryFields = queryParameters.map(p => `${p.name}`).join(', ');\r\n return `{ path: { ${pathFields} }, query: { ${queryFields} } }`;\r\n } else if (pathParameters.length > 0) {\r\n const pathFields = pathParameters.map(p => `${p.name}`).join(', ');\r\n return `{ path: { ${pathFields} } }`;\r\n } else if (queryParameters.length > 0) {\r\n const queryFields = queryParameters.map(p => `${p.name}`).join(', ');\r\n return `{ query: { ${queryFields} } }`;\r\n }\r\n\r\n return '{}';\r\n }\r\n\r\n private generateQueryKey(endpoint: ApiEndpointDefinition): string {\r\n const pathParameters = endpoint.parameters.filter(parameter => parameter.in === 'path');\r\n const queryParameters = endpoint.parameters.filter(parameter => parameter.in === 'query');\r\n\r\n const keyParts: string[] = [`'${toActionName(endpoint.operationId || endpoint.id)}'`];\r\n\r\n if (pathParameters.length > 0) {\r\n keyParts.push(...pathParameters.map(parameter => parameter.name));\r\n }\r\n\r\n if (queryParameters.length > 0) {\r\n keyParts.push(...queryParameters.map(parameter => parameter.name));\r\n }\r\n\r\n return `[${keyParts.join(', ')}]`;\r\n }\r\n\r\n private getStaleTime(endpoint: ApiEndpointDefinition): number {\r\n if (endpoint.path.includes('search') || endpoint.path.includes('query')) return 30000;\r\n if (endpoint.path.includes('user') || endpoint.path.includes('profile')) return 300000;\r\n if (endpoint.path.includes('settings')) return 600000;\r\n if (endpoint.path.includes('stats') || endpoint.path.includes('analytics')) return 60000;\r\n return 180000;\r\n }\r\n\r\n private getTypeFromZodSchema(schema: unknown): string {\r\n if (!schema || typeof schema !== 'object') {\r\n return 'unknown';\r\n }\r\n\r\n const def = (schema as { _def?: { typeName: string; type?: unknown; innerType?: unknown } | undefined })._def;\r\n if (!def) {\r\n return 'unknown';\r\n }\r\n\r\n switch (def.typeName) {\r\n case 'ZodString':\r\n return 'string';\r\n case 'ZodNumber':\r\n return 'number';\r\n case 'ZodBoolean':\r\n return 'boolean';\r\n case 'ZodArray':\r\n return `${this.getTypeFromZodSchema(def.type)}[]`;\r\n case 'ZodOptional':\r\n return this.getTypeFromZodSchema(def.innerType);\r\n default:\r\n return 'unknown';\r\n }\r\n }\r\n\r\n private groupEndpointsByTag(\r\n endpoints: ApiEndpointDefinition[]\r\n ): Record<string, ApiEndpointDefinition[]> {\r\n return endpoints.reduce(\r\n (accumulator, endpoint) => {\r\n const tag = endpoint.tags[0] || 'default';\r\n if (!accumulator[tag]) {\r\n accumulator[tag] = [];\r\n }\r\n accumulator[tag].push(endpoint);\r\n return accumulator;\r\n },\r\n {} as Record<string, ApiEndpointDefinition[]>\r\n );\r\n }\r\n\r\n private toPascalCase(str: string): string {\r\n return str\r\n .replace(/[-_\\s]+(.)?/g, (_, char) => (char ? char.toUpperCase() : ''))\r\n .replace(/^(.)/, char => char.toUpperCase());\r\n }\r\n\r\n private generateBridgeQueryHook(): GeneratedFile {\r\n const content = `'use client'\r\n\r\nimport { useQuery, useMutation, useInfiniteQuery, useSuspenseQuery, type UseQueryOptions, type UseMutationOptions, type UseInfiniteQueryOptions, type UseSuspenseQueryOptions, type QueryKey, type QueryFunction } from '@tanstack/react-query'\r\n\r\n/**\r\n * Enhanced React Query wrapper hook with Next.js 16.0.1 optimizations\r\n * Provides consistent defaults across all queries following best practices\r\n * \r\n * Features:\r\n * - React Query v5: Uses gcTime instead of cacheTime\r\n * - React Query v5: Uses placeholderData instead of keepPreviousData\r\n * - Next.js 16.0.1: Optimized for App Router and Server Components\r\n */\r\nexport function useBridgeQuery<TData = unknown, TError = Error>(\r\n queryKey: QueryKey,\r\n queryFn: QueryFunction<TData, QueryKey>,\r\n options?: Partial<UseQueryOptions<TData, TError, TData, QueryKey>>\r\n) {\r\n return useQuery<TData, TError>({\r\n queryKey,\r\n queryFn: queryFn as QueryFunction<TData, QueryKey>,\r\n staleTime: 5 * 60 * 1000,\r\n gcTime: 10 * 60 * 1000,\r\n refetchOnWindowFocus: true,\r\n refetchOnReconnect: true,\r\n refetchOnMount: 'always',\r\n placeholderData: (previousData) => previousData as TData | undefined,\r\n retry: (failureCount: number, error: TError) => {\r\n if (error instanceof Error && error.message.includes('4')) return false\r\n return failureCount < 3\r\n },\r\n ...options,\r\n })\r\n}\r\n\r\n/**\r\n * Enhanced infinite query wrapper\r\n * React Query v5: Optimized for paginated data with infinite scrolling\r\n */\r\nexport function useBridgeInfiniteQuery<TData = unknown, TError = Error>(\r\n queryKey: QueryKey,\r\n queryFn: QueryFunction<TData, QueryKey>,\r\n options?: Partial<UseInfiniteQueryOptions<TData, TError, TData, QueryKey>>\r\n) {\r\n return useInfiniteQuery<TData, TError>({\r\n queryKey,\r\n initialPageParam: 1,\r\n queryFn: queryFn as QueryFunction<TData, QueryKey>,\r\n staleTime: 5 * 60 * 1000,\r\n gcTime: 10 * 60 * 1000,\r\n refetchOnWindowFocus: true,\r\n refetchOnReconnect: true,\r\n refetchOnMount: 'always',\r\n retry: (failureCount: number, error: TError) => {\r\n if (error instanceof Error && error.message.includes('4')) return false\r\n return failureCount < 3\r\n },\r\n ...options,\r\n })\r\n}\r\n\r\n/**\r\n * Enhanced suspense query wrapper\r\n * Next.js 16.0.1: Optimized for Server Components with Suspense\r\n */\r\nexport function useBridgeSuspenseQuery<TData = unknown, TError = Error>(\r\n queryKey: QueryKey,\r\n queryFn: QueryFunction<TData, QueryKey>,\r\n options?: Partial<UseSuspenseQueryOptions<TData, TError, TData, QueryKey>>\r\n) {\r\n return useSuspenseQuery<TData, TError>({\r\n queryKey,\r\n queryFn: queryFn as QueryFunction<TData, QueryKey>,\r\n staleTime: 5 * 60 * 1000,\r\n gcTime: 10 * 60 * 1000,\r\n retry: (failureCount: number, error: TError) => {\r\n if (error instanceof Error && error.message.includes('4')) return false\r\n return failureCount < 3\r\n },\r\n ...options,\r\n })\r\n}\r\n\r\n/**\r\n * Enhanced mutation wrapper\r\n */\r\nexport function useBridgeMutation<TData = unknown, TError = Error, TVariables = void>(\r\n mutationFn: (variables: TVariables) => Promise<TData>,\r\n options?: Partial<UseMutationOptions<TData, TError, TVariables>>\r\n) {\r\n return useMutation<TData, TError, TVariables>({\r\n mutationFn,\r\n retry: 3,\r\n ...options,\r\n })\r\n}\r\n`\r\n\r\n return {\r\n path: \"hooks/useBridgeQuery.ts\",\r\n content,\r\n type: \"typescript\",\r\n metadata: {\r\n exports: [\"useBridgeQuery\", \"useBridgeInfiniteQuery\", \"useBridgeSuspenseQuery\", \"useBridgeMutation\"],\r\n imports: [\"@tanstack/react-query\"],\r\n dependencies: [],\r\n },\r\n }\r\n }\r\n}\r\n","import type {\r\n BridgeConfiguration,\r\n GenerationContext,\r\n GeneratedFile,\r\n ApiEndpointDefinition,\r\n} from '@/core/types';\r\n\r\nexport class AuthGenerator {\r\n constructor(private readonly configuration: BridgeConfiguration) {}\r\n\r\n private buildImportPath(relativePath: string): string {\r\n const outputDirectory = this.configuration.outputDir || 'generated';\r\n const cleanPath = relativePath.startsWith('/') ? relativePath.slice(1) : relativePath;\r\n\r\n let importBasePath = outputDirectory;\r\n if (importBasePath.startsWith('src/')) {\r\n importBasePath = importBasePath.substring(4);\r\n }\r\n\r\n return `@/${importBasePath}/${cleanPath}`;\r\n }\r\n\r\n async generate(context: GenerationContext): Promise<GeneratedFile[]> {\r\n const { config, schema } = context;\r\n const authConfig = config.auth;\r\n\r\n if (!authConfig?.enabled) {\r\n return [];\r\n }\r\n\r\n const files: GeneratedFile[] = [];\r\n\r\n const authEndpoints = this.findAuthEndpoints(schema.endpoints);\r\n const userEndpoints = this.findUserEndpoints(schema.endpoints);\r\n\r\n files.push(this.generateAuthSchemas(authEndpoints, schema));\r\n\r\n files.push(this.generateAuthTypes(authEndpoints, schema));\r\n\r\n files.push(this.generateAuthClient(authEndpoints));\r\n\r\n files.push(this.generateAuthUtils());\r\n\r\n files.push(this.generateSessionUtils());\r\n\r\n files.push(this.generateAuthActions(authEndpoints, userEndpoints));\r\n\r\n files.push(this.generateAuthHooks());\r\n\r\n files.push(...this.generateAuthComponents(authEndpoints));\r\n\r\n files.push(this.generateAuthMiddleware());\r\n\r\n files.push(this.generateAuthContext());\r\n\r\n return files;\r\n }\r\n\r\n private findAuthEndpoints(endpoints: ApiEndpointDefinition[]): {\r\n login?: ApiEndpointDefinition;\r\n refresh?: ApiEndpointDefinition;\r\n logout?: ApiEndpointDefinition;\r\n } {\r\n const authEndpoints: any = {};\r\n\r\n for (const endpoint of endpoints) {\r\n const path = endpoint.path.toLowerCase();\r\n const operationId = (endpoint.operationId || '').toLowerCase();\r\n\r\n if (\r\n path.includes('/auth/login') ||\r\n path.includes('/login') ||\r\n operationId.includes('login') ||\r\n operationId.includes('signin')\r\n ) {\r\n authEndpoints.login = endpoint;\r\n }\r\n\r\n // Find refresh endpoint\r\n if (\r\n path.includes('/auth/refresh') ||\r\n path.includes('/refresh') ||\r\n operationId.includes('refresh')\r\n ) {\r\n authEndpoints.refresh = endpoint;\r\n }\r\n\r\n // Find logout endpoint\r\n if (\r\n path.includes('/auth/logout') ||\r\n path.includes('/logout') ||\r\n operationId.includes('logout')\r\n ) {\r\n authEndpoints.logout = endpoint;\r\n }\r\n }\r\n\r\n return authEndpoints;\r\n }\r\n\r\n private findUserEndpoints(endpoints: ApiEndpointDefinition[]): {\r\n me?: ApiEndpointDefinition;\r\n profile?: ApiEndpointDefinition;\r\n } {\r\n const userEndpoints: any = {};\r\n\r\n for (const endpoint of endpoints) {\r\n const path = endpoint.path.toLowerCase();\r\n const operationId = (endpoint.operationId || '').toLowerCase();\r\n\r\n // Find user/me endpoint\r\n if (\r\n path.includes('/users/me') ||\r\n path.includes('/user/me') ||\r\n path.includes('/me') ||\r\n operationId.includes('me') ||\r\n operationId.includes('currentuser')\r\n ) {\r\n userEndpoints.me = endpoint;\r\n }\r\n\r\n // Find profile endpoint\r\n if (path.includes('/profile') || operationId.includes('profile')) {\r\n userEndpoints.profile = endpoint;\r\n }\r\n }\r\n\r\n return userEndpoints;\r\n }\r\n\r\n private generateAuthSchemas(authEndpoints: any, schema: any): GeneratedFile {\r\n const schemasImport = this.buildImportPath('schemas');\r\n\r\n // Extract login request schema from OpenAPI\r\n const loginRequestSchema = authEndpoints.login?.requestBody?.content?.find(\r\n (c: any) => c.type === 'application/json'\r\n )?.schema;\r\n const loginResponseSchema = authEndpoints.login?.responses?.find(\r\n (r: any) => r.statusCode === '200'\r\n )?.content?.[0]?.schema;\r\n\r\n const content = `import { z } from \"zod\"\r\n\r\n// Base authentication schemas derived from OpenAPI\r\n${\r\n loginRequestSchema\r\n ? `export const loginRequestSchema = ${this.convertSchemaToZod(loginRequestSchema)}`\r\n : `export const loginRequestSchema = z.object({\r\n username: z.string().min(1, \"Username is required\"),\r\n password: z.string().min(1, \"Password is required\"),\r\n})`\r\n}\r\n\r\n${\r\n loginResponseSchema\r\n ? `export const loginResponseSchema = ${this.convertSchemaToZod(loginResponseSchema)}`\r\n : `export const loginResponseSchema = z.object({\r\n access_token: z.string(),\r\n refresh_token: z.string(),\r\n token_type: z.string().default(\"Bearer\"),\r\n expires_in: z.number().optional(),\r\n})`\r\n}\r\n\r\n// Token schemas\r\nexport const tokenSchema = z.object({\r\n access_token: z.string(),\r\n refresh_token: z.string(),\r\n token_type: z.string().default(\"Bearer\"),\r\n expires_in: z.number().optional(),\r\n})\r\n\r\nexport const refreshTokenSchema = z.object({\r\n refresh_token: z.string(),\r\n})\r\n\r\nexport const refreshResponseSchema = z.object({\r\n access_token: z.string(),\r\n refresh_token: z.string().optional(),\r\n token_type: z.string().default(\"Bearer\"),\r\n expires_in: z.number().optional(),\r\n})\r\n\r\n// User schema (will be derived from /users/me endpoint)\r\nexport const userSchema = z.object({\r\n id: z.string(),\r\n username: z.string(),\r\n email: z.string().email().optional(),\r\n name: z.string().optional(),\r\n role: z.string().optional(),\r\n permissions: z.array(z.string()).optional(),\r\n created_at: z.string().optional(),\r\n updated_at: z.string().optional(),\r\n})\r\n\r\n// Session schema\r\nexport const sessionSchema = z.object({\r\n user: userSchema,\r\n tokens: tokenSchema,\r\n expires_at: z.number(),\r\n})\r\n\r\nexport const authSchemas = {\r\n loginRequest: loginRequestSchema,\r\n loginResponse: loginResponseSchema,\r\n token: tokenSchema,\r\n refreshToken: refreshTokenSchema,\r\n refreshResponse: refreshResponseSchema,\r\n user: userSchema,\r\n session: sessionSchema,\r\n}\r\n\r\n// Type exports\r\nexport type LoginRequest = z.infer<typeof loginRequestSchema>\r\nexport type LoginResponse = z.infer<typeof loginResponseSchema>\r\nexport type Token = z.infer<typeof tokenSchema>\r\nexport type RefreshTokenRequest = z.infer<typeof refreshTokenSchema>\r\nexport type RefreshResponse = z.infer<typeof refreshResponseSchema>\r\nexport type User = z.infer<typeof userSchema>\r\nexport type Session = z.infer<typeof sessionSchema>`;\r\n\r\n return {\r\n path: 'auth/schemas.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: [\r\n 'loginRequestSchema',\r\n 'loginResponseSchema',\r\n 'tokenSchema',\r\n 'refreshTokenSchema',\r\n 'refreshResponseSchema',\r\n 'userSchema',\r\n 'sessionSchema',\r\n 'authSchemas',\r\n 'LoginRequest',\r\n 'LoginResponse',\r\n 'Token',\r\n 'RefreshTokenRequest',\r\n 'RefreshResponse',\r\n 'User',\r\n 'Session',\r\n ],\r\n imports: ['zod'],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n\r\n private generateAuthTypes(authEndpoints: any, schema: any): GeneratedFile {\r\n const schemasImport = this.buildImportPath('auth/schemas');\r\n\r\n const content = `// Auto-generated authentication types\r\nimport type {\r\n LoginRequest,\r\n LoginResponse,\r\n Token,\r\n RefreshTokenRequest,\r\n RefreshResponse,\r\n User,\r\n Session,\r\n} from \"${schemasImport}\"\r\n\r\n// Re-export types for convenience\r\nexport type {\r\n LoginRequest,\r\n LoginResponse,\r\n Token,\r\n RefreshTokenRequest,\r\n RefreshResponse,\r\n User,\r\n Session,\r\n}\r\n\r\n// Authentication state\r\nexport interface AuthState {\r\n user: User | null\r\n tokens: Token | null\r\n isAuthenticated: boolean\r\n isLoading: boolean\r\n error: string | null\r\n}\r\n\r\n// Authentication context\r\nexport interface AuthContextType extends AuthState {\r\n login: (credentials: LoginRequest) => Promise<void>\r\n logout: () => Promise<void>\r\n refreshToken: () => Promise<void>\r\n clearError: () => void\r\n}\r\n\r\n// Token storage\r\nexport interface TokenStorage {\r\n getTokens: () => Promise<Token | null>\r\n setTokens: (tokens: Token) => Promise<void>\r\n removeTokens: () => Promise<void>\r\n getAccessToken: () => Promise<string | null>\r\n getRefreshToken: () => Promise<string | null>\r\n}\r\n\r\n// Authentication error types\r\nexport class AuthError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly code: string,\r\n public readonly status?: number\r\n ) {\r\n super(message)\r\n this.name = \"AuthError\"\r\n }\r\n}\r\n\r\nexport class TokenExpiredError extends AuthError {\r\n constructor() {\r\n super(\"Token has expired\", \"TOKEN_EXPIRED\", 401)\r\n }\r\n}\r\n\r\nexport class InvalidCredentialsError extends AuthError {\r\n constructor() {\r\n super(\"Invalid credentials\", \"INVALID_CREDENTIALS\", 401)\r\n }\r\n}\r\n\r\nexport class NetworkError extends AuthError {\r\n constructor(message: string) {\r\n super(message, \"NETWORK_ERROR\")\r\n }\r\n}`;\r\n\r\n return {\r\n path: 'auth/types.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: [\r\n 'LoginRequest',\r\n 'LoginResponse',\r\n 'Token',\r\n 'RefreshTokenRequest',\r\n 'RefreshResponse',\r\n 'User',\r\n 'Session',\r\n 'AuthState',\r\n 'AuthContextType',\r\n 'TokenStorage',\r\n 'AuthError',\r\n 'TokenExpiredError',\r\n 'InvalidCredentialsError',\r\n 'NetworkError',\r\n ],\r\n imports: [],\r\n dependencies: [schemasImport],\r\n },\r\n };\r\n }\r\n\r\n private generateAuthClient(authEndpoints: any): GeneratedFile {\r\n const clientImport = this.buildImportPath('client');\r\n const schemasImport = this.buildImportPath('auth/schemas');\r\n const typesImport = this.buildImportPath('auth/types');\r\n\r\n const loginPath = authEndpoints.login?.path || '/auth/login';\r\n const refreshPath = authEndpoints.refresh?.path || '/auth/refresh';\r\n const logoutPath = authEndpoints.logout?.path || '/auth/logout';\r\n const mePath = '/users/me'; // Standard path for user info\r\n\r\n const content = `import { apiClient } from \"${clientImport}\"\r\nimport { authSchemas } from \"${schemasImport}\"\r\nimport type {\r\n LoginRequest,\r\n LoginResponse,\r\n RefreshTokenRequest,\r\n RefreshResponse,\r\n User,\r\n Token,\r\n AuthError,\r\n TokenExpiredError,\r\n InvalidCredentialsError,\r\n NetworkError,\r\n} from \"${typesImport}\"\r\n\r\nexport class AuthClient {\r\n private static instance: AuthClient\r\n private tokens: Token | null = null\r\n\r\n private constructor() {}\r\n\r\n static getInstance(): AuthClient {\r\n if (!AuthClient.instance) {\r\n AuthClient.instance = new AuthClient()\r\n }\r\n return AuthClient.instance\r\n }\r\n\r\n // Set tokens for authenticated requests\r\n setTokens(tokens: Token | null): void {\r\n this.tokens = tokens\r\n }\r\n\r\n // Get current tokens\r\n getTokens(): Token | null {\r\n return this.tokens\r\n }\r\n\r\n // Login with credentials\r\n async login(credentials: LoginRequest): Promise<LoginResponse> {\r\n try {\r\n const response = await apiClient.request<LoginResponse>(\"POST\", \"${loginPath}\", {\r\n body: credentials,\r\n config: {\r\n skipAuth: true, // Don't use auth for login\r\n validateResponse: true,\r\n },\r\n responseSchema: authSchemas.loginResponse,\r\n })\r\n\r\n // Store tokens\r\n this.setTokens({\r\n access_token: response.data.access_token,\r\n refresh_token: response.data.refresh_token,\r\n token_type: response.data.token_type || \"Bearer\",\r\n expires_in: response.data.expires_in,\r\n })\r\n\r\n return response.data\r\n } catch (error: any) {\r\n if (error.status === 401) {\r\n throw new InvalidCredentialsError()\r\n }\r\n if (error.status >= 500) {\r\n throw new NetworkError(\"Server error occurred\")\r\n }\r\n throw new AuthError(error.message || \"Login failed\", \"LOGIN_ERROR\", error.status)\r\n }\r\n }\r\n\r\n // Refresh access token\r\n async refreshToken(refreshToken: string): Promise<RefreshResponse> {\r\n try {\r\n const response = await apiClient.request<RefreshResponse>(\"POST\", \"${refreshPath}\", {\r\n body: { refresh_token: refreshToken },\r\n config: {\r\n skipAuth: true, // Don't use auth for refresh\r\n validateResponse: true,\r\n },\r\n responseSchema: authSchemas.refreshResponse,\r\n })\r\n\r\n // Update stored tokens\r\n const newTokens: Token = {\r\n access_token: response.data.access_token,\r\n refresh_token: response.data.refresh_token || refreshToken,\r\n token_type: response.data.token_type || \"Bearer\",\r\n expires_in: response.data.expires_in,\r\n }\r\n this.setTokens(newTokens)\r\n\r\n return response.data\r\n } catch (error: any) {\r\n if (error.status === 401) {\r\n throw new TokenExpiredError()\r\n }\r\n throw new AuthError(error.message || \"Token refresh failed\", \"REFRESH_ERROR\", error.status)\r\n }\r\n }\r\n\r\n // Get current user info\r\n async getCurrentUser(): Promise<User> {\r\n try {\r\n if (!this.tokens?.access_token) {\r\n throw new AuthError(\"No access token available\", \"NO_TOKEN\")\r\n }\r\n\r\n const response = await apiClient.request<User>(\"GET\", \"${mePath}\", {\r\n headers: {\r\n Authorization: \\`\\${this.tokens.token_type} \\${this.tokens.access_token}\\`,\r\n },\r\n config: {\r\n validateResponse: true,\r\n },\r\n responseSchema: authSchemas.user,\r\n })\r\n\r\n return response.data\r\n } catch (error: any) {\r\n if (error.status === 401) {\r\n throw new TokenExpiredError()\r\n }\r\n throw new AuthError(error.message || \"Failed to get user info\", \"USER_INFO_ERROR\", error.status)\r\n }\r\n }\r\n\r\n // Logout\r\n async logout(): Promise<void> {\r\n try {\r\n if (this.tokens?.access_token) {\r\n await apiClient.request(\"POST\", \"${logoutPath}\", {\r\n headers: {\r\n Authorization: \\`\\${this.tokens.token_type} \\${this.tokens.access_token}\\`,\r\n },\r\n config: {\r\n skipAuth: false,\r\n },\r\n })\r\n }\r\n } catch (error) {\r\n // Ignore logout errors, we'll clear tokens anyway\r\n console.warn(\"Logout request failed:\", error)\r\n } finally {\r\n // Always clear tokens\r\n this.setTokens(null)\r\n }\r\n }\r\n\r\n // Check if tokens are expired\r\n isTokenExpired(): boolean {\r\n if (!this.tokens?.expires_in) {\r\n return false // If no expiry info, assume not expired\r\n }\r\n\r\n // This is a simple check - in a real app you'd store the issued time\r\n // and calculate based on that\r\n return false\r\n }\r\n\r\n // Get authorization header\r\n getAuthHeader(): string | null {\r\n if (!this.tokens?.access_token) {\r\n return null\r\n }\r\n return \\`\\${this.tokens.token_type} \\${this.tokens.access_token}\\`\r\n }\r\n}\r\n\r\n// Export singleton instance\r\nexport const authClient = AuthClient.getInstance()`;\r\n\r\n return {\r\n path: 'auth/client.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: ['AuthClient', 'authClient'],\r\n imports: [],\r\n dependencies: [clientImport, schemasImport, typesImport],\r\n },\r\n };\r\n }\r\n\r\n private generateAuthUtils(): GeneratedFile {\r\n const typesImport = this.buildImportPath('auth/types');\r\n const clientImport = this.buildImportPath('auth/client');\r\n\r\n const content = `import type { Token, TokenStorage } from \"${typesImport}\"\r\nimport { authClient } from \"${clientImport}\"\r\n\r\n// Token storage implementation\r\nclass BrowserTokenStorage implements TokenStorage {\r\n private readonly ACCESS_TOKEN_KEY = \"auth_access_token\"\r\n private readonly REFRESH_TOKEN_KEY = \"auth_refresh_token\"\r\n private readonly TOKEN_TYPE_KEY = \"auth_token_type\"\r\n private readonly EXPIRES_IN_KEY = \"auth_expires_in\"\r\n\r\n async getTokens(): Promise<Token | null> {\r\n try {\r\n const accessToken = localStorage.getItem(this.ACCESS_TOKEN_KEY)\r\n const refreshToken = localStorage.getItem(this.REFRESH_TOKEN_KEY)\r\n const tokenType = localStorage.getItem(this.TOKEN_TYPE_KEY)\r\n const expiresIn = localStorage.getItem(this.EXPIRES_IN_KEY)\r\n\r\n if (!accessToken || !refreshToken) {\r\n return null\r\n }\r\n\r\n return {\r\n access_token: accessToken,\r\n refresh_token: refreshToken,\r\n token_type: tokenType || \"Bearer\",\r\n expires_in: expiresIn ? parseInt(expiresIn, 10) : undefined,\r\n }\r\n } catch {\r\n return null\r\n }\r\n }\r\n\r\n async setTokens(tokens: Token): Promise<void> {\r\n try {\r\n localStorage.setItem(this.ACCESS_TOKEN_KEY, tokens.access_token)\r\n localStorage.setItem(this.REFRESH_TOKEN_KEY, tokens.refresh_token)\r\n localStorage.setItem(this.TOKEN_TYPE_KEY, tokens.token_type)\r\n if (tokens.expires_in) {\r\n localStorage.setItem(this.EXPIRES_IN_KEY, tokens.expires_in.toString())\r\n }\r\n\r\n // Update auth client\r\n authClient.setTokens(tokens)\r\n } catch (error) {\r\n console.error(\"Failed to store tokens:\", error)\r\n }\r\n }\r\n\r\n async removeTokens(): Promise<void> {\r\n try {\r\n localStorage.removeItem(this.ACCESS_TOKEN_KEY)\r\n localStorage.removeItem(this.REFRESH_TOKEN_KEY)\r\n localStorage.removeItem(this.TOKEN_TYPE_KEY)\r\n localStorage.removeItem(this.EXPIRES_IN_KEY)\r\n\r\n // Update auth client\r\n authClient.setTokens(null)\r\n } catch (error) {\r\n console.error(\"Failed to remove tokens:\", error)\r\n }\r\n }\r\n\r\n async getAccessToken(): Promise<string | null> {\r\n try {\r\n return localStorage.getItem(this.ACCESS_TOKEN_KEY)\r\n } catch {\r\n return null\r\n }\r\n }\r\n\r\n async getRefreshToken(): Promise<string | null> {\r\n try {\r\n return localStorage.getItem(this.REFRESH_TOKEN_KEY)\r\n } catch {\r\n return null\r\n }\r\n }\r\n}\r\n\r\n// Server-side token storage (for SSR)\r\nclass ServerTokenStorage implements TokenStorage {\r\n async getTokens(): Promise<Token | null> {\r\n // In SSR, tokens would come from cookies or session\r\n return null\r\n }\r\n\r\n async setTokens(tokens: Token): Promise<void> {\r\n // In SSR, would set cookies\r\n }\r\n\r\n async removeTokens(): Promise<void> {\r\n // In SSR, would clear cookies\r\n }\r\n\r\n async getAccessToken(): Promise<string | null> {\r\n return null\r\n }\r\n\r\n async getRefreshToken(): Promise<string | null> {\r\n return null\r\n }\r\n}\r\n\r\n// Token storage factory\r\nexport const createTokenStorage = (): TokenStorage => {\r\n if (typeof window !== \"undefined\") {\r\n return new BrowserTokenStorage()\r\n }\r\n return new ServerTokenStorage()\r\n}\r\n\r\n// Default token storage instance\r\nexport const tokenStorage = createTokenStorage()\r\n\r\n// Utility functions\r\nexport const getAuthToken = async (): Promise<string | null> => {\r\n const tokens = await tokenStorage.getTokens()\r\n return tokens?.access_token || null\r\n}\r\n\r\nexport const isAuthenticated = async (): Promise<boolean> => {\r\n const tokens = await tokenStorage.getTokens()\r\n return !!tokens?.access_token\r\n}\r\n\r\nexport const requireAuth = async (): Promise<string> => {\r\n const token = await getAuthToken()\r\n if (!token) {\r\n throw new Error(\"Authentication required\")\r\n }\r\n return token\r\n}\r\n\r\n// Initialize auth client with stored tokens\r\nexport const initializeAuth = async (): Promise<void> => {\r\n const tokens = await tokenStorage.getTokens()\r\n if (tokens) {\r\n authClient.setTokens(tokens)\r\n }\r\n}`;\r\n\r\n return {\r\n path: 'auth/utils.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: [\r\n 'createTokenStorage',\r\n 'tokenStorage',\r\n 'getAuthToken',\r\n 'isAuthenticated',\r\n 'requireAuth',\r\n 'initializeAuth',\r\n ],\r\n imports: [],\r\n dependencies: [typesImport, clientImport],\r\n },\r\n };\r\n }\r\n\r\n private generateSessionUtils(): GeneratedFile {\r\n const content = `\"use client\"\r\n\r\nimport { useState, useEffect } from \"react\"\r\nimport type { User, Token } from \"./types\"\r\nimport { authClient } from \"./client\"\r\nimport { tokenStorage } from \"./utils\"\r\n\r\nexport interface UseSessionReturn {\r\n user: User | null\r\n tokens: Token | null\r\n isAuthenticated: boolean\r\n isLoading: boolean\r\n error: string | null\r\n}\r\n\r\nexport const useSession = (): UseSessionReturn => {\r\n const [user, setUser] = useState<User | null>(null)\r\n const [tokens, setTokens] = useState<Token | null>(null)\r\n const [isLoading, setIsLoading] = useState(true)\r\n const [error, setError] = useState<string | null>(null)\r\n\r\n useEffect(() => {\r\n const initializeSession = async () => {\r\n try {\r\n setIsLoading(true)\r\n setError(null)\r\n\r\n // Get stored tokens\r\n const storedTokens = await tokenStorage.getTokens()\r\n if (!storedTokens) {\r\n setIsLoading(false)\r\n return\r\n }\r\n\r\n setTokens(storedTokens)\r\n authClient.setTokens(storedTokens)\r\n\r\n // Get current user\r\n const currentUser = await authClient.getCurrentUser()\r\n setUser(currentUser)\r\n } catch (err: any) {\r\n setError(err.message || \"Failed to initialize session\")\r\n // Clear invalid tokens\r\n await tokenStorage.removeTokens()\r\n setTokens(null)\r\n setUser(null)\r\n } finally {\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n initializeSession()\r\n }, [])\r\n\r\n return {\r\n user,\r\n tokens,\r\n isAuthenticated: !!user && !!tokens,\r\n isLoading,\r\n error,\r\n }\r\n}\r\n\r\nexport const useCurrentUser = () => {\r\n const { user, isLoading } = useSession()\r\n return { user, isLoading }\r\n}\r\n\r\nexport const useRequireAuth = (redirectTo?: string) => {\r\n const session = useSession()\r\n \r\n useEffect(() => {\r\n if (!session.isLoading && !session.isAuthenticated && redirectTo) {\r\n window.location.href = redirectTo\r\n }\r\n }, [session.isLoading, session.isAuthenticated, redirectTo])\r\n\r\n return session\r\n}`;\r\n\r\n return {\r\n path: 'auth/session-utils.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: ['UseSessionReturn', 'useSession', 'useCurrentUser', 'useRequireAuth'],\r\n imports: ['react'],\r\n dependencies: ['./types', './client', './utils'],\r\n },\r\n };\r\n }\r\n\r\n private generateAuthActions(authEndpoints: any, userEndpoints: any): GeneratedFile {\r\n const safeActionImport = this.buildImportPath('lib/safe-action');\r\n const schemasImport = this.buildImportPath('auth/schemas');\r\n const clientImport = this.buildImportPath('auth/client');\r\n const utilsImport = this.buildImportPath('auth/utils');\r\n\r\n const content = `\"use server\"\r\n\r\nimport { actionClient, ActionError } from \"${safeActionImport}\"\r\nimport { authSchemas } from \"${schemasImport}\"\r\nimport { authClient } from \"${clientImport}\"\r\nimport { tokenStorage } from \"${utilsImport}\"\r\nimport { revalidatePath } from \"next/cache\"\r\n\r\nexport const loginAction = actionClient\r\n .schema(authSchemas.loginRequest)\r\n .action(async ({ parsedInput }) => {\r\n try {\r\n const response = await authClient.login(parsedInput)\r\n \r\n // Store tokens\r\n await tokenStorage.setTokens({\r\n access_token: response.access_token,\r\n refresh_token: response.refresh_token,\r\n token_type: response.token_type || \"Bearer\",\r\n expires_in: response.expires_in,\r\n })\r\n\r\n // Get user info\r\n const user = await authClient.getCurrentUser()\r\n\r\n revalidatePath(\"/\")\r\n \r\n return {\r\n success: true,\r\n message: \"Logged in successfully\",\r\n user,\r\n tokens: {\r\n access_token: response.access_token,\r\n refresh_token: response.refresh_token,\r\n token_type: response.token_type || \"Bearer\",\r\n expires_in: response.expires_in,\r\n },\r\n }\r\n } catch (error: any) {\r\n throw new ActionError(\r\n error.message || \"Login failed\",\r\n error.code || \"LOGIN_ERROR\"\r\n )\r\n }\r\n })\r\n\r\nexport const logoutAction = actionClient\r\n .schema(authSchemas.refreshToken.partial())\r\n .action(async () => {\r\n try {\r\n await authClient.logout()\r\n await tokenStorage.removeTokens()\r\n\r\n revalidatePath(\"/\")\r\n \r\n return {\r\n success: true,\r\n message: \"Logged out successfully\",\r\n }\r\n } catch (error: any) {\r\n // Even if logout fails, clear local tokens\r\n await tokenStorage.removeTokens()\r\n \r\n return {\r\n success: true,\r\n message: \"Logged out successfully\",\r\n }\r\n }\r\n })\r\n\r\nexport const refreshTokenAction = actionClient\r\n .schema(authSchemas.refreshToken)\r\n .action(async ({ parsedInput }) => {\r\n try {\r\n const response = await authClient.refreshToken(parsedInput.refresh_token)\r\n \r\n // Store new tokens\r\n await tokenStorage.setTokens({\r\n access_token: response.access_token,\r\n refresh_token: response.refresh_token || parsedInput.refresh_token,\r\n token_type: response.token_type || \"Bearer\",\r\n expires_in: response.expires_in,\r\n })\r\n\r\n return {\r\n success: true,\r\n message: \"Token refreshed successfully\",\r\n tokens: {\r\n access_token: response.access_token,\r\n refresh_token: response.refresh_token || parsedInput.refresh_token,\r\n token_type: response.token_type || \"Bearer\",\r\n expires_in: response.expires_in,\r\n },\r\n }\r\n } catch (error: any) {\r\n throw new ActionError(\r\n error.message || \"Token refresh failed\",\r\n error.code || \"REFRESH_ERROR\"\r\n )\r\n }\r\n })\r\n\r\nexport const getCurrentUserAction = actionClient\r\n .schema(authSchemas.user.partial())\r\n .action(async () => {\r\n try {\r\n const user = await authClient.getCurrentUser()\r\n \r\n return {\r\n success: true,\r\n user,\r\n }\r\n } catch (error: any) {\r\n throw new ActionError(\r\n error.message || \"Failed to get user info\",\r\n error.code || \"USER_INFO_ERROR\"\r\n )\r\n }\r\n })`;\r\n\r\n return {\r\n path: 'auth/actions.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: ['loginAction', 'logoutAction', 'refreshTokenAction', 'getCurrentUserAction'],\r\n imports: ['next/cache'],\r\n dependencies: [safeActionImport, schemasImport, clientImport, utilsImport],\r\n },\r\n };\r\n }\r\n\r\n private generateAuthHooks(): GeneratedFile {\r\n const content = `\"use client\"\r\n\r\nimport { useAction } from \"next-safe-action/hooks\"\r\nimport { useRouter } from \"next/navigation\"\r\nimport { toast } from \"sonner\"\r\nimport {\r\n loginAction,\r\n logoutAction,\r\n refreshTokenAction,\r\n getCurrentUserAction,\r\n} from \"./actions\"\r\nimport type { LoginRequest } from \"./types\"\r\n\r\nexport const useLogin = () => {\r\n const router = useRouter()\r\n \r\n return useAction(loginAction, {\r\n onSuccess: ({ data }) => {\r\n toast.success(data.message)\r\n router.push(\"/dashboard\")\r\n router.refresh()\r\n },\r\n onError: ({ error }) => {\r\n toast.error(error.serverError || \"Login failed\")\r\n },\r\n })\r\n}\r\n\r\nexport const useLogout = () => {\r\n const router = useRouter()\r\n \r\n return useAction(logoutAction, {\r\n onSuccess: ({ data }) => {\r\n toast.success(data.message)\r\n router.push(\"/\")\r\n router.refresh()\r\n },\r\n onError: ({ error }) => {\r\n toast.error(error.serverError || \"Logout failed\")\r\n },\r\n })\r\n}\r\n\r\nexport const useRefreshToken = () => {\r\n return useAction(refreshTokenAction, {\r\n onSuccess: ({ data }) => {\r\n toast.success(data.message)\r\n },\r\n onError: ({ error }) => {\r\n toast.error(error.serverError || \"Token refresh failed\")\r\n },\r\n })\r\n}\r\n\r\nexport const useGetCurrentUser = () => {\r\n return useAction(getCurrentUserAction, {\r\n onError: ({ error }) => {\r\n toast.error(error.serverError || \"Failed to get user info\")\r\n },\r\n })\r\n}\r\n\r\n// Convenience hook for login with credentials\r\nexport const useCredentialsLogin = () => {\r\n const login = useLogin()\r\n \r\n const loginWithCredentials = (credentials: LoginRequest) => {\r\n login.execute(credentials)\r\n }\r\n\r\n return {\r\n loginWithCredentials,\r\n isPending: login.status === \"executing\",\r\n isError: login.status === \"hasErrored\",\r\n isSuccess: login.status === \"hasSucceeded\",\r\n error: login.result.serverError,\r\n data: login.result.data,\r\n }\r\n}`;\r\n\r\n return {\r\n path: 'auth/hooks.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: [\r\n 'useLogin',\r\n 'useLogout',\r\n 'useRefreshToken',\r\n 'useGetCurrentUser',\r\n 'useCredentialsLogin',\r\n ],\r\n imports: ['next-safe-action/hooks', 'next/navigation', 'sonner'],\r\n dependencies: ['./actions', './types'],\r\n },\r\n };\r\n }\r\n\r\n private generateAuthComponents(authEndpoints: any): GeneratedFile[] {\r\n const loginForm = {\r\n path: 'auth/components/login-form.tsx',\r\n content: `\"use client\"\r\n\r\nimport { useState } from \"react\"\r\nimport { useForm } from \"react-hook-form\"\r\nimport { zodResolver } from \"@hookform/resolvers/zod\"\r\nimport { Button } from \"@/components/ui/button\"\r\nimport { Input } from \"@/components/ui/input\"\r\nimport { Label } from \"@/components/ui/label\"\r\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"@/components/ui/card\"\r\nimport { Icons } from \"@/components/ui/icons\"\r\nimport { useCredentialsLogin } from \"../hooks\"\r\nimport { authSchemas, type LoginRequest } from \"../schemas\"\r\n\r\nexport function LoginForm() {\r\n const [showPassword, setShowPassword] = useState(false)\r\n const { loginWithCredentials, isPending, error } = useCredentialsLogin()\r\n\r\n const form = useForm<LoginRequest>({\r\n resolver: zodResolver(authSchemas.loginRequest),\r\n defaultValues: {\r\n username: \"\",\r\n password: \"\",\r\n },\r\n })\r\n\r\n const onSubmit = (data: LoginRequest) => {\r\n loginWithCredentials(data)\r\n }\r\n\r\n return (\r\n <Card className=\"w-full max-w-md\">\r\n <CardHeader className=\"space-y-1\">\r\n <CardTitle className=\"text-2xl text-center\">Sign in</CardTitle>\r\n <CardDescription className=\"text-center\">\r\n Enter your credentials to sign in\r\n </CardDescription>\r\n </CardHeader>\r\n <CardContent className=\"space-y-4\">\r\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"space-y-4\">\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"username\">Username</Label>\r\n <Input\r\n id=\"username\"\r\n type=\"text\"\r\n placeholder=\"Enter your username\"\r\n {...form.register(\"username\")}\r\n disabled={isPending}\r\n />\r\n {form.formState.errors.username && (\r\n <p className=\"text-sm text-destructive\">\r\n {form.formState.errors.username.message}\r\n </p>\r\n )}\r\n </div>\r\n \r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"password\">Password</Label>\r\n <div className=\"relative\">\r\n <Input\r\n id=\"password\"\r\n type={showPassword ? \"text\" : \"password\"}\r\n placeholder=\"Enter your password\"\r\n {...form.register(\"password\")}\r\n disabled={isPending}\r\n />\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"absolute right-0 top-0 h-full px-3 py-2 hover:bg-transparent\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n >\r\n {showPassword ? (\r\n <Icons.eyeOff className=\"h-4 w-4\" />\r\n ) : (\r\n <Icons.eye className=\"h-4 w-4\" />\r\n )}\r\n </Button>\r\n </div>\r\n {form.formState.errors.password && (\r\n <p className=\"text-sm text-destructive\">\r\n {form.formState.errors.password.message}\r\n </p>\r\n )}\r\n </div>\r\n\r\n {error && (\r\n <div className=\"text-sm text-destructive text-center\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <Button\r\n type=\"submit\"\r\n className=\"w-full\"\r\n disabled={isPending}\r\n >\r\n {isPending && (\r\n <Icons.spinner className=\"mr-2 h-4 w-4 animate-spin\" />\r\n )}\r\n Sign In\r\n </Button>\r\n </form>\r\n </CardContent>\r\n </Card>\r\n )\r\n}`,\r\n type: 'typescript' as const,\r\n metadata: {\r\n exports: ['LoginForm'],\r\n imports: ['react', 'react-hook-form', '@hookform/resolvers/zod', '@/components/ui/*'],\r\n dependencies: ['../hooks', '../schemas'],\r\n },\r\n };\r\n\r\n return [loginForm];\r\n }\r\n\r\n private generateAuthMiddleware(): GeneratedFile {\r\n const utilsImport = this.buildImportPath('auth/utils');\r\n\r\n const content = `import { NextResponse } from \"next/server\"\r\nimport type { NextRequest } from \"next/server\"\r\n\r\nexport async function authMiddleware(request: NextRequest) {\r\n const { pathname } = request.nextUrl\r\n\r\n // Public routes that don't require authentication\r\n const publicRoutes = [\r\n \"/\",\r\n \"/auth/login\",\r\n \"/auth/signup\",\r\n \"/api/auth/login\",\r\n \"/api/auth/refresh\",\r\n ]\r\n\r\n // Check if the route is public\r\n const isPublicRoute = publicRoutes.some(route => \r\n pathname.startsWith(route)\r\n )\r\n\r\n // If it's a public route, allow access\r\n if (isPublicRoute) {\r\n return NextResponse.next()\r\n }\r\n\r\n // Check for authorization header\r\n const authHeader = request.headers.get(\"authorization\")\r\n const token = authHeader?.replace(\"Bearer \", \"\")\r\n\r\n // If no token and trying to access protected route\r\n if (!token) {\r\n // For API routes, return 401\r\n if (pathname.startsWith(\"/api\")) {\r\n return new NextResponse(\r\n JSON.stringify({ error: \"Authentication required\" }),\r\n {\r\n status: 401,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n }\r\n )\r\n }\r\n\r\n // For pages, redirect to login\r\n const loginUrl = new URL(\"/auth/login\", request.url)\r\n loginUrl.searchParams.set(\"callbackUrl\", pathname)\r\n return NextResponse.redirect(loginUrl)\r\n }\r\n\r\n // TODO: Validate token with your API\r\n // For now, we'll assume the token is valid if present\r\n // In a real implementation, you'd verify the token with your auth service\r\n\r\n return NextResponse.next()\r\n}\r\n\r\nexport const config = {\r\n matcher: [\r\n /*\r\n * Match all request paths except for the ones starting with:\r\n * - _next/static (static files)\r\n * - _next/image (image optimization files)\r\n * - favicon.ico (favicon file)\r\n */\r\n \"/((?!_next/static|_next/image|favicon.ico).*)\",\r\n ],\r\n}`;\r\n\r\n return {\r\n path: 'auth/middleware.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: ['authMiddleware', 'config'],\r\n imports: ['next/server'],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n\r\n private generateAuthContext(): GeneratedFile {\r\n const content = `\"use client\"\r\n\r\nimport React, { createContext, useContext, useReducer, useEffect } from \"react\"\r\nimport type { AuthState, AuthContextType, LoginRequest, User, Token } from \"./types\"\r\nimport { authClient } from \"./client\"\r\nimport { tokenStorage } from \"./utils\"\r\n\r\n// Auth reducer\r\ntype AuthAction =\r\n | { type: \"SET_LOADING\"; payload: boolean }\r\n | { type: \"SET_USER\"; payload: User | null }\r\n | { type: \"SET_TOKENS\"; payload: Token | null }\r\n | { type: \"SET_ERROR\"; payload: string | null }\r\n | { type: \"CLEAR_ERROR\" }\r\n | { type: \"LOGOUT\" }\r\n\r\nconst authReducer = (state: AuthState, action: AuthAction): AuthState => {\r\n switch (action.type) {\r\n case \"SET_LOADING\":\r\n return { ...state, isLoading: action.payload }\r\n case \"SET_USER\":\r\n return { \r\n ...state, \r\n user: action.payload, \r\n isAuthenticated: !!action.payload \r\n }\r\n case \"SET_TOKENS\":\r\n return { ...state, tokens: action.payload }\r\n case \"SET_ERROR\":\r\n return { ...state, error: action.payload, isLoading: false }\r\n case \"CLEAR_ERROR\":\r\n return { ...state, error: null }\r\n case \"LOGOUT\":\r\n return {\r\n user: null,\r\n tokens: null,\r\n isAuthenticated: false,\r\n isLoading: false,\r\n error: null,\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n\r\nconst initialState: AuthState = {\r\n user: null,\r\n tokens: null,\r\n isAuthenticated: false,\r\n isLoading: true,\r\n error: null,\r\n}\r\n\r\n// Create context\r\nconst AuthContext = createContext<AuthContextType | undefined>(undefined)\r\n\r\n// Auth provider\r\nexport function AuthProvider({ children }: { children: React.ReactNode }) {\r\n const [state, dispatch] = useReducer(authReducer, initialState)\r\n\r\n // Initialize auth on mount\r\n useEffect(() => {\r\n const initializeAuth = async () => {\r\n try {\r\n dispatch({ type: \"SET_LOADING\", payload: true })\r\n \r\n const tokens = await tokenStorage.getTokens()\r\n if (!tokens) {\r\n dispatch({ type: \"SET_LOADING\", payload: false })\r\n return\r\n }\r\n\r\n dispatch({ type: \"SET_TOKENS\", payload: tokens })\r\n authClient.setTokens(tokens)\r\n\r\n const user = await authClient.getCurrentUser()\r\n dispatch({ type: \"SET_USER\", payload: user })\r\n } catch (error: any) {\r\n dispatch({ type: \"SET_ERROR\", payload: error.message })\r\n await tokenStorage.removeTokens()\r\n } finally {\r\n dispatch({ type: \"SET_LOADING\", payload: false })\r\n }\r\n }\r\n\r\n initializeAuth()\r\n }, [])\r\n\r\n const login = async (credentials: LoginRequest) => {\r\n try {\r\n dispatch({ type: \"SET_LOADING\", payload: true })\r\n dispatch({ type: \"CLEAR_ERROR\" })\r\n\r\n const response = await authClient.login(credentials)\r\n \r\n const tokens: Token = {\r\n access_token: response.access_token,\r\n refresh_token: response.refresh_token,\r\n token_type: response.token_type || \"Bearer\",\r\n expires_in: response.expires_in,\r\n }\r\n\r\n await tokenStorage.setTokens(tokens)\r\n dispatch({ type: \"SET_TOKENS\", payload: tokens })\r\n\r\n const user = await authClient.getCurrentUser()\r\n dispatch({ type: \"SET_USER\", payload: user })\r\n } catch (error: any) {\r\n dispatch({ type: \"SET_ERROR\", payload: error.message })\r\n throw error\r\n } finally {\r\n dispatch({ type: \"SET_LOADING\", payload: false })\r\n }\r\n }\r\n\r\n const logout = async () => {\r\n try {\r\n await authClient.logout()\r\n } catch (error) {\r\n console.warn(\"Logout error:\", error)\r\n } finally {\r\n await tokenStorage.removeTokens()\r\n dispatch({ type: \"LOGOUT\" })\r\n }\r\n }\r\n\r\n const refreshToken = async () => {\r\n try {\r\n if (!state.tokens?.refresh_token) {\r\n throw new Error(\"No refresh token available\")\r\n }\r\n\r\n const response = await authClient.refreshToken(state.tokens.refresh_token)\r\n \r\n const tokens: Token = {\r\n access_token: response.access_token,\r\n refresh_token: response.refresh_token || state.tokens.refresh_token,\r\n token_type: response.token_type || \"Bearer\",\r\n expires_in: response.expires_in,\r\n }\r\n\r\n await tokenStorage.setTokens(tokens)\r\n dispatch({ type: \"SET_TOKENS\", payload: tokens })\r\n } catch (error: any) {\r\n dispatch({ type: \"SET_ERROR\", payload: error.message })\r\n await logout()\r\n throw error\r\n }\r\n }\r\n\r\n const clearError = () => {\r\n dispatch({ type: \"CLEAR_ERROR\" })\r\n }\r\n\r\n const value: AuthContextType = {\r\n ...state,\r\n login,\r\n logout,\r\n refreshToken,\r\n clearError,\r\n }\r\n\r\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>\r\n}\r\n\r\n// Hook to use auth context\r\nexport function useAuth() {\r\n const context = useContext(AuthContext)\r\n if (context === undefined) {\r\n throw new Error(\"useAuth must be used within an AuthProvider\")\r\n }\r\n return context\r\n}`;\r\n\r\n return {\r\n path: 'auth/context.tsx',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: ['AuthProvider', 'useAuth'],\r\n imports: ['react'],\r\n dependencies: ['./types', './client', './utils'],\r\n },\r\n };\r\n }\r\n\r\n private convertSchemaToZod(schema: any): string {\r\n if (!schema || typeof schema !== 'object') {\r\n return 'z.unknown()';\r\n }\r\n\r\n // Handle OpenAPI schema objects\r\n if (schema.type) {\r\n switch (schema.type) {\r\n case 'string':\r\n let stringSchema = 'z.string()';\r\n if (schema.format === 'email') stringSchema += '.email()';\r\n if (schema.minLength) stringSchema += `.min(${schema.minLength})`;\r\n if (schema.maxLength) stringSchema += `.max(${schema.maxLength})`;\r\n return stringSchema;\r\n\r\n case 'number':\r\n case 'integer':\r\n return schema.type === 'integer' ? 'z.number().int()' : 'z.number()';\r\n\r\n case 'boolean':\r\n return 'z.boolean()';\r\n\r\n case 'object':\r\n if (schema.properties) {\r\n const properties = Object.entries(schema.properties)\r\n .map(([key, value]) => {\r\n const propSchema = this.convertSchemaToZod(value);\r\n const isRequired = schema.required?.includes(key);\r\n const finalSchema = isRequired ? propSchema : `${propSchema}.optional()`;\r\n return ` ${key}: ${finalSchema}`;\r\n })\r\n .join(',\\n');\r\n\r\n return `z.object({\\n${properties}\\n})`;\r\n }\r\n return 'z.record(z.unknown())';\r\n\r\n default:\r\n return 'z.unknown()';\r\n }\r\n }\r\n\r\n return 'z.unknown()';\r\n }\r\n}\r\n","import type {\r\n ParsedApiSchema,\r\n ApiEndpointDefinition,\r\n SchemaDefinition,\r\n} from './types';\r\nimport { z } from 'zod';\r\n\r\n/**\r\n * Intelligent Schema Analyzer\r\n * Automatically extracts patterns, statuses, error codes, and configurations from OpenAPI schema\r\n */\r\nexport class SchemaAnalyzer {\r\n constructor(private readonly schema: ParsedApiSchema) {}\r\n\r\n /**\r\n * Extract user status values from schema\r\n */\r\n extractUserStatuses(): string[] {\r\n const statuses = new Set<string>();\r\n\r\n // Look for UserStatus enum in schemas\r\n for (const schemaDef of this.schema.schemas) {\r\n const schemaName = schemaDef.name.toLowerCase();\r\n \r\n if (schemaName.includes('userstatus') || schemaName.includes('status')) {\r\n // Try to extract enum values from Zod schema\r\n const zodSchema = schemaDef.schema;\r\n \r\n // Check if it's a Zod enum\r\n if (zodSchema instanceof z.ZodEnum) {\r\n zodSchema.options.forEach((opt: string) => {\r\n statuses.add(opt);\r\n });\r\n } else if (zodSchema instanceof z.ZodNativeEnum) {\r\n // For native enums, try to extract values\r\n const enumValues = Object.values(zodSchema.enum);\r\n enumValues.forEach(val => {\r\n if (typeof val === 'string') {\r\n statuses.add(val.toLowerCase());\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Also check in endpoint responses\r\n for (const endpoint of this.schema.endpoints) {\r\n for (const response of endpoint.responses) {\r\n if (response.content) {\r\n for (const content of response.content) {\r\n const schema = content.schema as any;\r\n if (schema && typeof schema === 'object') {\r\n this.extractStatusFromSchema(schema, statuses);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Default statuses if none found\r\n if (statuses.size === 0) {\r\n return ['active', 'inactive', 'suspended', 'pending'];\r\n }\r\n\r\n return Array.from(statuses);\r\n }\r\n\r\n /**\r\n * Extract error codes from schema\r\n */\r\n extractErrorCodes(): Map<string, { code: string; status: number; message: string }> {\r\n const errorCodes = new Map<string, { code: string; status: number; message: string }>();\r\n\r\n // Look for error response schemas\r\n for (const endpoint of this.schema.endpoints) {\r\n for (const response of endpoint.responses) {\r\n if (response.statusCode.startsWith('4') || response.statusCode.startsWith('5')) {\r\n const status = parseInt(response.statusCode);\r\n \r\n if (response.content) {\r\n for (const content of response.content) {\r\n const schema = content.schema as any;\r\n if (schema) {\r\n this.extractErrorFromSchema(schema, status, errorCodes);\r\n }\r\n }\r\n }\r\n\r\n // Extract from description\r\n if (response.description) {\r\n const errorMatch = response.description.match(/error[_\\s]?code[:\\s]+(\\w+)/i);\r\n if (errorMatch) {\r\n errorCodes.set(errorMatch[1].toLowerCase(), {\r\n code: errorMatch[1],\r\n status,\r\n message: response.description,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return errorCodes;\r\n }\r\n\r\n /**\r\n * Extract account status patterns\r\n */\r\n extractAccountStatusPatterns(): {\r\n activeStatuses: string[];\r\n inactiveStatuses: string[];\r\n suspendedStatuses: string[];\r\n lockedStatuses: string[];\r\n } {\r\n const allStatuses = this.extractUserStatuses();\r\n \r\n const activeStatuses: string[] = [];\r\n const inactiveStatuses: string[] = [];\r\n const suspendedStatuses: string[] = [];\r\n const lockedStatuses: string[] = [];\r\n\r\n for (const status of allStatuses) {\r\n const lowerStatus = status.toLowerCase();\r\n \r\n if (lowerStatus === 'active' || lowerStatus === 'verified' || lowerStatus === 'enabled') {\r\n activeStatuses.push(status);\r\n } else if (lowerStatus === 'inactive' || lowerStatus === 'disabled' || lowerStatus === 'deactivated') {\r\n inactiveStatuses.push(status);\r\n } else if (lowerStatus === 'suspended' || lowerStatus === 'banned' || lowerStatus === 'blocked') {\r\n suspendedStatuses.push(status);\r\n } else if (lowerStatus === 'locked' || lowerStatus === 'pending' || lowerStatus === 'unverified') {\r\n lockedStatuses.push(status);\r\n }\r\n }\r\n\r\n return {\r\n activeStatuses: activeStatuses.length > 0 ? activeStatuses : ['active'],\r\n inactiveStatuses: inactiveStatuses.length > 0 ? inactiveStatuses : ['inactive'],\r\n suspendedStatuses: suspendedStatuses.length > 0 ? suspendedStatuses : ['suspended'],\r\n lockedStatuses: lockedStatuses.length > 0 ? lockedStatuses : ['pending', 'locked'],\r\n };\r\n }\r\n\r\n /**\r\n * Extract OAuth providers from schema\r\n */\r\n extractOAuthProviders(): string[] {\r\n const providers = new Set<string>();\r\n\r\n // Look for OAuthProvider enum\r\n for (const schemaDef of this.schema.schemas) {\r\n const schemaName = schemaDef.name.toLowerCase();\r\n \r\n if (schemaName.includes('oauth') && schemaName.includes('provider')) {\r\n const zodSchema = schemaDef.schema;\r\n \r\n if (zodSchema instanceof z.ZodEnum) {\r\n zodSchema.options.forEach((opt: string) => {\r\n providers.add(opt.toLowerCase());\r\n });\r\n } else if (zodSchema instanceof z.ZodNativeEnum) {\r\n const enumValues = Object.values(zodSchema.enum);\r\n enumValues.forEach(val => {\r\n if (typeof val === 'string') {\r\n providers.add(val.toLowerCase());\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Also check OAuth endpoints\r\n for (const endpoint of this.schema.endpoints) {\r\n const path = endpoint.path.toLowerCase();\r\n if (path.includes('/oauth/authorize/') || path.includes('/oauth/callback')) {\r\n // Extract provider from path parameter\r\n const pathParams = endpoint.parameters.filter(p => p.in === 'path');\r\n for (const param of pathParams) {\r\n if (param.name.toLowerCase().includes('provider')) {\r\n // Check for examples or enum values\r\n if (param.schema instanceof z.ZodEnum) {\r\n param.schema.options.forEach((opt: string) => {\r\n providers.add(opt.toLowerCase());\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return Array.from(providers);\r\n }\r\n\r\n /**\r\n * Extract authentication endpoints\r\n */\r\n extractAuthEndpoints(): {\r\n login?: ApiEndpointDefinition;\r\n loginCredentials?: ApiEndpointDefinition;\r\n loginRequest?: ApiEndpointDefinition;\r\n refresh?: ApiEndpointDefinition;\r\n logout?: ApiEndpointDefinition;\r\n register?: ApiEndpointDefinition;\r\n me?: ApiEndpointDefinition;\r\n oauthAuthorize?: ApiEndpointDefinition;\r\n oauthCallback?: ApiEndpointDefinition;\r\n mfaSetup?: ApiEndpointDefinition;\r\n mfaVerify?: ApiEndpointDefinition;\r\n passkeyChallenge?: ApiEndpointDefinition;\r\n passkeyAuthenticate?: ApiEndpointDefinition;\r\n } {\r\n const endpoints: any = {};\r\n\r\n for (const endpoint of this.schema.endpoints) {\r\n const path = endpoint.path.toLowerCase();\r\n const operationId = (endpoint.operationId || '').toLowerCase();\r\n\r\n // Login endpoints\r\n if (\r\n (path.includes('/auth/login/credentials') || operationId.includes('logincredentials') || operationId.includes('signin')) &&\r\n endpoint.method === 'POST'\r\n ) {\r\n endpoints.loginCredentials = endpoint;\r\n } else if (\r\n (path.includes('/auth/login') || operationId.includes('login')) &&\r\n endpoint.method === 'POST' &&\r\n !endpoints.loginCredentials\r\n ) {\r\n endpoints.login = endpoint;\r\n }\r\n\r\n // Login request (OTP)\r\n if (\r\n (path.includes('/auth/login/request') || operationId.includes('loginrequest')) &&\r\n endpoint.method === 'POST'\r\n ) {\r\n endpoints.loginRequest = endpoint;\r\n }\r\n\r\n // Refresh\r\n if (\r\n (path.includes('/auth/session/refresh') || path.includes('/auth/refresh') || operationId.includes('refresh')) &&\r\n endpoint.method === 'POST'\r\n ) {\r\n endpoints.refresh = endpoint;\r\n }\r\n\r\n // Logout\r\n if (\r\n (path.includes('/auth/session/signout') || path.includes('/auth/logout') || operationId.includes('logout') || operationId.includes('signout')) &&\r\n endpoint.method === 'POST'\r\n ) {\r\n endpoints.logout = endpoint;\r\n }\r\n\r\n // Register\r\n if (\r\n (path.includes('/auth/register') || operationId.includes('register')) &&\r\n endpoint.method === 'POST'\r\n ) {\r\n endpoints.register = endpoint;\r\n }\r\n\r\n // Me/Session\r\n if (\r\n ((path.includes('/auth/me') || path.includes('/auth/session')) && endpoint.method === 'GET') ||\r\n operationId.includes('me') ||\r\n operationId.includes('session')\r\n ) {\r\n endpoints.me = endpoint;\r\n }\r\n\r\n // OAuth\r\n if (\r\n (path.includes('/auth/oauth/authorize') || operationId.includes('oauthauthorize')) &&\r\n endpoint.method === 'GET'\r\n ) {\r\n endpoints.oauthAuthorize = endpoint;\r\n }\r\n\r\n if (\r\n (path.includes('/auth/oauth/callback') || operationId.includes('oauthcallback')) &&\r\n endpoint.method === 'POST'\r\n ) {\r\n endpoints.oauthCallback = endpoint;\r\n }\r\n\r\n // MFA\r\n if (\r\n (path.includes('/auth/mfa/totp/setup') || operationId.includes('setuptotp')) &&\r\n endpoint.method === 'POST'\r\n ) {\r\n endpoints.mfaSetup = endpoint;\r\n }\r\n\r\n if (\r\n (path.includes('/auth/mfa/totp/verify') || operationId.includes('verifytotp')) &&\r\n endpoint.method === 'POST'\r\n ) {\r\n endpoints.mfaVerify = endpoint;\r\n }\r\n\r\n // Passkeys\r\n if (\r\n (path.includes('/auth/passkey/challenge') || operationId.includes('passkeychallenge')) &&\r\n endpoint.method === 'POST'\r\n ) {\r\n endpoints.passkeyChallenge = endpoint;\r\n }\r\n\r\n if (\r\n (path.includes('/auth/passkey/authenticate') || operationId.includes('passkeyauthenticate')) &&\r\n endpoint.method === 'POST'\r\n ) {\r\n endpoints.passkeyAuthenticate = endpoint;\r\n }\r\n }\r\n\r\n return endpoints;\r\n }\r\n\r\n /**\r\n * Extract session configuration\r\n */\r\n extractSessionConfig(): {\r\n maxAge?: number;\r\n strategy?: 'jwt' | 'database';\r\n } {\r\n const config: any = {};\r\n\r\n // Look for session-related endpoints\r\n const sessionEndpoints = this.schema.endpoints.filter(e => \r\n e.path.toLowerCase().includes('/session') || \r\n (e.operationId || '').toLowerCase().includes('session')\r\n );\r\n\r\n // Try to extract maxAge from response headers or schemas\r\n for (const endpoint of sessionEndpoints) {\r\n for (const response of endpoint.responses) {\r\n if (response.headers) {\r\n for (const [headerName, headerDef] of Object.entries(response.headers)) {\r\n if (headerName.toLowerCase().includes('expires') || headerName.toLowerCase().includes('max-age')) {\r\n // Try to extract value\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return config;\r\n }\r\n\r\n /**\r\n * Validate that required endpoints exist in schema\r\n * Returns validation results with warnings for missing endpoints\r\n */\r\n validateEndpoints(requiredEndpoints: {\r\n oauth?: string[];\r\n mfa?: boolean;\r\n passkeys?: boolean;\r\n presignedUploads?: boolean;\r\n }): {\r\n valid: boolean;\r\n warnings: string[];\r\n missing: {\r\n oauth?: string[];\r\n mfa?: boolean;\r\n passkeys?: boolean;\r\n presignedUploads?: boolean;\r\n };\r\n } {\r\n const warnings: string[] = [];\r\n const missing: any = {};\r\n let valid = true;\r\n\r\n // Validate OAuth endpoints\r\n if (requiredEndpoints.oauth && requiredEndpoints.oauth.length > 0) {\r\n const extractedEndpoints = this.extractAuthEndpoints();\r\n const missingOAuth: string[] = [];\r\n\r\n for (const provider of requiredEndpoints.oauth) {\r\n if (!extractedEndpoints.oauthAuthorize || !extractedEndpoints.oauthCallback) {\r\n missingOAuth.push(provider);\r\n warnings.push(\r\n `⚠️ OAuth provider \"${provider}\" is configured but OAuth endpoints are not found in OpenAPI schema. ` +\r\n `Expected endpoints: /auth/oauth/authorize/{provider} and /auth/oauth/callback`\r\n );\r\n }\r\n }\r\n\r\n if (missingOAuth.length > 0) {\r\n missing.oauth = missingOAuth;\r\n valid = false;\r\n }\r\n }\r\n\r\n // Validate MFA endpoints\r\n if (requiredEndpoints.mfa) {\r\n const extractedEndpoints = this.extractAuthEndpoints();\r\n if (!extractedEndpoints.mfaSetup || !extractedEndpoints.mfaVerify) {\r\n missing.mfa = true;\r\n valid = false;\r\n warnings.push(\r\n `⚠️ MFA is enabled but MFA endpoints are not found in OpenAPI schema. ` +\r\n `Expected endpoints: /auth/mfa/totp/setup and /auth/mfa/totp/verify`\r\n );\r\n }\r\n }\r\n\r\n // Validate Passkeys endpoints\r\n if (requiredEndpoints.passkeys) {\r\n const extractedEndpoints = this.extractAuthEndpoints();\r\n if (!extractedEndpoints.passkeyChallenge || !extractedEndpoints.passkeyAuthenticate) {\r\n missing.passkeys = true;\r\n valid = false;\r\n warnings.push(\r\n `⚠️ Passkeys are enabled but Passkey endpoints are not found in OpenAPI schema. ` +\r\n `Expected endpoints: /auth/passkey/challenge and /auth/passkey/authenticate`\r\n );\r\n }\r\n }\r\n\r\n // Validate Presigned Uploads endpoint\r\n if (requiredEndpoints.presignedUploads) {\r\n const uploadConfig = this.extractUploadConfig();\r\n if (!uploadConfig.presignedEndpoint) {\r\n missing.presignedUploads = true;\r\n valid = false;\r\n warnings.push(\r\n `⚠️ Presigned uploads are enabled but presigned endpoint is not found in OpenAPI schema. ` +\r\n `Expected endpoint with 'presign' or 'presigned' in path`\r\n );\r\n }\r\n }\r\n\r\n return { valid, warnings, missing };\r\n }\r\n\r\n /**\r\n * Check if specific endpoint exists\r\n */\r\n hasEndpoint(pathPattern: string | RegExp, method?: string): boolean {\r\n for (const endpoint of this.schema.endpoints) {\r\n const pathMatch = typeof pathPattern === 'string'\r\n ? endpoint.path.toLowerCase().includes(pathPattern.toLowerCase())\r\n : pathPattern.test(endpoint.path);\r\n \r\n const methodMatch = method ? endpoint.method === method.toUpperCase() : true;\r\n \r\n if (pathMatch && methodMatch) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Check if OAuth provider is supported\r\n */\r\n isOAuthProviderSupported(provider: string): boolean {\r\n const extractedEndpoints = this.extractAuthEndpoints();\r\n return !!(extractedEndpoints.oauthAuthorize && extractedEndpoints.oauthCallback);\r\n }\r\n\r\n /**\r\n * Check if MFA is supported\r\n */\r\n isMFASupported(): boolean {\r\n const extractedEndpoints = this.extractAuthEndpoints();\r\n return !!(extractedEndpoints.mfaSetup && extractedEndpoints.mfaVerify);\r\n }\r\n\r\n /**\r\n * Check if Passkeys are supported\r\n */\r\n isPasskeysSupported(): boolean {\r\n const extractedEndpoints = this.extractAuthEndpoints();\r\n return !!(extractedEndpoints.passkeyChallenge && extractedEndpoints.passkeyAuthenticate);\r\n }\r\n\r\n /**\r\n * Check if Presigned Uploads are supported\r\n */\r\n isPresignedUploadsSupported(): boolean {\r\n const uploadConfig = this.extractUploadConfig();\r\n return !!uploadConfig.presignedEndpoint;\r\n }\r\n\r\n /**\r\n * Extract file upload configuration\r\n */\r\n extractUploadConfig(): {\r\n maxSize?: number;\r\n allowedTypes?: string[];\r\n presignedEndpoint?: string;\r\n } {\r\n const config: any = {};\r\n\r\n // Look for file upload endpoints\r\n for (const endpoint of this.schema.endpoints) {\r\n const path = endpoint.path.toLowerCase();\r\n \r\n if (path.includes('presign') || path.includes('presigned')) {\r\n config.presignedEndpoint = endpoint.path;\r\n }\r\n\r\n if (endpoint.requestBody) {\r\n for (const content of endpoint.requestBody.content) {\r\n if (content.type.includes('multipart') || content.type.includes('form-data')) {\r\n // Try to extract file constraints\r\n const schema = content.schema as any;\r\n if (schema && typeof schema === 'object') {\r\n this.extractFileConstraints(schema, config);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return config;\r\n }\r\n\r\n // Helper methods\r\n private extractStatusFromSchema(schema: any, statuses: Set<string>): void {\r\n if (!schema || typeof schema !== 'object') return;\r\n\r\n // Check for enum\r\n if (schema.enum) {\r\n schema.enum.forEach((val: any) => {\r\n if (typeof val === 'string') {\r\n statuses.add(val.toLowerCase());\r\n }\r\n });\r\n }\r\n\r\n // Check for properties\r\n if (schema.properties) {\r\n for (const [key, value] of Object.entries(schema.properties)) {\r\n if (key.toLowerCase().includes('status')) {\r\n this.extractStatusFromSchema(value, statuses);\r\n }\r\n }\r\n }\r\n\r\n // Check for allOf, anyOf, oneOf\r\n ['allOf', 'anyOf', 'oneOf'].forEach(prop => {\r\n if (schema[prop] && Array.isArray(schema[prop])) {\r\n schema[prop].forEach((item: any) => {\r\n this.extractStatusFromSchema(item, statuses);\r\n });\r\n }\r\n });\r\n }\r\n\r\n private extractErrorFromSchema(\r\n schema: any,\r\n status: number,\r\n errorCodes: Map<string, { code: string; status: number; message: string }>\r\n ): void {\r\n if (!schema || typeof schema !== 'object') return;\r\n\r\n // Check for error_code field\r\n if (schema.properties?.error_code) {\r\n const errorCodeSchema = schema.properties.error_code;\r\n if (errorCodeSchema.enum) {\r\n errorCodeSchema.enum.forEach((code: string) => {\r\n errorCodes.set(code.toLowerCase(), {\r\n code,\r\n status,\r\n message: schema.properties?.detail?.default || schema.properties?.message?.default || '',\r\n });\r\n });\r\n }\r\n }\r\n\r\n // Check for detail field with error patterns\r\n if (schema.properties?.detail) {\r\n const detail = schema.properties.detail;\r\n if (typeof detail === 'string') {\r\n // Try to extract error code from description\r\n const codeMatch = detail.match(/(\\w+)[_\\s]?error/i);\r\n if (codeMatch) {\r\n errorCodes.set(codeMatch[1].toLowerCase(), {\r\n code: codeMatch[1],\r\n status,\r\n message: detail,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n private extractFileConstraints(schema: any, config: any): void {\r\n if (!schema || typeof schema !== 'object') return;\r\n\r\n // Check for file property\r\n if (schema.properties?.file) {\r\n const fileSchema = schema.properties.file;\r\n \r\n // Extract maxSize\r\n if (fileSchema.maxSize || fileSchema['x-max-size']) {\r\n config.maxSize = fileSchema.maxSize || fileSchema['x-max-size'];\r\n }\r\n\r\n // Extract allowedTypes\r\n if (fileSchema.allowedTypes || fileSchema['x-allowed-types']) {\r\n config.allowedTypes = fileSchema.allowedTypes || fileSchema['x-allowed-types'];\r\n }\r\n }\r\n\r\n // Check for constraints in schema\r\n if (schema['x-file-constraints']) {\r\n Object.assign(config, schema['x-file-constraints']);\r\n }\r\n }\r\n}\r\n\r\n","import type {\r\n BridgeConfiguration,\r\n GenerationContext,\r\n GeneratedFile,\r\n ApiEndpointDefinition,\r\n} from '@/core/types';\r\nimport { SchemaAnalyzer } from '@/core/schema-analyzer';\r\n\r\n/**\r\n * NextAuth 5.0 Professional Generator\r\n * Generates production-ready NextAuth configuration with:\r\n * - OAuth providers (Google, GitHub, etc.) - Auto-detected from schema\r\n * - MFA support (TOTP, Backup Codes) - Auto-detected from schema\r\n * - Passkeys (WebAuthn) support - Auto-detected from schema\r\n * - Advanced token refresh with account status checking - Auto-detected from schema\r\n * - Comprehensive error handling - Auto-detected from schema\r\n * - Session management - Auto-detected from schema\r\n * \r\n * Intelligent: Automatically extracts all configurations from OpenAPI schema\r\n */\r\nexport class NextAuthGenerator {\r\n private analyzer!: SchemaAnalyzer;\r\n private accountStatusPatterns!: {\r\n activeStatuses: string[];\r\n inactiveStatuses: string[];\r\n suspendedStatuses: string[];\r\n lockedStatuses: string[];\r\n };\r\n\r\n constructor(private readonly configuration: BridgeConfiguration) {}\r\n\r\n private buildImportPath(relativePath: string): string {\r\n const outputDirectory = this.configuration.outputDir || 'generated';\r\n const cleanPath = relativePath.startsWith('/') ? relativePath.slice(1) : relativePath;\r\n\r\n let importBasePath = outputDirectory;\r\n if (importBasePath.startsWith('src/')) {\r\n importBasePath = importBasePath.substring(4);\r\n }\r\n\r\n return `@/${importBasePath}/${cleanPath}`;\r\n }\r\n\r\n async generate(context: GenerationContext): Promise<GeneratedFile[]> {\r\n const { config, schema } = context;\r\n const authConfig = config.auth;\r\n\r\n if (!authConfig?.enabled || authConfig.provider !== 'next-auth') {\r\n return [];\r\n }\r\n\r\n // Initialize intelligent schema analyzer\r\n this.analyzer = new SchemaAnalyzer(schema);\r\n \r\n // Extract account status patterns automatically\r\n this.accountStatusPatterns = this.analyzer.extractAccountStatusPatterns();\r\n\r\n const files: GeneratedFile[] = [];\r\n\r\n // Use intelligent endpoint extraction\r\n const extractedEndpoints = this.analyzer.extractAuthEndpoints();\r\n \r\n // Validate configured features against actual schema\r\n const validation = this.analyzer.validateEndpoints({\r\n oauth: authConfig.oauth?.enabled ? authConfig.oauth.providers : undefined,\r\n mfa: authConfig.mfa?.enabled === true,\r\n passkeys: authConfig.passkeys?.enabled === true,\r\n });\r\n\r\n // Log warnings for missing endpoints\r\n if (validation.warnings.length > 0) {\r\n console.warn('\\n⚠️ Mulink Configuration Warnings:');\r\n validation.warnings.forEach(warning => console.warn(warning));\r\n console.warn('These features will be disabled in generated code.\\n');\r\n }\r\n\r\n // Auto-detect OAuth providers from schema\r\n const detectedOAuthProviders = this.analyzer.extractOAuthProviders();\r\n \r\n // Filter OAuth providers to only include those that exist in schema\r\n const configuredOAuthProviders = authConfig.oauth?.providers || [];\r\n const validOAuthProviders = configuredOAuthProviders.filter(provider => \r\n this.analyzer.isOAuthProviderSupported(provider)\r\n );\r\n \r\n // Use valid providers or fallback to detected ones\r\n const oauthProviders = validOAuthProviders.length > 0 \r\n ? validOAuthProviders \r\n : (detectedOAuthProviders.length > 0 ? detectedOAuthProviders : []);\r\n\r\n // Auto-detect MFA support (only if endpoints exist)\r\n const hasMFA = authConfig.mfa?.enabled === true && \r\n this.analyzer.isMFASupported() &&\r\n !!(extractedEndpoints.mfaSetup || extractedEndpoints.mfaVerify);\r\n \r\n // Auto-detect Passkeys support (only if endpoints exist)\r\n const hasPasskeys = authConfig.passkeys?.enabled === true && \r\n this.analyzer.isPasskeysSupported() &&\r\n !!(extractedEndpoints.passkeyChallenge || extractedEndpoints.passkeyAuthenticate);\r\n\r\n // Validate that basic auth endpoints exist before generating\r\n if (!extractedEndpoints.login && !extractedEndpoints.loginCredentials) {\r\n console.warn(\r\n `⚠️ NextAuth is enabled but login endpoints are not found in OpenAPI schema. ` +\r\n `Expected endpoints: /auth/login or /auth/login/credentials. ` +\r\n `NextAuth configuration will not be generated.`\r\n );\r\n return files; // Return empty files if no auth endpoints\r\n }\r\n\r\n // Generate NextAuth configuration file with intelligent auto-detection\r\n files.push(this.generateNextAuthConfig(\r\n extractedEndpoints,\r\n oauthProviders,\r\n hasMFA,\r\n hasPasskeys\r\n ));\r\n\r\n // Generate auth types with auto-detected status patterns\r\n files.push(this.generateAuthTypes(extractedEndpoints, this.accountStatusPatterns));\r\n\r\n // Generate auth utilities\r\n files.push(this.generateAuthUtils(extractedEndpoints));\r\n\r\n // Generate passkey utilities\r\n if (hasPasskeys) {\r\n files.push(this.generatePasskeyUtils(extractedEndpoints));\r\n }\r\n\r\n return files;\r\n }\r\n\r\n private findAuthEndpoints(endpoints: ApiEndpointDefinition[]): {\r\n login?: ApiEndpointDefinition;\r\n loginCredentials?: ApiEndpointDefinition;\r\n loginRequest?: ApiEndpointDefinition;\r\n refresh?: ApiEndpointDefinition;\r\n logout?: ApiEndpointDefinition;\r\n register?: ApiEndpointDefinition;\r\n me?: ApiEndpointDefinition;\r\n } {\r\n const authEndpoints: any = {};\r\n\r\n for (const endpoint of endpoints) {\r\n const path = endpoint.path.toLowerCase();\r\n const operationId = (endpoint.operationId || '').toLowerCase();\r\n\r\n // Login endpoints\r\n if (\r\n (path.includes('/auth/login/credentials') || operationId.includes('logincredentials') || operationId.includes('signin')) &&\r\n endpoint.method === 'POST'\r\n ) {\r\n authEndpoints.loginCredentials = endpoint;\r\n } else if (\r\n (path.includes('/auth/login') || operationId.includes('login')) &&\r\n endpoint.method === 'POST'\r\n ) {\r\n authEndpoints.login = endpoint;\r\n }\r\n\r\n // Login request (OTP)\r\n if (\r\n (path.includes('/auth/login/request') || operationId.includes('loginrequest')) &&\r\n endpoint.method === 'POST'\r\n ) {\r\n authEndpoints.loginRequest = endpoint;\r\n }\r\n\r\n // Refresh endpoint\r\n if (\r\n (path.includes('/auth/session/refresh') || path.includes('/auth/refresh') || operationId.includes('refresh')) &&\r\n endpoint.method === 'POST'\r\n ) {\r\n authEndpoints.refresh = endpoint;\r\n }\r\n\r\n // Logout endpoint\r\n if (\r\n (path.includes('/auth/session/signout') || path.includes('/auth/logout') || operationId.includes('logout') || operationId.includes('signout')) &&\r\n endpoint.method === 'POST'\r\n ) {\r\n authEndpoints.logout = endpoint;\r\n }\r\n\r\n // Register endpoint\r\n if (\r\n (path.includes('/auth/register') || operationId.includes('register')) &&\r\n endpoint.method === 'POST'\r\n ) {\r\n authEndpoints.register = endpoint;\r\n }\r\n\r\n // Me endpoint\r\n if (\r\n (path.includes('/auth/me') || path.includes('/auth/session') && endpoint.method === 'GET') ||\r\n operationId.includes('me') ||\r\n operationId.includes('session')\r\n ) {\r\n authEndpoints.me = endpoint;\r\n }\r\n }\r\n\r\n return authEndpoints;\r\n }\r\n\r\n private findOAuthEndpoints(endpoints: ApiEndpointDefinition[]): {\r\n authorize?: ApiEndpointDefinition;\r\n callback?: ApiEndpointDefinition;\r\n providers?: ApiEndpointDefinition;\r\n } {\r\n const oauthEndpoints: any = {};\r\n\r\n for (const endpoint of endpoints) {\r\n const path = endpoint.path.toLowerCase();\r\n const operationId = (endpoint.operationId || '').toLowerCase();\r\n\r\n if (path.includes('/auth/oauth/authorize') || operationId.includes('oauthauthorize')) {\r\n oauthEndpoints.authorize = endpoint;\r\n }\r\n\r\n if (path.includes('/auth/oauth/callback') || operationId.includes('oauthcallback')) {\r\n oauthEndpoints.callback = endpoint;\r\n }\r\n\r\n if (path.includes('/auth/oauth/providers') || operationId.includes('oauthproviders')) {\r\n oauthEndpoints.providers = endpoint;\r\n }\r\n }\r\n\r\n return oauthEndpoints;\r\n }\r\n\r\n private findMFAEndpoints(endpoints: ApiEndpointDefinition[]): {\r\n setupTotp?: ApiEndpointDefinition;\r\n verifyTotp?: ApiEndpointDefinition;\r\n disableTotp?: ApiEndpointDefinition;\r\n backupCodes?: ApiEndpointDefinition;\r\n } {\r\n const mfaEndpoints: any = {};\r\n\r\n for (const endpoint of endpoints) {\r\n const path = endpoint.path.toLowerCase();\r\n const operationId = (endpoint.operationId || '').toLowerCase();\r\n\r\n if (path.includes('/auth/mfa/totp/setup') || operationId.includes('setuptotp')) {\r\n mfaEndpoints.setupTotp = endpoint;\r\n }\r\n\r\n if (path.includes('/auth/mfa/totp/verify') || operationId.includes('verifytotp')) {\r\n mfaEndpoints.verifyTotp = endpoint;\r\n }\r\n\r\n if (path.includes('/auth/mfa/totp/disable') || operationId.includes('disabletotp')) {\r\n mfaEndpoints.disableTotp = endpoint;\r\n }\r\n\r\n if (path.includes('/auth/mfa/backup-codes') || operationId.includes('backupcodes')) {\r\n mfaEndpoints.backupCodes = endpoint;\r\n }\r\n }\r\n\r\n return mfaEndpoints;\r\n }\r\n\r\n private findPasskeyEndpoints(endpoints: ApiEndpointDefinition[]): {\r\n registerBegin?: ApiEndpointDefinition;\r\n registerComplete?: ApiEndpointDefinition;\r\n challenge?: ApiEndpointDefinition;\r\n authenticate?: ApiEndpointDefinition;\r\n } {\r\n const passkeyEndpoints: any = {};\r\n\r\n for (const endpoint of endpoints) {\r\n const path = endpoint.path.toLowerCase();\r\n const operationId = (endpoint.operationId || '').toLowerCase();\r\n\r\n if (path.includes('/auth/passkey/register/begin') || operationId.includes('passkeyregisterbegin')) {\r\n passkeyEndpoints.registerBegin = endpoint;\r\n }\r\n\r\n if (path.includes('/auth/passkey/register/complete') || operationId.includes('passkeyregistercomplete')) {\r\n passkeyEndpoints.registerComplete = endpoint;\r\n }\r\n\r\n if (path.includes('/auth/passkey/challenge') || operationId.includes('passkeychallenge')) {\r\n passkeyEndpoints.challenge = endpoint;\r\n }\r\n\r\n if (path.includes('/auth/passkey/authenticate') || operationId.includes('passkeyauthenticate')) {\r\n passkeyEndpoints.authenticate = endpoint;\r\n }\r\n }\r\n\r\n return passkeyEndpoints;\r\n }\r\n\r\n private findUserEndpoints(endpoints: ApiEndpointDefinition[]): {\r\n me?: ApiEndpointDefinition;\r\n profile?: ApiEndpointDefinition;\r\n } {\r\n const userEndpoints: any = {};\r\n\r\n for (const endpoint of endpoints) {\r\n const path = endpoint.path.toLowerCase();\r\n const operationId = (endpoint.operationId || '').toLowerCase();\r\n\r\n if (\r\n (path.includes('/auth/me') || path.includes('/users/me') || operationId.includes('me')) &&\r\n endpoint.method === 'GET'\r\n ) {\r\n userEndpoints.me = endpoint;\r\n }\r\n\r\n if (path.includes('/profile') || operationId.includes('profile')) {\r\n userEndpoints.profile = endpoint;\r\n }\r\n }\r\n\r\n return userEndpoints;\r\n }\r\n\r\n private generateNextAuthConfig(\r\n extractedEndpoints: any,\r\n oauthProviders: string[],\r\n hasMFA: boolean,\r\n hasPasskeys: boolean\r\n ): GeneratedFile {\r\n const authConfig = this.configuration.auth!;\r\n const apiBaseUrl = this.configuration.api?.baseUrl || 'http://localhost:8000';\r\n const apiUrl = `process.env.NEXT_PUBLIC_API_URL || '${apiBaseUrl}'`;\r\n \r\n const hasGoogle = oauthProviders.includes('google');\r\n const hasGitHub = oauthProviders.includes('github');\r\n const hasDiscord = oauthProviders.includes('discord');\r\n const hasMicrosoft = oauthProviders.includes('microsoft');\r\n const hasApple = oauthProviders.includes('apple');\r\n \r\n // Get account status patterns (auto-detected)\r\n const { activeStatuses, inactiveStatuses, suspendedStatuses, lockedStatuses } = this.accountStatusPatterns;\r\n \r\n // Extract error codes\r\n const errorCodes = this.analyzer.extractErrorCodes();\r\n \r\n const sessionStrategy = authConfig.session?.strategy || 'jwt';\r\n const sessionMaxAge = authConfig.session?.maxAge || 7 * 24 * 60 * 60; // 7 days\r\n const jwtMaxAge = authConfig.session?.jwtMaxAge || sessionMaxAge;\r\n \r\n // Auto-detect paths from extracted endpoints\r\n const loginPath = extractedEndpoints.loginCredentials?.path || extractedEndpoints.login?.path || '/api/v1/auth/login/credentials';\r\n const refreshPath = extractedEndpoints.refresh?.path || '/api/v1/auth/session/refresh';\r\n const logoutPath = extractedEndpoints.logout?.path || '/api/v1/auth/session/signout';\r\n const mePath = extractedEndpoints.me?.path || '/api/v1/auth/me';\r\n const oauthCallbackPath = extractedEndpoints.oauthCallback?.path || '/api/v1/auth/oauth/callback';\r\n const loginRequestPath = extractedEndpoints.loginRequest?.path || '/api/v1/auth/login/request';\r\n const passkeyChallengePath = extractedEndpoints.passkeyChallenge?.path || '/api/v1/auth/passkey/challenge';\r\n const passkeyAuthenticatePath = extractedEndpoints.passkeyAuthenticate?.path || '/api/v1/auth/passkey/authenticate';\r\n \r\n // Generate status checking code dynamically based on detected statuses\r\n const activeStatusCheck = activeStatuses.length > 0 \r\n ? `(${activeStatuses.map(s => `token.status === \"${s}\"`).join(' || ')})`\r\n : 'token.status === \"active\"';\r\n \r\n const inactiveStatusCheck = inactiveStatuses.length > 0\r\n ? `(${inactiveStatuses.map(s => `token.status === \"${s}\"`).join(' || ')})`\r\n : 'token.status === \"inactive\"';\r\n \r\n const suspendedStatusCheck = suspendedStatuses.length > 0\r\n ? `(${suspendedStatuses.map(s => `token.status === \"${s}\"`).join(' || ')})`\r\n : 'token.status === \"suspended\"';\r\n \r\n const nonActiveStatusCheck = `!(${activeStatuses.map(s => `token.status === \"${s}\"`).join(' || ')})`;\r\n\r\n const content = `/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/**\r\n * NextAuth 5.0 Professional Configuration\r\n * Auto-generated by Mulink - Production-ready authentication\r\n * \r\n * Features:\r\n * - OAuth providers (${oauthProviders.join(', ') || 'none'})\r\n * - MFA support (${hasMFA ? 'TOTP, Backup Codes' : 'disabled'})\r\n * - Passkeys support (${hasPasskeys ? 'WebAuthn' : 'disabled'})\r\n * - Advanced token refresh with account status checking\r\n * - Comprehensive error handling\r\n * - Session management\r\n */\r\n\r\nimport NextAuth from \"next-auth\"\r\nimport type { NextAuthConfig } from \"next-auth\"\r\n${hasGoogle ? 'import Google from \"next-auth/providers/google\"' : ''}\r\n${hasGitHub ? 'import GitHub from \"next-auth/providers/github\"' : ''}\r\nimport Credentials from \"next-auth/providers/credentials\"\r\n\r\n// Enhanced user type matching backend\r\nexport interface User {\r\n id: string\r\n email: string\r\n name: string\r\n username?: string\r\n role: string\r\n status: string\r\n avatar_url?: string\r\n api_key?: string\r\n preferences?: Record<string, any>\r\n mfa_enabled?: boolean\r\n passkeys_count?: number\r\n sessions_count?: number\r\n}\r\n\r\n// Enhanced session type\r\nexport interface Session {\r\n user: User\r\n accessToken: string\r\n refreshToken: string\r\n sessionId: string\r\n expires: string\r\n mfa_verified?: boolean\r\n auth_method?: string\r\n}\r\n\r\nconst config: NextAuthConfig = {\r\n providers: [\r\n ${hasGoogle ? `Google({\r\n clientId: process.env.GOOGLE_CLIENT_ID!,\r\n clientSecret: process.env.GOOGLE_CLIENT_SECRET!,\r\n allowDangerousEmailAccountLinking: true,\r\n }),` : ''}\r\n ${hasGitHub ? `GitHub({\r\n clientId: process.env.GITHUB_CLIENT_ID!,\r\n clientSecret: process.env.GITHUB_CLIENT_SECRET!,\r\n allowDangerousEmailAccountLinking: true,\r\n }),` : ''}\r\n Credentials({\r\n name: \"credentials\",\r\n credentials: {\r\n email: { label: \"Email\", type: \"email\" },\r\n password: { label: \"Password\", type: \"password\" },\r\n login_code: { label: \"Login Code\", type: \"text\", required: false },\r\n mfa_code: { label: \"MFA Code\", type: \"text\", required: false },\r\n remember_me: { label: \"Remember Me\", type: \"checkbox\" }\r\n },\r\n async authorize(credentials) {\r\n if (!credentials?.email) {\r\n return null\r\n }\r\n\r\n const apiBaseUrl = ${apiUrl}\r\n\r\n const mapAuthResponseToUser = (data: any, authMethod: string) => ({\r\n id: data.user.id,\r\n email: data.user.email,\r\n name: data.user.name,\r\n username: data.user.username,\r\n role: data.user.role,\r\n status: data.user.status,\r\n avatar_url: data.user.avatar_url,\r\n api_key: data.user.api_key,\r\n accessToken: data.access_token,\r\n refreshToken: data.refresh_token,\r\n sessionId: data.session_id,\r\n auth_method: authMethod\r\n })\r\n\r\n // Handle OTP login\r\n if (credentials.login_code) {\r\n try {\r\n const otpResponse = await fetch(\\`\\${apiBaseUrl}${loginRequestPath.replace('/api/v1', '')}\\`, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({\r\n email: credentials.email,\r\n code: credentials.login_code\r\n }),\r\n })\r\n\r\n if (!otpResponse.ok) {\r\n const error = await otpResponse.json().catch(() => ({}))\r\n throw new Error(error.detail || \"OTP verification failed\")\r\n }\r\n\r\n const otpData = await otpResponse.json()\r\n \r\n if (otpData.user && otpData.access_token) {\r\n return mapAuthResponseToUser(otpData, \"otp\")\r\n }\r\n } catch (error) {\r\n console.error(\"OTP auth error:\", error)\r\n throw error\r\n }\r\n }\r\n\r\n if (!credentials.password) {\r\n return null\r\n }\r\n\r\n try {\r\n const loginData: any = {\r\n email: credentials.email,\r\n password: credentials.password,\r\n remember_me: credentials.remember_me === 'true'\r\n }\r\n\r\n if (credentials.mfa_code) {\r\n loginData.mfa_code = credentials.mfa_code\r\n }\r\n\r\n const res = await fetch(\\`\\${apiBaseUrl}${loginPath.replace('/api/v1', '')}\\`, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify(loginData),\r\n })\r\n\r\n if (!res.ok) {\r\n const error = await res.json().catch(() => ({ detail: \"Authentication failed\" }))\r\n \r\n if (res.status === 423) {\r\n const lockoutError: any = new Error(error.detail || \"Account is locked\")\r\n lockoutError.code = \"ACCOUNT_LOCKED\"\r\n lockoutError.status = 423\r\n throw lockoutError\r\n }\r\n \r\n throw new Error(error.detail || \"Authentication failed\")\r\n }\r\n\r\n const data = await res.json()\r\n \r\n if (data.requires_mfa) {\r\n return {\r\n id: \"mfa_required\",\r\n email: credentials.email as string,\r\n name: \"MFA Required\",\r\n role: \"user\",\r\n status: \"pending\",\r\n mfa_required: true,\r\n mfa_token: data.mfa_token\r\n }\r\n }\r\n\r\n if (data.user && data.access_token) {\r\n return mapAuthResponseToUser(data, \"credentials\")\r\n }\r\n } catch (error) {\r\n console.error(\"Auth error:\", error)\r\n }\r\n\r\n return null\r\n }\r\n }),\r\n ],\r\n\r\n callbacks: {\r\n async jwt({ token, user, account, trigger }) {\r\n if (account && user) {\r\n return {\r\n ...token,\r\n accessToken: (user as any).accessToken,\r\n refreshToken: (user as any).refreshToken,\r\n sessionId: (user as any).sessionId,\r\n auth_method: (user as any).auth_method,\r\n mfa_verified: (user as any).mfa_verified,\r\n role: (user as any).role,\r\n status: (user as any).status,\r\n api_key: (user as any).api_key,\r\n accessTokenExpires: Date.now() + ${jwtMaxAge} * 1000,\r\n }\r\n }\r\n\r\n if ((user as any)?.mfa_required) {\r\n return {\r\n ...token,\r\n mfa_required: true,\r\n mfa_token: (user as any).mfa_token,\r\n email: user.email\r\n }\r\n }\r\n\r\n // Check if token is still valid\r\n if (token.accessTokenExpires && Date.now() < (token.accessTokenExpires as number)) {\r\n return token\r\n }\r\n\r\n // Check account status before refresh (auto-detected statuses)\r\n if (token.status && ${nonActiveStatusCheck}) {\r\n console.warn(\"User account is not active, invalidating session\", { status: token.status })\r\n return {\r\n ...token,\r\n error: \"UserAccountInactive\",\r\n }\r\n }\r\n\r\n // Refresh token if expired\r\n if (token.refreshToken) {\r\n const refreshedToken = await refreshAccessToken(token)\r\n \r\n if (refreshedToken.error) {\r\n return refreshedToken\r\n }\r\n\r\n // Check account status after refresh (auto-detected statuses)\r\n if (refreshedToken.status && ${nonActiveStatusCheck.replace('token.status', 'refreshedToken.status')}) {\r\n console.warn(\"User account became inactive during token refresh\", { status: refreshedToken.status })\r\n return {\r\n ...refreshedToken,\r\n error: \"UserAccountInactive\",\r\n }\r\n }\r\n \r\n return refreshedToken\r\n }\r\n \r\n return token\r\n },\r\n\r\n async session({ session, token }) {\r\n if (token) {\r\n // Handle suspended accounts (auto-detected statuses)\r\n if (token.status && ${suspendedStatusCheck}) {\r\n console.warn(\"User account is suspended, forcing logout\", { status: token.status })\r\n if (typeof window !== 'undefined') {\r\n setTimeout(async () => {\r\n try {\r\n const { signOut } = await import('@/lib/auth')\r\n await signOut({ redirect: true, redirectTo: '/auth/signin' })\r\n } catch (error) {\r\n console.error('Error signing out suspended user:', error)\r\n window.location.href = '/auth/signin'\r\n }\r\n }, 0)\r\n }\r\n return null as any\r\n }\r\n\r\n // Handle token errors\r\n if ((token as any).error) {\r\n const error = (token as any).error\r\n console.warn(\"Token has error, forcing logout\", { error })\r\n \r\n if (error === \"UserAccountInactive\" && typeof window !== 'undefined') {\r\n setTimeout(async () => {\r\n try {\r\n const { signOut } = await import('@/lib/auth')\r\n await signOut({ redirect: true, redirectTo: '/auth/signin' })\r\n } catch (error) {\r\n console.error('Error signing out inactive user:', error)\r\n window.location.href = '/auth/signin'\r\n }\r\n }, 0)\r\n }\r\n \r\n return null as any\r\n }\r\n\r\n session.user.id = token.sub!\r\n session.user.role = token.role as string\r\n session.user.status = token.status as string\r\n session.user.api_key = token.api_key as string\r\n session.accessToken = token.accessToken as string\r\n session.refreshToken = token.refreshToken as string\r\n ;(session as any).sessionId = token.sessionId as string\r\n ;(session as any).mfa_verified = token.mfa_verified as boolean\r\n ;(session as any).auth_method = token.auth_method as string\r\n }\r\n\r\n return session\r\n },\r\n\r\n async signIn({ user, account, profile, email, credentials }) {\r\n ${hasGoogle || hasGitHub ? `if (account?.provider === \"google\" || account?.provider === \"github\") {\r\n try {\r\n const res = await fetch(\\`\\${${apiUrl}}${oauthCallbackPath.replace('/api/v1', '')}\\`, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({\r\n provider: account.provider,\r\n access_token: account.access_token,\r\n refresh_token: account.refresh_token,\r\n profile: profile,\r\n email: email\r\n }),\r\n })\r\n\r\n if (res.ok) {\r\n const data = await res.json()\r\n \r\n if (data.user && data.user.status === \"suspended\") {\r\n console.error(\"OAuth sign-in rejected: Account is suspended\", { status: data.user.status })\r\n return false\r\n }\r\n \r\n user.id = data.user.id\r\n user.role = data.user.role\r\n user.status = data.user.status\r\n user.api_key = data.user.api_key\r\n ;(user as any).accessToken = data.access_token\r\n ;(user as any).refreshToken = data.refresh_token\r\n ;(user as any).sessionId = data.session_id\r\n ;(user as any).auth_method = \"oauth\"\r\n\r\n return true\r\n } else {\r\n const errorData = await res.json().catch(() => ({}))\r\n console.error(\"OAuth callback error:\", errorData)\r\n if (res.status === 403 || errorData.detail?.includes(\"suspended\")) {\r\n return false\r\n }\r\n return false\r\n }\r\n } catch (error) {\r\n console.error(\"OAuth callback error:\", error)\r\n return false\r\n }\r\n }` : ''}\r\n\r\n return true\r\n },\r\n },\r\n\r\n pages: {\r\n signIn: '/auth/signin',\r\n error: '/auth/error',\r\n },\r\n\r\n session: {\r\n strategy: \"${sessionStrategy}\",\r\n maxAge: ${sessionMaxAge},\r\n },\r\n\r\n jwt: {\r\n maxAge: ${jwtMaxAge},\r\n },\r\n\r\n events: {\r\n async signIn({ user, account, profile, isNewUser }) {\r\n // Handle sign-in events\r\n },\r\n async signOut() {\r\n // Handle sign-out events\r\n },\r\n },\r\n\r\n debug: process.env.NODE_ENV === \"development\",\r\n}\r\n\r\n/**\r\n * Refresh access token with account status checking\r\n */\r\nasync function refreshAccessToken(token: any) {\r\n try {\r\n if (!token.refreshToken) {\r\n console.warn(\"No refresh token available - user needs to re-authenticate\")\r\n return {\r\n ...token,\r\n error: \"RefreshAccessTokenError\",\r\n }\r\n }\r\n\r\n const response = await fetch(\\`\\${${apiUrl}}${refreshPath.replace('/api/v1', '')}\\`, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({\r\n refresh_token: token.refreshToken,\r\n }),\r\n })\r\n\r\n const refreshedTokens = await response.json()\r\n\r\n if (!response.ok) {\r\n console.warn(\"Token refresh failed:\", refreshedTokens)\r\n \r\n if (response.status === 401 || response.status === 403 || refreshedTokens.detail?.includes(\"suspended\")) { \r\n return {\r\n ...token,\r\n error: \"UserAccountSuspended\",\r\n }\r\n }\r\n \r\n return {\r\n ...token,\r\n error: \"RefreshAccessTokenError\",\r\n }\r\n }\r\n\r\n const updatedToken: any = {\r\n ...token,\r\n accessToken: refreshedTokens.access_token,\r\n accessTokenExpires: Date.now() + (refreshedTokens.expires_in || ${jwtMaxAge}) * 1000,\r\n refreshToken: refreshedTokens.refresh_token ?? token.refreshToken,\r\n }\r\n\r\n // Update account status if provided\r\n if (refreshedTokens.user?.status) {\r\n updatedToken.status = refreshedTokens.user.status\r\n }\r\n\r\n return updatedToken\r\n } catch (error) {\r\n console.warn(\"Error refreshing access token:\", error)\r\n\r\n return {\r\n ...token,\r\n error: \"RefreshAccessTokenError\",\r\n }\r\n }\r\n}\r\n\r\nexport const { handlers, auth, signIn, signOut } = NextAuth(config)\r\n\r\n${hasPasskeys ? `/**\r\n * Passkey authentication utility\r\n */\r\nexport async function authenticateWithPasskey(email?: string) {\r\n try {\r\n if (!window.PublicKeyCredential) {\r\n throw new Error('WebAuthn is not supported in this browser')\r\n }\r\n\r\n const challengeResponse = await fetch(\\`\\${${apiUrl}}${passkeyChallengePath.replace('/api/v1', '')}\\`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n email: email\r\n }),\r\n })\r\n\r\n if (!challengeResponse.ok) {\r\n const error = await challengeResponse.json()\r\n throw new Error(error.detail || 'Failed to get passkey challenge')\r\n }\r\n\r\n const challengeData = await challengeResponse.json()\r\n\r\n const credentialRequestOptions: CredentialRequestOptions = {\r\n publicKey: {\r\n challenge: new Uint8Array(challengeData.challenge),\r\n allowCredentials: challengeData.allowCredentials || [],\r\n timeout: ${authConfig.passkeys?.timeout || 60000},\r\n userVerification: '${authConfig.passkeys?.requireUserVerification ? 'required' : 'preferred'}'\r\n }\r\n }\r\n\r\n const credential = await navigator.credentials.get(credentialRequestOptions)\r\n \r\n if (!credential) {\r\n throw new Error('No credential returned')\r\n }\r\n\r\n const response = await fetch(\\`\\${${apiUrl}}${passkeyAuthenticatePath.replace('/api/v1', '')}\\`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n credential: credential,\r\n email: email\r\n }),\r\n })\r\n\r\n if (!response.ok) {\r\n const error = await response.json()\r\n throw new Error(error.detail || 'Passkey authentication failed')\r\n }\r\n\r\n const data = await response.json()\r\n return data\r\n } catch (error) {\r\n console.error('Passkey authentication error:', error)\r\n throw error\r\n }\r\n}` : ''}\r\n`;\r\n\r\n return {\r\n path: 'lib/auth.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: [\r\n 'User',\r\n 'Session',\r\n 'handlers',\r\n 'auth',\r\n 'signIn',\r\n 'signOut',\r\n ...(hasPasskeys ? ['authenticateWithPasskey'] : []),\r\n ],\r\n imports: [\r\n 'next-auth',\r\n ...(hasGoogle ? ['next-auth/providers/google'] : []),\r\n ...(hasGitHub ? ['next-auth/providers/github'] : []),\r\n ],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n\r\n private generateAuthTypes(authEndpoints: any, accountStatusPatterns: {\r\n activeStatuses: string[];\r\n inactiveStatuses: string[];\r\n suspendedStatuses: string[];\r\n lockedStatuses: string[];\r\n }): GeneratedFile {\r\n const content = `/**\r\n * Authentication Types\r\n * Auto-generated by Mulink\r\n */\r\n\r\nexport interface AuthError {\r\n message: string\r\n code: string\r\n status?: number\r\n}\r\n\r\nexport class AuthError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly code: string,\r\n public readonly status?: number\r\n ) {\r\n super(message)\r\n this.name = \"AuthError\"\r\n }\r\n}\r\n\r\nexport class TokenExpiredError extends AuthError {\r\n constructor() {\r\n super(\"Token has expired\", \"TOKEN_EXPIRED\", 401)\r\n }\r\n}\r\n\r\nexport class InvalidCredentialsError extends AuthError {\r\n constructor() {\r\n super(\"Invalid credentials\", \"INVALID_CREDENTIALS\", 401)\r\n }\r\n}\r\n\r\nexport class AccountLockedError extends AuthError {\r\n constructor() {\r\n super(\"Account is locked\", \"ACCOUNT_LOCKED\", 423)\r\n }\r\n}\r\n\r\nexport class AccountSuspendedError extends AuthError {\r\n constructor() {\r\n super(\"Account is suspended\", \"ACCOUNT_SUSPENDED\", 403)\r\n }\r\n}\r\n\r\nexport class AccountInactiveError extends AuthError {\r\n constructor() {\r\n super(\"Account is not active\", \"ACCOUNT_INACTIVE\", 403)\r\n }\r\n}\r\n`;\r\n\r\n return {\r\n path: 'lib/auth-types.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: [\r\n 'AuthError',\r\n 'TokenExpiredError',\r\n 'InvalidCredentialsError',\r\n 'AccountLockedError',\r\n 'AccountSuspendedError',\r\n 'AccountInactiveError',\r\n ],\r\n imports: [],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n\r\n private generateAuthUtils(authEndpoints: any): GeneratedFile {\r\n const content = `/**\r\n * Authentication Utilities\r\n * Auto-generated by Mulink\r\n */\r\n\r\nimport { auth } from './auth'\r\n\r\n/**\r\n * Get current session\r\n */\r\nexport async function getSession() {\r\n return await auth()\r\n}\r\n\r\n/**\r\n * Get access token from session\r\n */\r\nexport async function getAccessToken(): Promise<string | null> {\r\n const session = await auth()\r\n return (session as any)?.accessToken || null\r\n}\r\n\r\n/**\r\n * Check if user is authenticated\r\n */\r\nexport async function isAuthenticated(): Promise<boolean> {\r\n const session = await auth()\r\n return !!session\r\n}\r\n\r\n/**\r\n * Require authentication (throws if not authenticated)\r\n */\r\nexport async function requireAuth() {\r\n const session = await auth()\r\n if (!session) {\r\n throw new Error('Authentication required')\r\n }\r\n return session\r\n}\r\n`;\r\n\r\n return {\r\n path: 'lib/auth-utils.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: ['getSession', 'getAccessToken', 'isAuthenticated', 'requireAuth'],\r\n imports: ['./auth'],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n\r\n private generatePasskeyUtils(passkeyEndpoints: any): GeneratedFile {\r\n const content = `/**\r\n * Passkey (WebAuthn) Utilities\r\n * Auto-generated by Mulink\r\n */\r\n\r\n/**\r\n * Check if passkeys are supported\r\n */\r\nexport function isPasskeySupported(): boolean {\r\n if (typeof window === 'undefined') {\r\n return false\r\n }\r\n return !!window.PublicKeyCredential\r\n}\r\n\r\n/**\r\n * Check if platform authenticator is available\r\n */\r\nexport async function isPlatformAuthenticatorAvailable(): Promise<boolean> {\r\n if (!isPasskeySupported()) {\r\n return false\r\n }\r\n \r\n try {\r\n return await window.PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable()\r\n } catch {\r\n return false\r\n }\r\n}\r\n`;\r\n\r\n return {\r\n path: 'lib/passkey-utils.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: ['isPasskeySupported', 'isPlatformAuthenticatorAvailable'],\r\n imports: [],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n}\r\n\r\n","import type { BridgeConfiguration, GenerationContext, GeneratedFile } from '@/core/types';\r\n\r\nexport class MiddlewareGenerator {\r\n constructor(private readonly configuration: BridgeConfiguration) {}\r\n\r\n private buildImportPath(relativePath: string): string {\r\n const outputDirectory = this.configuration.outputDir || 'generated';\r\n const cleanPath = relativePath.startsWith('/') ? relativePath.slice(1) : relativePath;\r\n\r\n let importBasePath = outputDirectory;\r\n if (importBasePath.startsWith('src/')) {\r\n importBasePath = importBasePath.substring(4);\r\n }\r\n\r\n return `@/${importBasePath}/${cleanPath}`;\r\n }\r\n\r\n async generate(context: GenerationContext): Promise<GeneratedFile[]> {\r\n const files: GeneratedFile[] = [];\r\n\r\n // Generate main middleware\r\n files.push(this.generateMainMiddleware());\r\n\r\n // Generate rate limiting middleware\r\n files.push(this.generateRateLimitMiddleware());\r\n\r\n // Generate CORS middleware\r\n files.push(this.generateCorsMiddleware());\r\n\r\n // Generate security headers middleware\r\n files.push(this.generateSecurityMiddleware());\r\n\r\n // Generate logging middleware\r\n files.push(this.generateLoggingMiddleware());\r\n\r\n // Generate API middleware\r\n files.push(this.generateApiMiddleware());\r\n\r\n return files;\r\n }\r\n\r\n private generateMainMiddleware(): GeneratedFile {\r\n const authImport = this.buildImportPath('auth/middleware');\r\n\r\n const content = `import { NextResponse } from \"next/server\"\r\nimport type { NextRequest } from \"next/server\"\r\nimport { authMiddleware } from \"${authImport}\"\r\nimport { rateLimitMiddleware } from \"./rate-limit\"\r\nimport { corsMiddleware } from \"./cors\"\r\nimport { securityMiddleware } from \"./security\"\r\nimport { loggingMiddleware } from \"./logging\"\r\n\r\nexport async function middleware(request: NextRequest) {\r\n // Apply logging middleware first\r\n const loggingResponse = await loggingMiddleware(request)\r\n if (loggingResponse) return loggingResponse\r\n\r\n // Apply security headers\r\n const securityResponse = await securityMiddleware(request)\r\n if (securityResponse) return securityResponse\r\n\r\n // Apply CORS for API routes\r\n if (request.nextUrl.pathname.startsWith(\"/api\")) {\r\n const corsResponse = await corsMiddleware(request)\r\n if (corsResponse) return corsResponse\r\n }\r\n\r\n // Apply rate limiting\r\n const rateLimitResponse = await rateLimitMiddleware(request)\r\n if (rateLimitResponse) return rateLimitResponse\r\n\r\n // Apply authentication middleware\r\n const authResponse = await authMiddleware(request)\r\n if (authResponse) return authResponse\r\n\r\n return NextResponse.next()\r\n}\r\n\r\nexport const config = {\r\n matcher: [\r\n /*\r\n * Match all request paths except for the ones starting with:\r\n * - api (API routes)\r\n * - _next/static (static files)\r\n * - _next/image (image optimization files)\r\n * - favicon.ico (favicon file)\r\n */\r\n \"/((?!_next/static|_next/image|favicon.ico).*)\",\r\n ],\r\n}`;\r\n\r\n return {\r\n path: 'middleware/index.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: ['middleware', 'config'],\r\n imports: ['next/server'],\r\n dependencies: [authImport, './rate-limit', './cors', './security', './logging'],\r\n },\r\n };\r\n }\r\n\r\n private generateRateLimitMiddleware(): GeneratedFile {\r\n const content = `import { NextResponse } from \"next/server\"\r\nimport type { NextRequest } from \"next/server\"\r\nimport { Ratelimit } from \"@upstash/ratelimit\"\r\nimport { Redis } from \"@upstash/redis\"\r\n\r\n// Create a new ratelimiter, that allows 10 requests per 10 seconds\r\nconst ratelimit = new Ratelimit({\r\n redis: Redis.fromEnv(),\r\n limiter: Ratelimit.slidingWindow(10, \"10 s\"),\r\n analytics: true,\r\n})\r\n\r\n// Rate limiting configuration for different routes\r\nconst rateLimitConfig = {\r\n \"/api/auth\": { requests: 5, window: \"1 m\" },\r\n \"/api/upload\": { requests: 3, window: \"1 m\" },\r\n \"/api\": { requests: 100, window: \"1 m\" },\r\n default: { requests: 60, window: \"1 m\" },\r\n}\r\n\r\nexport async function rateLimitMiddleware(request: NextRequest) {\r\n // Skip rate limiting in development\r\n if (process.env.NODE_ENV === \"development\") {\r\n return null\r\n }\r\n\r\n const ip = request.ip ?? \"127.0.0.1\"\r\n const pathname = request.nextUrl.pathname\r\n\r\n // Find the most specific rate limit config\r\n let config = rateLimitConfig.default\r\n for (const [route, routeConfig] of Object.entries(rateLimitConfig)) {\r\n if (route !== \"default\" && pathname.startsWith(route)) {\r\n config = routeConfig\r\n break\r\n }\r\n }\r\n\r\n try {\r\n const { success, limit, reset, remaining } = await ratelimit.limit(\r\n \\`\\${pathname}_\\${ip}\\`\r\n )\r\n\r\n if (!success) {\r\n return new NextResponse(\"Too Many Requests\", {\r\n status: 429,\r\n headers: {\r\n \"X-RateLimit-Limit\": limit.toString(),\r\n \"X-RateLimit-Remaining\": remaining.toString(),\r\n \"X-RateLimit-Reset\": new Date(reset).toISOString(),\r\n \"Retry-After\": Math.round((reset - Date.now()) / 1000).toString(),\r\n },\r\n })\r\n }\r\n\r\n // Add rate limit headers to successful responses\r\n const response = NextResponse.next()\r\n response.headers.set(\"X-RateLimit-Limit\", limit.toString())\r\n response.headers.set(\"X-RateLimit-Remaining\", remaining.toString())\r\n response.headers.set(\"X-RateLimit-Reset\", new Date(reset).toISOString())\r\n\r\n return response\r\n } catch (error) {\r\n console.error(\"Rate limiting error:\", error)\r\n // Continue without rate limiting if there's an error\r\n return null\r\n }\r\n}`;\r\n\r\n return {\r\n path: 'middleware/rate-limit.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: ['rateLimitMiddleware'],\r\n imports: ['next/server', '@upstash/ratelimit', '@upstash/redis'],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n\r\n private generateCorsMiddleware(): GeneratedFile {\r\n const content = `import { NextResponse } from \"next/server\"\r\nimport type { NextRequest } from \"next/server\"\r\n\r\nconst allowedOrigins = [\r\n \"http://localhost:3000\",\r\n \"http://localhost:3001\",\r\n \"https://yourdomain.com\",\r\n // Add your production domains here\r\n]\r\n\r\nconst corsOptions = {\r\n \"Access-Control-Allow-Methods\": \"GET, POST, PUT, DELETE, OPTIONS\",\r\n \"Access-Control-Allow-Headers\": \"Content-Type, Authorization, X-Requested-With\",\r\n \"Access-Control-Max-Age\": \"86400\", // 24 hours\r\n}\r\n\r\nexport async function corsMiddleware(request: NextRequest) {\r\n // Handle preflight requests\r\n if (request.method === \"OPTIONS\") {\r\n const origin = request.headers.get(\"origin\")\r\n const isAllowedOrigin = !origin || allowedOrigins.includes(origin)\r\n\r\n if (isAllowedOrigin) {\r\n return new NextResponse(null, {\r\n status: 200,\r\n headers: {\r\n ...corsOptions,\r\n \"Access-Control-Allow-Origin\": origin || \"*\",\r\n },\r\n })\r\n }\r\n\r\n return new NextResponse(null, { status: 403 })\r\n }\r\n\r\n // Handle actual requests\r\n const origin = request.headers.get(\"origin\")\r\n const isAllowedOrigin = !origin || allowedOrigins.includes(origin)\r\n\r\n if (!isAllowedOrigin) {\r\n return new NextResponse(\"CORS: Origin not allowed\", { status: 403 })\r\n }\r\n\r\n // Add CORS headers to the response\r\n const response = NextResponse.next()\r\n response.headers.set(\"Access-Control-Allow-Origin\", origin || \"*\")\r\n response.headers.set(\"Access-Control-Allow-Methods\", corsOptions[\"Access-Control-Allow-Methods\"])\r\n response.headers.set(\"Access-Control-Allow-Headers\", corsOptions[\"Access-Control-Allow-Headers\"])\r\n\r\n return response\r\n}`;\r\n\r\n return {\r\n path: 'middleware/cors.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: ['corsMiddleware'],\r\n imports: ['next/server'],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n\r\n private generateSecurityMiddleware(): GeneratedFile {\r\n const content = `import { NextResponse } from \"next/server\"\r\nimport type { NextRequest } from \"next/server\"\r\n\r\nexport async function securityMiddleware(request: NextRequest) {\r\n const response = NextResponse.next()\r\n\r\n // Security headers\r\n const securityHeaders = {\r\n // Prevent XSS attacks\r\n \"X-XSS-Protection\": \"1; mode=block\",\r\n \r\n // Prevent clickjacking\r\n \"X-Frame-Options\": \"DENY\",\r\n \r\n // Prevent MIME type sniffing\r\n \"X-Content-Type-Options\": \"nosniff\",\r\n \r\n // Referrer policy\r\n \"Referrer-Policy\": \"strict-origin-when-cross-origin\",\r\n \r\n // Content Security Policy\r\n \"Content-Security-Policy\": [\r\n \"default-src 'self'\",\r\n \"script-src 'self' 'unsafe-eval' 'unsafe-inline'\",\r\n \"style-src 'self' 'unsafe-inline'\",\r\n \"img-src 'self' data: https:\",\r\n \"font-src 'self'\",\r\n \"connect-src 'self'\",\r\n \"frame-ancestors 'none'\",\r\n ].join(\"; \"),\r\n \r\n // Strict Transport Security (HTTPS only)\r\n ...(request.nextUrl.protocol === \"https:\" && {\r\n \"Strict-Transport-Security\": \"max-age=31536000; includeSubDomains; preload\",\r\n }),\r\n \r\n // Permissions Policy\r\n \"Permissions-Policy\": [\r\n \"camera=()\",\r\n \"microphone=()\",\r\n \"geolocation=()\",\r\n \"interest-cohort=()\",\r\n ].join(\", \"),\r\n }\r\n\r\n // Apply security headers\r\n Object.entries(securityHeaders).forEach(([key, value]) => {\r\n response.headers.set(key, value)\r\n })\r\n\r\n // Remove server header\r\n response.headers.delete(\"Server\")\r\n response.headers.delete(\"X-Powered-By\")\r\n\r\n return response\r\n}`;\r\n\r\n return {\r\n path: 'middleware/security.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: ['securityMiddleware'],\r\n imports: ['next/server'],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n\r\n private generateLoggingMiddleware(): GeneratedFile {\r\n const content = `import { NextResponse } from \"next/server\"\r\nimport type { NextRequest } from \"next/server\"\r\n\r\ninterface RequestLog {\r\n method: string\r\n url: string\r\n userAgent?: string\r\n ip?: string\r\n timestamp: string\r\n duration?: number\r\n status?: number\r\n}\r\n\r\nexport async function loggingMiddleware(request: NextRequest) {\r\n const startTime = Date.now()\r\n \r\n const requestLog: RequestLog = {\r\n method: request.method,\r\n url: request.url,\r\n userAgent: request.headers.get(\"user-agent\") || undefined,\r\n ip: request.ip || request.headers.get(\"x-forwarded-for\") || undefined,\r\n timestamp: new Date().toISOString(),\r\n }\r\n\r\n // Skip logging for static files and health checks\r\n const skipLogging = [\r\n \"/_next/static\",\r\n \"/_next/image\",\r\n \"/favicon.ico\",\r\n \"/health\",\r\n \"/api/health\",\r\n ].some(path => request.nextUrl.pathname.startsWith(path))\r\n\r\n if (skipLogging) {\r\n return null\r\n }\r\n\r\n // Log the request\r\n console.log(\\`[\\${requestLog.timestamp}] \\${requestLog.method} \\${requestLog.url}\\`)\r\n\r\n // Continue with the request\r\n const response = NextResponse.next()\r\n\r\n // Log the response (in a real app, you might want to use a proper logging service)\r\n response.headers.set(\"x-request-id\", crypto.randomUUID())\r\n\r\n // You can add more sophisticated logging here, such as:\r\n // - Sending logs to external services (DataDog, LogRocket, etc.)\r\n // - Storing logs in a database\r\n // - Adding performance metrics\r\n \r\n return null // Return null to continue with other middleware\r\n}`;\r\n\r\n return {\r\n path: 'middleware/logging.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: ['loggingMiddleware'],\r\n imports: ['next/server'],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n\r\n private generateApiMiddleware(): GeneratedFile {\r\n const content = `import { NextResponse } from \"next/server\"\r\nimport type { NextRequest } from \"next/server\"\r\n\r\nexport async function apiMiddleware(request: NextRequest) {\r\n // Only apply to API routes\r\n if (!request.nextUrl.pathname.startsWith(\"/api\")) {\r\n return null\r\n }\r\n\r\n // Add API-specific headers\r\n const response = NextResponse.next()\r\n \r\n // Add API version header\r\n response.headers.set(\"X-API-Version\", \"1.0.0\")\r\n \r\n // Add request ID for tracing\r\n response.headers.set(\"X-Request-ID\", crypto.randomUUID())\r\n \r\n // Add timestamp\r\n response.headers.set(\"X-Timestamp\", new Date().toISOString())\r\n\r\n // Handle API key authentication for certain routes\r\n const protectedApiRoutes = [\"/api/admin\", \"/api/internal\"]\r\n const isProtectedRoute = protectedApiRoutes.some(route => \r\n request.nextUrl.pathname.startsWith(route)\r\n )\r\n\r\n if (isProtectedRoute) {\r\n const apiKey = request.headers.get(\"x-api-key\")\r\n const validApiKey = process.env.API_KEY\r\n\r\n if (!apiKey || apiKey !== validApiKey) {\r\n return new NextResponse(\r\n JSON.stringify({ error: \"Invalid API key\" }),\r\n {\r\n status: 401,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n }\r\n )\r\n }\r\n }\r\n\r\n return response\r\n}`;\r\n\r\n return {\r\n path: 'middleware/api.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: ['apiMiddleware'],\r\n imports: ['next/server'],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n}\r\n","import type {\r\n BridgeConfiguration,\r\n GenerationContext,\r\n GeneratedFile,\r\n ApiEndpointDefinition,\r\n} from '@/core/types';\r\nimport { toValidIdentifier, toHookName, toActionName } from '@/utils/naming-helpers';\r\nimport { SchemaAnalyzer } from '@/core/schema-analyzer';\r\n\r\nexport class UploadGenerator {\r\n private analyzer!: SchemaAnalyzer;\r\n\r\n constructor(private readonly configuration: BridgeConfiguration) {}\r\n\r\n private buildImportPath(relativePath: string): string {\r\n const outputDirectory = this.configuration.outputDir || 'generated';\r\n const cleanPath = relativePath.startsWith('/') ? relativePath.slice(1) : relativePath;\r\n let importBasePath = outputDirectory;\r\n if (importBasePath.startsWith('src/')) {\r\n importBasePath = importBasePath.substring(4);\r\n }\r\n return `@/${importBasePath}/${cleanPath}`;\r\n }\r\n\r\n async generate(context: GenerationContext): Promise<GeneratedFile[]> {\r\n const { schema } = context;\r\n const generatedFiles: GeneratedFile[] = [];\r\n\r\n // Initialize intelligent schema analyzer\r\n this.analyzer = new SchemaAnalyzer(schema);\r\n\r\n // Find endpoints with file uploads (multipart/form-data) - intelligent detection\r\n const uploadEndpoints = schema.endpoints.filter(\r\n endpoint =>\r\n endpoint.requestBody?.content?.some(\r\n content => content.type === 'multipart/form-data' || content.type === 'application/octet-stream'\r\n )\r\n );\r\n\r\n if (uploadEndpoints.length === 0 || !this.configuration.uploads?.enabled) {\r\n return generatedFiles;\r\n }\r\n\r\n // Validate presigned uploads configuration\r\n const presignedConfig = this.configuration.uploads?.presignedUploads;\r\n if (presignedConfig?.enabled) {\r\n const isPresignedSupported = this.analyzer.isPresignedUploadsSupported();\r\n if (!isPresignedSupported) {\r\n console.warn(\r\n `⚠️ Presigned uploads are enabled in config but presigned endpoint is not found in OpenAPI schema. ` +\r\n `Falling back to standard upload strategy.`\r\n );\r\n }\r\n }\r\n\r\n // Auto-extract upload configuration from schema\r\n const extractedUploadConfig = this.analyzer.extractUploadConfig();\r\n \r\n // Only enable presigned if endpoint exists\r\n const presignedEnabled = presignedConfig?.enabled && this.analyzer.isPresignedUploadsSupported();\r\n \r\n // Merge with configuration (config takes precedence, but use detected as fallback)\r\n const uploadProvider = this.configuration.uploads?.provider || \r\n (extractedUploadConfig.presignedEndpoint ? 'minio' : 'standard');\r\n const uploadStrategy = presignedEnabled ? 'presigned' : \r\n (this.configuration.uploads?.strategy || 'standard');\r\n \r\n const finalPresignedConfig = presignedEnabled ? {\r\n enabled: true,\r\n presignEndpoint: extractedUploadConfig.presignedEndpoint || presignedConfig?.presignEndpoint || '/api/v1/files/presign-upload',\r\n fallbackToBackend: presignedConfig?.fallbackToBackend !== false,\r\n } : {\r\n enabled: false,\r\n presignEndpoint: '/api/v1/files/presign-upload',\r\n fallbackToBackend: true,\r\n };\r\n \r\n const progressConfig = this.configuration.uploads?.progressTracking || {\r\n enabled: true,\r\n useXHR: true,\r\n };\r\n\r\n // Find presigned upload endpoint (intelligent detection)\r\n const presignedEndpoint = presignedEnabled \r\n ? (this.findPresignedEndpoint(schema.endpoints) || \r\n (extractedUploadConfig.presignedEndpoint ? \r\n schema.endpoints.find(e => e.path === extractedUploadConfig.presignedEndpoint) || null \r\n : null))\r\n : null;\r\n\r\n // Generate upload utilities with presigned support\r\n generatedFiles.push(this.generateUploadUtilities(uploadProvider, uploadStrategy, presignedEndpoint));\r\n\r\n // Generate useUploadFile hook\r\n generatedFiles.push(this.generateUseUploadFileHook(uploadProvider, uploadStrategy, context));\r\n\r\n // Generate upload hooks for each endpoint with presigned support\r\n for (const endpoint of uploadEndpoints) {\r\n generatedFiles.push(this.generateUploadHook(\r\n endpoint, \r\n uploadProvider, \r\n uploadStrategy, \r\n presignedEndpoint,\r\n presignedConfig,\r\n progressConfig\r\n ));\r\n }\r\n\r\n return generatedFiles;\r\n }\r\n\r\n /**\r\n * Find presigned upload endpoint in schema\r\n * Looks for endpoints with 'presign' or 'presigned' in path or operationId\r\n */\r\n private findPresignedEndpoint(endpoints: ApiEndpointDefinition[]): ApiEndpointDefinition | null {\r\n return endpoints.find(endpoint => {\r\n const pathLower = endpoint.path.toLowerCase();\r\n const operationIdLower = (endpoint.operationId || '').toLowerCase();\r\n return pathLower.includes('presign') || \r\n pathLower.includes('presigned') ||\r\n operationIdLower.includes('presign') ||\r\n operationIdLower.includes('presigned');\r\n }) || null;\r\n }\r\n\r\n private generateUploadUtilities(\r\n uploadProvider: string, \r\n uploadStrategy: string,\r\n presignedEndpoint: ApiEndpointDefinition | null\r\n ): GeneratedFile {\r\n const { uploads } = this.configuration;\r\n \r\n // Use extracted config with fallback to configuration\r\n const extractedConfig = this.analyzer.extractUploadConfig();\r\n const maxSize = uploads?.security?.maxSize || \r\n (extractedConfig.maxSize ? `${extractedConfig.maxSize}MB` : '10MB');\r\n const allowedTypes = uploads?.security?.allowedTypes || \r\n extractedConfig.allowedTypes || \r\n ['image/*', 'application/pdf'];\r\n const compressionEnabled = uploads?.compression?.enabled || false;\r\n const compressionFormats = uploads?.compression?.formats || ['gzip', 'webp'];\r\n\r\n const content = `'use client'\r\n\r\n/**\r\n * Upload configuration\r\n */\r\nexport interface UploadConfig {\r\n maxSize?: string\r\n allowedTypes?: string[]\r\n compression?: {\r\n enabled: boolean\r\n formats?: ('gzip' | 'webp' | 'brotli')[]\r\n }\r\n}\r\n\r\n/**\r\n * File validation result\r\n */\r\nexport interface FileValidationResult {\r\n valid: boolean\r\n error?: string\r\n}\r\n\r\n/**\r\n * Upload progress information\r\n */\r\nexport interface UploadProgress {\r\n loaded: number\r\n total: number\r\n percentage: number\r\n}\r\n\r\n/**\r\n * Validate file before upload\r\n */\r\nexport function validateFile(file: File, config?: UploadConfig): FileValidationResult {\r\n const maxSizeBytes = parseSize(config?.maxSize || '${maxSize}')\r\n const allowedTypes = config?.allowedTypes || ${JSON.stringify(allowedTypes)}\r\n\r\n // Check file size\r\n if (file.size > maxSizeBytes) {\r\n return {\r\n valid: false,\r\n error: \\`File size exceeds maximum allowed size of \\${config?.maxSize || '${maxSize}'}\\`\r\n }\r\n }\r\n\r\n // Check file type\r\n const isAllowed = allowedTypes.some(type => {\r\n if (type.endsWith('/*')) {\r\n const baseType = type.split('/')[0]\r\n return file.type.startsWith(baseType + '/')\r\n }\r\n return file.type === type\r\n })\r\n\r\n if (!isAllowed) {\r\n return {\r\n valid: false,\r\n error: \\`File type \\${file.type} is not allowed. Allowed types: \\${allowedTypes.join(', ')}\\`\r\n }\r\n }\r\n\r\n return { valid: true }\r\n}\r\n\r\n/**\r\n * Parse size string to bytes (e.g., \"10MB\" -> 10485760)\r\n */\r\nfunction parseSize(size: string): number {\r\n const units: Record<string, number> = {\r\n B: 1,\r\n KB: 1024,\r\n MB: 1024 * 1024,\r\n GB: 1024 * 1024 * 1024,\r\n }\r\n\r\n const match = size.match(/^(\\\\d+)([A-Z]+)$/i)\r\n if (!match) return 0\r\n\r\n const value = parseInt(match[1], 10)\r\n const unit = match[2].toUpperCase()\r\n return value * (units[unit] || 1)\r\n}\r\n\r\n/**\r\n * Compress file if enabled\r\n */\r\nexport async function compressFile(\r\n file: File,\r\n formats: ('gzip' | 'webp' | 'brotli')[] = ${JSON.stringify(compressionFormats)}\r\n): Promise<File> {\r\n ${compressionEnabled ? `\r\n // WebP compression for images\r\n if (formats.includes('webp') && file.type.startsWith('image/')) {\r\n try {\r\n const compressed = await compressImageToWebP(file)\r\n return compressed\r\n } catch (error) {\r\n console.warn('WebP compression failed, using original file:', error)\r\n return file\r\n }\r\n }\r\n ` : '// Compression disabled'}\r\n \r\n return file\r\n}\r\n\r\n/**\r\n * Compress image to WebP format\r\n */\r\nasync function compressImageToWebP(file: File): Promise<File> {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n reader.onload = (e) => {\r\n const img = new Image()\r\n img.onload = () => {\r\n const canvas = document.createElement('canvas')\r\n canvas.width = img.width\r\n canvas.height = img.height\r\n const ctx = canvas.getContext('2d')\r\n if (!ctx) {\r\n reject(new Error('Failed to get canvas context'))\r\n return\r\n }\r\n ctx.drawImage(img, 0, 0)\r\n canvas.toBlob(\r\n (blob) => {\r\n if (blob) {\r\n const compressedFile = new File([blob], file.name.replace(/\\\\.[^.]+$/, '.webp'), {\r\n type: 'image/webp',\r\n lastModified: Date.now(),\r\n })\r\n resolve(compressedFile)\r\n } else {\r\n reject(new Error('Compression failed'))\r\n }\r\n },\r\n 'image/webp',\r\n 0.8 // 80% quality\r\n )\r\n }\r\n img.onerror = reject\r\n img.src = e.target?.result as string\r\n }\r\n reader.onerror = reject\r\n reader.readAsDataURL(file)\r\n })\r\n}\r\n\r\n/**\r\n * Create FormData with file and additional fields\r\n */\r\nexport function createUploadFormData(\r\n file: File,\r\n additionalFields?: Record<string, string | number | boolean>\r\n): FormData {\r\n const formData = new FormData()\r\n formData.append('file', file)\r\n \r\n if (additionalFields) {\r\n Object.entries(additionalFields).forEach(([key, value]) => {\r\n formData.append(key, String(value))\r\n })\r\n }\r\n \r\n return formData\r\n}\r\n`;\r\n\r\n return {\r\n path: 'services/uploadUtils.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: [\r\n 'validateFile',\r\n 'compressFile',\r\n 'createUploadFormData',\r\n 'UploadConfig',\r\n 'FileValidationResult',\r\n 'UploadProgress',\r\n ],\r\n imports: [],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n\r\n private generateUploadHook(\r\n endpoint: ApiEndpointDefinition, \r\n uploadProvider: string, \r\n uploadStrategy: string,\r\n presignedEndpoint: ApiEndpointDefinition | null,\r\n presignedConfig?: { enabled?: boolean; presignEndpoint?: string; fallbackToBackend?: boolean },\r\n progressConfig?: { enabled?: boolean; useXHR?: boolean }\r\n ): GeneratedFile {\r\n const operationId = endpoint.operationId || endpoint.id;\r\n const hookName = toHookName(operationId, false);\r\n const operationName = this.getOperationName(endpoint);\r\n const actionName = toActionName(operationId);\r\n const actionsImport = this.buildImportPath('actions');\r\n const schemasImport = this.buildImportPath('schemas');\r\n const uploadUtilsImport = this.buildImportPath('services/uploadUtils');\r\n \r\n // Check if presigned uploads are enabled\r\n const presignedEnabled = presignedConfig?.enabled !== false && presignedEndpoint !== null;\r\n const fallbackEnabled = presignedConfig?.fallbackToBackend !== false;\r\n const progressEnabled = progressConfig?.enabled !== false;\r\n const useXHR = progressConfig?.useXHR !== false;\r\n \r\n // Get presigned action name if available\r\n const presignedActionName = presignedEndpoint ? toActionName(presignedEndpoint.operationId || presignedEndpoint.id) : null;\r\n const presignedOperationName = presignedEndpoint ? this.getOperationName(presignedEndpoint) : null;\r\n \r\n // Check if endpoint has parameters\r\n const paramsSchemaName = endpoint.parameters.length > 0 ? `${operationName}ParamsSchema` : null;\r\n\r\n // Build imports\r\n const imports = [\r\n `'use client'`,\r\n ``,\r\n `import { useMutation, useQueryClient } from '@tanstack/react-query'`,\r\n `import { toast } from 'sonner'`,\r\n `import { ${actionName} } from '${actionsImport}'`,\r\n presignedEnabled && presignedActionName ? `import { ${presignedActionName} } from '${actionsImport}'` : null,\r\n `import { validateFile, compressFile, createUploadFormData, type UploadConfig } from '${uploadUtilsImport}'`,\r\n `import type { z } from 'zod'`,\r\n `import type { ${operationName}RequestSchema, ${operationName}ResponseSchema${paramsSchemaName ? `, ${paramsSchemaName}` : ''} } from '${schemasImport}'`,\r\n presignedEnabled && presignedOperationName ? `import type { ${presignedOperationName}RequestSchema, ${presignedOperationName}ResponseSchema } from '${schemasImport}'` : null,\r\n ].filter(Boolean).join('\\n');\r\n\r\n // Build helper functions for presigned upload\r\n const presignedHelpers = presignedEnabled ? `\r\n/**\r\n * Extract S3 error message from XML response\r\n */\r\nfunction extractS3ErrorMessage(payload: string | null): string | null {\r\n if (!payload) return null\r\n try {\r\n const parser = new DOMParser()\r\n const doc = parser.parseFromString(payload, \"application/xml\")\r\n const message = doc.querySelector(\"Message\")?.textContent\r\n return message || null\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Upload file directly to S3/MinIO using presigned URL\r\n */\r\nasync function uploadToS3(\r\n file: File,\r\n presignedData: {\r\n upload_url: string\r\n fields: Record<string, string>\r\n key: string\r\n },\r\n onProgress?: (progress: { loaded: number; total: number; percentage: number }) => void\r\n): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const formData = new FormData()\r\n \r\n // Add all presigned fields\r\n Object.entries(presignedData.fields).forEach(([key, value]) => {\r\n formData.append(key, value)\r\n })\r\n \r\n // Add file last (required by S3)\r\n formData.append('file', file)\r\n \r\n const xhr = new XMLHttpRequest()\r\n \r\n // Track upload progress\r\n xhr.upload.addEventListener('progress', (e) => {\r\n if (e.lengthComputable && onProgress) {\r\n const percentage = Math.round((e.loaded / e.total) * 100)\r\n onProgress({\r\n loaded: e.loaded,\r\n total: e.total,\r\n percentage,\r\n })\r\n }\r\n })\r\n \r\n xhr.addEventListener('load', () => {\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n resolve()\r\n } else {\r\n const parsedMessage = extractS3ErrorMessage(xhr.responseText)\r\n const statusMessage = xhr.statusText || 'Upload failed'\r\n reject(new Error(parsedMessage || \\`Upload to S3 failed (\\${xhr.status} \\${statusMessage})\\`))\r\n }\r\n })\r\n \r\n xhr.addEventListener('error', () => {\r\n reject(new Error('Upload to S3 failed'))\r\n })\r\n \r\n xhr.addEventListener('abort', () => {\r\n reject(new Error('Upload to S3 aborted'))\r\n })\r\n \r\n xhr.open('POST', presignedData.upload_url)\r\n xhr.send(formData)\r\n })\r\n}\r\n` : '';\r\n\r\n // Build helper function for backend upload with progress tracking\r\n // This function is needed for both presigned fallback and standard uploads with progress\r\n // Generate it if: (progress enabled AND useXHR) OR (presigned enabled AND fallback enabled)\r\n const needsBackendHelper = (progressEnabled && useXHR) || (presignedEnabled && fallbackEnabled);\r\n const backendUploadHelper = needsBackendHelper ? `\r\n/**\r\n * Upload via backend API with progress tracking\r\n * Uses XMLHttpRequest for progress tracking support\r\n */\r\nasync function uploadViaBackendApi(\r\n formData: FormData,\r\n onProgress?: (progress: { loaded: number; total: number; percentage: number }) => void\r\n): Promise<z.infer<typeof ${operationName}ResponseSchema>> {\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest()\r\n\r\n if (onProgress) {\r\n xhr.upload.addEventListener('progress', (event) => {\r\n if (event.lengthComputable) {\r\n const percentage = Math.round((event.loaded / event.total) * 100)\r\n onProgress({\r\n loaded: event.loaded,\r\n total: event.total,\r\n percentage,\r\n })\r\n }\r\n })\r\n }\r\n\r\n xhr.addEventListener('load', () => {\r\n const responseBody = xhr.response ?? xhr.responseText\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n try {\r\n const data = typeof responseBody === 'string' ? JSON.parse(responseBody) : responseBody\r\n resolve(data)\r\n } catch (error) {\r\n reject(new Error('Failed to parse response'))\r\n }\r\n } else {\r\n const detail =\r\n typeof responseBody === 'object' && responseBody !== null && 'detail' in responseBody\r\n ? (responseBody as { detail?: string }).detail\r\n : undefined\r\n reject(new Error(detail || xhr.statusText || 'Upload failed'))\r\n }\r\n })\r\n\r\n xhr.addEventListener('error', () => {\r\n reject(new Error('Network error while uploading to backend'))\r\n })\r\n\r\n xhr.addEventListener('abort', () => {\r\n reject(new Error('Backend upload aborted'))\r\n })\r\n\r\n xhr.responseType = 'json'\r\n // Use base URL from environment or configuration\r\n const baseUrl = typeof window !== 'undefined' \r\n ? (process.env.NEXT_PUBLIC_API_URL || '${this.configuration.api?.baseUrl || 'http://localhost:8000'}')\r\n : '${this.configuration.api?.baseUrl || 'http://localhost:8000'}'\r\n xhr.open('POST', \\`\\${baseUrl}${endpoint.path}\\`)\r\n xhr.send(formData)\r\n })\r\n}\r\n` : '';\r\n\r\n // Build upload logic\r\n const uploadLogic = presignedEnabled ? `\r\n let fileKey: string | null = null\r\n let directUploadAttempted = false\r\n let lastDirectUploadError: Error | null = null\r\n\r\n const payload: Record<string, string | number | boolean> = {\r\n original_filename: processedFile.name,\r\n uploaded_file_size: processedFile.size,\r\n uploaded_content_type: processedFile.type,\r\n }\r\n\r\n if (additionalFields) {\r\n Object.entries(additionalFields).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n payload[key] = value\r\n }\r\n })\r\n }\r\n \r\n try {\r\n // Try presigned upload first\r\n directUploadAttempted = true\r\n if (options?.onProgress) {\r\n options.onProgress({ loaded: 0, total: 100, percentage: 0 })\r\n }\r\n \r\n try {\r\n const presignedResponse = await ${presignedActionName}({\r\n filename: processedFile.name,\r\n content_type: processedFile.type,\r\n file_size: processedFile.size,\r\n folder: 'uploads',\r\n expires_in: 600\r\n })\r\n \r\n if (!presignedResponse?.data || !presignedResponse.data.upload_url) {\r\n throw new Error('Failed to get presigned upload URL')\r\n }\r\n \r\n await uploadToS3(\r\n processedFile,\r\n {\r\n upload_url: presignedResponse.data.upload_url,\r\n fields: presignedResponse.data.fields,\r\n key: presignedResponse.data.key\r\n },\r\n options?.onProgress\r\n )\r\n \r\n fileKey = presignedResponse.data.key\r\n } catch (error) {\r\n const normalizedError = error instanceof Error ? error : new Error('Direct upload failed')\r\n lastDirectUploadError = normalizedError\r\n console.warn('[upload] Direct upload failed, falling back to backend upload', normalizedError)\r\n } finally {\r\n if (!fileKey && options?.onProgress) {\r\n options.onProgress({ loaded: 0, total: 0, percentage: 0 })\r\n }\r\n }\r\n \r\n if (fileKey) {\r\n const response = await ${actionName}({\r\n ...payload,\r\n file_key: fileKey,\r\n } as any)\r\n \r\n if (!response?.data) {\r\n throw new Error('Failed to get response')\r\n }\r\n \r\n if (options?.onProgress && directUploadAttempted) {\r\n options.onProgress({ loaded: 0, total: 0, percentage: 0 })\r\n }\r\n \r\n return response.data\r\n }\r\n\r\n ${fallbackEnabled ? `if (lastDirectUploadError) {\r\n console.warn('[upload] Switching to backend upload after direct upload failure', lastDirectUploadError)\r\n }\r\n\r\n const formData = createUploadFormData(processedFile, additionalFields)\r\n Object.entries(payload).forEach(([key, value]) => {\r\n if (typeof value === 'object') {\r\n formData.append(key, JSON.stringify(value))\r\n } else {\r\n formData.append(key, String(value))\r\n }\r\n })\r\n\r\n const backendResponse = await uploadViaBackendApi(formData, options?.onProgress)\r\n if (options?.onProgress) {\r\n options.onProgress({ loaded: 0, total: 0, percentage: 0 })\r\n }\r\n return backendResponse` : `throw lastDirectUploadError || new Error('Presigned upload failed and fallback is disabled')`}\r\n } catch (error) {\r\n if (!fileKey && lastDirectUploadError) {\r\n console.warn('[upload] Upload failed after falling back from direct upload', lastDirectUploadError)\r\n }\r\n if (options?.onProgress) {\r\n options.onProgress({ loaded: 0, total: 0, percentage: 0 })\r\n }\r\n throw error instanceof Error ? error : new Error('Upload failed')\r\n }` : `\r\n // Standard backend upload\r\n const formData = createUploadFormData(processedFile, additionalFields)\r\n \r\n ${(progressEnabled && useXHR) ? `return await uploadViaBackendApi(formData, options?.onProgress)` : `\r\n // Use server action for upload\r\n const response = await ${actionName}(formData as any)\r\n return response`}\r\n `;\r\n \r\n const content = `${imports}\r\n${presignedHelpers}\r\n${backendUploadHelper || ''}\r\n\r\ntype ActionResultLike<T> = {\r\n data?: T\r\n serverError?: unknown\r\n validationErrors?: unknown\r\n}\r\n\r\nasync function resolveActionResult<T>(actionPromise: Promise<any>): Promise<T> {\r\n const result = await actionPromise\r\n if (result && typeof result === 'object') {\r\n const actionResult = result as ActionResultLike<T>\r\n if (actionResult.serverError) {\r\n const message = typeof actionResult.serverError === 'string' ? actionResult.serverError : 'Server action failed'\r\n throw new Error(message)\r\n }\r\n if (actionResult.validationErrors) {\r\n throw new Error('Validation failed, please check your input')\r\n }\r\n if (typeof actionResult.data !== 'undefined') {\r\n return actionResult.data as T\r\n }\r\n }\r\n return result as T\r\n}\r\n\r\n/**\r\n * Upload hook for ${endpoint.method} ${endpoint.path}\r\n * Features: ${presignedEnabled ? 'Presigned URL upload (direct to S3/MinIO), ' : ''}File validation, compression, progress tracking\r\n * \r\n * Best Practice: ${presignedEnabled ? 'Uses presigned URLs for direct uploads to S3/MinIO, reducing backend load' : 'Standard FormData upload with progress tracking'}\r\n */\r\nexport type ${operationName}UploadInput = {\r\n ${endpoint.path.includes('multiple') ? 'files: File[]' : 'file: File'}\r\n additionalFields?: Record<string, string | number | boolean>\r\n ${paramsSchemaName ? 'folder?: string' : ''}\r\n}\r\n\r\n${presignedEnabled && !fallbackEnabled ? `const directUploadsEnabled = process.env.NEXT_PUBLIC_ENABLE_DIRECT_UPLOADS !== \"false\"` : ''}\r\n\r\nexport function ${hookName}Upload(options?: {\r\n onSuccess?: (data: z.infer<typeof ${operationName}ResponseSchema>) => void\r\n onError?: (error: Error) => void\r\n onProgress?: (progress: { loaded: number; total: number; percentage: number }) => void\r\n uploadConfig?: UploadConfig\r\n}) {\r\n const queryClient = useQueryClient()\r\n\r\n return useMutation<z.infer<typeof ${operationName}ResponseSchema>, Error, ${operationName}UploadInput>({\r\n mutationFn: async ({ ${endpoint.path.includes('multiple') ? 'files' : 'file'}, additionalFields, ${paramsSchemaName ? 'folder' : ''} }: ${operationName}UploadInput) => {\r\n ${endpoint.path.includes('multiple') ? `\r\n // Validate all files\r\n for (const file of files) {\r\n const validation = validateFile(file, options?.uploadConfig)\r\n if (!validation.valid) {\r\n throw new Error(validation.error || \\`File validation failed for \\${file.name}\\`)\r\n }\r\n }\r\n\r\n // Compress files if enabled\r\n const processedFiles = await Promise.all(\r\n files.map(file => compressFile(file, options?.uploadConfig?.compression?.formats))\r\n )\r\n\r\n // Create FormData with all files\r\n const formData = new FormData()\r\n processedFiles.forEach((file, index) => {\r\n formData.append(\\`file_\\${index}\\`, file)\r\n })\r\n \r\n if (additionalFields) {\r\n Object.entries(additionalFields).forEach(([key, value]) => {\r\n formData.append(key, String(value))\r\n })\r\n }\r\n\r\n // Convert FormData to the format expected by the action\r\n const actionInput = {\r\n body: formData as any,\r\n params: {\r\n query: ${paramsSchemaName ? 'folder ? { folder } : undefined' : 'undefined'}\r\n }\r\n }\r\n \r\n // Use server action for upload and extract data from SafeActionResult\r\n const result = await resolveActionResult<z.infer<typeof ${operationName}ResponseSchema>>(\r\n ${actionName}(actionInput)\r\n )\r\n return result` : presignedEnabled ? uploadLogic : `\r\n // Validate file\r\n const validation = validateFile(file, options?.uploadConfig)\r\n if (!validation.valid) {\r\n throw new Error(validation.error || 'File validation failed')\r\n }\r\n\r\n // Compress if enabled\r\n const processedFile = await compressFile(file, options?.uploadConfig?.compression?.formats)\r\n\r\n // Create FormData for the file\r\n const formData = createUploadFormData(processedFile, additionalFields)\r\n \r\n // Convert FormData to the format expected by the action\r\n const actionInput = {\r\n body: formData as any,\r\n params: {\r\n query: ${paramsSchemaName ? 'folder ? { folder } : undefined' : 'undefined'}\r\n }\r\n }\r\n \r\n ${(progressEnabled && useXHR) ? `return await uploadViaBackendApi(formData, options?.onProgress)` : `\r\n // Use server action for upload and extract data from SafeActionResult\r\n const result = await resolveActionResult<z.infer<typeof ${operationName}ResponseSchema>>(\r\n ${actionName}(actionInput)\r\n )\r\n return result`}`}\r\n },\r\n \r\n onSuccess: (data: z.infer<typeof ${operationName}ResponseSchema>) => {\r\n // Don't show toast here, let the page handle it\r\n options?.onSuccess?.(data)\r\n \r\n // Invalidate relevant queries\r\n queryClient.invalidateQueries({ queryKey: ['${endpoint.tags[0] || 'uploads'}'] })\r\n },\r\n \r\n onError: (error: Error) => {\r\n toast.error(error.message || 'Upload failed')\r\n options?.onError?.(error)\r\n },\r\n })\r\n}\r\n`;\r\n\r\n const uploadFileName = `services/upload${this.toPascalCase(operationId)}.ts`;\r\n const exportName = `${hookName}Upload`;\r\n\r\n return {\r\n path: uploadFileName,\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: [exportName],\r\n imports: ['@tanstack/react-query', 'sonner', actionsImport, uploadUtilsImport, schemasImport],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n\r\n private getOperationName(endpoint: ApiEndpointDefinition): string {\r\n if (endpoint.operationId) {\r\n return endpoint.operationId\r\n .split('_')\r\n .map(part => this.toPascalCase(part))\r\n .join('');\r\n }\r\n\r\n const pathParts = endpoint.path\r\n .split('/')\r\n .filter(part => part && !part.startsWith('{'))\r\n .map(part => this.toPascalCase(part));\r\n\r\n const method = this.toPascalCase(endpoint.method.toLowerCase());\r\n return [...pathParts, method].join('');\r\n }\r\n\r\n private generateUseUploadFileHook(uploadProvider: string, uploadStrategy: string, context?: GenerationContext): GeneratedFile {\r\n const uploadUtilsImport = this.buildImportPath('services/uploadUtils');\r\n \r\n // Find the first upload endpoint to get the correct method name\r\n const uploadEndpoints = context?.schema?.endpoints?.filter(e => \r\n e.metadata?.fileUpload || \r\n e.path.toLowerCase().includes('upload') ||\r\n (e.operationId && e.operationId.toLowerCase().includes('upload'))\r\n ) || [];\r\n \r\n const firstUploadEndpoint = uploadEndpoints[0];\r\n let uploadMethodName = 'uploadFile';\r\n let uploadClientTag = 'files';\r\n \r\n if (firstUploadEndpoint) {\r\n const operationName = this.getOperationName(firstUploadEndpoint);\r\n uploadMethodName = toActionName(firstUploadEndpoint.operationId || firstUploadEndpoint.id);\r\n uploadClientTag = toValidIdentifier(firstUploadEndpoint.tags[0] || 'files');\r\n }\r\n \r\n const content = `'use client'\r\n\r\nimport { useMutation } from '@tanstack/react-query'\r\nimport { validateFile, compressFile, createUploadFormData, type UploadConfig } from '${uploadUtilsImport}'\r\n\r\n/**\r\n * Generic file upload hook\r\n * Supports: UploadThing, Vercel Blob, or standard FormData\r\n */\r\nexport type UploadInput = {\r\n file: File\r\n additionalFields?: Record<string, string | number | boolean>\r\n}\r\n\r\nexport function useUploadFile(options?: {\r\n onSuccess?: (url: string) => void\r\n onError?: (error: Error) => void\r\n onProgress?: (progress: { loaded: number; total: number; percentage: number }) => void\r\n uploadConfig?: UploadConfig\r\n}) {\r\n return useMutation<string, Error, UploadInput>({\r\n mutationFn: async ({ file, additionalFields }: UploadInput) => {\r\n // Validate file\r\n const validation = validateFile(file, options?.uploadConfig)\r\n if (!validation.valid) {\r\n throw new Error(validation.error || 'File validation failed')\r\n }\r\n\r\n // Compress if enabled\r\n const processedFile = await compressFile(file, options?.uploadConfig?.compression?.formats)\r\n\r\n ${uploadStrategy === 'external' && uploadProvider === 'uploadthing'\r\n ? `// UploadThing integration\r\n // Note: Requires UploadThing route handler setup\r\n // See: https://docs.uploadthing.com/getting-started/appdir\r\n const formData = createUploadFormData(processedFile, additionalFields)\r\n // Use UploadThing client here\r\n throw new Error('UploadThing integration requires route handler setup')`\r\n : uploadStrategy === 'external' && uploadProvider === 'vercel-blob'\r\n ? `// Vercel Blob integration - Use generated upload endpoint\r\n // Note: This requires a file upload endpoint in your OpenAPI schema\r\n // The endpoint should accept multipart/form-data and return { url: string }\r\n const formData = createUploadFormData(processedFile, additionalFields)\r\n \r\n // Use generated API client instead of local API\r\n // Mulink will generate the upload endpoint from your OpenAPI schema\r\n const { apiClient } = await import('${this.buildImportPath('client')}')\r\n \r\n // Try to find upload endpoint in generated client\r\n try {\r\n ${firstUploadEndpoint ? `\r\n // Use the detected upload endpoint\r\n const response = await apiClient.${uploadClientTag}?.${uploadMethodName}?.({\r\n body: formData as any,\r\n params: { query: {} }\r\n })` : `\r\n // Try common upload endpoint names\r\n const response = await apiClient.files?.uploadFileApiV1FilesUploadPost?.({\r\n body: formData as any,\r\n params: { query: {} }\r\n }) || await apiClient.default?.uploadFile?.({\r\n body: formData as any\r\n })`}\r\n return response?.data?.url || response?.data?.file_url || response?.data?.url || ''\r\n } catch (error) {\r\n console.warn('[Mulink] Upload endpoint not found in generated client, using fallback')\r\n throw new Error('Upload endpoint not found. Please add a file upload endpoint to your OpenAPI schema.')\r\n }`\r\n : `// Standard FormData upload - Use generated upload endpoint\r\n // Note: This requires a file upload endpoint in your OpenAPI schema\r\n const formData = createUploadFormData(processedFile, additionalFields)\r\n \r\n // Use generated API client instead of local API\r\n // Mulink will generate the upload endpoint from your OpenAPI schema\r\n const { apiClient } = await import('${this.buildImportPath('client')}')\r\n \r\n // Try to find upload endpoint in generated client\r\n try {\r\n ${firstUploadEndpoint ? `\r\n // Use the detected upload endpoint\r\n const response = await apiClient.${uploadClientTag}?.${uploadMethodName}?.({\r\n body: formData as any,\r\n params: { query: {} }\r\n })` : `\r\n // Try common upload endpoint names\r\n const response = await apiClient.files?.uploadFileApiV1FilesUploadPost?.({\r\n body: formData as any,\r\n params: { query: {} }\r\n }) || await apiClient.default?.uploadFile?.({\r\n body: formData as any\r\n })`}\r\n return response?.data?.url || response?.data?.file_url || response?.data?.url || ''\r\n } catch (error) {\r\n console.warn('[Mulink] Upload endpoint not found in generated client, using fallback')\r\n throw new Error('Upload endpoint not found. Please add a file upload endpoint to your OpenAPI schema.')\r\n }`}\r\n },\r\n onSuccess: (url) => {\r\n options?.onSuccess?.(url)\r\n },\r\n onError: (error: Error) => {\r\n options?.onError?.(error)\r\n },\r\n })\r\n}`;\r\n\r\n return {\r\n path: 'hooks/useUploadFile.ts',\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: ['useUploadFile'],\r\n imports: ['@tanstack/react-query', uploadUtilsImport],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n\r\n private getActionName(operationId: string): string {\r\n // Use toActionName from naming-helpers to ensure camelCase (not PascalCase)\r\n return toActionName(operationId);\r\n }\r\n\r\n private toPascalCase(str: string): string {\r\n return str\r\n .replace(/[-_\\s]+(.)?/g, (_, char) => (char ? char.toUpperCase() : ''))\r\n .replace(/^(.)/, char => char.toUpperCase());\r\n }\r\n}\r\n\r\n","import type { BridgeConfiguration, GenerationContext, GeneratedFile } from '@/core/types';\r\nimport { SchemaAnalyzer } from '@/core/schema-analyzer';\r\n\r\nexport class ErrorHandlerGenerator {\r\n private analyzer!: SchemaAnalyzer;\r\n\r\n constructor(private readonly configuration: BridgeConfiguration) {}\r\n\r\n private buildImportPath(relativePath: string): string {\r\n const outputDirectory = this.configuration.outputDir || 'generated';\r\n const cleanPath = relativePath.startsWith('/') ? relativePath.slice(1) : relativePath;\r\n let importBasePath = outputDirectory;\r\n if (importBasePath.startsWith('src/')) {\r\n importBasePath = importBasePath.substring(4);\r\n }\r\n return `@/${importBasePath}/${cleanPath}`;\r\n }\r\n\r\n async generate(context: GenerationContext): Promise<GeneratedFile[]> {\r\n const files: GeneratedFile[] = [];\r\n const { schema, config } = context;\r\n const { api } = this.configuration;\r\n const errorHandling = api?.errorHandling;\r\n\r\n // Initialize intelligent schema analyzer\r\n this.analyzer = new SchemaAnalyzer(schema);\r\n\r\n // Auto-detect error patterns from schema\r\n const errorCodes = this.analyzer.extractErrorCodes();\r\n const accountStatusPatterns = this.analyzer.extractAccountStatusPatterns();\r\n\r\n // Check if auth is actually configured (endpoints exist)\r\n const extractedAuthEndpoints = this.analyzer.extractAuthEndpoints();\r\n const hasAuthEndpoints = !!(extractedAuthEndpoints.login || extractedAuthEndpoints.loginCredentials);\r\n\r\n // Generate auth error handler if enabled (explicitly or auto-detected)\r\n // But only if auth endpoints actually exist\r\n const hasAuthErrors = errorCodes.size > 0 || \r\n (accountStatusPatterns.inactiveStatuses.length > 0 || accountStatusPatterns.suspendedStatuses.length > 0);\r\n \r\n const shouldGenerate = hasAuthEndpoints && \r\n ((errorHandling?.generateAuthErrorHandler !== false && errorHandling?.enableAuthErrorHandling !== false) ||\r\n (hasAuthErrors && errorHandling?.generateAuthErrorHandler !== false));\r\n \r\n if (shouldGenerate) {\r\n files.push(this.generateAuthErrorHandler(errorCodes, accountStatusPatterns));\r\n } else if (errorHandling?.enableAuthErrorHandling === true && !hasAuthEndpoints) {\r\n console.warn(\r\n `⚠️ Auth error handling is enabled but auth endpoints are not found in OpenAPI schema. ` +\r\n `Auth error handler will not be generated.`\r\n );\r\n }\r\n\r\n return files;\r\n }\r\n\r\n private generateAuthErrorHandler(\r\n errorCodes: Map<string, { code: string; status: number; message: string }>,\r\n accountStatusPatterns: {\r\n activeStatuses: string[];\r\n inactiveStatuses: string[];\r\n suspendedStatuses: string[];\r\n lockedStatuses: string[];\r\n }\r\n ): GeneratedFile {\r\n const authPath = this.configuration.auth?.authPath || '@/lib/auth';\r\n const errorHandling = this.configuration.api?.errorHandling;\r\n const authErrorHandlerPath = errorHandling?.authErrorHandlerPath || '@/lib/auth-error-handler';\r\n \r\n // Extract the relative path from the import path\r\n // @/lib/auth-error-handler -> lib/auth-error-handler\r\n // @/custom/path/handler -> custom/path/handler\r\n let handlerOutputPath = authErrorHandlerPath;\r\n if (handlerOutputPath.startsWith('@/')) {\r\n handlerOutputPath = handlerOutputPath.substring(2);\r\n }\r\n if (handlerOutputPath.startsWith('src/')) {\r\n handlerOutputPath = handlerOutputPath.substring(4);\r\n }\r\n \r\n const baseClientImport = this.buildImportPath('client/base');\r\n\r\n const content = `/**\r\n * Authentication Error Handler\r\n * Auto-generated by Mulink - Handles authentication errors globally and redirects users to login when needed\r\n * \r\n * Best Practices:\r\n * - Type-safe error handling with proper TypeScript types\r\n * - Graceful error handling with fallbacks\r\n * - User-friendly error messages\r\n * - Proper session cleanup on auth errors\r\n */\r\n\r\nimport type { ApiError } from '${baseClientImport}'\r\n${this.configuration.auth?.enabled ? `import { signOut } from '${authPath}'` : '// Auth not configured - signOut will need to be imported manually'}\r\n\r\n// Toast notification (optional - can be replaced with your preferred notification library)\r\n// If you use a different toast library, update the import and usage below\r\nlet toast: {\r\n error: (message: string, options?: { duration?: number; description?: string }) => void\r\n} | null = null\r\n\r\n// Lazy load toast to avoid bundling issues\r\nasync function getToast(): Promise<{\r\n error: (message: string, options?: { duration?: number; description?: string }) => void\r\n} | null> {\r\n if (toast !== null) return toast\r\n \r\n try {\r\n // Try to import sonner (common toast library)\r\n const sonner = await import('sonner')\r\n toast = sonner\r\n return toast\r\n } catch {\r\n // Fallback to console if toast library not available\r\n toast = {\r\n error: (message: string, options?: { duration?: number; description?: string }) => {\r\n console.error('[Auth Error]', message, options?.description || '')\r\n }\r\n }\r\n return toast\r\n }\r\n}\r\n\r\n/**\r\n * Type guard to check if an error is an authentication error\r\n */\r\nexport function isAuthError(error: unknown): boolean {\r\n if (error && typeof error === 'object' && 'status' in error) {\r\n const status = (error as ApiError).status\r\n return status === 401 || status === 403\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * Type guard to check if an error is an inactive account error\r\n * Auto-detected account status patterns from schema\r\n */\r\nexport function isInactiveAccountError(error: unknown): boolean {\r\n if (!isAuthError(error)) return false\r\n \r\n const apiError = error as ApiError\r\n const errorMessage = apiError.data?.detail || apiError.message || ''\r\n const lowerMessage = errorMessage.toLowerCase()\r\n const errorCode = (apiError.data as any)?.error_code || ''\r\n const lowerErrorCode = errorCode.toLowerCase()\r\n \r\n // Auto-detected inactive statuses: ${accountStatusPatterns.inactiveStatuses.map(s => `\"${s}\"`).join(', ')}\r\n const inactiveStatuses = [${accountStatusPatterns.inactiveStatuses.map(s => `\"${s}\"`).join(', ')}]\r\n const inactiveStatusCheck = inactiveStatuses.some(status => \r\n lowerMessage.includes(status.toLowerCase()) || \r\n lowerErrorCode.includes(status.toLowerCase())\r\n )\r\n \r\n return (\r\n (apiError.status === 403 && (\r\n inactiveStatusCheck ||\r\n lowerMessage.includes('not active') ||\r\n lowerMessage.includes('inactive') ||\r\n lowerMessage.includes('account is not active') ||\r\n lowerMessage.includes('user account is not active') ||\r\n lowerErrorCode === 'user_account_inactive'\r\n )) ||\r\n lowerErrorCode === 'user_account_inactive' ||\r\n inactiveStatusCheck\r\n )\r\n}\r\n\r\n/**\r\n * Main auth error handler function\r\n * Handles authentication errors and redirects users appropriately\r\n * \r\n * @param error - The error to handle (should be an ApiError)\r\n * @param redirectTo - Optional custom redirect path (default: /auth/signin)\r\n */\r\nexport async function handleAuthError(error: unknown, redirectTo?: string): Promise<void> {\r\n if (typeof window === 'undefined') {\r\n console.error('[Auth Error Handler] Auth error on server:', error)\r\n return\r\n }\r\n\r\n if (!isAuthError(error)) {\r\n return\r\n }\r\n\r\n const apiError = error as ApiError\r\n const isInactive = isInactiveAccountError(error)\r\n const errorMessage = apiError.data?.detail || apiError.message || ''\r\n \r\n console.warn('[Auth Error Handler] Authentication error detected:', {\r\n status: apiError.status,\r\n message: errorMessage,\r\n isInactive,\r\n })\r\n\r\n const toastInstance = await getToast()\r\n\r\n // Show appropriate error message based on error type\r\n if (toastInstance) {\r\n if (isInactive) {\r\n toastInstance.error('Your account has been deactivated. Please contact support for assistance.', {\r\n duration: 5000,\r\n description: 'You will be redirected to the login page.',\r\n })\r\n } else if (apiError.status === 401) {\r\n toastInstance.error('Your session has expired. Please sign in again.', {\r\n duration: 4000,\r\n })\r\n } else if (apiError.status === 403) {\r\n toastInstance.error('Access denied. Your account may have been suspended.', {\r\n duration: 5000,\r\n description: 'You will be redirected to the login page.',\r\n })\r\n } else {\r\n toastInstance.error('Authentication failed. Please sign in again.', {\r\n duration: 4000,\r\n })\r\n }\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n const targetUrl = redirectTo || '/auth/signin'\r\n \r\n // Start sign out in background (don't wait for it)\r\n ${this.configuration.auth?.enabled ? `try {\r\n const { signOut } = await import('${authPath}')\r\n signOut({\r\n redirect: false,\r\n }).catch((signOutError: unknown) => {\r\n console.error('[Auth Error Handler] Error during sign out (non-blocking):', signOutError)\r\n })\r\n } catch (importError) {\r\n console.warn('[Auth Error Handler] Could not import signOut:', importError)\r\n }` : '// signOut not configured - implement your own sign out logic here'}\r\n \r\n // Force immediate redirect - this will stop all JavaScript execution\r\n // Use replace to prevent back button from going to the previous page\r\n console.log('[Auth Error Handler] Redirecting to:', targetUrl)\r\n window.location.replace(targetUrl)\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create an auth error handler with custom redirect path\r\n * Useful for creating error handlers with specific redirect paths\r\n * \r\n * @param redirectTo - Custom redirect path\r\n * @returns Error handler function\r\n */\r\nexport function createAuthErrorHandler(redirectTo?: string) {\r\n return async (error: unknown) => {\r\n await handleAuthError(error, redirectTo)\r\n throw error // Re-throw to allow other error handlers to process it\r\n }\r\n}\r\n`;\r\n\r\n return {\r\n path: `${handlerOutputPath }.ts`,\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: [\r\n 'isAuthError',\r\n 'isInactiveAccountError',\r\n 'handleAuthError',\r\n 'createAuthErrorHandler',\r\n ],\r\n imports: [baseClientImport, authPath],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n}\r\n\r\n","import type {\r\n BridgeConfiguration,\r\n GenerationContext,\r\n GeneratedFile,\r\n ApiEndpointDefinition,\r\n} from '@/core/types';\r\nimport { toValidIdentifier, toHookName } from '@/utils/naming-helpers';\r\nimport { SchemaAnalyzer } from '@/core/schema-analyzer';\r\n\r\nexport class SSEGenerator {\r\n private analyzer!: SchemaAnalyzer;\r\n\r\n constructor(private readonly configuration: BridgeConfiguration) {}\r\n\r\n private buildImportPath(relativePath: string): string {\r\n const outputDirectory = this.configuration.outputDir || 'generated';\r\n const cleanPath = relativePath.startsWith('/') ? relativePath.slice(1) : relativePath;\r\n let importBasePath = outputDirectory;\r\n if (importBasePath.startsWith('src/')) {\r\n importBasePath = importBasePath.substring(4);\r\n }\r\n return `@/${importBasePath}/${cleanPath}`;\r\n }\r\n\r\n /**\r\n * Detect if an endpoint is an SSE endpoint\r\n * SSE endpoints typically have:\r\n * - Path contains '/stream' or '/sse'\r\n * - Content-Type is 'text/event-stream'\r\n * - Operation ID contains 'stream' or 'sse'\r\n */\r\n private isSSEEndpoint(endpoint: ApiEndpointDefinition): boolean {\r\n const pathLower = endpoint.path.toLowerCase();\r\n const operationIdLower = (endpoint.operationId || '').toLowerCase();\r\n \r\n // Check path\r\n if (pathLower.includes('/stream') || pathLower.includes('/sse')) {\r\n return true;\r\n }\r\n \r\n // Check operation ID\r\n if (operationIdLower.includes('stream') || operationIdLower.includes('sse')) {\r\n return true;\r\n }\r\n \r\n // Check response content type\r\n const hasEventStream = endpoint.responses.some(response => \r\n response.content?.some(content => \r\n content.type === 'text/event-stream' || \r\n content.type === 'text/plain' // Some SSE endpoints use text/plain\r\n )\r\n );\r\n \r\n return hasEventStream;\r\n }\r\n\r\n async generate(context: GenerationContext): Promise<GeneratedFile[]> {\r\n const { schema } = context;\r\n const generatedFiles: GeneratedFile[] = [];\r\n \r\n // Initialize intelligent schema analyzer\r\n this.analyzer = new SchemaAnalyzer(schema);\r\n \r\n const streamingConfig = this.configuration.framework?.streaming;\r\n \r\n // Auto-detect streaming support from schema if not explicitly configured\r\n const hasStreamingEndpoints = schema.endpoints.some(endpoint => this.isSSEEndpoint(endpoint));\r\n \r\n // Validate streaming configuration\r\n if (streamingConfig?.enabled === true && !hasStreamingEndpoints) {\r\n console.warn(\r\n `⚠️ Streaming is enabled in config but SSE endpoints are not found in OpenAPI schema. ` +\r\n `Expected endpoints with '/stream' or '/sse' in path or 'text/event-stream' content type.`\r\n );\r\n }\r\n \r\n const shouldEnableStreaming = streamingConfig?.enabled === true \r\n ? hasStreamingEndpoints // Only enable if endpoints exist\r\n : (streamingConfig?.enabled !== false && hasStreamingEndpoints); // Auto-detect if not explicitly disabled\r\n \r\n // Only generate SSE if enabled and endpoints exist\r\n if (!shouldEnableStreaming || streamingConfig?.sse?.enabled === false || !hasStreamingEndpoints) {\r\n return generatedFiles;\r\n }\r\n\r\n // Find SSE endpoints (intelligent detection)\r\n const sseEndpoints = schema.endpoints.filter(endpoint => this.isSSEEndpoint(endpoint));\r\n\r\n if (sseEndpoints.length === 0) {\r\n return generatedFiles;\r\n }\r\n\r\n // Generate SSE client method for each endpoint\r\n for (const endpoint of sseEndpoints) {\r\n generatedFiles.push(this.generateSSEClientMethod(endpoint));\r\n }\r\n\r\n // Generate SSE hooks for each endpoint\r\n const endpointsByTag = this.groupEndpointsByTag(sseEndpoints);\r\n for (const [tag, tagEndpoints] of Object.entries(endpointsByTag)) {\r\n generatedFiles.push(this.generateSSEHooks(tag, tagEndpoints));\r\n }\r\n\r\n return generatedFiles;\r\n }\r\n\r\n private generateSSEClientMethod(endpoint: ApiEndpointDefinition): GeneratedFile {\r\n const operationId = endpoint.operationId || endpoint.id;\r\n const methodName = this.toCamelCase(operationId);\r\n const tagName = this.toCamelCase(endpoint.tags[0] || 'default');\r\n \r\n // Extract path parameters\r\n const pathParams = endpoint.parameters.filter(p => p.in === 'path');\r\n const pathParamNames = pathParams.map(p => p.name);\r\n \r\n // Build URL construction\r\n let urlConstruction = `'${endpoint.path}'`;\r\n if (pathParamNames.length > 0) {\r\n urlConstruction = `\\`${endpoint.path.replace(/\\{([^}]+)\\}/g, (_, param) => `\\${params.${param}}`)}\\``;\r\n }\r\n\r\n const content = ` /**\r\n * ${endpoint.summary || `${endpoint.method} ${endpoint.path}`}\r\n * Server-Sent Events stream for real-time updates.\r\n * This is a special endpoint that uses EventSource instead of regular HTTP requests.\r\n * \r\n * @param options - SSE connection options\r\n * @returns EventSource instance for SSE connection\r\n * @example\r\n * const eventSource = client.${methodName}({\r\n * ${pathParamNames.length > 0 ? `params: { ${pathParamNames.map(p => `${p}: 'value'`).join(', ')} },\\n ` : ''}onMessage: (data) => console.log(\"Update:\", data),\r\n * onError: (error) => console.error(\"Error:\", error)\r\n * })\r\n */\r\n ${methodName} = (options: {\r\n ${pathParamNames.length > 0 ? `params: { ${pathParamNames.map(p => `${p}: string`).join(', ')} },\\n ` : ''}onMessage?: (data: unknown) => void\r\n onError?: (error: Event) => void\r\n onOpen?: () => void\r\n withCredentials?: boolean\r\n }): EventSource => {\r\n ${pathParamNames.length > 0 ? `const { ${pathParamNames.join(', ')}, ...restOptions } = options.params || {}\\n ` : ''}const baseUrl = typeof window !== 'undefined' \r\n ? (process.env.NEXT_PUBLIC_API_URL || '${this.configuration.api?.baseUrl || 'http://localhost:8000'}')\r\n : '${this.configuration.api?.baseUrl || 'http://localhost:8000'}'\r\n const sseUrl = \\`\\${baseUrl}${urlConstruction}\\`\r\n\r\n // Create EventSource connection\r\n const eventSource = new EventSource(sseUrl, {\r\n withCredentials: options.withCredentials ?? true,\r\n })\r\n\r\n // Set up event handlers\r\n if (options.onOpen) {\r\n eventSource.onopen = options.onOpen\r\n }\r\n\r\n if (options.onMessage) {\r\n eventSource.onmessage = (event: MessageEvent) => {\r\n try {\r\n const data = JSON.parse(event.data)\r\n options.onMessage?.(data)\r\n } catch (error) {\r\n console.error('Failed to parse SSE message:', error)\r\n // Try to call onMessage with raw data if JSON parsing fails\r\n options.onMessage?.(event.data as any)\r\n }\r\n }\r\n }\r\n\r\n if (options.onError) {\r\n eventSource.onerror = options.onError\r\n }\r\n\r\n return eventSource\r\n }`;\r\n\r\n // Note: This method should be added to the existing client file\r\n // We return it as a partial file that will be merged\r\n return {\r\n path: `client/${tagName}.ts.partial`,\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: [methodName],\r\n imports: [],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n\r\n private generateSSEHooks(tag: string, endpoints: ApiEndpointDefinition[]): GeneratedFile {\r\n const tagName = toValidIdentifier(tag);\r\n const clientImport = this.buildImportPath('client');\r\n const streamingConfig = this.configuration.framework?.streaming?.sse;\r\n const autoReconnect = streamingConfig?.autoReconnect !== false;\r\n const reconnectDelay = streamingConfig?.reconnectDelay || 3000;\r\n const maxReconnectAttempts = streamingConfig?.maxReconnectAttempts || 5;\r\n\r\n const hooks = endpoints.map(endpoint => {\r\n const operationId = endpoint.operationId || endpoint.id;\r\n const hookName = toHookName(operationId, false);\r\n const methodName = this.toCamelCase(operationId);\r\n const pathParams = endpoint.parameters.filter(p => p.in === 'path');\r\n const pathParamNames = pathParams.map(p => p.name);\r\n const firstPathParam = pathParams[0];\r\n\r\n return `\r\n/**\r\n * ${endpoint.summary || `SSE Hook for ${endpoint.method} ${endpoint.path}`}\r\n * Server-Sent Events hook for real-time updates.\r\n * This hook uses EventSource for SSE connections instead of regular HTTP requests.\r\n * \r\n * Note: This is a special hook for SSE endpoints. It doesn't use React Query\r\n * because SSE requires EventSource API which is different from fetch.\r\n * \r\n * @param ${firstPathParam ? `${firstPathParam.name} - ${firstPathParam.description || 'Path parameter'}` : 'options - Hook options'}\r\n * @param options - Hook options\r\n * @returns SSE connection state and controls\r\n * @example\r\n * const { isConnected, sseError, eventSource, reconnect } = ${hookName}(\r\n * ${firstPathParam ? '\"value\", ' : ''}{\r\n * enabled: true,\r\n * onMessage: (data) => console.log(\"Update:\", data),\r\n * onError: (error) => console.error(\"Error:\", error)\r\n * }\r\n * )\r\n */\r\nexport function ${hookName}(\r\n ${firstPathParam ? `${firstPathParam.name}: string,\\n ` : ''}options?: {\r\n enabled?: boolean\r\n onMessage?: (data: unknown) => void\r\n onError?: (error: Event) => void\r\n onOpen?: () => void\r\n }\r\n) {\r\n const [isConnected, setIsConnected] = useState(false)\r\n const [sseError, setSseError] = useState<Error | null>(null)\r\n const [reconnectAttempts, setReconnectAttempts] = useState(0)\r\n const eventSourceRef = useRef<EventSource | null>(null)\r\n const reconnectTimeoutRef = useRef<NodeJS.Timeout | null>(null)\r\n \r\n const apiClient = useMemo(() => {\r\n // Import dynamically to avoid circular dependencies\r\n const { ApiClient } = require('${clientImport}')\r\n return new ApiClient()\r\n }, [])\r\n\r\n const connect = useCallback(() => {\r\n if (!options?.enabled && options?.enabled !== undefined) {\r\n return\r\n }\r\n\r\n // Clean up existing connection\r\n if (eventSourceRef.current) {\r\n eventSourceRef.current.close()\r\n eventSourceRef.current = null\r\n }\r\n\r\n // Clear any pending reconnect\r\n if (reconnectTimeoutRef.current) {\r\n clearTimeout(reconnectTimeoutRef.current)\r\n reconnectTimeoutRef.current = null\r\n }\r\n\r\n try {\r\n // Create SSE connection using the client method\r\n const eventSource = apiClient.${this.toCamelCase(endpoint.tags[0] || 'default')}.${methodName}({\r\n ${pathParamNames.length > 0 ? `${pathParamNames.map(p => `${p}`).join(', ')},\\n ` : ''}onMessage: (data: unknown) => {\r\n setIsConnected(true)\r\n setSseError(null)\r\n setReconnectAttempts(0) // Reset on successful message\r\n options?.onMessage?.(data)\r\n },\r\n onError: (error: Event) => {\r\n setIsConnected(false)\r\n const eventSource = eventSourceRef.current\r\n \r\n if (eventSource && eventSource.readyState === EventSource.CLOSED) {\r\n setSseError(new Error(\"SSE connection closed\"))\r\n \r\n // Auto-reconnect if enabled\r\n if (${autoReconnect} && reconnectAttempts < ${maxReconnectAttempts}) {\r\n setReconnectAttempts(prev => prev + 1)\r\n reconnectTimeoutRef.current = setTimeout(() => {\r\n connect()\r\n }, ${reconnectDelay})\r\n }\r\n }\r\n \r\n options?.onError?.(error)\r\n },\r\n onOpen: () => {\r\n setIsConnected(true)\r\n setSseError(null)\r\n setReconnectAttempts(0)\r\n options?.onOpen?.()\r\n }\r\n })\r\n\r\n eventSourceRef.current = eventSource\r\n } catch (error) {\r\n setSseError(error instanceof Error ? error : new Error('Failed to create SSE connection'))\r\n setIsConnected(false)\r\n }\r\n }, [${firstPathParam ? `${firstPathParam.name}, ` : ''}options?.enabled, options?.onMessage, options?.onError, options?.onOpen, apiClient, reconnectAttempts])\r\n\r\n useEffect(() => {\r\n connect()\r\n\r\n return () => {\r\n if (eventSourceRef.current) {\r\n eventSourceRef.current.close()\r\n eventSourceRef.current = null\r\n }\r\n if (reconnectTimeoutRef.current) {\r\n clearTimeout(reconnectTimeoutRef.current)\r\n reconnectTimeoutRef.current = null\r\n }\r\n setIsConnected(false)\r\n }\r\n }, [connect])\r\n\r\n const reconnect = useCallback(() => {\r\n setReconnectAttempts(0)\r\n setSseError(null)\r\n setIsConnected(false)\r\n if (eventSourceRef.current) {\r\n eventSourceRef.current.close()\r\n eventSourceRef.current = null\r\n }\r\n connect()\r\n }, [connect])\r\n\r\n return {\r\n isConnected,\r\n sseError,\r\n eventSource: eventSourceRef.current,\r\n reconnect,\r\n reconnectAttempts,\r\n }\r\n}`;\r\n }).join('\\n\\n');\r\n\r\n const imports = `'use client'\r\n\r\nimport { useState, useEffect, useRef, useMemo, useCallback } from 'react'`;\r\n\r\n const content = `${imports}\r\n${hooks}\r\n`;\r\n\r\n return {\r\n path: `hooks/${tagName}.ts`,\r\n content,\r\n type: 'typescript',\r\n metadata: {\r\n exports: endpoints.map(e => toHookName(e.operationId || e.id, false)),\r\n imports: ['react', clientImport],\r\n dependencies: [],\r\n },\r\n };\r\n }\r\n\r\n private groupEndpointsByTag(\r\n endpoints: ApiEndpointDefinition[]\r\n ): Record<string, ApiEndpointDefinition[]> {\r\n return endpoints.reduce(\r\n (accumulator, endpoint) => {\r\n const tag = endpoint.tags[0] || 'default';\r\n if (!accumulator[tag]) {\r\n accumulator[tag] = [];\r\n }\r\n accumulator[tag].push(endpoint);\r\n return accumulator;\r\n },\r\n {} as Record<string, ApiEndpointDefinition[]>\r\n );\r\n }\r\n\r\n private toCamelCase(input: string): string {\r\n return input\r\n .replace(/[-_\\s]+(.)?/g, (_, character) => (character ? character.toUpperCase() : ''))\r\n .replace(/^[A-Z]/, character => character.toLowerCase());\r\n }\r\n}\r\n\r\n","import type { BridgeConfiguration, GenerationContext, GeneratedFile } from '@/core/types';\r\nimport { GenerationError } from '@/core/types';\r\nimport { ApiClientGenerator } from './api-client-generator';\r\nimport { SchemaGenerator } from './schema-generator';\r\nimport { ActionGenerator } from './action-generator';\r\nimport { HookGenerator } from './hook-generator';\r\nimport { AuthGenerator } from './auth-generator';\r\nimport { NextAuthGenerator } from './nextauth-generator';\r\nimport { MiddlewareGenerator } from './middleware-generator';\r\nimport { CacheGenerator } from './cache-generator';\r\nimport { UploadGenerator } from './upload-generator';\r\nimport { ErrorHandlerGenerator } from './error-handler-generator';\r\nimport { SSEGenerator } from './sse-generator';\r\n\r\nexport class NextJsCodeGenerator {\r\n constructor(private readonly configuration: BridgeConfiguration) {}\r\n\r\n private buildImportPath(relativePath: string): string {\r\n const outputDirectory = this.configuration.outputDir || 'generated';\r\n const cleanPath = relativePath.startsWith('/') ? relativePath.slice(1) : relativePath;\r\n let importBasePath = outputDirectory;\r\n if (importBasePath.startsWith('src/')) {\r\n importBasePath = importBasePath.substring(4);\r\n }\r\n return `@/${importBasePath}/${cleanPath}`;\r\n }\r\n\r\n private updateFilePaths(files: GeneratedFile[]): GeneratedFile[] {\r\n return files.map(file => ({\r\n ...file,\r\n path: file.path,\r\n metadata: {\r\n ...file.metadata,\r\n exports: file.metadata?.exports || [],\r\n imports: file.metadata?.imports || [],\r\n dependencies:\r\n file.metadata?.dependencies?.map(dependency => {\r\n if (dependency.startsWith('@/generated/')) {\r\n return dependency;\r\n }\r\n if (dependency.startsWith('@/')) {\r\n const relativePart = dependency.replace('@/', '');\r\n return `@/generated/${relativePart}`;\r\n }\r\n return dependency;\r\n }) || [],\r\n },\r\n }));\r\n }\r\n\r\n async generate(context: GenerationContext): Promise<GeneratedFile[]> {\r\n const generatedFiles: GeneratedFile[] = [];\r\n\r\n try {\r\n // Generate safe action client first\r\n generatedFiles.push(...(await this.generateSafeActionClient()));\r\n\r\n // Generate cache utilities (needed by other generators)\r\n // const cacheGenerator = new CacheGenerator(this.configuration)\r\n // generatedFiles.push(...(await cacheGenerator.generate(context)))\r\n\r\n // Generate authentication system\r\n if (this.configuration.auth?.enabled) {\r\n // Use NextAuthGenerator for next-auth provider, otherwise use AuthGenerator\r\n if (this.configuration.auth.provider === 'next-auth') {\r\n const nextAuthGenerator = new NextAuthGenerator(this.configuration);\r\n generatedFiles.push(...(await nextAuthGenerator.generate(context)));\r\n } else {\r\n const authGenerator = new AuthGenerator(this.configuration);\r\n generatedFiles.push(...(await authGenerator.generate(context)));\r\n }\r\n }\r\n\r\n // Generate middleware\r\n if (this.configuration.framework.features.middleware) {\r\n const middlewareGenerator = new MiddlewareGenerator(this.configuration);\r\n generatedFiles.push(...(await middlewareGenerator.generate(context)));\r\n }\r\n\r\n // Generate schemas first (required by other generators)\r\n const schemaGenerator = new SchemaGenerator();\r\n generatedFiles.push(...(await schemaGenerator.generate(context)));\r\n\r\n // Generate API client\r\n const apiClientGenerator = new ApiClientGenerator(this.configuration);\r\n generatedFiles.push(...(await apiClientGenerator.generate(context)));\r\n\r\n // Generate actions (depends on schemas and client)\r\n const actionGenerator = new ActionGenerator(this.configuration);\r\n generatedFiles.push(...(await actionGenerator.generate(context)));\r\n\r\n // Generate hooks (depends on actions and types)\r\n const hookGenerator = new HookGenerator(this.configuration);\r\n generatedFiles.push(...(await hookGenerator.generate(context)));\r\n\r\n // Generate upload services if enabled\r\n if (this.configuration.uploads?.enabled) {\r\n const uploadGenerator = new UploadGenerator(this.configuration);\r\n generatedFiles.push(...(await uploadGenerator.generate(context)));\r\n }\r\n\r\n // Generate error handlers if enabled\r\n if (this.configuration.api?.errorHandling?.generateAuthErrorHandler !== false) {\r\n const errorHandlerGenerator = new ErrorHandlerGenerator(this.configuration);\r\n generatedFiles.push(...(await errorHandlerGenerator.generate(context)));\r\n }\r\n\r\n // Generate SSE/Streaming support if enabled\r\n if (this.configuration.framework?.streaming?.enabled) {\r\n const sseGenerator = new SSEGenerator(this.configuration);\r\n generatedFiles.push(...(await sseGenerator.generate(context)));\r\n }\r\n\r\n return this.updateFilePaths(generatedFiles);\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n throw new GenerationError(`Failed to generate Next.js files: ${errorMessage}`);\r\n }\r\n }\r\n\r\n private async generateSafeActionClient(): Promise<GeneratedFile[]> {\r\n const safeActionContent = `import { DEFAULT_SERVER_ERROR_MESSAGE, createSafeActionClient } from \"next-safe-action\";\r\nimport { headers } from \"next/headers\";\r\nimport { z } from \"zod\";\r\n\r\n/**\r\n * Enhanced Action Error class for better error handling\r\n * Follows Next.js 16.0.1 best practices\r\n */\r\nexport class ActionError extends Error {\r\n constructor(\r\n message: string, \r\n public readonly code?: string,\r\n public readonly statusCode?: number,\r\n public readonly details?: unknown\r\n ) {\r\n super(message);\r\n this.name = \"ActionError\";\r\n // Maintains proper stack trace for where our error was thrown (only available on V8)\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, ActionError);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Basic action client without metadata\r\n * Use this for simple server actions that don't need metadata\r\n */\r\nexport const actionClient = createSafeActionClient({\r\n handleServerError(e) {\r\n if (e instanceof ActionError) {\r\n return e.message;\r\n }\r\n // Log unexpected errors in development\r\n if (process.env.NODE_ENV === 'development') {\r\n console.error('[Action Error]', e);\r\n }\r\n return DEFAULT_SERVER_ERROR_MESSAGE;\r\n },\r\n});\r\n\r\n/**\r\n * Enhanced action client with metadata support\r\n * Next.js 16.0.1: Supports metadata for better action tracking and rate limiting\r\n */\r\nexport const actionClientWithMeta = createSafeActionClient({\r\n handleServerError(e) {\r\n if (e instanceof ActionError) {\r\n return e.message;\r\n }\r\n // Log unexpected errors in development\r\n if (process.env.NODE_ENV === 'development') {\r\n console.error('[Action Error]', e);\r\n }\r\n return DEFAULT_SERVER_ERROR_MESSAGE;\r\n },\r\n defineMetadataSchema() {\r\n return z.object({\r\n name: z.string().describe('Action name for logging and tracking'),\r\n requiresAuth: z.boolean().default(false).describe('Whether this action requires authentication'),\r\n rateLimit: z.object({\r\n requests: z.number().int().positive().describe('Number of requests allowed'),\r\n window: z.string().describe('Time window (e.g., \"10s\", \"1m\", \"1h\")'),\r\n }).optional().describe('Rate limiting configuration'),\r\n cacheTags: z.array(z.string()).optional().describe('Cache tags for invalidation (Next.js 16.0.1)'),\r\n });\r\n },\r\n});\r\n\r\n// Simple in-memory rate limiter\r\nclass MemoryRateLimiter {\r\n private limits = new Map<string, { count: number; expiresAt: number }>();\r\n\r\n async limit(key: string, requests: number, window: string) {\r\n const now = Date.now();\r\n const windowMs = this.parseWindow(window);\r\n const entry = this.limits.get(key);\r\n\r\n if (!entry || entry.expiresAt <= now) {\r\n this.limits.set(key, { count: 1, expiresAt: now + windowMs });\r\n return { success: true, remaining: requests - 1 };\r\n }\r\n\r\n if (entry.count >= requests) {\r\n return { success: false, remaining: 0 };\r\n }\r\n\r\n this.limits.set(key, { ...entry, count: entry.count + 1 });\r\n return { success: true, remaining: requests - entry.count - 1 };\r\n }\r\n\r\n private parseWindow(window: string): number {\r\n const value = parseInt(window);\r\n if (window.endsWith(\"s\")) return value * 1000;\r\n if (window.endsWith(\"m\")) return value * 60 * 1000;\r\n if (window.endsWith(\"h\")) return value * 60 * 60 * 1000;\r\n return 1000; // default to 1 second\r\n }\r\n}\r\n\r\nconst memoryRateLimiter = new MemoryRateLimiter();\r\n\r\n// Auth client with rate limiting\r\nexport const authActionClient = actionClientWithMeta\r\n .use(async ({ next, clientInput, metadata }) => {\r\n if (process.env.NODE_ENV === \"development\") {\r\n console.log(\"Input:\", clientInput);\r\n console.log(\"Metadata:\", metadata);\r\n }\r\n return next({ ctx: {} });\r\n })\r\n .use(async ({ next, metadata }) => {\r\n if (metadata?.rateLimit) {\r\n const headersList = await headers(); // Await the headers promise\r\n const ip = headersList.get(\"x-forwarded-for\") ?? \"local\";\r\n const { success, remaining } = await memoryRateLimiter.limit(\r\n \\`\\${ip}-\\${metadata.name}\\`,\r\n metadata.rateLimit.requests,\r\n metadata.rateLimit.window\r\n );\r\n\r\n if (!success) {\r\n throw new ActionError(\"Too many requests\", \"RATE_LIMITED\");\r\n }\r\n\r\n return next({\r\n ctx: {\r\n ratelimit: { remaining },\r\n },\r\n });\r\n }\r\n return next();\r\n })\r\n .use(async ({ next, metadata }) => {\r\n if (metadata?.requiresAuth) {\r\n const user = await getCurrentUser();\r\n \r\n if (!user) {\r\n throw new ActionError(\"Unauthorized\", \"UNAUTHORIZED\");\r\n }\r\n\r\n return next({\r\n ctx: {\r\n user,\r\n },\r\n });\r\n }\r\n return next();\r\n });\r\n\r\n// Mock user function\r\nasync function getCurrentUser() {\r\n // Implement your authentication logic here\r\n return null;\r\n}`;\r\n\r\n return [\r\n {\r\n path: 'lib/safe-action.ts',\r\n content: safeActionContent,\r\n type: 'typescript',\r\n metadata: {\r\n exports: ['actionClient', 'actionClientWithMeta', 'authActionClient', 'ActionError'],\r\n imports: ['next-safe-action', 'next/headers', 'zod'],\r\n dependencies: [],\r\n },\r\n },\r\n ];\r\n }\r\n}\r\n","import { promises as fs } from 'fs';\r\nimport path from 'path';\r\nimport { createHash } from 'crypto';\r\n\r\nexport interface FileOptions {\r\n atomic?: boolean;\r\n backup?: boolean;\r\n encoding?: BufferEncoding;\r\n}\r\n\r\nexport class FileSystemManager {\r\n async writeFile(filePath: string, content: string, options: FileOptions = {}): Promise<void> {\r\n if (!filePath?.trim()) {\r\n throw new Error('File path is required and cannot be empty');\r\n }\r\n\r\n if (typeof content !== 'string') {\r\n throw new Error('Content must be a string');\r\n }\r\n\r\n const { atomic = true, backup = false, encoding = 'utf8' } = options;\r\n\r\n try {\r\n // Ensure directory exists\r\n const dir = path.dirname(filePath);\r\n await fs.mkdir(dir, { recursive: true });\r\n\r\n // Create backup if requested\r\n if (backup && (await this.exists(filePath))) {\r\n const backupPath = `${filePath}.backup.${Date.now()}`;\r\n await fs.copyFile(filePath, backupPath);\r\n }\r\n\r\n if (atomic) {\r\n // Atomic write using temporary file\r\n const tempPath = `${filePath}.tmp.${process.pid}`;\r\n try {\r\n await fs.writeFile(tempPath, content, encoding);\r\n await fs.rename(tempPath, filePath);\r\n } catch (error) {\r\n // Cleanup on error\r\n try {\r\n await fs.unlink(tempPath);\r\n } catch {\r\n // Ignore cleanup errors\r\n }\r\n throw error;\r\n }\r\n } else {\r\n await fs.writeFile(filePath, content, encoding);\r\n }\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Failed to write file ${filePath}: ${error.message}`);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n async readFile(filePath: string, encoding: BufferEncoding = 'utf8'): Promise<string> {\r\n if (!filePath?.trim()) {\r\n throw new Error('File path is required and cannot be empty');\r\n }\r\n\r\n try {\r\n return await fs.readFile(filePath, { encoding });\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\r\n throw new Error(`File not found: ${filePath}`);\r\n }\r\n if ((error as NodeJS.ErrnoException).code === 'EACCES') {\r\n throw new Error(`Permission denied reading file: ${filePath}`);\r\n }\r\n if (error instanceof Error) {\r\n throw new Error(`Failed to read file ${filePath}: ${error.message}`);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n async exists(filePath: string): Promise<boolean> {\r\n try {\r\n await fs.access(filePath);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n async getFileHash(filePath: string): Promise<string> {\r\n if (!filePath?.trim()) {\r\n throw new Error('File path is required and cannot be empty');\r\n }\r\n\r\n try {\r\n const content = await fs.readFile(filePath); // Read as buffer for hashing\r\n return createHash('sha256').update(content).digest('hex');\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\r\n throw new Error(`File not found: ${filePath}`);\r\n }\r\n if (error instanceof Error) {\r\n throw new Error(`Failed to hash file ${filePath}: ${error.message}`);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n async removeDir(dirPath: string): Promise<void> {\r\n try {\r\n await fs.rm(dirPath, { recursive: true, force: true });\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n async findFiles(dir: string, pattern: RegExp, recursive = true): Promise<string[]> {\r\n if (!dir?.trim()) {\r\n throw new Error('Directory path is required and cannot be empty');\r\n }\r\n\r\n if (!(pattern instanceof RegExp)) {\r\n throw new Error('Pattern must be a RegExp');\r\n }\r\n\r\n const results: string[] = [];\r\n\r\n try {\r\n const entries = await fs.readdir(dir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n\r\n if (entry.isDirectory() && recursive) {\r\n try {\r\n results.push(...(await this.findFiles(fullPath, pattern, recursive)));\r\n } catch (error) {\r\n // Skip directories that can't be read\r\n continue;\r\n }\r\n } else if (entry.isFile() && pattern.test(entry.name)) {\r\n results.push(fullPath);\r\n }\r\n }\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\r\n throw new Error(`Directory not found: ${dir}`);\r\n }\r\n if ((error as NodeJS.ErrnoException).code === 'EACCES') {\r\n throw new Error(`Permission denied reading directory: ${dir}`);\r\n }\r\n if (error instanceof Error) {\r\n throw new Error(`Failed to read directory ${dir}: ${error.message}`);\r\n }\r\n throw error;\r\n }\r\n\r\n return results;\r\n }\r\n}\r\n","import type {\r\n BridgeConfiguration,\r\n GenerationContext,\r\n GeneratedFile,\r\n ParsedApiSchema,\r\n} from './types';\r\nimport { BridgeError, GenerationError, ValidationError, SchemaParseError } from '@/core/types';\r\nimport { z } from 'zod';\r\nimport { OpenApiSchemaParser } from '@/core/schema-parser';\r\nimport { NextJsCodeGenerator } from '@/generators/nextjs';\r\nimport { FileSystemManager } from '@/utils/file-manager';\r\nimport { BridgeLogger, LogLevel } from '@/utils/logger';\r\n\r\nexport class BridgeCore {\r\n private readonly logger: BridgeLogger;\r\n private readonly schemaParser: OpenApiSchemaParser;\r\n private readonly fileManager: FileSystemManager;\r\n\r\n constructor() {\r\n this.logger = new BridgeLogger({ prefix: '🔗 Mulink' });\r\n this.schemaParser = new OpenApiSchemaParser();\r\n this.fileManager = new FileSystemManager();\r\n }\r\n\r\n async generate(configuration: BridgeConfiguration): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n try {\r\n this.logger.info('Starting code generation...');\r\n\r\n // Validate configuration\r\n await this.validateConfiguration(configuration);\r\n\r\n // Parse OpenAPI schema\r\n this.logger.info(`Parsing schema: ${configuration.schema}`);\r\n const parsedSchema = await this.schemaParser.parse(configuration.schema);\r\n this.logger.debug(\r\n `Schema parsed successfully: ${parsedSchema.endpoints.length} endpoints found`\r\n );\r\n\r\n // Create generation context\r\n const generationContext: GenerationContext = {\r\n config: configuration,\r\n schema: parsedSchema,\r\n outputDir: configuration.outputDir,\r\n timestamp: Date.now(),\r\n };\r\n\r\n // Generate files based on framework\r\n this.logger.info('Generating code files...');\r\n const generatedFiles = await this.generateFiles(generationContext);\r\n\r\n // Write files to the output directory\r\n this.logger.info(`Writing ${generatedFiles.length} files to ${configuration.outputDir}`);\r\n await this.writeFiles(generatedFiles, configuration.outputDir);\r\n\r\n const duration = Date.now() - startTime;\r\n this.logger.success(`✅ Generated ${generatedFiles.length} files in ${duration}ms`);\r\n\r\n // Log generation summary\r\n this.logGenerationSummary(generatedFiles);\r\n } catch (error) {\r\n const duration = Date.now() - startTime;\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n this.logger.error(`❌ Generation failed after ${duration}ms: ${errorMessage}`);\r\n\r\n if (this.logger.options.level === LogLevel.DEBUG && error instanceof Error) {\r\n this.logger.error('Stack trace:', error.stack);\r\n }\r\n\r\n throw error;\r\n }\r\n }\r\n\r\n private async validateConfiguration(configuration: BridgeConfiguration): Promise<void> {\r\n const errors: string[] = [];\r\n\r\n if (!configuration.schema?.trim()) {\r\n errors.push('Schema URL is required and cannot be empty');\r\n }\r\n\r\n if (!configuration.outputDir?.trim()) {\r\n errors.push('Output directory is required and cannot be empty');\r\n }\r\n\r\n if (configuration.framework.type !== 'nextjs') {\r\n errors.push(`Only Next.js framework is currently supported, got: ${configuration.framework.type}`);\r\n }\r\n\r\n if (errors.length > 0) {\r\n throw new ValidationError(\r\n `Configuration validation failed: ${errors.join(', ')}`,\r\n new z.ZodError([])\r\n );\r\n }\r\n\r\n this.logger.debug('Configuration validated successfully');\r\n }\r\n\r\n private async generateFiles(context: GenerationContext): Promise<GeneratedFile[]> {\r\n const { config } = context;\r\n\r\n try {\r\n switch (config.framework.type) {\r\n case 'nextjs':\r\n const nextJsGenerator = new NextJsCodeGenerator(config);\r\n return await nextJsGenerator.generate(context);\r\n default:\r\n throw new GenerationError(`Unsupported framework: ${config.framework.type}`);\r\n }\r\n } catch (error) {\r\n if (error instanceof GenerationError) {\r\n throw error;\r\n }\r\n \r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error during file generation';\r\n throw new GenerationError(`Failed to generate files: ${errorMessage}`);\r\n }\r\n }\r\n\r\n private async writeFiles(files: GeneratedFile[], outputDirectory: string): Promise<void> {\r\n this.logger.info(`Writing ${files.length} files to ${outputDirectory}`);\r\n\r\n const writePromises = files.map(async (file) => {\r\n const fullPath = `${outputDirectory}/${file.path}`;\r\n try {\r\n await this.fileManager.writeFile(fullPath, file.content, { atomic: true });\r\n this.logger.debug(`✓ ${file.path}`);\r\n return { success: true, file: file.path };\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n this.logger.error(`Failed to write file ${file.path}:`, errorMessage);\r\n return { success: false, file: file.path, error: errorMessage };\r\n }\r\n });\r\n\r\n const results = await Promise.all(writePromises);\r\n const failures = results.filter(result => !result.success);\r\n\r\n if (failures.length > 0) {\r\n const failedFiles = failures.map(f => f.file).join(', ');\r\n throw new GenerationError(`Failed to write ${failures.length} files: ${failedFiles}`);\r\n }\r\n }\r\n\r\n private logGenerationSummary(files: GeneratedFile[]): void {\r\n const fileTypes = files.reduce(\r\n (acc, file) => {\r\n acc[file.type] = (acc[file.type] || 0) + 1;\r\n return acc;\r\n },\r\n {} as Record<string, number>\r\n );\r\n\r\n this.logger.info('📁 Generated files:');\r\n Object.entries(fileTypes).forEach(([type, count]) => {\r\n this.logger.info(` ${type}: ${count} files`);\r\n });\r\n\r\n // Log key files\r\n const keyFiles = files.filter(\r\n f => f.path.includes('index') || f.path.includes('client') || f.path.includes('types')\r\n );\r\n\r\n if (keyFiles.length > 0) {\r\n this.logger.info('🔑 Key files:');\r\n keyFiles.forEach(file => {\r\n this.logger.info(` - ${file.path}`);\r\n });\r\n }\r\n }\r\n\r\n // Public API methods\r\n async validateSchema(schemaUrl: string): Promise<boolean> {\r\n if (!schemaUrl?.trim()) {\r\n this.logger.warn('Schema URL is empty or invalid');\r\n return false;\r\n }\r\n\r\n try {\r\n await this.schemaParser.parse(schemaUrl);\r\n this.logger.debug(`Schema validation successful for: ${schemaUrl}`);\r\n return true;\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n this.logger.warn(`Schema validation failed for ${schemaUrl}: ${errorMessage}`);\r\n return false;\r\n }\r\n }\r\n\r\n async getSchemaInfo(schemaUrl: string): Promise<ParsedApiSchema['metadata']> {\r\n if (!schemaUrl?.trim()) {\r\n throw new BridgeError('Schema URL is required and cannot be empty', 'INVALID_SCHEMA_URL');\r\n }\r\n\r\n try {\r\n const parsedSchema = await this.schemaParser.parse(schemaUrl);\r\n this.logger.debug(`Schema info retrieved for: ${schemaUrl}`);\r\n return parsedSchema.metadata;\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n throw new SchemaParseError(`Failed to parse schema: ${errorMessage}`, schemaUrl);\r\n }\r\n }\r\n\r\n clearCache(): void {\r\n try {\r\n this.schemaParser.clearCache();\r\n this.logger.debug('Cache cleared successfully');\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n this.logger.warn(`Failed to clear cache: ${errorMessage}`);\r\n }\r\n }\r\n}\r\n","import { promises as fs } from 'fs';\r\nimport path from 'path';\r\nimport { z } from 'zod';\r\nimport type { BridgeConfiguration } from '@/core/types';\r\nimport { BridgeError } from '@/core/types.js';\r\n\r\nconst bridgeConfigSchema = z.object({\r\n schema: z.string().url().or(z.string().min(1)),\r\n outputDir: z.string().min(1),\r\n framework: z.object({\r\n type: z.literal('nextjs'),\r\n version: z.string().optional(),\r\n router: z.enum(['app', 'pages']).default('app'),\r\n features: z\r\n .object({\r\n serverActions: z.boolean().default(true),\r\n middleware: z.boolean().default(false),\r\n streaming: z.boolean().default(false),\r\n revalidation: z.boolean().default(true),\r\n })\r\n .default({}),\r\n }),\r\n api: z.object({\r\n baseUrl: z.string().url(),\r\n timeout: z.number().positive().default(30000),\r\n retries: z.number().nonnegative().default(3),\r\n headers: z.record(z.string()).optional(),\r\n interceptors: z\r\n .object({\r\n request: z.array(z.string()).optional(),\r\n response: z.array(z.string()).optional(),\r\n })\r\n .optional(),\r\n }),\r\n auth: z\r\n .object({\r\n enabled: z.boolean(),\r\n provider: z.enum(['next-auth', 'clerk', 'custom']).default('next-auth'),\r\n middleware: z.boolean().default(false),\r\n publicPaths: z.array(z.string()).optional(),\r\n })\r\n .optional(),\r\n cache: z\r\n .object({\r\n strategy: z.enum(['memory', 'redis', 'database']).default('memory'),\r\n ttl: z.number().positive().default(300),\r\n tags: z.boolean().default(true),\r\n revalidation: z.enum(['time', 'on-demand', 'both']).default('on-demand'),\r\n })\r\n .optional(),\r\n uploads: z\r\n .object({\r\n enabled: z.boolean(),\r\n strategy: z.enum(['standard', 'external', 'presigned']).default('standard'),\r\n provider: z.enum(['uploadthing', 'vercel-blob', 'standard', 's3', 'minio']).optional(),\r\n compression: z\r\n .object({\r\n enabled: z.boolean().default(false),\r\n formats: z.array(z.enum(['gzip', 'webp', 'brotli'])).optional(),\r\n })\r\n .optional(),\r\n security: z\r\n .object({\r\n maxSize: z.string().optional(),\r\n allowedTypes: z.array(z.string()).optional(),\r\n scan: z.enum(['clamav', 'none']).optional(),\r\n })\r\n .optional(),\r\n presignedUploads: z\r\n .object({\r\n enabled: z.boolean().optional(),\r\n presignEndpoint: z.string().optional(),\r\n fallbackToBackend: z.boolean().optional(),\r\n })\r\n .optional(),\r\n progressTracking: z\r\n .object({\r\n enabled: z.boolean().optional(),\r\n useXHR: z.boolean().optional(),\r\n })\r\n .optional(),\r\n })\r\n .optional(),\r\n dev: z\r\n .object({\r\n logging: z.boolean().default(true),\r\n validation: z.boolean().default(true),\r\n mocking: z.boolean().default(false),\r\n watch: z.boolean().default(false),\r\n hotReload: z.boolean().default(false),\r\n })\r\n .optional(),\r\n plugins: z\r\n .array(\r\n z.object({\r\n name: z.string(),\r\n options: z.record(z.unknown()).optional(),\r\n })\r\n )\r\n .optional(),\r\n typeMappings: z.record(z.string()).optional(),\r\n generation: z\r\n .object({\r\n typescript: z.boolean().default(true),\r\n strict: z.boolean().default(true),\r\n comments: z.boolean().default(true),\r\n documentation: z.boolean().default(true),\r\n examples: z.boolean().default(false),\r\n tests: z.boolean().default(false),\r\n })\r\n .optional(),\r\n});\r\n\r\nexport class ConfigurationLoader {\r\n async load(configPath?: string): Promise<BridgeConfiguration> {\r\n if (!configPath?.trim()) {\r\n configPath = 'mulink.config.json';\r\n }\r\n\r\n const resolvedPath = path.resolve(process.cwd(), configPath);\r\n\r\n try {\r\n // Check if file exists and is readable\r\n await fs.access(resolvedPath, fs.constants.R_OK);\r\n \r\n const content = await fs.readFile(resolvedPath, 'utf-8');\r\n \r\n if (!content.trim()) {\r\n throw new BridgeError(\r\n `Configuration file is empty: ${resolvedPath}`,\r\n 'CONFIG_EMPTY'\r\n );\r\n }\r\n\r\n let rawConfig: unknown;\r\n try {\r\n rawConfig = JSON.parse(content);\r\n } catch (parseError) {\r\n if (parseError instanceof SyntaxError) {\r\n throw new BridgeError(\r\n `Invalid JSON in configuration file: ${resolvedPath}\\n\\nError: ${parseError.message}`,\r\n 'CONFIG_INVALID_JSON'\r\n );\r\n }\r\n throw parseError;\r\n }\r\n\r\n if (!rawConfig || typeof rawConfig !== 'object') {\r\n throw new BridgeError(\r\n `Configuration must be a JSON object: ${resolvedPath}`,\r\n 'CONFIG_INVALID_FORMAT'\r\n );\r\n }\r\n\r\n // Validate and transform config\r\n const config = bridgeConfigSchema.parse(rawConfig);\r\n\r\n return config as unknown as BridgeConfiguration;\r\n } catch (error) {\r\n if (error instanceof BridgeError) {\r\n throw error;\r\n }\r\n\r\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\r\n throw new BridgeError(\r\n `Configuration file not found: ${resolvedPath}\\n\\nRun 'mulink init' to create a new configuration file.`,\r\n 'CONFIG_NOT_FOUND'\r\n );\r\n }\r\n\r\n if ((error as NodeJS.ErrnoException).code === 'EACCES') {\r\n throw new BridgeError(\r\n `Permission denied reading configuration file: ${resolvedPath}`,\r\n 'CONFIG_PERMISSION_DENIED'\r\n );\r\n }\r\n\r\n if (error instanceof z.ZodError) {\r\n const errorMessages = error.errors\r\n .map(err => `${err.path.join('.')}: ${err.message}`)\r\n .join('\\n');\r\n\r\n throw new BridgeError(\r\n `Invalid configuration:\\n${errorMessages}`,\r\n 'CONFIG_VALIDATION_ERROR'\r\n );\r\n }\r\n\r\n throw new BridgeError(\r\n `Failed to load config from ${resolvedPath}: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n 'CONFIG_LOAD_ERROR'\r\n );\r\n }\r\n }\r\n\r\n async createDefault(framework: 'nextjs' = 'nextjs'): Promise<BridgeConfiguration> {\r\n const defaultConfig: BridgeConfiguration = {\r\n schema: 'https://petstore3.swagger.io/api/v3/openapi.json',\r\n outputDir: 'src/generated',\r\n framework: {\r\n type: framework,\r\n router: 'app',\r\n features: {\r\n serverActions: true,\r\n middleware: false,\r\n streaming: false,\r\n revalidation: true,\r\n },\r\n },\r\n api: {\r\n baseUrl: 'http://localhost:8000/api',\r\n timeout: 30000,\r\n retries: 3,\r\n },\r\n cache: {\r\n strategy: 'memory',\r\n ttl: 300,\r\n tags: true,\r\n revalidation: 'on-demand',\r\n },\r\n dev: {\r\n logging: true,\r\n validation: true,\r\n mocking: false,\r\n watch: false,\r\n hotReload: false,\r\n },\r\n generation: {\r\n typescript: true,\r\n strict: true,\r\n comments: true,\r\n documentation: true,\r\n examples: false,\r\n tests: false,\r\n },\r\n };\r\n\r\n return defaultConfig;\r\n }\r\n\r\n async save(config: BridgeConfiguration, configPath?: string): Promise<void> {\r\n if (!configPath?.trim()) {\r\n configPath = 'mulink.config.json';\r\n }\r\n\r\n const resolvedPath = path.resolve(process.cwd(), configPath);\r\n\r\n try {\r\n // Validate the configuration before saving\r\n const validatedConfig = bridgeConfigSchema.parse(config);\r\n \r\n const content = JSON.stringify(validatedConfig, null, 2);\r\n \r\n if (!content.trim()) {\r\n throw new BridgeError(\r\n 'Configuration is empty after serialization',\r\n 'CONFIG_SAVE_ERROR'\r\n );\r\n }\r\n\r\n // Ensure directory exists\r\n const dir = path.dirname(resolvedPath);\r\n await fs.mkdir(dir, { recursive: true });\r\n\r\n // Write file atomically\r\n const tempPath = `${resolvedPath}.tmp`;\r\n await fs.writeFile(tempPath, content, 'utf-8');\r\n await fs.rename(tempPath, resolvedPath);\r\n\r\n } catch (error) {\r\n if (error instanceof BridgeError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof z.ZodError) {\r\n const errorMessages = error.errors\r\n .map(err => `${err.path.join('.')}: ${err.message}`)\r\n .join('\\n');\r\n\r\n throw new BridgeError(\r\n `Invalid configuration to save:\\n${errorMessages}`,\r\n 'CONFIG_VALIDATION_ERROR'\r\n );\r\n }\r\n\r\n if ((error as NodeJS.ErrnoException).code === 'EACCES') {\r\n throw new BridgeError(\r\n `Permission denied writing configuration file: ${resolvedPath}`,\r\n 'CONFIG_PERMISSION_DENIED'\r\n );\r\n }\r\n\r\n throw new BridgeError(\r\n `Failed to save config to ${resolvedPath}: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n 'CONFIG_SAVE_ERROR'\r\n );\r\n }\r\n }\r\n}\r\n"]}