@mdxui/do 2.1.1 → 4.0.0
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/README.md +115 -323
- package/dist/{agents-xcIn2dUB.d.ts → agents-2_r9e9i7.d.ts} +213 -2
- package/dist/app/index.d.ts +347 -0
- package/dist/app/index.js +14 -0
- package/dist/app/index.js.map +1 -0
- package/dist/breadcrumbs-C9Qn3S7d.d.ts +81 -0
- package/dist/capnweb-client-Bq78FtEA.d.ts +229 -0
- package/dist/chunk-3XKYQRXY.js +192 -0
- package/dist/chunk-3XKYQRXY.js.map +1 -0
- package/dist/chunk-4KXVN3EQ.js +56 -0
- package/dist/chunk-4KXVN3EQ.js.map +1 -0
- package/dist/chunk-5SHZZC7L.js +234 -0
- package/dist/chunk-5SHZZC7L.js.map +1 -0
- package/dist/chunk-7UFINK3Q.js +1994 -0
- package/dist/chunk-7UFINK3Q.js.map +1 -0
- package/dist/chunk-JJLAES6W.js +76 -0
- package/dist/chunk-JJLAES6W.js.map +1 -0
- package/dist/chunk-KT52UU3U.js +985 -0
- package/dist/chunk-KT52UU3U.js.map +1 -0
- package/dist/chunk-LJIWB7KE.js +95 -0
- package/dist/chunk-LJIWB7KE.js.map +1 -0
- package/dist/chunk-NA652ART.js +596 -0
- package/dist/chunk-NA652ART.js.map +1 -0
- package/dist/chunk-OVLO7UOH.js +1071 -0
- package/dist/chunk-OVLO7UOH.js.map +1 -0
- package/dist/chunk-VRLUXCLD.js +31 -0
- package/dist/chunk-VRLUXCLD.js.map +1 -0
- package/dist/chunk-WMNT4OIE.js +249 -0
- package/dist/chunk-WMNT4OIE.js.map +1 -0
- package/dist/chunk-Y52IEYVM.js +131 -0
- package/dist/chunk-Y52IEYVM.js.map +1 -0
- package/dist/components/index.d.ts +14 -732
- package/dist/components/index.js +3 -6
- package/dist/config-CxvpD8Y6.d.ts +111 -0
- package/dist/{do-CaQVueZw.d.ts → do-D27i5bU0.d.ts} +32 -33
- package/dist/errors-DratdVIz.d.ts +346 -0
- package/dist/hooks/index.d.ts +450 -691
- package/dist/hooks/index.js +6 -4
- package/dist/hooks/things/index.d.ts +298 -0
- package/dist/hooks/things/index.js +8 -0
- package/dist/hooks/things/index.js.map +1 -0
- package/dist/index.d.ts +62 -989
- package/dist/index.js +12 -839
- package/dist/index.js.map +1 -1
- package/dist/lib/index.d.ts +798 -0
- package/dist/lib/index.js +6 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/providers/index.d.ts +130 -34
- package/dist/providers/index.js +3 -2
- package/dist/query-keys-CZNFikIi.d.ts +153 -0
- package/dist/schemas/index.d.ts +5 -5
- package/dist/schemas/index.js +2 -2
- package/dist/schemas/index.js.map +1 -1
- package/dist/{thing-DtI25yZh.d.ts → thing-BF25aUtJ.d.ts} +72 -72
- package/dist/types/index.d.ts +693 -658
- package/dist/types/index.js +1 -2
- package/dist/views/index.d.ts +131 -0
- package/dist/views/index.js +11 -0
- package/dist/views/index.js.map +1 -0
- package/package.json +39 -17
- package/dist/__test-utils__/index.d.ts +0 -399
- package/dist/__test-utils__/index.js +0 -34641
- package/dist/__test-utils__/index.js.map +0 -1
- package/dist/chunk-EEDMN7UF.js +0 -1351
- package/dist/chunk-EEDMN7UF.js.map +0 -1
- package/dist/chunk-G3PMV62Z.js +0 -33
- package/dist/chunk-G3PMV62Z.js.map +0 -1
- package/dist/chunk-NXPXL5NA.js +0 -3789
- package/dist/chunk-NXPXL5NA.js.map +0 -1
- package/dist/chunk-PC5FJY6M.js +0 -20
- package/dist/chunk-PC5FJY6M.js.map +0 -1
- package/dist/chunk-XF6LKY2M.js +0 -445
- package/dist/chunk-XF6LKY2M.js.map +0 -1
- package/dist/magic-string.es-J7BYFTTJ.js +0 -1307
- package/dist/magic-string.es-J7BYFTTJ.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/admin/DoDataProvider.tsx","../src/admin/DoAuthProvider.tsx","../src/admin/discover-resources.ts","../src/admin/DoAdmin.tsx","../src/lib/sync/batch-sync.ts","../src/lib/sync/offline-queue.ts"],"names":["React","React2","jsx","AppAuthProvider"],"mappings":";;;;;;;;;;;;;;AA4CO,SAAS,oBAAA,CACd,WAAA,EACA,SAAA,EACA,SAAA,GAAoB,WACpB,MAAA,EACyB;AACzB,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,cAAA,EAAgB,kBAAA;AAAA,IAChB,GAAI,YAAY,EAAE,aAAA,EAAe,UAAU,SAAS,CAAA,CAAA,KAAO;AAAC,GAC9D;AAKA,EAAA,eAAe,OAAA,CAAW,MAAA,EAAgB,IAAA,GAAkB,EAAC,EAAe;AAC1E,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAAiB,MAAA,EAAQ;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,QACtB,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO;AAAA,UACL;AAAA,YACE,SAAA,EAAW,KAAA;AAAA,YACX,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,YACvB,MAAA;AAAA,YACA,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAS,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,GAAA,EAAI,CAAE;AAAA;AACzD;AACF,OACD,CAAA;AAAA,MACD,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,MAAA,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,WAAW,WAAW,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI,IAAA,CAAK,OAAA,GAAU,CAAC,CAAA,EAAG,SAAS,OAAA,EAAS;AACvC,MAAA,MAAM,IAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,CAAE,KAAA,EAAO,WAAW,WAAW,CAAA;AAAA,IAC/D;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA,GAAU,CAAC,CAAA,EAAG,KAAA;AAAA,EAC5B;AAMA,EAAA,SAAS,eAAe,QAAA,EAA0B;AAChD,IAAA,OAAO,QAAA,CAAS,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,EAC5D;AAKA,EAAA,SAAS,eAAA,CAAmB,MAA+B,UAAA,EAAiC;AAC1F,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,GAAA,IAAO;AAAA,KAC7B;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAAwC;AAAA;AAAA;AAAA;AAAA,IAI5C,OAAA,EAAS,OAAqB,QAAA,EAAkB,MAAA,KAA2B;AACzE,MAAA,MAAM,IAAA,GAAO,eAAe,QAAQ,CAAA;AACpC,MAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAM,MAAA,EAAO,GAAI,UAAU,EAAC;AAEhD,MAAA,IAAI,MAAA,EAAQ;AAEV,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAGlB,YAAA,EAAc,CAAC;AAAA,UAChB,QAAQ,EAAE,IAAA,EAAM,EAAA,EAAI,SAAA,EAAW,GAAG,MAAA,EAAO;AAAA,UACzC,IAAA,EAAM,IAAA,GAAO,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,WAAA,EAAY,EAAE,GAAI,MAAA;AAAA,UACtE,UAAA,EAAY,aAAa,EAAE,IAAA,EAAM,WAAW,IAAA,EAAM,OAAA,EAAS,UAAA,CAAW,OAAA,EAAQ,GAAI;AAAA,SACnF,CAAC,CAAA;AAEF,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,eAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,UACzD,OAAO,MAAA,CAAO;AAAA,SAChB;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,MAAM,SAAA,GAAY,IAAI,eAAA,EAAgB;AACtC,QAAA,SAAA,CAAU,GAAA,CAAI,QAAQ,IAAI,CAAA;AAC1B,QAAA,SAAA,CAAU,GAAA,CAAI,MAAM,SAAS,CAAA;AAC7B,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,SAAA,CAAU,GAAA,CAAI,MAAA,EAAQ,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAChD,UAAA,SAAA,CAAU,GAAA,CAAI,SAAA,EAAW,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AAAA,QACxD;AACA,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,SAAA,CAAU,GAAA,CAAI,WAAA,EAAa,IAAA,CAAK,KAAK,CAAA;AACrC,UAAA,SAAA,CAAU,GAAA,CAAI,WAAA,EAAa,IAAA,CAAK,KAAK,CAAA;AAAA,QACvC;AACA,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC/C,YAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,cAAA,SAAA,CAAU,IAAI,CAAA,OAAA,EAAU,GAAG,CAAA,CAAA,CAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,YAC/C;AAAA,UACF,CAAC,CAAA;AAAA,QACH;AAEA,QAAA,MAAM,WAAW,MAAM,gBAAA,CAAiB,GAAG,WAAW,CAAA,QAAA,EAAW,SAAS,CAAA,CAAA,EAAI;AAAA,UAC5E,OAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAED,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,EAAA,EAAK,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,QACnE;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AACnC,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,QAAQ,EAAC;AAC9C,QAAA,OAAO;AAAA,UACL,MAAM,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAkC,eAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,UAC3E,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,KAAA,CAAM;AAAA,SAC/B;AAAA,MACF;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,MAAA,EAAQ,OAAqB,QAAA,EAAkB,MAAA,KAAyB;AACtE,MAAA,MAAM,IAAA,GAAO,eAAe,QAAQ,CAAA;AACpC,MAAA,MAAM,EAAE,IAAG,GAAI,MAAA;AAEf,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAiC,WAAA,EAAa,CAAC;AAAA,UAClE,EAAA,EAAI,SAAA;AAAA,UACJ,IAAA;AAAA,UACA,EAAA,EAAI,OAAO,EAAE;AAAA,SACd,CAAC,CAAA;AAEF,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,eAAA,CAAmB,MAAA,EAAQ,EAAE;AAAA,SACrC;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,UACrB,CAAA,EAAG,WAAW,CAAA,QAAA,EAAW,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA,CAAA;AAAA,UACpH,EAAE,OAAA,EAAS,OAAA,EAAS,uBAAA;AAAwB,SAC9C;AAEA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,MAAM,CAAA,gBAAA,EAAmB,QAAQ,IAAI,EAAE,CAAA,EAAA,EAAK,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,QACzE;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AACnC,QAAA,OAAO,EAAE,IAAA,EAAM,eAAA,CAAmB,MAAA,EAAQ,EAAE,CAAA,EAAE;AAAA,MAChD;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,OAAA,EAAS,OAAqB,QAAA,EAAkB,MAAA,KAA0B;AACxE,MAAA,MAAM,IAAA,GAAO,eAAe,QAAQ,CAAA;AACpC,MAAA,MAAM,EAAE,KAAI,GAAI,MAAA;AAIhB,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,QAC5B,GAAA,CAAI,GAAA,CAAI,OAAO,EAAA,KAAO;AACpB,UAAA,IAAI;AACF,YAAA,IAAI,MAAA,EAAQ;AACV,cAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAiC,WAAA,EAAa,CAAC;AAAA,gBAClE,EAAA,EAAI,SAAA;AAAA,gBACJ,IAAA;AAAA,gBACA,EAAA,EAAI,OAAO,EAAE;AAAA,eACd,CAAC,CAAA;AACF,cAAA,OAAO,eAAA,CAAmB,QAAQ,EAAE,CAAA;AAAA,YACtC,CAAA,MAAO;AACL,cAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,gBACrB,CAAA,EAAG,WAAW,CAAA,QAAA,EAAW,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA,CAAA;AAAA,gBACpH,EAAE,OAAA,EAAS,OAAA,EAAS,uBAAA;AAAwB,eAC9C;AACA,cAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,IAAA;AACzB,cAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AACnC,cAAA,OAAO,eAAA,CAAmB,QAAQ,EAAE,CAAA;AAAA,YACtC;AAAA,UACF,CAAA,CAAA,MAAQ;AACN,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF,CAAC;AAAA,OACH;AAEA,MAAA,OAAO;AAAA,QACL,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,IAAA,KAA2C,SAAS,IAAI;AAAA,OAChF;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,MAAA,EAAQ,OAAqB,QAAA,EAAkB,MAAA,KAA4B;AACzE,MAAA,MAAM,IAAA,GAAO,eAAe,QAAQ,CAAA;AACpC,MAAA,MAAM,EAAE,MAAK,GAAI,MAAA;AAEjB,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAiC,cAAA,EAAgB,CAAC;AAAA,UACrE,EAAA,EAAI,SAAA;AAAA,UACJ,IAAA;AAAA,UACA,IAAA,EAAO,KAAiC,IAAA,IAAQ,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,UACrE;AAAA,SACD,CAAC,CAAA;AAEF,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,gBAAmB,MAAM;AAAA,SACjC;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAAiB,CAAA,EAAG,WAAW,CAAA,OAAA,CAAA,EAAW;AAAA,UAC/D,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA;AAAA,UACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,EAAA,EAAI,SAAA;AAAA,YACJ,IAAA;AAAA,YACA,IAAA,EAAO,KAAiC,IAAA,IAAQ,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,YACrE;AAAA,WACD,CAAA;AAAA,UACD,OAAA,EAAS;AAAA,SACV,CAAA;AAED,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,QAAQ,CAAA,EAAA,EAAK,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,QACpE;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AACnC,QAAA,OAAO,EAAE,IAAA,EAAM,eAAA,CAAmB,MAAM,CAAA,EAAE;AAAA,MAC5C;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,MAAA,EAAQ,OAAqB,QAAA,EAAkB,MAAA,KAA4B;AACzE,MAAA,MAAM,IAAA,GAAO,eAAe,QAAQ,CAAA;AACpC,MAAA,MAAM,EAAE,EAAA,EAAI,IAAA,EAAK,GAAI,MAAA;AAErB,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAiC,cAAA,EAAgB,CAAC;AAAA,UACrE,EAAA,EAAI,SAAA;AAAA,UACJ,IAAA;AAAA,UACA,EAAA,EAAI,OAAO,EAAE,CAAA;AAAA,UACb;AAAA,SACD,CAAC,CAAA;AAEF,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,eAAA,CAAmB,MAAA,EAAQ,EAAE;AAAA,SACrC;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,UACrB,CAAA,EAAG,WAAW,CAAA,QAAA,EAAW,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA,CAAA;AAAA,UACpH;AAAA,YACE,MAAA,EAAQ,OAAA;AAAA,YACR,OAAA;AAAA,YACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,MAAM,CAAA;AAAA,YAC7B,OAAA,EAAS;AAAA;AACX,SACF;AAEA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,MAAM,CAAA,iBAAA,EAAoB,QAAQ,IAAI,EAAE,CAAA,EAAA,EAAK,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,QAC1E;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AACnC,QAAA,OAAO,EAAE,IAAA,EAAM,eAAA,CAAmB,MAAA,EAAQ,EAAE,CAAA,EAAE;AAAA,MAChD;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,MAAA,EAAQ,OAAqB,QAAA,EAAkB,MAAA,KAAyB;AACtE,MAAA,MAAM,IAAA,GAAO,eAAe,QAAQ,CAAA;AACpC,MAAA,MAAM,EAAE,IAAG,GAAI,MAAA;AAEf,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,OAAA,CAAc,gBAAgB,CAAC;AAAA,UACnC,EAAA,EAAI,SAAA;AAAA,UACJ,IAAA;AAAA,UACA,EAAA,EAAI,OAAO,EAAE,CAAA;AAAA,UACb,IAAA,EAAM;AAAA,SACP,CAAC,CAAA;AAEF,QAAA,OAAO,EAAE,IAAA,EAAM,EAAE,EAAA,EAAG,EAAO;AAAA,MAC7B,CAAA,MAAO;AACL,QAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,UACrB,CAAA,EAAG,WAAW,CAAA,QAAA,EAAW,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA,CAAA;AAAA,UACpH;AAAA,YACE,MAAA,EAAQ,QAAA;AAAA,YACR,OAAA;AAAA,YACA,OAAA,EAAS;AAAA;AACX,SACF;AAEA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,MAAM,CAAA,iBAAA,EAAoB,QAAQ,IAAI,EAAE,CAAA,EAAA,EAAK,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,QAC1E;AAEA,QAAA,OAAO,EAAE,IAAA,EAAM,EAAE,EAAA,EAAG,EAAO;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,YAAA,EAAc,OAAO,QAAA,KAAqB;AACxC,MAAA,MAAM,IAAA,GAAO,eAAe,QAAQ,CAAA;AAEpC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAIlB,aAAA,EAAe,CAAC,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA;AAC3C,QAAA,OAAO,MAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,UACrB,CAAA,EAAG,WAAW,CAAA,QAAA,EAAW,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,MAAA,CAAA;AAAA,UAClF,EAAE,OAAA,EAAS,OAAA,EAAS,uBAAA;AAAwB,SAC9C;AAEA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,QAAQ,CAAA,EAAA,EAAK,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,QAC3E;AAEA,QAAA,OAAO,SAAS,IAAA,EAAK;AAAA,MACvB;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,WAAA,EAAa,OAAO,QAAA,EAAkB,EAAA,KAAe;AACnD,MAAA,MAAM,IAAA,GAAO,eAAe,QAAQ,CAAA;AAEpC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAmB,gBAAA,EAAkB,CAAC;AAAA,UACzD,EAAA,EAAI,SAAA;AAAA,UACJ,IAAA;AAAA,UACA;AAAA,SACD,CAAC,CAAA;AACF,QAAA,OAAO,MAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,UACrB,CAAA,EAAG,WAAW,CAAA,QAAA,EAAW,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,EAAE,CAAC,CAAA,SAAA,CAAA;AAAA,UAC5G,EAAE,OAAA,EAAS,OAAA,EAAS,uBAAA;AAAwB,SAC9C;AAEA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,MAAM,CAAA,2BAAA,EAA8B,QAAQ,IAAI,EAAE,CAAA,EAAA,EAAK,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,QACpF;AAEA,QAAA,OAAO,SAAS,IAAA,EAAK;AAAA,MACvB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,OAAO,YAAA;AACT;AA4BO,SAAS,sBAAA,CAAuB;AAAA,EACrC,QAAA;AAAA,EACA,YAAA,EAAc;AAChB,CAAA,EAAgC;AAC9B,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,MAAA,KAAW,KAAA,EAAM;AAG5C,EAAA,MAAM,YAAA,GAAqBA,eAAQ,MAAM;AACvC,IAAA,IAAI,sBAAsB,OAAO,oBAAA;AAEjC,IAAA,OAAO,oBAAA;AAAA,MACL,MAAA,CAAO,WAAA;AAAA,MACP,MAAA,CAAO,SAAA;AAAA,MACP,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG,CAAC,oBAAA,EAAsB,MAAA,CAAO,aAAa,MAAA,CAAO,SAAA,EAAW,SAAA,EAAW,MAAM,CAAC,CAAA;AAElF,EAAA,uBACE,GAAA,CAAC,oBAAA,EAAA,EAAqB,YAAA,EACnB,QAAA,EACH,CAAA;AAEJ;AC3bO,SAAS,oBAAA,CACd,WAAA,EACA,UAAA,EACA,SAAA,EACA,YAAoB,SAAA,EACA;AAEpB,EAAA,IAAI,YAAA,GAAe,SAAA;AAEnB,EAAA,MAAM,aAAa,OAAO;AAAA,IACxB,cAAA,EAAgB,kBAAA;AAAA,IAChB,GAAI,eAAe,EAAE,aAAA,EAAe,UAAU,YAAY,CAAA,CAAA,KAAO;AAAC,GACpE,CAAA;AAEA,EAAA,MAAM,YAAA,GAAmC;AAAA;AAAA;AAAA;AAAA,IAIvC,KAAA,EAAO,OAAO,MAAA,KAA0B;AACtC,MAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,UAAS,GAAI,MAAA;AAE7D,MAAA,IAAI,QAAA,GAAW,GAAG,WAAW,CAAA,WAAA,CAAA;AAC7B,MAAA,IAAI,OAAgC,EAAC;AAErC,MAAA,QAAQ,UAAA;AAAY,QAClB,KAAK,KAAA;AACH,UAAA,IAAA,GAAO,EAAE,UAAU,QAAA,EAAS;AAC5B,UAAA;AAAA,QACF,KAAK,SAAA;AAEH,UAAA,QAAA,GAAW,GAAG,WAAW,CAAA,aAAA,CAAA;AACzB,UAAA,IAAA,GAAO,EAAE,MAAA,EAAO;AAChB,UAAA;AAAA,QACF,KAAK,OAAA;AAEH,UAAA,QAAA,GAAW,CAAA,EAAG,WAAW,CAAA,YAAA,EAAe,QAAA,IAAY,QAAQ,CAAA,CAAA;AAC5D,UAAA,IAAA,GAAO,EAAE,OAAO,UAAA,EAAW;AAC3B,UAAA;AAAA;AAGJ,MAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAAiB,QAAA,EAAU;AAAA,QAChD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,QACzB,OAAA,EAAS;AAAA,OACV,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,MAAM,OAAO,EAAE,OAAA,EAAS,cAAA,EAAe,CAAE,CAAA;AAC7E,QAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,OAAA,IAAW,cAAc,CAAA;AAAA,MACjD;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AACnC,MAAA,YAAA,GAAe,MAAA,CAAO,SAAS,MAAA,CAAO,WAAA;AAGtC,MAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,YAAA,EAAc;AACjD,QAAA,YAAA,CAAa,OAAA,CAAQ,iBAAiB,YAAY,CAAA;AAAA,MACpD;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,QAAQ,YAAY;AAClB,MAAA,IAAI;AAEF,QAAA,MAAM,gBAAA,CAAiB,CAAA,EAAG,WAAW,CAAA,YAAA,CAAA,EAAgB;AAAA,UACnD,MAAA,EAAQ,MAAA;AAAA,UACR,SAAS,UAAA,EAAW;AAAA,UACpB,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AAAA,MAER;AAEA,MAAA,YAAA,GAAe,MAAA;AAGf,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,YAAA,CAAa,WAAW,eAAe,CAAA;AAAA,MACzC;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,WAAW,YAAY;AAErB,MAAA,IAAI,CAAC,YAAA,IAAgB,OAAO,MAAA,KAAW,WAAA,EAAa;AAClD,QAAA,YAAA,GAAe,YAAA,CAAa,OAAA,CAAQ,eAAe,CAAA,IAAK,MAAA;AAAA,MAC1D;AAEA,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,MACrC;AAGA,MAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAAiB,CAAA,EAAG,WAAW,CAAA,QAAA,CAAA,EAAY;AAAA,QAChE,MAAA,EAAQ,KAAA;AAAA,QACR,SAAS,UAAA,EAAW;AAAA,QACpB,OAAA,EAAS;AAAA,OACV,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAEhB,QAAA,YAAA,GAAe,MAAA;AACf,QAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,UAAA,YAAA,CAAa,WAAW,eAAe,CAAA;AAAA,QACzC;AACA,QAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAAA,MACnC;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,UAAA,EAAY,OAAO,KAAA,KAAiB;AAClC,MAAA,MAAM,SAAU,KAAA,CAAsC,MAAA;AAEtD,MAAA,IAAI,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA,EAAK;AACpC,QAAA,YAAA,GAAe,MAAA;AACf,QAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,UAAA,YAAA,CAAa,WAAW,eAAe,CAAA;AAAA,QACzC;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,aAAa,YAAqC;AAChD,MAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAAiB,CAAA,EAAG,WAAW,CAAA,QAAA,CAAA,EAAY;AAAA,QAChE,MAAA,EAAQ,KAAA;AAAA,QACR,SAAS,UAAA,EAAW;AAAA,QACpB,OAAA,EAAS;AAAA,OACV,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,MAC/C;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,OAAO,IAAA,CAAK,GAAA;AAAA,QAChC,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAQ,IAAA,CAAK,WAAA;AAAA,QAC7C,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAA,EAAQ,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,WAAW,IAAA,CAAK,SAAA;AAAA,QAC5C,SAAA,EAAW,KAAK,SAAA,IAAa,SAAA;AAAA,QAC7B,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAA,EAAQ,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK;AAAA,OAC9B;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,gBAAgB,YAA+B;AAC7C,MAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAAiB,CAAA,EAAG,WAAW,CAAA,iBAAA,CAAA,EAAqB;AAAA,QACzE,MAAA,EAAQ,KAAA;AAAA,QACR,SAAS,UAAA,EAAW;AAAA,QACpB,OAAA,EAAS;AAAA,OACV,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAEhB,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AACnC,MAAA,OAAO,MAAA,CAAO,WAAA,IAAe,MAAA,IAAU,EAAC;AAAA,IAC1C;AAAA,GACF;AAEA,EAAA,OAAO,YAAA;AACT;AA4BO,SAAS,sBAAA,CAAuB;AAAA,EACrC,QAAA;AAAA,EACA,YAAA,EAAc;AAChB,CAAA,EAAgC;AAC9B,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI,KAAA,EAAM;AAGpC,EAAA,MAAM,YAAA,GAAqBC,eAAQ,MAAM;AACvC,IAAA,IAAI,sBAAsB,OAAO,oBAAA;AAEjC,IAAA,OAAO,oBAAA;AAAA,MACL,MAAA,CAAO,WAAA;AAAA,MACP,MAAA,CAAO,UAAA;AAAA,MACP,MAAA,CAAO,SAAA;AAAA,MACP;AAAA,KACF;AAAA,EACF,CAAA,EAAG,CAAC,oBAAA,EAAsB,MAAA,CAAO,WAAA,EAAa,OAAO,UAAA,EAAY,MAAA,CAAO,SAAA,EAAW,SAAS,CAAC,CAAA;AAG7F,EAAA,MAAM,eAAA,GAA+CA,eAAQ,OAAO;AAAA,IAClE,OAAO,YAAA,CAAa,KAAA;AAAA,IACpB,QAAQ,YAAA,CAAa,MAAA;AAAA,IACrB,WAAW,YAAA,CAAa,SAAA;AAAA,IACxB,YAAY,YAAA,CAAa,UAAA;AAAA,IACzB,aAAa,YAAY;AACvB,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,WAAA,EAAY;AAChD,MAAA,OAAO;AAAA,QACL,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,QAAQ,QAAA,CAAS;AAAA,OACnB;AAAA,IACF,CAAA;AAAA,IACA,gBAAgB,YAAA,CAAa;AAAA,GAC/B,CAAA,EAAI,CAAC,YAAY,CAAC,CAAA;AAElB,EAAA,uBACEC,GAAAA,CAACC,YAAA,EAAA,EAAgB,YAAA,EAAc,iBAC5B,QAAA,EACH,CAAA;AAEJ;;;ACnQO,IAAM,sBAAA,GAAyB,CAAC,OAAA,EAAS,OAAA,EAAS,UAAU;AAMnE,IAAM,mBAAA,GAA8C;AAAA,EAClD,qBAAA,EAAuB,OAAA;AAAA,EACvB,YAAA,EAAc,UAAA;AAAA,EACd,iBAAA,EAAmB,SAAA;AAAA,EACnB,cAAA,EAAgB,gBAAA;AAAA,EAChB,mBAAA,EAAqB,cAAA;AAAA,EACrB,cAAA,EAAgB;AAClB,CAAA;AAQA,SAAS,kBAAkB,OAAA,EAA0C;AAEnE,EAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,OAAA,CAAQ,SAAS,KAAK,OAAA,CAAQ,IAAA;AAIvE,EAAA,MAAM,KAAA,GAAQ,YAAA,CACX,OAAA,CAAQ,UAAA,EAAY,KAAK,CAAA,CACzB,IAAA,EAAK,CACL,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA;AAEvC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,OAAO,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA,GAAQ,GAAG,KAAK,CAAA,CAAA,CAAA;AAAA;AAAA,IAC7C,aAAA,EAAe;AAAA,GACjB;AACF;AAQA,SAAS,sBAAsB,YAAA,EAA4C;AAEzE,EAAA,MAAM,KAAA,GAAQ,YAAA,CACX,OAAA,CAAQ,UAAA,EAAY,KAAK,CAAA,CACzB,IAAA,EAAK,CACL,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA;AAEvC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,OAAO,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA,GAAQ,GAAG,KAAK,CAAA,CAAA,CAAA;AAAA;AAAA,IAC7C,aAAA,EAAe;AAAA,GACjB;AACF;AAwCO,SAAS,kBAAkB,MAAA,EAA+C;AAE/E,EAAA,IAAI,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,SAAA,CAAU,SAAS,CAAA,EAAG;AACnD,IAAA,OAAO,MAAA,CAAO,SAAA;AAAA,EAChB;AAGA,EAAA,IAAI,OAAO,qBAAA,IAAyB,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,EAAG;AAEvE,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,YAAoC,EAAC;AAE3C,IAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,QAAA,CAAS,QAAA,EAAU;AAC9C,MAAA,MAAM,QAAA,GAAW,kBAAkB,OAAO,CAAA;AAC1C,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AAC5B,QAAA,IAAA,CAAK,GAAA,CAAI,SAAS,IAAI,CAAA;AACtB,QAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,MACzB;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAGA,EAAA,OAAO,sBAAA,CAAuB,IAAI,qBAAqB,CAAA;AACzD;AAYO,SAAS,sBAAA,CACd,YACA,SAAA,EACwB;AACxB,EAAA,MAAM,cAAc,IAAI,GAAA;AAAA,IACtB,SAAA,CACG,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA,CACpB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAO,CAAC,CAAC;AAAA,GAC5B;AAEA,EAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,QAAA,KAAa;AAClC,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA;AAC9C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO,EAAE,GAAG,QAAA,EAAU,GAAG,QAAA,EAAS;AAAA,IACpC;AACA,IAAA,OAAO,QAAA;AAAA,EACT,CAAC,CAAA;AACH;AC1GA,IAAM,cAAA,GAAuB,qBAA0C,IAAI,CAAA;AAM3E,SAAS,gBAAA,GAA+C;AACtD,EAAA,OAAa,kBAAW,cAAc,CAAA;AACxC;AAMA,IAAM,aAAA,GAA4C;AAAA,EAChD,SAAA,EAAW,IAAA;AAAA,EACX,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,KAAA;AAAA,EACN,KAAA,EAAO,GAAA;AAAA,EACP,YAAA,EAAc,SAAA;AAAA,EACd,QAAA,EAAU,QAAA;AAAA,EACV,KAAA,EAAO,GAAA;AAAA,EACP,KAAA,EAAO,GAAA;AAAA,EACP,QAAA,EAAU,QAAA;AAAA,EACV,QAAA,EAAU;AACZ,CAAA;AAEA,SAAS,mBAAmB,IAAA,EAA0B;AACpD,EAAA,MAAM,aAAA,GAAgB,KAAK,WAAA,EAAY;AACvC,EAAA,OAAO,aAAA,CAAc,aAAa,CAAA,IAAK,GAAA;AACzC;AAMA,SAAS,eAAA,CACP,SAAA,EACA,QAAA,GAAmB,EAAA,EACP;AACZ,EAAA,MAAM,SAAA,GAAY,SAAA,CACf,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,KAAkB,KAAK,CAAA,CACvC,GAAA,CAAI,CAAC,QAAA,KAAa;AACjB,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,IAAQ,kBAAA,CAAmB,SAAS,IAAI,CAAA;AAC9D,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,QAAA,CAAS,KAAA,IAAS,QAAA,CAAS,IAAA;AAAA,MAClC,KAAK,CAAA,EAAG,QAAQ,IAAI,QAAA,CAAS,IAAA,CAAK,aAAa,CAAA,CAAA;AAAA,MAC/C,IAAA,EAAM;AAAA,KACR;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAO;AAAA,IACL;AAAA,MACE,KAAA,EAAO,WAAA;AAAA,MACP,KAAA,EAAO;AAAA;AACT,GACF;AACF;AAUA,SAAS,YAAA,CAAa,EAAE,MAAA,EAAO,EAAsB;AACnD,EAAA,MAAM;AAAA,IACJ,KAAA,GAAQ,OAAA;AAAA,IACR,IAAA;AAAA,IACA,KAAA,GAAQ,QAAA;AAAA,IACR,QAAA,GAAW,EAAA;AAAA,IACX,SAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA,EAAQ,YAAA;AAAA,IACR,aAAA;AAAA,IACA,aAAA,GAAgB;AAAA,GAClB,GAAI,MAAA;AAEJ,EAAA,MAAM,EAAE,eAAA,EAAiB,QAAA,EAAU,WAAW,aAAA,EAAe,MAAA,KAAW,OAAA,EAAQ;AAChF,EAAA,MAAM,EAAE,WAAA,EAAa,eAAA,EAAiB,SAAA,KAAc,KAAA,EAAM;AAG1D,EAAA,MAAM,SAAA,GAAkB,eAAQ,MAAM,iBAAA,CAAkB,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGzE,EAAA,MAAM,UAAA,GAAmB,MAAA,CAAA,OAAA;AAAA,IACvB,MAAM,eAAA,CAAgB,SAAA,EAAW,QAAQ,CAAA;AAAA,IACzC,CAAC,WAAW,QAAQ;AAAA,GACtB;AAGA,EAAA,MAAM,iBAAA,GAA0B,MAAA,CAAA,OAAA;AAAA,IAC9B,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAU,CAAA;AAAA,IAC3B,CAAC,QAAQ,SAAS;AAAA,GACpB;AAGA,EAAA,MAAM,IAAA,GAAa,MAAA,CAAA,OAAA;AAAA,IACjB,MACE,QAAA,GACI;AAAA,MACE,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,QAAQ,QAAA,CAAS;AAAA,KACnB,GACA,MAAA;AAAA,IACN,CAAC,QAAQ;AAAA,GACX;AAGA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,uBACED,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gFAAA,EAAiF,CAAA;AAAA,sBAChGA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yBAAwB,QAAA,EAAA,YAAA,EAAU;AAAA,KAAA,EACjD,CAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8CAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,SAAI,SAAA,EAAU,oCAAA,EACb,0BAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,0BAAA,EAA2B,CAAA,EACjD,CAAA;AAAA,sBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,sBACtDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kCAAiC,QAAA,EAAA,kFAAA,EAE9C,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0BAAA,EAA4B,0BAAgB,OAAA,EAAQ;AAAA,KAAA,EACnE,CAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,MAAM,cAAA,GAAiB,gBAAgB,kBAAA,GAAqB,KAAA;AAG5D,EAAA,MAAM,+BACJA,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA,EAAU,QAAA;AAAA,MACV,SAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA,EAAU,YAAA;AAAA,MACV,aAAA;AAAA,MAEC,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,qBACdA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,MAAM,QAAA,CAAS;AAAA,SAAA;AAAA,QANV,QAAA,CAAS;AAAA,OAQjB;AAAA;AAAA,GACH;AAIF,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,uBACEA,GAAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EAAwB,KAAA,EAAO,iBAAA,EAC9B,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAc,QAAA,EAAA,YAAA,EAAa,CAAA,EAC9B,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACEA,GAAAA,CAAC,cAAA,CAAe,UAAf,EAAwB,KAAA,EAAO,mBAC9B,QAAA,kBAAAA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,KAAA;AAAA,QACN,QAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,UAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA,EAAW,aAAA;AAAA,MACX,MAAA,kBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QACtC,cAAc,SAAA,oBACbA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iEACb,QAAA,EAAA,SAAA,EACH;AAAA,OAAA,EAEJ,CAAA;AAAA,MAEF,GAAA,kBAAKA,GAAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,WAAW,CAAC,CAAA,EAAG,KAAA,IAAS,EAAC,EAAG,CAAA;AAAA,MACjD,QACE,aAAA,KACE,IAAA,oBACEA,GAAAA,CAAC,WAAQ,IAAA,EAAY,CAAA,CAAA;AAAA,MAI3B,UAAA,kBAAYA,GAAAA,CAAC,cAAA,EAAA,EAAe,CAAA;AAAA,MAE3B,QAAA,EAAA;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAgEO,SAAS,OAAA,CAAQ,EAAE,MAAA,EAAQ,QAAA,EAAS,EAAiB;AAC1D,EAAA,MAAM,EAAE,UAAS,GAAI,MAAA;AAErB,EAAA,uBACEA,IAAC,UAAA,EAAA,EAAW,MAAA,EAAQ,UAClB,QAAA,kBAAAA,GAAAA,CAAC,sBAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,sBAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAA,GAAAA,CAAC,gBAAa,MAAA,EAAgB,CAAA;AAAA,IAC7B;AAAA,GAAA,EACH,GACF,CAAA,EACF,CAAA;AAEJ;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA;AAgCf,SAAS,UAAA,GAA+B;AAC7C,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,MAAM,KAAA,EAAM;AAClB,EAAA,MAAM,cAAc,gBAAA,EAAiB;AAIrC,EAAA,MAAM,SAAA,GAAkB,eAAQ,MAAM;AACpC,IAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,MAAA,OAAO,WAAA,CAAY,SAAA;AAAA,IACrB;AAEA,IAAA,OAAO,iBAAA,CAAkB;AAAA,MACvB,UAAU,GAAA,CAAI;AAAA,KACf,CAAA;AAAA,EACH,GAAG,CAAC,WAAA,EAAa,SAAA,EAAW,GAAA,CAAI,MAAM,CAAC,CAAA;AAEvC,EAAA,OAAa,MAAA,CAAA,OAAA;AAAA,IACX,OAAO;AAAA,MACL,IAAA,EAAM,KAAK,QAAA,GACP;AAAA,QACE,EAAA,EAAI,KAAK,QAAA,CAAS,EAAA;AAAA,QAClB,QAAA,EAAU,KAAK,QAAA,CAAS,QAAA;AAAA,QACxB,KAAA,EAAO,KAAK,QAAA,CAAS,KAAA;AAAA,QACrB,MAAA,EAAQ,KAAK,QAAA,CAAS;AAAA,OACxB,GACA,IAAA;AAAA,MACJ,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,eAAe,IAAA,CAAK,SAAA;AAAA,MACpB,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,eAAA,EAAiB,IAAI,eAAA,IAAmB,IAAA;AAAA,MACxC,SAAA;AAAA,MACA,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,cAAc,GAAA,CAAI,YAAA;AAAA,MAClB,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK;AAAA,KACf,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,GAAA,EAAK,SAAS;AAAA,GACvB;AACF;;;AC9WO,SAAS,uBAAA,CACd,QAAA,EACA,OAAA,GAA4B,EAAC,EACP;AACtB,EAAA,MAAM,EAAE,YAAA,GAAe,GAAA,EAAK,SAAA,GAAY,IAAG,GAAI,OAAA;AAC/C,EAAA,IAAI,QAAa,EAAC;AAClB,EAAA,IAAI,KAAA,GAA8C,IAAA;AAClD,EAAA,IAAI,YAAA,GAAqC,IAAA;AAEzC,EAAA,MAAM,QAAQ,YAA2B;AACvC,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAGxB,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,YAAA;AACN,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAA;AACd,IAAA,KAAA,GAAQ,EAAC;AAET,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,KAAA,GAAQ,IAAA;AAAA,IACV;AAEA,IAAA,YAAA,GAAe,QAAA,CAAS,KAAK,CAAA,CAAE,OAAA,CAAQ,MAAM;AAC3C,MAAA,YAAA,GAAe,IAAA;AAAA,IACjB,CAAC,CAAA;AAED,IAAA,MAAM,YAAA;AAAA,EACR,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,CAAC,IAAA,KAAY;AAChB,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAEf,MAAA,IAAI,KAAA,CAAM,UAAU,YAAA,EAAc;AAEhC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,KAAA,GAAQ,IAAA;AAAA,QACV;AACA,QAAA,KAAK,KAAA,EAAM;AAAA,MACb,CAAA,MAAA,IAAW,CAAC,KAAA,EAAO;AAEjB,QAAA,KAAA,GAAQ,WAAW,MAAM;AACvB,UAAA,KAAA,GAAQ,IAAA;AACR,UAAA,KAAK,KAAA,EAAM;AAAA,QACb,GAAG,SAAS,CAAA;AAAA,MACd;AAAA,IACF,CAAA;AAAA,IAEA,KAAA;AAAA,IAEA,IAAI,OAAA,GAAU;AACZ,MAAA,OAAO,KAAA,CAAM,MAAA;AAAA,IACf;AAAA,GACF;AACF;;;ACxDO,SAAS,kBAAA,CACd,OAAA,GAA+B,EAAC,EACf;AACjB,EAAA,MAAM,EAAE,YAAA,GAAe,GAAA,EAAM,UAAA,EAAW,GAAI,OAAA;AAC5C,EAAA,IAAI,QAAa,EAAC;AAGlB,EAAA,IAAI,UAAA,IAAc,OAAO,YAAA,KAAiB,WAAA,EAAa;AACrD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,UAAU,CAAA;AAC9C,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAChC,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,UAAA,KAAA,GAAQ,MAAA;AAAA,QACV;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,UAAU,MAAY;AAC1B,IAAA,IAAI,UAAA,IAAc,OAAO,YAAA,KAAiB,WAAA,EAAa;AACrD,MAAA,IAAI;AACF,QAAA,YAAA,CAAa,OAAA,CAAQ,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,MACxD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAC,IAAA,KAAqB;AAC7B,MAAA,IAAI,KAAA,CAAM,UAAU,YAAA,EAAc;AAChC,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,MAAA,OAAA,EAAQ;AACR,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IAEA,YAAY,MAAW;AACrB,MAAA,MAAM,KAAA,GAAQ,KAAA;AACd,MAAA,KAAA,GAAQ,EAAC;AACT,MAAA,OAAA,EAAQ;AACR,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,MAAoB;AACxB,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IAEA,OAAO,MAAY;AACjB,MAAA,KAAA,GAAQ,EAAC;AACT,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA;AAAA,IAEA,IAAI,MAAA,GAAiB;AACnB,MAAA,OAAO,KAAA,CAAM,MAAA;AAAA,IACf,CAAA;AAAA,IAEA,IAAI,MAAA,GAAkB;AACpB,MAAA,OAAO,MAAM,MAAA,IAAU,YAAA;AAAA,IACzB;AAAA,GACF;AACF","file":"index.js","sourcesContent":["'use client'\n\n/**\n * DoDataProvider\n *\n * A DataProvider implementation that wraps @mdxui/do hooks for use\n * with @mdxui/admin components. Provides a standard DataProvider interface\n * backed by DO Things API.\n *\n * @module @mdxui/do/admin\n */\n\nimport * as React from 'react'\nimport {\n DataProviderProvider,\n type DataProvider as AppDataProvider,\n type GetListParams,\n type GetOneParams,\n type GetManyParams,\n type CreateParams,\n type UpdateParams,\n type DeleteParams,\n} from '@mdxui/app'\nimport { useDO } from '../providers'\nimport { fetchWithTimeout, DEFAULT_REQUEST_TIMEOUT } from '../lib/fetch-with-timeout'\nimport type { DoDataProvider as DoDataProviderInterface, DoRecord } from './types'\n\n// =============================================================================\n// Data Provider Factory\n// =============================================================================\n\n/**\n * Create a DataProvider that uses DO Things API.\n *\n * This factory function creates a DataProvider implementation that:\n * - Maps resources to DO Thing types\n * - Translates CRUD operations to DO API calls\n * - Supports both REST and RPC modes based on DOProvider config\n *\n * @param apiEndpoint - Base API endpoint\n * @param authToken - Optional auth token\n * @param namespace - Default namespace\n * @param rpcUrl - RPC endpoint for TanStack DB mode\n */\nexport function createDoDataProvider(\n apiEndpoint: string,\n authToken?: string,\n namespace: string = 'default',\n rpcUrl?: string | null\n): DoDataProviderInterface {\n const headers = {\n 'Content-Type': 'application/json',\n ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n }\n\n /**\n * Make RPC call to DO backend\n */\n async function rpcCall<T>(method: string, args: unknown[] = []): Promise<T> {\n if (!rpcUrl) {\n throw new Error('RPC URL not configured')\n }\n\n const response = await fetchWithTimeout(rpcUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n id: crypto.randomUUID(),\n type: 'call',\n calls: [\n {\n promiseId: 'p-1',\n target: { type: 'root' },\n method,\n args: args.map((arg) => ({ type: 'value', value: arg })),\n },\n ],\n }),\n timeout: DEFAULT_REQUEST_TIMEOUT,\n })\n\n if (!response.ok) {\n throw new Error(`RPC error: ${response.status}`)\n }\n\n const json = await response.json()\n\n if (json.type === 'error') {\n throw new Error(json.error?.message ?? 'RPC error')\n }\n\n if (json.results?.[0]?.type === 'error') {\n throw new Error(json.results[0].error?.message ?? 'RPC error')\n }\n\n return json.results?.[0]?.value as T\n }\n\n /**\n * Map resource name to Thing type\n * Resources use PascalCase (User), types use PascalCase (User)\n */\n function resourceToType(resource: string): string {\n return resource.charAt(0).toUpperCase() + resource.slice(1)\n }\n\n /**\n * Normalize a record to ensure it has an id field\n */\n function normalizeRecord<T>(item: Record<string, unknown>, fallbackId?: string | number): T {\n return {\n ...item,\n id: item.id ?? item.$id ?? fallbackId,\n } as T\n }\n\n const dataProvider: DoDataProviderInterface = {\n // =========================================================================\n // GetList\n // =========================================================================\n getList: async <T = DoRecord>(resource: string, params?: GetListParams) => {\n const type = resourceToType(resource)\n const { pagination, sort, filter } = params ?? {}\n\n if (rpcUrl) {\n // TanStack DB / RPC mode\n const result = await rpcCall<{\n items: Array<Record<string, unknown>>\n total: number\n }>('Thing.list', [{\n filter: { type, ns: namespace, ...filter },\n sort: sort ? { field: sort.field, order: sort.order.toLowerCase() } : undefined,\n pagination: pagination ? { page: pagination.page, perPage: pagination.perPage } : undefined,\n }])\n\n return {\n data: result.items.map((item) => normalizeRecord<T>(item)),\n total: result.total,\n }\n } else {\n // REST mode\n const urlParams = new URLSearchParams()\n urlParams.set('type', type)\n urlParams.set('ns', namespace)\n if (pagination) {\n urlParams.set('page', pagination.page.toString())\n urlParams.set('perPage', pagination.perPage.toString())\n }\n if (sort) {\n urlParams.set('sortField', sort.field)\n urlParams.set('sortOrder', sort.order)\n }\n if (filter) {\n Object.entries(filter).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n urlParams.set(`filter[${key}]`, String(value))\n }\n })\n }\n\n const response = await fetchWithTimeout(`${apiEndpoint}/things?${urlParams}`, {\n headers,\n timeout: DEFAULT_REQUEST_TIMEOUT,\n })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch ${resource}: ${response.status}`)\n }\n\n const result = await response.json()\n const items = result.items ?? result.data ?? []\n return {\n data: items.map((item: Record<string, unknown>) => normalizeRecord<T>(item)),\n total: result.total ?? items.length,\n }\n }\n },\n\n // =========================================================================\n // GetOne\n // =========================================================================\n getOne: async <T = DoRecord>(resource: string, params: GetOneParams) => {\n const type = resourceToType(resource)\n const { id } = params\n\n if (rpcUrl) {\n const result = await rpcCall<Record<string, unknown>>('Thing.get', [{\n ns: namespace,\n type,\n id: String(id),\n }])\n\n return {\n data: normalizeRecord<T>(result, id),\n }\n } else {\n const response = await fetchWithTimeout(\n `${apiEndpoint}/things/${encodeURIComponent(namespace)}/${encodeURIComponent(type)}/${encodeURIComponent(String(id))}`,\n { headers, timeout: DEFAULT_REQUEST_TIMEOUT }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to fetch ${resource}/${id}: ${response.status}`)\n }\n\n const result = await response.json()\n return { data: normalizeRecord<T>(result, id) }\n }\n },\n\n // =========================================================================\n // GetMany\n // =========================================================================\n getMany: async <T = DoRecord>(resource: string, params: GetManyParams) => {\n const type = resourceToType(resource)\n const { ids } = params\n\n // Fetch each item individually and combine\n // TODO: Add bulk get endpoint to DO API\n const results = await Promise.all(\n ids.map(async (id) => {\n try {\n if (rpcUrl) {\n const result = await rpcCall<Record<string, unknown>>('Thing.get', [{\n ns: namespace,\n type,\n id: String(id),\n }])\n return normalizeRecord<T>(result, id)\n } else {\n const response = await fetchWithTimeout(\n `${apiEndpoint}/things/${encodeURIComponent(namespace)}/${encodeURIComponent(type)}/${encodeURIComponent(String(id))}`,\n { headers, timeout: DEFAULT_REQUEST_TIMEOUT }\n )\n if (!response.ok) return null\n const result = await response.json()\n return normalizeRecord<T>(result, id)\n }\n } catch {\n return null\n }\n })\n )\n\n return {\n data: results.filter((item): item is NonNullable<typeof item> => item !== null) as T[],\n }\n },\n\n // =========================================================================\n // Create\n // =========================================================================\n create: async <T = DoRecord>(resource: string, params: CreateParams<T>) => {\n const type = resourceToType(resource)\n const { data } = params\n\n if (rpcUrl) {\n const result = await rpcCall<Record<string, unknown>>('Thing.create', [{\n ns: namespace,\n type,\n name: (data as Record<string, unknown>).name ?? `${type}-${Date.now()}`,\n data,\n }])\n\n return {\n data: normalizeRecord<T>(result),\n }\n } else {\n const response = await fetchWithTimeout(`${apiEndpoint}/things`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n ns: namespace,\n type,\n name: (data as Record<string, unknown>).name ?? `${type}-${Date.now()}`,\n data,\n }),\n timeout: DEFAULT_REQUEST_TIMEOUT,\n })\n\n if (!response.ok) {\n throw new Error(`Failed to create ${resource}: ${response.status}`)\n }\n\n const result = await response.json()\n return { data: normalizeRecord<T>(result) }\n }\n },\n\n // =========================================================================\n // Update\n // =========================================================================\n update: async <T = DoRecord>(resource: string, params: UpdateParams<T>) => {\n const type = resourceToType(resource)\n const { id, data } = params\n\n if (rpcUrl) {\n const result = await rpcCall<Record<string, unknown>>('Thing.update', [{\n ns: namespace,\n type,\n id: String(id),\n data,\n }])\n\n return {\n data: normalizeRecord<T>(result, id),\n }\n } else {\n const response = await fetchWithTimeout(\n `${apiEndpoint}/things/${encodeURIComponent(namespace)}/${encodeURIComponent(type)}/${encodeURIComponent(String(id))}`,\n {\n method: 'PATCH',\n headers,\n body: JSON.stringify({ data }),\n timeout: DEFAULT_REQUEST_TIMEOUT,\n }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to update ${resource}/${id}: ${response.status}`)\n }\n\n const result = await response.json()\n return { data: normalizeRecord<T>(result, id) }\n }\n },\n\n // =========================================================================\n // Delete\n // =========================================================================\n delete: async <T = DoRecord>(resource: string, params: DeleteParams) => {\n const type = resourceToType(resource)\n const { id } = params\n\n if (rpcUrl) {\n await rpcCall<void>('Thing.delete', [{\n ns: namespace,\n type,\n id: String(id),\n hard: false,\n }])\n\n return { data: { id } as T }\n } else {\n const response = await fetchWithTimeout(\n `${apiEndpoint}/things/${encodeURIComponent(namespace)}/${encodeURIComponent(type)}/${encodeURIComponent(String(id))}`,\n {\n method: 'DELETE',\n headers,\n timeout: DEFAULT_REQUEST_TIMEOUT,\n }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to delete ${resource}/${id}: ${response.status}`)\n }\n\n return { data: { id } as T }\n }\n },\n\n // =========================================================================\n // DO-Specific Methods\n // =========================================================================\n\n /**\n * Get type statistics\n */\n getTypeStats: async (resource: string) => {\n const type = resourceToType(resource)\n\n if (rpcUrl) {\n const result = await rpcCall<{\n total: number\n recentlyCreated: number\n recentlyUpdated: number\n }>('Thing.stats', [{ ns: namespace, type }])\n return result\n } else {\n const response = await fetchWithTimeout(\n `${apiEndpoint}/things/${encodeURIComponent(namespace)}/${encodeURIComponent(type)}/stats`,\n { headers, timeout: DEFAULT_REQUEST_TIMEOUT }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to get stats for ${resource}: ${response.status}`)\n }\n\n return response.json()\n }\n },\n\n /**\n * Get version history\n */\n getVersions: async (resource: string, id: string) => {\n const type = resourceToType(resource)\n\n if (rpcUrl) {\n const result = await rpcCall<unknown[]>('Thing.versions', [{\n ns: namespace,\n type,\n id,\n }])\n return result\n } else {\n const response = await fetchWithTimeout(\n `${apiEndpoint}/things/${encodeURIComponent(namespace)}/${encodeURIComponent(type)}/${encodeURIComponent(id)}/versions`,\n { headers, timeout: DEFAULT_REQUEST_TIMEOUT }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to get versions for ${resource}/${id}: ${response.status}`)\n }\n\n return response.json()\n }\n },\n }\n\n return dataProvider\n}\n\n// =============================================================================\n// Provider Component\n// =============================================================================\n\nexport interface DoDataProviderProviderProps {\n /** Children to render */\n children: React.ReactNode\n /** Optional pre-created data provider */\n dataProvider?: DoDataProviderInterface\n}\n\n/**\n * DoDataProviderProvider\n *\n * A provider component that automatically creates and provides a DO-backed\n * DataProvider using the current DOProvider context.\n *\n * @example\n * ```tsx\n * <DOProvider config={doConfig}>\n * <DoDataProviderProvider>\n * <MyApp />\n * </DoDataProviderProvider>\n * </DOProvider>\n * ```\n */\nexport function DoDataProviderProvider({\n children,\n dataProvider: providedDataProvider,\n}: DoDataProviderProviderProps) {\n const { config, namespace, rpcUrl } = useDO()\n\n // Create data provider from DO context if not provided\n const dataProvider = React.useMemo(() => {\n if (providedDataProvider) return providedDataProvider\n\n return createDoDataProvider(\n config.apiEndpoint,\n config.authToken,\n namespace,\n rpcUrl\n )\n }, [providedDataProvider, config.apiEndpoint, config.authToken, namespace, rpcUrl])\n\n return (\n <DataProviderProvider dataProvider={dataProvider as AppDataProvider}>\n {children}\n </DataProviderProvider>\n )\n}\n","'use client'\n\n/**\n * DoAuthProvider\n *\n * An AuthProvider implementation that wraps DO authentication context\n * for use with @mdxui/admin and @mdxui/app components.\n *\n * @module @mdxui/do/admin\n */\n\nimport * as React from 'react'\nimport { AuthProvider as AppAuthProvider, type AuthProviderInterface } from '@mdxui/app'\nimport { useDO } from '../providers'\nimport { fetchWithTimeout, DEFAULT_REQUEST_TIMEOUT } from '../lib/fetch-with-timeout'\nimport type { DoAuthProvider as DoAuthProviderType, DoUserIdentity, DoLoginParams } from './types'\n\n// =============================================================================\n// Auth Provider Factory\n// =============================================================================\n\n/**\n * Create an AuthProvider that uses DO authentication API.\n *\n * @param apiEndpoint - Base API endpoint\n * @param authMethod - Authentication method (jwt, api-key, oauth)\n * @param authToken - Optional pre-existing auth token\n * @param namespace - Default namespace\n */\nexport function createDoAuthProvider(\n apiEndpoint: string,\n authMethod: 'jwt' | 'api-key' | 'oauth',\n authToken?: string,\n namespace: string = 'default'\n): DoAuthProviderType {\n // Store token in memory (could also use localStorage)\n let currentToken = authToken\n\n const getHeaders = () => ({\n 'Content-Type': 'application/json',\n ...(currentToken ? { Authorization: `Bearer ${currentToken}` } : {}),\n })\n\n const authProvider: DoAuthProviderType = {\n /**\n * Login with credentials\n */\n login: async (params: DoLoginParams) => {\n const { username, password, apiKey, oauthToken, provider } = params\n\n let endpoint = `${apiEndpoint}/auth/login`\n let body: Record<string, unknown> = {}\n\n switch (authMethod) {\n case 'jwt':\n body = { username, password }\n break\n case 'api-key':\n // API key auth - validate the key\n endpoint = `${apiEndpoint}/auth/api-key`\n body = { apiKey }\n break\n case 'oauth':\n // OAuth - exchange token\n endpoint = `${apiEndpoint}/auth/oauth/${provider ?? 'google'}`\n body = { token: oauthToken }\n break\n }\n\n const response = await fetchWithTimeout(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n timeout: DEFAULT_REQUEST_TIMEOUT,\n })\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: 'Login failed' }))\n throw new Error(error.message ?? 'Login failed')\n }\n\n const result = await response.json()\n currentToken = result.token ?? result.accessToken\n\n // Store in localStorage for persistence\n if (typeof window !== 'undefined' && currentToken) {\n localStorage.setItem('do_auth_token', currentToken)\n }\n },\n\n /**\n * Logout current session\n */\n logout: async () => {\n try {\n // Call logout endpoint to invalidate server-side session\n await fetchWithTimeout(`${apiEndpoint}/auth/logout`, {\n method: 'POST',\n headers: getHeaders(),\n timeout: DEFAULT_REQUEST_TIMEOUT,\n })\n } catch {\n // Ignore logout errors - still clear local state\n }\n\n currentToken = undefined\n\n // Clear from localStorage\n if (typeof window !== 'undefined') {\n localStorage.removeItem('do_auth_token')\n }\n },\n\n /**\n * Check if user is authenticated\n */\n checkAuth: async () => {\n // Try to load token from localStorage if not in memory\n if (!currentToken && typeof window !== 'undefined') {\n currentToken = localStorage.getItem('do_auth_token') ?? undefined\n }\n\n if (!currentToken) {\n throw new Error('Not authenticated')\n }\n\n // Verify token is still valid\n const response = await fetchWithTimeout(`${apiEndpoint}/auth/me`, {\n method: 'GET',\n headers: getHeaders(),\n timeout: DEFAULT_REQUEST_TIMEOUT,\n })\n\n if (!response.ok) {\n // Token is invalid - clear it\n currentToken = undefined\n if (typeof window !== 'undefined') {\n localStorage.removeItem('do_auth_token')\n }\n throw new Error('Session expired')\n }\n },\n\n /**\n * Check if an error is an auth error\n */\n checkError: async (error: Error) => {\n const status = (error as Error & { status?: number }).status\n\n if (status === 401 || status === 403) {\n currentToken = undefined\n if (typeof window !== 'undefined') {\n localStorage.removeItem('do_auth_token')\n }\n throw error\n }\n },\n\n /**\n * Get current user identity\n */\n getIdentity: async (): Promise<DoUserIdentity> => {\n const response = await fetchWithTimeout(`${apiEndpoint}/auth/me`, {\n method: 'GET',\n headers: getHeaders(),\n timeout: DEFAULT_REQUEST_TIMEOUT,\n })\n\n if (!response.ok) {\n throw new Error('Failed to get user identity')\n }\n\n const user = await response.json()\n\n return {\n id: user.id ?? user.$id ?? user.sub,\n fullName: user.fullName ?? user.name ?? user.displayName,\n email: user.email,\n avatar: user.avatar ?? user.picture ?? user.avatarUrl,\n namespace: user.namespace ?? namespace,\n role: user.role,\n claims: user.claims ?? user.metadata,\n }\n },\n\n /**\n * Get user permissions\n */\n getPermissions: async (): Promise<string[]> => {\n const response = await fetchWithTimeout(`${apiEndpoint}/auth/permissions`, {\n method: 'GET',\n headers: getHeaders(),\n timeout: DEFAULT_REQUEST_TIMEOUT,\n })\n\n if (!response.ok) {\n // Return empty permissions if endpoint doesn't exist\n return []\n }\n\n const result = await response.json()\n return result.permissions ?? result ?? []\n },\n }\n\n return authProvider\n}\n\n// =============================================================================\n// Provider Component\n// =============================================================================\n\nexport interface DoAuthProviderProviderProps {\n /** Children to render */\n children: React.ReactNode\n /** Optional pre-created auth provider */\n authProvider?: DoAuthProviderType\n}\n\n/**\n * DoAuthProviderProvider\n *\n * A provider component that automatically creates and provides a DO-backed\n * AuthProvider using the current DOProvider context.\n *\n * @example\n * ```tsx\n * <DOProvider config={doConfig}>\n * <DoAuthProviderProvider>\n * <MyApp />\n * </DoAuthProviderProvider>\n * </DOProvider>\n * ```\n */\nexport function DoAuthProviderProvider({\n children,\n authProvider: providedAuthProvider,\n}: DoAuthProviderProviderProps) {\n const { config, namespace } = useDO()\n\n // Create auth provider from DO context if not provided\n const authProvider = React.useMemo(() => {\n if (providedAuthProvider) return providedAuthProvider\n\n return createDoAuthProvider(\n config.apiEndpoint,\n config.authMethod,\n config.authToken,\n namespace\n )\n }, [providedAuthProvider, config.apiEndpoint, config.authMethod, config.authToken, namespace])\n\n // Map DoAuthProvider to @mdxui/app AuthProvider interface\n const appAuthProvider: AuthProviderInterface = React.useMemo(() => ({\n login: authProvider.login as (params: Record<string, unknown>) => Promise<void>,\n logout: authProvider.logout,\n checkAuth: authProvider.checkAuth,\n checkError: authProvider.checkError,\n getIdentity: async () => {\n const identity = await authProvider.getIdentity()\n return {\n id: identity.id,\n fullName: identity.fullName,\n email: identity.email,\n avatar: identity.avatar,\n }\n },\n getPermissions: authProvider.getPermissions,\n }), [authProvider])\n\n return (\n <AppAuthProvider authProvider={appAuthProvider}>\n {children}\n </AppAuthProvider>\n )\n}\n","/**\n * Resource Discovery Utility\n *\n * Auto-generates resource definitions from DO configuration.\n * Used by DoAdmin to build navigation and CRUD views automatically.\n *\n * @module @mdxui/do/admin\n */\n\nimport type { DoAdminConfig, DoResourceDefinition } from './types'\nimport type { DOBinding } from '../types/do'\n\n/**\n * Default resource types when no bindings or explicit resources are provided.\n * These are the core entity types in the .do platform.\n */\nexport const DEFAULT_RESOURCE_TYPES = ['Thing', 'Agent', 'Workflow'] as const\n\n/**\n * Known resource type mappings for common DO class names.\n * Maps DO class names to user-friendly resource names.\n */\nconst CLASS_NAME_MAPPINGS: Record<string, string> = {\n ThingsRelationshipsDO: 'Thing',\n StateMachine: 'Workflow',\n ClaudeCodeSession: 'Session',\n BrowserSession: 'BrowserSession',\n ConversationSession: 'Conversation',\n ChangeProposal: 'Proposal',\n}\n\n/**\n * Convert a binding to a resource definition.\n *\n * @param binding - DO binding configuration\n * @returns Resource definition for the binding\n */\nfunction bindingToResource(binding: DOBinding): DoResourceDefinition {\n // Use class name mapping if available, otherwise use the binding name\n const resourceName = CLASS_NAME_MAPPINGS[binding.className] ?? binding.name\n\n // Generate a human-readable label from the resource name\n // PascalCase -> \"Pascal Case\"\n const label = resourceName\n .replace(/([A-Z])/g, ' $1')\n .trim()\n .replace(/^./, (s) => s.toUpperCase())\n\n return {\n name: resourceName,\n label: label.endsWith('s') ? label : `${label}s`, // Pluralize for list views\n showInSidebar: true,\n }\n}\n\n/**\n * Create a default resource definition for a resource type.\n *\n * @param resourceType - The resource type name (e.g., 'Thing', 'Agent')\n * @returns Resource definition with sensible defaults\n */\nfunction createDefaultResource(resourceType: string): DoResourceDefinition {\n // Generate a human-readable label\n const label = resourceType\n .replace(/([A-Z])/g, ' $1')\n .trim()\n .replace(/^./, (s) => s.toUpperCase())\n\n return {\n name: resourceType,\n label: label.endsWith('s') ? label : `${label}s`, // Pluralize\n showInSidebar: true,\n }\n}\n\n/**\n * Discover resources from configuration.\n *\n * Priority order:\n * 1. Explicitly provided resources (config.resources)\n * 2. Auto-discovered from bindings (if autoDiscoverResources is true)\n * 3. Default resources (Thing, Agent, Workflow)\n *\n * @param config - DoAdmin configuration\n * @returns Array of resource definitions\n *\n * @example\n * ```tsx\n * // Explicit resources take priority\n * const resources = discoverResources({\n * doConfig: { ... },\n * resources: [{ name: 'Task', label: 'Tasks' }],\n * })\n * // => [{ name: 'Task', label: 'Tasks' }]\n *\n * // Auto-discover from bindings\n * const resources = discoverResources({\n * doConfig: {\n * bindings: [\n * { name: 'THINGS', className: 'ThingsRelationshipsDO' },\n * ],\n * },\n * autoDiscoverResources: true,\n * })\n * // => [{ name: 'Thing', label: 'Things', showInSidebar: true }]\n *\n * // Default resources when nothing specified\n * const resources = discoverResources({\n * doConfig: { bindings: [] },\n * })\n * // => [{ name: 'Thing', ... }, { name: 'Agent', ... }, { name: 'Workflow', ... }]\n * ```\n */\nexport function discoverResources(config: DoAdminConfig): DoResourceDefinition[] {\n // Priority 1: Explicit resources\n if (config.resources && config.resources.length > 0) {\n return config.resources\n }\n\n // Priority 2: Auto-discover from bindings\n if (config.autoDiscoverResources && config.doConfig.bindings.length > 0) {\n // Deduplicate by resource name (in case multiple bindings map to same resource)\n const seen = new Set<string>()\n const resources: DoResourceDefinition[] = []\n\n for (const binding of config.doConfig.bindings) {\n const resource = bindingToResource(binding)\n if (!seen.has(resource.name)) {\n seen.add(resource.name)\n resources.push(resource)\n }\n }\n\n return resources\n }\n\n // Priority 3: Default resources\n return DEFAULT_RESOURCE_TYPES.map(createDefaultResource)\n}\n\n/**\n * Merge discovered resources with explicit overrides.\n *\n * This allows users to provide partial resource definitions that override\n * discovered defaults while keeping the auto-discovery behavior.\n *\n * @param discovered - Auto-discovered resources\n * @param overrides - User-provided resource overrides (by name)\n * @returns Merged resources with overrides applied\n */\nexport function mergeResourceOverrides(\n discovered: DoResourceDefinition[],\n overrides: Partial<DoResourceDefinition>[]\n): DoResourceDefinition[] {\n const overrideMap = new Map(\n overrides\n .filter((o) => o.name)\n .map((o) => [o.name!, o])\n )\n\n return discovered.map((resource) => {\n const override = overrideMap.get(resource.name)\n if (override) {\n return { ...resource, ...override }\n }\n return resource\n })\n}\n","'use client'\n\n/**\n * DoAdmin\n *\n * Main entry point for the embedded admin interface in @mdxui/do.\n * Combines @mdxui/app shell with @mdxui/admin components and\n * pre-wires everything to the DO backend.\n *\n * @module @mdxui/do/admin\n */\n\nimport * as React from 'react'\nimport {\n AppShell,\n NavMain,\n NavUser,\n PageHeader,\n AppBreadcrumbs,\n useAuth,\n type NavGroup,\n} from '@mdxui/app'\nimport {\n Admin,\n AdminWithoutRouter,\n Resource,\n type ResourceProps,\n} from '@mdxui/admin'\nimport { DOProvider, useDO } from '../providers'\nimport { DoDataProviderProvider, createDoDataProvider } from './DoDataProvider'\nimport { DoAuthProviderProvider, createDoAuthProvider } from './DoAuthProvider'\nimport type { DoAdminConfig, DoResourceDefinition, UseDoAdminResult } from './types'\nimport type { DOAdminConfig } from '../types/do'\nimport { discoverResources } from './discover-resources'\nimport {\n Database,\n Users,\n FileText,\n Settings,\n Home,\n Box,\n GitBranch,\n Workflow,\n Bot,\n Zap,\n type LucideIcon,\n} from 'lucide-react'\n\n// =============================================================================\n// Admin Config Context\n// =============================================================================\n\n/**\n * Context for DoAdmin configuration.\n * Allows useDoAdmin hook to access the full admin config including discovered resources.\n */\ninterface DoAdminContextValue {\n config: DoAdminConfig\n resources: DoResourceDefinition[]\n}\n\nconst DoAdminContext = React.createContext<DoAdminContextValue | null>(null)\n\n/**\n * Hook to access the DoAdmin config context.\n * Used internally by useDoAdmin.\n */\nfunction useDoAdminConfig(): DoAdminContextValue | null {\n return React.useContext(DoAdminContext)\n}\n\n// =============================================================================\n// Default Icon Map\n// =============================================================================\n\nconst DEFAULT_ICONS: Record<string, LucideIcon> = {\n dashboard: Home,\n task: FileText,\n user: Users,\n thing: Box,\n relationship: GitBranch,\n workflow: Workflow,\n agent: Bot,\n event: Zap,\n settings: Settings,\n database: Database,\n}\n\nfunction getIconForResource(name: string): LucideIcon {\n const lowercaseName = name.toLowerCase()\n return DEFAULT_ICONS[lowercaseName] ?? Box\n}\n\n// =============================================================================\n// Navigation Builder\n// =============================================================================\n\nfunction buildNavigation(\n resources: DoResourceDefinition[],\n basePath: string = ''\n): NavGroup[] {\n const mainItems = resources\n .filter((r) => r.showInSidebar !== false)\n .map((resource) => {\n const Icon = resource.icon ?? getIconForResource(resource.name)\n return {\n title: resource.label ?? resource.name,\n url: `${basePath}/${resource.name.toLowerCase()}`,\n icon: Icon as LucideIcon,\n }\n })\n\n return [\n {\n label: 'Resources',\n items: mainItems,\n },\n ]\n}\n\n// =============================================================================\n// DoAdmin Inner Component\n// =============================================================================\n\ninterface DoAdminInnerProps {\n config: DoAdminConfig\n}\n\nfunction DoAdminInner({ config }: DoAdminInnerProps) {\n const {\n title = 'Admin',\n logo,\n theme = 'system',\n basePath = '',\n dashboard,\n loginPage,\n notFoundPage,\n layout: CustomLayout,\n sidebarFooter,\n disableRouter = false,\n } = config\n\n const { isAuthenticated, identity, isLoading: isAuthLoading, logout } = useAuth()\n const { isConnected, connectionError, namespace } = useDO()\n\n // Discover resources from config (auto-generates from bindings or uses defaults)\n const resources = React.useMemo(() => discoverResources(config), [config])\n\n // Build navigation from discovered resources\n const navigation = React.useMemo(\n () => buildNavigation(resources, basePath),\n [resources, basePath]\n )\n\n // Context value for useDoAdmin hook\n const adminContextValue = React.useMemo<DoAdminContextValue>(\n () => ({ config, resources }),\n [config, resources]\n )\n\n // Map identity to user format expected by AppShell\n const user = React.useMemo(\n () =>\n identity\n ? {\n id: identity.id,\n fullName: identity.fullName,\n email: identity.email,\n avatar: identity.avatar,\n }\n : undefined,\n [identity]\n )\n\n // Render loading state\n if (isAuthLoading) {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-background\">\n <div className=\"flex flex-col items-center gap-4\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent\" />\n <p className=\"text-muted-foreground\">Loading...</p>\n </div>\n </div>\n )\n }\n\n // Render connection error\n if (connectionError) {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-background\">\n <div className=\"flex flex-col items-center gap-4 text-center\">\n <div className=\"rounded-full bg-destructive/10 p-4\">\n <Database className=\"h-8 w-8 text-destructive\" />\n </div>\n <h2 className=\"text-lg font-semibold\">Connection Error</h2>\n <p className=\"text-muted-foreground max-w-md\">\n Unable to connect to the backend. Please check your configuration and try again.\n </p>\n <p className=\"text-sm text-destructive\">{connectionError.message}</p>\n </div>\n </div>\n )\n }\n\n // Admin component to use\n const AdminComponent = disableRouter ? AdminWithoutRouter : Admin\n\n // Default admin content with @mdxui/admin\n const adminContent = (\n <AdminComponent\n title={title}\n logo={logo}\n theme={theme}\n basename={basePath}\n dashboard={dashboard}\n loginPage={loginPage}\n catchAll={notFoundPage}\n disableRouter={disableRouter}\n >\n {resources.map((resource) => (\n <Resource\n key={resource.name}\n name={resource.name}\n list={resource.list}\n create={resource.create}\n edit={resource.edit}\n show={resource.show}\n icon={resource.icon}\n />\n ))}\n </AdminComponent>\n )\n\n // If custom layout provided, use it\n if (CustomLayout) {\n return (\n <DoAdminContext.Provider value={adminContextValue}>\n <CustomLayout>{adminContent}</CustomLayout>\n </DoAdminContext.Provider>\n )\n }\n\n // Default: wrap in AppShell for consistent UI\n return (\n <DoAdminContext.Provider value={adminContextValue}>\n <AppShell\n config={{\n name: title,\n basePath,\n logo,\n }}\n navigation={navigation}\n user={user}\n isLoading={isAuthLoading}\n header={\n <div className=\"flex items-center gap-2\">\n <span className=\"font-semibold\">{title}</span>\n {namespace !== 'default' && (\n <span className=\"rounded-md bg-muted px-2 py-0.5 text-xs text-muted-foreground\">\n {namespace}\n </span>\n )}\n </div>\n }\n nav={<NavMain items={navigation[0]?.items ?? []} />}\n footer={\n sidebarFooter ?? (\n user && (\n <NavUser user={user} />\n )\n )\n }\n pageHeader={<AppBreadcrumbs />}\n >\n {adminContent}\n </AppShell>\n </DoAdminContext.Provider>\n )\n}\n\n// =============================================================================\n// DoAdmin Main Component\n// =============================================================================\n\nexport interface DoAdminProps {\n /** Admin configuration */\n config: DoAdminConfig\n /** Children (additional content) */\n children?: React.ReactNode\n}\n\n/**\n * DoAdmin - Full-featured admin interface for .do platform\n *\n * Provides a complete admin dashboard with:\n * - Pre-configured DO data provider\n * - Pre-configured DO auth provider\n * - Auto-generated CRUD views for resources\n * - Sidebar navigation\n * - User authentication\n *\n * @example\n * ```tsx\n * import { DoAdmin } from '@mdxui/do'\n *\n * function App() {\n * return (\n * <DoAdmin\n * config={{\n * title: 'My Admin',\n * doConfig: {\n * apiEndpoint: 'https://api.example.do',\n * authMethod: 'jwt',\n * bindings: [],\n * realTimeUpdates: true,\n * },\n * resources: [\n * { name: 'Task', label: 'Tasks' },\n * { name: 'User', label: 'Users' },\n * ],\n * }}\n * />\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Minimal setup - auto-discovers resources\n * <DoAdmin\n * config={{\n * doConfig: {\n * apiEndpoint: 'https://api.example.do',\n * authMethod: 'jwt',\n * bindings: [],\n * realTimeUpdates: true,\n * },\n * autoDiscoverResources: true,\n * }}\n * />\n * ```\n */\nexport function DoAdmin({ config, children }: DoAdminProps) {\n const { doConfig } = config\n\n return (\n <DOProvider config={doConfig}>\n <DoAuthProviderProvider>\n <DoDataProviderProvider>\n <DoAdminInner config={config} />\n {children}\n </DoDataProviderProvider>\n </DoAuthProviderProvider>\n </DOProvider>\n )\n}\n\nDoAdmin.displayName = 'DoAdmin'\n\n// =============================================================================\n// useDoAdmin Hook\n// =============================================================================\n\n/**\n * useDoAdmin - Hook to access DO admin context\n *\n * Provides access to user identity, auth state, resources, and namespace.\n * Must be used within a DoAdmin component.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const {\n * user,\n * isAuthenticated,\n * namespace,\n * setNamespace,\n * logout,\n * } = useDoAdmin()\n *\n * return (\n * <div>\n * <p>Welcome, {user?.fullName}</p>\n * <button onClick={logout}>Logout</button>\n * </div>\n * )\n * }\n * ```\n */\nexport function useDoAdmin(): UseDoAdminResult {\n const auth = useAuth()\n const do_ = useDO()\n const adminConfig = useDoAdminConfig()\n\n // Get discovered resources from admin context, or generate defaults\n // This allows useDoAdmin to work both inside and outside DoAdmin component\n const resources = React.useMemo(() => {\n if (adminConfig?.resources) {\n return adminConfig.resources\n }\n // Fallback: discover from DO context config when used outside DoAdmin\n return discoverResources({\n doConfig: do_.config,\n })\n }, [adminConfig?.resources, do_.config])\n\n return React.useMemo(\n () => ({\n user: auth.identity\n ? {\n id: auth.identity.id,\n fullName: auth.identity.fullName,\n email: auth.identity.email,\n avatar: auth.identity.avatar,\n }\n : null,\n isAuthenticated: auth.isAuthenticated,\n isAuthLoading: auth.isLoading,\n isConnected: do_.isConnected,\n connectionError: do_.connectionError ?? null,\n resources,\n namespace: do_.namespace,\n setNamespace: do_.setNamespace,\n login: auth.login as (params: Record<string, unknown>) => Promise<void>,\n logout: auth.logout,\n }),\n [auth, do_, resources]\n )\n}\n","/**\n * Batch sync utilities for optimizing sync operations\n *\n * Batches rapid changes to reduce sync overhead and improve performance.\n * Instead of syncing every mutation individually, changes are buffered\n * and sent in batches.\n *\n * @module\n */\n\n/**\n * Options for batch sync operations\n */\nexport interface BatchSyncOptions {\n /** Maximum number of items before forcing a flush (default: 100) */\n maxBatchSize?: number\n /** Maximum time to wait before flushing in ms (default: 50) */\n maxWaitMs?: number\n}\n\n/**\n * Return type for batched operations controller\n */\nexport interface BatchedOperations<T> {\n /** Add an item to the batch queue */\n add: (item: T) => void\n /** Force flush all pending items immediately */\n flush: () => Promise<void>\n /** Get the current number of pending items */\n readonly pending: number\n}\n\n/**\n * Create a batched operations controller\n *\n * Buffers items and executes them in batches to reduce overhead.\n * Items are flushed when either:\n * - The batch reaches maxBatchSize\n * - maxWaitMs has elapsed since the first item was added\n *\n * @param executor - Function to execute with batched items\n * @param options - Batch configuration options\n * @returns Controller for managing batched operations\n *\n * @example\n * ```typescript\n * const batchedSync = createBatchedOperations<Mutation>(\n * async (mutations) => {\n * await syncToServer(mutations)\n * },\n * { maxBatchSize: 50, maxWaitMs: 100 }\n * )\n *\n * // These will be batched together\n * batchedSync.add({ type: 'create', data: { name: 'A' } })\n * batchedSync.add({ type: 'create', data: { name: 'B' } })\n * batchedSync.add({ type: 'create', data: { name: 'C' } })\n *\n * // Force immediate flush if needed\n * await batchedSync.flush()\n * ```\n */\nexport function createBatchedOperations<T>(\n executor: (items: T[]) => Promise<void>,\n options: BatchSyncOptions = {}\n): BatchedOperations<T> {\n const { maxBatchSize = 100, maxWaitMs = 50 } = options\n let batch: T[] = []\n let timer: ReturnType<typeof setTimeout> | null = null\n let flushPromise: Promise<void> | null = null\n\n const flush = async (): Promise<void> => {\n if (batch.length === 0) return\n\n // If already flushing, wait for that to complete\n if (flushPromise) {\n await flushPromise\n return\n }\n\n const items = batch\n batch = []\n\n if (timer) {\n clearTimeout(timer)\n timer = null\n }\n\n flushPromise = executor(items).finally(() => {\n flushPromise = null\n })\n\n await flushPromise\n }\n\n return {\n add: (item: T) => {\n batch.push(item)\n\n if (batch.length >= maxBatchSize) {\n // Batch is full, flush immediately\n if (timer) {\n clearTimeout(timer)\n timer = null\n }\n void flush()\n } else if (!timer) {\n // Start the timer if not already running\n timer = setTimeout(() => {\n timer = null\n void flush()\n }, maxWaitMs)\n }\n },\n\n flush,\n\n get pending() {\n return batch.length\n },\n }\n}\n","/**\n * Offline queue for mutation persistence during disconnection\n *\n * Queues mutations when offline and persists them to localStorage\n * for replay when connection is restored.\n *\n * @module\n */\n\n/**\n * Options for offline queue\n */\nexport interface OfflineQueueOptions {\n /** Maximum number of items to queue (default: 1000) */\n maxQueueSize?: number\n /** LocalStorage key for persistence (optional) */\n persistKey?: string\n}\n\n/**\n * Offline queue controller interface\n */\nexport interface OfflineQueue<T> {\n /** Add an item to the queue. Returns false if queue is full. */\n enqueue: (item: T) => boolean\n /** Remove and return all queued items */\n dequeueAll: () => T[]\n /** Peek at all items without removing */\n peek: () => readonly T[]\n /** Clear all items from the queue */\n clear: () => void\n /** Current number of items in queue */\n readonly length: number\n /** Whether queue is at capacity */\n readonly isFull: boolean\n}\n\n/**\n * Create an offline queue for mutation persistence\n *\n * Queues items during offline periods and can persist to localStorage\n * for durability across page refreshes.\n *\n * @param options - Queue configuration options\n * @returns Offline queue controller\n *\n * @example\n * ```typescript\n * const queue = createOfflineQueue<Mutation>({\n * maxQueueSize: 500,\n * persistKey: 'my-app-offline-mutations'\n * })\n *\n * // Queue mutations when offline\n * if (!navigator.onLine) {\n * queue.enqueue({ type: 'create', data: { name: 'Test' } })\n * }\n *\n * // Replay when back online\n * window.addEventListener('online', async () => {\n * const mutations = queue.dequeueAll()\n * await syncMutations(mutations)\n * })\n * ```\n */\nexport function createOfflineQueue<T>(\n options: OfflineQueueOptions = {}\n): OfflineQueue<T> {\n const { maxQueueSize = 1000, persistKey } = options\n let queue: T[] = []\n\n // Load from localStorage if persistKey provided\n if (persistKey && typeof localStorage !== 'undefined') {\n try {\n const stored = localStorage.getItem(persistKey)\n if (stored) {\n const parsed = JSON.parse(stored)\n if (Array.isArray(parsed)) {\n queue = parsed\n }\n }\n } catch {\n // Ignore parse errors, start with empty queue\n }\n }\n\n const persist = (): void => {\n if (persistKey && typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(persistKey, JSON.stringify(queue))\n } catch {\n // Ignore storage errors (quota exceeded, etc.)\n }\n }\n }\n\n return {\n enqueue: (item: T): boolean => {\n if (queue.length >= maxQueueSize) {\n return false\n }\n queue.push(item)\n persist()\n return true\n },\n\n dequeueAll: (): T[] => {\n const items = queue\n queue = []\n persist()\n return items\n },\n\n peek: (): readonly T[] => {\n return queue\n },\n\n clear: (): void => {\n queue = []\n persist()\n },\n\n get length(): number {\n return queue.length\n },\n\n get isFull(): boolean {\n return queue.length >= maxQueueSize\n },\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|