omni-rest 0.3.2 → 0.3.3

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.
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/introspect.ts","../src/zod-generator.ts","../src/openapi.ts","../src/frontend/scan.ts","../src/frontend/schema.ts","../src/frontend/detect.ts","../src/frontend/deps.ts","../src/frontend/prompt.ts","../src/frontend/codegen/hook.ts","../src/frontend/codegen/utils.ts","../src/frontend/codegen/columns.ts","../src/frontend/codegen/table.ts","../src/frontend/codegen/form.ts","../src/frontend/codegen/page.ts","../src/frontend/codegen/menu.ts","../src/frontend/output.ts","../src/frontend-generator.ts","../src/cli.ts"],"names":["path","fs","cwd","path2","fs2","path4","fs4","resolve","prompt","relationalFields","fs5","path5","path6","readline2","COLORS","run"],"mappings":";;;;;;;;;;;;;;;AAQO,SAAS,UAAU,MAAA,EAA2B;AACnD,EAAA,IAAI,GAAA;AAGJ,EAAA,IAAI,MAAA,EAAQ,mBAAmB,MAAA,EAAQ;AACrC,IAAA,MAAM,SAAA,GAAY,OAAO,iBAAA,CAAkB,MAAA;AAE3C,IAAA,GAAA,GAAM,MAAA,CAAO,QAAQ,SAAS,CAAA,CAAE,IAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,MAAsB;AAAA,MACrE,IAAA;AAAA,MACA,GAAG,KAAA;AAAA,MACH,SAAS,KAAA,CAAM,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,QAC5C,GAAG,CAAA;AAAA,QACH,YAAA,EAAc,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,EAAE,IAAA,GAAO;AAAA,OAC/C,CAAE;AAAA,KACJ,CAAE,CAAA;AAAA,EACJ;AAKA,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,IAAI;AAEF,MAAA,MAAM,YAAA,GAAe,UAAQ,gBAAgB,CAAA;AAC7C,MAAA,MAAM,UAAA,GAAa,YAAA,EAAc,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,MAAA;AAC1D,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,GAAA,GAAM,UAAA;AAAA,MACR;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,mDAAmD,OAAO,GAAG,CAAA,yCAAA,EAA4C,CAAC,CAAC,MAAA,EAAQ,iBAAA,EAAmB,MAAM,CAAA,YAAA,EAAe,KAAK,SAAA,CAAU,GAAG,EAAE,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,KAC9L;AAAA,EACF;AAEA,EAAA,OAAO,GAAA,CAAI,GAAA,CAAI,CAAC,KAAA,KAAe;AAC7B,IAAA,MAAM,MAAA,GAAsB,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,MACxD,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,YAAY,CAAA,CAAE,UAAA;AAAA,MACd,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,UAAA,EAAY,CAAC,CAAC,CAAA,CAAE,YAAA;AAAA,MAChB,iBAAiB,CAAC,CAAC,EAAE,eAAA,IAAmB,CAAC,CAAC,CAAA,CAAE,OAAA;AAAA,MAC5C,WAAA,EAAa,CAAC,CAAC,CAAA,CAAE;AAAA,KACnB,CAAE,CAAA;AAEF,IAAA,MAAM,OAAA,GACJ,MAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAW,CAAA,CAAE,IAAI,CAAA,EAAG,IAAA,IAAQ,IAAA;AAEjD,IAAA,OAAO;AAAA,MACL,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,SAAA,EAAW,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AAAA,MACjC,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAOO,SAAS,YAAY,SAAA,EAA2B;AACrD,EAAA,OAAO,UAAU,WAAA,EAAY;AAC/B;;;AC9EA,IAAM,aAAA,GAAwC;AAAA,EAC5C,MAAA,EAAQ,YAAA;AAAA,EACR,GAAA,EAAK,kBAAA;AAAA,EACL,KAAA,EAAO,YAAA;AAAA,EACP,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,QAAA,EAAU,iBAAA;AAAA,EACV,IAAA,EAAM,SAAA;AAAA,EACN,MAAA,EAAQ,YAAA;AAAA,EACR,KAAA,EAAO;AACT,CAAA;AAKA,SAAS,WAAW,KAAA,EAA0B;AAC5C,EAAA,IAAI,KAAA,CAAM,YAAY,OAAO,IAAA;AAE7B,EAAA,IAAI,GAAA,GAAM,aAAA,CAAc,KAAA,CAAM,IAAI,CAAA,IAAK,SAAA;AAGvC,EAAA,IAAI,CAAC,MAAM,UAAA,EAAY;AACrB,IAAA,GAAA,GAAM,GAAG,GAAG,CAAA,WAAA,CAAA;AAAA,EACd;AAGA,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,GAAA,GAAM,WAAW,GAAG,CAAA,CAAA,CAAA;AAAA,EACtB;AAEA,EAAA,OAAO,GAAA;AACT;AASA,SAAS,oBAAoB,IAAA,EAAyB;AACpD,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAGlB,EAAA,MAAM,YAAA,GAAe,KAAK,MAAA,CACvB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,UAAA,IAAc,CAAC,EAAE,IAAA,IAAQ,CAAC,EAAE,eAAA,IAAmB,CAAC,EAAE,WAAW,CAAA,CAC9E,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,OAAA,GAAU,WAAW,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,OAAO,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA;AAAA,EAChC,CAAC,CAAA,CACA,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,IAAI,CAAA;AAGZ,EAAA,MAAM,eAAe,IAAA,CAAK,MAAA,CACvB,OAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,UAAA,IAAc,CAAC,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAE,WAAW,CAAA,CACxD,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,OAAA,GAAU,WAAW,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,IAAA,MAAM,cAAc,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA,GAAI,OAAA,GAAU,GAAG,OAAO,CAAA,WAAA,CAAA;AAC1E,IAAA,OAAO,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,WAAW,CAAA,CAAA,CAAA;AAAA,EACpC,CAAC,CAAA,CACA,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,IAAI,CAAA;AAEZ,EAAA,OAAO;AAAA,sBAAA,EACA,IAAI,CAAA;;AAAA,aAAA,EAEE,IAAI,CAAA;AAAA,EACjB,YAAY;AAAA;;AAAA,aAAA,EAGC,IAAI,CAAA;AAAA,EACjB,YAAY;AAAA;;AAAA,YAAA,EAGA,IAAI,2BAA2B,IAAI,CAAA;AAAA,YAAA,EACnC,IAAI,2BAA2B,IAAI,CAAA;AAAA,CAAA,CAC/C,IAAA,EAAK;AACP;AAYO,SAAS,mBAAmB,MAAA,EAAsB;AACvD,EAAA,MAAM,MAAA,GAAS,UAAU,MAAM,CAAA;AAE/B,EAAA,MAAM,UAAU,MAAA,CAAO,GAAA,CAAI,mBAAmB,CAAA,CAAE,KAAK,MAAM,CAAA;AAE3D,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EAOP,OAAO;AAAA,CAAA;AAET;;;AC3GA,IAAM,aAAA,GAAmE;AAAA,EACvE,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,EACzB,GAAA,EAAK,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,OAAA,EAAQ;AAAA,EACxC,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,OAAA,EAAQ;AAAA,EACzC,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,EAC1B,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,EAC3B,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,WAAA,EAAY;AAAA,EAChD,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,EACvB,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,OAAA;AACrC,CAAA;AAEA,SAAS,iBAAiB,KAAA,EAAuB;AAC/C,EAAA,IAAI,KAAA,CAAM,YAAY,OAAO,IAAA;AAC7B,EAAA,MAAM,OAAO,aAAA,CAAc,KAAA,CAAM,IAAI,CAAA,IAAK,EAAE,MAAM,QAAA,EAAS;AAC3D,EAAA,IAAI,MAAM,MAAA,EAAQ,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,IAAA,EAAK;AACtD,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,IAAA,EAAiB,SAAA,GAAY,KAAA,EAAY;AACjE,EAAA,MAAM,aAAkC,EAAC;AACzC,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,IAAA,IAAI,MAAM,UAAA,EAAY;AACtB,IAAA,IAAI,SAAA,IAAa,MAAM,IAAA,EAAM;AAE7B,IAAA,MAAM,MAAA,GAAS,iBAAiB,KAAK,CAAA;AACrC,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA,GAAI,MAAA;AAEzB,IAAA,IAAI,KAAA,CAAM,UAAA,IAAc,CAAC,KAAA,CAAM,QAAQ,SAAA,EAAW;AAChD,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,UAAA;AAAA,IACA,GAAI,QAAA,CAAS,MAAA,GAAS,IAAI,EAAE,QAAA,KAAa;AAAC,GAC5C;AACF;AAYO,SAAS,mBAAA,CACd,MAAA,EACA,OAAA,GAMI,EAAC,EACG;AACR,EAAA,MAAM;AAAA,IACJ,KAAA,GAAQ,eAAA;AAAA,IACR,OAAA,GAAU,OAAA;AAAA,IACV,QAAA,GAAW,MAAA;AAAA,IACX,KAAA;AAAA,IACA,OAAA,GAAU,CAAC,EAAE,GAAA,EAAK,yBAAyB;AAAA,GAC7C,GAAI,OAAA;AAEJ,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,MAAM,CAAA,CAAE,MAAA;AAAA,IAC/B,CAAC,CAAA,KAAM,CAAC,SAAS,KAAA,CAAM,QAAA,CAAS,EAAE,SAAS;AAAA,GAC7C;AAEA,EAAA,MAAM,QAA6B,EAAC;AACpC,EAAA,MAAM,UAA+B,EAAC;AAEtC,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,MAAM,QAAQ,IAAA,CAAK,SAAA;AAGnB,IAAA,OAAA,CAAQ,IAAI,CAAA,GAAI,gBAAA,CAAiB,IAAA,EAAM,KAAK,CAAA;AAC5C,IAAA,OAAA,CAAQ,GAAG,IAAI,CAAA,MAAA,CAAQ,CAAA,GAAI,gBAAA,CAAiB,MAAM,IAAI,CAAA;AACtD,IAAA,OAAA,CAAQ,CAAA,EAAG,IAAI,CAAA,MAAA,CAAQ,CAAA,GAAI;AAAA,MACzB,GAAG,gBAAA,CAAiB,IAAA,EAAM,IAAI,CAAA;AAAA,MAC9B,UAAU;AAAC;AAAA,KACb;AAGA,IAAA,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,EAAE,CAAA,GAAI;AAAA,MAC9B,GAAA,EAAK;AAAA,QACH,OAAA,EAAS,QAAQ,IAAI,CAAA,CAAA,CAAA;AAAA,QACrB,IAAA,EAAM,CAAC,IAAI,CAAA;AAAA,QACX,YAAY,mBAAA,EAAoB;AAAA,QAChC,SAAA,EAAW;AAAA,UACT,GAAA,EAAK;AAAA,YACH,WAAA,EAAa,WAAW,IAAI,CAAA,CAAA,CAAA;AAAA,YAC5B,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM,QAAA;AAAA,kBACN,UAAA,EAAY;AAAA,oBACV,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA,EAAG,EAAE;AAAA,oBACvE,IAAA,EAAM,EAAE,IAAA,EAAM,qCAAA;AAAsC;AACtD;AACF;AACF;AACF;AACF;AACF,OACF;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,UAAU,IAAI,CAAA,CAAA;AAAA,QACvB,IAAA,EAAM,CAAC,IAAI,CAAA;AAAA,QACX,WAAA,EAAa;AAAA,UACX,QAAA,EAAU,IAAA;AAAA,UACV,OAAA,EAAS;AAAA,YACP,kBAAA,EAAoB;AAAA,cAClB,MAAA,EAAQ,EAAE,IAAA,EAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,MAAA,CAAA;AAAS;AACvD;AACF,SACF;AAAA,QACA,SAAA,EAAW;AAAA,UACT,GAAA,EAAK;AAAA,YACH,WAAA,EAAa,WAAW,IAAI,CAAA,CAAA;AAAA,YAC5B,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ,EAAE,IAAA,EAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA;AAAG;AACjD;AACF,WACF;AAAA,UACA,GAAA,EAAK,EAAE,IAAA,EAAM,mCAAA,EAAoC;AAAA,UACjD,GAAA,EAAK,EAAE,IAAA,EAAM,iCAAA;AAAkC;AACjD;AACF,KACF;AAGA,IAAA,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,OAAO,CAAA,GAAI;AAAA,MACnC,UAAA,EAAY;AAAA,QACV;AAAA,UACE,IAAA,EAAM,IAAA;AAAA,UACN,EAAA,EAAI,MAAA;AAAA,UACJ,QAAA,EAAU,IAAA;AAAA,UACV,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,UACzB,WAAA,EAAa,GAAG,IAAI,CAAA,GAAA;AAAA;AACtB,OACF;AAAA,MACA,GAAA,EAAK;AAAA,QACH,OAAA,EAAS,OAAO,IAAI,CAAA,MAAA,CAAA;AAAA,QACpB,IAAA,EAAM,CAAC,IAAI,CAAA;AAAA,QACX,SAAA,EAAW;AAAA,UACT,GAAA,EAAK;AAAA,YACH,WAAA,EAAa,GAAG,IAAI,CAAA,OAAA,CAAA;AAAA,YACpB,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ,EAAE,IAAA,EAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA;AAAG;AACjD;AACF,WACF;AAAA,UACA,GAAA,EAAK,EAAE,IAAA,EAAM,iCAAA;AAAkC;AACjD,OACF;AAAA,MACA,GAAA,EAAK;AAAA,QACH,OAAA,EAAS,UAAU,IAAI,CAAA,CAAA;AAAA,QACvB,IAAA,EAAM,CAAC,IAAI,CAAA;AAAA,QACX,WAAA,EAAa;AAAA,UACX,QAAA,EAAU,IAAA;AAAA,UACV,OAAA,EAAS;AAAA,YACP,kBAAA,EAAoB;AAAA,cAClB,MAAA,EAAQ,EAAE,IAAA,EAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,MAAA,CAAA;AAAS;AACvD;AACF,SACF;AAAA,QACA,SAAA,EAAW;AAAA,UACT,GAAA,EAAK;AAAA,YACH,WAAA,EAAa,WAAW,IAAI,CAAA,CAAA;AAAA,YAC5B,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ,EAAE,IAAA,EAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA;AAAG;AACjD;AACF,WACF;AAAA,UACA,GAAA,EAAK,EAAE,IAAA,EAAM,iCAAA;AAAkC;AACjD,OACF;AAAA,MACA,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,oBAAoB,IAAI,CAAA,CAAA;AAAA,QACjC,IAAA,EAAM,CAAC,IAAI,CAAA;AAAA,QACX,WAAA,EAAa;AAAA,UACX,QAAA,EAAU,IAAA;AAAA,UACV,OAAA,EAAS;AAAA,YACP,kBAAA,EAAoB;AAAA,cAClB,MAAA,EAAQ,EAAE,IAAA,EAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,MAAA,CAAA;AAAS;AACvD;AACF,SACF;AAAA,QACA,SAAA,EAAW;AAAA,UACT,GAAA,EAAK;AAAA,YACH,WAAA,EAAa,WAAW,IAAI,CAAA,CAAA;AAAA,YAC5B,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ,EAAE,IAAA,EAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA;AAAG;AACjD;AACF,WACF;AAAA,UACA,GAAA,EAAK,EAAE,IAAA,EAAM,iCAAA;AAAkC;AACjD,OACF;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,OAAA,EAAS,UAAU,IAAI,CAAA,CAAA;AAAA,QACvB,IAAA,EAAM,CAAC,IAAI,CAAA;AAAA,QACX,SAAA,EAAW;AAAA,UACT,GAAA,EAAK,EAAE,WAAA,EAAa,sBAAA,EAAuB;AAAA,UAC3C,GAAA,EAAK,EAAE,IAAA,EAAM,iCAAA;AAAkC;AACjD;AACF,KACF;AAGA,IAAA,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,cAAc,CAAA,GAAI;AAAA,MAC1C,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,eAAe,IAAI,CAAA,CAAA,CAAA;AAAA,QAC5B,IAAA,EAAM,CAAC,IAAI,CAAA;AAAA,QACX,WAAA,EAAa;AAAA,UACX,QAAA,EAAU,IAAA;AAAA,UACV,WAAA,EAAa,YAAY,IAAI,CAAA,gCAAA,CAAA;AAAA,UAC7B,OAAA,EAAS;AAAA,YACP,kBAAA,EAAoB;AAAA,cAClB,MAAA,EAAQ;AAAA,gBACN,IAAA,EAAM,OAAA;AAAA,gBACN,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,MAAA,CAAA;AAAS;AACtD;AACF;AACF,SACF;AAAA,QACA,SAAA,EAAW;AAAA,UACT,GAAA,EAAK;AAAA,YACH,WAAA,EAAa,CAAA,kBAAA,CAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM,QAAA;AAAA,kBACN,UAAA,EAAY;AAAA,oBACV,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,oBAC3B,OAAA,EAAS;AAAA,sBACP,IAAA,EAAM,OAAA;AAAA,sBACN,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA;AAAG;AAChD;AACF;AACF;AACF;AACF,WACF;AAAA,UACA,GAAA,EAAK,EAAE,IAAA,EAAM,mCAAA;AAAoC;AACnD;AACF,KACF;AAEA,IAAA,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,cAAc,CAAA,GAAI;AAAA,MAC1C,MAAA,EAAQ;AAAA,QACN,OAAA,EAAS,eAAe,IAAI,CAAA,CAAA,CAAA;AAAA,QAC5B,IAAA,EAAM,CAAC,IAAI,CAAA;AAAA,QACX,WAAA,EAAa;AAAA,UACX,QAAA,EAAU,IAAA;AAAA,UACV,WAAA,EAAa,CAAA,sBAAA,CAAA;AAAA,UACb,OAAA,EAAS;AAAA,YACP,kBAAA,EAAoB;AAAA,cAClB,MAAA,EAAQ;AAAA,gBACN,IAAA,EAAM,OAAA;AAAA,gBACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA;AAAS;AAC1B;AACF;AACF,SACF;AAAA,QACA,SAAA,EAAW;AAAA,UACT,GAAA,EAAK;AAAA,YACH,WAAA,EAAa,CAAA,kBAAA,CAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM,QAAA;AAAA,kBACN,UAAA,EAAY;AAAA,oBACV,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA;AAAU;AAC7B;AACF;AACF;AACF,WACF;AAAA,UACA,GAAA,EAAK,EAAE,IAAA,EAAM,mCAAA;AAAoC;AACnD;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAA;AAAA,IACT,IAAA,EAAM,EAAE,KAAA,EAAO,OAAA,EAAQ;AAAA,IACvB,OAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA,EAAY;AAAA,MACV,OAAA,EAAS;AAAA,QACP,GAAG,OAAA;AAAA,QACH,cAAA,EAAgB;AAAA,UACd,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,YACzB,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,YACxB,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,YACzB,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA;AAAU;AAChC,SACF;AAAA,QACA,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,YAAY,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,UAAS;AAAE;AAC1C,OACF;AAAA,MACA,SAAA,EAAW;AAAA,QACT,QAAA,EAAU;AAAA,UACR,WAAA,EAAa,kBAAA;AAAA,UACb,OAAA,EAAS;AAAA,YACP,kBAAA,EAAoB;AAAA,cAClB,MAAA,EAAQ,EAAE,IAAA,EAAM,4BAAA;AAA6B;AAC/C;AACF,SACF;AAAA,QACA,UAAA,EAAY;AAAA,UACV,WAAA,EAAa,aAAA;AAAA,UACb,OAAA,EAAS;AAAA,YACP,kBAAA,EAAoB;AAAA,cAClB,MAAA,EAAQ,EAAE,IAAA,EAAM,4BAAA;AAA6B;AAC/C;AACF,SACF;AAAA,QACA,QAAA,EAAU;AAAA,UACR,WAAA,EAAa,6BAAA;AAAA,UACb,OAAA,EAAS;AAAA,YACP,kBAAA,EAAoB;AAAA,cAClB,MAAA,EAAQ,EAAE,IAAA,EAAM,4BAAA;AAA6B;AAC/C;AACF;AACF;AACF,KACF;AAAA,IACA,IAAA,EAAM,OAAO,GAAA,CAAI,CAAC,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAK,CAAE;AAAA,GAC5C;AACF;AAEA,SAAS,mBAAA,GAAsB;AAC7B,EAAA,OAAO;AAAA,IACL,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,OAAA,EAAS,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,CAAA,EAAE,EAAG,aAAa,aAAA,EAAc;AAAA,IACjG,EAAE,IAAA,EAAM,OAAA,EAAS,EAAA,EAAI,OAAA,EAAS,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,EAAA,EAAG,EAAG,aAAa,gBAAA,EAAiB;AAAA,IACtG,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,OAAA,EAAS,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,WAAA,EAAa,qBAAA,EAAsB;AAAA,IAC5F,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,OAAA,EAAS,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,WAAA,EAAa,2BAAA,EAA4B;AAAA,IACrG,EAAE,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,OAAA,EAAS,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,WAAA,EAAa,wBAAA;AAAyB,GACnG;AACF;ACxWA,IAAM,aAAA,mBAAgB,IAAI,GAAA,CAAI,CAAC,cAAA,EAAgB,QAAQ,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,KAAK,CAAC,CAAA;AAMvF,SAAS,gBAAgB,GAAA,EAA6C;AACpE,EAAA,MAAM,OAAA,GAAeA,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,cAAc,CAAA;AAC7C,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAaC,GAAA,CAAA,YAAA,CAAa,OAAA,EAAS,OAAO,CAAA;AAChD,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMA,SAAS,QAAA,CAAS,KAAaC,IAAAA,EAAuC;AACpE,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,UAAoB,EAAC;AAG3B,EAAA,IACKD,GAAA,CAAA,UAAA,CAAgBD,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,gBAAgB,CAAC,CAAA,IAC3CC,GAAA,CAAA,UAAA,CAAgBD,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,gBAAgB,CAAC,CAAA,EAC9C;AACA,IAAA,KAAA,IAAS,EAAA;AACT,IAAA,MAAM,OAAUC,GAAA,CAAA,UAAA,CAAgBD,KAAA,CAAA,IAAA,CAAK,KAAK,gBAAgB,CAAC,IACvD,gBAAA,GACA,gBAAA;AACJ,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,MAAA,CAAQ,CAAA;AAAA,EAC9B;AAGA,EAAA,IACKC,GAAA,CAAA,UAAA,CAAgBD,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,gBAAgB,CAAC,CAAA,IAC3CC,GAAA,CAAA,UAAA,CAAgBD,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,gBAAgB,CAAC,CAAA,EAC9C;AACA,IAAA,KAAA,IAAS,EAAA;AACT,IAAA,MAAM,OAAUC,GAAA,CAAA,UAAA,CAAgBD,KAAA,CAAA,IAAA,CAAK,KAAK,gBAAgB,CAAC,IACvD,gBAAA,GACA,gBAAA;AACJ,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,MAAA,CAAQ,CAAA;AAAA,EAC9B;AAGA,EAAA,MAAM,GAAA,GAAM,gBAAgB,GAAG,CAAA;AAC/B,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,IAAA,GAAQ,GAAA,CAAI,YAAA,IAAuD,EAAC;AAC1E,IAAA,MAAM,OAAA,GAAW,GAAA,CAAI,eAAA,IAA0D,EAAC;AAEhF,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,KAAA,IAAS,CAAA;AACT,MAAA,OAAA,CAAQ,KAAK,uBAAuB,CAAA;AAAA,IACtC,CAAA,MAAA,IAAW,WAAW,OAAA,EAAS;AAC7B,MAAA,KAAA,IAAS,CAAA;AACT,MAAA,OAAA,CAAQ,KAAK,0BAA0B,CAAA;AAAA,IACzC;AAAA,EACF;AAGA,EAAA,IAASA,KAAA,CAAA,OAAA,CAAQ,GAAG,CAAA,KAAWA,KAAA,CAAA,OAAA,CAAQE,IAAG,CAAA,EAAG;AAC3C,IAAA,KAAA,IAAS,CAAA;AACT,IAAA,OAAA,CAAQ,KAAK,2BAA2B,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA;AAExB,EAAA,OAAO;AAAA,IACL,GAAA,EAAUF,cAAQ,GAAG,CAAA;AAAA,IACrB,KAAA;AAAA,IACA;AAAA,GACF;AACF;AAMA,SAAS,IAAA,CACP,GAAA,EACAE,IAAAA,EACA,YAAA,EACA,UACA,OAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAcF,cAAQ,GAAG,CAAA;AAG/B,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,MAAA,EAAQE,IAAG,CAAA;AACtC,EAAA,IAAI,SAAA,IAAa,CAAC,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AACrC,IAAA,OAAA,CAAQ,GAAA,CAAI,QAAQ,SAAS,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,gBAAgB,QAAA,EAAU;AAG9B,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAaD,GAAA,CAAA,WAAA,CAAY,MAAA,EAAQ,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,EAC1D,CAAA,CAAA,MAAQ;AACN,IAAA;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,CAAC,KAAA,CAAM,WAAA,EAAY,EAAG;AAC1B,IAAA,IAAI,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAEnC,IAAA,IAAA,CAAUD,KAAA,CAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,IAAI,GAAGE,IAAAA,EAAK,YAAA,GAAe,CAAA,EAAG,QAAA,EAAU,OAAO,CAAA;AAAA,EAC9E;AACF;AAMO,SAAS,gBAAgB,GAAA,EAAkC;AAChE,EAAA,MAAMA,IAAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA+B;AAEnD,EAAA,IAAA,CAAK,GAAA,EAAKA,IAAAA,EAAK,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA;AAE5B,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AACtE;AAMA,eAAsB,mBAAmB,GAAA,EAA2C;AAClF,EAAA,OAAO,gBAAgB,GAAG,CAAA;AAC5B;AC7HA,eAAsB,UAAA,CACpB,UACA,YAAA,EACiB;AACjB,EAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,IAAA,MAAM,QAAA,GAAgBC,cAAQ,YAAY,CAAA;AAC1C,IAAA,IAAI,CAAIC,GAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,6DAA6D,QAAQ,CAAA;AAAA,+DAAA;AAAA,OAEvE;AAAA,IACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAA,GAAeD,cAAQ,QAAQ,CAAA;AAEnC,EAAA,OAAO,IAAA,EAAM;AAEX,IAAA,MAAM,UAAA,GAAa;AAAA,MACZA,KAAA,CAAA,IAAA,CAAK,OAAA,EAAS,QAAA,EAAU,eAAe,CAAA;AAAA,MACvCA,KAAA,CAAA,IAAA,CAAK,SAAS,eAAe;AAAA,KACpC;AAEA,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,IAAOC,GAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC5B,QAAA,OAAO,SAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAcD,cAAQ,OAAO,CAAA;AACnC,IAAA,IAAI,WAAW,OAAA,EAAS;AAEtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,kEAAkE,QAAQ,CAAA;AAAA,kGAAA;AAAA,OAE5E;AAAA,IACF;AACA,IAAA,OAAA,GAAU,MAAA;AAAA,EACZ;AACF;AAWA,eAAsB,QAAA,CACpB,aACA,UAAA,EACsB;AAEtB,EAAA,IAAI,UAAA,GAA4B,IAAA;AAEhC,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAmBC,GAAA,CAAA,YAAA,CAAa,UAAA,EAAY,OAAO,CAAA;AACzD,IAAA,MAAM,WAAA,GAAc,aAAA,CAAc,KAAA,CAAM,+BAA+B,CAAA;AAEvE,IAAA,IAAI,WAAA,EAAa;AAEf,MAAA,MAAM,SAAA,GAAiBD,cAAQ,UAAU,CAAA;AACzC,MAAA,MAAM,YAAA,GAAoBA,KAAA,CAAA,OAAA,CAAQ,SAAA,EAAW,WAAA,CAAY,CAAC,CAAC,CAAA;AAE3D,MAAA,IAAOC,GAAA,CAAA,UAAA,CAAW,YAAY,CAAA,EAAG;AAC/B,QAAA,UAAA,GAAa,YAAA;AAAA,MACf;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,UAAA,GAAkBD,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,cAAA,EAAgB,SAAA,EAAW,QAAQ,CAAA;AAAA,EACzE;AAGA,EAAA,IAAI,kBAAA;AAEJ,EAAA,IAAI;AAEF,IAAA,kBAAA,GAAqB,UAAQ,UAAU,CAAA;AAAA,EACzC,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,qDAAqD,UAAU,CAAA;AAAA,+EAAA;AAAA,KAEjE;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,GAAkB,kBAAA,EAAoB,MAAA,IAAU,kBAAA,EAAoB,OAAA,EAAS,MAAA;AAEnF,EAAA,IAAI,CAAC,eAAA,EAAiB,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ;AAC7C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,6DAA6D,UAAU,CAAA;AAAA,iFAAA;AAAA,KAEzE;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAoB,eAAA,CAAgB,IAAA,CAAK,SAAA,CAAU,MAAA;AAIzD,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,iBAAA,EAAmB;AAAA,MACjB,QAAQ,MAAA,CAAO,WAAA;AAAA,QACb,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAW;AAAA,UACzB,CAAA,CAAE,IAAA;AAAA,UACF;AAAA,YACE,QAAQ,CAAA,CAAE;AAAA;AACZ,SACD;AAAA;AACH;AACF,GACF;AAEA,EAAA,OAAO,UAAU,eAAe,CAAA;AAClC;ACpHO,SAAS,uBAAuB,WAAA,EAAuC;AAC5E,EAAA,MAAM,MAAA,GAAY,GAAA,CAAA,UAAA,CAAgB,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,KAAK,CAAC,CAAA;AAC1D,EAAA,MAAM,MAAA,GAAY,GAAA,CAAA,UAAA,CAAgB,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,KAAK,CAAC,CAAA;AAC1D,EAAA,MAAM,YAAe,GAAA,CAAA,UAAA,CAAgB,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,KAAA,EAAO,KAAK,CAAC,CAAA;AACpE,EAAA,MAAM,QAAA,GAAc,GAAA,CAAA,UAAA,CAAgB,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,OAAO,CAAC,CAAA;AAC9D,EAAA,MAAM,cAAiB,GAAA,CAAA,UAAA,CAAgB,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,KAAA,EAAO,OAAO,CAAC,CAAA;AAExE,EAAA,MAAM,gBAAgB,MAAA,IAAU,SAAA;AAChC,EAAA,MAAM,kBAAkB,QAAA,IAAY,WAAA;AACpC,EAAA,MAAM,QAAA,GAAW,SAAS,KAAA,GAAQ,GAAA;AAElC,EAAA,IAAI,OAAA,GAAyB,IAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAA,GAAe,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,KAAA,EAAO,KAAK,CAAA;AAAA,EAC/C,WAAW,MAAA,EAAQ;AACjB,IAAA,OAAA,GAAe,KAAA,CAAA,IAAA,CAAK,aAAa,KAAK,CAAA;AAAA,EACxC;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,MAAA;AAAA,IACT,aAAA;AAAA,IACA,eAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAaO,SAAS,gBAAgB,WAAA,EAAgC;AAC9D,EAAA,MAAM,aAAA,GACD,GAAA,CAAA,UAAA,CAAgB,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,gBAAgB,CAAC,CAAA,IACnD,GAAA,CAAA,UAAA,CAAgB,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,gBAAgB,CAAC,CAAA;AAExD,EAAA,IAAI,eAAe,OAAO,QAAA;AAE1B,EAAA,MAAM,aAAA,GACD,GAAA,CAAA,UAAA,CAAgB,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,gBAAgB,CAAC,CAAA,IACnD,GAAA,CAAA,UAAA,CAAgB,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,gBAAgB,CAAC,CAAA;AAExD,EAAA,IAAI,eAAe,OAAO,YAAA;AAG1B,EAAA,MAAM,OAAA,GAAe,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,cAAc,CAAA;AACrD,EAAA,IAAO,GAAA,CAAA,UAAA,CAAW,OAAO,CAAA,EAAG;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAS,GAAA,CAAA,YAAA,CAAa,OAAA,EAAS,OAAO,CAAC,CAAA;AACxD,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,YAAA,IAAgB,EAAC;AAClC,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,eAAA,IAAmB,EAAC;AACxC,MAAA,IAAI,OAAA,IAAW,IAAA,IAAQ,OAAA,IAAW,OAAA,EAAS;AACzC,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,IAAA;AAAA,IACN,gEAAgE,WAAW,CAAA,yBAAA;AAAA,GAC7E;AACA,EAAA,OAAO,OAAA;AACT;AAMA,SAAS,aAAa,QAAA,EAAuC;AAC3D,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAa,GAAA,CAAA,YAAA,CAAa,UAAU,OAAO,CAAA;AAAA,EAC7C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,EAAG;AACtC,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACzC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACjC,IAAA,IAAI,UAAU,EAAA,EAAI;AAClB,IAAA,MAAM,MAAM,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,EAAE,IAAA,EAAK;AACzC,IAAA,IAAI,QAAQ,OAAA,CAAQ,KAAA,CAAM,KAAA,GAAQ,CAAC,EAAE,IAAA,EAAK;AAE1C,IAAA,IAAK,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,IAAK,MAAM,QAAA,CAAS,GAAG,CAAA,IAC3C,KAAA,CAAM,WAAW,GAAG,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAI;AAClD,MAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,IAC3B;AACA,IAAA,MAAA,CAAO,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,EACvB;AACA,EAAA,OAAO,MAAA;AACT;AAaO,SAAS,eAAe,WAAA,EAA6B;AAE1D,EAAA,MAAM,QAAA,GAAW,YAAA,CAAkB,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,YAAY,CAAC,CAAA;AAClE,EAAA,IAAI,QAAA,CAAS,GAAA,CAAI,qBAAqB,CAAA,EAAG;AACvC,IAAA,OAAO,QAAA,CAAS,IAAI,qBAAqB,CAAA;AAAA,EAC3C;AAGA,EAAA,MAAM,GAAA,GAAM,YAAA,CAAkB,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,MAAM,CAAC,CAAA;AACvD,EAAA,IAAI,GAAA,CAAI,GAAA,CAAI,qBAAqB,CAAA,EAAG;AAClC,IAAA,OAAO,GAAA,CAAI,IAAI,qBAAqB,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,GAAA,CAAI,GAAA,CAAI,cAAc,CAAA,EAAG;AAC3B,IAAA,OAAO,GAAA,CAAI,IAAI,cAAc,CAAA;AAAA,EAC/B;AAGA,EAAA,OAAO,MAAA;AACT;AAeO,SAAS,gBAAA,CACd,WAAA,EACA,SAAA,EACA,OAAA,EACQ;AACR,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAY,KAAA,CAAA,OAAA,CAAQ,aAAa,OAAO,CAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,SAAA,GAAY,uBAAuB,WAAW,CAAA;AAGpD,EAAA,IAAI,UAAU,OAAA,EAAS;AACrB,IAAA,OAAY,KAAA,CAAA,OAAA,CAAQ,aAAa,KAAK,CAAA;AAAA,EACxC;AAGA,EAAA,OAAO,WAAA;AACT;ACpLA,IAAM,aAAA,GAAgB;AAAA,EACpB,uBAAA;AAAA,EACA,uBAAA;AAAA,EACA,iBAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,kBAAA,GAA+C;AAAA,EACnD,MAAA,EAAQ,CAAC,MAAM,CAAA;AAAA,EACf,YAAA,EAAc,CAAC,kBAAkB;AACnC,CAAA;AAUO,SAAS,iBAAA,CACd,aACA,SAAA,EACU;AACV,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,GAAG,aAAA;AAAA,IACH,GAAI,kBAAA,CAAmB,SAAS,CAAA,IAAK;AAAC,GACxC;AAEA,EAAA,MAAM,OAAA,GAAeE,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,cAAc,CAAA;AACrD,EAAA,IAAI,SAAA;AAEJ,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAASC,GAAA,CAAA,YAAA,CAAa,OAAA,EAAS,OAAO,CAAC,CAAA;AACxD,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,YAAA,IAAgB,EAAE,CAAA;AAC/C,IAAA,MAAM,UAAU,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,eAAA,IAAmB,EAAE,CAAA;AACrD,IAAA,SAAA,uBAAgB,GAAA,CAAI,CAAC,GAAG,IAAA,EAAM,GAAG,OAAO,CAAC,CAAA;AAAA,EAC3C,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,OAAO,QAAA,CAAS,OAAO,CAAC,GAAA,KAAQ,CAAC,SAAA,CAAU,GAAA,CAAI,GAAG,CAAC,CAAA;AACrD;ACxBO,SAAS,kBAAA,CACd,YACA,SAAA,EACS;AACT,EAAA,IAAI,SAAA,KAAc,UAAU,OAAO,IAAA;AACnC,EAAA,IAAI,SAAA,KAAc,SAAS,OAAO,KAAA;AAElC,EAAA,OAAO,UAAA,GAAa,CAAA;AACtB;AAIA,SAAS,aAAa,KAAA,EAA+B;AACnD,EAAA,OAAO,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,UAAU,CAAA;AACjD;AAEA,SAAS,iBAAiB,KAAA,EAA+B;AACvD,EAAA,OAAO,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AAChD;AAMA,SAAS,mBAAmB,KAAA,EAA+B;AACzD,EAAA,OAAO,MAAM,MAAA,CAAO,MAAA;AAAA,IAClB,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,UAAA,IAAc,CAAC,CAAA,CAAE,IAAA,IAAQ,CAAC,CAAA,CAAE,eAAA,IAAmB,CAAC,CAAA,CAAE;AAAA,GAC9D;AACF;AAIA,SAAS,oBAAA,CACP,QACA,KAAA,EACe;AACf,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AAC3B,IAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACrD,IAAA,MAAM,cAAA,GAAiB,mBAAmB,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAClE,IAAA,MAAM,SAAA,GAAY,iBAAiB,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAC3D,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,MAAA;AAEhC,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,WAAA,EAAa,OAAA;AAAA,MACb,UAAA,EAAY,cAAA;AAAA;AAAA,MACZ,gBAAA,EAAkB,SAAA;AAAA,MAClB,UAAA,EAAY,CAAC,KAAA,CAAM,MAAA;AAAA,MACnB,SAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,kBAAA,CAAmB,UAAA,EAAY,KAAA,CAAM,KAAK;AAAA,KACvD;AAAA,EACF,CAAC,CAAA;AACH;AAIA,SAAS,GAAA,CAAI,IAAwB,QAAA,EAAmC;AACtE,EAAA,OAAO,IAAI,QAAQ,CAACC,QAAAA,KAAY,GAAG,QAAA,CAAS,QAAA,EAAUA,QAAO,CAAC,CAAA;AAChE;AAMA,eAAe,WAAA,CACb,EAAA,EACAC,OAAAA,EACA,KAAA,EACmB;AACnB,EAAA,OAAA,CAAQ,IAAIA,OAAM,CAAA;AAClB,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAC,CAAA;AAC7D,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,EAAA,EAAI,qDAAqD,CAAA;AAClF,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,EAAK,CAAE,WAAA,EAAY;AAC1C,EAAA,IAAI,OAAA,KAAY,KAAA,IAAS,OAAA,KAAY,EAAA,EAAI;AACvC,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,OAAA,CACJ,MAAM,QAAQ,CAAA,CACd,IAAI,CAAC,CAAA,KAAM,SAAS,CAAA,EAAG,EAAE,IAAI,CAAC,CAAA,CAC9B,OAAO,CAAC,CAAA,KAAM,KAAK,CAAA,IAAK,CAAA,GAAI,MAAM,MAAM,CAAA;AAC7C;AAEA,eAAe,KAAA,CACb,EAAA,EACAA,OAAAA,EACA,UAAA,GAAa,IAAA,EACK;AAClB,EAAA,MAAM,IAAA,GAAO,aAAa,OAAA,GAAU,OAAA;AACpC,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,EAAA,EAAI,GAAGA,OAAM,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,CAAI,CAAA;AAClD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,EAAK,CAAE,WAAA,EAAY;AAC1C,EAAA,IAAI,OAAA,KAAY,IAAI,OAAO,UAAA;AAC3B,EAAA,OAAO,OAAA,KAAY,OAAO,OAAA,KAAY,KAAA;AACxC;AAIA,eAAe,sBAAA,CACb,QACA,KAAA,EACwB;AACxB,EAAA,MAAM,KAAc,QAAA,CAAA,eAAA,CAAgB;AAAA,IAClC,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,IAAI;AAEF,IAAA,MAAM,eAAe,MAAM,WAAA;AAAA,MACzB,EAAA;AAAA,MACA,wDAAA;AAAA,MACA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI;AAAA,KAC1B;AACA,IAAA,MAAM,iBAAiB,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AAExD,IAAA,MAAM,UAAyB,EAAC;AAEhC,IAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,MAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,yBAAA,EAAoB,KAAA,CAAM,IAAI,CAAA,aAAA,CAAK,CAAA;AAE/C,MAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,MAAA,MAAM,cAAA,GAAiB,mBAAmB,KAAK,CAAA;AAC/C,MAAA,MAAM,SAAA,GAAY,iBAAiB,KAAK,CAAA;AAGxC,MAAA,IAAI,oBAA8B,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAC7D,MAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,QAAA,MAAM,aAAa,MAAM,WAAA;AAAA,UACvB,EAAA;AAAA,UACA,CAAA,wBAAA,EAA2B,MAAM,IAAI,CAAA,+BAAA,CAAA;AAAA,UACrC,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI;AAAA,SAC7B;AACA,QAAA,iBAAA,GAAoB,WAAW,GAAA,CAAI,CAAC,MAAM,SAAA,CAAU,CAAC,EAAE,IAAI,CAAA;AAAA,MAC7D;AAGA,MAAA,MAAM,eAAe,MAAM,WAAA;AAAA,QACzB,EAAA;AAAA,QACA,CAAA,yCAAA,EAA4C,MAAM,IAAI,CAAA,CAAA,CAAA;AAAA,QACtD,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI;AAAA,OAC3B;AACA,MAAA,MAAM,WAAA,GAAc,aAAa,GAAA,CAAI,CAAC,MAAM,OAAA,CAAQ,CAAC,EAAE,IAAI,CAAA;AAG3D,MAAA,MAAM,cAAc,MAAM,WAAA;AAAA,QACxB,EAAA;AAAA,QACA,CAAA,oCAAA,EAAuC,MAAM,IAAI,CAAA,CAAA,CAAA;AAAA,QACjD,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI;AAAA,OAClC;AACA,MAAA,MAAM,UAAA,GAAa,YAAY,GAAA,CAAI,CAAC,MAAM,cAAA,CAAe,CAAC,EAAE,IAAI,CAAA;AAGhE,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,GACrB,KAAA,GACA,MAAM,MAAM,EAAA,EAAI,CAAA,yBAAA,EAA4B,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAG7D,MAAA,MAAM,YAAY,MAAM,KAAA,CAAM,IAAI,CAAA,6BAAA,EAAgC,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAG/E,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI,KAAA,CAAM,UAAU,QAAA,EAAU;AAC5B,QAAA,SAAA,GAAY,IAAA;AAAA,MACd,CAAA,MAAA,IAAW,KAAA,CAAM,KAAA,KAAU,OAAA,EAAS;AAClC,QAAA,SAAA,GAAY,KAAA;AAAA,MACd,CAAA,MAAO;AAEL,QAAA,MAAM,SAAA,GAAY,WAAW,MAAA,GAAS,CAAA;AACtC,QAAA,SAAA,GAAY,MAAM,KAAA;AAAA,UAChB,EAAA;AAAA,UACA,CAAA,6BAAA,EAAgC,MAAM,IAAI,CAAA,CAAA,CAAA;AAAA,UAC1C;AAAA,SACF;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,KAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,gBAAA,EAAkB,iBAAA;AAAA,QAClB,UAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,EAAA,CAAG,KAAA,EAAM;AAAA,EACX;AACF;AASA,eAAsB,WAAA,CACpB,QACA,KAAA,EACwB;AAExB,EAAA,MAAM,WACJ,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,YAAA,CAAa,SAAS,CAAA,GAC9C,MAAA,CAAO,MAAA,CAAO,CAAC,MAAM,KAAA,CAAM,YAAA,CAAc,SAAS,CAAA,CAAE,IAAI,CAAC,CAAA,GACzD,MAAA;AAEN,EAAA,IAAI,MAAM,SAAA,EAAW;AACnB,IAAA,OAAO,oBAAA,CAAqB,UAAU,KAAK,CAAA;AAAA,EAC7C;AAEA,EAAA,OAAO,sBAAA,CAAuB,UAAU,KAAK,CAAA;AAC/C;;;ACvOO,SAAS,gBAAA,CACd,QACA,WAAA,EACQ;AACR,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,MAAA,EAAQ,cAAa,GAAI,MAAA;AACrD,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAI,WAAA;AAC9B,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAU,GAAI,KAAA;AAG5B,EAAA,MAAM,KAAA,GAAQ,IAAA;AACd,EAAA,MAAM,MAAA,GAAS,GAAG,KAAK,CAAA,CAAA,CAAA;AAEvB,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,CAAM,KAAK,CAAA,8EAAA,CAAgF,CAAA;AAC3F,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAK,CAAA,iCAAA,CAAmC,CAAA;AACpE,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,OAAO,CAAA,EAAA,CAAI,CAAA;AAC3C,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,MAAM,CAAA,gCAAA,CAAkC,CAAA;AACzE,EAAA,KAAA,CAAM,KAAK,CAAA,mBAAA,CAAqB,CAAA;AAChC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,SAAS,CAAA,WAAA,CAAa,CAAA;AACpD,EAAA,KAAA,CAAM,KAAK,CAAA,oBAAA,CAAsB,CAAA;AACjC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,yCAAA,EAA4C,SAAS,CAAA,4BAAA,CAA8B,CAAA;AAC9F,EAAA,KAAA,CAAM,KAAK,CAAA,mBAAA,CAAqB,CAAA;AAChC,EAAA,KAAA,CAAM,KAAK,CAAA,oDAAA,CAAsD,CAAA;AACjE,EAAA,KAAA,CAAM,KAAK,CAAA,gFAAA,CAAkF,CAAA;AAC7F,EAAA,KAAA,CAAM,KAAK,CAAA,WAAA,CAAa,CAAA;AACxB,EAAA,KAAA,CAAM,KAAK,CAAA,OAAA,CAAS,CAAA;AACpB,EAAA,KAAA,CAAM,KAAK,CAAA,yDAAA,CAA2D,CAAA;AACtE,EAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AACnB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAA,CAAG,CAAA;AACzC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,MAAM,CAAA,CAAA,CAAG,CAAA;AACnC,EAAA,KAAA,CAAM,KAAK,CAAA,KAAA,CAAO,CAAA;AAClB,EAAA,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AACd,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,KAAK,CAAA,cAAA,CAAgB,CAAA;AACtD,EAAA,KAAA,CAAM,KAAK,CAAA,mBAAA,CAAqB,CAAA;AAChC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,SAAS,CAAA,OAAA,CAAS,CAAA;AAChD,EAAA,KAAA,CAAM,KAAK,CAAA,kBAAA,CAAoB,CAAA;AAC/B,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,2BAAA,EAA8B,SAAS,CAAA,iCAAA,CAAmC,CAAA;AACrF,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAA,CAAG,CAAA;AACzC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,MAAM,CAAA,CAAA,CAAG,CAAA;AACnC,EAAA,KAAA,CAAM,KAAK,CAAA,KAAA,CAAO,CAAA;AAClB,EAAA,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AACd,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,yBAAA,EAA4B,KAAK,CAAA,IAAA,CAAM,CAAA;AAClD,EAAA,KAAA,CAAM,KAAK,CAAA,uCAAA,CAAyC,CAAA;AACpD,EAAA,KAAA,CAAM,KAAK,CAAA,sBAAA,CAAwB,CAAA;AACnC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,8BAAA,EAAiC,KAAK,CAAA,eAAA,CAAiB,CAAA;AAClE,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,2BAAA,EAA8B,SAAS,CAAA,KAAA,CAAO,CAAA;AACzD,EAAA,KAAA,CAAM,KAAK,CAAA,uBAAA,CAAyB,CAAA;AACpC,EAAA,KAAA,CAAM,KAAK,CAAA,wDAAA,CAA0D,CAAA;AACrE,EAAA,KAAA,CAAM,KAAK,CAAA,mCAAA,CAAqC,CAAA;AAChD,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,0CAAA,EAA6C,KAAK,CAAA,EAAA,CAAI,CAAA;AACjE,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,KAAA,CAAM,KAAK,CAAA,kCAAA,CAAoC,CAAA;AAC/C,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oDAAA,EAAuD,SAAS,CAAA,MAAA,CAAQ,CAAA;AACnF,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kDAAA,EAAqD,SAAS,CAAA,IAAA,CAAM,CAAA;AAC/E,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iCAAA,EAAoC,SAAS,CAAA,oBAAA,CAAsB,CAAA;AAC9E,IAAA,KAAA,CAAM,KAAK,CAAA,eAAA,CAAiB,CAAA;AAC5B,IAAA,KAAA,CAAM,KAAK,CAAA,2EAAA,CAA6E,CAAA;AACxF,IAAA,KAAA,CAAM,KAAK,CAAA,UAAA,CAAY,CAAA;AACvB,IAAA,KAAA,CAAM,KAAK,CAAA,0BAAA,CAA4B,CAAA;AACvC,IAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AACnB,IAAA,KAAA,CAAM,KAAK,CAAA,oCAAA,CAAsC,CAAA;AACjD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iCAAA,EAAoC,SAAS,CAAA,mBAAA,CAAqB,CAAA;AAC7E,IAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AACnB,IAAA,KAAA,CAAM,KAAK,CAAA,sBAAA,CAAwB,CAAA;AACnC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kDAAA,EAAqD,SAAS,CAAA,MAAA,CAAQ,CAAA;AACjF,IAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AAAA,EACrB;AACA,EAAA,KAAA,CAAM,KAAK,CAAA,KAAA,CAAO,CAAA;AAClB,EAAA,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AACd,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,yBAAA,EAA4B,KAAK,CAAA,IAAA,CAAM,CAAA;AAClD,EAAA,KAAA,CAAM,KAAK,CAAA,uCAAA,CAAyC,CAAA;AACpD,EAAA,KAAA,CAAM,KAAK,CAAA,sBAAA,CAAwB,CAAA;AACnC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,0DAAA,EAA6D,KAAK,CAAA,iBAAA,CAAmB,CAAA;AAChG,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,2BAAA,EAA8B,SAAS,CAAA,YAAA,CAAc,CAAA;AAChE,EAAA,KAAA,CAAM,KAAK,CAAA,wBAAA,CAA0B,CAAA;AACrC,EAAA,KAAA,CAAM,KAAK,CAAA,wDAAA,CAA0D,CAAA;AACrE,EAAA,KAAA,CAAM,KAAK,CAAA,mCAAA,CAAqC,CAAA;AAChD,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,0CAAA,EAA6C,KAAK,CAAA,EAAA,CAAI,CAAA;AACjE,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,KAAA,CAAM,KAAK,CAAA,uCAAA,CAAyC,CAAA;AACpD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oDAAA,EAAuD,SAAS,CAAA,MAAA,CAAQ,CAAA;AACnF,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kDAAA,EAAqD,SAAS,CAAA,IAAA,CAAM,CAAA;AAC/E,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iCAAA,EAAoC,SAAS,CAAA,oBAAA,CAAsB,CAAA;AAC9E,IAAA,KAAA,CAAM,KAAK,CAAA,eAAA,CAAiB,CAAA;AAC5B,IAAA,KAAA,CAAM,KAAK,CAAA,kDAAA,CAAoD,CAAA;AAC/D,IAAA,KAAA,CAAM,KAAK,CAAA,sDAAA,CAAwD,CAAA;AACnE,IAAA,KAAA,CAAM,KAAK,CAAA,UAAA,CAAY,CAAA;AACvB,IAAA,KAAA,CAAM,KAAK,CAAA,UAAA,CAAY,CAAA;AACvB,IAAA,KAAA,CAAM,KAAK,CAAA,0BAAA,CAA4B,CAAA;AACvC,IAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AACnB,IAAA,KAAA,CAAM,KAAK,CAAA,oCAAA,CAAsC,CAAA;AACjD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iCAAA,EAAoC,SAAS,CAAA,mBAAA,CAAqB,CAAA;AAC7E,IAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AACnB,IAAA,KAAA,CAAM,KAAK,CAAA,sBAAA,CAAwB,CAAA;AACnC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kDAAA,EAAqD,SAAS,CAAA,MAAA,CAAQ,CAAA;AACjF,IAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AAAA,EACrB;AACA,EAAA,KAAA,CAAM,KAAK,CAAA,KAAA,CAAO,CAAA;AAClB,EAAA,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AACd,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,yBAAA,EAA4B,KAAK,CAAA,IAAA,CAAM,CAAA;AAClD,EAAA,KAAA,CAAM,KAAK,CAAA,uCAAA,CAAyC,CAAA;AACpD,EAAA,KAAA,CAAM,KAAK,CAAA,sBAAA,CAAwB,CAAA;AACnC,EAAA,KAAA,CAAM,KAAK,CAAA,+BAAA,CAAiC,CAAA;AAC5C,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,2BAAA,EAA8B,SAAS,CAAA,4CAAA,CAA8C,CAAA;AAChG,EAAA,KAAA,CAAM,KAAK,CAAA,gBAAA,CAAkB,CAAA;AAC7B,EAAA,KAAA,CAAM,KAAK,CAAA,QAAA,CAAU,CAAA;AACrB,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,KAAA,CAAM,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAC1C,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oDAAA,EAAuD,SAAS,CAAA,MAAA,CAAQ,CAAA;AACnF,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kDAAA,EAAqD,SAAS,CAAA,IAAA,CAAM,CAAA;AAC/E,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iCAAA,EAAoC,SAAS,CAAA,oBAAA,CAAsB,CAAA;AAC9E,IAAA,KAAA,CAAM,KAAK,CAAA,eAAA,CAAiB,CAAA;AAC5B,IAAA,KAAA,CAAM,KAAK,CAAA,sEAAA,CAAwE,CAAA;AACnF,IAAA,KAAA,CAAM,KAAK,CAAA,UAAA,CAAY,CAAA;AACvB,IAAA,KAAA,CAAM,KAAK,CAAA,0BAAA,CAA4B,CAAA;AACvC,IAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AACnB,IAAA,KAAA,CAAM,KAAK,CAAA,oCAAA,CAAsC,CAAA;AACjD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iCAAA,EAAoC,SAAS,CAAA,mBAAA,CAAqB,CAAA;AAC7E,IAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AACnB,IAAA,KAAA,CAAM,KAAK,CAAA,sBAAA,CAAwB,CAAA;AACnC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kDAAA,EAAqD,SAAS,CAAA,MAAA,CAAQ,CAAA;AACjF,IAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AAAA,EACrB;AACA,EAAA,KAAA,CAAM,KAAK,CAAA,KAAA,CAAO,CAAA;AAClB,EAAA,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AACd,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,IAAI,eAAe,KAAA,EAAO;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,6BAAA,EAAgC,MAAM,CAAA,IAAA,CAAM,CAAA;AACvD,IAAA,KAAA,CAAM,KAAK,CAAA,uCAAA,CAAyC,CAAA;AACpD,IAAA,KAAA,CAAM,KAAK,CAAA,sBAAA,CAAwB,CAAA;AACnC,IAAA,KAAA,CAAM,KAAK,CAAA,kCAAA,CAAoC,CAAA;AAC/C,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,2BAAA,EAA8B,SAAS,CAAA,KAAA,CAAO,CAAA;AACzD,IAAA,KAAA,CAAM,KAAK,CAAA,yBAAA,CAA2B,CAAA;AACtC,IAAA,KAAA,CAAM,KAAK,CAAA,wDAAA,CAA0D,CAAA;AACrE,IAAA,KAAA,CAAM,KAAK,CAAA,sCAAA,CAAwC,CAAA;AACnD,IAAA,KAAA,CAAM,KAAK,CAAA,+BAAA,CAAiC,CAAA;AAC5C,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,KAAA,CAAM,KAAK,CAAA,8BAAA,CAAgC,CAAA;AAC3C,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oDAAA,EAAuD,SAAS,CAAA,MAAA,CAAQ,CAAA;AACnF,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kDAAA,EAAqD,SAAS,CAAA,IAAA,CAAM,CAAA;AAC/E,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iCAAA,EAAoC,SAAS,CAAA,oBAAA,CAAsB,CAAA;AAC9E,MAAA,KAAA,CAAM,KAAK,CAAA,eAAA,CAAiB,CAAA;AAC5B,MAAA,KAAA,CAAM,KAAK,CAAA,8EAAA,CAAgF,CAAA;AAC3F,MAAA,KAAA,CAAM,KAAK,CAAA,UAAA,CAAY,CAAA;AACvB,MAAA,KAAA,CAAM,KAAK,CAAA,0BAAA,CAA4B,CAAA;AACvC,MAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AACnB,MAAA,KAAA,CAAM,KAAK,CAAA,oCAAA,CAAsC,CAAA;AACjD,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iCAAA,EAAoC,SAAS,CAAA,mBAAA,CAAqB,CAAA;AAC7E,MAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AACnB,MAAA,KAAA,CAAM,KAAK,CAAA,sBAAA,CAAwB,CAAA;AACnC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kDAAA,EAAqD,SAAS,CAAA,MAAA,CAAQ,CAAA;AACjF,MAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AAAA,IACrB;AACA,IAAA,KAAA,CAAM,KAAK,CAAA,KAAA,CAAO,CAAA;AAClB,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AACd,IAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,EACf;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;ACpLO,SAAS,aAAa,IAAA,EAAsB;AAEjD,EAAA,OAAO,IAAA,CACJ,OAAA,CAAQ,UAAA,EAAY,KAAK,CAAA,CACzB,OAAA,CAAQ,IAAA,EAAM,CAAC,EAAA,KAAO,EAAA,CAAG,WAAA,EAAa,EACtC,IAAA,EAAK;AACV;AAiBO,SAAS,aAAa,KAAA,EAAiC;AAC5D,EAAA,IAAI,KAAA,CAAM,YAAY,OAAO,mBAAA;AAE7B,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,QAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,KAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT;AAIE,MAAA,IAAI,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,OAAO,QAAA;AACtC,MAAA,OAAO,MAAA;AAAA;AAEb;AAMO,SAAS,WAAA,CAAY,MAAA,EAAkB,UAAA,GAAa,CAAA,EAAe;AACxE,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,UAAA,EAAY;AAClD,IAAA,KAAA,CAAM,KAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,UAAU,CAAC,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,KAAA;AACT;;;AC1DO,SAAS,mBAAA,CACd,SACA,WAAA,EACQ;AACR,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,WAAA;AAC/B,EAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AAGjB,EAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAE3D,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,CAAM,KAAK,CAAA,uDAAA,CAAyD,CAAA;AACpE,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,IAAI,CAAA,yBAAA,CAA2B,CAAA;AAC3D,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,OAAO,CAAA,mBAAA,EAAsB,IAAI,CAAA,OAAA,CAAS,CAAA;AAGrE,EAAA,KAAA,MAAW,SAAS,WAAA,EAAa;AAC/B,IAAA,KAAA,CAAM,KAAK,CAAA,GAAA,CAAK,CAAA;AAChB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,KAAK,CAAA,EAAA,CAAI,CAAA;AACzC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,YAAA,CAAa,KAAK,CAAC,CAAA,EAAA,CAAI,CAAA;AAClD,IAAA,KAAA,CAAM,KAAK,CAAA,IAAA,CAAM,CAAA;AAAA,EACnB;AAGA,EAAA,KAAA,CAAM,KAAK,CAAA,GAAA,CAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,CAAA,kBAAA,CAAoB,CAAA;AAC/B,EAAA,KAAA,CAAM,KAAK,CAAA,sBAAA,CAAwB,CAAA;AACnC,EAAA,KAAA,CAAM,KAAK,CAAA,wBAAA,CAA0B,CAAA;AACrC,EAAA,KAAA,CAAM,KAAK,CAAA,kCAAA,CAAoC,CAAA;AAC/C,EAAA,KAAA,CAAM,KAAK,CAAA,oEAAA,CAAsE,CAAA;AACjF,EAAA,KAAA,CAAM,KAAK,CAAA,sEAAA,CAAwE,CAAA;AACnF,EAAA,KAAA,CAAM,KAAK,CAAA,YAAA,CAAc,CAAA;AACzB,EAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AACnB,EAAA,KAAA,CAAM,KAAK,CAAA,IAAA,CAAM,CAAA;AAEjB,EAAA,KAAA,CAAM,KAAK,CAAA,EAAA,CAAI,CAAA;AACf,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAEb,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;AC7CO,SAAS,iBAAA,CACd,QACA,WAAA,EACQ;AACR,EAAA,MAAM,EAAE,WAAU,GAAI,MAAA;AACtB,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,SAAA,EAAU,GAAI,WAAA;AACzC,EAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AAGjB,EAAA,MAAM,KAAA,GAAQ,IAAA;AACd,EAAA,MAAM,MAAA,GAAS,GAAG,KAAK,CAAA,CAAA,CAAA;AACvB,EAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAG3D,EAAA,MAAM,WAAA,GAAc,MAAM,MAAM,CAAA,CAAA;AAChC,EAAA,MAAM,aAAA,GAAgB,YAAY,KAAK,CAAA,CAAA;AACvC,EAAA,MAAM,iBAAA,GAAoB,gBAAgB,MAAM,CAAA,CAAA;AAGhD,EAAA,MAAM,UAAA,GAAa,GAAG,OAAO,CAAA,OAAA,CAAA;AAE7B,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,IAAA,KAAA,CAAM,KAAK,CAAA,YAAA,CAAc,CAAA;AACzB,IAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,EACf;AAGA,EAAA,MAAM,WAAA,GAAwB,CAAC,WAAA,EAAa,aAAa,CAAA;AACzD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,WAAA,CAAY,KAAK,iBAAiB,CAAA;AAAA,EACpC;AAGA,EAAA,KAAA,CAAM,KAAK,CAAA,sCAAA,CAAwC,CAAA;AACnD,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,UAAU,CAAA,WAAA,EAAc,KAAK,CAAA,SAAA,CAAW,CAAA;AAC/D,EAAA,KAAA,CAAM,IAAA,CAAK,YAAY,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,wBAAA,EAA2B,KAAK,CAAA,EAAA,CAAI,CAAA;AACjF,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,KAAK,CAAA,SAAA,CAAW,CAAA;AAC9C,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,WAAW,CAAA,GAAA,CAAK,CAAA;AACjD,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,OAAO,CAAA,SAAA,EAAY,aAAa,CAAA,GAAA,CAAK,CAAA;AAE3D,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,OAAO,CAAA,aAAA,EAAgB,iBAAiB,CAAA,GAAA,CAAK,CAAA;AAAA,EACrE;AAEA,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,CAAA,UAAA,CAAY,CAAA;AAGvB,EAAA,MAAM,OAAA,GAAoB;AAAA,IACxB,kBAAkB,UAAU,CAAA,CAAA,CAAA;AAAA,IAC5B,CAAA,6BAAA,CAAA;AAAA,IACA,+BAA+B,OAAO,CAAA,sBAAA;AAAA,GACxC;AAEA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkC,OAAO,CAAA,yCAAA,CAA2C,CAAA;AAAA,EACnG;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAA,CAAQ,KAAK,CAAA,sBAAA,CAAwB,CAAA;AAAA,EACvC;AAEA,EAAA,KAAA,CAAM,KAAK,CAAA,cAAA,CAAgB,CAAA;AAC3B,EAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB;AACA,EAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AACnB,EAAA,KAAA,CAAM,KAAK,CAAA,IAAA,CAAM,CAAA;AACjB,EAAA,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AACd,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAEb,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;AC7EO,SAAS,gBAAA,CACd,QACA,WAAA,EACQ;AACR,EAAA,MAAM,EAAE,WAAU,GAAI,MAAA;AACtB,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,gBAAA,EAAAC,iBAAAA,EAAkB,WAAU,GAAI,WAAA;AAC3D,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAU,GAAI,KAAA;AAEpC,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,IAAA,KAAA,CAAM,KAAK,CAAA,YAAA,CAAc,CAAA;AACzB,IAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,EACf;AAGA,EAAA,MAAM,sBAA0E,EAAC;AACjF,EAAA,KAAA,MAAW,gBAAgBA,iBAAAA,EAAkB;AAC3C,IAAA,MAAM,YAAY,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,YAAY,CAAA;AAC/D,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,mBAAA,CAAoB,IAAA,CAAK;AAAA,QACvB,SAAA,EAAW,YAAA;AAAA,QACX,cAAc,SAAA,CAAU;AAAA;AAAA,OACzB,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,KAAA,CAAM,KAAK,CAAA,kDAAA,CAAoD,CAAA;AAC/D,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,IAAI,CAAA,8CAAA,CAAgD,CAAA;AAC3E,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,CAAA,kBAAA,EAAqB,IAAI,CAAA,WAAA,EAAc,IAAI,2BAA2B,IAAI,CAAA,EAAA;AAAA,GAC5E;AAGA,EAAA,KAAA,MAAW,EAAE,YAAA,EAAa,IAAK,mBAAA,EAAqB;AAClD,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,YAAA,EAAe,YAAY,CAAA,yBAAA,EAA4B,YAAY,CAAA,EAAA;AAAA,KACrE;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,IAAI,CAAA,+BAAA,CAAiC,CAAA;AACnE,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,IAAI,CAAA,YAAA,EAAe,IAAI,CAAA,GAAA,CAAK,CAAA;AACxD,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,IAAI,CAAA,YAAA,EAAe,IAAI,CAAA,GAAA,CAAK,CAAA;AAGxD,EAAA,KAAA,MAAW,EAAE,SAAA,EAAW,YAAA,EAAa,IAAK,mBAAA,EAAqB;AAC7D,IAAA,MAAM,OAAA,GACJ,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,CAAE,aAAY,GAAI,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,GAAI,SAAA;AAC3D,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,gBAAA,EAAmB,OAAO,CAAA,YAAA,EAAe,YAAY,CAAA,IAAA;AAAA,KACvD;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,KAAA,CAAM,KAAK,CAAA,kBAAA,CAAoB,CAAA;AAG/B,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,YAAY,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,SAAS,CAAA;AAC5D,IAAA,MAAM,IAAA,GAAO,SAAA,GAAY,YAAA,CAAa,SAAS,CAAA,GAAI,MAAA;AACnD,IAAA,KAAA,CAAM,KAAK,CAAA,KAAA,CAAO,CAAA;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,SAAS,CAAA,EAAA,CAAI,CAAA;AACxC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,YAAA,CAAa,SAAS,CAAC,CAAA,EAAA,CAAI,CAAA;AACvD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,IAAI,CAAA,EAAA,CAAI,CAAA;AACnC,IAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AAAA,EACrB;AAGA,EAAA,KAAA,MAAW,EAAE,SAAA,EAAW,YAAA,EAAa,IAAK,mBAAA,EAAqB;AAC7D,IAAA,MAAM,OAAA,GACJ,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,CAAE,aAAY,GAAI,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,GAAI,SAAA;AAC3D,IAAA,KAAA,CAAM,KAAK,CAAA,KAAA,CAAO,CAAA;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,SAAS,CAAA,EAAA,CAAI,CAAA;AACxC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,YAAA,CAAa,SAAS,CAAC,CAAA,EAAA,CAAI,CAAA;AACvD,IAAA,KAAA,CAAM,KAAK,CAAA,gCAAA,CAAkC,CAAA;AAC7C,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,mBAAmB,OAAO,CAAA,4FAAA;AAAA,KAC5B;AACA,IAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AAAA,EACrB;AAEA,EAAA,KAAA,CAAM,KAAK,CAAA,IAAA,CAAM,CAAA;AACjB,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,IAAI,SAAA,EAAW;AAEb,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,GAAG,UAAA;AAAA,MACH,GAAG,mBAAA,CAAoB,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,SAAS;AAAA,KAC/C;AACA,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,aAAA,EAAe,CAAC,CAAA;AAE3C,IAAA,KAAA,CAAM,KAAK,CAAA,iBAAA,CAAmB,CAAA;AAC9B,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,CAAA,KAAM;AAC3B,MAAA,KAAA,CAAM,KAAK,CAAA,KAAA,CAAO,CAAA;AAClB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,CAAA,GAAI,CAAC,CAAA,EAAA,CAAI,CAAA;AAC1C,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,CAAA,eAAA,EAAkB,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA;AAAA,OACzD;AACA,MAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AAAA,IACrB,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,KAAK,CAAA,IAAA,CAAM,CAAA;AACjB,IAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAEb,IAAA,KAAA,CAAM,KAAK,CAAA,UAAA,CAAY,CAAA;AACvB,IAAA,KAAA,CAAM,KAAK,CAAA,kBAAA,CAAoB,CAAA;AAC/B,IAAA,KAAA,CAAM,KAAK,CAAA,qBAAA,CAAuB,CAAA;AAClC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,IAAI,CAAA,aAAA,CAAe,CAAA;AAC/C,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,qCAAA,EAAwC,IAAI,CAAA,8BAAA,EAAiC,IAAI,CAAA,cAAA;AAAA,KACnF;AACA,IAAA,KAAA,CAAM,KAAK,CAAA,mBAAA,CAAqB,CAAA;AAChC,IAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AACnB,IAAA,KAAA,CAAM,KAAK,CAAA,IAAA,CAAM,CAAA;AAAA,EACnB,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,KAAK,CAAA,UAAA,CAAY,CAAA;AACvB,IAAA,KAAA,CAAM,KAAK,CAAA,kBAAA,CAAoB,CAAA;AAC/B,IAAA,KAAA,CAAM,KAAK,CAAA,qBAAA,CAAuB,CAAA;AAClC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,IAAI,CAAA,aAAA,CAAe,CAAA;AAC/C,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,qCAAA,EAAwC,IAAI,CAAA,8BAAA,EAAiC,IAAI,CAAA,cAAA;AAAA,KACnF;AACA,IAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AACnB,IAAA,KAAA,CAAM,KAAK,CAAA,IAAA,CAAM,CAAA;AAAA,EACnB;AAEA,EAAA,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AACd,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAEb,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;AC3HO,SAAS,gBAAA,CACd,QACA,WAAA,EACQ;AACR,EAAA,MAAM,EAAE,OAAM,GAAI,WAAA;AAClB,EAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,EAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAC9D,EAAA,MAAM,aAAa,IAAA,GAAO,GAAA;AAE1B,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,CAAM,KAAK,CAAA,YAAA,CAAc,CAAA;AACzB,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,KAAA,CAAM,KAAK,CAAA,SAAA,EAAY,IAAI,8BAA8B,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,MAAA,CAAQ,CAAA;AACnF,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,wBAAA,EAA2B,UAAU,CAAA,QAAA,CAAU,CAAA;AAC1D,EAAA,KAAA,CAAM,KAAK,CAAA,UAAA,CAAY,CAAA;AACvB,EAAA,KAAA,CAAM,KAAK,CAAA,6CAAA,CAA+C,CAAA;AAC1D,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,8CAAA,EAAiD,UAAU,CAAA,KAAA,CAAO,CAAA;AAC7E,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,CAAA,QAAA,CAAU,CAAA;AACnC,EAAA,KAAA,CAAM,KAAK,CAAA,UAAA,CAAY,CAAA;AACvB,EAAA,KAAA,CAAM,KAAK,CAAA,GAAA,CAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AACd,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAEb,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;AClCO,SAAS,iBAAiB,MAAA,EAAiC;AAChE,EAAA,MAAM,EAAE,QAAO,GAAI,MAAA;AAEnB,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,CAAM,KAAK,CAAA,GAAA,CAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,CAAA,oDAAA,CAAsD,CAAA;AACjE,EAAA,KAAA,CAAM,KAAK,CAAA,sDAAA,CAAmD,CAAA;AAC9D,EAAA,KAAA,CAAM,KAAK,CAAA,+BAAA,CAAiC,CAAA;AAC5C,EAAA,KAAA,CAAM,KAAK,CAAA,GAAA,CAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,KAAA,CAAM,KAAK,CAAA,2BAAA,CAA6B,CAAA;AACxC,EAAA,KAAA,CAAM,KAAK,CAAA,gBAAA,CAAkB,CAAA;AAC7B,EAAA,KAAA,CAAM,KAAK,CAAA,eAAA,CAAiB,CAAA;AAC5B,EAAA,KAAA,CAAM,KAAK,CAAA,gBAAA,CAAkB,CAAA;AAC7B,EAAA,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AACd,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,KAAA,CAAM,KAAK,CAAA,8CAAA,CAAgD,CAAA;AAE3D,EAAA,KAAA,MAAW,eAAe,MAAA,EAAQ;AAChC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,WAAA,CAAY,KAAA;AAC7B,IAAA,MAAM,aAAa,IAAA,GAAO,GAAA;AAC1B,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,WAAA,EAAa,CAAA,CAAA,CAAA;AAEpC,IAAA,KAAA,CAAM,KAAK,CAAA,GAAA,CAAK,CAAA;AAChB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,UAAU,CAAA,EAAA,CAAI,CAAA;AACxC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,KAAK,CAAA,EAAA,CAAI,CAAA;AAClC,IAAA,KAAA,CAAM,KAAK,CAAA,IAAA,CAAM,CAAA;AAAA,EACnB;AAEA,EAAA,KAAA,CAAM,KAAK,CAAA,EAAA,CAAI,CAAA;AACf,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,KAAA,CAAM,KAAK,CAAA,GAAA,CAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,CAAA,+BAAA,CAAiC,CAAA;AAC5C,EAAA,KAAA,CAAM,KAAK,CAAA,GAAA,CAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,CAAA,yEAAA,CAA2E,CAAA;AACtF,EAAA,KAAA,CAAM,KAAK,CAAA,8DAAA,CAAgE,CAAA;AAC3E,EAAA,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AACd,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,KAAA,CAAM,KAAK,CAAA,GAAA,CAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,CAAA,8BAAA,CAAgC,CAAA;AAC3C,EAAA,KAAA,CAAM,KAAK,CAAA,GAAA,CAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,CAAA,uEAAA,CAAyE,CAAA;AACpF,EAAA,KAAA,CAAM,KAAK,CAAA,4DAAA,CAA8D,CAAA;AACzE,EAAA,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AACd,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAEb,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;ACtEA,IAAM,KAAA,GAAS,UAAA;AACf,IAAM,MAAA,GAAS,UAAA;AACf,IAAM,IAAA,GAAS,UAAA;AACf,IAAM,GAAA,GAAS,UAAA;AACf,IAAM,KAAA,GAAS,SAAA;AAaf,eAAsB,SAAA,CAAU,UAAkB,OAAA,EAAsC;AACtF,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI;AACF,IAAA,OAAA,GAAaC,eAAW,QAAQ,CAAA;AAChC,IAAGA,cAAeC,KAAA,CAAA,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACxD,IAAGD,GAAA,CAAA,aAAA,CAAc,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA;AAC1C,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,OAAA,GAAU,gBAAgB,SAAA,EAAU;AAAA,EACvE,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,SAAS,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA,EAAE;AAAA,EACvG;AACF;AAMA,IAAM,eAAA,GAAwD;AAAA,EAC5D,EAAE,GAAA,EAAK,8BAAA,EAAmC,IAAA,EAAM,2BAAA,EAA4B;AAAA,EAC5E,EAAE,GAAA,EAAK,kCAAA,EAAoC,IAAA,EAAM,+BAAA;AACnD,CAAA;AAUA,eAAsB,kBAAA,CAAmB,WAAmB,WAAA,EAA4C;AACtG,EAAA,MAAM,UAAwB,EAAC;AAE/B,EAAA,KAAA,MAAW,EAAE,GAAA,EAAK,IAAA,EAAK,IAAK,eAAA,EAAiB;AAC3C,IAAA,MAAM,OAAA,GAAgBC,KAAA,CAAA,IAAA,CAAK,WAAA,EAAa,GAAG,CAAA;AAC3C,IAAA,MAAM,QAAA,GAAgBA,KAAA,CAAA,IAAA,CAAK,SAAA,EAAW,IAAI,CAAA;AAE1C,IAAA,IAAOD,GAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,MAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,WAAW,CAAA;AAClD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAGA,cAAeC,KAAA,CAAA,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACxD,MAAGD,GAAA,CAAA,YAAA,CAAa,SAAS,QAAQ,CAAA;AACjC,MAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,WAAW,CAAA;AAAA,IACpD,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,OAAA;AAAA,QACR,KAAA,EAAO,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC;AAAA,OAC1D,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAgBO,SAAS,aAAa,OAAA,EAA6B;AACxD,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,QAAQ,EAAE,MAAA;AAAQ,MAChB,KAAK,SAAA;AACH,QAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,KAAK,CAAA,MAAA,EAAI,KAAK,CAAA,aAAA,EAAgB,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AACrD,QAAA;AAAA,MACF,KAAK,aAAA;AACH,QAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,MAAM,CAAA,MAAA,EAAI,KAAK,CAAA,aAAA,EAAgB,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AACtD,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,IAAI,CAAA,MAAA,EAAI,KAAK,CAAA,aAAA,EAAgB,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AACpD,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,OAAA,CAAQ,IAAI,CAAA,EAAG,GAAG,CAAA,MAAA,EAAI,KAAK,gBAAgB,CAAA,CAAE,IAAI,CAAA,EAAG,CAAA,CAAE,QAAQ,CAAA,QAAA,EAAM,CAAA,CAAE,MAAM,OAAO,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAC5F,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,MAAM,UAAc,OAAA,CAAQ,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,CAAE,MAAA;AAChE,EAAA,MAAM,cAAc,OAAA,CAAQ,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,aAAa,CAAA,CAAE,MAAA;AACpE,EAAA,MAAM,UAAc,OAAA,CAAQ,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,CAAE,MAAA;AAChE,EAAA,MAAM,SAAc,OAAA,CAAQ,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,OAAO,CAAA,CAAE,MAAA;AAE9D,EAAA,OAAA,CAAQ,GAAA;AAAA,IACN;AAAA,UAAA,EAAe,OAAO,CAAA,QAAA,EAAW,WAAW,CAAA,cAAA,EAAiB,OAAO,aAAa,MAAM,CAAA,QAAA;AAAA,GACzF;AACF;;;ACpGA,IAAM,MAAA,GAAS;AAAA,EACb,KAAA,EAAQ,CAAC,CAAA,KAAc,CAAA,QAAA,EAAW,CAAC,CAAA,OAAA,CAAA;AAAA,EACnC,MAAA,EAAQ,CAAC,CAAA,KAAc,CAAA,QAAA,EAAW,CAAC,CAAA,OAAA,CAAA;AAAA,EACnC,IAAA,EAAQ,CAAC,CAAA,KAAc,CAAA,QAAA,EAAW,CAAC,CAAA,OAAA,CAAA;AAAA,EACnC,GAAA,EAAQ,CAAC,CAAA,KAAc,CAAA,QAAA,EAAW,CAAC,CAAA,OAAA,CAAA;AAAA,EACnC,IAAA,EAAQ,CAAC,CAAA,KAAc,CAAA,OAAA,EAAU,CAAC,CAAA,OAAA;AACpC,CAAA;AAiBA,eAAsB,YAAY,MAAA,EAAgD;AAChF,EAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,aAAY,GAAI,MAAA;AACtD,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,aAAA,IAAkB,SAAA,KAAc,QAAA;AAC7D,EAAA,MAAM,YAAA,GAAe,OAAO,YAAA,IAAgB,IAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,OAAO,UAAA,IAAc,oBAAA;AAGxC,EAAA,MAAM,WAAA,GAAmBE,KAAA,CAAA,OAAA,CAAQ,SAAA,EAAW,IAAI,CAAA;AAEhD,EAAA,MAAM,UAAwB,EAAC;AAG/B,EAAA,MAAM,SAAA,GAAY,uBAAuB,WAAW,CAAA;AAEpD,EAAA,KAAA,MAAW,eAAe,MAAA,EAAQ;AAChC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,WAAA,CAAY,KAAA;AAC7B,IAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAG9D,IAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,MAAA,EAAQ,WAAW,CAAA;AACxD,IAAA,MAAM,WAAgBA,KAAA,CAAA,IAAA,CAAK,SAAA,EAAW,OAAA,EAAS,CAAA,GAAA,EAAM,IAAI,CAAA,GAAA,CAAK,CAAA;AAC9D,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,SAAA,CAAU,QAAA,EAAU,WAAW,CAAC,CAAA;AAGnD,IAAA,MAAM,cAAA,GAAiB,mBAAA,CAAoB,MAAA,EAAQ,WAAW,CAAA;AAC9D,IAAA,MAAM,cAAmBA,KAAA,CAAA,IAAA,CAAK,SAAA,EAAW,cAAc,UAAA,EAAY,CAAA,EAAG,IAAI,CAAA,WAAA,CAAa,CAAA;AACvF,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,SAAA,CAAU,WAAA,EAAa,cAAc,CAAC,CAAA;AAGzD,IAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,MAAA,EAAQ,WAAW,CAAA;AAC1D,IAAA,MAAM,YAAiBA,KAAA,CAAA,IAAA,CAAK,SAAA,EAAW,cAAc,UAAA,EAAY,CAAA,EAAG,IAAI,CAAA,SAAA,CAAW,CAAA;AACnF,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,SAAA,CAAU,SAAA,EAAW,YAAY,CAAC,CAAA;AAGrD,IAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,MAAA,EAAQ,WAAW,CAAA;AACxD,IAAA,MAAM,WAAgBA,KAAA,CAAA,IAAA,CAAK,SAAA,EAAW,cAAc,UAAA,EAAY,CAAA,EAAG,IAAI,CAAA,QAAA,CAAU,CAAA;AACjF,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,SAAA,CAAU,QAAA,EAAU,WAAW,CAAC,CAAA;AAGnD,IAAA,IAAI,iBAAiB,SAAA,KAAc,QAAA,IAAY,SAAA,CAAU,aAAA,IAAiB,UAAU,OAAA,EAAS;AAC3F,MAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,MAAA,EAAQ,WAAW,CAAA;AACxD,MAAA,MAAM,WAAA,GAAe,IAAA,CAAK,WAAA,EAAY,GAAI,GAAA;AAC1C,MAAA,MAAM,QAAA,GAAgBA,WAAK,SAAA,CAAU,OAAA,EAAS,IAAI,UAAU,CAAA,CAAA,CAAA,EAAK,aAAa,UAAU,CAAA;AACxF,MAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,SAAA,CAAU,QAAA,EAAU,WAAW,CAAC,CAAA;AAAA,IACrD;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,MAAM,kBAAA,CAAmB,SAAA,EAAW,WAAW,CAAA;AACnE,EAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,WAAW,CAAA;AAG3B,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,WAAA,GAAc,iBAAiB,MAAM,CAAA;AAC3C,IAAA,MAAM,QAAA,GAAgBA,KAAA,CAAA,IAAA,CAAK,SAAA,EAAW,KAAA,EAAO,cAAc,CAAA;AAC3D,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,SAAA,CAAU,QAAA,EAAU,WAAW,CAAC,CAAA;AAAA,EACrD;AAGA,EAAA,YAAA,CAAa,OAAO,CAAA;AAEpB,EAAA,OAAO,OAAA;AACT;AAMA,IAAM,SAAA,GAAY;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAqBlB,SAAS,OAAO,QAAA,EAAmC;AACjD,EAAA,MAAM,EAAA,GAAcC,yBAAgB,EAAE,KAAA,EAAO,QAAQ,KAAA,EAAO,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA;AACpF,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACN,QAAAA,KAAY;AAC9B,IAAA,EAAA,CAAG,QAAA,CAAS,QAAA,EAAU,CAAC,MAAA,KAAW;AAChC,MAAA,EAAA,CAAG,KAAA,EAAM;AACT,MAAAA,QAAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,CAAA;AAAA,IACvB,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AASA,eAAsB,IAAI,IAAA,EAA+B;AAEvD,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,YAAA,GAAe,KAAA;AACnB,EAAA,IAAI,aAAA,GAAgB,IAAA;AACpB,EAAA,IAAI,YAAA,GAAe,IAAA;AACnB,EAAA,IAAI,UAAA,GAAa,oBAAA;AACjB,EAAA,IAAI,SAAA,GAAY,GAAA;AAChB,EAAA,IAAI,MAAA,GAAS,GAAA;AACb,EAAA,IAAI,SAAA,GAAyC,MAAA;AAE7C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,QAAQ,GAAA;AAAK,MACX,KAAK,QAAA;AACH,QAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AACrB,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,UAAA,GAAa,IAAA,CAAK,EAAE,CAAC,CAAA;AACrB,QAAA;AAAA,MACF,KAAK,gBAAA;AACH,QAAA,eAAA,GAAkB,IAAA,CAAK,EAAE,CAAC,CAAA;AAC1B,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,OAAA,GAAU,IAAA,CAAK,EAAE,CAAC,CAAA;AAClB,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,UAAA,GAAa,IAAA,CAAK,EAAE,CAAC,CAAA;AACrB,QAAA;AAAA,MACF,KAAK,aAAA;AACH,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,MAAA,GAAS,IAAA;AACT,QAAA;AAAA,MACF,KAAK,iBAAA;AACH,QAAA,YAAA,GAAe,IAAA;AACf,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,aAAA,GAAgB,KAAA;AAChB,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,YAAA,GAAe,KAAA;AACf,QAAA;AAAA,MACF,KAAK,eAAA;AACH,QAAA,UAAA,GAAa,IAAA,CAAK,EAAE,CAAC,CAAA;AACrB,QAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA,SAAA,GAAY,SAAS,IAAA,CAAK,EAAE,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AACvC,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,MAAA,GAAS,SAAS,IAAA,CAAK,EAAE,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AACpC,QAAA;AAAA,MACF,KAAK,SAAA,EAAW;AACd,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AACpB,QAAA,IAAI,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,OAAA,IAAW,QAAQ,MAAA,EAAQ;AACzD,UAAA,SAAA,GAAY,GAAA;AAAA,QACd;AACA,QAAA;AAAA,MACF;AAAA;AACF,EACF;AAEA,EAAA,MAAML,IAAAA,GAAM,QAAQ,GAAA,EAAI;AAExB,EAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,wCAAqC,CAAC,CAAA;AAG9D,EAAA,IAAI,WAAA;AAEJ,EAAA,IAAI,eAAA,EAAiB;AAEnB,IAAA,MAAM,WAAW,SAAA,CAAQ,MAAM,CAAA,CAAE,OAAA,CAAQA,MAAK,eAAe,CAAA;AAC7D,IAAA,MAAMD,GAAAA,GAAK,UAAQ,IAAI,CAAA;AACvB,IAAA,IAAI,CAACA,GAAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,IAAK,CAACA,GAAAA,CAAG,QAAA,CAAS,QAAQ,CAAA,CAAE,WAAA,EAAY,EAAG;AACpE,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,MAAA,CAAO,GAAA;AAAA,UACL,uEAAkE,QAAQ,CAAA,CAAA;AAAA;AAC5E,OACF;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AACA,IAAA,WAAA,GAAc,QAAA;AAAA,EAChB,CAAA,MAAO;AAEL,IAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,CAAmBC,IAAG,CAAA;AAE/C,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAE3B,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,MAAA,CAAO,GAAA;AAAA,UACL,CAAA;AAAA;AAAA,kEAAA;AAAA;AAGF,OACF;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AAEzB,QAAA,OAAA,CAAQ,KAAA,CAAM,OAAO,GAAA,CAAI,CAAA;AAAA,CAA4E,CAAC,CAAA;AACtG,QAAA,UAAA,CAAW,QAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,MAAM,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,EAAE,GAAG,CAAA,SAAA,EAAY,CAAA,CAAE,KAAK,GAAG,CAAC,CAAA;AACxF,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,WAAA,GAAc,UAAA,CAAW,CAAC,CAAA,CAAE,GAAA;AAC5B,MAAA,OAAA,CAAQ,IAAI,MAAA,CAAO,IAAA,CAAK,CAAA,6BAAA,EAA2B,WAAW,EAAE,CAAC,CAAA;AAAA,IACnE,CAAA,MAAA,IAAW,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAElC,MAAA,MAAM,SAAS,MAAM,MAAA;AAAA,QACnB,4BAA4B,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA,CAAE,GAAG,CAAC;AAAA,6BAAA;AAAA,OAC5D;AACA,MAAA,IAAI,OAAO,WAAA,EAAY,KAAM,OAAO,MAAA,CAAO,WAAA,OAAkB,IAAA,EAAM;AACjE,QAAA,OAAA,CAAQ,IAAI,YAAY,CAAA;AACxB,QAAA;AAAA,MACF;AACA,MAAA,WAAA,GAAc,UAAA,CAAW,CAAC,CAAA,CAAE,GAAA;AAAA,IAC9B,CAAA,MAAO;AAEL,MAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AACrD,MAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAC3B,QAAA,OAAA,CAAQ,IAAI,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,EAAE,GAAG,CAAA,UAAA,EAAa,CAAA,CAAE,KAAK,cAAc,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,MAC7F,CAAC,CAAA;AACD,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO;AAAA,uBAAA,CAA2B,CAAA;AACvD,MAAA,MAAM,GAAA,GAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,EAAE,KAAK,CAAA,IAAK,CAAA;AAC1C,MAAA,IAAI,GAAA,GAAM,CAAA,IAAK,GAAA,IAAO,UAAA,CAAW,MAAA,EAAQ;AACvC,QAAA,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,6BAAwB,CAAC,CAAA;AAClD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,WAAA,GAAc,UAAA,CAAW,GAAG,CAAA,CAAE,GAAA;AAAA,IAChC;AAAA,EACF;AAGA,EAAA,IAAI,kBAAA;AACJ,EAAA,IAAI;AACF,IAAA,kBAAA,GAAqB,MAAM,UAAA,CAAWA,IAAAA,EAAK,UAAU,CAAA;AACrD,IAAA,OAAA,CAAQ,IAAI,MAAA,CAAO,IAAA,CAAK,CAAA,iBAAA,EAAe,kBAAkB,EAAE,CAAC,CAAA;AAAA,EAC9D,SAAS,GAAA,EAAU;AACjB,IAAA,OAAA,CAAQ,MAAM,MAAA,CAAO,GAAA,CAAI,YAAO,GAAA,CAAI,OAAO,EAAE,CAAC,CAAA;AAC9C,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAGA,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI;AACF,IAAA,SAAA,GAAY,MAAM,QAAA,CAAS,WAAA,EAAa,kBAAkB,CAAA;AAC1D,IAAA,OAAA,CAAQ,IAAI,MAAA,CAAO,IAAA,CAAK,kBAAa,SAAA,CAAU,MAAM,cAAc,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA,CAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAA;AAAA,EAC/G,SAAS,GAAA,EAAU;AACjB,IAAA,OAAA,CAAQ,MAAM,MAAA,CAAO,GAAA,CAAI,YAAO,GAAA,CAAI,OAAO,EAAE,CAAC,CAAA;AAC9C,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAGA,EAAA,MAAM,SAAA,GAAY,gBAAgB,WAAW,CAAA;AAC7C,EAAA,OAAA,CAAQ,IAAI,MAAA,CAAO,IAAA,CAAK,CAAA,oBAAA,EAAkB,SAAS,EAAE,CAAC,CAAA;AAGtD,EAAA,MAAM,OAAA,GAAU,eAAe,WAAW,CAAA;AAC1C,EAAA,OAAA,CAAQ,IAAI,MAAA,CAAO,IAAA,CAAK,CAAA,mBAAA,EAAiB,OAAO,EAAE,CAAC,CAAA;AAGnD,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,WAAA,EAAa,SAAA,EAAW,OAAO,CAAA;AAClE,EAAA,OAAA,CAAQ,IAAI,MAAA,CAAO,IAAA,CAAK,CAAA,qBAAA,EAAmB,SAAS,EAAE,CAAC,CAAA;AAGvD,EAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,WAAA,EAAa,SAAS,CAAA;AACxD,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,MAAA,CAAO,MAAA;AAAA,QACL,CAAA,+BAAA,EAA6B,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;AAAA,8BAAA,EACd,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA;AACpD,KACF;AAAA,EACF;AAGA,EAAA,MAAM,YAAA,GAAe,UAAA,GACjB,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,GACzD,MAAA;AAGJ,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,SAAA,CAAU,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AACvD,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAG;AACzB,QAAA,OAAA,CAAQ,KAAK,MAAA,CAAO,MAAA,CAAO,CAAA,iDAAA,EAA+C,IAAI,GAAG,CAAC,CAAA;AAAA,MACpF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAA0B;AAAA,IAC9B,SAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA,EAAO,SAAA;AAAA,IACP;AAAA,GACF;AAEA,EAAA,MAAM,YAAA,GAA8B,MAAM,WAAA,CAAY,SAAA,EAAW,KAAK,CAAA;AAGtE,EAAA,MAAM,eAAA,GAAmC;AAAA,IACvC,WAAA;AAAA,IAEA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IAEA,MAAA,EAAQ,YAAA;AAAA,IACR,SAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IAEA,aAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,YAAY,eAAe,CAAA;AAEjC,EAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,aAAa,CAAC,CAAA;AACxC;;;ACxWA,IAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACjC,IAAM,OAAA,GAAU,IAAA,CAAK,CAAC,CAAA,IAAK,UAAA;AAC3B,IAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAClC,IAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AAExB,IAAMY,OAAAA,GAAS;AAAA,EACb,KAAA,EAAO,CAAC,CAAA,KAAc,CAAA,QAAA,EAAW,CAAC,CAAA,OAAA,CAAA;AAAA,EAClC,MAAA,EAAQ,CAAC,CAAA,KAAc,CAAA,QAAA,EAAW,CAAC,CAAA,OAAA,CAAA;AAAA,EACnC,IAAA,EAAM,CAAC,CAAA,KAAc,CAAA,QAAA,EAAW,CAAC,CAAA,OAAA,CAAA;AAAA,EACjC,GAAA,EAAK,CAAC,CAAA,KAAc,CAAA,QAAA,EAAW,CAAC,CAAA,OAAA,CAAA;AAAA,EAChC,IAAA,EAAM,CAAC,CAAA,KAAc,CAAA,OAAA,EAAU,CAAC,CAAA,OAAA;AAClC,CAAA;AAEA,SAAS,KAAA,CAAM,UAAkB,OAAA,EAAiB;AAChD,EAAA,MAAM,GAAA,GAAMd,cAAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,QAAQ,CAAA;AACtC,EAAAC,YAAAA,CAAG,UAAUD,cAAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACnD,EAAAC,YAAAA,CAAG,aAAA,CAAc,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AACtC,EAAA,OAAA,CAAQ,IAAIa,OAAAA,CAAO,KAAA,CAAM,CAAA,kBAAA,EAAgB,QAAQ,EAAE,CAAC,CAAA;AACtD;AAQA,SAAS,kBAAA,GAA0B;AAEjC,EAAA,MAAM,eAAe,uBAAA,EAAwB;AAC7C,EAAA,IAAI,cAAc,OAAO,YAAA;AAGzB,EAAA,MAAM,uBAAuB,yBAAA,EAA0B;AACvD,EAAA,IAAI,sBAAsB,OAAO,oBAAA;AAGjC,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,UAAQ,OAAA,CAAQ,gBAAA,EAAkB,EAAE,KAAA,EAAO,CAAC,GAAG,CAAA,EAAG,CAAA;AAGrE,IAAA,MAAM,UAAA,GAAa,gCAAgC,UAAU,CAAA;AAC7D,IAAA,IAAI,YAAY,OAAO,UAAA;AAIvB,IAAA,MAAM,GAAA,GAAM,UAAQ,UAAU,CAAA;AAC9B,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI,OAAA,EAAS,YAAA;AACtD,IAAA,IAAI,CAAC,YAAA,EAAc,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAC7E,IAAA,OAAO,IAAI,YAAA,EAAa;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AACF;AAOA,SAAS,uBAAA,GAAsC;AAC7C,EAAA,MAAM,WAAA,GAAc;AAAA,IAClBd,cAAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,sBAAsB,CAAA;AAAA,IACxCA,cAAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,eAAe;AAAA,GACnC;AAEA,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,IAAI,CAACC,YAAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAASA,YAAAA,CAAG,YAAA,CAAa,UAAA,EAAY,OAAO,CAAA;AAClD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,+BAA+B,CAAA;AAC1D,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,MAAM,SAAA,GAAYD,eAAK,OAAA,CAAQA,cAAAA,CAAK,QAAQ,UAAU,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AACjE,MAAA,MAAM,SAAA,GAAYA,cAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AACjD,MAAA,MAAM,MAAA,GAAS,gCAAgC,SAAS,CAAA;AACxD,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAQA,SAAS,yBAAA,GAAwC;AAC/C,EAAA,MAAM,UAAA,GAAa;AAAA,IACjBA,cAAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,sCAAsC,CAAA;AAAA,IACxDA,cAAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,sCAAsC;AAAA,GAC1D;AAEA,EAAA,KAAA,MAAW,cAAc,UAAA,EAAY;AACnC,IAAA,MAAM,MAAA,GAAS,gCAAgC,UAAU,CAAA;AACzD,IAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,EACrB;AACA,EAAA,OAAO,IAAA;AACT;AAMA,SAAS,gCAAgC,QAAA,EAA8B;AACrE,EAAA,IAAI,CAACC,YAAAA,CAAG,UAAA,CAAW,QAAQ,GAAG,OAAO,IAAA;AACrC,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMA,YAAAA,CAAG,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAG7C,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,mEAAmE,CAAA;AAC3F,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AAChE,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACxC,MAAA,IAAI,kBAAkB,MAAA,EAAQ;AAC5B,QAAA,OAAO,EAAE,iBAAA,EAAmB,gBAAA,EAAkB,WAAA,EAAa,YAAY;AAAA,QAAC,CAAA,EAAE;AAAA,MAC5E;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,CAAM,qEAAqE,CAAA;AAC9F,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI;AACF,QAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AAC7C,QAAA,IAAI,kBAAkB,MAAA,EAAQ;AAC5B,UAAA,OAAO,EAAE,iBAAA,EAAmB,gBAAA,EAAkB,WAAA,EAAa,YAAY;AAAA,UAAC,CAAA,EAAE;AAAA,QAC5E;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAA6B;AAAA,IACvC;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,IAAA;AACT;AAaA,IAAM,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAQd,eAAec,IAAAA,GAAM;AACnB,EAAA,OAAA,CAAQ,GAAA,CAAID,OAAAA,CAAO,IAAA,CAAK,2BAA2B,CAAC,CAAA;AAEpD,EAAA,IAAI,YAAY,mBAAA,EAAqB;AACnC,IAAA,IAAI;AACF,MAAA,MAAM,IAAqB,aAAa,CAAA;AAAA,IAC1C,SAAS,CAAA,EAAQ;AACf,MAAA,OAAA,CAAQ,MAAMA,OAAAA,CAAO,GAAA,CAAI,YAAO,CAAA,CAAE,OAAO,EAAE,CAAC,CAAA;AAC5C,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AACA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,CAAC,UAAA,EAAY,cAAA,EAAgB,kBAAkB,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,EAAG;AACvE,IAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AACjB,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAO,IAAA,CAAK,aAAa,CAAC,CAAA;AACtC,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,kBAAA,EAAmB;AAAA,EAC9B,SAAS,CAAA,EAAQ;AACf,IAAA,OAAA,CAAQ,MAAMA,OAAAA,CAAO,GAAA,CAAI,YAAO,CAAA,CAAE,OAAO,EAAE,CAAC,CAAA;AAC5C,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAO,IAAA,CAAK,aAAa,CAAC,CAAA;AACtC,IAAA;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,IAAI,OAAA,KAAY,cAAA,IAAkB,OAAA,KAAY,UAAA,EAAY;AACxD,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAO,IAAA,CAAK,qDAAgD,CAAC,CAAA;AACzE,QAAA,MAAM,IAAA,GAAO,mBAAmB,MAAM,CAAA;AACtC,QAAA,KAAA,CAAM,4BAA4B,IAAI,CAAA;AAAA,MACxC,SAAS,CAAA,EAAQ;AACf,QAAA,OAAA,CAAQ,MAAMA,OAAAA,CAAO,GAAA,CAAI,mCAA8B,CAAA,CAAE,OAAO,EAAE,CAAC,CAAA;AAAA,MACrE;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,KAAY,kBAAA,IAAsB,OAAA,KAAY,UAAA,EAAY;AAC5D,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAO,IAAA,CAAK,sDAAiD,CAAC,CAAA;AAC1E,QAAA,MAAM,IAAA,GAAO,oBAAoB,MAAA,EAAQ;AAAA,UACvC,OAAO,cAAA,EAAe;AAAA,UACtB,SAAS,iBAAA;AAAkB,SAC5B,CAAA;AACD,QAAA,KAAA,CAAM,gBAAgB,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,MACrD,SAAS,CAAA,EAAQ;AACf,QAAA,OAAA,CAAQ,MAAMA,OAAAA,CAAO,GAAA,CAAI,uCAAkC,CAAA,CAAE,OAAO,EAAE,CAAC,CAAA;AAAA,MACzE;AAAA,IACF;AAAA,EACF,CAAA,SAAE;AAEA,IAAA,MAAM,OAAO,WAAA,EAAY;AAAA,EAC3B;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAO,IAAA,CAAK,aAAa,CAAC,CAAA;AACxC;AAEA,SAAS,cAAA,GAAyB;AAChC,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA;AAAA,MACfb,aAAG,YAAA,CAAaD,cAAAA,CAAK,QAAQ,GAAA,EAAK,cAAc,GAAG,OAAO;AAAA,KAC5D;AACA,IAAA,OAAO,IAAI,IAAA,IAAQ,QAAA;AAAA,EACrB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AAEA,SAAS,iBAAA,GAA4B;AACnC,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA;AAAA,MACfC,aAAG,YAAA,CAAaD,cAAAA,CAAK,QAAQ,GAAA,EAAK,cAAc,GAAG,OAAO;AAAA,KAC5D;AACA,IAAA,OAAO,IAAI,OAAA,IAAW,OAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AAEAe,IAAAA,EAAI,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM;AACjB,EAAA,OAAA,CAAQ,MAAM,CAAC,CAAA;AACf,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAChB,CAAC,CAAA","file":"cli.mjs","sourcesContent":["import type { ModelMeta, FieldMeta } from \"./types\";\r\n\r\n/**\r\n * Reads Prisma's DMMF (Data Model Meta Format) at runtime\r\n * and returns structured metadata for every model in your schema.\r\n *\r\n * No file reading. No code generation. Pure runtime introspection.\r\n */\r\nexport function getModels(prisma?: any): ModelMeta[] {\r\n let raw: any[] | undefined;\r\n\r\n // Try to get from PrismaClient instance first (new v5 format)\r\n if (prisma?._runtimeDataModel?.models) {\r\n const modelsObj = prisma._runtimeDataModel.models;\r\n // Convert object to array, adding name from key\r\n raw = Object.entries(modelsObj).map(([name, model]: [string, any]) => ({\r\n name,\r\n ...model,\r\n fields: (model.fields || []).map((f: any) => ({\r\n ...f,\r\n relationName: f.kind === \"object\" ? f.name : undefined,\r\n })),\r\n }));\r\n }\r\n\r\n // Fallback to DMMF from @prisma/client module — use plain require so\r\n // vi.mock(\"@prisma/client\") can intercept it in tests. The CLI handles\r\n // the global-install path resolution separately before calling getModels.\r\n if (!raw) {\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const prismaModule = require(\"@prisma/client\");\r\n const dmmfModels = prismaModule?.Prisma?.dmmf?.datamodel?.models;\r\n if (dmmfModels) {\r\n raw = dmmfModels;\r\n }\r\n } catch {\r\n // @prisma/client not available or not generated — handled below\r\n }\r\n }\r\n\r\n if (!raw) {\r\n throw new Error(\r\n \"[omni-rest] Could not find Prisma DMMF. Ensure Prisma client is generated and you're passing a PrismaClient instance to omni-rest.\"\r\n );\r\n }\r\n\r\n if (!Array.isArray(raw)) {\r\n throw new Error(\r\n `[omni-rest] Expected models to be an array, got ${typeof raw}. Debug: prisma._runtimeDataModel.models=${!!prisma?._runtimeDataModel?.models}, raw value=${JSON.stringify(raw).slice(0, 100)}`\r\n );\r\n }\r\n\r\n return raw.map((model: any) => {\r\n const fields: FieldMeta[] = model.fields.map((f: any) => ({\r\n name: f.name,\r\n type: f.type,\r\n isId: f.isId,\r\n isRequired: f.isRequired,\r\n isList: f.isList,\r\n isRelation: !!f.relationName,\r\n hasDefaultValue: !!f.hasDefaultValue || !!f.default,\r\n isUpdatedAt: !!f.isUpdatedAt,\r\n }));\r\n\r\n const idField =\r\n model.fields.find((f: any) => f.isId)?.name ?? \"id\";\r\n\r\n return {\r\n name: model.name,\r\n routeName: toRouteName(model.name),\r\n fields,\r\n idField,\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Converts a Prisma model name to a URL-safe route segment.\r\n * \"UserProfile\" → \"userprofile\"\r\n * \"OrderItem\" → \"orderitem\"\r\n */\r\nexport function toRouteName(modelName: string): string {\r\n return modelName.toLowerCase();\r\n}\r\n\r\n/**\r\n * Returns a map of routeName → ModelMeta for O(1) lookups.\r\n */\r\nexport function buildModelMap(\r\n models: ModelMeta[],\r\n allowList?: string[]\r\n): Record<string, ModelMeta> {\r\n const filtered = allowList\r\n ? models.filter((m) => allowList.includes(m.routeName))\r\n : models;\r\n\r\n return Object.fromEntries(filtered.map((m) => [m.routeName, m]));\r\n}\r\n\r\n/**\r\n * Gets the Prisma client delegate for a model.\r\n * prisma[\"userProfile\"] or prisma[\"user\"] — handles camelCase.\r\n */\r\nexport function getDelegate(prisma: any, meta: ModelMeta): any {\r\n // Prisma client properties are camelCase of model name\r\n // \"UserProfile\" → \"userProfile\"\r\n const key =\r\n meta.name.charAt(0).toLowerCase() + meta.name.slice(1);\r\n const delegate = prisma[key];\r\n\r\n if (!delegate) {\r\n throw new Error(\r\n `Could not find Prisma delegate for model \"${meta.name}\". ` +\r\n `Expected prisma.${key} to exist.`\r\n );\r\n }\r\n\r\n return delegate;\r\n}","import { getModels } from \"./introspect\";\r\nimport type { ModelMeta, FieldMeta } from \"./types\";\r\n\r\n/**\r\n * Maps Prisma scalar types → Zod method names\r\n */\r\nconst PRISMA_TO_ZOD: Record<string, string> = {\r\n String: \"z.string()\",\r\n Int: \"z.number().int()\",\r\n Float: \"z.number()\",\r\n Decimal: \"z.number()\",\r\n Boolean: \"z.boolean()\",\r\n DateTime: \"z.coerce.date()\",\r\n Json: \"z.any()\",\r\n BigInt: \"z.bigint()\",\r\n Bytes: \"z.any()\",\r\n};\r\n\r\n/**\r\n * Converts a single Prisma field to its Zod expression string.\r\n */\r\nfunction fieldToZod(field: FieldMeta): string {\r\n if (field.isRelation) return null as any; // skip relations\r\n\r\n let zod = PRISMA_TO_ZOD[field.type] ?? \"z.any()\";\r\n\r\n // Optional fields\r\n if (!field.isRequired) {\r\n zod = `${zod}.optional()`;\r\n }\r\n\r\n // List fields\r\n if (field.isList) {\r\n zod = `z.array(${zod})`;\r\n }\r\n\r\n return zod;\r\n}\r\n\r\n/**\r\n * Generates Zod schema source code for a single model.\r\n *\r\n * Produces two schemas:\r\n * - CreateSchema — required fields (excludes id, @default, @updatedAt)\r\n * - UpdateSchema — all fields are optional (for PATCH)\r\n */\r\nfunction generateModelSchema(meta: ModelMeta): string {\r\n const name = meta.name;\r\n\r\n // For CREATE: exclude id, fields with @default, and @updatedAt\r\n const createFields = meta.fields\r\n .filter((f) => !f.isRelation && !f.isId && !f.hasDefaultValue && !f.isUpdatedAt)\r\n .map((f) => {\r\n const zodExpr = fieldToZod(f);\r\n if (!zodExpr) return null;\r\n return ` ${f.name}: ${zodExpr},`;\r\n })\r\n .filter(Boolean)\r\n .join(\"\\n\");\r\n\r\n // For UPDATE: include all non-relation fields (but make them optional)\r\n const updateFields = meta.fields\r\n .filter((f) => !f.isRelation && !f.isId && !f.isUpdatedAt)\r\n .map((f) => {\r\n const zodExpr = fieldToZod(f);\r\n if (!zodExpr) return null;\r\n // Make everything optional for updates\r\n const optionalZod = zodExpr.includes('.optional()') ? zodExpr : `${zodExpr}.optional()`;\r\n return ` ${f.name}: ${optionalZod},`;\r\n })\r\n .filter(Boolean)\r\n .join(\"\\n\");\r\n\r\n return `\r\n// ─── ${name} ──────────────────────────────────────────────────────────────────\r\n\r\nexport const ${name}CreateSchema = z.object({\r\n${createFields}\r\n});\r\n\r\nexport const ${name}UpdateSchema = z.object({\r\n${updateFields}\r\n});\r\n\r\nexport type ${name}Create = z.infer<typeof ${name}CreateSchema>;\r\nexport type ${name}Update = z.infer<typeof ${name}UpdateSchema>;\r\n`.trim();\r\n}\r\n\r\n/**\r\n * Generates a complete Zod schema file for ALL models in your Prisma schema.\r\n *\r\n * @example\r\n * ```ts\r\n * import { generateZodSchemas } from \"omni-rest\";\r\n * const code = generateZodSchemas();\r\n * fs.writeFileSync(\"src/schemas.ts\", code);\r\n * ```\r\n */\r\nexport function generateZodSchemas(prisma?: any): string {\r\n const models = getModels(prisma);\r\n\r\n const schemas = models.map(generateModelSchema).join(\"\\n\\n\");\r\n\r\n return `/**\r\n * Auto-generated Zod schemas from Prisma schema.\r\n * Generated by omni-rest — do not edit manually.\r\n * Re-run after schema changes.\r\n */\r\nimport { z } from \"zod\";\r\n\r\n${schemas}\r\n`;\r\n}\r\n\r\n/**\r\n * Returns Zod schema OBJECTS at runtime (not source code).\r\n * Useful for request validation in middleware.\r\n *\r\n * Requires \"zod\" to be installed in the host project.\r\n */\r\nexport function buildRuntimeSchemas(prisma?: any): Record<\r\n string,\r\n { create: any; update: any }\r\n> {\r\n let z: any;\r\n try {\r\n z = require(\"zod\").z;\r\n } catch {\r\n throw new Error(\r\n \"[omni-rest] zod is required for runtime validation. Run: npm install zod\"\r\n );\r\n }\r\n\r\n const ZOD_FACTORIES: Record<string, () => any> = {\r\n String: () => z.string(),\r\n Int: () => z.number().int(),\r\n Float: () => z.number(),\r\n Decimal: () => z.number(),\r\n Boolean: () => z.boolean(),\r\n DateTime: () => z.coerce.date(),\r\n Json: () => z.any(),\r\n BigInt: () => z.bigint(),\r\n Bytes: () => z.any(),\r\n };\r\n\r\n const models = getModels(prisma);\r\n const result: Record<string, { create: any; update: any }> = {};\r\n\r\n for (const meta of models) {\r\n const createShape: Record<string, any> = {};\r\n const updateShape: Record<string, any> = {};\r\n\r\n for (const field of meta.fields) {\r\n if (field.isRelation) continue;\r\n\r\n const factory = ZOD_FACTORIES[field.type] ?? (() => z.any());\r\n let schema = factory();\r\n\r\n if (!field.isRequired) schema = schema.optional();\r\n if (field.isList) schema = z.array(schema);\r\n\r\n // CREATE: exclude id, @default, @updatedAt\r\n if (!field.isId && !field.hasDefaultValue && !field.isUpdatedAt) {\r\n createShape[field.name] = schema;\r\n }\r\n\r\n // UPDATE: include all except id and @updatedAt, make optional\r\n if (!field.isId && !field.isUpdatedAt) {\r\n updateShape[field.name] = schema.optional();\r\n }\r\n }\r\n\r\n const createSchema = z.object(createShape);\r\n const updateSchema = z.object(updateShape);\r\n \r\n result[meta.routeName] = {\r\n create: createSchema,\r\n update: updateSchema,\r\n };\r\n }\r\n\r\n return result;\r\n}","import { getModels } from \"./introspect\";\r\nimport type { ModelMeta, FieldMeta } from \"./types\";\r\n\r\n/**\r\n * Maps Prisma scalar types → OpenAPI schema types\r\n */\r\nconst PRISMA_TO_OAS: Record<string, { type: string; format?: string }> = {\r\n String: { type: \"string\" },\r\n Int: { type: \"integer\", format: \"int32\" },\r\n Float: { type: \"number\", format: \"float\" },\r\n Decimal: { type: \"number\" },\r\n Boolean: { type: \"boolean\" },\r\n DateTime: { type: \"string\", format: \"date-time\" },\r\n Json: { type: \"object\" },\r\n BigInt: { type: \"integer\", format: \"int64\" },\r\n};\r\n\r\nfunction fieldToOasSchema(field: FieldMeta): any {\r\n if (field.isRelation) return null;\r\n const base = PRISMA_TO_OAS[field.type] ?? { type: \"string\" };\r\n if (field.isList) return { type: \"array\", items: base };\r\n return base;\r\n}\r\n\r\nfunction buildModelSchema(meta: ModelMeta, forCreate = false): any {\r\n const properties: Record<string, any> = {};\r\n const required: string[] = [];\r\n\r\n for (const field of meta.fields) {\r\n if (field.isRelation) continue;\r\n if (forCreate && field.isId) continue; // id is auto on create\r\n\r\n const schema = fieldToOasSchema(field);\r\n if (!schema) continue;\r\n\r\n properties[field.name] = schema;\r\n\r\n if (field.isRequired && !field.isId && forCreate) {\r\n required.push(field.name);\r\n }\r\n }\r\n\r\n return {\r\n type: \"object\",\r\n properties,\r\n ...(required.length > 0 ? { required } : {}),\r\n };\r\n}\r\n\r\n/**\r\n * Generates a full OpenAPI 3.0 specification object for all exposed models.\r\n *\r\n * @example\r\n * ```ts\r\n * import { generateOpenApiSpec } from \"omni-rest\";\r\n * const spec = generateOpenApiSpec(prisma, { title: \"My API\", version: \"1.0.0\", basePath: \"/api\" });\r\n * fs.writeFileSync(\"openapi.json\", JSON.stringify(spec, null, 2));\r\n * ```\r\n */\r\nexport function generateOpenApiSpec(\r\n prisma: any,\r\n options: {\r\n title?: string;\r\n version?: string;\r\n basePath?: string;\r\n allow?: string[];\r\n servers?: { url: string; description?: string }[];\r\n } = {}\r\n): object {\r\n const {\r\n title = \"omni-rest API\",\r\n version = \"1.0.0\",\r\n basePath = \"/api\",\r\n allow,\r\n servers = [{ url: \"http://localhost:3000\" }],\r\n } = options;\r\n\r\n const models = getModels(prisma).filter(\r\n (m) => !allow || allow.includes(m.routeName)\r\n );\r\n\r\n const paths: Record<string, any> = {};\r\n const schemas: Record<string, any> = {};\r\n\r\n for (const meta of models) {\r\n const name = meta.name;\r\n const route = meta.routeName;\r\n\r\n // ── Schemas ──────────────────────────────────────────────────────────────\r\n schemas[name] = buildModelSchema(meta, false);\r\n schemas[`${name}Create`] = buildModelSchema(meta, true);\r\n schemas[`${name}Update`] = {\r\n ...buildModelSchema(meta, true),\r\n required: [], // all optional for PATCH\r\n };\r\n\r\n // ── Collection path /api/:model ───────────────────────────────────────────\r\n paths[`${basePath}/${route}`] = {\r\n get: {\r\n summary: `List ${name}s`,\r\n tags: [name],\r\n parameters: buildListParameters(),\r\n responses: {\r\n 200: {\r\n description: `List of ${name}s`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"object\",\r\n properties: {\r\n data: { type: \"array\", items: { $ref: `#/components/schemas/${name}` } },\r\n meta: { $ref: \"#/components/schemas/PaginationMeta\" },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n post: {\r\n summary: `Create ${name}`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}Create` },\r\n },\r\n },\r\n },\r\n responses: {\r\n 201: {\r\n description: `Created ${name}`,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n 400: { $ref: \"#/components/responses/BadRequest\" },\r\n 409: { $ref: \"#/components/responses/Conflict\" },\r\n },\r\n },\r\n };\r\n\r\n // ── Resource path /api/:model/:id ─────────────────────────────────────────\r\n paths[`${basePath}/${route}/{id}`] = {\r\n parameters: [\r\n {\r\n name: \"id\",\r\n in: \"path\",\r\n required: true,\r\n schema: { type: \"string\" },\r\n description: `${name} ID`,\r\n },\r\n ],\r\n get: {\r\n summary: `Get ${name} by ID`,\r\n tags: [name],\r\n responses: {\r\n 200: {\r\n description: `${name} record`,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n 404: { $ref: \"#/components/responses/NotFound\" },\r\n },\r\n },\r\n put: {\r\n summary: `Update ${name}`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}Create` },\r\n },\r\n },\r\n },\r\n responses: {\r\n 200: {\r\n description: `Updated ${name}`,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n 404: { $ref: \"#/components/responses/NotFound\" },\r\n },\r\n },\r\n patch: {\r\n summary: `Partially update ${name}`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}Update` },\r\n },\r\n },\r\n },\r\n responses: {\r\n 200: {\r\n description: `Updated ${name}`,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n 404: { $ref: \"#/components/responses/NotFound\" },\r\n },\r\n },\r\n delete: {\r\n summary: `Delete ${name}`,\r\n tags: [name],\r\n responses: {\r\n 204: { description: \"Deleted successfully\" },\r\n 404: { $ref: \"#/components/responses/NotFound\" },\r\n },\r\n },\r\n };\r\n\r\n // ── Bulk operations paths ──────────────────────────────────────────────────\r\n paths[`${basePath}/${route}/bulk/update`] = {\r\n patch: {\r\n summary: `Bulk update ${name}s`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n description: `Array of ${name} objects with id field to update`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"array\",\r\n items: { $ref: `#/components/schemas/${name}Update` },\r\n },\r\n },\r\n },\r\n },\r\n responses: {\r\n 200: {\r\n description: `Bulk update result`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"object\",\r\n properties: {\r\n updated: { type: \"integer\" },\r\n records: {\r\n type: \"array\",\r\n items: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n 400: { $ref: \"#/components/responses/BadRequest\" },\r\n },\r\n },\r\n };\r\n\r\n paths[`${basePath}/${route}/bulk/delete`] = {\r\n delete: {\r\n summary: `Bulk delete ${name}s`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n description: `Array of IDs to delete`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"array\",\r\n items: { type: \"string\" },\r\n },\r\n },\r\n },\r\n },\r\n responses: {\r\n 200: {\r\n description: `Bulk delete result`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"object\",\r\n properties: {\r\n deleted: { type: \"integer\" },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n 400: { $ref: \"#/components/responses/BadRequest\" },\r\n },\r\n },\r\n };\r\n }\r\n\r\n return {\r\n openapi: \"3.0.3\",\r\n info: { title, version },\r\n servers,\r\n paths,\r\n components: {\r\n schemas: {\r\n ...schemas,\r\n PaginationMeta: {\r\n type: \"object\",\r\n properties: {\r\n total: { type: \"integer\" },\r\n page: { type: \"integer\" },\r\n limit: { type: \"integer\" },\r\n totalPages: { type: \"integer\" },\r\n },\r\n },\r\n Error: {\r\n type: \"object\",\r\n properties: { error: { type: \"string\" } },\r\n },\r\n },\r\n responses: {\r\n NotFound: {\r\n description: \"Record not found\",\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: \"#/components/schemas/Error\" },\r\n },\r\n },\r\n },\r\n BadRequest: {\r\n description: \"Bad request\",\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: \"#/components/schemas/Error\" },\r\n },\r\n },\r\n },\r\n Conflict: {\r\n description: \"Unique constraint violation\",\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: \"#/components/schemas/Error\" },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n tags: models.map((m) => ({ name: m.name })),\r\n };\r\n}\r\n\r\nfunction buildListParameters() {\r\n return [\r\n { name: \"page\", in: \"query\", schema: { type: \"integer\", default: 1 }, description: \"Page number\" },\r\n { name: \"limit\", in: \"query\", schema: { type: \"integer\", default: 20 }, description: \"Items per page\" },\r\n { name: \"sort\", in: \"query\", schema: { type: \"string\" }, description: \"e.g. createdAt:desc\" },\r\n { name: \"include\", in: \"query\", schema: { type: \"string\" }, description: \"Comma-separated relations\" },\r\n { name: \"select\", in: \"query\", schema: { type: \"string\" }, description: \"Comma-separated fields\" },\r\n ];\r\n}","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport type { CandidateFrontend } from \"./types\";\r\n\r\nconst EXCLUDED_DIRS = new Set([\"node_modules\", \".git\", \"dist\", \"build\", \".next\", \"out\"]);\r\n\r\n/**\r\n * Reads and parses a package.json at the given directory.\r\n * Returns null if the file doesn't exist or can't be parsed.\r\n */\r\nfunction readPackageJson(dir: string): Record<string, unknown> | null {\r\n const pkgPath = path.join(dir, \"package.json\");\r\n try {\r\n const content = fs.readFileSync(pkgPath, \"utf-8\");\r\n return JSON.parse(content);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Scores a single directory based on the presence of framework config files\r\n * and react in package.json. Returns a CandidateFrontend or null if score is 0.\r\n */\r\nfunction scoreDir(dir: string, cwd: string): CandidateFrontend | null {\r\n let score = 0;\r\n const signals: string[] = [];\r\n\r\n // Check for next.config.js / next.config.ts\r\n if (\r\n fs.existsSync(path.join(dir, \"next.config.js\")) ||\r\n fs.existsSync(path.join(dir, \"next.config.ts\"))\r\n ) {\r\n score += 10;\r\n const file = fs.existsSync(path.join(dir, \"next.config.js\"))\r\n ? \"next.config.js\"\r\n : \"next.config.ts\";\r\n signals.push(`${file} found`);\r\n }\r\n\r\n // Check for vite.config.ts / vite.config.js\r\n if (\r\n fs.existsSync(path.join(dir, \"vite.config.ts\")) ||\r\n fs.existsSync(path.join(dir, \"vite.config.js\"))\r\n ) {\r\n score += 10;\r\n const file = fs.existsSync(path.join(dir, \"vite.config.ts\"))\r\n ? \"vite.config.ts\"\r\n : \"vite.config.js\";\r\n signals.push(`${file} found`);\r\n }\r\n\r\n // Check package.json for react dependency\r\n const pkg = readPackageJson(dir);\r\n if (pkg) {\r\n const deps = (pkg.dependencies as Record<string, string> | undefined) ?? {};\r\n const devDeps = (pkg.devDependencies as Record<string, string> | undefined) ?? {};\r\n\r\n if (\"react\" in deps) {\r\n score += 5;\r\n signals.push(\"react in dependencies\");\r\n } else if (\"react\" in devDeps) {\r\n score += 3;\r\n signals.push(\"react in devDependencies\");\r\n }\r\n }\r\n\r\n // Bonus for current working directory\r\n if (path.resolve(dir) === path.resolve(cwd)) {\r\n score += 2;\r\n signals.push(\"current working directory\");\r\n }\r\n\r\n if (score === 0) return null;\r\n\r\n return {\r\n dir: path.resolve(dir),\r\n score,\r\n signals,\r\n };\r\n}\r\n\r\n/**\r\n * Recursively walks up to `maxDepth` levels deep from `rootDir`,\r\n * excluding directories in EXCLUDED_DIRS, and collects scored candidates.\r\n */\r\nfunction walk(\r\n dir: string,\r\n cwd: string,\r\n currentDepth: number,\r\n maxDepth: number,\r\n results: Map<string, CandidateFrontend>\r\n): void {\r\n const absDir = path.resolve(dir);\r\n\r\n // Score this directory\r\n const candidate = scoreDir(absDir, cwd);\r\n if (candidate && !results.has(absDir)) {\r\n results.set(absDir, candidate);\r\n }\r\n\r\n if (currentDepth >= maxDepth) return;\r\n\r\n // Recurse into subdirectories\r\n let entries: fs.Dirent[];\r\n try {\r\n entries = fs.readdirSync(absDir, { withFileTypes: true });\r\n } catch {\r\n return;\r\n }\r\n\r\n for (const entry of entries) {\r\n if (!entry.isDirectory()) continue;\r\n if (EXCLUDED_DIRS.has(entry.name)) continue;\r\n\r\n walk(path.join(absDir, entry.name), cwd, currentDepth + 1, maxDepth, results);\r\n }\r\n}\r\n\r\n/**\r\n * Walks up to 3 levels deep from `dir`, scores each candidate directory,\r\n * and returns CandidateFrontend[] sorted descending by score (score 0 excluded).\r\n */\r\nexport function scoreCandidates(dir: string): CandidateFrontend[] {\r\n const cwd = process.cwd();\r\n const results = new Map<string, CandidateFrontend>();\r\n\r\n walk(dir, cwd, 0, 3, results);\r\n\r\n return Array.from(results.values()).sort((a, b) => b.score - a.score);\r\n}\r\n\r\n/**\r\n * Public API: scans for frontend directories starting from `dir`.\r\n * Returns CandidateFrontend[] sorted descending by score.\r\n */\r\nexport async function scanForFrontendDir(dir: string): Promise<CandidateFrontend[]> {\r\n return scoreCandidates(dir);\r\n}\r\n","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport type { ModelMeta } from \"../types\";\r\nimport { getModels } from \"../introspect\";\r\n\r\n/**\r\n * Finds the nearest `schema.prisma` file by walking up from `startDir`.\r\n *\r\n * - If `explicitPath` is provided, verifies it exists and returns it immediately.\r\n * - Otherwise walks up the directory tree until `schema.prisma` is found or root is reached.\r\n *\r\n * Requirements: 2.1, 2.2, 2.3, 2.4, 2.5\r\n */\r\nexport async function findSchema(\r\n startDir: string,\r\n explicitPath?: string\r\n): Promise<string> {\r\n if (explicitPath !== undefined) {\r\n const resolved = path.resolve(explicitPath);\r\n if (!fs.existsSync(resolved)) {\r\n throw new Error(\r\n `[omni-rest] Schema file not found at the specified path: \"${resolved}\"\\n` +\r\n `Please check that the path is correct and the file is readable.`\r\n );\r\n }\r\n return resolved;\r\n }\r\n\r\n let current = path.resolve(startDir);\r\n\r\n while (true) {\r\n // Check both root and prisma/ subdirectory\r\n const candidates = [\r\n path.join(current, \"prisma\", \"schema.prisma\"),\r\n path.join(current, \"schema.prisma\"),\r\n ];\r\n\r\n for (const candidate of candidates) {\r\n if (fs.existsSync(candidate)) {\r\n return candidate;\r\n }\r\n }\r\n\r\n const parent = path.dirname(current);\r\n if (parent === current) {\r\n // Reached filesystem root without finding schema.prisma\r\n throw new Error(\r\n `[omni-rest] Could not find \"schema.prisma\" by walking up from \"${startDir}\".\\n` +\r\n `Please run this command from within your Prisma project, or specify the path with --schema <path>.`\r\n );\r\n }\r\n current = parent;\r\n }\r\n}\r\n\r\n/**\r\n * Loads `@prisma/client` from the user's `node_modules` at `prismaClientPath`\r\n * and returns the list of models via `getModels`.\r\n *\r\n * Supports both standard output (node_modules/@prisma/client) and custom\r\n * output paths defined in schema.prisma generator block.\r\n *\r\n * Requirements: 5.1, 5.2, 5.3, 5.4, 5.5\r\n */\r\nexport async function loadDMMF(\r\n frontendDir: string,\r\n schemaPath: string\r\n): Promise<ModelMeta[]> {\r\n // 1. Try to detect custom output path from schema.prisma\r\n let clientPath: string | null = null;\r\n\r\n try {\r\n const schemaContent = fs.readFileSync(schemaPath, \"utf-8\");\r\n const outputMatch = schemaContent.match(/output\\s*=\\s*[\"']([^\"']+)[\"']/);\r\n \r\n if (outputMatch) {\r\n // Custom output path is relative to schema.prisma location\r\n const schemaDir = path.dirname(schemaPath);\r\n const customOutput = path.resolve(schemaDir, outputMatch[1]);\r\n \r\n if (fs.existsSync(customOutput)) {\r\n clientPath = customOutput;\r\n }\r\n }\r\n } catch {\r\n // Ignore schema read errors, fall back to standard path\r\n }\r\n\r\n // 2. Fall back to standard @prisma/client location\r\n if (!clientPath) {\r\n clientPath = path.join(frontendDir, \"node_modules\", \"@prisma\", \"client\");\r\n }\r\n\r\n // 3. Try to load the client module\r\n let prismaClientModule: any;\r\n\r\n try {\r\n // Use require() to load from the resolved path\r\n prismaClientModule = require(clientPath);\r\n } catch (err) {\r\n throw new Error(\r\n `[omni-rest] Could not load \"@prisma/client\" from \"${clientPath}\".\\n` +\r\n `Please run \"npx prisma generate\" to generate the Prisma client, then try again.`\r\n );\r\n }\r\n\r\n // 4. Extract the Prisma namespace to pass DMMF access to getModels\r\n const prismaNamespace = prismaClientModule?.Prisma ?? prismaClientModule?.default?.Prisma;\r\n\r\n if (!prismaNamespace?.dmmf?.datamodel?.models) {\r\n throw new Error(\r\n `[omni-rest] Could not read DMMF from \"@prisma/client\" at \"${clientPath}\".\\n` +\r\n `Please run \"npx prisma generate\" to regenerate the Prisma client, then try again.`\r\n );\r\n }\r\n\r\n // 5. Build a synthetic prisma instance for getModels()\r\n const dmmfModels: any[] = prismaNamespace.dmmf.datamodel.models;\r\n\r\n // Build a synthetic prisma instance whose _runtimeDataModel mirrors the DMMF\r\n // so that getModels() picks it up via the first branch.\r\n const syntheticPrisma = {\r\n _runtimeDataModel: {\r\n models: Object.fromEntries(\r\n dmmfModels.map((m: any) => [\r\n m.name,\r\n {\r\n fields: m.fields,\r\n },\r\n ])\r\n ),\r\n },\r\n };\r\n\r\n return getModels(syntheticPrisma);\r\n}\r\n","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\n\r\ntype Framework = \"nextjs\" | \"vite-react\" | \"react\";\r\n\r\n/**\r\n * Detects project structure details\r\n */\r\nexport interface ProjectStructure {\r\n usesSrc: boolean; // Has src/ directory\r\n usesAppRouter: boolean; // Next.js App Router (app/ directory)\r\n usesPagesRouter: boolean; // Next.js Pages Router (pages/ directory)\r\n basePath: string; // Base path for generated files (\"src\" or \".\")\r\n appPath: string | null; // Path to app/ directory if exists\r\n}\r\n\r\n/**\r\n * Detects the project structure (src/, app/, pages/)\r\n */\r\nexport function detectProjectStructure(frontendDir: string): ProjectStructure {\r\n const hasSrc = fs.existsSync(path.join(frontendDir, \"src\"));\r\n const hasApp = fs.existsSync(path.join(frontendDir, \"app\"));\r\n const hasSrcApp = fs.existsSync(path.join(frontendDir, \"src\", \"app\"));\r\n const hasPages = fs.existsSync(path.join(frontendDir, \"pages\"));\r\n const hasSrcPages = fs.existsSync(path.join(frontendDir, \"src\", \"pages\"));\r\n\r\n const usesAppRouter = hasApp || hasSrcApp;\r\n const usesPagesRouter = hasPages || hasSrcPages;\r\n const basePath = hasSrc ? \"src\" : \".\";\r\n \r\n let appPath: string | null = null;\r\n if (hasSrcApp) {\r\n appPath = path.join(frontendDir, \"src\", \"app\");\r\n } else if (hasApp) {\r\n appPath = path.join(frontendDir, \"app\");\r\n }\r\n\r\n return {\r\n usesSrc: hasSrc,\r\n usesAppRouter,\r\n usesPagesRouter,\r\n basePath,\r\n appPath,\r\n };\r\n}\r\n\r\n/**\r\n * Detects the frontend framework used in the given directory.\r\n *\r\n * Priority:\r\n * 1. next.config.js or next.config.ts → \"nextjs\"\r\n * 2. vite.config.ts or vite.config.js (no next config) → \"vite-react\"\r\n * 3. package.json with react in dependencies/devDependencies → \"react\"\r\n * 4. Fallback: prints warning and returns \"react\"\r\n *\r\n * Requirements: 3.1, 3.2, 3.3, 3.4\r\n */\r\nexport function detectFramework(frontendDir: string): Framework {\r\n const hasNextConfig =\r\n fs.existsSync(path.join(frontendDir, \"next.config.js\")) ||\r\n fs.existsSync(path.join(frontendDir, \"next.config.ts\"));\r\n\r\n if (hasNextConfig) return \"nextjs\";\r\n\r\n const hasViteConfig =\r\n fs.existsSync(path.join(frontendDir, \"vite.config.ts\")) ||\r\n fs.existsSync(path.join(frontendDir, \"vite.config.js\"));\r\n\r\n if (hasViteConfig) return \"vite-react\";\r\n\r\n // Check package.json for react dependency\r\n const pkgPath = path.join(frontendDir, \"package.json\");\r\n if (fs.existsSync(pkgPath)) {\r\n try {\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\r\n const deps = pkg.dependencies ?? {};\r\n const devDeps = pkg.devDependencies ?? {};\r\n if (\"react\" in deps || \"react\" in devDeps) {\r\n return \"react\";\r\n }\r\n } catch {\r\n // ignore parse errors\r\n }\r\n }\r\n\r\n console.warn(\r\n `[omni-rest] Warning: Could not detect frontend framework in \"${frontendDir}\". Defaulting to \"react\".`\r\n );\r\n return \"react\";\r\n}\r\n\r\n/**\r\n * Parses a simple .env file and returns a map of key → value.\r\n * Handles KEY=VALUE and KEY=\"VALUE\" formats. Ignores comments and blank lines.\r\n */\r\nfunction parseEnvFile(filePath: string): Map<string, string> {\r\n const result = new Map<string, string>();\r\n let content: string;\r\n try {\r\n content = fs.readFileSync(filePath, \"utf-8\");\r\n } catch {\r\n return result;\r\n }\r\n\r\n for (const line of content.split(\"\\n\")) {\r\n const trimmed = line.trim();\r\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\r\n const eqIdx = trimmed.indexOf(\"=\");\r\n if (eqIdx === -1) continue;\r\n const key = trimmed.slice(0, eqIdx).trim();\r\n let value = trimmed.slice(eqIdx + 1).trim();\r\n // Strip surrounding quotes\r\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\r\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\r\n value = value.slice(1, -1);\r\n }\r\n result.set(key, value);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Resolves the API base URL from environment files.\r\n *\r\n * Priority:\r\n * 1. .env.local → NEXT_PUBLIC_API_URL\r\n * 2. .env → NEXT_PUBLIC_API_URL or VITE_API_URL\r\n * 3. Fallback: \"/api\"\r\n *\r\n * Does NOT modify any env file.\r\n * Requirements: 4.1, 4.2, 4.3, 4.4\r\n */\r\nexport function resolveBaseUrl(frontendDir: string): string {\r\n // 1. Check .env.local for NEXT_PUBLIC_API_URL\r\n const envLocal = parseEnvFile(path.join(frontendDir, \".env.local\"));\r\n if (envLocal.has(\"NEXT_PUBLIC_API_URL\")) {\r\n return envLocal.get(\"NEXT_PUBLIC_API_URL\")!;\r\n }\r\n\r\n // 2. Check .env for NEXT_PUBLIC_API_URL or VITE_API_URL\r\n const env = parseEnvFile(path.join(frontendDir, \".env\"));\r\n if (env.has(\"NEXT_PUBLIC_API_URL\")) {\r\n return env.get(\"NEXT_PUBLIC_API_URL\")!;\r\n }\r\n if (env.has(\"VITE_API_URL\")) {\r\n return env.get(\"VITE_API_URL\")!;\r\n }\r\n\r\n // 3. Default\r\n return \"/api\";\r\n}\r\n\r\n/**\r\n * Resolves the output directory for generated files.\r\n *\r\n * Rules (in priority order):\r\n * 1. If outFlag is provided → path.resolve(frontendDir, outFlag)\r\n * 2. If src/ exists → frontendDir/src/\r\n * 3. Otherwise → frontendDir/ (root)\r\n *\r\n * Note: For Next.js App Router, components/hooks/lib go in root or src/,\r\n * while pages are generated separately in app/ directory.\r\n *\r\n * Requirements: 13.1, 13.2, 13.3\r\n */\r\nexport function resolveOutputDir(\r\n frontendDir: string,\r\n framework: Framework,\r\n outFlag?: string\r\n): string {\r\n if (outFlag) {\r\n return path.resolve(frontendDir, outFlag);\r\n }\r\n\r\n const structure = detectProjectStructure(frontendDir);\r\n \r\n // Use detected base path (src or root)\r\n if (structure.usesSrc) {\r\n return path.resolve(frontendDir, \"src\");\r\n }\r\n\r\n // Default to root directory\r\n return frontendDir;\r\n}\r\n","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\n\r\nconst BASE_PACKAGES = [\r\n \"@tanstack/react-query\",\r\n \"@tanstack/react-table\",\r\n \"react-hook-form\",\r\n \"zod\",\r\n \"@hookform/resolvers\",\r\n];\r\n\r\nconst FRAMEWORK_PACKAGES: Record<string, string[]> = {\r\n nextjs: [\"next\"],\r\n \"vite-react\": [\"react-router-dom\"],\r\n};\r\n\r\n/**\r\n * Checks that required packages are present in the frontend project's package.json.\r\n *\r\n * Returns an array of missing package names. If package.json cannot be read,\r\n * all required packages are returned as missing.\r\n *\r\n * Requirements: 14.1, 14.2, 14.3, 14.4, 14.5\r\n */\r\nexport function checkDependencies(\r\n frontendDir: string,\r\n framework: \"nextjs\" | \"vite-react\" | \"react\"\r\n): string[] {\r\n const required = [\r\n ...BASE_PACKAGES,\r\n ...(FRAMEWORK_PACKAGES[framework] ?? []),\r\n ];\r\n\r\n const pkgPath = path.join(frontendDir, \"package.json\");\r\n let installed: Set<string>;\r\n\r\n try {\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\r\n const deps = Object.keys(pkg.dependencies ?? {});\r\n const devDeps = Object.keys(pkg.devDependencies ?? {});\r\n installed = new Set([...deps, ...devDeps]);\r\n } catch {\r\n // package.json missing or unreadable — treat all as missing\r\n return required;\r\n }\r\n\r\n return required.filter((pkg) => !installed.has(pkg));\r\n}\r\n","import * as readline from \"readline\";\r\nimport type { ModelMeta, FieldMeta } from \"../types\";\r\nimport type { ModelConfig } from \"./types\";\r\n\r\n// ─── Flags interface ──────────────────────────────────────────────────────────\r\n\r\nexport interface BuildConfigFlags {\r\n autopilot?: boolean;\r\n noBulk?: boolean;\r\n steps?: \"auto\" | \"always\" | \"never\";\r\n modelsFilter?: string[];\r\n}\r\n\r\n// ─── shouldUseMultiStep ───────────────────────────────────────────────────────\r\n\r\n/**\r\n * Determines whether a model's form should use multi-step wizard mode.\r\n *\r\n * Rules (Requirements 16.1, 16.2, 16.3):\r\n * - \"always\" → true (regardless of field count)\r\n * - \"never\" → false (regardless of field count)\r\n * - \"auto\" / undefined → true only when fieldCount > 6\r\n */\r\nexport function shouldUseMultiStep(\r\n fieldCount: number,\r\n stepsFlag?: \"auto\" | \"always\" | \"never\"\r\n): boolean {\r\n if (stepsFlag === \"always\") return true;\r\n if (stepsFlag === \"never\") return false;\r\n // \"auto\" or undefined\r\n return fieldCount > 6;\r\n}\r\n\r\n// ─── Field helpers ────────────────────────────────────────────────────────────\r\n\r\nfunction scalarFields(model: ModelMeta): FieldMeta[] {\r\n return model.fields.filter((f) => !f.isRelation);\r\n}\r\n\r\nfunction relationalFields(model: ModelMeta): FieldMeta[] {\r\n return model.fields.filter((f) => f.isRelation);\r\n}\r\n\r\n/**\r\n * Returns fields that should be included in forms (excludes auto-generated fields).\r\n * Excludes: id fields, fields with @default(), and @updatedAt fields.\r\n */\r\nfunction formEditableFields(model: ModelMeta): FieldMeta[] {\r\n return model.fields.filter(\r\n (f) => !f.isRelation && !f.isId && !f.hasDefaultValue && !f.isUpdatedAt\r\n );\r\n}\r\n\r\n// ─── Autopilot config ─────────────────────────────────────────────────────────\r\n\r\nfunction buildAutopilotConfig(\r\n models: ModelMeta[],\r\n flags: BuildConfigFlags\r\n): ModelConfig[] {\r\n return models.map((model) => {\r\n const scalars = scalarFields(model).map((f) => f.name);\r\n const editableFields = formEditableFields(model).map((f) => f.name);\r\n const relations = relationalFields(model).map((f) => f.name);\r\n const fieldCount = model.fields.length;\r\n\r\n return {\r\n model,\r\n tableFields: scalars,\r\n formFields: editableFields, // Use editable fields for forms\r\n relationalFields: relations,\r\n bulkDelete: !flags.noBulk,\r\n canExport: true,\r\n multiStep: shouldUseMultiStep(fieldCount, flags.steps),\r\n };\r\n });\r\n}\r\n\r\n// ─── Interactive helpers ──────────────────────────────────────────────────────\r\n\r\nfunction ask(rl: readline.Interface, question: string): Promise<string> {\r\n return new Promise((resolve) => rl.question(question, resolve));\r\n}\r\n\r\n/**\r\n * Presents a numbered list and returns the indices the user selected.\r\n * Input format: \"1,3,5\" or \"1 3 5\" or \"all\" (selects everything).\r\n */\r\nasync function multiSelect(\r\n rl: readline.Interface,\r\n prompt: string,\r\n items: string[]\r\n): Promise<number[]> {\r\n console.log(prompt);\r\n items.forEach((item, i) => console.log(` ${i + 1}. ${item}`));\r\n const answer = await ask(rl, \" Enter numbers (comma/space separated, or 'all'): \");\r\n const trimmed = answer.trim().toLowerCase();\r\n if (trimmed === \"all\" || trimmed === \"\") {\r\n return items.map((_, i) => i);\r\n }\r\n return trimmed\r\n .split(/[\\s,]+/)\r\n .map((s) => parseInt(s, 10) - 1)\r\n .filter((i) => i >= 0 && i < items.length);\r\n}\r\n\r\nasync function yesNo(\r\n rl: readline.Interface,\r\n prompt: string,\r\n defaultYes = true\r\n): Promise<boolean> {\r\n const hint = defaultYes ? \"[Y/n]\" : \"[y/N]\";\r\n const answer = await ask(rl, `${prompt} ${hint}: `);\r\n const trimmed = answer.trim().toLowerCase();\r\n if (trimmed === \"\") return defaultYes;\r\n return trimmed === \"y\" || trimmed === \"yes\";\r\n}\r\n\r\n// ─── Interactive config ───────────────────────────────────────────────────────\r\n\r\nasync function buildInteractiveConfig(\r\n models: ModelMeta[],\r\n flags: BuildConfigFlags\r\n): Promise<ModelConfig[]> {\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n });\r\n\r\n try {\r\n // Step 1: which models to generate\r\n const modelIndices = await multiSelect(\r\n rl,\r\n \"\\nWhich models do you want to generate? (default: all)\",\r\n models.map((m) => m.name)\r\n );\r\n const selectedModels = modelIndices.map((i) => models[i]);\r\n\r\n const configs: ModelConfig[] = [];\r\n\r\n for (const model of selectedModels) {\r\n console.log(`\\n── Configuring ${model.name} ──`);\r\n\r\n const scalars = scalarFields(model);\r\n const editableFields = formEditableFields(model);\r\n const relations = relationalFields(model);\r\n\r\n // Relational fields as searchable-select\r\n let selectedRelations: string[] = relations.map((f) => f.name);\r\n if (relations.length > 0) {\r\n const relIndices = await multiSelect(\r\n rl,\r\n ` Relational fields for ${model.name} (searchable-select dropdowns):`,\r\n relations.map((f) => f.name)\r\n );\r\n selectedRelations = relIndices.map((i) => relations[i].name);\r\n }\r\n\r\n // Scalar fields for table\r\n const tableIndices = await multiSelect(\r\n rl,\r\n ` Scalar fields to show in the table for ${model.name}:`,\r\n scalars.map((f) => f.name)\r\n );\r\n const tableFields = tableIndices.map((i) => scalars[i].name);\r\n\r\n // Editable fields for form (excludes auto-generated)\r\n const formIndices = await multiSelect(\r\n rl,\r\n ` Fields to include in the form for ${model.name}:`,\r\n editableFields.map((f) => f.name)\r\n );\r\n const formFields = formIndices.map((i) => editableFields[i].name);\r\n\r\n // Bulk delete — CLI flag overrides prompt\r\n const bulkDelete = flags.noBulk\r\n ? false\r\n : await yesNo(rl, ` Enable bulk delete for ${model.name}?`);\r\n\r\n // Export — prompt answer\r\n const canExport = await yesNo(rl, ` Enable CSV/JSON export for ${model.name}?`);\r\n\r\n // Multi-step: if steps flag is set, use it; otherwise prompt only when auto\r\n let multiStep: boolean;\r\n if (flags.steps === \"always\") {\r\n multiStep = true;\r\n } else if (flags.steps === \"never\") {\r\n multiStep = false;\r\n } else {\r\n // auto / undefined — suggest based on field count, let user confirm\r\n const suggested = formFields.length > 6;\r\n multiStep = await yesNo(\r\n rl,\r\n ` Enable multi-step form for ${model.name}?`,\r\n suggested\r\n );\r\n }\r\n\r\n configs.push({\r\n model,\r\n tableFields,\r\n formFields,\r\n relationalFields: selectedRelations,\r\n bulkDelete,\r\n canExport,\r\n multiStep,\r\n });\r\n }\r\n\r\n return configs;\r\n } finally {\r\n rl.close();\r\n }\r\n}\r\n\r\n// ─── Public API ───────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Builds per-model configuration either from autopilot defaults or interactive prompts.\r\n *\r\n * Requirements: 6.1–6.8, 7.1–7.7\r\n */\r\nexport async function buildConfig(\r\n models: ModelMeta[],\r\n flags: BuildConfigFlags\r\n): Promise<ModelConfig[]> {\r\n // Apply models filter if provided\r\n const filtered =\r\n flags.modelsFilter && flags.modelsFilter.length > 0\r\n ? models.filter((m) => flags.modelsFilter!.includes(m.name))\r\n : models;\r\n\r\n if (flags.autopilot) {\r\n return buildAutopilotConfig(filtered, flags);\r\n }\r\n\r\n return buildInteractiveConfig(filtered, flags);\r\n}\r\n","import type { GeneratorConfig, ModelConfig } from \"../types\";\r\n\r\n/**\r\n * Generates the content of a `use[Model].ts` TanStack Query hook file.\r\n */\r\nexport function generateHookFile(\r\n config: GeneratorConfig,\r\n modelConfig: ModelConfig\r\n): string {\r\n const { baseUrl, staleTime, gcTime, noOptimistic } = config;\r\n const { model, bulkDelete } = modelConfig;\r\n const { name, routeName } = model;\r\n\r\n // Capitalise first letter for hook names\r\n const Model = name; // e.g. \"User\"\r\n const models = `${Model}s`; // e.g. \"Users\"\r\n\r\n const lines: string[] = [];\r\n\r\n // Imports\r\n lines.push(`import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";`);\r\n lines.push(`import type { ${Model}, Prisma } from \"@prisma/client\";`);\r\n lines.push(``);\r\n\r\n // Base URL constant\r\n lines.push(`const BASE_URL = \"${baseUrl}\";`);\r\n lines.push(``);\r\n\r\n // ── use[Model]s ──────────────────────────────────────────────────────────\r\n lines.push(`export function use${models}(params?: Record<string, any>) {`);\r\n lines.push(` return useQuery({`);\r\n lines.push(` queryKey: [\"${routeName}\", params],`);\r\n lines.push(` queryFn: () => {`);\r\n lines.push(` const url = new URL(\\`\\${BASE_URL}/${routeName}\\`, window.location.origin);`);\r\n lines.push(` if (params) {`);\r\n lines.push(` Object.entries(params).forEach(([k, v]) => {`);\r\n lines.push(` if (v !== undefined && v !== null) url.searchParams.set(k, String(v));`);\r\n lines.push(` });`);\r\n lines.push(` }`);\r\n lines.push(` return fetch(url.toString()).then((r) => r.json());`);\r\n lines.push(` },`);\r\n lines.push(` staleTime: ${staleTime},`);\r\n lines.push(` gcTime: ${gcTime},`);\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── use[Model] ───────────────────────────────────────────────────────────\r\n lines.push(`export function use${Model}(id: string) {`);\r\n lines.push(` return useQuery({`);\r\n lines.push(` queryKey: [\"${routeName}\", id],`);\r\n lines.push(` queryFn: () =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}/\\${id}\\`).then((r) => r.json()),`);\r\n lines.push(` staleTime: ${staleTime},`);\r\n lines.push(` gcTime: ${gcTime},`);\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── useCreate[Model] ─────────────────────────────────────────────────────\r\n lines.push(`export function useCreate${Model}() {`);\r\n lines.push(` const queryClient = useQueryClient();`);\r\n lines.push(` return useMutation({`);\r\n lines.push(` mutationFn: (data: Prisma.${Model}CreateInput) =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}\\`, {`);\r\n lines.push(` method: \"POST\",`);\r\n lines.push(` headers: { \"Content-Type\": \"application/json\" },`);\r\n lines.push(` body: JSON.stringify(data),`);\r\n lines.push(` }).then((r) => r.json()) as Promise<${Model}>,`);\r\n if (!noOptimistic) {\r\n lines.push(` onMutate: async (newItem) => {`);\r\n lines.push(` await queryClient.cancelQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` const previous = queryClient.getQueryData([\"${routeName}\"]);`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], (old: any) => ({`);\r\n lines.push(` ...old,`);\r\n lines.push(` data: [...(old?.data ?? []), { ...newItem, id: \"__optimistic__\" }],`);\r\n lines.push(` }));`);\r\n lines.push(` return { previous };`);\r\n lines.push(` },`);\r\n lines.push(` onError: (_err, _vars, ctx) => {`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], ctx?.previous);`);\r\n lines.push(` },`);\r\n lines.push(` onSettled: () => {`);\r\n lines.push(` queryClient.invalidateQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` },`);\r\n }\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── useUpdate[Model] ─────────────────────────────────────────────────────\r\n lines.push(`export function useUpdate${Model}() {`);\r\n lines.push(` const queryClient = useQueryClient();`);\r\n lines.push(` return useMutation({`);\r\n lines.push(` mutationFn: ({ id, data }: { id: string; data: Prisma.${Model}UpdateInput }) =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}/\\${id}\\`, {`);\r\n lines.push(` method: \"PATCH\",`);\r\n lines.push(` headers: { \"Content-Type\": \"application/json\" },`);\r\n lines.push(` body: JSON.stringify(data),`);\r\n lines.push(` }).then((r) => r.json()) as Promise<${Model}>,`);\r\n if (!noOptimistic) {\r\n lines.push(` onMutate: async ({ id, data }) => {`);\r\n lines.push(` await queryClient.cancelQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` const previous = queryClient.getQueryData([\"${routeName}\"]);`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], (old: any) => ({`);\r\n lines.push(` ...old,`);\r\n lines.push(` data: (old?.data ?? []).map((item: any) =>`);\r\n lines.push(` item.id === id ? { ...item, ...data } : item`);\r\n lines.push(` ),`);\r\n lines.push(` }));`);\r\n lines.push(` return { previous };`);\r\n lines.push(` },`);\r\n lines.push(` onError: (_err, _vars, ctx) => {`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], ctx?.previous);`);\r\n lines.push(` },`);\r\n lines.push(` onSettled: () => {`);\r\n lines.push(` queryClient.invalidateQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` },`);\r\n }\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── useDelete[Model] ─────────────────────────────────────────────────────\r\n lines.push(`export function useDelete${Model}() {`);\r\n lines.push(` const queryClient = useQueryClient();`);\r\n lines.push(` return useMutation({`);\r\n lines.push(` mutationFn: (id: string) =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}/\\${id}\\`, { method: \"DELETE\" }).then((r) =>`);\r\n lines.push(` r.json()`);\r\n lines.push(` ),`);\r\n if (!noOptimistic) {\r\n lines.push(` onMutate: async (id) => {`);\r\n lines.push(` await queryClient.cancelQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` const previous = queryClient.getQueryData([\"${routeName}\"]);`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], (old: any) => ({`);\r\n lines.push(` ...old,`);\r\n lines.push(` data: (old?.data ?? []).filter((item: any) => item.id !== id),`);\r\n lines.push(` }));`);\r\n lines.push(` return { previous };`);\r\n lines.push(` },`);\r\n lines.push(` onError: (_err, _vars, ctx) => {`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], ctx?.previous);`);\r\n lines.push(` },`);\r\n lines.push(` onSettled: () => {`);\r\n lines.push(` queryClient.invalidateQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` },`);\r\n }\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── useBulkDelete[Model]s ────────────────────────────────────────────────\r\n if (bulkDelete !== false) {\r\n lines.push(`export function useBulkDelete${models}() {`);\r\n lines.push(` const queryClient = useQueryClient();`);\r\n lines.push(` return useMutation({`);\r\n lines.push(` mutationFn: (ids: string[]) =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}\\`, {`);\r\n lines.push(` method: \"DELETE\",`);\r\n lines.push(` headers: { \"Content-Type\": \"application/json\" },`);\r\n lines.push(` body: JSON.stringify({ ids }),`);\r\n lines.push(` }).then((r) => r.json()),`);\r\n if (!noOptimistic) {\r\n lines.push(` onMutate: async (ids) => {`);\r\n lines.push(` await queryClient.cancelQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` const previous = queryClient.getQueryData([\"${routeName}\"]);`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], (old: any) => ({`);\r\n lines.push(` ...old,`);\r\n lines.push(` data: (old?.data ?? []).filter((item: any) => !ids.includes(item.id)),`);\r\n lines.push(` }));`);\r\n lines.push(` return { previous };`);\r\n lines.push(` },`);\r\n lines.push(` onError: (_err, _vars, ctx) => {`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], ctx?.previous);`);\r\n lines.push(` },`);\r\n lines.push(` onSettled: () => {`);\r\n lines.push(` queryClient.invalidateQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` },`);\r\n }\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n }\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import type { FieldMeta } from \"../../types\";\r\n\r\n/**\r\n * Converts a camelCase string to Title Case with spaces.\r\n * e.g. \"firstName\" → \"First Name\", \"userId\" → \"User Id\"\r\n */\r\nexport function camelToTitle(name: string): string {\r\n // Insert a space before each uppercase letter, then capitalize the first letter\r\n return name\r\n .replace(/([A-Z])/g, \" $1\")\r\n .replace(/^./, (ch) => ch.toUpperCase())\r\n .trim();\r\n}\r\n\r\nconst VALID_FIELD_TYPES = [\r\n \"text\",\r\n \"number\",\r\n \"switch\",\r\n \"date\",\r\n \"textarea\",\r\n \"select\",\r\n \"searchable-select\",\r\n] as const;\r\n\r\nexport type FormFieldType = (typeof VALID_FIELD_TYPES)[number];\r\n\r\n/**\r\n * Maps a DMMF FieldMeta to a FormGenerator field type string.\r\n */\r\nexport function fieldTypeMap(field: FieldMeta): FormFieldType {\r\n if (field.isRelation) return \"searchable-select\";\r\n\r\n switch (field.type) {\r\n case \"String\":\r\n return \"text\";\r\n case \"Int\":\r\n case \"Float\":\r\n case \"Decimal\":\r\n return \"number\";\r\n case \"Boolean\":\r\n return \"switch\";\r\n case \"DateTime\":\r\n return \"date\";\r\n case \"Json\":\r\n return \"textarea\";\r\n default:\r\n // Enum types are not one of the scalar primitives above\r\n // We detect enums by checking if the type starts with an uppercase letter\r\n // and is not a known scalar — treat as \"select\"\r\n if (/^[A-Z]/.test(field.type)) return \"select\";\r\n return \"text\";\r\n }\r\n}\r\n\r\n/**\r\n * Splits a string[] into arrays of at most `maxPerStep` items.\r\n * Number of steps = ceil(fields.length / maxPerStep).\r\n */\r\nexport function chunkFields(fields: string[], maxPerStep = 4): string[][] {\r\n const steps: string[][] = [];\r\n for (let i = 0; i < fields.length; i += maxPerStep) {\r\n steps.push(fields.slice(i, i + maxPerStep));\r\n }\r\n return steps;\r\n}\r\n","import type { GeneratorConfig, ModelConfig } from \"../types\";\r\nimport { camelToTitle } from \"./utils\";\r\n\r\n/**\r\n * Generates the content of a `[Model]Columns.tsx` TanStack Table column definitions file.\r\n */\r\nexport function generateColumnsFile(\r\n _config: GeneratorConfig,\r\n modelConfig: ModelConfig\r\n): string {\r\n const { model, tableFields } = modelConfig;\r\n const { name } = model;\r\n\r\n // e.g. \"User\" → \"user\"\r\n const varName = name.charAt(0).toLowerCase() + name.slice(1);\r\n\r\n const lines: string[] = [];\r\n\r\n // Imports\r\n lines.push(`import type { ColumnDef } from \"@tanstack/react-table\";`);\r\n lines.push(`import type { ${name} } from \"@prisma/client\";`);\r\n lines.push(``);\r\n\r\n // Column array\r\n lines.push(`export const ${varName}Columns: ColumnDef<${name}>[] = [`);\r\n\r\n // One entry per selected scalar field\r\n for (const field of tableFields) {\r\n lines.push(` {`);\r\n lines.push(` accessorKey: \"${field}\",`);\r\n lines.push(` header: \"${camelToTitle(field)}\",`);\r\n lines.push(` },`);\r\n }\r\n\r\n // Actions column\r\n lines.push(` {`);\r\n lines.push(` id: \"actions\",`);\r\n lines.push(` header: \"Actions\",`);\r\n lines.push(` cell: ({ row }) => (`);\r\n lines.push(` <div className=\"flex gap-2\">`);\r\n lines.push(` <button onClick={() => row.original && void 0}>Edit</button>`);\r\n lines.push(` <button onClick={() => row.original && void 0}>Delete</button>`);\r\n lines.push(` </div>`);\r\n lines.push(` ),`);\r\n lines.push(` },`);\r\n\r\n lines.push(`];`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import type { GeneratorConfig, ModelConfig } from \"../types\";\r\n\r\n/**\r\n * Generates the content of a `[Model]Table.tsx` DataTable component file.\r\n */\r\nexport function generateTableFile(\r\n config: GeneratorConfig,\r\n modelConfig: ModelConfig\r\n): string {\r\n const { framework } = config;\r\n const { model, bulkDelete, canExport } = modelConfig;\r\n const { name } = model;\r\n\r\n // Derived names\r\n const Model = name; // e.g. \"User\"\r\n const models = `${Model}s`; // e.g. \"Users\"\r\n const varName = name.charAt(0).toLowerCase() + name.slice(1); // e.g. \"user\"\r\n\r\n // Hook names\r\n const useListHook = `use${models}`; // e.g. \"useUsers\"\r\n const useDeleteHook = `useDelete${Model}`; // e.g. \"useDeleteUser\"\r\n const useBulkDeleteHook = `useBulkDelete${models}`; // e.g. \"useBulkDeleteUsers\"\r\n\r\n // Column variable name\r\n const columnsVar = `${varName}Columns`; // e.g. \"userColumns\"\r\n\r\n const lines: string[] = [];\r\n\r\n // 'use client' directive for Next.js (must be first line)\r\n if (framework === \"nextjs\") {\r\n lines.push(`'use client'`);\r\n lines.push(``);\r\n }\r\n\r\n // Build hook import list\r\n const hookImports: string[] = [useListHook, useDeleteHook];\r\n if (bulkDelete) {\r\n hookImports.push(useBulkDeleteHook);\r\n }\r\n\r\n // Imports - use relative paths for all frameworks\r\n lines.push(`import DataTable from \"../data-table\";`);\r\n lines.push(`import { ${columnsVar} } from \"./${Model}Columns\";`);\r\n lines.push(`import { ${hookImports.join(\", \")} } from \"../../hooks/use${Model}\";`);\r\n lines.push(``);\r\n\r\n // Component\r\n lines.push(`export function ${Model}Table() {`);\r\n lines.push(` const { data } = ${useListHook}();`);\r\n lines.push(` const ${varName}Delete = ${useDeleteHook}();`);\r\n\r\n if (bulkDelete) {\r\n lines.push(` const ${varName}BulkDelete = ${useBulkDeleteHook}();`);\r\n }\r\n\r\n lines.push(``);\r\n lines.push(` return (`);\r\n\r\n // Build DataTable props\r\n const dtProps: string[] = [\r\n ` columns={${columnsVar}}`,\r\n ` data={data?.data ?? []}`,\r\n ` onRowDelete={(row) => ${varName}Delete.mutate(row.id)}`,\r\n ];\r\n\r\n if (bulkDelete) {\r\n dtProps.push(` onMultiDelete={(rows) => ${varName}BulkDelete.mutate(rows.map((r) => r.id))}`);\r\n }\r\n\r\n if (canExport) {\r\n dtProps.push(` canExport={true}`);\r\n }\r\n\r\n lines.push(` <DataTable`);\r\n for (const prop of dtProps) {\r\n lines.push(prop);\r\n }\r\n lines.push(` />`);\r\n lines.push(` );`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import type { GeneratorConfig, ModelConfig } from \"../types\";\r\nimport { camelToTitle, fieldTypeMap, chunkFields } from \"./utils\";\r\n\r\n/**\r\n * Generates the content of a `[Model]Form.tsx` FormGenerator component file.\r\n */\r\nexport function generateFormFile(\r\n config: GeneratorConfig,\r\n modelConfig: ModelConfig\r\n): string {\r\n const { framework } = config;\r\n const { model, formFields, relationalFields, multiStep } = modelConfig;\r\n const { name, fields: allFields } = model;\r\n\r\n const lines: string[] = [];\r\n\r\n // 'use client' directive for Next.js (must be first line)\r\n if (framework === \"nextjs\") {\r\n lines.push(`'use client'`);\r\n lines.push(``);\r\n }\r\n\r\n // Collect relational field metadata: fieldName → relatedModelName\r\n const relationalFieldMeta: Array<{ fieldName: string; relatedModel: string }> = [];\r\n for (const relFieldName of relationalFields) {\r\n const fieldMeta = allFields.find((f) => f.name === relFieldName);\r\n if (fieldMeta) {\r\n relationalFieldMeta.push({\r\n fieldName: relFieldName,\r\n relatedModel: fieldMeta.type, // e.g. \"User\" for a userId relation\r\n });\r\n }\r\n }\r\n\r\n // Imports - use relative paths for all frameworks\r\n lines.push(`import { FormGenerator } from \"../form-generator\";`);\r\n lines.push(`import { ${name}CreateSchema } from \"../../schemas.generated\";`);\r\n lines.push(\r\n `import { useCreate${name}, useUpdate${name} } from \"../../hooks/use${name}\";`\r\n );\r\n\r\n // Import use[RelatedModel]s hooks for relational fields\r\n for (const { relatedModel } of relationalFieldMeta) {\r\n lines.push(\r\n `import { use${relatedModel}s } from \"../../hooks/use${relatedModel}\";`\r\n );\r\n }\r\n\r\n lines.push(``);\r\n\r\n // Component\r\n lines.push(`export function ${name}Form({ id }: { id?: string }) {`);\r\n lines.push(` const create${name} = useCreate${name}();`);\r\n lines.push(` const update${name} = useUpdate${name}();`);\r\n\r\n // Fetch relational data for searchable-select options\r\n for (const { fieldName, relatedModel } of relationalFieldMeta) {\r\n const varName =\r\n fieldName.charAt(0).toLowerCase() + fieldName.slice(1) + \"Options\";\r\n lines.push(\r\n ` const { data: ${varName}Data } = use${relatedModel}s();`\r\n );\r\n }\r\n\r\n lines.push(``);\r\n\r\n // Build fields array\r\n lines.push(` const fields = [`);\r\n\r\n // Scalar form fields\r\n for (const fieldName of formFields) {\r\n const fieldMeta = allFields.find((f) => f.name === fieldName);\r\n const type = fieldMeta ? fieldTypeMap(fieldMeta) : \"text\";\r\n lines.push(` {`);\r\n lines.push(` name: \"${fieldName}\",`);\r\n lines.push(` label: \"${camelToTitle(fieldName)}\",`);\r\n lines.push(` type: \"${type}\",`);\r\n lines.push(` },`);\r\n }\r\n\r\n // Relational fields as searchable-select\r\n for (const { fieldName, relatedModel } of relationalFieldMeta) {\r\n const varName =\r\n fieldName.charAt(0).toLowerCase() + fieldName.slice(1) + \"Options\";\r\n lines.push(` {`);\r\n lines.push(` name: \"${fieldName}\",`);\r\n lines.push(` label: \"${camelToTitle(fieldName)}\",`);\r\n lines.push(` type: \"searchable-select\",`);\r\n lines.push(\r\n ` options: (${varName}Data?.data ?? []).map((r: any) => ({ label: String(r.name ?? r.id), value: String(r.id) })),`\r\n );\r\n lines.push(` },`);\r\n }\r\n\r\n lines.push(` ];`);\r\n lines.push(``);\r\n\r\n // Build FormGenerator JSX\r\n if (multiStep) {\r\n // Chunk all field names (scalar + relational) into steps\r\n const allFieldNames = [\r\n ...formFields,\r\n ...relationalFieldMeta.map((r) => r.fieldName),\r\n ];\r\n const chunks = chunkFields(allFieldNames, 4);\r\n\r\n lines.push(` const steps = [`);\r\n chunks.forEach((chunk, i) => {\r\n lines.push(` {`);\r\n lines.push(` title: \"Step ${i + 1}\",`);\r\n lines.push(\r\n ` fields: [${chunk.map((f) => `\"${f}\"`).join(\", \")}],`\r\n );\r\n lines.push(` },`);\r\n });\r\n lines.push(` ];`);\r\n lines.push(``);\r\n\r\n lines.push(` return (`);\r\n lines.push(` <FormGenerator`);\r\n lines.push(` fields={fields}`);\r\n lines.push(` schema={${name}CreateSchema}`);\r\n lines.push(\r\n ` onSubmit={(data) => id ? update${name}.mutate({ id, data }) : create${name}.mutate(data)}`\r\n );\r\n lines.push(` steps={steps}`);\r\n lines.push(` />`);\r\n lines.push(` );`);\r\n } else {\r\n lines.push(` return (`);\r\n lines.push(` <FormGenerator`);\r\n lines.push(` fields={fields}`);\r\n lines.push(` schema={${name}CreateSchema}`);\r\n lines.push(\r\n ` onSubmit={(data) => id ? update${name}.mutate({ id, data }) : create${name}.mutate(data)}`\r\n );\r\n lines.push(` />`);\r\n lines.push(` );`);\r\n }\r\n\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import type { GeneratorConfig, ModelConfig } from \"../types\";\r\n\r\n/**\r\n * Generates a Next.js App Router page.tsx file for a model.\r\n * \r\n * Example output:\r\n * ```tsx\r\n * 'use client'\r\n * \r\n * import { UserTable } from '@/components/user/UserTable'\r\n * \r\n * export default function UsersPage() {\r\n * return (\r\n * <div className=\"container mx-auto py-10\">\r\n * <h1 className=\"text-3xl font-bold mb-6\">Users</h1>\r\n * <UserTable />\r\n * </div>\r\n * )\r\n * }\r\n * ```\r\n */\r\nexport function generatePageFile(\r\n config: GeneratorConfig,\r\n modelConfig: ModelConfig\r\n): string {\r\n const { model } = modelConfig;\r\n const { name } = model;\r\n const modelLower = name.charAt(0).toLowerCase() + name.slice(1);\r\n const pluralName = name + \"s\"; // Simple pluralization\r\n\r\n const lines: string[] = [];\r\n\r\n // 'use client' directive (required for App Router with client components)\r\n lines.push(`'use client'`);\r\n lines.push(``);\r\n\r\n // Import the table component\r\n lines.push(`import { ${name}Table } from '@/components/${modelLower}/${name}Table'`);\r\n lines.push(``);\r\n\r\n // Page component\r\n lines.push(`export default function ${pluralName}Page() {`);\r\n lines.push(` return (`);\r\n lines.push(` <div className=\"container mx-auto py-10\">`);\r\n lines.push(` <h1 className=\"text-3xl font-bold mb-6\">${pluralName}</h1>`);\r\n lines.push(` <${name}Table />`);\r\n lines.push(` </div>`);\r\n lines.push(` )`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n\r\n/**\r\n * Generates a shared layout.tsx for the route group (optional).\r\n * This can be used to add common UI elements around all generated pages.\r\n */\r\nexport function generateRouteGroupLayout(): string {\r\n const lines: string[] = [];\r\n\r\n lines.push(`export default function AutoGeneratedLayout({`);\r\n lines.push(` children,`);\r\n lines.push(`}: {`);\r\n lines.push(` children: React.ReactNode`);\r\n lines.push(`}) {`);\r\n lines.push(` return <>{children}</>`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import type { GeneratorConfig } from \"../types\";\r\n\r\n/**\r\n * Generates menu-data.ts file with routes for all generated pages.\r\n * \r\n * Example output:\r\n * ```typescript\r\n * export interface MenuItem {\r\n * label: string;\r\n * href: string;\r\n * }\r\n * \r\n * export const omniRestMenuItems: MenuItem[] = [\r\n * { label: 'Users', href: '/users' },\r\n * { label: 'Products', href: '/products' },\r\n * ];\r\n * ```\r\n */\r\nexport function generateMenuData(config: GeneratorConfig): string {\r\n const { models } = config;\r\n\r\n const lines: string[] = [];\r\n\r\n // Header comment\r\n lines.push(`/**`);\r\n lines.push(` * Auto-generated menu data for omni-rest CRUD pages`);\r\n lines.push(` * Generated by omni-rest — do not edit manually.`);\r\n lines.push(` * Re-run after schema changes.`);\r\n lines.push(` */`);\r\n lines.push(``);\r\n\r\n // MenuItem interface\r\n lines.push(`export interface MenuItem {`);\r\n lines.push(` label: string;`);\r\n lines.push(` href: string;`);\r\n lines.push(` icon?: string;`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // Generate menu items array\r\n lines.push(`export const omniRestMenuItems: MenuItem[] = [`);\r\n \r\n for (const modelConfig of models) {\r\n const { name } = modelConfig.model;\r\n const pluralName = name + \"s\"; // Simple pluralization\r\n const route = `/${name.toLowerCase()}s`;\r\n \r\n lines.push(` {`);\r\n lines.push(` label: '${pluralName}',`);\r\n lines.push(` href: '${route}',`);\r\n lines.push(` },`);\r\n }\r\n \r\n lines.push(`];`);\r\n lines.push(``);\r\n\r\n // Helper function to get menu by label\r\n lines.push(`/**`);\r\n lines.push(` * Get a menu item by its label`);\r\n lines.push(` */`);\r\n lines.push(`export function getMenuItemByLabel(label: string): MenuItem | undefined {`);\r\n lines.push(` return omniRestMenuItems.find(item => item.label === label);`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // Helper function to get menu by href\r\n lines.push(`/**`);\r\n lines.push(` * Get a menu item by its href`);\r\n lines.push(` */`);\r\n lines.push(`export function getMenuItemByHref(href: string): MenuItem | undefined {`);\r\n lines.push(` return omniRestMenuItems.find(item => item.href === href);`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport type { FileResult } from \"./types\";\r\n\r\n// ── ANSI colour helpers ───────────────────────────────────────────────────────\r\nconst GREEN = \"\\x1b[32m\";\r\nconst YELLOW = \"\\x1b[33m\";\r\nconst BLUE = \"\\x1b[34m\";\r\nconst RED = \"\\x1b[31m\";\r\nconst RESET = \"\\x1b[0m\";\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// writeFile\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Writes `content` to `destPath`, creating intermediate directories as needed.\r\n * Returns a `FileResult` with:\r\n * - `\"created\"` — file did not exist before\r\n * - `\"overwritten\"` — file already existed and was replaced\r\n * - `\"error\"` — write failed (error attached)\r\n */\r\nexport async function writeFile(destPath: string, content: string): Promise<FileResult> {\r\n let existed = false;\r\n try {\r\n existed = fs.existsSync(destPath);\r\n fs.mkdirSync(path.dirname(destPath), { recursive: true });\r\n fs.writeFileSync(destPath, content, \"utf8\");\r\n return { path: destPath, status: existed ? \"overwritten\" : \"created\" };\r\n } catch (err) {\r\n return { path: destPath, status: \"error\", error: err instanceof Error ? err : new Error(String(err)) };\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// copyBaseComponents\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst BASE_COMPONENTS: Array<{ src: string; dest: string }> = [\r\n { src: \"frontend-next/data-table.tsx\", dest: \"components/data-table.tsx\" },\r\n { src: \"frontend-next/form-generator.tsx\", dest: \"components/form-generator.tsx\" },\r\n];\r\n\r\n/**\r\n * Copies the shared DataTable and FormGenerator source files from `packageRoot`\r\n * into `{outputDir}/components/`.\r\n *\r\n * - If the destination already exists, returns `FileResult` with `\"skipped\"`.\r\n * - Creates intermediate directories as needed.\r\n * - Returns one `FileResult` per file.\r\n */\r\nexport async function copyBaseComponents(outputDir: string, packageRoot: string): Promise<FileResult[]> {\r\n const results: FileResult[] = [];\r\n\r\n for (const { src, dest } of BASE_COMPONENTS) {\r\n const srcPath = path.join(packageRoot, src);\r\n const destPath = path.join(outputDir, dest);\r\n\r\n if (fs.existsSync(destPath)) {\r\n results.push({ path: destPath, status: \"skipped\" });\r\n continue;\r\n }\r\n\r\n try {\r\n fs.mkdirSync(path.dirname(destPath), { recursive: true });\r\n fs.copyFileSync(srcPath, destPath);\r\n results.push({ path: destPath, status: \"created\" });\r\n } catch (err) {\r\n results.push({\r\n path: destPath,\r\n status: \"error\",\r\n error: err instanceof Error ? err : new Error(String(err)),\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// printSummary\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Prints a per-file status line for each `FileResult`, then a final count\r\n * summary line.\r\n *\r\n * Visual indicators:\r\n * created → green ✓\r\n * overwritten → yellow ⚠\r\n * skipped → blue ℹ\r\n * error → red ✗\r\n */\r\nexport function printSummary(results: FileResult[]): void {\r\n for (const r of results) {\r\n switch (r.status) {\r\n case \"created\":\r\n console.log(`${GREEN}✓${RESET} created ${r.path}`);\r\n break;\r\n case \"overwritten\":\r\n console.log(`${YELLOW}⚠${RESET} overwritten ${r.path}`);\r\n break;\r\n case \"skipped\":\r\n console.log(`${BLUE}ℹ${RESET} skipped ${r.path}`);\r\n break;\r\n case \"error\":\r\n console.log(`${RED}✗${RESET} error ${r.path}${r.error ? ` — ${r.error.message}` : \"\"}`);\r\n break;\r\n }\r\n }\r\n\r\n const created = results.filter(r => r.status === \"created\").length;\r\n const overwritten = results.filter(r => r.status === \"overwritten\").length;\r\n const skipped = results.filter(r => r.status === \"skipped\").length;\r\n const errors = results.filter(r => r.status === \"error\").length;\r\n\r\n console.log(\r\n `\\nGenerated ${created} files (${overwritten} overwritten, ${skipped} skipped, ${errors} errors)`\r\n );\r\n}\r\n","import * as path from \"path\";\r\nimport * as readline from \"readline\";\r\n\r\nimport { scanForFrontendDir } from \"./frontend/scan\";\r\nimport { findSchema, loadDMMF } from \"./frontend/schema\";\r\nimport { detectFramework, resolveBaseUrl, resolveOutputDir } from \"./frontend/detect\";\r\nimport { checkDependencies } from \"./frontend/deps\";\r\nimport { buildConfig, type BuildConfigFlags } from \"./frontend/prompt\";\r\nimport { generateHookFile } from \"./frontend/codegen/hook\";\r\nimport { generateColumnsFile } from \"./frontend/codegen/columns\";\r\nimport { generateTableFile } from \"./frontend/codegen/table\";\r\nimport { generateFormFile } from \"./frontend/codegen/form\";\r\nimport { generatePageFile } from \"./frontend/codegen/page\";\r\nimport { generateMenuData } from \"./frontend/codegen/menu\";\r\nimport { writeFile, copyBaseComponents, printSummary } from \"./frontend/output\";\r\nimport type { GeneratorConfig, ModelConfig, FileResult } from \"./frontend/types\";\r\nimport { detectProjectStructure } from \"./frontend/detect\";\r\n\r\n// ── ANSI colour helpers (mirrors src/cli.ts COLORS) ──────────────────────────\r\nconst COLORS = {\r\n green: (s: string) => `\\x1b[32m${s}\\x1b[0m`,\r\n yellow: (s: string) => `\\x1b[33m${s}\\x1b[0m`,\r\n cyan: (s: string) => `\\x1b[36m${s}\\x1b[0m`,\r\n red: (s: string) => `\\x1b[31m${s}\\x1b[0m`,\r\n bold: (s: string) => `\\x1b[1m${s}\\x1b[0m`,\r\n};\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// generateAll\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Orchestrates code generation for all models in `config`.\r\n *\r\n * For each ModelConfig it calls all four codegen functions, writes the\r\n * resulting files, then copies the shared base components and prints a\r\n * summary.\r\n *\r\n * For Next.js App Router, also generates page.tsx files and menu-data.ts\r\n *\r\n * Requirements: 7.2, 7.3, 7.4, 7.5, 7.6, 15.1, 15.2\r\n */\r\nexport async function generateAll(config: GeneratorConfig): Promise<FileResult[]> {\r\n const { outputDir, models, framework, frontendDir } = config;\r\n const generatePages = config.generatePages ?? (framework === \"nextjs\");\r\n const generateMenu = config.generateMenu ?? true;\r\n const routeGroup = config.routeGroup ?? \"autogenerated-omni\";\r\n \r\n // packageRoot is the omni-rest package root (one level up from dist/src)\r\n const packageRoot = path.resolve(__dirname, \"..\");\r\n\r\n const results: FileResult[] = [];\r\n\r\n // Detect project structure for Next.js page generation\r\n const structure = detectProjectStructure(frontendDir);\r\n\r\n for (const modelConfig of models) {\r\n const { name } = modelConfig.model;\r\n const modelLower = name.charAt(0).toLowerCase() + name.slice(1);\r\n\r\n // 1. Hook file → {outputDir}/hooks/use{Model}.ts\r\n const hookContent = generateHookFile(config, modelConfig);\r\n const hookPath = path.join(outputDir, \"hooks\", `use${name}.ts`);\r\n results.push(await writeFile(hookPath, hookContent));\r\n\r\n // 2. Columns file → {outputDir}/components/{model}/{Model}Columns.tsx\r\n const columnsContent = generateColumnsFile(config, modelConfig);\r\n const columnsPath = path.join(outputDir, \"components\", modelLower, `${name}Columns.tsx`);\r\n results.push(await writeFile(columnsPath, columnsContent));\r\n\r\n // 3. Table file → {outputDir}/components/{model}/{Model}Table.tsx\r\n const tableContent = generateTableFile(config, modelConfig);\r\n const tablePath = path.join(outputDir, \"components\", modelLower, `${name}Table.tsx`);\r\n results.push(await writeFile(tablePath, tableContent));\r\n\r\n // 4. Form file → {outputDir}/components/{model}/{Model}Form.tsx\r\n const formContent = generateFormFile(config, modelConfig);\r\n const formPath = path.join(outputDir, \"components\", modelLower, `${name}Form.tsx`);\r\n results.push(await writeFile(formPath, formContent));\r\n\r\n // 5. Next.js App Router page (if enabled and App Router detected)\r\n if (generatePages && framework === \"nextjs\" && structure.usesAppRouter && structure.appPath) {\r\n const pageContent = generatePageFile(config, modelConfig);\r\n const pluralLower = (name.toLowerCase() + \"s\");\r\n const pagePath = path.join(structure.appPath, `(${routeGroup})`, pluralLower, \"page.tsx\");\r\n results.push(await writeFile(pagePath, pageContent));\r\n }\r\n }\r\n\r\n // Copy shared base components\r\n const baseResults = await copyBaseComponents(outputDir, packageRoot);\r\n results.push(...baseResults);\r\n\r\n // Generate menu-data.ts (if enabled)\r\n if (generateMenu) {\r\n const menuContent = generateMenuData(config);\r\n const menuPath = path.join(outputDir, \"lib\", \"menu-data.ts\");\r\n results.push(await writeFile(menuPath, menuContent));\r\n }\r\n\r\n // Print summary\r\n printSummary(results);\r\n\r\n return results;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// run (top-level async entry point)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst HELP_TEXT = `\r\n Usage: npx omni-rest generate:frontend [options]\r\n\r\n Options:\r\n --schema <path> Path to schema.prisma (default: auto-discover)\r\n --frontend-dir <path> Frontend project root (default: auto-scan)\r\n --out <dir> Output directory relative to frontend-dir (default: src/)\r\n --models <names> Comma-separated model names to generate (default: all)\r\n --autopilot Skip all prompts, use defaults\r\n --no-bulk Disable bulk delete hooks and wiring\r\n --no-optimistic Disable optimistic update patterns\r\n --no-pages Disable Next.js page generation (default: enabled for Next.js)\r\n --no-menu Disable menu-data.ts generation (default: enabled)\r\n --route-group <name> Route group name for Next.js pages (default: autogenerated-omni)\r\n --stale-time <ms> useQuery staleTime (default: 30000)\r\n --gc-time <ms> useQuery gcTime (default: 300000)\r\n --steps <mode> Multi-step form mode: auto | always | never (default: auto)\r\n --help Print this help\r\n`;\r\n\r\n/** Prompts the user for a single line of input. */\r\nfunction prompt(question: string): Promise<string> {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n return new Promise((resolve) => {\r\n rl.question(question, (answer) => {\r\n rl.close();\r\n resolve(answer.trim());\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Top-level async entry point for `generate:frontend`.\r\n *\r\n * Parses flags from `argv`, runs the full pipeline, and calls `generateAll`.\r\n *\r\n * Requirements: 1.1, 2.4, 2.5, 18.1, 18.2, 18.8–18.16\r\n */\r\nexport async function run(argv: string[]): Promise<void> {\r\n // ── Parse flags ────────────────────────────────────────────────────────────\r\n let schemaPath: string | undefined;\r\n let frontendDirFlag: string | undefined;\r\n let outFlag: string | undefined;\r\n let modelsFlag: string | undefined;\r\n let autopilot = false;\r\n let noBulk = false;\r\n let noOptimistic = false;\r\n let generatePages = true;\r\n let generateMenu = true;\r\n let routeGroup = \"autogenerated-omni\";\r\n let staleTime = 30000;\r\n let gcTime = 300000;\r\n let stepsFlag: \"auto\" | \"always\" | \"never\" = \"auto\";\r\n\r\n for (let i = 0; i < argv.length; i++) {\r\n const arg = argv[i];\r\n switch (arg) {\r\n case \"--help\":\r\n console.log(HELP_TEXT);\r\n return;\r\n case \"--schema\":\r\n schemaPath = argv[++i];\r\n break;\r\n case \"--frontend-dir\":\r\n frontendDirFlag = argv[++i];\r\n break;\r\n case \"--out\":\r\n outFlag = argv[++i];\r\n break;\r\n case \"--models\":\r\n modelsFlag = argv[++i];\r\n break;\r\n case \"--autopilot\":\r\n autopilot = true;\r\n break;\r\n case \"--no-bulk\":\r\n noBulk = true;\r\n break;\r\n case \"--no-optimistic\":\r\n noOptimistic = true;\r\n break;\r\n case \"--no-pages\":\r\n generatePages = false;\r\n break;\r\n case \"--no-menu\":\r\n generateMenu = false;\r\n break;\r\n case \"--route-group\":\r\n routeGroup = argv[++i];\r\n break;\r\n case \"--stale-time\":\r\n staleTime = parseInt(argv[++i], 10) || 30000;\r\n break;\r\n case \"--gc-time\":\r\n gcTime = parseInt(argv[++i], 10) || 300000;\r\n break;\r\n case \"--steps\": {\r\n const val = argv[++i];\r\n if (val === \"always\" || val === \"never\" || val === \"auto\") {\r\n stepsFlag = val;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const cwd = process.cwd();\r\n\r\n console.log(COLORS.bold(\"\\n omni-rest · generate:frontend\\n\"));\r\n\r\n // ── Step 1: Resolve frontendDir ────────────────────────────────────────────\r\n let frontendDir: string;\r\n\r\n if (frontendDirFlag) {\r\n // Requirement 18.1 — use provided path directly\r\n const resolved = require(\"path\").resolve(cwd, frontendDirFlag);\r\n const fs = require(\"fs\") as typeof import(\"fs\");\r\n if (!fs.existsSync(resolved) || !fs.statSync(resolved).isDirectory()) {\r\n console.error(\r\n COLORS.red(\r\n ` ✗ --frontend-dir path does not exist or is not a directory: \"${resolved}\"`\r\n )\r\n );\r\n process.exit(1);\r\n }\r\n frontendDir = resolved;\r\n } else {\r\n // Requirement 18.3 — scan for candidates\r\n const candidates = await scanForFrontendDir(cwd);\r\n\r\n if (candidates.length === 0) {\r\n // Requirement 18.11 / 18.14\r\n console.error(\r\n COLORS.red(\r\n ` ✗ No frontend project found.\\n` +\r\n ` Scan criteria: next.config.*, vite.config.*, or package.json with react dependency.\\n` +\r\n ` Run from your frontend directory or use --frontend-dir <path>.`\r\n )\r\n );\r\n process.exit(1);\r\n }\r\n\r\n if (autopilot) {\r\n if (candidates.length > 1) {\r\n // Requirement 18.13\r\n console.error(COLORS.red(` ✗ Multiple frontend candidates found. Specify one with --frontend-dir:\\n`));\r\n candidates.forEach((c, i) => console.error(` ${i + 1}. ${c.dir} (score: ${c.score})`));\r\n process.exit(1);\r\n }\r\n // Requirement 18.12 — single candidate, use it\r\n frontendDir = candidates[0].dir;\r\n console.log(COLORS.cyan(` → Using frontend dir: ${frontendDir}`));\r\n } else if (candidates.length === 1) {\r\n // Requirement 18.8 / 18.9 — confirm with user\r\n const answer = await prompt(\r\n ` Frontend dir detected: ${COLORS.bold(candidates[0].dir)}\\n Use this directory? [Y/n]: `\r\n );\r\n if (answer.toLowerCase() === \"n\" || answer.toLowerCase() === \"no\") {\r\n console.log(\" Aborted.\");\r\n return;\r\n }\r\n frontendDir = candidates[0].dir;\r\n } else {\r\n // Requirement 18.10 — multiple candidates, let user pick\r\n console.log(\" Multiple frontend candidates found:\\n\");\r\n candidates.forEach((c, i) => {\r\n console.log(` ${i + 1}. ${c.dir} (score: ${c.score}, signals: ${c.signals.join(\", \")})`);\r\n });\r\n const answer = await prompt(`\\n Select a number [1]: `);\r\n const idx = (parseInt(answer, 10) || 1) - 1;\r\n if (idx < 0 || idx >= candidates.length) {\r\n console.error(COLORS.red(\" ✗ Invalid selection.\"));\r\n process.exit(1);\r\n }\r\n frontendDir = candidates[idx].dir;\r\n }\r\n }\r\n\r\n // ── Step 2: Find schema.prisma ─────────────────────────────────────────────\r\n let resolvedSchemaPath: string;\r\n try {\r\n resolvedSchemaPath = await findSchema(cwd, schemaPath);\r\n console.log(COLORS.cyan(` → Schema: ${resolvedSchemaPath}`));\r\n } catch (err: any) {\r\n console.error(COLORS.red(` ✗ ${err.message}`));\r\n process.exit(1);\r\n }\r\n\r\n // ── Step 3: Load DMMF ──────────────────────────────────────────────────────\r\n let allModels;\r\n try {\r\n allModels = await loadDMMF(frontendDir, resolvedSchemaPath);\r\n console.log(COLORS.cyan(` → Found ${allModels.length} model(s): ${allModels.map((m) => m.name).join(\", \")}`));\r\n } catch (err: any) {\r\n console.error(COLORS.red(` ✗ ${err.message}`));\r\n process.exit(1);\r\n }\r\n\r\n // ── Step 4: Detect framework ───────────────────────────────────────────────\r\n const framework = detectFramework(frontendDir);\r\n console.log(COLORS.cyan(` → Framework: ${framework}`));\r\n\r\n // ── Step 5: Resolve base URL ───────────────────────────────────────────────\r\n const baseUrl = resolveBaseUrl(frontendDir);\r\n console.log(COLORS.cyan(` → Base URL: ${baseUrl}`));\r\n\r\n // ── Step 6: Resolve output dir ─────────────────────────────────────────────\r\n const outputDir = resolveOutputDir(frontendDir, framework, outFlag);\r\n console.log(COLORS.cyan(` → Output dir: ${outputDir}`));\r\n\r\n // ── Step 7: Check dependencies ─────────────────────────────────────────────\r\n const missing = checkDependencies(frontendDir, framework);\r\n if (missing.length > 0) {\r\n console.warn(\r\n COLORS.yellow(\r\n ` ⚠ Missing dependencies: ${missing.join(\", \")}\\n` +\r\n ` Install with: npm install ${missing.join(\" \")}`\r\n )\r\n );\r\n }\r\n\r\n // ── Step 8: Build per-model config ─────────────────────────────────────────\r\n const modelsFilter = modelsFlag\r\n ? modelsFlag.split(\",\").map((s) => s.trim()).filter(Boolean)\r\n : undefined;\r\n\r\n // Warn about unknown model names in --models filter\r\n if (modelsFilter) {\r\n const knownNames = new Set(allModels.map((m) => m.name));\r\n for (const name of modelsFilter) {\r\n if (!knownNames.has(name)) {\r\n console.warn(COLORS.yellow(` ⚠ Unknown model name in --models filter: \"${name}\"`));\r\n }\r\n }\r\n }\r\n\r\n const flags: BuildConfigFlags = {\r\n autopilot,\r\n noBulk,\r\n steps: stepsFlag,\r\n modelsFilter,\r\n };\r\n\r\n const modelConfigs: ModelConfig[] = await buildConfig(allModels, flags);\r\n\r\n // ── Step 9: Build GeneratorConfig and run generateAll ─────────────────────\r\n const generatorConfig: GeneratorConfig = {\r\n frontendDir,\r\n schemaPath: resolvedSchemaPath,\r\n framework,\r\n baseUrl,\r\n outputDir,\r\n autopilot,\r\n models: modelConfigs,\r\n staleTime,\r\n gcTime,\r\n noOptimistic,\r\n steps: stepsFlag,\r\n generatePages,\r\n generateMenu,\r\n routeGroup,\r\n };\r\n\r\n await generateAll(generatorConfig);\r\n\r\n console.log(COLORS.bold(\"\\n Done!\\n\"));\r\n}\r\n","#!/usr/bin/env node\n/**\n * omni-rest CLI\n *\n * Usage:\n * npx omni-rest generate:zod → generates src/schemas.generated.ts\n * npx omni-rest generate:openapi → generates openapi.json\n * npx omni-rest generate → generates both\n */\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport { generateZodSchemas } from \"./zod-generator\";\nimport { generateOpenApiSpec } from \"./openapi\";\nimport { run as runFrontendGenerator } from \"./frontend-generator\";\n\nconst args = process.argv.slice(2);\nconst command = args[0] ?? \"generate\";\nconst remainingArgs = args.slice(1);\nconst cwd = process.cwd();\n\nconst COLORS = {\n green: (s: string) => `\\x1b[32m${s}\\x1b[0m`,\n yellow: (s: string) => `\\x1b[33m${s}\\x1b[0m`,\n cyan: (s: string) => `\\x1b[36m${s}\\x1b[0m`,\n red: (s: string) => `\\x1b[31m${s}\\x1b[0m`,\n bold: (s: string) => `\\x1b[1m${s}\\x1b[0m`,\n};\n\nfunction write(filePath: string, content: string) {\n const abs = path.resolve(cwd, filePath);\n fs.mkdirSync(path.dirname(abs), { recursive: true });\n fs.writeFileSync(abs, content, \"utf-8\");\n console.log(COLORS.green(` ✓ Written: ${filePath}`));\n}\n\n/**\n * Instantiates a PrismaClient from the user's project.\n * Handles both:\n * - Standard Prisma (client in node_modules/@prisma/client or node_modules/.prisma/client)\n * - Prisma 7+ with custom output path in schema.prisma generator block\n */\nfunction createPrismaClient(): any {\n // 1. Try to find a custom output path from schema.prisma\n const customClient = tryLoadFromSchemaOutput();\n if (customClient) return customClient;\n\n // 2. Try the standard .prisma/client path (Prisma 7 default output)\n const standardPrismaClient = tryLoadFromStandardOutput();\n if (standardPrismaClient) return standardPrismaClient;\n\n // 3. Fall back to resolving @prisma/client and extracting/instantiating (Prisma <7)\n try {\n const clientPath = require.resolve(\"@prisma/client\", { paths: [cwd] });\n\n // Try text-based extraction first (no require needed)\n const textResult = extractRuntimeDataModelFromFile(clientPath);\n if (textResult) return textResult;\n\n // Last resort: actually instantiate (requires DB connection)\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require(clientPath);\n const PrismaClient = mod.PrismaClient ?? mod.default?.PrismaClient;\n if (!PrismaClient) throw new Error(\"PrismaClient not found in @prisma/client\");\n return new PrismaClient();\n } catch {\n throw new Error(\n \"[omni-rest] Could not load @prisma/client from your project. \" +\n \"Run `npx prisma generate` first, then try again.\"\n );\n }\n}\n\n/**\n * Reads schema.prisma to find a custom `output` in the generator block,\n * then extracts runtimeDataModel from the generated file as plain text.\n * Returns a fake prisma-like object with _runtimeDataModel populated.\n */\nfunction tryLoadFromSchemaOutput(): any | null {\n const schemaPaths = [\n path.resolve(cwd, \"prisma/schema.prisma\"),\n path.resolve(cwd, \"schema.prisma\"),\n ];\n\n for (const schemaPath of schemaPaths) {\n if (!fs.existsSync(schemaPath)) continue;\n try {\n const schema = fs.readFileSync(schemaPath, \"utf-8\");\n const match = schema.match(/output\\s*=\\s*[\"']([^\"']+)[\"']/);\n if (!match) continue;\n\n const outputDir = path.resolve(path.dirname(schemaPath), match[1]);\n const indexPath = path.join(outputDir, \"index.js\");\n const result = extractRuntimeDataModelFromFile(indexPath);\n if (result) return result;\n } catch {\n continue;\n }\n }\n return null;\n}\n\n/**\n * Tries to extract runtimeDataModel by reading the generated Prisma client\n * source as plain text and regex-extracting the embedded JSON.\n * Works for Prisma 7+ default output (node_modules/.prisma/client/index.js)\n * and any custom output path. No require() needed — no DB connection needed.\n */\nfunction tryLoadFromStandardOutput(): any | null {\n const candidates = [\n path.resolve(cwd, \"node_modules/.prisma/client/index.js\"),\n path.resolve(cwd, \"node_modules/@prisma/client/index.js\"),\n ];\n\n for (const clientPath of candidates) {\n const result = extractRuntimeDataModelFromFile(clientPath);\n if (result) return result;\n }\n return null;\n}\n\n/**\n * Reads a generated Prisma client JS file as text and extracts\n * the runtimeDataModel JSON via regex — no require() needed.\n */\nfunction extractRuntimeDataModelFromFile(filePath: string): any | null {\n if (!fs.existsSync(filePath)) return null;\n try {\n const src = fs.readFileSync(filePath, \"utf-8\");\n\n // Prisma 7: config.runtimeDataModel = JSON.parse(\"...\")\n const match = src.match(/config\\.runtimeDataModel\\s*=\\s*JSON\\.parse\\(\"((?:[^\"\\\\]|\\\\.)*)\"\\)/);\n if (match) {\n const json = match[1].replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\");\n const runtimeDataModel = JSON.parse(json);\n if (runtimeDataModel?.models) {\n return { _runtimeDataModel: runtimeDataModel, $disconnect: async () => {} };\n }\n }\n\n // Older Prisma: runtimeDataModel = { models: { ... } } inline object\n const match2 = src.match(/runtimeDataModel\\s*=\\s*(\\{[\\s\\S]*?\"models\"\\s*:\\s*\\{[\\s\\S]*?\\}\\s*\\})/);\n if (match2) {\n try {\n const runtimeDataModel = JSON.parse(match2[1]);\n if (runtimeDataModel?.models) {\n return { _runtimeDataModel: runtimeDataModel, $disconnect: async () => {} };\n }\n } catch { /* not valid JSON, skip */ }\n }\n } catch {\n // ignore read errors\n }\n return null;\n}\n\nfunction getDummyUrl(provider: string): string {\n switch (provider) {\n case \"mysql\": return \"mysql://root:root@localhost:3306/dummy\";\n case \"sqlite\": return \"file:./dummy.db\";\n case \"sqlserver\": return \"sqlserver://localhost:1433;database=dummy;user=sa;password=dummy\";\n case \"mongodb\": return \"mongodb://localhost:27017/dummy\";\n case \"cockroachdb\": return \"postgresql://root@localhost:26257/dummy\";\n default: return \"postgresql://postgres:postgres@localhost:5432/dummy\";\n }\n}\n\nconst USAGE = `\n Usage:\n npx omni-rest generate Generate both Zod schemas and OpenAPI spec\n npx omni-rest generate:zod Generate Zod schemas only\n npx omni-rest generate:openapi Generate OpenAPI spec only\n npx omni-rest generate:frontend Scaffold frontend components from Prisma schema\n`;\n\nasync function run() {\n console.log(COLORS.bold(\"\\n omni-rest generator\\n\"));\n\n if (command === \"generate:frontend\") {\n try {\n await runFrontendGenerator(remainingArgs);\n } catch (e: any) {\n console.error(COLORS.red(` ✗ ${e.message}`));\n process.exit(1);\n }\n return;\n }\n\n if (![\"generate\", \"generate:zod\", \"generate:openapi\"].includes(command)) {\n console.log(USAGE);\n console.log(COLORS.bold(\"\\n Done!\\n\"));\n return;\n }\n\n let prisma: any;\n try {\n prisma = createPrismaClient();\n } catch (e: any) {\n console.error(COLORS.red(` ✗ ${e.message}`));\n console.log(COLORS.bold(\"\\n Done!\\n\"));\n return;\n }\n\n try {\n if (command === \"generate:zod\" || command === \"generate\") {\n try {\n console.log(COLORS.cyan(\" → Generating Zod schemas from Prisma DMMF...\"));\n const code = generateZodSchemas(prisma);\n write(\"src/schemas.generated.ts\", code);\n } catch (e: any) {\n console.error(COLORS.red(` ✗ Zod generation failed: ${e.message}`));\n }\n }\n\n if (command === \"generate:openapi\" || command === \"generate\") {\n try {\n console.log(COLORS.cyan(\" → Generating OpenAPI spec from Prisma DMMF...\"));\n const spec = generateOpenApiSpec(prisma, {\n title: getPackageName(),\n version: getPackageVersion(),\n });\n write(\"openapi.json\", JSON.stringify(spec, null, 2));\n } catch (e: any) {\n console.error(COLORS.red(` ✗ OpenAPI generation failed: ${e.message}`));\n }\n }\n } finally {\n // Always disconnect the Prisma client when done\n await prisma.$disconnect();\n }\n\n console.log(COLORS.bold(\"\\n Done!\\n\"));\n}\n\nfunction getPackageName(): string {\n try {\n const pkg = JSON.parse(\n fs.readFileSync(path.resolve(cwd, \"package.json\"), \"utf-8\")\n );\n return pkg.name ?? \"My API\";\n } catch {\n return \"My API\";\n }\n}\n\nfunction getPackageVersion(): string {\n try {\n const pkg = JSON.parse(\n fs.readFileSync(path.resolve(cwd, \"package.json\"), \"utf-8\")\n );\n return pkg.version ?? \"1.0.0\";\n } catch {\n return \"1.0.0\";\n }\n}\n\nrun().catch((e) => {\n console.error(e);\n process.exit(1);\n});"]}
1
+ {"version":3,"sources":["../src/introspect.ts","../src/zod-generator.ts","../src/openapi.ts","../src/frontend/scan.ts","../src/frontend/schema.ts","../src/frontend/detect.ts","../src/frontend/deps.ts","../src/frontend/prompt.ts","../src/frontend/codegen/hook.ts","../src/frontend/codegen/utils.ts","../src/frontend/codegen/columns.ts","../src/frontend/codegen/table.ts","../src/frontend/codegen/form.ts","../src/frontend/codegen/page.ts","../src/frontend/codegen/menu.ts","../src/frontend/codegen/providers.ts","../src/frontend/output.ts","../src/frontend-generator.ts","../src/cli.ts"],"names":["path","fs","cwd","path2","fs2","path4","fs4","resolve","prompt","relationalFields","fs5","path5","path6","readline2","COLORS","run"],"mappings":"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","file":"cli.mjs","sourcesContent":["import type { ModelMeta, FieldMeta } from \"./types\";\r\n\r\n/**\r\n * Reads Prisma's DMMF (Data Model Meta Format) at runtime\r\n * and returns structured metadata for every model in your schema.\r\n *\r\n * No file reading. No code generation. Pure runtime introspection.\r\n */\r\nexport function getModels(prisma?: any): ModelMeta[] {\r\n let raw: any[] | undefined;\r\n\r\n // Try to get from PrismaClient instance first (new v5 format)\r\n if (prisma?._runtimeDataModel?.models) {\r\n const modelsObj = prisma._runtimeDataModel.models;\r\n // Convert object to array, adding name from key\r\n raw = Object.entries(modelsObj).map(([name, model]: [string, any]) => ({\r\n name,\r\n ...model,\r\n fields: (model.fields || []).map((f: any) => ({\r\n ...f,\r\n relationName: f.kind === \"object\" ? f.name : undefined,\r\n })),\r\n }));\r\n }\r\n\r\n // Fallback to DMMF from @prisma/client module — use plain require so\r\n // vi.mock(\"@prisma/client\") can intercept it in tests. The CLI handles\r\n // the global-install path resolution separately before calling getModels.\r\n if (!raw) {\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const prismaModule = require(\"@prisma/client\");\r\n const dmmfModels = prismaModule?.Prisma?.dmmf?.datamodel?.models;\r\n if (dmmfModels) {\r\n raw = dmmfModels;\r\n }\r\n } catch {\r\n // @prisma/client not available or not generated — handled below\r\n }\r\n }\r\n\r\n if (!raw) {\r\n throw new Error(\r\n \"[omni-rest] Could not find Prisma DMMF. Ensure Prisma client is generated and you're passing a PrismaClient instance to omni-rest.\"\r\n );\r\n }\r\n\r\n if (!Array.isArray(raw)) {\r\n throw new Error(\r\n `[omni-rest] Expected models to be an array, got ${typeof raw}. Debug: prisma._runtimeDataModel.models=${!!prisma?._runtimeDataModel?.models}, raw value=${JSON.stringify(raw).slice(0, 100)}`\r\n );\r\n }\r\n\r\n return raw.map((model: any) => {\r\n const fields: FieldMeta[] = model.fields.map((f: any) => ({\r\n name: f.name,\r\n type: f.type,\r\n isId: f.isId,\r\n isRequired: f.isRequired,\r\n isList: f.isList,\r\n isRelation: !!f.relationName,\r\n hasDefaultValue: !!f.hasDefaultValue || !!f.default,\r\n isUpdatedAt: !!f.isUpdatedAt,\r\n }));\r\n\r\n const idField =\r\n model.fields.find((f: any) => f.isId)?.name ?? \"id\";\r\n\r\n return {\r\n name: model.name,\r\n routeName: toRouteName(model.name),\r\n fields,\r\n idField,\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Converts a Prisma model name to a URL-safe route segment.\r\n * \"UserProfile\" → \"userprofile\"\r\n * \"OrderItem\" → \"orderitem\"\r\n */\r\nexport function toRouteName(modelName: string): string {\r\n return modelName.toLowerCase();\r\n}\r\n\r\n/**\r\n * Returns a map of routeName → ModelMeta for O(1) lookups.\r\n */\r\nexport function buildModelMap(\r\n models: ModelMeta[],\r\n allowList?: string[]\r\n): Record<string, ModelMeta> {\r\n const filtered = allowList\r\n ? models.filter((m) => allowList.includes(m.routeName))\r\n : models;\r\n\r\n return Object.fromEntries(filtered.map((m) => [m.routeName, m]));\r\n}\r\n\r\n/**\r\n * Gets the Prisma client delegate for a model.\r\n * prisma[\"userProfile\"] or prisma[\"user\"] — handles camelCase.\r\n */\r\nexport function getDelegate(prisma: any, meta: ModelMeta): any {\r\n // Prisma client properties are camelCase of model name\r\n // \"UserProfile\" → \"userProfile\"\r\n const key =\r\n meta.name.charAt(0).toLowerCase() + meta.name.slice(1);\r\n const delegate = prisma[key];\r\n\r\n if (!delegate) {\r\n throw new Error(\r\n `Could not find Prisma delegate for model \"${meta.name}\". ` +\r\n `Expected prisma.${key} to exist.`\r\n );\r\n }\r\n\r\n return delegate;\r\n}","import { getModels } from \"./introspect\";\r\nimport type { ModelMeta, FieldMeta } from \"./types\";\r\n\r\n/**\r\n * Maps Prisma scalar types → Zod method names\r\n */\r\nconst PRISMA_TO_ZOD: Record<string, string> = {\r\n String: \"z.string()\",\r\n Int: \"z.number().int()\",\r\n Float: \"z.number()\",\r\n Decimal: \"z.number()\",\r\n Boolean: \"z.boolean()\",\r\n DateTime: \"z.coerce.date()\",\r\n Json: \"z.any()\",\r\n BigInt: \"z.bigint()\",\r\n Bytes: \"z.any()\",\r\n};\r\n\r\n/**\r\n * Converts a single Prisma field to its Zod expression string.\r\n */\r\nfunction fieldToZod(field: FieldMeta): string {\r\n if (field.isRelation) return null as any; // skip relations\r\n\r\n let zod = PRISMA_TO_ZOD[field.type] ?? \"z.any()\";\r\n\r\n // Optional fields\r\n if (!field.isRequired) {\r\n zod = `${zod}.optional()`;\r\n }\r\n\r\n // List fields\r\n if (field.isList) {\r\n zod = `z.array(${zod})`;\r\n }\r\n\r\n return zod;\r\n}\r\n\r\n/**\r\n * Generates Zod schema source code for a single model.\r\n *\r\n * Produces two schemas:\r\n * - CreateSchema — required fields (excludes id, @default, @updatedAt)\r\n * - UpdateSchema — all fields are optional (for PATCH)\r\n */\r\nfunction generateModelSchema(meta: ModelMeta): string {\r\n const name = meta.name;\r\n\r\n // For CREATE: exclude id, fields with @default, and @updatedAt\r\n const createFields = meta.fields\r\n .filter((f) => !f.isRelation && !f.isId && !f.hasDefaultValue && !f.isUpdatedAt)\r\n .map((f) => {\r\n const zodExpr = fieldToZod(f);\r\n if (!zodExpr) return null;\r\n return ` ${f.name}: ${zodExpr},`;\r\n })\r\n .filter(Boolean)\r\n .join(\"\\n\");\r\n\r\n // For UPDATE: include all non-relation fields (but make them optional)\r\n const updateFields = meta.fields\r\n .filter((f) => !f.isRelation && !f.isId && !f.isUpdatedAt)\r\n .map((f) => {\r\n const zodExpr = fieldToZod(f);\r\n if (!zodExpr) return null;\r\n // Make everything optional for updates\r\n const optionalZod = zodExpr.includes('.optional()') ? zodExpr : `${zodExpr}.optional()`;\r\n return ` ${f.name}: ${optionalZod},`;\r\n })\r\n .filter(Boolean)\r\n .join(\"\\n\");\r\n\r\n return `\r\n// ─── ${name} ──────────────────────────────────────────────────────────────────\r\n\r\nexport const ${name}CreateSchema = z.object({\r\n${createFields}\r\n});\r\n\r\nexport const ${name}UpdateSchema = z.object({\r\n${updateFields}\r\n});\r\n\r\nexport type ${name}Create = z.infer<typeof ${name}CreateSchema>;\r\nexport type ${name}Update = z.infer<typeof ${name}UpdateSchema>;\r\n`.trim();\r\n}\r\n\r\n/**\r\n * Generates a complete Zod schema file for ALL models in your Prisma schema.\r\n *\r\n * @example\r\n * ```ts\r\n * import { generateZodSchemas } from \"omni-rest\";\r\n * const code = generateZodSchemas();\r\n * fs.writeFileSync(\"src/schemas.ts\", code);\r\n * ```\r\n */\r\nexport function generateZodSchemas(prisma?: any): string {\r\n const models = getModels(prisma);\r\n\r\n const schemas = models.map(generateModelSchema).join(\"\\n\\n\");\r\n\r\n return `/**\r\n * Auto-generated Zod schemas from Prisma schema.\r\n * Generated by omni-rest — do not edit manually.\r\n * Re-run after schema changes.\r\n */\r\nimport { z } from \"zod\";\r\n\r\n${schemas}\r\n`;\r\n}\r\n\r\n/**\r\n * Returns Zod schema OBJECTS at runtime (not source code).\r\n * Useful for request validation in middleware.\r\n *\r\n * Requires \"zod\" to be installed in the host project.\r\n */\r\nexport function buildRuntimeSchemas(prisma?: any): Record<\r\n string,\r\n { create: any; update: any }\r\n> {\r\n let z: any;\r\n try {\r\n z = require(\"zod\").z;\r\n } catch {\r\n throw new Error(\r\n \"[omni-rest] zod is required for runtime validation. Run: npm install zod\"\r\n );\r\n }\r\n\r\n const ZOD_FACTORIES: Record<string, () => any> = {\r\n String: () => z.string(),\r\n Int: () => z.number().int(),\r\n Float: () => z.number(),\r\n Decimal: () => z.number(),\r\n Boolean: () => z.boolean(),\r\n DateTime: () => z.coerce.date(),\r\n Json: () => z.any(),\r\n BigInt: () => z.bigint(),\r\n Bytes: () => z.any(),\r\n };\r\n\r\n const models = getModels(prisma);\r\n const result: Record<string, { create: any; update: any }> = {};\r\n\r\n for (const meta of models) {\r\n const createShape: Record<string, any> = {};\r\n const updateShape: Record<string, any> = {};\r\n\r\n for (const field of meta.fields) {\r\n if (field.isRelation) continue;\r\n\r\n const factory = ZOD_FACTORIES[field.type] ?? (() => z.any());\r\n let schema = factory();\r\n\r\n if (!field.isRequired) schema = schema.optional();\r\n if (field.isList) schema = z.array(schema);\r\n\r\n // CREATE: exclude id, @default, @updatedAt\r\n if (!field.isId && !field.hasDefaultValue && !field.isUpdatedAt) {\r\n createShape[field.name] = schema;\r\n }\r\n\r\n // UPDATE: include all except id and @updatedAt, make optional\r\n if (!field.isId && !field.isUpdatedAt) {\r\n updateShape[field.name] = schema.optional();\r\n }\r\n }\r\n\r\n const createSchema = z.object(createShape);\r\n const updateSchema = z.object(updateShape);\r\n \r\n result[meta.routeName] = {\r\n create: createSchema,\r\n update: updateSchema,\r\n };\r\n }\r\n\r\n return result;\r\n}","import { getModels } from \"./introspect\";\r\nimport type { ModelMeta, FieldMeta } from \"./types\";\r\n\r\n/**\r\n * Maps Prisma scalar types → OpenAPI schema types\r\n */\r\nconst PRISMA_TO_OAS: Record<string, { type: string; format?: string }> = {\r\n String: { type: \"string\" },\r\n Int: { type: \"integer\", format: \"int32\" },\r\n Float: { type: \"number\", format: \"float\" },\r\n Decimal: { type: \"number\" },\r\n Boolean: { type: \"boolean\" },\r\n DateTime: { type: \"string\", format: \"date-time\" },\r\n Json: { type: \"object\" },\r\n BigInt: { type: \"integer\", format: \"int64\" },\r\n};\r\n\r\nfunction fieldToOasSchema(field: FieldMeta): any {\r\n if (field.isRelation) return null;\r\n const base = PRISMA_TO_OAS[field.type] ?? { type: \"string\" };\r\n if (field.isList) return { type: \"array\", items: base };\r\n return base;\r\n}\r\n\r\nfunction buildModelSchema(meta: ModelMeta, forCreate = false): any {\r\n const properties: Record<string, any> = {};\r\n const required: string[] = [];\r\n\r\n for (const field of meta.fields) {\r\n if (field.isRelation) continue;\r\n if (forCreate && field.isId) continue; // id is auto on create\r\n\r\n const schema = fieldToOasSchema(field);\r\n if (!schema) continue;\r\n\r\n properties[field.name] = schema;\r\n\r\n if (field.isRequired && !field.isId && forCreate) {\r\n required.push(field.name);\r\n }\r\n }\r\n\r\n return {\r\n type: \"object\",\r\n properties,\r\n ...(required.length > 0 ? { required } : {}),\r\n };\r\n}\r\n\r\n/**\r\n * Generates a full OpenAPI 3.0 specification object for all exposed models.\r\n *\r\n * @example\r\n * ```ts\r\n * import { generateOpenApiSpec } from \"omni-rest\";\r\n * const spec = generateOpenApiSpec(prisma, { title: \"My API\", version: \"1.0.0\", basePath: \"/api\" });\r\n * fs.writeFileSync(\"openapi.json\", JSON.stringify(spec, null, 2));\r\n * ```\r\n */\r\nexport function generateOpenApiSpec(\r\n prisma: any,\r\n options: {\r\n title?: string;\r\n version?: string;\r\n basePath?: string;\r\n allow?: string[];\r\n servers?: { url: string; description?: string }[];\r\n } = {}\r\n): object {\r\n const {\r\n title = \"omni-rest API\",\r\n version = \"1.0.0\",\r\n basePath = \"/api\",\r\n allow,\r\n servers = [{ url: \"http://localhost:3000\" }],\r\n } = options;\r\n\r\n const models = getModels(prisma).filter(\r\n (m) => !allow || allow.includes(m.routeName)\r\n );\r\n\r\n const paths: Record<string, any> = {};\r\n const schemas: Record<string, any> = {};\r\n\r\n for (const meta of models) {\r\n const name = meta.name;\r\n const route = meta.routeName;\r\n\r\n // ── Schemas ──────────────────────────────────────────────────────────────\r\n schemas[name] = buildModelSchema(meta, false);\r\n schemas[`${name}Create`] = buildModelSchema(meta, true);\r\n schemas[`${name}Update`] = {\r\n ...buildModelSchema(meta, true),\r\n required: [], // all optional for PATCH\r\n };\r\n\r\n // ── Collection path /api/:model ───────────────────────────────────────────\r\n paths[`${basePath}/${route}`] = {\r\n get: {\r\n summary: `List ${name}s`,\r\n tags: [name],\r\n parameters: buildListParameters(),\r\n responses: {\r\n 200: {\r\n description: `List of ${name}s`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"object\",\r\n properties: {\r\n data: { type: \"array\", items: { $ref: `#/components/schemas/${name}` } },\r\n meta: { $ref: \"#/components/schemas/PaginationMeta\" },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n post: {\r\n summary: `Create ${name}`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}Create` },\r\n },\r\n },\r\n },\r\n responses: {\r\n 201: {\r\n description: `Created ${name}`,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n 400: { $ref: \"#/components/responses/BadRequest\" },\r\n 409: { $ref: \"#/components/responses/Conflict\" },\r\n },\r\n },\r\n };\r\n\r\n // ── Resource path /api/:model/:id ─────────────────────────────────────────\r\n paths[`${basePath}/${route}/{id}`] = {\r\n parameters: [\r\n {\r\n name: \"id\",\r\n in: \"path\",\r\n required: true,\r\n schema: { type: \"string\" },\r\n description: `${name} ID`,\r\n },\r\n ],\r\n get: {\r\n summary: `Get ${name} by ID`,\r\n tags: [name],\r\n responses: {\r\n 200: {\r\n description: `${name} record`,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n 404: { $ref: \"#/components/responses/NotFound\" },\r\n },\r\n },\r\n put: {\r\n summary: `Update ${name}`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}Create` },\r\n },\r\n },\r\n },\r\n responses: {\r\n 200: {\r\n description: `Updated ${name}`,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n 404: { $ref: \"#/components/responses/NotFound\" },\r\n },\r\n },\r\n patch: {\r\n summary: `Partially update ${name}`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}Update` },\r\n },\r\n },\r\n },\r\n responses: {\r\n 200: {\r\n description: `Updated ${name}`,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n 404: { $ref: \"#/components/responses/NotFound\" },\r\n },\r\n },\r\n delete: {\r\n summary: `Delete ${name}`,\r\n tags: [name],\r\n responses: {\r\n 204: { description: \"Deleted successfully\" },\r\n 404: { $ref: \"#/components/responses/NotFound\" },\r\n },\r\n },\r\n };\r\n\r\n // ── Bulk operations paths ──────────────────────────────────────────────────\r\n paths[`${basePath}/${route}/bulk/update`] = {\r\n patch: {\r\n summary: `Bulk update ${name}s`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n description: `Array of ${name} objects with id field to update`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"array\",\r\n items: { $ref: `#/components/schemas/${name}Update` },\r\n },\r\n },\r\n },\r\n },\r\n responses: {\r\n 200: {\r\n description: `Bulk update result`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"object\",\r\n properties: {\r\n updated: { type: \"integer\" },\r\n records: {\r\n type: \"array\",\r\n items: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n 400: { $ref: \"#/components/responses/BadRequest\" },\r\n },\r\n },\r\n };\r\n\r\n paths[`${basePath}/${route}/bulk/delete`] = {\r\n delete: {\r\n summary: `Bulk delete ${name}s`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n description: `Array of IDs to delete`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"array\",\r\n items: { type: \"string\" },\r\n },\r\n },\r\n },\r\n },\r\n responses: {\r\n 200: {\r\n description: `Bulk delete result`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"object\",\r\n properties: {\r\n deleted: { type: \"integer\" },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n 400: { $ref: \"#/components/responses/BadRequest\" },\r\n },\r\n },\r\n };\r\n }\r\n\r\n return {\r\n openapi: \"3.0.3\",\r\n info: { title, version },\r\n servers,\r\n paths,\r\n components: {\r\n schemas: {\r\n ...schemas,\r\n PaginationMeta: {\r\n type: \"object\",\r\n properties: {\r\n total: { type: \"integer\" },\r\n page: { type: \"integer\" },\r\n limit: { type: \"integer\" },\r\n totalPages: { type: \"integer\" },\r\n },\r\n },\r\n Error: {\r\n type: \"object\",\r\n properties: { error: { type: \"string\" } },\r\n },\r\n },\r\n responses: {\r\n NotFound: {\r\n description: \"Record not found\",\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: \"#/components/schemas/Error\" },\r\n },\r\n },\r\n },\r\n BadRequest: {\r\n description: \"Bad request\",\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: \"#/components/schemas/Error\" },\r\n },\r\n },\r\n },\r\n Conflict: {\r\n description: \"Unique constraint violation\",\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: \"#/components/schemas/Error\" },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n tags: models.map((m) => ({ name: m.name })),\r\n };\r\n}\r\n\r\nfunction buildListParameters() {\r\n return [\r\n { name: \"page\", in: \"query\", schema: { type: \"integer\", default: 1 }, description: \"Page number\" },\r\n { name: \"limit\", in: \"query\", schema: { type: \"integer\", default: 20 }, description: \"Items per page\" },\r\n { name: \"sort\", in: \"query\", schema: { type: \"string\" }, description: \"e.g. createdAt:desc\" },\r\n { name: \"include\", in: \"query\", schema: { type: \"string\" }, description: \"Comma-separated relations\" },\r\n { name: \"select\", in: \"query\", schema: { type: \"string\" }, description: \"Comma-separated fields\" },\r\n ];\r\n}","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport type { CandidateFrontend } from \"./types\";\r\n\r\nconst EXCLUDED_DIRS = new Set([\"node_modules\", \".git\", \"dist\", \"build\", \".next\", \"out\"]);\r\n\r\n/**\r\n * Reads and parses a package.json at the given directory.\r\n * Returns null if the file doesn't exist or can't be parsed.\r\n */\r\nfunction readPackageJson(dir: string): Record<string, unknown> | null {\r\n const pkgPath = path.join(dir, \"package.json\");\r\n try {\r\n const content = fs.readFileSync(pkgPath, \"utf-8\");\r\n return JSON.parse(content);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Scores a single directory based on the presence of framework config files\r\n * and react in package.json. Returns a CandidateFrontend or null if score is 0.\r\n */\r\nfunction scoreDir(dir: string, cwd: string): CandidateFrontend | null {\r\n let score = 0;\r\n const signals: string[] = [];\r\n\r\n // Check for next.config.js / next.config.ts\r\n if (\r\n fs.existsSync(path.join(dir, \"next.config.js\")) ||\r\n fs.existsSync(path.join(dir, \"next.config.ts\"))\r\n ) {\r\n score += 10;\r\n const file = fs.existsSync(path.join(dir, \"next.config.js\"))\r\n ? \"next.config.js\"\r\n : \"next.config.ts\";\r\n signals.push(`${file} found`);\r\n }\r\n\r\n // Check for vite.config.ts / vite.config.js\r\n if (\r\n fs.existsSync(path.join(dir, \"vite.config.ts\")) ||\r\n fs.existsSync(path.join(dir, \"vite.config.js\"))\r\n ) {\r\n score += 10;\r\n const file = fs.existsSync(path.join(dir, \"vite.config.ts\"))\r\n ? \"vite.config.ts\"\r\n : \"vite.config.js\";\r\n signals.push(`${file} found`);\r\n }\r\n\r\n // Check package.json for react dependency\r\n const pkg = readPackageJson(dir);\r\n if (pkg) {\r\n const deps = (pkg.dependencies as Record<string, string> | undefined) ?? {};\r\n const devDeps = (pkg.devDependencies as Record<string, string> | undefined) ?? {};\r\n\r\n if (\"react\" in deps) {\r\n score += 5;\r\n signals.push(\"react in dependencies\");\r\n } else if (\"react\" in devDeps) {\r\n score += 3;\r\n signals.push(\"react in devDependencies\");\r\n }\r\n }\r\n\r\n // Bonus for current working directory\r\n if (path.resolve(dir) === path.resolve(cwd)) {\r\n score += 2;\r\n signals.push(\"current working directory\");\r\n }\r\n\r\n if (score === 0) return null;\r\n\r\n return {\r\n dir: path.resolve(dir),\r\n score,\r\n signals,\r\n };\r\n}\r\n\r\n/**\r\n * Recursively walks up to `maxDepth` levels deep from `rootDir`,\r\n * excluding directories in EXCLUDED_DIRS, and collects scored candidates.\r\n */\r\nfunction walk(\r\n dir: string,\r\n cwd: string,\r\n currentDepth: number,\r\n maxDepth: number,\r\n results: Map<string, CandidateFrontend>\r\n): void {\r\n const absDir = path.resolve(dir);\r\n\r\n // Score this directory\r\n const candidate = scoreDir(absDir, cwd);\r\n if (candidate && !results.has(absDir)) {\r\n results.set(absDir, candidate);\r\n }\r\n\r\n if (currentDepth >= maxDepth) return;\r\n\r\n // Recurse into subdirectories\r\n let entries: fs.Dirent[];\r\n try {\r\n entries = fs.readdirSync(absDir, { withFileTypes: true });\r\n } catch {\r\n return;\r\n }\r\n\r\n for (const entry of entries) {\r\n if (!entry.isDirectory()) continue;\r\n if (EXCLUDED_DIRS.has(entry.name)) continue;\r\n\r\n walk(path.join(absDir, entry.name), cwd, currentDepth + 1, maxDepth, results);\r\n }\r\n}\r\n\r\n/**\r\n * Walks up to 3 levels deep from `dir`, scores each candidate directory,\r\n * and returns CandidateFrontend[] sorted descending by score (score 0 excluded).\r\n */\r\nexport function scoreCandidates(dir: string): CandidateFrontend[] {\r\n const cwd = process.cwd();\r\n const results = new Map<string, CandidateFrontend>();\r\n\r\n walk(dir, cwd, 0, 3, results);\r\n\r\n return Array.from(results.values()).sort((a, b) => b.score - a.score);\r\n}\r\n\r\n/**\r\n * Public API: scans for frontend directories starting from `dir`.\r\n * Returns CandidateFrontend[] sorted descending by score.\r\n */\r\nexport async function scanForFrontendDir(dir: string): Promise<CandidateFrontend[]> {\r\n return scoreCandidates(dir);\r\n}\r\n","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport type { ModelMeta } from \"../types\";\r\nimport { getModels } from \"../introspect\";\r\n\r\n/**\r\n * Finds the nearest `schema.prisma` file by walking up from `startDir`.\r\n *\r\n * - If `explicitPath` is provided, verifies it exists and returns it immediately.\r\n * - Otherwise walks up the directory tree until `schema.prisma` is found or root is reached.\r\n *\r\n * Requirements: 2.1, 2.2, 2.3, 2.4, 2.5\r\n */\r\nexport async function findSchema(\r\n startDir: string,\r\n explicitPath?: string\r\n): Promise<string> {\r\n if (explicitPath !== undefined) {\r\n const resolved = path.resolve(explicitPath);\r\n if (!fs.existsSync(resolved)) {\r\n throw new Error(\r\n `[omni-rest] Schema file not found at the specified path: \"${resolved}\"\\n` +\r\n `Please check that the path is correct and the file is readable.`\r\n );\r\n }\r\n return resolved;\r\n }\r\n\r\n let current = path.resolve(startDir);\r\n\r\n while (true) {\r\n // Check both root and prisma/ subdirectory\r\n const candidates = [\r\n path.join(current, \"prisma\", \"schema.prisma\"),\r\n path.join(current, \"schema.prisma\"),\r\n ];\r\n\r\n for (const candidate of candidates) {\r\n if (fs.existsSync(candidate)) {\r\n return candidate;\r\n }\r\n }\r\n\r\n const parent = path.dirname(current);\r\n if (parent === current) {\r\n // Reached filesystem root without finding schema.prisma\r\n throw new Error(\r\n `[omni-rest] Could not find \"schema.prisma\" by walking up from \"${startDir}\".\\n` +\r\n `Please run this command from within your Prisma project, or specify the path with --schema <path>.`\r\n );\r\n }\r\n current = parent;\r\n }\r\n}\r\n\r\n/**\r\n * Loads `@prisma/client` from the user's `node_modules` at `prismaClientPath`\r\n * and returns the list of models via `getModels`.\r\n *\r\n * Supports both standard output (node_modules/@prisma/client) and custom\r\n * output paths defined in schema.prisma generator block.\r\n *\r\n * Requirements: 5.1, 5.2, 5.3, 5.4, 5.5\r\n */\r\nexport async function loadDMMF(\r\n frontendDir: string,\r\n schemaPath: string\r\n): Promise<ModelMeta[]> {\r\n // 1. Try to detect custom output path from schema.prisma\r\n let clientPath: string | null = null;\r\n\r\n try {\r\n const schemaContent = fs.readFileSync(schemaPath, \"utf-8\");\r\n const outputMatch = schemaContent.match(/output\\s*=\\s*[\"']([^\"']+)[\"']/);\r\n \r\n if (outputMatch) {\r\n // Custom output path is relative to schema.prisma location\r\n const schemaDir = path.dirname(schemaPath);\r\n const customOutput = path.resolve(schemaDir, outputMatch[1]);\r\n \r\n if (fs.existsSync(customOutput)) {\r\n clientPath = customOutput;\r\n }\r\n }\r\n } catch {\r\n // Ignore schema read errors, fall back to standard path\r\n }\r\n\r\n // 2. Fall back to standard @prisma/client location\r\n if (!clientPath) {\r\n clientPath = path.join(frontendDir, \"node_modules\", \"@prisma\", \"client\");\r\n }\r\n\r\n // 3. Try to load the client module\r\n let prismaClientModule: any;\r\n\r\n try {\r\n // Use require() to load from the resolved path\r\n prismaClientModule = require(clientPath);\r\n } catch (err) {\r\n throw new Error(\r\n `[omni-rest] Could not load \"@prisma/client\" from \"${clientPath}\".\\n` +\r\n `Please run \"npx prisma generate\" to generate the Prisma client, then try again.`\r\n );\r\n }\r\n\r\n // 4. Extract the Prisma namespace to pass DMMF access to getModels\r\n const prismaNamespace = prismaClientModule?.Prisma ?? prismaClientModule?.default?.Prisma;\r\n\r\n if (!prismaNamespace?.dmmf?.datamodel?.models) {\r\n throw new Error(\r\n `[omni-rest] Could not read DMMF from \"@prisma/client\" at \"${clientPath}\".\\n` +\r\n `Please run \"npx prisma generate\" to regenerate the Prisma client, then try again.`\r\n );\r\n }\r\n\r\n // 5. Build a synthetic prisma instance for getModels()\r\n const dmmfModels: any[] = prismaNamespace.dmmf.datamodel.models;\r\n\r\n // Build a synthetic prisma instance whose _runtimeDataModel mirrors the DMMF\r\n // so that getModels() picks it up via the first branch.\r\n const syntheticPrisma = {\r\n _runtimeDataModel: {\r\n models: Object.fromEntries(\r\n dmmfModels.map((m: any) => [\r\n m.name,\r\n {\r\n fields: m.fields,\r\n },\r\n ])\r\n ),\r\n },\r\n };\r\n\r\n return getModels(syntheticPrisma);\r\n}\r\n","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\n\r\ntype Framework = \"nextjs\" | \"vite-react\" | \"react\";\r\n\r\n/**\r\n * Detects project structure details\r\n */\r\nexport interface ProjectStructure {\r\n usesSrc: boolean; // Has src/ directory\r\n usesAppRouter: boolean; // Next.js App Router (app/ directory)\r\n usesPagesRouter: boolean; // Next.js Pages Router (pages/ directory)\r\n basePath: string; // Base path for generated files (\"src\" or \".\")\r\n appPath: string | null; // Path to app/ directory if exists\r\n}\r\n\r\n/**\r\n * Detects the project structure (src/, app/, pages/)\r\n */\r\nexport function detectProjectStructure(frontendDir: string): ProjectStructure {\r\n const hasSrc = fs.existsSync(path.join(frontendDir, \"src\"));\r\n const hasApp = fs.existsSync(path.join(frontendDir, \"app\"));\r\n const hasSrcApp = fs.existsSync(path.join(frontendDir, \"src\", \"app\"));\r\n const hasPages = fs.existsSync(path.join(frontendDir, \"pages\"));\r\n const hasSrcPages = fs.existsSync(path.join(frontendDir, \"src\", \"pages\"));\r\n\r\n const usesAppRouter = hasApp || hasSrcApp;\r\n const usesPagesRouter = hasPages || hasSrcPages;\r\n const basePath = hasSrc ? \"src\" : \".\";\r\n \r\n let appPath: string | null = null;\r\n if (hasSrcApp) {\r\n appPath = path.join(frontendDir, \"src\", \"app\");\r\n } else if (hasApp) {\r\n appPath = path.join(frontendDir, \"app\");\r\n }\r\n\r\n return {\r\n usesSrc: hasSrc,\r\n usesAppRouter,\r\n usesPagesRouter,\r\n basePath,\r\n appPath,\r\n };\r\n}\r\n\r\n/**\r\n * Detects the frontend framework used in the given directory.\r\n *\r\n * Priority:\r\n * 1. next.config.js or next.config.ts → \"nextjs\"\r\n * 2. vite.config.ts or vite.config.js (no next config) → \"vite-react\"\r\n * 3. package.json with react in dependencies/devDependencies → \"react\"\r\n * 4. Fallback: prints warning and returns \"react\"\r\n *\r\n * Requirements: 3.1, 3.2, 3.3, 3.4\r\n */\r\nexport function detectFramework(frontendDir: string): Framework {\r\n const hasNextConfig =\r\n fs.existsSync(path.join(frontendDir, \"next.config.js\")) ||\r\n fs.existsSync(path.join(frontendDir, \"next.config.ts\"));\r\n\r\n if (hasNextConfig) return \"nextjs\";\r\n\r\n const hasViteConfig =\r\n fs.existsSync(path.join(frontendDir, \"vite.config.ts\")) ||\r\n fs.existsSync(path.join(frontendDir, \"vite.config.js\"));\r\n\r\n if (hasViteConfig) return \"vite-react\";\r\n\r\n // Check package.json for react dependency\r\n const pkgPath = path.join(frontendDir, \"package.json\");\r\n if (fs.existsSync(pkgPath)) {\r\n try {\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\r\n const deps = pkg.dependencies ?? {};\r\n const devDeps = pkg.devDependencies ?? {};\r\n if (\"react\" in deps || \"react\" in devDeps) {\r\n return \"react\";\r\n }\r\n } catch {\r\n // ignore parse errors\r\n }\r\n }\r\n\r\n console.warn(\r\n `[omni-rest] Warning: Could not detect frontend framework in \"${frontendDir}\". Defaulting to \"react\".`\r\n );\r\n return \"react\";\r\n}\r\n\r\n/**\r\n * Parses a simple .env file and returns a map of key → value.\r\n * Handles KEY=VALUE and KEY=\"VALUE\" formats. Ignores comments and blank lines.\r\n */\r\nfunction parseEnvFile(filePath: string): Map<string, string> {\r\n const result = new Map<string, string>();\r\n let content: string;\r\n try {\r\n content = fs.readFileSync(filePath, \"utf-8\");\r\n } catch {\r\n return result;\r\n }\r\n\r\n for (const line of content.split(\"\\n\")) {\r\n const trimmed = line.trim();\r\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\r\n const eqIdx = trimmed.indexOf(\"=\");\r\n if (eqIdx === -1) continue;\r\n const key = trimmed.slice(0, eqIdx).trim();\r\n let value = trimmed.slice(eqIdx + 1).trim();\r\n // Strip surrounding quotes\r\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\r\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\r\n value = value.slice(1, -1);\r\n }\r\n result.set(key, value);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Resolves the API base URL from environment files.\r\n *\r\n * Priority:\r\n * 1. .env.local → NEXT_PUBLIC_API_URL\r\n * 2. .env → NEXT_PUBLIC_API_URL or VITE_API_URL\r\n * 3. Fallback: \"/api\"\r\n *\r\n * Does NOT modify any env file.\r\n * Requirements: 4.1, 4.2, 4.3, 4.4\r\n */\r\nexport function resolveBaseUrl(frontendDir: string): string {\r\n // 1. Check .env.local for NEXT_PUBLIC_API_URL\r\n const envLocal = parseEnvFile(path.join(frontendDir, \".env.local\"));\r\n if (envLocal.has(\"NEXT_PUBLIC_API_URL\")) {\r\n return envLocal.get(\"NEXT_PUBLIC_API_URL\")!;\r\n }\r\n\r\n // 2. Check .env for NEXT_PUBLIC_API_URL or VITE_API_URL\r\n const env = parseEnvFile(path.join(frontendDir, \".env\"));\r\n if (env.has(\"NEXT_PUBLIC_API_URL\")) {\r\n return env.get(\"NEXT_PUBLIC_API_URL\")!;\r\n }\r\n if (env.has(\"VITE_API_URL\")) {\r\n return env.get(\"VITE_API_URL\")!;\r\n }\r\n\r\n // 3. Default\r\n return \"/api\";\r\n}\r\n\r\n/**\r\n * Resolves the output directory for generated files.\r\n *\r\n * Rules (in priority order):\r\n * 1. If outFlag is provided → path.resolve(frontendDir, outFlag)\r\n * 2. If src/ exists → frontendDir/src/\r\n * 3. Otherwise → frontendDir/ (root)\r\n *\r\n * Note: For Next.js App Router, components/hooks/lib go in root or src/,\r\n * while pages are generated separately in app/ directory.\r\n *\r\n * Requirements: 13.1, 13.2, 13.3\r\n */\r\nexport function resolveOutputDir(\r\n frontendDir: string,\r\n framework: Framework,\r\n outFlag?: string\r\n): string {\r\n if (outFlag) {\r\n return path.resolve(frontendDir, outFlag);\r\n }\r\n\r\n const structure = detectProjectStructure(frontendDir);\r\n \r\n // Use detected base path (src or root)\r\n if (structure.usesSrc) {\r\n return path.resolve(frontendDir, \"src\");\r\n }\r\n\r\n // Default to root directory\r\n return frontendDir;\r\n}\r\n","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\n\r\nconst BASE_PACKAGES = [\r\n \"@tanstack/react-query\",\r\n \"@tanstack/react-table\",\r\n \"react-hook-form\",\r\n \"zod\",\r\n \"@hookform/resolvers\",\r\n];\r\n\r\nconst FRAMEWORK_PACKAGES: Record<string, string[]> = {\r\n nextjs: [\"next\"],\r\n \"vite-react\": [\"react-router-dom\"],\r\n};\r\n\r\n/**\r\n * Checks that required packages are present in the frontend project's package.json.\r\n *\r\n * Returns an array of missing package names. If package.json cannot be read,\r\n * all required packages are returned as missing.\r\n *\r\n * Requirements: 14.1, 14.2, 14.3, 14.4, 14.5\r\n */\r\nexport function checkDependencies(\r\n frontendDir: string,\r\n framework: \"nextjs\" | \"vite-react\" | \"react\"\r\n): string[] {\r\n const required = [\r\n ...BASE_PACKAGES,\r\n ...(FRAMEWORK_PACKAGES[framework] ?? []),\r\n ];\r\n\r\n const pkgPath = path.join(frontendDir, \"package.json\");\r\n let installed: Set<string>;\r\n\r\n try {\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\r\n const deps = Object.keys(pkg.dependencies ?? {});\r\n const devDeps = Object.keys(pkg.devDependencies ?? {});\r\n installed = new Set([...deps, ...devDeps]);\r\n } catch {\r\n // package.json missing or unreadable — treat all as missing\r\n return required;\r\n }\r\n\r\n return required.filter((pkg) => !installed.has(pkg));\r\n}\r\n","import * as readline from \"readline\";\r\nimport type { ModelMeta, FieldMeta } from \"../types\";\r\nimport type { ModelConfig } from \"./types\";\r\n\r\n// ─── Flags interface ──────────────────────────────────────────────────────────\r\n\r\nexport interface BuildConfigFlags {\r\n autopilot?: boolean;\r\n noBulk?: boolean;\r\n steps?: \"auto\" | \"always\" | \"never\";\r\n modelsFilter?: string[];\r\n}\r\n\r\n// ─── shouldUseMultiStep ───────────────────────────────────────────────────────\r\n\r\n/**\r\n * Determines whether a model's form should use multi-step wizard mode.\r\n *\r\n * Rules (Requirements 16.1, 16.2, 16.3):\r\n * - \"always\" → true (regardless of field count)\r\n * - \"never\" → false (regardless of field count)\r\n * - \"auto\" / undefined → true only when fieldCount > 6\r\n */\r\nexport function shouldUseMultiStep(\r\n fieldCount: number,\r\n stepsFlag?: \"auto\" | \"always\" | \"never\"\r\n): boolean {\r\n if (stepsFlag === \"always\") return true;\r\n if (stepsFlag === \"never\") return false;\r\n // \"auto\" or undefined\r\n return fieldCount > 6;\r\n}\r\n\r\n// ─── Field helpers ────────────────────────────────────────────────────────────\r\n\r\nfunction scalarFields(model: ModelMeta): FieldMeta[] {\r\n return model.fields.filter((f) => !f.isRelation);\r\n}\r\n\r\nfunction relationalFields(model: ModelMeta): FieldMeta[] {\r\n return model.fields.filter((f) => f.isRelation);\r\n}\r\n\r\n/**\r\n * Returns fields that should be included in forms (excludes auto-generated fields).\r\n * Excludes: id fields, fields with @default(), and @updatedAt fields.\r\n */\r\nfunction formEditableFields(model: ModelMeta): FieldMeta[] {\r\n return model.fields.filter(\r\n (f) => !f.isRelation && !f.isId && !f.hasDefaultValue && !f.isUpdatedAt\r\n );\r\n}\r\n\r\n// ─── Autopilot config ─────────────────────────────────────────────────────────\r\n\r\nfunction buildAutopilotConfig(\r\n models: ModelMeta[],\r\n flags: BuildConfigFlags\r\n): ModelConfig[] {\r\n return models.map((model) => {\r\n const scalars = scalarFields(model).map((f) => f.name);\r\n const editableFields = formEditableFields(model).map((f) => f.name);\r\n const relations = relationalFields(model).map((f) => f.name);\r\n const fieldCount = model.fields.length;\r\n\r\n return {\r\n model,\r\n tableFields: scalars,\r\n formFields: editableFields, // Use editable fields for forms\r\n relationalFields: relations,\r\n bulkDelete: !flags.noBulk,\r\n canExport: true,\r\n multiStep: shouldUseMultiStep(fieldCount, flags.steps),\r\n };\r\n });\r\n}\r\n\r\n// ─── Interactive helpers ──────────────────────────────────────────────────────\r\n\r\nfunction ask(rl: readline.Interface, question: string): Promise<string> {\r\n return new Promise((resolve) => rl.question(question, resolve));\r\n}\r\n\r\n/**\r\n * Presents a numbered list and returns the indices the user selected.\r\n * Input format: \"1,3,5\" or \"1 3 5\" or \"all\" (selects everything).\r\n */\r\nasync function multiSelect(\r\n rl: readline.Interface,\r\n prompt: string,\r\n items: string[]\r\n): Promise<number[]> {\r\n console.log(prompt);\r\n items.forEach((item, i) => console.log(` ${i + 1}. ${item}`));\r\n const answer = await ask(rl, \" Enter numbers (comma/space separated, or 'all'): \");\r\n const trimmed = answer.trim().toLowerCase();\r\n if (trimmed === \"all\" || trimmed === \"\") {\r\n return items.map((_, i) => i);\r\n }\r\n return trimmed\r\n .split(/[\\s,]+/)\r\n .map((s) => parseInt(s, 10) - 1)\r\n .filter((i) => i >= 0 && i < items.length);\r\n}\r\n\r\nasync function yesNo(\r\n rl: readline.Interface,\r\n prompt: string,\r\n defaultYes = true\r\n): Promise<boolean> {\r\n const hint = defaultYes ? \"[Y/n]\" : \"[y/N]\";\r\n const answer = await ask(rl, `${prompt} ${hint}: `);\r\n const trimmed = answer.trim().toLowerCase();\r\n if (trimmed === \"\") return defaultYes;\r\n return trimmed === \"y\" || trimmed === \"yes\";\r\n}\r\n\r\n// ─── Interactive config ───────────────────────────────────────────────────────\r\n\r\nasync function buildInteractiveConfig(\r\n models: ModelMeta[],\r\n flags: BuildConfigFlags\r\n): Promise<ModelConfig[]> {\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n });\r\n\r\n try {\r\n // Step 1: which models to generate\r\n const modelIndices = await multiSelect(\r\n rl,\r\n \"\\nWhich models do you want to generate? (default: all)\",\r\n models.map((m) => m.name)\r\n );\r\n const selectedModels = modelIndices.map((i) => models[i]);\r\n\r\n const configs: ModelConfig[] = [];\r\n\r\n for (const model of selectedModels) {\r\n console.log(`\\n── Configuring ${model.name} ──`);\r\n\r\n const scalars = scalarFields(model);\r\n const editableFields = formEditableFields(model);\r\n const relations = relationalFields(model);\r\n\r\n // Relational fields as searchable-select\r\n let selectedRelations: string[] = relations.map((f) => f.name);\r\n if (relations.length > 0) {\r\n const relIndices = await multiSelect(\r\n rl,\r\n ` Relational fields for ${model.name} (searchable-select dropdowns):`,\r\n relations.map((f) => f.name)\r\n );\r\n selectedRelations = relIndices.map((i) => relations[i].name);\r\n }\r\n\r\n // Scalar fields for table\r\n const tableIndices = await multiSelect(\r\n rl,\r\n ` Scalar fields to show in the table for ${model.name}:`,\r\n scalars.map((f) => f.name)\r\n );\r\n const tableFields = tableIndices.map((i) => scalars[i].name);\r\n\r\n // Editable fields for form (excludes auto-generated)\r\n const formIndices = await multiSelect(\r\n rl,\r\n ` Fields to include in the form for ${model.name}:`,\r\n editableFields.map((f) => f.name)\r\n );\r\n const formFields = formIndices.map((i) => editableFields[i].name);\r\n\r\n // Bulk delete — CLI flag overrides prompt\r\n const bulkDelete = flags.noBulk\r\n ? false\r\n : await yesNo(rl, ` Enable bulk delete for ${model.name}?`);\r\n\r\n // Export — prompt answer\r\n const canExport = await yesNo(rl, ` Enable CSV/JSON export for ${model.name}?`);\r\n\r\n // Multi-step: if steps flag is set, use it; otherwise prompt only when auto\r\n let multiStep: boolean;\r\n if (flags.steps === \"always\") {\r\n multiStep = true;\r\n } else if (flags.steps === \"never\") {\r\n multiStep = false;\r\n } else {\r\n // auto / undefined — suggest based on field count, let user confirm\r\n const suggested = formFields.length > 6;\r\n multiStep = await yesNo(\r\n rl,\r\n ` Enable multi-step form for ${model.name}?`,\r\n suggested\r\n );\r\n }\r\n\r\n configs.push({\r\n model,\r\n tableFields,\r\n formFields,\r\n relationalFields: selectedRelations,\r\n bulkDelete,\r\n canExport,\r\n multiStep,\r\n });\r\n }\r\n\r\n return configs;\r\n } finally {\r\n rl.close();\r\n }\r\n}\r\n\r\n// ─── Public API ───────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Builds per-model configuration either from autopilot defaults or interactive prompts.\r\n *\r\n * Requirements: 6.1–6.8, 7.1–7.7\r\n */\r\nexport async function buildConfig(\r\n models: ModelMeta[],\r\n flags: BuildConfigFlags\r\n): Promise<ModelConfig[]> {\r\n // Apply models filter if provided\r\n const filtered =\r\n flags.modelsFilter && flags.modelsFilter.length > 0\r\n ? models.filter((m) => flags.modelsFilter!.includes(m.name))\r\n : models;\r\n\r\n if (flags.autopilot) {\r\n return buildAutopilotConfig(filtered, flags);\r\n }\r\n\r\n return buildInteractiveConfig(filtered, flags);\r\n}\r\n","import type { GeneratorConfig, ModelConfig } from \"../types\";\r\n\r\n/**\r\n * Generates the content of a `use[Model].ts` TanStack Query hook file.\r\n */\r\nexport function generateHookFile(\r\n config: GeneratorConfig,\r\n modelConfig: ModelConfig\r\n): string {\r\n const { baseUrl, staleTime, gcTime, noOptimistic } = config;\r\n const { model, bulkDelete } = modelConfig;\r\n const { name, routeName } = model;\r\n\r\n // Capitalise first letter for hook names\r\n const Model = name; // e.g. \"User\"\r\n const models = `${Model}s`; // e.g. \"Users\"\r\n\r\n const lines: string[] = [];\r\n\r\n // Imports\r\n lines.push(`import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";`);\r\n lines.push(`import type { ${Model}, Prisma } from \"@prisma/client\";`);\r\n lines.push(``);\r\n\r\n // Base URL constant\r\n lines.push(`const BASE_URL = \"${baseUrl}\";`);\r\n lines.push(``);\r\n\r\n // ── use[Model]s ──────────────────────────────────────────────────────────\r\n lines.push(`export function use${models}(params?: Record<string, any>) {`);\r\n lines.push(` return useQuery({`);\r\n lines.push(` queryKey: [\"${routeName}\", params],`);\r\n lines.push(` queryFn: () => {`);\r\n lines.push(` const url = new URL(\\`\\${BASE_URL}/${routeName}\\`, window.location.origin);`);\r\n lines.push(` if (params) {`);\r\n lines.push(` Object.entries(params).forEach(([k, v]) => {`);\r\n lines.push(` if (v !== undefined && v !== null) url.searchParams.set(k, String(v));`);\r\n lines.push(` });`);\r\n lines.push(` }`);\r\n lines.push(` return fetch(url.toString()).then((r) => r.json());`);\r\n lines.push(` },`);\r\n lines.push(` staleTime: ${staleTime},`);\r\n lines.push(` gcTime: ${gcTime},`);\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── use[Model] ───────────────────────────────────────────────────────────\r\n lines.push(`export function use${Model}(id: string) {`);\r\n lines.push(` return useQuery({`);\r\n lines.push(` queryKey: [\"${routeName}\", id],`);\r\n lines.push(` queryFn: () =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}/\\${id}\\`).then((r) => r.json()),`);\r\n lines.push(` staleTime: ${staleTime},`);\r\n lines.push(` gcTime: ${gcTime},`);\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── useCreate[Model] ─────────────────────────────────────────────────────\r\n lines.push(`export function useCreate${Model}() {`);\r\n lines.push(` const queryClient = useQueryClient();`);\r\n lines.push(` return useMutation({`);\r\n lines.push(` mutationFn: (data: Prisma.${Model}CreateInput) =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}\\`, {`);\r\n lines.push(` method: \"POST\",`);\r\n lines.push(` headers: { \"Content-Type\": \"application/json\" },`);\r\n lines.push(` body: JSON.stringify(data),`);\r\n lines.push(` }).then((r) => r.json()) as Promise<${Model}>,`);\r\n if (!noOptimistic) {\r\n lines.push(` onMutate: async (newItem) => {`);\r\n lines.push(` await queryClient.cancelQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` const previous = queryClient.getQueryData([\"${routeName}\"]);`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], (old: any) => ({`);\r\n lines.push(` ...old,`);\r\n lines.push(` data: [...(old?.data ?? []), { ...newItem, id: \"__optimistic__\" }],`);\r\n lines.push(` }));`);\r\n lines.push(` return { previous };`);\r\n lines.push(` },`);\r\n lines.push(` onError: (_err, _vars, ctx) => {`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], ctx?.previous);`);\r\n lines.push(` },`);\r\n lines.push(` onSettled: () => {`);\r\n lines.push(` queryClient.invalidateQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` },`);\r\n }\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── useUpdate[Model] ─────────────────────────────────────────────────────\r\n lines.push(`export function useUpdate${Model}() {`);\r\n lines.push(` const queryClient = useQueryClient();`);\r\n lines.push(` return useMutation({`);\r\n lines.push(` mutationFn: ({ id, data }: { id: string; data: Prisma.${Model}UpdateInput }) =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}/\\${id}\\`, {`);\r\n lines.push(` method: \"PATCH\",`);\r\n lines.push(` headers: { \"Content-Type\": \"application/json\" },`);\r\n lines.push(` body: JSON.stringify(data),`);\r\n lines.push(` }).then((r) => r.json()) as Promise<${Model}>,`);\r\n if (!noOptimistic) {\r\n lines.push(` onMutate: async ({ id, data }) => {`);\r\n lines.push(` await queryClient.cancelQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` const previous = queryClient.getQueryData([\"${routeName}\"]);`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], (old: any) => ({`);\r\n lines.push(` ...old,`);\r\n lines.push(` data: (old?.data ?? []).map((item: any) =>`);\r\n lines.push(` item.id === id ? { ...item, ...data } : item`);\r\n lines.push(` ),`);\r\n lines.push(` }));`);\r\n lines.push(` return { previous };`);\r\n lines.push(` },`);\r\n lines.push(` onError: (_err, _vars, ctx) => {`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], ctx?.previous);`);\r\n lines.push(` },`);\r\n lines.push(` onSettled: () => {`);\r\n lines.push(` queryClient.invalidateQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` },`);\r\n }\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── useDelete[Model] ─────────────────────────────────────────────────────\r\n lines.push(`export function useDelete${Model}() {`);\r\n lines.push(` const queryClient = useQueryClient();`);\r\n lines.push(` return useMutation({`);\r\n lines.push(` mutationFn: (id: string) =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}/\\${id}\\`, { method: \"DELETE\" }).then((r) =>`);\r\n lines.push(` r.json()`);\r\n lines.push(` ),`);\r\n if (!noOptimistic) {\r\n lines.push(` onMutate: async (id) => {`);\r\n lines.push(` await queryClient.cancelQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` const previous = queryClient.getQueryData([\"${routeName}\"]);`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], (old: any) => ({`);\r\n lines.push(` ...old,`);\r\n lines.push(` data: (old?.data ?? []).filter((item: any) => item.id !== id),`);\r\n lines.push(` }));`);\r\n lines.push(` return { previous };`);\r\n lines.push(` },`);\r\n lines.push(` onError: (_err, _vars, ctx) => {`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], ctx?.previous);`);\r\n lines.push(` },`);\r\n lines.push(` onSettled: () => {`);\r\n lines.push(` queryClient.invalidateQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` },`);\r\n }\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── useBulkDelete[Model]s ────────────────────────────────────────────────\r\n if (bulkDelete !== false) {\r\n lines.push(`export function useBulkDelete${models}() {`);\r\n lines.push(` const queryClient = useQueryClient();`);\r\n lines.push(` return useMutation({`);\r\n lines.push(` mutationFn: (ids: string[]) =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}\\`, {`);\r\n lines.push(` method: \"DELETE\",`);\r\n lines.push(` headers: { \"Content-Type\": \"application/json\" },`);\r\n lines.push(` body: JSON.stringify({ ids }),`);\r\n lines.push(` }).then((r) => r.json()),`);\r\n if (!noOptimistic) {\r\n lines.push(` onMutate: async (ids) => {`);\r\n lines.push(` await queryClient.cancelQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` const previous = queryClient.getQueryData([\"${routeName}\"]);`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], (old: any) => ({`);\r\n lines.push(` ...old,`);\r\n lines.push(` data: (old?.data ?? []).filter((item: any) => !ids.includes(item.id)),`);\r\n lines.push(` }));`);\r\n lines.push(` return { previous };`);\r\n lines.push(` },`);\r\n lines.push(` onError: (_err, _vars, ctx) => {`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], ctx?.previous);`);\r\n lines.push(` },`);\r\n lines.push(` onSettled: () => {`);\r\n lines.push(` queryClient.invalidateQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` },`);\r\n }\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n }\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import type { FieldMeta } from \"../../types\";\r\n\r\n/**\r\n * Converts a camelCase string to Title Case with spaces.\r\n * e.g. \"firstName\" → \"First Name\", \"userId\" → \"User Id\"\r\n */\r\nexport function camelToTitle(name: string): string {\r\n // Insert a space before each uppercase letter, then capitalize the first letter\r\n return name\r\n .replace(/([A-Z])/g, \" $1\")\r\n .replace(/^./, (ch) => ch.toUpperCase())\r\n .trim();\r\n}\r\n\r\nconst VALID_FIELD_TYPES = [\r\n \"text\",\r\n \"number\",\r\n \"switch\",\r\n \"date\",\r\n \"textarea\",\r\n \"select\",\r\n \"searchable-select\",\r\n] as const;\r\n\r\nexport type FormFieldType = (typeof VALID_FIELD_TYPES)[number];\r\n\r\n/**\r\n * Maps a DMMF FieldMeta to a FormGenerator field type string.\r\n */\r\nexport function fieldTypeMap(field: FieldMeta): FormFieldType {\r\n if (field.isRelation) return \"searchable-select\";\r\n\r\n switch (field.type) {\r\n case \"String\":\r\n return \"text\";\r\n case \"Int\":\r\n case \"Float\":\r\n case \"Decimal\":\r\n return \"number\";\r\n case \"Boolean\":\r\n return \"switch\";\r\n case \"DateTime\":\r\n return \"date\";\r\n case \"Json\":\r\n return \"textarea\";\r\n default:\r\n // Enum types are not one of the scalar primitives above\r\n // We detect enums by checking if the type starts with an uppercase letter\r\n // and is not a known scalar — treat as \"select\"\r\n if (/^[A-Z]/.test(field.type)) return \"select\";\r\n return \"text\";\r\n }\r\n}\r\n\r\n/**\r\n * Splits a string[] into arrays of at most `maxPerStep` items.\r\n * Number of steps = ceil(fields.length / maxPerStep).\r\n */\r\nexport function chunkFields(fields: string[], maxPerStep = 4): string[][] {\r\n const steps: string[][] = [];\r\n for (let i = 0; i < fields.length; i += maxPerStep) {\r\n steps.push(fields.slice(i, i + maxPerStep));\r\n }\r\n return steps;\r\n}\r\n","import type { GeneratorConfig, ModelConfig } from \"../types\";\r\nimport { camelToTitle } from \"./utils\";\r\n\r\n/**\r\n * Generates the content of a `[Model]Columns.tsx` TanStack Table column definitions file.\r\n */\r\nexport function generateColumnsFile(\r\n _config: GeneratorConfig,\r\n modelConfig: ModelConfig\r\n): string {\r\n const { model, tableFields } = modelConfig;\r\n const { name } = model;\r\n\r\n // e.g. \"User\" → \"user\"\r\n const varName = name.charAt(0).toLowerCase() + name.slice(1);\r\n\r\n const lines: string[] = [];\r\n\r\n // Imports\r\n lines.push(`import type { ColumnDef } from \"@tanstack/react-table\";`);\r\n lines.push(`import type { ${name} } from \"@prisma/client\";`);\r\n lines.push(``);\r\n\r\n // Column array\r\n lines.push(`export const ${varName}Columns: ColumnDef<${name}>[] = [`);\r\n\r\n // One entry per selected scalar field\r\n for (const field of tableFields) {\r\n lines.push(` {`);\r\n lines.push(` accessorKey: \"${field}\",`);\r\n lines.push(` header: \"${camelToTitle(field)}\",`);\r\n lines.push(` },`);\r\n }\r\n\r\n // Actions column\r\n lines.push(` {`);\r\n lines.push(` id: \"actions\",`);\r\n lines.push(` header: \"Actions\",`);\r\n lines.push(` cell: ({ row }) => (`);\r\n lines.push(` <div className=\"flex gap-2\">`);\r\n lines.push(` <button onClick={() => row.original && void 0}>Edit</button>`);\r\n lines.push(` <button onClick={() => row.original && void 0}>Delete</button>`);\r\n lines.push(` </div>`);\r\n lines.push(` ),`);\r\n lines.push(` },`);\r\n\r\n lines.push(`];`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import type { GeneratorConfig, ModelConfig } from \"../types\";\r\n\r\n/**\r\n * Generates the content of a `[Model]Table.tsx` DataTable component file.\r\n */\r\nexport function generateTableFile(\r\n config: GeneratorConfig,\r\n modelConfig: ModelConfig\r\n): string {\r\n const { framework } = config;\r\n const { model, bulkDelete, canExport } = modelConfig;\r\n const { name } = model;\r\n\r\n // Derived names\r\n const Model = name; // e.g. \"User\"\r\n const models = `${Model}s`; // e.g. \"Users\"\r\n const varName = name.charAt(0).toLowerCase() + name.slice(1); // e.g. \"user\"\r\n\r\n // Hook names\r\n const useListHook = `use${models}`; // e.g. \"useUsers\"\r\n const useDeleteHook = `useDelete${Model}`; // e.g. \"useDeleteUser\"\r\n const useBulkDeleteHook = `useBulkDelete${models}`; // e.g. \"useBulkDeleteUsers\"\r\n\r\n // Column variable name\r\n const columnsVar = `${varName}Columns`; // e.g. \"userColumns\"\r\n\r\n const lines: string[] = [];\r\n\r\n // 'use client' directive for Next.js (must be first line)\r\n if (framework === \"nextjs\") {\r\n lines.push(`'use client'`);\r\n lines.push(``);\r\n }\r\n\r\n // Build hook import list\r\n const hookImports: string[] = [useListHook, useDeleteHook];\r\n if (bulkDelete) {\r\n hookImports.push(useBulkDeleteHook);\r\n }\r\n\r\n // Imports - use relative paths for all frameworks\r\n lines.push(`import { useState } from \"react\";`);\r\n lines.push(`import DataTable from \"../data-table\";`);\r\n lines.push(`import { ${columnsVar} } from \"./${Model}Columns\";`);\r\n lines.push(`import { ${hookImports.join(\", \")} } from \"../../hooks/use${Model}\";`);\r\n lines.push(`import { ${Model}Form } from \"./${Model}Form\";`);\r\n lines.push(`import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from \"../ui/dialog\";`);\r\n lines.push(``);\r\n\r\n // Component\r\n lines.push(`export function ${Model}Table() {`);\r\n lines.push(` const [isCreateOpen, setIsCreateOpen] = useState(false);`);\r\n lines.push(` const { data } = ${useListHook}();`);\r\n lines.push(` const ${varName}Delete = ${useDeleteHook}();`);\r\n\r\n if (bulkDelete) {\r\n lines.push(` const ${varName}BulkDelete = ${useBulkDeleteHook}();`);\r\n }\r\n\r\n lines.push(``);\r\n lines.push(` return (`);\r\n lines.push(` <>`);\r\n\r\n // Build DataTable props\r\n const dtProps: string[] = [\r\n ` title=\"${models}\"`,\r\n ` description=\"Manage ${models.toLowerCase()} in your system\"`,\r\n ` columns={${columnsVar}}`,\r\n ` data={data?.data ?? []}`,\r\n ` toggleAction={() => setIsCreateOpen(true)}`,\r\n ` actionText=\"Create ${Model}\"`,\r\n ` onRowDelete={(row: any) => ${varName}Delete.mutate(row.id)}`,\r\n ];\r\n\r\n if (bulkDelete) {\r\n dtProps.push(` onMultiDelete={(rows: any[]) => ${varName}BulkDelete.mutate(rows.map((r) => r.id))}`);\r\n }\r\n\r\n if (canExport) {\r\n dtProps.push(` canExport={true}`);\r\n }\r\n\r\n lines.push(` <DataTable`);\r\n for (const prop of dtProps) {\r\n lines.push(prop);\r\n }\r\n lines.push(` />`);\r\n lines.push(``);\r\n\r\n // Add Dialog for create form\r\n lines.push(` <Dialog open={isCreateOpen} onOpenChange={setIsCreateOpen}>`);\r\n lines.push(` <DialogContent className=\"max-w-3xl max-h-[90vh] overflow-y-auto\">`);\r\n lines.push(` <DialogHeader>`);\r\n lines.push(` <DialogTitle>Create New ${Model}</DialogTitle>`);\r\n lines.push(` <DialogDescription>`);\r\n lines.push(` Fill in the information below to create a new ${varName}.`);\r\n lines.push(` </DialogDescription>`);\r\n lines.push(` </DialogHeader>`);\r\n lines.push(` <${Model}Form onSuccess={() => setIsCreateOpen(false)} />`);\r\n lines.push(` </DialogContent>`);\r\n lines.push(` </Dialog>`);\r\n lines.push(` </>`);\r\n lines.push(` );`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import type { GeneratorConfig, ModelConfig } from \"../types\";\r\nimport { camelToTitle, fieldTypeMap, chunkFields } from \"./utils\";\r\n\r\n/**\r\n * Generates the content of a `[Model]Form.tsx` FormGenerator component file.\r\n */\r\nexport function generateFormFile(\r\n config: GeneratorConfig,\r\n modelConfig: ModelConfig\r\n): string {\r\n const { framework } = config;\r\n const { model, formFields, relationalFields, multiStep } = modelConfig;\r\n const { name, fields: allFields } = model;\r\n\r\n const lines: string[] = [];\r\n\r\n // 'use client' directive for Next.js (must be first line)\r\n if (framework === \"nextjs\") {\r\n lines.push(`'use client'`);\r\n lines.push(``);\r\n }\r\n\r\n // Collect relational field metadata: fieldName → relatedModelName\r\n const relationalFieldMeta: Array<{ fieldName: string; relatedModel: string }> = [];\r\n for (const relFieldName of relationalFields) {\r\n const fieldMeta = allFields.find((f) => f.name === relFieldName);\r\n if (fieldMeta) {\r\n relationalFieldMeta.push({\r\n fieldName: relFieldName,\r\n relatedModel: fieldMeta.type, // e.g. \"User\" for a userId relation\r\n });\r\n }\r\n }\r\n\r\n // Imports - use relative paths for all frameworks\r\n lines.push(`import { FormGenerator } from \"../form-generator\";`);\r\n lines.push(`import { ${name}CreateSchema } from \"../../schemas.generated\";`);\r\n lines.push(\r\n `import { useCreate${name}, useUpdate${name} } from \"../../hooks/use${name}\";`\r\n );\r\n\r\n // Import use[RelatedModel]s hooks for relational fields\r\n for (const { relatedModel } of relationalFieldMeta) {\r\n lines.push(\r\n `import { use${relatedModel}s } from \"../../hooks/use${relatedModel}\";`\r\n );\r\n }\r\n\r\n lines.push(``);\r\n\r\n // Component\r\n lines.push(`export function ${name}Form({ id, onSuccess }: { id?: string; onSuccess?: () => void }) {`);\r\n lines.push(` const create${name} = useCreate${name}();`);\r\n lines.push(` const update${name} = useUpdate${name}();`);\r\n\r\n // Fetch relational data for searchable-select options\r\n for (const { fieldName, relatedModel } of relationalFieldMeta) {\r\n const varName =\r\n fieldName.charAt(0).toLowerCase() + fieldName.slice(1) + \"Options\";\r\n lines.push(\r\n ` const { data: ${varName}Data } = use${relatedModel}s();`\r\n );\r\n }\r\n\r\n lines.push(``);\r\n\r\n // Build fields array\r\n lines.push(` const fields = [`);\r\n\r\n // Scalar form fields\r\n for (const fieldName of formFields) {\r\n const fieldMeta = allFields.find((f) => f.name === fieldName);\r\n const type = fieldMeta ? fieldTypeMap(fieldMeta) : \"text\";\r\n lines.push(` {`);\r\n lines.push(` name: \"${fieldName}\",`);\r\n lines.push(` label: \"${camelToTitle(fieldName)}\",`);\r\n lines.push(` type: \"${type}\",`);\r\n lines.push(` },`);\r\n }\r\n\r\n // Relational fields as searchable-select\r\n for (const { fieldName, relatedModel } of relationalFieldMeta) {\r\n const varName =\r\n fieldName.charAt(0).toLowerCase() + fieldName.slice(1) + \"Options\";\r\n lines.push(` {`);\r\n lines.push(` name: \"${fieldName}\",`);\r\n lines.push(` label: \"${camelToTitle(fieldName)}\",`);\r\n lines.push(` type: \"searchable-select\",`);\r\n lines.push(\r\n ` options: (${varName}Data?.data ?? []).map((r: any) => ({ label: String(r.name ?? r.id), value: String(r.id) })),`\r\n );\r\n lines.push(` },`);\r\n }\r\n\r\n lines.push(` ];`);\r\n lines.push(``);\r\n\r\n // Build FormGenerator JSX\r\n if (multiStep) {\r\n // Chunk all field names (scalar + relational) into steps\r\n const allFieldNames = [\r\n ...formFields,\r\n ...relationalFieldMeta.map((r) => r.fieldName),\r\n ];\r\n const chunks = chunkFields(allFieldNames, 4);\r\n\r\n lines.push(` const steps = [`);\r\n chunks.forEach((chunk, i) => {\r\n lines.push(` {`);\r\n lines.push(` title: \"Step ${i + 1}\",`);\r\n lines.push(\r\n ` fields: [${chunk.map((f) => `\"${f}\"`).join(\", \")}],`\r\n );\r\n lines.push(` },`);\r\n });\r\n lines.push(` ];`);\r\n lines.push(``);\r\n\r\n lines.push(` const handleSubmit = (data: any) => {`);\r\n lines.push(` const mutation = id ? update${name}.mutate({ id, data }) : create${name}.mutate(data);`);\r\n lines.push(` if (onSuccess) {`);\r\n lines.push(` // Call onSuccess after mutation completes`);\r\n lines.push(` Promise.resolve(mutation).then(() => onSuccess()).catch(() => {});`);\r\n lines.push(` }`);\r\n lines.push(` };`);\r\n lines.push(``);\r\n\r\n lines.push(` return (`);\r\n lines.push(` <FormGenerator`);\r\n lines.push(` fields={fields}`);\r\n lines.push(` schema={${name}CreateSchema}`);\r\n lines.push(` onSubmit={handleSubmit}`);\r\n lines.push(` steps={steps}`);\r\n lines.push(` />`);\r\n lines.push(` );`);\r\n } else {\r\n lines.push(` const handleSubmit = (data: any) => {`);\r\n lines.push(` const mutation = id ? update${name}.mutate({ id, data }) : create${name}.mutate(data);`);\r\n lines.push(` if (onSuccess) {`);\r\n lines.push(` // Call onSuccess after mutation completes`);\r\n lines.push(` Promise.resolve(mutation).then(() => onSuccess()).catch(() => {});`);\r\n lines.push(` }`);\r\n lines.push(` };`);\r\n lines.push(``);\r\n\r\n lines.push(` return (`);\r\n lines.push(` <FormGenerator`);\r\n lines.push(` fields={fields}`);\r\n lines.push(` schema={${name}CreateSchema}`);\r\n lines.push(` onSubmit={handleSubmit}`);\r\n lines.push(` />`);\r\n lines.push(` );`);\r\n }\r\n\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import type { GeneratorConfig, ModelConfig } from \"../types\";\r\n\r\n/**\r\n * Generates a Next.js App Router page.tsx file for a model.\r\n * \r\n * Example output:\r\n * ```tsx\r\n * 'use client'\r\n * \r\n * import { UserTable } from '@/components/user/UserTable'\r\n * \r\n * export default function UsersPage() {\r\n * return (\r\n * <div className=\"container mx-auto py-10\">\r\n * <h1 className=\"text-3xl font-bold mb-6\">Users</h1>\r\n * <UserTable />\r\n * </div>\r\n * )\r\n * }\r\n * ```\r\n */\r\nexport function generatePageFile(\r\n config: GeneratorConfig,\r\n modelConfig: ModelConfig\r\n): string {\r\n const { model } = modelConfig;\r\n const { name } = model;\r\n const modelLower = name.charAt(0).toLowerCase() + name.slice(1);\r\n const pluralName = name + \"s\"; // Simple pluralization\r\n\r\n const lines: string[] = [];\r\n\r\n // 'use client' directive (required for App Router with client components)\r\n lines.push(`'use client'`);\r\n lines.push(``);\r\n\r\n // Import the table component\r\n lines.push(`import { ${name}Table } from '@/components/${modelLower}/${name}Table'`);\r\n lines.push(``);\r\n\r\n // Page component\r\n lines.push(`export default function ${pluralName}Page() {`);\r\n lines.push(` return (`);\r\n lines.push(` <div className=\"container mx-auto py-10\">`);\r\n lines.push(` <h1 className=\"text-3xl font-bold mb-6\">${pluralName}</h1>`);\r\n lines.push(` <${name}Table />`);\r\n lines.push(` </div>`);\r\n lines.push(` )`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n\r\n/**\r\n * Generates a shared layout.tsx for the route group (optional).\r\n * This can be used to add common UI elements around all generated pages.\r\n */\r\nexport function generateRouteGroupLayout(): string {\r\n const lines: string[] = [];\r\n\r\n lines.push(`export default function AutoGeneratedLayout({`);\r\n lines.push(` children,`);\r\n lines.push(`}: {`);\r\n lines.push(` children: React.ReactNode`);\r\n lines.push(`}) {`);\r\n lines.push(` return <>{children}</>`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import type { GeneratorConfig } from \"../types\";\r\n\r\n/**\r\n * Generates menu-data.ts file with routes for all generated pages.\r\n * \r\n * Example output:\r\n * ```typescript\r\n * export interface MenuItem {\r\n * label: string;\r\n * href: string;\r\n * }\r\n * \r\n * export const omniRestMenuItems: MenuItem[] = [\r\n * { label: 'Users', href: '/users' },\r\n * { label: 'Products', href: '/products' },\r\n * ];\r\n * ```\r\n */\r\nexport function generateMenuData(config: GeneratorConfig): string {\r\n const { models } = config;\r\n\r\n const lines: string[] = [];\r\n\r\n // Header comment\r\n lines.push(`/**`);\r\n lines.push(` * Auto-generated menu data for omni-rest CRUD pages`);\r\n lines.push(` * Generated by omni-rest — do not edit manually.`);\r\n lines.push(` * Re-run after schema changes.`);\r\n lines.push(` */`);\r\n lines.push(``);\r\n\r\n // MenuItem interface\r\n lines.push(`export interface MenuItem {`);\r\n lines.push(` label: string;`);\r\n lines.push(` href: string;`);\r\n lines.push(` icon?: string;`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // Generate menu items array\r\n lines.push(`export const omniRestMenuItems: MenuItem[] = [`);\r\n \r\n for (const modelConfig of models) {\r\n const { name } = modelConfig.model;\r\n const pluralName = name + \"s\"; // Simple pluralization\r\n const route = `/${name.toLowerCase()}s`;\r\n \r\n lines.push(` {`);\r\n lines.push(` label: '${pluralName}',`);\r\n lines.push(` href: '${route}',`);\r\n lines.push(` },`);\r\n }\r\n \r\n lines.push(`];`);\r\n lines.push(``);\r\n\r\n // Helper function to get menu by label\r\n lines.push(`/**`);\r\n lines.push(` * Get a menu item by its label`);\r\n lines.push(` */`);\r\n lines.push(`export function getMenuItemByLabel(label: string): MenuItem | undefined {`);\r\n lines.push(` return omniRestMenuItems.find(item => item.label === label);`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // Helper function to get menu by href\r\n lines.push(`/**`);\r\n lines.push(` * Get a menu item by its href`);\r\n lines.push(` */`);\r\n lines.push(`export function getMenuItemByHref(href: string): MenuItem | undefined {`);\r\n lines.push(` return omniRestMenuItems.find(item => item.href === href);`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import type { GeneratorConfig } from \"../types\";\r\n\r\n/**\r\n * Generates the content of a `providers.tsx` file for React Query setup.\r\n * This is needed for Next.js App Router to wrap the app with QueryClientProvider.\r\n */\r\nexport function generateProvidersFile(config: GeneratorConfig): string {\r\n const { staleTime, gcTime } = config;\r\n\r\n const lines: string[] = [];\r\n\r\n lines.push(`'use client'`);\r\n lines.push(``);\r\n lines.push(`import { QueryClient, QueryClientProvider } from '@tanstack/react-query'`);\r\n lines.push(`import { useState } from 'react'`);\r\n lines.push(``);\r\n lines.push(`export function Providers({ children }: { children: React.ReactNode }) {`);\r\n lines.push(` const [queryClient] = useState(() => new QueryClient({`);\r\n lines.push(` defaultOptions: {`);\r\n lines.push(` queries: {`);\r\n lines.push(` staleTime: ${staleTime},`);\r\n lines.push(` gcTime: ${gcTime},`);\r\n lines.push(` },`);\r\n lines.push(` },`);\r\n lines.push(` }))`);\r\n lines.push(``);\r\n lines.push(` return (`);\r\n lines.push(` <QueryClientProvider client={queryClient}>`);\r\n lines.push(` {children}`);\r\n lines.push(` </QueryClientProvider>`);\r\n lines.push(` )`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport type { FileResult } from \"./types\";\r\n\r\n// ── ANSI colour helpers ───────────────────────────────────────────────────────\r\nconst GREEN = \"\\x1b[32m\";\r\nconst YELLOW = \"\\x1b[33m\";\r\nconst BLUE = \"\\x1b[34m\";\r\nconst RED = \"\\x1b[31m\";\r\nconst RESET = \"\\x1b[0m\";\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// writeFile\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Writes `content` to `destPath`, creating intermediate directories as needed.\r\n * Returns a `FileResult` with:\r\n * - `\"created\"` — file did not exist before\r\n * - `\"overwritten\"` — file already existed and was replaced\r\n * - `\"error\"` — write failed (error attached)\r\n */\r\nexport async function writeFile(destPath: string, content: string): Promise<FileResult> {\r\n let existed = false;\r\n try {\r\n existed = fs.existsSync(destPath);\r\n fs.mkdirSync(path.dirname(destPath), { recursive: true });\r\n fs.writeFileSync(destPath, content, \"utf8\");\r\n return { path: destPath, status: existed ? \"overwritten\" : \"created\" };\r\n } catch (err) {\r\n return { path: destPath, status: \"error\", error: err instanceof Error ? err : new Error(String(err)) };\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// copyBaseComponents\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst BASE_COMPONENTS: Array<{ src: string; dest: string }> = [\r\n { src: \"frontend-next/data-table.tsx\", dest: \"components/data-table.tsx\" },\r\n { src: \"frontend-next/form-generator.tsx\", dest: \"components/form-generator.tsx\" },\r\n];\r\n\r\n/**\r\n * Copies the shared DataTable and FormGenerator source files from `packageRoot`\r\n * into `{outputDir}/components/`.\r\n *\r\n * - If the destination already exists, returns `FileResult` with `\"skipped\"`.\r\n * - Creates intermediate directories as needed.\r\n * - Returns one `FileResult` per file.\r\n */\r\nexport async function copyBaseComponents(outputDir: string, packageRoot: string): Promise<FileResult[]> {\r\n const results: FileResult[] = [];\r\n\r\n for (const { src, dest } of BASE_COMPONENTS) {\r\n const srcPath = path.join(packageRoot, src);\r\n const destPath = path.join(outputDir, dest);\r\n\r\n if (fs.existsSync(destPath)) {\r\n results.push({ path: destPath, status: \"skipped\" });\r\n continue;\r\n }\r\n\r\n try {\r\n fs.mkdirSync(path.dirname(destPath), { recursive: true });\r\n fs.copyFileSync(srcPath, destPath);\r\n results.push({ path: destPath, status: \"created\" });\r\n } catch (err) {\r\n results.push({\r\n path: destPath,\r\n status: \"error\",\r\n error: err instanceof Error ? err : new Error(String(err)),\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// printSummary\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Prints a per-file status line for each `FileResult`, then a final count\r\n * summary line.\r\n *\r\n * Visual indicators:\r\n * created → green ✓\r\n * overwritten → yellow ⚠\r\n * skipped → blue ℹ\r\n * error → red ✗\r\n */\r\nexport function printSummary(results: FileResult[]): void {\r\n for (const r of results) {\r\n switch (r.status) {\r\n case \"created\":\r\n console.log(`${GREEN}✓${RESET} created ${r.path}`);\r\n break;\r\n case \"overwritten\":\r\n console.log(`${YELLOW}⚠${RESET} overwritten ${r.path}`);\r\n break;\r\n case \"skipped\":\r\n console.log(`${BLUE}ℹ${RESET} skipped ${r.path}`);\r\n break;\r\n case \"error\":\r\n console.log(`${RED}✗${RESET} error ${r.path}${r.error ? ` — ${r.error.message}` : \"\"}`);\r\n break;\r\n }\r\n }\r\n\r\n const created = results.filter(r => r.status === \"created\").length;\r\n const overwritten = results.filter(r => r.status === \"overwritten\").length;\r\n const skipped = results.filter(r => r.status === \"skipped\").length;\r\n const errors = results.filter(r => r.status === \"error\").length;\r\n\r\n console.log(\r\n `\\nGenerated ${created} files (${overwritten} overwritten, ${skipped} skipped, ${errors} errors)`\r\n );\r\n}\r\n","import * as path from \"path\";\r\nimport * as readline from \"readline\";\r\n\r\nimport { scanForFrontendDir } from \"./frontend/scan\";\r\nimport { findSchema, loadDMMF } from \"./frontend/schema\";\r\nimport { detectFramework, resolveBaseUrl, resolveOutputDir } from \"./frontend/detect\";\r\nimport { checkDependencies } from \"./frontend/deps\";\r\nimport { buildConfig, type BuildConfigFlags } from \"./frontend/prompt\";\r\nimport { generateHookFile } from \"./frontend/codegen/hook\";\r\nimport { generateColumnsFile } from \"./frontend/codegen/columns\";\r\nimport { generateTableFile } from \"./frontend/codegen/table\";\r\nimport { generateFormFile } from \"./frontend/codegen/form\";\r\nimport { generatePageFile } from \"./frontend/codegen/page\";\r\nimport { generateMenuData } from \"./frontend/codegen/menu\";\r\nimport { generateProvidersFile } from \"./frontend/codegen/providers\";\r\nimport { writeFile, copyBaseComponents, printSummary } from \"./frontend/output\";\r\nimport type { GeneratorConfig, ModelConfig, FileResult } from \"./frontend/types\";\r\nimport { detectProjectStructure } from \"./frontend/detect\";\r\n\r\n// ── ANSI colour helpers (mirrors src/cli.ts COLORS) ──────────────────────────\r\nconst COLORS = {\r\n green: (s: string) => `\\x1b[32m${s}\\x1b[0m`,\r\n yellow: (s: string) => `\\x1b[33m${s}\\x1b[0m`,\r\n cyan: (s: string) => `\\x1b[36m${s}\\x1b[0m`,\r\n red: (s: string) => `\\x1b[31m${s}\\x1b[0m`,\r\n bold: (s: string) => `\\x1b[1m${s}\\x1b[0m`,\r\n};\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// generateAll\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Orchestrates code generation for all models in `config`.\r\n *\r\n * For each ModelConfig it calls all four codegen functions, writes the\r\n * resulting files, then copies the shared base components and prints a\r\n * summary.\r\n *\r\n * For Next.js App Router, also generates page.tsx files and menu-data.ts\r\n *\r\n * Requirements: 7.2, 7.3, 7.4, 7.5, 7.6, 15.1, 15.2\r\n */\r\nexport async function generateAll(config: GeneratorConfig): Promise<FileResult[]> {\r\n const { outputDir, models, framework, frontendDir } = config;\r\n const generatePages = config.generatePages ?? (framework === \"nextjs\");\r\n const generateMenu = config.generateMenu ?? true;\r\n const routeGroup = config.routeGroup ?? \"autogenerated-omni\";\r\n \r\n // packageRoot is the omni-rest package root (one level up from dist/src)\r\n const packageRoot = path.resolve(__dirname, \"..\");\r\n\r\n const results: FileResult[] = [];\r\n\r\n // Detect project structure for Next.js page generation\r\n const structure = detectProjectStructure(frontendDir);\r\n\r\n for (const modelConfig of models) {\r\n const { name } = modelConfig.model;\r\n const modelLower = name.charAt(0).toLowerCase() + name.slice(1);\r\n\r\n // 1. Hook file → {outputDir}/hooks/use{Model}.ts\r\n const hookContent = generateHookFile(config, modelConfig);\r\n const hookPath = path.join(outputDir, \"hooks\", `use${name}.ts`);\r\n results.push(await writeFile(hookPath, hookContent));\r\n\r\n // 2. Columns file → {outputDir}/components/{model}/{Model}Columns.tsx\r\n const columnsContent = generateColumnsFile(config, modelConfig);\r\n const columnsPath = path.join(outputDir, \"components\", modelLower, `${name}Columns.tsx`);\r\n results.push(await writeFile(columnsPath, columnsContent));\r\n\r\n // 3. Table file → {outputDir}/components/{model}/{Model}Table.tsx\r\n const tableContent = generateTableFile(config, modelConfig);\r\n const tablePath = path.join(outputDir, \"components\", modelLower, `${name}Table.tsx`);\r\n results.push(await writeFile(tablePath, tableContent));\r\n\r\n // 4. Form file → {outputDir}/components/{model}/{Model}Form.tsx\r\n const formContent = generateFormFile(config, modelConfig);\r\n const formPath = path.join(outputDir, \"components\", modelLower, `${name}Form.tsx`);\r\n results.push(await writeFile(formPath, formContent));\r\n\r\n // 5. Next.js App Router page (if enabled and App Router detected)\r\n if (generatePages && framework === \"nextjs\" && structure.usesAppRouter && structure.appPath) {\r\n const pageContent = generatePageFile(config, modelConfig);\r\n const pluralLower = (name.toLowerCase() + \"s\");\r\n const pagePath = path.join(structure.appPath, `(${routeGroup})`, pluralLower, \"page.tsx\");\r\n results.push(await writeFile(pagePath, pageContent));\r\n }\r\n }\r\n\r\n // Copy shared base components\r\n const baseResults = await copyBaseComponents(outputDir, packageRoot);\r\n results.push(...baseResults);\r\n\r\n // Generate QueryClientProvider wrapper for Next.js App Router\r\n if (framework === \"nextjs\" && structure.usesAppRouter) {\r\n const providersContent = generateProvidersFile(config);\r\n const providersPath = path.join(outputDir, \"components\", \"providers.tsx\");\r\n results.push(await writeFile(providersPath, providersContent));\r\n }\r\n\r\n // Generate menu-data.ts (if enabled)\r\n if (generateMenu) {\r\n const menuContent = generateMenuData(config);\r\n const menuPath = path.join(outputDir, \"lib\", \"menu-data.ts\");\r\n results.push(await writeFile(menuPath, menuContent));\r\n }\r\n\r\n // Print summary\r\n printSummary(results);\r\n\r\n return results;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// run (top-level async entry point)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst HELP_TEXT = `\r\n Usage: npx omni-rest generate:frontend [options]\r\n\r\n Options:\r\n --schema <path> Path to schema.prisma (default: auto-discover)\r\n --frontend-dir <path> Frontend project root (default: auto-scan)\r\n --out <dir> Output directory relative to frontend-dir (default: src/)\r\n --models <names> Comma-separated model names to generate (default: all)\r\n --autopilot Skip all prompts, use defaults\r\n --no-bulk Disable bulk delete hooks and wiring\r\n --no-optimistic Disable optimistic update patterns\r\n --no-pages Disable Next.js page generation (default: enabled for Next.js)\r\n --no-menu Disable menu-data.ts generation (default: enabled)\r\n --route-group <name> Route group name for Next.js pages (default: autogenerated-omni)\r\n --stale-time <ms> useQuery staleTime (default: 30000)\r\n --gc-time <ms> useQuery gcTime (default: 300000)\r\n --steps <mode> Multi-step form mode: auto | always | never (default: auto)\r\n --help Print this help\r\n`;\r\n\r\n/** Prompts the user for a single line of input. */\r\nfunction prompt(question: string): Promise<string> {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n return new Promise((resolve) => {\r\n rl.question(question, (answer) => {\r\n rl.close();\r\n resolve(answer.trim());\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Top-level async entry point for `generate:frontend`.\r\n *\r\n * Parses flags from `argv`, runs the full pipeline, and calls `generateAll`.\r\n *\r\n * Requirements: 1.1, 2.4, 2.5, 18.1, 18.2, 18.8–18.16\r\n */\r\nexport async function run(argv: string[]): Promise<void> {\r\n // ── Parse flags ────────────────────────────────────────────────────────────\r\n let schemaPath: string | undefined;\r\n let frontendDirFlag: string | undefined;\r\n let outFlag: string | undefined;\r\n let modelsFlag: string | undefined;\r\n let autopilot = false;\r\n let noBulk = false;\r\n let noOptimistic = false;\r\n let generatePages = true;\r\n let generateMenu = true;\r\n let routeGroup = \"autogenerated-omni\";\r\n let staleTime = 30000;\r\n let gcTime = 300000;\r\n let stepsFlag: \"auto\" | \"always\" | \"never\" = \"auto\";\r\n\r\n for (let i = 0; i < argv.length; i++) {\r\n const arg = argv[i];\r\n switch (arg) {\r\n case \"--help\":\r\n console.log(HELP_TEXT);\r\n return;\r\n case \"--schema\":\r\n schemaPath = argv[++i];\r\n break;\r\n case \"--frontend-dir\":\r\n frontendDirFlag = argv[++i];\r\n break;\r\n case \"--out\":\r\n outFlag = argv[++i];\r\n break;\r\n case \"--models\":\r\n modelsFlag = argv[++i];\r\n break;\r\n case \"--autopilot\":\r\n autopilot = true;\r\n break;\r\n case \"--no-bulk\":\r\n noBulk = true;\r\n break;\r\n case \"--no-optimistic\":\r\n noOptimistic = true;\r\n break;\r\n case \"--no-pages\":\r\n generatePages = false;\r\n break;\r\n case \"--no-menu\":\r\n generateMenu = false;\r\n break;\r\n case \"--route-group\":\r\n routeGroup = argv[++i];\r\n break;\r\n case \"--stale-time\":\r\n staleTime = parseInt(argv[++i], 10) || 30000;\r\n break;\r\n case \"--gc-time\":\r\n gcTime = parseInt(argv[++i], 10) || 300000;\r\n break;\r\n case \"--steps\": {\r\n const val = argv[++i];\r\n if (val === \"always\" || val === \"never\" || val === \"auto\") {\r\n stepsFlag = val;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const cwd = process.cwd();\r\n\r\n console.log(COLORS.bold(\"\\n omni-rest · generate:frontend\\n\"));\r\n\r\n // ── Step 1: Resolve frontendDir ────────────────────────────────────────────\r\n let frontendDir: string;\r\n\r\n if (frontendDirFlag) {\r\n // Requirement 18.1 — use provided path directly\r\n const resolved = require(\"path\").resolve(cwd, frontendDirFlag);\r\n const fs = require(\"fs\") as typeof import(\"fs\");\r\n if (!fs.existsSync(resolved) || !fs.statSync(resolved).isDirectory()) {\r\n console.error(\r\n COLORS.red(\r\n ` ✗ --frontend-dir path does not exist or is not a directory: \"${resolved}\"`\r\n )\r\n );\r\n process.exit(1);\r\n }\r\n frontendDir = resolved;\r\n } else {\r\n // Requirement 18.3 — scan for candidates\r\n const candidates = await scanForFrontendDir(cwd);\r\n\r\n if (candidates.length === 0) {\r\n // Requirement 18.11 / 18.14\r\n console.error(\r\n COLORS.red(\r\n ` ✗ No frontend project found.\\n` +\r\n ` Scan criteria: next.config.*, vite.config.*, or package.json with react dependency.\\n` +\r\n ` Run from your frontend directory or use --frontend-dir <path>.`\r\n )\r\n );\r\n process.exit(1);\r\n }\r\n\r\n if (autopilot) {\r\n if (candidates.length > 1) {\r\n // Requirement 18.13\r\n console.error(COLORS.red(` ✗ Multiple frontend candidates found. Specify one with --frontend-dir:\\n`));\r\n candidates.forEach((c, i) => console.error(` ${i + 1}. ${c.dir} (score: ${c.score})`));\r\n process.exit(1);\r\n }\r\n // Requirement 18.12 — single candidate, use it\r\n frontendDir = candidates[0].dir;\r\n console.log(COLORS.cyan(` → Using frontend dir: ${frontendDir}`));\r\n } else if (candidates.length === 1) {\r\n // Requirement 18.8 / 18.9 — confirm with user\r\n const answer = await prompt(\r\n ` Frontend dir detected: ${COLORS.bold(candidates[0].dir)}\\n Use this directory? [Y/n]: `\r\n );\r\n if (answer.toLowerCase() === \"n\" || answer.toLowerCase() === \"no\") {\r\n console.log(\" Aborted.\");\r\n return;\r\n }\r\n frontendDir = candidates[0].dir;\r\n } else {\r\n // Requirement 18.10 — multiple candidates, let user pick\r\n console.log(\" Multiple frontend candidates found:\\n\");\r\n candidates.forEach((c, i) => {\r\n console.log(` ${i + 1}. ${c.dir} (score: ${c.score}, signals: ${c.signals.join(\", \")})`);\r\n });\r\n const answer = await prompt(`\\n Select a number [1]: `);\r\n const idx = (parseInt(answer, 10) || 1) - 1;\r\n if (idx < 0 || idx >= candidates.length) {\r\n console.error(COLORS.red(\" ✗ Invalid selection.\"));\r\n process.exit(1);\r\n }\r\n frontendDir = candidates[idx].dir;\r\n }\r\n }\r\n\r\n // ── Step 2: Find schema.prisma ─────────────────────────────────────────────\r\n let resolvedSchemaPath: string;\r\n try {\r\n resolvedSchemaPath = await findSchema(cwd, schemaPath);\r\n console.log(COLORS.cyan(` → Schema: ${resolvedSchemaPath}`));\r\n } catch (err: any) {\r\n console.error(COLORS.red(` ✗ ${err.message}`));\r\n process.exit(1);\r\n }\r\n\r\n // ── Step 3: Load DMMF ──────────────────────────────────────────────────────\r\n let allModels;\r\n try {\r\n allModels = await loadDMMF(frontendDir, resolvedSchemaPath);\r\n console.log(COLORS.cyan(` → Found ${allModels.length} model(s): ${allModels.map((m) => m.name).join(\", \")}`));\r\n } catch (err: any) {\r\n console.error(COLORS.red(` ✗ ${err.message}`));\r\n process.exit(1);\r\n }\r\n\r\n // ── Step 4: Detect framework ───────────────────────────────────────────────\r\n const framework = detectFramework(frontendDir);\r\n console.log(COLORS.cyan(` → Framework: ${framework}`));\r\n\r\n // ── Step 5: Resolve base URL ───────────────────────────────────────────────\r\n const baseUrl = resolveBaseUrl(frontendDir);\r\n console.log(COLORS.cyan(` → Base URL: ${baseUrl}`));\r\n\r\n // ── Step 6: Resolve output dir ─────────────────────────────────────────────\r\n const outputDir = resolveOutputDir(frontendDir, framework, outFlag);\r\n console.log(COLORS.cyan(` → Output dir: ${outputDir}`));\r\n\r\n // ── Step 7: Check dependencies ─────────────────────────────────────────────\r\n const missing = checkDependencies(frontendDir, framework);\r\n if (missing.length > 0) {\r\n console.warn(\r\n COLORS.yellow(\r\n ` ⚠ Missing dependencies: ${missing.join(\", \")}\\n` +\r\n ` Install with: npm install ${missing.join(\" \")}`\r\n )\r\n );\r\n }\r\n\r\n // ── Step 8: Build per-model config ─────────────────────────────────────────\r\n const modelsFilter = modelsFlag\r\n ? modelsFlag.split(\",\").map((s) => s.trim()).filter(Boolean)\r\n : undefined;\r\n\r\n // Warn about unknown model names in --models filter\r\n if (modelsFilter) {\r\n const knownNames = new Set(allModels.map((m) => m.name));\r\n for (const name of modelsFilter) {\r\n if (!knownNames.has(name)) {\r\n console.warn(COLORS.yellow(` ⚠ Unknown model name in --models filter: \"${name}\"`));\r\n }\r\n }\r\n }\r\n\r\n const flags: BuildConfigFlags = {\r\n autopilot,\r\n noBulk,\r\n steps: stepsFlag,\r\n modelsFilter,\r\n };\r\n\r\n const modelConfigs: ModelConfig[] = await buildConfig(allModels, flags);\r\n\r\n // ── Step 9: Build GeneratorConfig and run generateAll ─────────────────────\r\n const generatorConfig: GeneratorConfig = {\r\n frontendDir,\r\n schemaPath: resolvedSchemaPath,\r\n framework,\r\n baseUrl,\r\n outputDir,\r\n autopilot,\r\n models: modelConfigs,\r\n staleTime,\r\n gcTime,\r\n noOptimistic,\r\n steps: stepsFlag,\r\n generatePages,\r\n generateMenu,\r\n routeGroup,\r\n };\r\n\r\n await generateAll(generatorConfig);\r\n\r\n console.log(COLORS.bold(\"\\n Done!\\n\"));\r\n}\r\n","#!/usr/bin/env node\n/**\n * omni-rest CLI\n *\n * Usage:\n * npx omni-rest generate:zod → generates src/schemas.generated.ts\n * npx omni-rest generate:openapi → generates openapi.json\n * npx omni-rest generate → generates both\n */\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport { generateZodSchemas } from \"./zod-generator\";\nimport { generateOpenApiSpec } from \"./openapi\";\nimport { run as runFrontendGenerator } from \"./frontend-generator\";\n\nconst args = process.argv.slice(2);\nconst command = args[0] ?? \"generate\";\nconst remainingArgs = args.slice(1);\nconst cwd = process.cwd();\n\nconst COLORS = {\n green: (s: string) => `\\x1b[32m${s}\\x1b[0m`,\n yellow: (s: string) => `\\x1b[33m${s}\\x1b[0m`,\n cyan: (s: string) => `\\x1b[36m${s}\\x1b[0m`,\n red: (s: string) => `\\x1b[31m${s}\\x1b[0m`,\n bold: (s: string) => `\\x1b[1m${s}\\x1b[0m`,\n};\n\nfunction write(filePath: string, content: string) {\n const abs = path.resolve(cwd, filePath);\n fs.mkdirSync(path.dirname(abs), { recursive: true });\n fs.writeFileSync(abs, content, \"utf-8\");\n console.log(COLORS.green(` ✓ Written: ${filePath}`));\n}\n\n/**\n * Instantiates a PrismaClient from the user's project.\n * Handles both:\n * - Standard Prisma (client in node_modules/@prisma/client or node_modules/.prisma/client)\n * - Prisma 7+ with custom output path in schema.prisma generator block\n */\nfunction createPrismaClient(): any {\n // 1. Try to find a custom output path from schema.prisma\n const customClient = tryLoadFromSchemaOutput();\n if (customClient) return customClient;\n\n // 2. Try the standard .prisma/client path (Prisma 7 default output)\n const standardPrismaClient = tryLoadFromStandardOutput();\n if (standardPrismaClient) return standardPrismaClient;\n\n // 3. Fall back to resolving @prisma/client and extracting/instantiating (Prisma <7)\n try {\n const clientPath = require.resolve(\"@prisma/client\", { paths: [cwd] });\n\n // Try text-based extraction first (no require needed)\n const textResult = extractRuntimeDataModelFromFile(clientPath);\n if (textResult) return textResult;\n\n // Last resort: actually instantiate (requires DB connection)\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require(clientPath);\n const PrismaClient = mod.PrismaClient ?? mod.default?.PrismaClient;\n if (!PrismaClient) throw new Error(\"PrismaClient not found in @prisma/client\");\n return new PrismaClient();\n } catch {\n throw new Error(\n \"[omni-rest] Could not load @prisma/client from your project. \" +\n \"Run `npx prisma generate` first, then try again.\"\n );\n }\n}\n\n/**\n * Reads schema.prisma to find a custom `output` in the generator block,\n * then extracts runtimeDataModel from the generated file as plain text.\n * Returns a fake prisma-like object with _runtimeDataModel populated.\n */\nfunction tryLoadFromSchemaOutput(): any | null {\n const schemaPaths = [\n path.resolve(cwd, \"prisma/schema.prisma\"),\n path.resolve(cwd, \"schema.prisma\"),\n ];\n\n for (const schemaPath of schemaPaths) {\n if (!fs.existsSync(schemaPath)) continue;\n try {\n const schema = fs.readFileSync(schemaPath, \"utf-8\");\n const match = schema.match(/output\\s*=\\s*[\"']([^\"']+)[\"']/);\n if (!match) continue;\n\n const outputDir = path.resolve(path.dirname(schemaPath), match[1]);\n const indexPath = path.join(outputDir, \"index.js\");\n const result = extractRuntimeDataModelFromFile(indexPath);\n if (result) return result;\n } catch {\n continue;\n }\n }\n return null;\n}\n\n/**\n * Tries to extract runtimeDataModel by reading the generated Prisma client\n * source as plain text and regex-extracting the embedded JSON.\n * Works for Prisma 7+ default output (node_modules/.prisma/client/index.js)\n * and any custom output path. No require() needed — no DB connection needed.\n */\nfunction tryLoadFromStandardOutput(): any | null {\n const candidates = [\n path.resolve(cwd, \"node_modules/.prisma/client/index.js\"),\n path.resolve(cwd, \"node_modules/@prisma/client/index.js\"),\n ];\n\n for (const clientPath of candidates) {\n const result = extractRuntimeDataModelFromFile(clientPath);\n if (result) return result;\n }\n return null;\n}\n\n/**\n * Reads a generated Prisma client JS file as text and extracts\n * the runtimeDataModel JSON via regex — no require() needed.\n */\nfunction extractRuntimeDataModelFromFile(filePath: string): any | null {\n if (!fs.existsSync(filePath)) return null;\n try {\n const src = fs.readFileSync(filePath, \"utf-8\");\n\n // Prisma 7: config.runtimeDataModel = JSON.parse(\"...\")\n const match = src.match(/config\\.runtimeDataModel\\s*=\\s*JSON\\.parse\\(\"((?:[^\"\\\\]|\\\\.)*)\"\\)/);\n if (match) {\n const json = match[1].replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\");\n const runtimeDataModel = JSON.parse(json);\n if (runtimeDataModel?.models) {\n return { _runtimeDataModel: runtimeDataModel, $disconnect: async () => {} };\n }\n }\n\n // Older Prisma: runtimeDataModel = { models: { ... } } inline object\n const match2 = src.match(/runtimeDataModel\\s*=\\s*(\\{[\\s\\S]*?\"models\"\\s*:\\s*\\{[\\s\\S]*?\\}\\s*\\})/);\n if (match2) {\n try {\n const runtimeDataModel = JSON.parse(match2[1]);\n if (runtimeDataModel?.models) {\n return { _runtimeDataModel: runtimeDataModel, $disconnect: async () => {} };\n }\n } catch { /* not valid JSON, skip */ }\n }\n } catch {\n // ignore read errors\n }\n return null;\n}\n\nfunction getDummyUrl(provider: string): string {\n switch (provider) {\n case \"mysql\": return \"mysql://root:root@localhost:3306/dummy\";\n case \"sqlite\": return \"file:./dummy.db\";\n case \"sqlserver\": return \"sqlserver://localhost:1433;database=dummy;user=sa;password=dummy\";\n case \"mongodb\": return \"mongodb://localhost:27017/dummy\";\n case \"cockroachdb\": return \"postgresql://root@localhost:26257/dummy\";\n default: return \"postgresql://postgres:postgres@localhost:5432/dummy\";\n }\n}\n\nconst USAGE = `\n Usage:\n npx omni-rest generate Generate both Zod schemas and OpenAPI spec\n npx omni-rest generate:zod Generate Zod schemas only\n npx omni-rest generate:openapi Generate OpenAPI spec only\n npx omni-rest generate:frontend Scaffold frontend components from Prisma schema\n`;\n\nasync function run() {\n console.log(COLORS.bold(\"\\n omni-rest generator\\n\"));\n\n if (command === \"generate:frontend\") {\n try {\n await runFrontendGenerator(remainingArgs);\n } catch (e: any) {\n console.error(COLORS.red(` ✗ ${e.message}`));\n process.exit(1);\n }\n return;\n }\n\n if (![\"generate\", \"generate:zod\", \"generate:openapi\"].includes(command)) {\n console.log(USAGE);\n console.log(COLORS.bold(\"\\n Done!\\n\"));\n return;\n }\n\n let prisma: any;\n try {\n prisma = createPrismaClient();\n } catch (e: any) {\n console.error(COLORS.red(` ✗ ${e.message}`));\n console.log(COLORS.bold(\"\\n Done!\\n\"));\n return;\n }\n\n try {\n if (command === \"generate:zod\" || command === \"generate\") {\n try {\n console.log(COLORS.cyan(\" → Generating Zod schemas from Prisma DMMF...\"));\n const code = generateZodSchemas(prisma);\n write(\"src/schemas.generated.ts\", code);\n } catch (e: any) {\n console.error(COLORS.red(` ✗ Zod generation failed: ${e.message}`));\n }\n }\n\n if (command === \"generate:openapi\" || command === \"generate\") {\n try {\n console.log(COLORS.cyan(\" → Generating OpenAPI spec from Prisma DMMF...\"));\n const spec = generateOpenApiSpec(prisma, {\n title: getPackageName(),\n version: getPackageVersion(),\n });\n write(\"openapi.json\", JSON.stringify(spec, null, 2));\n } catch (e: any) {\n console.error(COLORS.red(` ✗ OpenAPI generation failed: ${e.message}`));\n }\n }\n } finally {\n // Always disconnect the Prisma client when done\n await prisma.$disconnect();\n }\n\n console.log(COLORS.bold(\"\\n Done!\\n\"));\n}\n\nfunction getPackageName(): string {\n try {\n const pkg = JSON.parse(\n fs.readFileSync(path.resolve(cwd, \"package.json\"), \"utf-8\")\n );\n return pkg.name ?? \"My API\";\n } catch {\n return \"My API\";\n }\n}\n\nfunction getPackageVersion(): string {\n try {\n const pkg = JSON.parse(\n fs.readFileSync(path.resolve(cwd, \"package.json\"), \"utf-8\")\n );\n return pkg.version ?? \"1.0.0\";\n } catch {\n return \"1.0.0\";\n }\n}\n\nrun().catch((e) => {\n console.error(e);\n process.exit(1);\n});"]}