@boba-cli/machine 0.1.0-alpha.1 → 0.1.0-alpha.2
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/browser/index.cjs +1 -1
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.d.cts +4 -1
- package/dist/browser/index.d.ts +4 -1
- package/dist/browser/index.js +1 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/index.cjs +13 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +29 -3
- package/dist/index.d.ts +29 -3
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/node/index.d.cts +2 -1
- package/dist/node/index.d.ts +2 -1
- package/dist/{types-FB6TYMn5.d.cts → types-l5LiTaxI.d.cts} +3 -42
- package/dist/{types-FB6TYMn5.d.ts → types-l5LiTaxI.d.ts} +3 -42
- package/package.json +4 -1
package/dist/browser/index.cjs
CHANGED
|
@@ -651,7 +651,7 @@ var BrowserPlatformAdapter = class {
|
|
|
651
651
|
const signalAdapter = new BrowserSignalAdapter();
|
|
652
652
|
const clipboardAdapter = new BrowserClipboardAdapter();
|
|
653
653
|
const environmentAdapter = new BrowserEnvironmentAdapter(options.env);
|
|
654
|
-
const filesystemAdapter = new BrowserFileSystemAdapter();
|
|
654
|
+
const filesystemAdapter = options.filesystem ?? new BrowserFileSystemAdapter();
|
|
655
655
|
const pathAdapter = new BrowserPathAdapter();
|
|
656
656
|
const archiveAdapter = new BrowserArchiveAdapter();
|
|
657
657
|
const styleAdapter = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/style/index.ts","../../src/browser/archive.ts","../../src/browser/clipboard.ts","../../src/browser/environment.ts","../../src/browser/filesystem.ts","../../src/browser/path.ts","../../src/browser/signals.ts","../../src/bytes.ts","../../src/browser/terminal.ts","../../src/browser/index.ts"],"names":["r","g","b"],"mappings":";;;AAQA,IAAM,GAAA,GAAM,OAAA;AAIZ,IAAM,KAAA,GAAQ;AAAA;AAAA,EAEZ,IAAA,EAAM,CAAC,GAAA,EAAK,IAAI,CAAA;AAAA,EAChB,GAAA,EAAK,CAAC,GAAA,EAAK,IAAI,CAAA;AAAA,EACf,MAAA,EAAQ,CAAC,GAAA,EAAK,IAAI,CAAA;AAAA,EAClB,SAAA,EAAW,CAAC,GAAA,EAAK,IAAI,CAAA;AAAA,EACrB,OAAA,EAAS,CAAC,GAAA,EAAK,IAAI,CAAA;AAAA,EACnB,MAAA,EAAQ,CAAC,GAAA,EAAK,IAAI,CAAA;AAAA,EAClB,aAAA,EAAe,CAAC,GAAA,EAAK,IAAI,CAAA;AAAA;AAAA,EAGzB,KAAA,EAAO,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EAClB,GAAA,EAAK,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EAChB,KAAA,EAAO,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EAClB,MAAA,EAAQ,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EACnB,IAAA,EAAM,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EACjB,OAAA,EAAS,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EACpB,IAAA,EAAM,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EACjB,KAAA,EAAO,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA;AAAA,EAGlB,WAAA,EAAa,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EACxB,SAAA,EAAW,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EACtB,WAAA,EAAa,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EACxB,YAAA,EAAc,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EACzB,UAAA,EAAY,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EACvB,aAAA,EAAe,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EAC1B,UAAA,EAAY,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EACvB,WAAA,EAAa,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA;AAAA,EAGxB,OAAA,EAAS,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EACpB,KAAA,EAAO,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EAClB,OAAA,EAAS,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EACpB,QAAA,EAAU,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EACrB,MAAA,EAAQ,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EACnB,SAAA,EAAW,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EACtB,MAAA,EAAQ,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA,EACnB,OAAA,EAAS,CAAC,IAAA,EAAM,IAAI,CAAA;AAAA;AAAA,EAGpB,aAAA,EAAe,CAAC,KAAA,EAAO,IAAI,CAAA;AAAA,EAC3B,WAAA,EAAa,CAAC,KAAA,EAAO,IAAI,CAAA;AAAA,EACzB,aAAA,EAAe,CAAC,KAAA,EAAO,IAAI,CAAA;AAAA,EAC3B,cAAA,EAAgB,CAAC,KAAA,EAAO,IAAI,CAAA;AAAA,EAC5B,YAAA,EAAc,CAAC,KAAA,EAAO,IAAI,CAAA;AAAA,EAC1B,eAAA,EAAiB,CAAC,KAAA,EAAO,IAAI,CAAA;AAAA,EAC7B,YAAA,EAAc,CAAC,KAAA,EAAO,IAAI,CAAA;AAAA,EAC1B,aAAA,EAAe,CAAC,KAAA,EAAO,IAAI;AAC7B,CAAA;AAWA,SAAS,UAAA,CAAW,IAAA,EAAc,IAAA,EAAc,KAAA,EAAuB;AACrE,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,GAAG,CAAA,EAAG,IAAI,CAAA,CAAA,CAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,GAAG,CAAA,EAAG,KAAK,CAAA,CAAA,CAAA;AAK/B,EAAA,MAAM,WAAW,IAAA,CAAK,OAAA;AAAA,IACpB,IAAI,MAAA,CAAO,QAAA,CAAS,QAAQ,qBAAA,EAAuB,MAAM,GAAG,GAAG,CAAA;AAAA,IAC/D,QAAA,GAAW;AAAA,GACb;AAEA,EAAA,OAAO,UAAU,QAAA,GAAW,QAAA;AAC9B;AAOA,SAAS,SAAS,GAAA,EAAuC;AACvD,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AAClC,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AAE9B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAEtB,IAAA,MAAMA,EAAAA,GAAAA,CAAM,GAAA,IAAO,CAAA,GAAK,EAAA,IAAO,EAAA;AAC/B,IAAA,MAAMC,EAAAA,GAAAA,CAAM,GAAA,IAAO,CAAA,GAAK,EAAA,IAAO,EAAA;AAC/B,IAAA,MAAMC,EAAAA,GAAAA,CAAK,MAAM,EAAA,IAAO,EAAA;AACxB,IAAA,OAAO,CAACF,EAAAA,EAAGC,EAAAA,EAAGC,EAAC,CAAA;AAAA,EACjB;AAGA,EAAA,MAAM,CAAA,GAAK,OAAO,EAAA,GAAM,GAAA;AACxB,EAAA,MAAM,CAAA,GAAK,OAAO,CAAA,GAAK,GAAA;AACvB,EAAA,MAAM,IAAI,GAAA,GAAM,GAAA;AAChB,EAAA,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACjB;AAQO,SAAS,YAAY,YAAA,EAAqC;AAQ/D,EAAA,SAAS,MAAM,KAAA,EAAyC;AAEtD,IAAA,MAAM,EAAA,GAAK,CAAC,IAAA,KAAyB;AACnC,MAAA,IAAgB,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAClC,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,IAAI,MAAA,GAAS,IAAA;AACb,MAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC1C,QAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,MAAM,CAAC,CAAA;AAC7B,QAAA,MAAA,GAAS,UAAA,CAAW,MAAA,EAAQ,IAAA,EAAM,KAAK,CAAA;AAAA,MACzC;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAGA,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AACnC,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,MAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,MAAM,IAAI,CAAA;AAChC,MAAA,MAAA,CAAO,cAAA,CAAe,IAAI,IAAA,EAAM;AAAA,QAC9B,GAAA,GAAM;AACJ,UAAA,OAAO,KAAA,CAAM,CAAC,GAAG,KAAA,EAAO,CAAC,IAAA,EAAM,KAAK,CAAC,CAAC,CAAA;AAAA,QACxC;AAAA,OACD,CAAA;AAAA,IACH;AAGA,IAAA,MAAA,CAAO,cAAA,CAAe,IAAI,MAAA,EAAQ;AAAA,MAChC,GAAA,GAAM;AACJ,QAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,KAAA,CAAM,WAAA;AAC5B,QAAA,OAAO,KAAA,CAAM,CAAC,GAAG,KAAA,EAAO,CAAC,IAAA,EAAM,KAAK,CAAC,CAAC,CAAA;AAAA,MACxC;AAAA,KACD,CAAA;AAGD,IAAA,MAAA,CAAO,cAAA,CAAe,IAAI,MAAA,EAAQ;AAAA,MAChC,GAAA,GAAM;AACJ,QAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,KAAA,CAAM,WAAA;AAC5B,QAAA,OAAO,KAAA,CAAM,CAAC,GAAG,KAAA,EAAO,CAAC,IAAA,EAAM,KAAK,CAAC,CAAC,CAAA;AAAA,MACxC;AAAA,KACD,CAAA;AAKD,IAAA,MAAA,CAAO,cAAA,CAAe,IAAI,KAAA,EAAO;AAAA,MAC/B,KAAA,EAAO,CAAC,KAAA,KAA2B;AAIjC,QAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,SAAS,KAAK,CAAA;AAChC,QAAA,OAAO,KAAA,CAAM,CAAC,GAAG,KAAA,EAAO,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,CAAC,CAAA;AAAA,MACxD,CAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACX,CAAA;AAGD,IAAA,MAAA,CAAO,cAAA,CAAe,IAAI,KAAA,EAAO;AAAA,MAC/B,KAAA,EAAO,CAAC,CAAA,EAAW,CAAA,EAAW,CAAA,KAAuB;AAInD,QAAA,OAAO,KAAA,CAAM,CAAC,GAAG,KAAA,EAAO,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,CAAC,CAAA;AAAA,MACxD,CAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACX,CAAA;AAGD,IAAA,MAAA,CAAO,cAAA,CAAe,IAAI,OAAA,EAAS;AAAA,MACjC,KAAA,EAAO,CAAC,KAAA,KAA2B;AAIjC,QAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,SAAS,KAAK,CAAA;AAChC,QAAA,OAAO,KAAA,CAAM,CAAC,GAAG,KAAA,EAAO,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,CAAC,CAAA;AAAA,MACxD,CAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACX,CAAA;AAGD,IAAA,MAAA,CAAO,cAAA,CAAe,IAAI,OAAA,EAAS;AAAA,MACjC,KAAA,EAAO,CAAC,CAAA,EAAW,CAAA,EAAW,CAAA,KAAuB;AAInD,QAAA,OAAO,KAAA,CAAM,CAAC,GAAG,KAAA,EAAO,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,CAAC,CAAA;AAAA,MACxD,CAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACX,CAAA;AAGD,IAAA,MAAA,CAAO,cAAA,CAAe,IAAI,SAAA,EAAW;AAAA,MACnC,KAAA,EAAO,CAAC,IAAA,KAA0B;AAIhC,QAAA,OAAO,KAAA,CAAM,CAAC,GAAG,KAAA,EAAO,CAAC,QAAQ,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,CAAC,CAAA;AAAA,MACjD,CAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACX,CAAA;AAGD,IAAA,MAAA,CAAO,cAAA,CAAe,IAAI,WAAA,EAAa;AAAA,MACrC,KAAA,EAAO,CAAC,IAAA,KAA0B;AAIhC,QAAA,OAAO,KAAA,CAAM,CAAC,GAAG,KAAA,EAAO,CAAC,QAAQ,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,CAAC,CAAA;AAAA,MACjD,CAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA,CAAM,EAAE,CAAA;AACjB;AAOO,SAAS,wBAAA,GAAoC;AAClD,EAAA,OAAO,WAAA,CAAoE,CAAA;AAC7E;;;AChPO,IAAM,wBAAN,MAAsD;AAAA;AAAA;AAAA;AAAA;AAAA,EAK3D,WAAA,GAAuB;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,GAAA,CAAI,UAAA,EAAoB,SAAA,EAAkC;AAC9D,IAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAA,CAAM,YAAA,EAAsB,QAAA,EAAiC;AACjE,IAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,EAC3E;AACF;;;AChCO,IAAM,0BAAN,MAA0D;AAAA,EAC/D,MAAM,IAAA,GAAwB;AAC5B,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,SAAA,CAAU,SAAA,CAAU,QAAA,EAAS;AAAA,IAC5C,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,kCAAkC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OAC1F;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,IAAA,EAA6B;AACvC,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AAAA,IAC1C,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,iCAAiC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OACzF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAA,GAAuB;AACrB,IAAA,OACE,OAAO,SAAA,KAAc,WAAA,IACrB,OAAO,UAAU,SAAA,KAAc,WAAA,IAC/B,OAAO,SAAA,CAAU,UAAU,QAAA,KAAa,UAAA,IACxC,OAAO,SAAA,CAAU,UAAU,SAAA,KAAc,UAAA;AAAA,EAE7C;AACF;;;ACnCO,IAAM,4BAAN,MAA8D;AAAA,EAClD,YAAA;AAAA,EACT,kBAAA,GAA0C,IAAA;AAAA,EAC1C,gBAAA,GAA8C,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMtD,WAAA,CAAY,YAAA,GAAuC,EAAC,EAAG;AACrD,IAAA,IAAA,CAAK,eAAe,IAAI,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAC,CAAA;AAAA,EAC1D;AAAA,EAEA,IAAI,IAAA,EAAkC;AAEpC,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,EAAG;AAC/B,MAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAAA,IACnC;AAGA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAA,CAAI,MAAc,KAAA,EAAqB;AACrC,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAEjC,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,EAC1B;AAAA,EAEA,eAAA,GAAgC;AAC9B,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,IACd;AAGA,IAAA,MAAM,OAAA,GAAwB;AAAA,MAC5B,KAAA,EAAO,CAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAQ,IAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,IAAA,CAAK,kBAAA,GAAqB,OAAA;AAC1B,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,qBAAA,GAA4C;AAC1C,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,IACd;AAGA,IAAA,MAAM,WAAW,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,iBAAiB,GAAG,WAAA,EAAY;AACvE,IAAA,IAAI,QAAA,KAAa,MAAA,IAAU,QAAA,KAAa,OAAA,EAAS;AAC/C,MAAA,IAAA,CAAK,gBAAA,GAAmB,QAAA;AACxB,MAAA,OAAO,QAAA;AAAA,IACT;AAGA,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,UAAA,EAAY;AACtD,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA;AAClE,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AACxB,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,+BAA+B,CAAA;AACpE,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,IAAA,CAAK,gBAAA,GAAmB,OAAA;AACxB,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,gBAAA,GAAmB,SAAA;AACxB,IAAA,OAAO,SAAA;AAAA,EACT;AACF;;;ACrFO,IAAM,2BAAN,MAA4D;AAAA,EACjE,MAAM,OAAA,CAAQ,KAAA,EAAe,QAAA,EAA8E;AACzG,IAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,EACnF;AAAA,EAEA,MAAM,KAAK,KAAA,EAAkC;AAC3C,IAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,EACnF;AAAA,EAEA,MAAM,QAAA,CAAS,KAAA,EAAe,SAAA,EAAqC;AACjE,IAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,EACnF;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,EAAe,QAAA,EAAiC;AAC9D,IAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,EACnF;AAAA,EAEA,MAAM,OAAO,KAAA,EAAiC;AAC5C,IAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,EACnF;AAAA,EAEA,MAAM,KAAA,CAAM,KAAA,EAAe,QAAA,EAAmD;AAC5E,IAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,EACnF;AAAA,EAEA,MAAM,OAAO,KAAA,EAA8B;AACzC,IAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,EACnF;AAAA,EAEA,MAAM,KAAA,CAAM,KAAA,EAAe,QAAA,EAAoE;AAC7F,IAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,EACnF;AAAA,EAEA,MAAM,MAAA,CAAO,IAAA,EAAc,IAAA,EAA6B;AACtD,IAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,EACnF;AAAA,EAEA,MAAM,QAAA,CAAS,IAAA,EAAc,IAAA,EAA6B;AACxD,IAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,EACnF;AAAA,EAEA,GAAA,GAAc;AACZ,IAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,EACnF;AAAA,EAEA,OAAA,GAAkB;AAChB,IAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,EACnF;AACF;;;AChDO,IAAM,qBAAN,MAAgD;AAAA,EAC5C,GAAA,GAAM,GAAA;AAAA,EAEf,QAAQ,QAAA,EAA4B;AAClC,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,GAAA;AAAA,IACT;AAGA,IAAA,MAAM,WAAW,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,SAAS,CAAC,CAAA;AACxD,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAEhC,IAAA,OAAO,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAAA,EACxC;AAAA,EAEA,QAAQ,IAAA,EAAsB;AAC5B,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,GAAA;AAAA,IACT;AAGA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACvC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO,GAAA;AAAA,IACT;AAGA,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,WAAA,CAAY,GAAG,CAAA;AACzC,IAAA,IAAI,cAAc,EAAA,EAAI;AACpB,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,IAAI,cAAc,CAAA,EAAG;AACnB,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AAAA,EACnC;AAAA,EAEA,QAAA,CAAS,MAAc,GAAA,EAAsB;AAC3C,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,EAAA;AAAA,IACT;AAGA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACvC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO,EAAA;AAAA,IACT;AAGA,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,WAAA,CAAY,GAAG,CAAA;AACzC,IAAA,IAAI,OAAO,SAAA,KAAc,EAAA,GAAK,UAAU,OAAA,CAAQ,KAAA,CAAM,YAAY,CAAC,CAAA;AAGnE,IAAA,IAAI,GAAA,IAAO,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAC7B,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,IAAI,MAAM,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAQ,IAAA,EAAsB;AAC5B,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAC/B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAMpC,IAAA,IAAI,YAAY,EAAA,IAAM,OAAA,KAAY,KAAK,OAAA,KAAY,IAAA,CAAK,SAAS,CAAA,EAAG;AAClE,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B;AAAA,EAEA,WAAW,QAAA,EAA4B;AACrC,IAAA,IAAI,YAAA,GAAe,EAAA;AACnB,IAAA,IAAI,gBAAA,GAAmB,KAAA;AAGvB,IAAA,KAAA,IAAS,CAAA,GAAI,SAAS,MAAA,GAAS,CAAA,EAAG,KAAK,CAAA,IAAK,CAAC,kBAAkB,CAAA,EAAA,EAAK;AAClE,MAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,MAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACpC,QAAA;AAAA,MACF;AAEA,MAAA,YAAA,GAAe,aAAa,MAAA,GAAS,CAAA,GAAI,GAAG,OAAO,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,GAAK,OAAA;AACxE,MAAA,gBAAA,GAAmB,OAAA,CAAQ,CAAC,CAAA,KAAM,GAAA;AAAA,IACpC;AAGA,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,YAAA,GAAe,YAAA,CAAa,MAAA,GAAS,CAAA,GAAI,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,GAAK,GAAA;AAAA,IAChE;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,mBAAA,CAAoB,YAAY,CAAA;AACxD,IAAA,OAAO,UAAA,KAAe,KAAK,GAAA,GAAM,UAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAAoB,IAAA,EAAsB;AAChD,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA;AAG/B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,MAAA,GAAS,CAAA,IAAK,GAAA,KAAQ,GAAG,CAAA;AAC9E,IAAA,MAAM,aAAuB,EAAC;AAE9B,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,YAAY,IAAA,EAAM;AAEpB,QAAA,IAAI,UAAA,CAAW,SAAS,CAAA,IAAK,UAAA,CAAW,WAAW,MAAA,GAAS,CAAC,MAAM,IAAA,EAAM;AACvE,UAAA,UAAA,CAAW,GAAA,EAAI;AAAA,QACjB,CAAA,MAAA,IAAW,CAAC,UAAA,EAAY;AAEtB,UAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,QACtB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,MACzB;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAGhC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAA,GAAS,IAAI,MAAM,CAAA,CAAA;AAAA,IACrB,CAAA,MAAA,IAAW,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC9B,MAAA,MAAA,GAAS,GAAA;AAAA,IACX;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,WAAW,IAAA,EAAuB;AAChC,IAAA,OAAO,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA;AAAA,EACxC;AAAA,EAEA,UAAU,IAAA,EAAsB;AAC9B,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA;AAC/B,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,KAAM,GAAA;AAGhD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,MAAA,GAAS,CAAA,IAAK,GAAA,KAAQ,GAAG,CAAA;AAC9E,IAAA,MAAM,aAAuB,EAAC;AAE9B,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,YAAY,IAAA,EAAM;AAEpB,QAAA,IAAI,UAAA,CAAW,SAAS,CAAA,IAAK,UAAA,CAAW,WAAW,MAAA,GAAS,CAAC,MAAM,IAAA,EAAM;AACvE,UAAA,UAAA,CAAW,GAAA,EAAI;AAAA,QACjB,CAAA,MAAA,IAAW,CAAC,UAAA,EAAY;AAEtB,UAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,QACtB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,MACzB;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAGhC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAA,GAAS,IAAI,MAAM,CAAA,CAAA;AAAA,IACrB,CAAA,MAAA,IAAW,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC9B,MAAA,MAAA,GAAS,GAAA;AAAA,IACX;AAGA,IAAA,IAAI,aAAA,IAAiB,MAAA,KAAW,GAAA,IAAO,MAAA,CAAO,SAAS,CAAA,EAAG;AACxD,MAAA,MAAA,IAAU,GAAA;AAAA,IACZ;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;ACrMO,IAAM,uBAAN,MAAoD;AAAA,EACxC,iBAAA,uBAA4C,GAAA,EAAI;AAAA,EAChD,iBAAA,uBAA4C,GAAA,EAAI;AAAA,EACzD,QAAA,GAAW,KAAA;AAAA,EACX,iBAAA,GAA6D,IAAA;AAAA,EAC7D,aAAA,GAAqC,IAAA;AAAA,EAErC,kBAAA,GAAqB,CAAC,CAAA,KAA+B;AAC3D,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,iBAAA,EAAmB;AAC5C,MAAA,OAAA,EAAQ;AAAA,IACV;AAGA,IAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,IAAA,GAAO,CAAA,EAAG;AACnC,MAAA,CAAA,CAAE,cAAA,EAAe;AAAA,IACnB;AAAA,EACF,CAAA;AAAA,EAEQ,iBAAiB,MAAY;AACnC,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,iBAAA,EAAmB;AAC5C,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF,CAAA;AAAA,EAEA,YAAY,OAAA,EAAoC;AAC9C,IAAA,IAAI,KAAK,iBAAA,CAAkB,IAAA,KAAS,CAAA,IAAK,OAAO,WAAW,WAAA,EAAa;AACtE,MAAA,IAAA,CAAK,oBAAoB,IAAA,CAAK,kBAAA;AAC9B,MAAA,MAAA,CAAO,gBAAA,CAAiB,cAAA,EAAgB,IAAA,CAAK,iBAAiB,CAAA;AAAA,IAChE;AACA,IAAA,IAAA,CAAK,iBAAA,CAAkB,IAAI,OAAO,CAAA;AAElC,IAAA,OAAO;AAAA,MACL,SAAS,MAAM;AACb,QAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,OAAO,CAAA;AACrC,QAAA,IACE,IAAA,CAAK,kBAAkB,IAAA,KAAS,CAAA,IAChC,KAAK,iBAAA,IACL,OAAO,WAAW,WAAA,EAClB;AACA,UAAA,MAAA,CAAO,mBAAA,CAAoB,cAAA,EAAgB,IAAA,CAAK,iBAAiB,CAAA;AACjE,UAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,QAC3B;AAAA,MACF;AAAA,KACF;AAAA,EACF;AAAA,EAEA,YAAY,OAAA,EAAoC;AAC9C,IAAA,IAAI,KAAK,iBAAA,CAAkB,IAAA,KAAS,CAAA,IAAK,OAAO,WAAW,WAAA,EAAa;AACtE,MAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,cAAA;AAC1B,MAAA,MAAA,CAAO,gBAAA,CAAiB,UAAA,EAAY,IAAA,CAAK,aAAa,CAAA;AAAA,IACxD;AACA,IAAA,IAAA,CAAK,iBAAA,CAAkB,IAAI,OAAO,CAAA;AAElC,IAAA,OAAO;AAAA,MACL,SAAS,MAAM;AACb,QAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,OAAO,CAAA;AACrC,QAAA,IACE,IAAA,CAAK,kBAAkB,IAAA,KAAS,CAAA,IAChC,KAAK,aAAA,IACL,OAAO,WAAW,WAAA,EAClB;AACA,UAAA,MAAA,CAAO,mBAAA,CAAoB,UAAA,EAAY,IAAA,CAAK,aAAa,CAAA;AACzD,UAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,QACvB;AAAA,MACF;AAAA,KACF;AAAA,EACF;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAEhB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,QAAA,MAAA,CAAO,mBAAA,CAAoB,cAAA,EAAgB,IAAA,CAAK,iBAAiB,CAAA;AAAA,MACnE;AACA,MAAA,IAAI,KAAK,aAAA,EAAe;AACtB,QAAA,MAAA,CAAO,mBAAA,CAAoB,UAAA,EAAY,IAAA,CAAK,aAAa,CAAA;AAAA,MAC3D;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,kBAAkB,KAAA,EAAM;AAC7B,IAAA,IAAA,CAAK,kBAAkB,KAAA,EAAM;AAAA,EAC/B;AACF;;;ACzFA,IAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAGhB,IAAI,WAAA,CAAY,OAAO;AAShC,SAAS,aAAa,IAAA,EAA0B;AACrD,EAAA,OAAO,OAAA,CAAQ,OAAO,IAAI,CAAA;AAC5B;;;ACQO,IAAM,uBAAN,MAAsD;AAAA;AAAA;AAAA;AAAA;AAAA,EAW3D,YAA6B,QAAA,EAAyB;AAAzB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAA0B;AAAA,EAV/C,QAAA,GAAW,KAAA;AAAA,EACF,aAAA,uBAAuC,GAAA,EAAI;AAAA,EAC3C,cAAA,uBAAyC,GAAA,EAAI;AAAA,EACtD,cAAA,GAA6C,IAAA;AAAA,EAC7C,gBAAA,GAA+C,IAAA;AAAA,EAQvD,QAAQ,OAAA,EAAmC;AACzC,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,IAAA,KAAS,CAAA,EAAG;AACjC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,CAAC,IAAA,KAAS;AACnD,QAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,QAAA,KAAA,MAAW,CAAA,IAAK,KAAK,aAAA,EAAe;AAClC,UAAA,CAAA,CAAE,KAAK,CAAA;AAAA,QACT;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AACA,IAAA,IAAA,CAAK,aAAA,CAAc,IAAI,OAAO,CAAA;AAE9B,IAAA,OAAO;AAAA,MACL,SAAS,MAAM;AACb,QAAA,IAAA,CAAK,aAAA,CAAc,OAAO,OAAO,CAAA;AACjC,QAAA,IAAI,IAAA,CAAK,aAAA,CAAc,IAAA,KAAS,CAAA,IAAK,KAAK,cAAA,EAAgB;AACxD,UAAA,IAAA,CAAK,eAAe,OAAA,EAAQ;AAC5B,UAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,QACxB;AAAA,MACF;AAAA,KACF;AAAA,EACF;AAAA,EAEA,SAAS,OAAA,EAAoC;AAC3C,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,IAAA,KAAS,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,CAAC,IAAA,KAAS;AACvD,QAAA,MAAM,YAAA,GAA6B;AAAA,UACjC,SAAS,IAAA,CAAK,IAAA;AAAA,UACd,MAAM,IAAA,CAAK;AAAA,SACb;AACA,QAAA,KAAA,MAAW,CAAA,IAAK,KAAK,cAAA,EAAgB;AACnC,UAAA,CAAA,CAAE,YAAY,CAAA;AAAA,QAChB;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AACA,IAAA,IAAA,CAAK,cAAA,CAAe,IAAI,OAAO,CAAA;AAE/B,IAAA,OAAO;AAAA,MACL,SAAS,MAAM;AACb,QAAA,IAAA,CAAK,cAAA,CAAe,OAAO,OAAO,CAAA;AAClC,QAAA,IAAI,IAAA,CAAK,cAAA,CAAe,IAAA,KAAS,CAAA,IAAK,KAAK,gBAAA,EAAkB;AAC3D,UAAA,IAAA,CAAK,iBAAiB,OAAA,EAAQ;AAC9B,UAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,QAC1B;AAAA,MACF;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,EAAoB;AACxB,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,MAAM,CAAA;AACpD,IAAA,IAAA,CAAK,QAAA,CAAS,MAAM,UAAU,CAAA;AAAA,EAChC;AAAA,EAEA,OAAA,GAAwB;AACtB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAK,QAAA,CAAS,IAAA;AAAA,MACvB,IAAA,EAAM,KAAK,QAAA,CAAS;AAAA,KACtB;AAAA,EACF;AAAA,EAEA,aAAA,GAAsB;AAAA,EAEtB;AAAA,EAEA,cAAA,GAAuB;AAAA,EAEvB;AAAA,EAEA,KAAA,GAAiB;AAEf,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAEhB,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,IAAA,CAAK,eAAe,OAAA,EAAQ;AAC5B,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AACA,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,IAAA,CAAK,iBAAiB,OAAA,EAAQ;AAC9B,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC1B;AAEA,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,EAC5B;AACF;;;ACtFO,IAAM,yBAAN,MAAwD;AAAA,EACpD,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EAED,QAAA,GAAW,KAAA;AAAA,EACF,cAA4B,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAM9C,YAAY,OAAA,EAAiC;AAC3C,IAAA,MAAM,eAAA,GAAkB,IAAI,oBAAA,CAAqB,OAAA,CAAQ,QAAQ,CAAA;AACjE,IAAA,MAAM,aAAA,GAAgB,IAAI,oBAAA,EAAqB;AAC/C,IAAA,MAAM,gBAAA,GAAmB,IAAI,uBAAA,EAAwB;AACrD,IAAA,MAAM,kBAAA,GAAqB,IAAI,yBAAA,CAA0B,OAAA,CAAQ,GAAG,CAAA;AACpE,IAAA,MAAM,iBAAA,GAAoB,IAAI,wBAAA,EAAyB;AACvD,IAAA,MAAM,WAAA,GAAc,IAAI,kBAAA,EAAmB;AAC3C,IAAA,MAAM,cAAA,GAAiB,IAAI,qBAAA,EAAsB;AAGjD,IAAA,MAAM,YAAA,GAA6B;AAAA,MACjC,OAAO,wBAAA,EAAyB;AAAA,MAChC,OAAA,EAAS,IAAA;AAAA,MACT,KAAA,EAAO;AAAA,KACT;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,eAAA;AAChB,IAAA,IAAA,CAAK,OAAA,GAAU,aAAA;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,gBAAA;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,kBAAA;AACnB,IAAA,IAAA,CAAK,UAAA,GAAa,iBAAA;AAClB,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,cAAA;AACf,IAAA,IAAA,CAAK,KAAA,GAAQ,YAAA;AAEb,IAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,eAAA,EAAiB,aAAa,CAAA;AAAA,EACtD;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAEhB,IAAA,KAAA,MAAW,UAAA,IAAc,KAAK,WAAA,EAAa;AACzC,MAAA,UAAA,CAAW,OAAA,EAAQ;AAAA,IACrB;AAAA,EACF;AACF;AAQO,SAAS,sBACd,OAAA,EACiB;AACjB,EAAA,OAAO,IAAI,uBAAuB,OAAO,CAAA;AAC3C","file":"index.cjs","sourcesContent":["/**\n * Pure JavaScript ANSI styling utility for terminal text.\n * Works identically in Node.js and browser/xterm.js contexts.\n */\n\nimport type { ColorSupport, StyleFn } from '../types.js'\n\n// ANSI escape codes\nconst ESC = '\\x1b['\nconst RESET = `${ESC}0m`\n\n// Modifier codes\nconst CODES = {\n // Modifiers (open, close)\n bold: ['1', '22'],\n dim: ['2', '22'],\n italic: ['3', '23'],\n underline: ['4', '24'],\n inverse: ['7', '27'],\n hidden: ['8', '28'],\n strikethrough: ['9', '29'],\n\n // Basic foreground colors (30-37)\n black: ['30', '39'],\n red: ['31', '39'],\n green: ['32', '39'],\n yellow: ['33', '39'],\n blue: ['34', '39'],\n magenta: ['35', '39'],\n cyan: ['36', '39'],\n white: ['37', '39'],\n\n // Bright foreground colors (90-97)\n blackBright: ['90', '39'],\n redBright: ['91', '39'],\n greenBright: ['92', '39'],\n yellowBright: ['93', '39'],\n blueBright: ['94', '39'],\n magentaBright: ['95', '39'],\n cyanBright: ['96', '39'],\n whiteBright: ['97', '39'],\n\n // Basic background colors (40-47)\n bgBlack: ['40', '49'],\n bgRed: ['41', '49'],\n bgGreen: ['42', '49'],\n bgYellow: ['43', '49'],\n bgBlue: ['44', '49'],\n bgMagenta: ['45', '49'],\n bgCyan: ['46', '49'],\n bgWhite: ['47', '49'],\n\n // Bright background colors (100-107)\n bgBlackBright: ['100', '49'],\n bgRedBright: ['101', '49'],\n bgGreenBright: ['102', '49'],\n bgYellowBright: ['103', '49'],\n bgBlueBright: ['104', '49'],\n bgMagentaBright: ['105', '49'],\n bgCyanBright: ['106', '49'],\n bgWhiteBright: ['107', '49'],\n} as const\n\ntype CodeName = keyof typeof CODES\n\n/**\n * Apply ANSI codes to text.\n * @param text - Text to style\n * @param open - Opening ANSI code\n * @param close - Closing ANSI code\n * @returns Styled text\n */\nfunction applyStyle(text: string, open: string, close: string): string {\n const openSeq = `${ESC}${open}m`\n const closeSeq = `${ESC}${close}m`\n\n // Replace any existing close codes with close+open to properly nest styles\n // This handles cases like style.bold(style.bold('text')) where the inner\n // bold close would prematurely end the outer bold\n const replaced = text.replace(\n new RegExp(closeSeq.replace(/[[\\](){}|^$+*?.\\\\]/g, '\\\\$&'), 'g'),\n closeSeq + openSeq,\n )\n\n return openSeq + replaced + closeSeq\n}\n\n/**\n * Convert hex color to RGB.\n * @param hex - Hex color string (with or without #)\n * @returns RGB array [r, g, b]\n */\nfunction hexToRgb(hex: string): [number, number, number] {\n const clean = hex.replace(/^#/, '')\n const num = parseInt(clean, 16)\n\n if (clean.length === 3) {\n // Short form: #RGB -> #RRGGBB\n const r = ((num >> 8) & 0xf) * 17\n const g = ((num >> 4) & 0xf) * 17\n const b = (num & 0xf) * 17\n return [r, g, b]\n }\n\n // Long form: #RRGGBB\n const r = (num >> 16) & 0xff\n const g = (num >> 8) & 0xff\n const b = num & 0xff\n return [r, g, b]\n}\n\n/**\n * Create a chainable style function.\n * @param colorSupport - Color support level information\n * @returns Chainable style function\n * @public\n */\nexport function createStyle(colorSupport: ColorSupport): StyleFn {\n const enabled = colorSupport.level > 0\n\n /**\n * Build a style function that can be chained.\n * @param stack - Array of [open, close] code pairs to apply\n * @returns Style function\n */\n function build(stack: Array<[string, string]>): StyleFn {\n // The function itself - applies all stacked styles\n const fn = (text: string): string => {\n if (!enabled || stack.length === 0) {\n return text\n }\n\n // Apply styles from inside out\n let result = text\n for (let i = stack.length - 1; i >= 0; i--) {\n const [open, close] = stack[i]!\n result = applyStyle(result, open, close)\n }\n return result\n }\n\n // Add all code-based style properties\n const codeNames = Object.keys(CODES) as CodeName[]\n for (const name of codeNames) {\n const [open, close] = CODES[name]\n Object.defineProperty(fn, name, {\n get() {\n return build([...stack, [open, close]])\n },\n })\n }\n\n // Add gray as alias for blackBright\n Object.defineProperty(fn, 'gray', {\n get() {\n const [open, close] = CODES.blackBright\n return build([...stack, [open, close]])\n },\n })\n\n // Add grey as alias for blackBright\n Object.defineProperty(fn, 'grey', {\n get() {\n const [open, close] = CODES.blackBright\n return build([...stack, [open, close]])\n },\n })\n\n // Add extended color methods\n\n // hex(color: string): StyleFn\n Object.defineProperty(fn, 'hex', {\n value: (color: string): StyleFn => {\n if (!enabled || !colorSupport.has16m) {\n return build(stack)\n }\n const [r, g, b] = hexToRgb(color)\n return build([...stack, [`38;2;${r};${g};${b}`, '39']])\n },\n writable: true,\n })\n\n // rgb(r: number, g: number, b: number): StyleFn\n Object.defineProperty(fn, 'rgb', {\n value: (r: number, g: number, b: number): StyleFn => {\n if (!enabled || !colorSupport.has16m) {\n return build(stack)\n }\n return build([...stack, [`38;2;${r};${g};${b}`, '39']])\n },\n writable: true,\n })\n\n // bgHex(color: string): StyleFn\n Object.defineProperty(fn, 'bgHex', {\n value: (color: string): StyleFn => {\n if (!enabled || !colorSupport.has16m) {\n return build(stack)\n }\n const [r, g, b] = hexToRgb(color)\n return build([...stack, [`48;2;${r};${g};${b}`, '49']])\n },\n writable: true,\n })\n\n // bgRgb(r: number, g: number, b: number): StyleFn\n Object.defineProperty(fn, 'bgRgb', {\n value: (r: number, g: number, b: number): StyleFn => {\n if (!enabled || !colorSupport.has16m) {\n return build(stack)\n }\n return build([...stack, [`48;2;${r};${g};${b}`, '49']])\n },\n writable: true,\n })\n\n // ansi256(code: number): StyleFn\n Object.defineProperty(fn, 'ansi256', {\n value: (code: number): StyleFn => {\n if (!enabled || !colorSupport.has256) {\n return build(stack)\n }\n return build([...stack, [`38;5;${code}`, '39']])\n },\n writable: true,\n })\n\n // bgAnsi256(code: number): StyleFn\n Object.defineProperty(fn, 'bgAnsi256', {\n value: (code: number): StyleFn => {\n if (!enabled || !colorSupport.has256) {\n return build(stack)\n }\n return build([...stack, [`48;5;${code}`, '49']])\n },\n writable: true,\n })\n\n return fn as StyleFn\n }\n\n return build([])\n}\n\n/**\n * Create a style function that always applies colors (for xterm.js).\n * @returns Chainable style function with full color support\n * @public\n */\nexport function createAlwaysEnabledStyle(): StyleFn {\n return createStyle({ level: 3, hasBasic: true, has256: true, has16m: true })\n}\n","/**\n * Browser archive adapter (not available).\n */\n\nimport type { ArchiveAdapter } from '../types.js'\n\n/**\n * Browser implementation of ArchiveAdapter.\n * Archive operations are not available in browser environments.\n * @public\n */\nexport class BrowserArchiveAdapter implements ArchiveAdapter {\n /**\n * Check if archive operations are available.\n * @returns Always false in browser environments\n */\n isAvailable(): boolean {\n return false\n }\n\n /**\n * Create a zip archive from a directory.\n * @param _sourceDir - Source directory to archive\n * @param _destPath - Destination path for the zip file\n * @throws Error - Always throws as archiving is not available in browser\n */\n async zip(_sourceDir: string, _destPath: string): Promise<void> {\n throw new Error('Archive operations not available in browser environment')\n }\n\n /**\n * Extract a zip archive to a directory.\n * @param _archivePath - Path to the zip file\n * @param _destDir - Destination directory for extraction\n * @throws Error - Always throws as archiving is not available in browser\n */\n async unzip(_archivePath: string, _destDir: string): Promise<void> {\n throw new Error('Archive operations not available in browser environment')\n }\n}\n","import type { ClipboardAdapter } from '../types.js'\n\n/**\n * Browser clipboard adapter using the Clipboard API.\n * Falls back gracefully when the API is not available.\n * @public\n */\nexport class BrowserClipboardAdapter implements ClipboardAdapter {\n async read(): Promise<string> {\n if (!this.isAvailable()) {\n throw new Error('Clipboard API not available')\n }\n\n try {\n return await navigator.clipboard.readText()\n } catch (error) {\n // The Clipboard API may throw if permission is denied\n throw new Error(\n `Failed to read from clipboard: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n async write(text: string): Promise<void> {\n if (!this.isAvailable()) {\n throw new Error('Clipboard API not available')\n }\n\n try {\n await navigator.clipboard.writeText(text)\n } catch (error) {\n // The Clipboard API may throw if permission is denied\n throw new Error(\n `Failed to write to clipboard: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n isAvailable(): boolean {\n return (\n typeof navigator !== 'undefined' &&\n typeof navigator.clipboard !== 'undefined' &&\n typeof navigator.clipboard.readText === 'function' &&\n typeof navigator.clipboard.writeText === 'function'\n )\n }\n}\n","import type {\n ColorSupport,\n EnvironmentAdapter,\n TerminalBackground,\n} from '../types.js'\n\n/**\n * Browser environment adapter.\n * Provides sensible defaults for browser environments.\n * @public\n */\nexport class BrowserEnvironmentAdapter implements EnvironmentAdapter {\n private readonly envOverrides: Map<string, string>\n private colorSupportCached: ColorSupport | null = null\n private backgroundCached: TerminalBackground | null = null\n\n /**\n * Create a new browser environment adapter.\n * @param envOverrides - Optional environment variable overrides\n */\n constructor(envOverrides: Record<string, string> = {}) {\n this.envOverrides = new Map(Object.entries(envOverrides))\n }\n\n get(name: string): string | undefined {\n // Check overrides first\n if (this.envOverrides.has(name)) {\n return this.envOverrides.get(name)\n }\n\n // In browsers, environment variables are not available\n return undefined\n }\n\n /**\n * Set an environment variable override.\n * @param name - Variable name\n * @param value - Variable value\n */\n set(name: string, value: string): void {\n this.envOverrides.set(name, value)\n // Clear caches that depend on env vars\n this.colorSupportCached = null\n this.backgroundCached = null\n }\n\n getColorSupport(): ColorSupport {\n if (this.colorSupportCached) {\n return this.colorSupportCached\n }\n\n // Modern browsers and xterm.js support true color\n const support: ColorSupport = {\n level: 3,\n hasBasic: true,\n has256: true,\n has16m: true,\n }\n\n this.colorSupportCached = support\n return support\n }\n\n getTerminalBackground(): TerminalBackground {\n if (this.backgroundCached) {\n return this.backgroundCached\n }\n\n // Check for overrides\n const override = this.envOverrides.get('TERM_BACKGROUND')?.toLowerCase()\n if (override === 'dark' || override === 'light') {\n this.backgroundCached = override\n return override\n }\n\n // Try to detect from CSS media query\n if (typeof window !== 'undefined' && window.matchMedia) {\n const darkQuery = window.matchMedia('(prefers-color-scheme: dark)')\n if (darkQuery.matches) {\n this.backgroundCached = 'dark'\n return 'dark'\n }\n\n const lightQuery = window.matchMedia('(prefers-color-scheme: light)')\n if (lightQuery.matches) {\n this.backgroundCached = 'light'\n return 'light'\n }\n }\n\n this.backgroundCached = 'unknown'\n return 'unknown'\n }\n}\n","import type { DirectoryEntry, FileStat, FileSystemAdapter } from '../types.js'\n\n/**\n * Browser filesystem adapter.\n * Throws errors for all filesystem operations as browsers do not have filesystem access.\n * This adapter exists for API compatibility but should not be used in browser environments.\n * @public\n */\nexport class BrowserFileSystemAdapter implements FileSystemAdapter {\n async readdir(_path: string, _options?: { withFileTypes?: boolean }): Promise<DirectoryEntry[] | string[]> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n async stat(_path: string): Promise<FileStat> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n async readFile(_path: string, _encoding?: string): Promise<string> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n async writeFile(_path: string, _content: string): Promise<void> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n async exists(_path: string): Promise<boolean> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n async mkdir(_path: string, _options?: { recursive?: boolean }): Promise<void> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n async unlink(_path: string): Promise<void> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n async rmdir(_path: string, _options?: { recursive?: boolean; force?: boolean }): Promise<void> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n async rename(_src: string, _dst: string): Promise<void> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n async copyFile(_src: string, _dst: string): Promise<void> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n cwd(): string {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n homedir(): string {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n}\n","import type { PathAdapter } from '../types.js'\n\n/**\n * Browser path adapter.\n * Pure JavaScript implementation of POSIX-style path operations for browsers.\n * Always uses forward slashes (/) as path separator.\n * @public\n */\nexport class BrowserPathAdapter implements PathAdapter {\n readonly sep = '/'\n\n join(...segments: string[]): string {\n if (segments.length === 0) {\n return '.'\n }\n\n // Filter out empty segments and join with separator\n const filtered = segments.filter((seg) => seg.length > 0)\n if (filtered.length === 0) {\n return '.'\n }\n\n const joined = filtered.join('/')\n // Use normalizeForResolve to strip trailing slashes (join should not preserve them)\n return this.normalizeForResolve(joined)\n }\n\n dirname(path: string): string {\n if (path.length === 0) {\n return '.'\n }\n\n // Remove trailing slashes\n const trimmed = path.replace(/\\/+$/, '')\n if (trimmed.length === 0) {\n return '/'\n }\n\n // Find last slash\n const lastSlash = trimmed.lastIndexOf('/')\n if (lastSlash === -1) {\n return '.'\n }\n\n if (lastSlash === 0) {\n return '/'\n }\n\n return trimmed.slice(0, lastSlash)\n }\n\n basename(path: string, ext?: string): string {\n if (path.length === 0) {\n return ''\n }\n\n // Remove trailing slashes\n const trimmed = path.replace(/\\/+$/, '')\n if (trimmed.length === 0) {\n return ''\n }\n\n // Find last slash\n const lastSlash = trimmed.lastIndexOf('/')\n let base = lastSlash === -1 ? trimmed : trimmed.slice(lastSlash + 1)\n\n // Remove extension if provided and matches\n if (ext && base.endsWith(ext)) {\n base = base.slice(0, -ext.length)\n }\n\n return base\n }\n\n extname(path: string): string {\n if (path.length === 0) {\n return ''\n }\n\n const base = this.basename(path)\n const lastDot = base.lastIndexOf('.')\n\n // No extension if:\n // - No dot found\n // - Dot is first character (hidden file like .gitignore)\n // - Dot is last character (file ending in dot)\n if (lastDot === -1 || lastDot === 0 || lastDot === base.length - 1) {\n return ''\n }\n\n return base.slice(lastDot)\n }\n\n resolve(...segments: string[]): string {\n let resolvedPath = ''\n let resolvedAbsolute = false\n\n // Process segments from right to left\n for (let i = segments.length - 1; i >= 0 && !resolvedAbsolute; i--) {\n const segment = segments[i]\n if (!segment || segment.length === 0) {\n continue\n }\n\n resolvedPath = resolvedPath.length > 0 ? `${segment}/${resolvedPath}` : segment\n resolvedAbsolute = segment[0] === '/'\n }\n\n // If still not absolute, prepend current working directory (/)\n if (!resolvedAbsolute) {\n resolvedPath = resolvedPath.length > 0 ? `/${resolvedPath}` : '/'\n }\n\n // Normalize the path\n const normalized = this.normalizeForResolve(resolvedPath)\n return normalized === '' ? '/' : normalized\n }\n\n /**\n * Normalize path specifically for resolve (never preserves trailing slash).\n * @param path - Path to normalize\n * @returns Normalized path without trailing slash\n */\n private normalizeForResolve(path: string): string {\n if (path.length === 0) {\n return '/'\n }\n\n const isAbsolute = path[0] === '/'\n\n // Split into segments and process\n const segments = path.split('/').filter((seg) => seg.length > 0 && seg !== '.')\n const normalized: string[] = []\n\n for (const segment of segments) {\n if (segment === '..') {\n // Go up one level if possible\n if (normalized.length > 0 && normalized[normalized.length - 1] !== '..') {\n normalized.pop()\n } else if (!isAbsolute) {\n // Can only add .. if not absolute path\n normalized.push('..')\n }\n } else {\n normalized.push(segment)\n }\n }\n\n let result = normalized.join('/')\n\n // Add prefix\n if (isAbsolute) {\n result = `/${result}`\n } else if (result.length === 0) {\n result = '.'\n }\n\n return result\n }\n\n isAbsolute(path: string): boolean {\n return path.length > 0 && path[0] === '/'\n }\n\n normalize(path: string): string {\n if (path.length === 0) {\n return '.'\n }\n\n const isAbsolute = path[0] === '/'\n const trailingSlash = path[path.length - 1] === '/'\n\n // Split into segments and process\n const segments = path.split('/').filter((seg) => seg.length > 0 && seg !== '.')\n const normalized: string[] = []\n\n for (const segment of segments) {\n if (segment === '..') {\n // Go up one level if possible\n if (normalized.length > 0 && normalized[normalized.length - 1] !== '..') {\n normalized.pop()\n } else if (!isAbsolute) {\n // Can only add .. if not absolute path\n normalized.push('..')\n }\n } else {\n normalized.push(segment)\n }\n }\n\n let result = normalized.join('/')\n\n // Add prefix\n if (isAbsolute) {\n result = `/${result}`\n } else if (result.length === 0) {\n result = '.'\n }\n\n // Preserve trailing slash for directories (except for root)\n if (trailingSlash && result !== '/' && result.length > 0) {\n result += '/'\n }\n\n return result\n }\n}\n","import type { Disposable, SignalAdapter, SignalHandler } from '../types.js'\n\n/**\n * Browser signal adapter using window events.\n * Maps browser events to the signal interface:\n * - beforeunload -\\> interrupt\n * - pagehide -\\> terminate\n * @public\n */\nexport class BrowserSignalAdapter implements SignalAdapter {\n private readonly interruptHandlers: Set<SignalHandler> = new Set()\n private readonly terminateHandlers: Set<SignalHandler> = new Set()\n private disposed = false\n private boundBeforeUnload: ((e: BeforeUnloadEvent) => void) | null = null\n private boundPageHide: (() => void) | null = null\n\n private handleBeforeUnload = (e: BeforeUnloadEvent): void => {\n for (const handler of this.interruptHandlers) {\n handler()\n }\n // Prevent the unload to allow handlers to run\n // This may show a confirmation dialog in some browsers\n if (this.interruptHandlers.size > 0) {\n e.preventDefault()\n }\n }\n\n private handlePageHide = (): void => {\n for (const handler of this.terminateHandlers) {\n handler()\n }\n }\n\n onInterrupt(handler: SignalHandler): Disposable {\n if (this.interruptHandlers.size === 0 && typeof window !== 'undefined') {\n this.boundBeforeUnload = this.handleBeforeUnload\n window.addEventListener('beforeunload', this.boundBeforeUnload)\n }\n this.interruptHandlers.add(handler)\n\n return {\n dispose: () => {\n this.interruptHandlers.delete(handler)\n if (\n this.interruptHandlers.size === 0 &&\n this.boundBeforeUnload &&\n typeof window !== 'undefined'\n ) {\n window.removeEventListener('beforeunload', this.boundBeforeUnload)\n this.boundBeforeUnload = null\n }\n },\n }\n }\n\n onTerminate(handler: SignalHandler): Disposable {\n if (this.terminateHandlers.size === 0 && typeof window !== 'undefined') {\n this.boundPageHide = this.handlePageHide\n window.addEventListener('pagehide', this.boundPageHide)\n }\n this.terminateHandlers.add(handler)\n\n return {\n dispose: () => {\n this.terminateHandlers.delete(handler)\n if (\n this.terminateHandlers.size === 0 &&\n this.boundPageHide &&\n typeof window !== 'undefined'\n ) {\n window.removeEventListener('pagehide', this.boundPageHide)\n this.boundPageHide = null\n }\n },\n }\n }\n\n dispose(): void {\n if (this.disposed) {\n return\n }\n this.disposed = true\n\n if (typeof window !== 'undefined') {\n if (this.boundBeforeUnload) {\n window.removeEventListener('beforeunload', this.boundBeforeUnload)\n }\n if (this.boundPageHide) {\n window.removeEventListener('pagehide', this.boundPageHide)\n }\n }\n\n this.interruptHandlers.clear()\n this.terminateHandlers.clear()\n }\n}\n","/**\n * Platform-agnostic byte utilities using Uint8Array.\n * These replace Node.js Buffer operations for cross-platform compatibility.\n */\n\n/** Shared TextEncoder instance for string encoding. */\nconst encoder = new TextEncoder()\n\n/** Shared TextDecoder instance for string decoding. */\nconst decoder = new TextDecoder('utf-8')\n\n/**\n * Encode a string to UTF-8 bytes.\n * Equivalent to `Buffer.from(text, 'utf8')`.\n * @param text - String to encode\n * @returns UTF-8 encoded bytes\n * @public\n */\nexport function encodeString(text: string): Uint8Array {\n return encoder.encode(text)\n}\n\n/**\n * Decode UTF-8 bytes to a string.\n * Equivalent to `buffer.toString('utf8')`.\n * @param bytes - Bytes to decode\n * @returns Decoded string\n * @public\n */\nexport function decodeString(bytes: Uint8Array): string {\n return decoder.decode(bytes)\n}\n\n/**\n * Get the byte length of a string when encoded as UTF-8.\n * Equivalent to `Buffer.byteLength(text, 'utf8')`.\n * @param text - String to measure\n * @returns Byte length\n * @public\n */\nexport function byteLength(text: string): number {\n return encoder.encode(text).length\n}\n\n/**\n * Concatenate multiple Uint8Arrays into one.\n * Equivalent to `Buffer.concat(arrays)`.\n * @param arrays - Arrays to concatenate\n * @returns Combined array\n * @public\n */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0)\n const result = new Uint8Array(totalLength)\n let offset = 0\n for (const arr of arrays) {\n result.set(arr, offset)\n offset += arr.length\n }\n return result\n}\n\n/**\n * Create a new Uint8Array of the specified size, filled with zeros.\n * Equivalent to `Buffer.alloc(size)`.\n * @param size - Size of the array\n * @returns New zero-filled array\n * @public\n */\nexport function allocBytes(size: number): Uint8Array {\n return new Uint8Array(size)\n}\n\n/**\n * Create a Uint8Array from an array of byte values.\n * Equivalent to `Buffer.from([...])`.\n * @param values - Byte values (0-255)\n * @returns New Uint8Array\n * @public\n */\nexport function fromBytes(values: number[]): Uint8Array {\n return new Uint8Array(values)\n}\n\n/**\n * Compare two Uint8Arrays for equality.\n * Equivalent to `buffer1.equals(buffer2)`.\n * @param a - First array\n * @param b - Second array\n * @returns True if arrays are equal\n * @public\n */\nexport function bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) {\n return false\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false\n }\n }\n return true\n}\n\n/**\n * Check if a byte array starts with a specific prefix.\n * @param bytes - Array to check\n * @param prefix - Prefix to look for\n * @returns True if bytes starts with prefix\n * @public\n */\nexport function startsWith(bytes: Uint8Array, prefix: Uint8Array): boolean {\n if (bytes.length < prefix.length) {\n return false\n }\n for (let i = 0; i < prefix.length; i++) {\n if (bytes[i] !== prefix[i]) {\n return false\n }\n }\n return true\n}\n\n/**\n * Check if a byte array starts with a specific string (UTF-8 encoded).\n * @param bytes - Array to check\n * @param prefix - String prefix to look for\n * @returns True if bytes starts with the encoded prefix\n * @public\n */\nexport function startsWithString(bytes: Uint8Array, prefix: string): boolean {\n return startsWith(bytes, encodeString(prefix))\n}\n\n/**\n * Find the index of a substring within a byte array.\n * Returns -1 if not found.\n * @param bytes - Array to search\n * @param needle - String to find\n * @param fromIndex - Start index (default 0)\n * @returns Index of first occurrence or -1\n * @public\n */\nexport function indexOfString(\n bytes: Uint8Array,\n needle: string,\n fromIndex: number = 0,\n): number {\n const needleBytes = encodeString(needle)\n const endIndex = bytes.length - needleBytes.length\n\n outer: for (let i = fromIndex; i <= endIndex; i++) {\n for (let j = 0; j < needleBytes.length; j++) {\n if (bytes[i + j] !== needleBytes[j]) {\n continue outer\n }\n }\n return i\n }\n return -1\n}\n\n/**\n * Decode the first complete UTF-8 character from a byte array.\n * Returns the character and its byte length, or null if incomplete.\n * @param bytes - Byte array to decode\n * @param offset - Start offset (default 0)\n * @returns Tuple of [character, byteLength] or [null, 0] if incomplete\n * @public\n */\nexport function decodeFirstRune(\n bytes: Uint8Array,\n offset: number = 0,\n): [string | null, number] {\n if (offset >= bytes.length) {\n return [null, 0]\n }\n\n const firstByte = bytes[offset]\n if (firstByte === undefined) {\n return [null, 0]\n }\n\n // Determine the byte length of this UTF-8 character\n let byteLen: number\n if ((firstByte & 0x80) === 0) {\n // Single byte character (ASCII)\n byteLen = 1\n } else if ((firstByte & 0xe0) === 0xc0) {\n // Two byte character\n byteLen = 2\n } else if ((firstByte & 0xf0) === 0xe0) {\n // Three byte character\n byteLen = 3\n } else if ((firstByte & 0xf8) === 0xf0) {\n // Four byte character\n byteLen = 4\n } else {\n // Invalid UTF-8 start byte, treat as single byte\n byteLen = 1\n }\n\n // Check if we have enough bytes\n if (offset + byteLen > bytes.length) {\n return [null, 0]\n }\n\n // Decode the character\n const slice = bytes.subarray(offset, offset + byteLen)\n const decoded = decoder.decode(slice)\n\n if (decoded.length === 0) {\n return [null, 0]\n }\n\n // Use codePointAt to properly handle surrogate pairs (emoji, etc.)\n // This returns the full Unicode code point, not just the first surrogate\n const codePoint = decoded.codePointAt(0)\n if (codePoint === undefined) {\n return [null, 0]\n }\n\n // Convert the code point back to a string (handles surrogate pairs correctly)\n const firstChar = String.fromCodePoint(codePoint)\n\n return [firstChar, byteLen]\n}\n\n/**\n * Slice a portion of a byte array.\n * Equivalent to `buffer.subarray(start, end)`.\n * @param bytes - Source array\n * @param start - Start index\n * @param end - End index (optional, defaults to length)\n * @returns New Uint8Array view of the slice\n * @public\n */\nexport function sliceBytes(\n bytes: Uint8Array,\n start: number,\n end?: number,\n): Uint8Array {\n return bytes.subarray(start, end)\n}\n\n/**\n * Create a copy of a byte array.\n * @param bytes - Array to copy\n * @returns New Uint8Array with copied data\n * @public\n */\nexport function copyBytes(bytes: Uint8Array): Uint8Array {\n return new Uint8Array(bytes)\n}\n","import { encodeString } from '../bytes.js'\nimport type {\n Disposable,\n InputHandler,\n ResizeHandler,\n TerminalAdapter,\n TerminalSize,\n} from '../types.js'\n\n/**\n * Minimal xterm.js Terminal interface.\n * This matches the core xterm.js API we need.\n * @public\n */\nexport interface XtermTerminal {\n readonly cols: number\n readonly rows: number\n write(data: string): void\n onData(listener: (data: string) => void): { dispose(): void }\n onResize(listener: (size: { cols: number; rows: number }) => void): {\n dispose(): void\n }\n}\n\n/**\n * Browser terminal adapter using xterm.js.\n * @public\n */\nexport class XtermTerminalAdapter implements TerminalAdapter {\n private disposed = false\n private readonly inputHandlers: Set<InputHandler> = new Set()\n private readonly resizeHandlers: Set<ResizeHandler> = new Set()\n private dataDisposable: { dispose(): void } | null = null\n private resizeDisposable: { dispose(): void } | null = null\n\n /**\n * Create a new xterm.js terminal adapter.\n * @param terminal - xterm.js Terminal instance\n */\n constructor(private readonly terminal: XtermTerminal) {}\n\n onInput(handler: InputHandler): Disposable {\n if (this.inputHandlers.size === 0) {\n this.dataDisposable = this.terminal.onData((data) => {\n const bytes = encodeString(data)\n for (const h of this.inputHandlers) {\n h(bytes)\n }\n })\n }\n this.inputHandlers.add(handler)\n\n return {\n dispose: () => {\n this.inputHandlers.delete(handler)\n if (this.inputHandlers.size === 0 && this.dataDisposable) {\n this.dataDisposable.dispose()\n this.dataDisposable = null\n }\n },\n }\n }\n\n onResize(handler: ResizeHandler): Disposable {\n if (this.resizeHandlers.size === 0) {\n this.resizeDisposable = this.terminal.onResize((size) => {\n const terminalSize: TerminalSize = {\n columns: size.cols,\n rows: size.rows,\n }\n for (const h of this.resizeHandlers) {\n h(terminalSize)\n }\n })\n }\n this.resizeHandlers.add(handler)\n\n return {\n dispose: () => {\n this.resizeHandlers.delete(handler)\n if (this.resizeHandlers.size === 0 && this.resizeDisposable) {\n this.resizeDisposable.dispose()\n this.resizeDisposable = null\n }\n },\n }\n }\n\n write(data: string): void {\n if (data.length === 0) {\n return\n }\n // Convert lone \\n to \\r\\n for proper terminal line handling\n // xterm.js requires \\r\\n for carriage return + line feed\n const normalized = data.replace(/(?<!\\r)\\n/g, '\\r\\n')\n this.terminal.write(normalized)\n }\n\n getSize(): TerminalSize {\n return {\n columns: this.terminal.cols,\n rows: this.terminal.rows,\n }\n }\n\n enableRawMode(): void {\n // xterm.js is always in \"raw mode\" - no action needed\n }\n\n disableRawMode(): void {\n // xterm.js is always in \"raw mode\" - no action needed\n }\n\n isTTY(): boolean {\n // xterm.js is always a TTY\n return true\n }\n\n dispose(): void {\n if (this.disposed) {\n return\n }\n this.disposed = true\n\n if (this.dataDisposable) {\n this.dataDisposable.dispose()\n this.dataDisposable = null\n }\n if (this.resizeDisposable) {\n this.resizeDisposable.dispose()\n this.resizeDisposable = null\n }\n\n this.inputHandlers.clear()\n this.resizeHandlers.clear()\n }\n}\n","/**\n * Browser platform adapters for \\@boba-cli/machine.\n * @packageDocumentation\n */\n\nimport type {\n ArchiveAdapter,\n ClipboardAdapter,\n Disposable,\n EnvironmentAdapter,\n FileSystemAdapter,\n PathAdapter,\n PlatformAdapter,\n SignalAdapter,\n StyleAdapter,\n TerminalAdapter,\n} from '../types.js'\nimport { createAlwaysEnabledStyle } from '../style/index.js'\nimport { BrowserArchiveAdapter } from './archive.js'\nimport { BrowserClipboardAdapter } from './clipboard.js'\nimport { BrowserEnvironmentAdapter } from './environment.js'\nimport { BrowserFileSystemAdapter } from './filesystem.js'\nimport { BrowserPathAdapter } from './path.js'\nimport { BrowserSignalAdapter } from './signals.js'\nimport { XtermTerminalAdapter, type XtermTerminal } from './terminal.js'\n\nexport { BrowserArchiveAdapter } from './archive.js'\nexport { BrowserClipboardAdapter } from './clipboard.js'\nexport { BrowserEnvironmentAdapter } from './environment.js'\nexport { BrowserFileSystemAdapter } from './filesystem.js'\nexport { BrowserPathAdapter } from './path.js'\nexport { BrowserSignalAdapter } from './signals.js'\nexport { XtermTerminalAdapter, type XtermTerminal } from './terminal.js'\n\n/**\n * Options for creating a browser platform adapter.\n * @public\n */\nexport interface BrowserPlatformOptions {\n /** xterm.js Terminal instance (required). */\n terminal: XtermTerminal\n /** Environment variable overrides. */\n env?: Record<string, string>\n}\n\n/**\n * Complete browser platform adapter.\n * Combines xterm.js terminal, browser signals, clipboard, environment, filesystem, path, archive, and style adapters.\n * @public\n */\nexport class BrowserPlatformAdapter implements PlatformAdapter {\n readonly terminal: TerminalAdapter\n readonly signals: SignalAdapter\n readonly clipboard: ClipboardAdapter\n readonly environment: EnvironmentAdapter\n readonly filesystem: FileSystemAdapter\n readonly path: PathAdapter\n readonly archive: ArchiveAdapter\n readonly style: StyleAdapter\n\n private disposed = false\n private readonly disposables: Disposable[] = []\n\n /**\n * Create a new browser platform adapter.\n * @param options - Configuration options (requires xterm.js Terminal)\n */\n constructor(options: BrowserPlatformOptions) {\n const terminalAdapter = new XtermTerminalAdapter(options.terminal)\n const signalAdapter = new BrowserSignalAdapter()\n const clipboardAdapter = new BrowserClipboardAdapter()\n const environmentAdapter = new BrowserEnvironmentAdapter(options.env)\n const filesystemAdapter = new BrowserFileSystemAdapter()\n const pathAdapter = new BrowserPathAdapter()\n const archiveAdapter = new BrowserArchiveAdapter()\n\n // Browser/xterm.js always supports full colors\n const styleAdapter: StyleAdapter = {\n style: createAlwaysEnabledStyle(),\n enabled: true,\n level: 3,\n }\n\n this.terminal = terminalAdapter\n this.signals = signalAdapter\n this.clipboard = clipboardAdapter\n this.environment = environmentAdapter\n this.filesystem = filesystemAdapter\n this.path = pathAdapter\n this.archive = archiveAdapter\n this.style = styleAdapter\n\n this.disposables.push(terminalAdapter, signalAdapter)\n }\n\n dispose(): void {\n if (this.disposed) {\n return\n }\n this.disposed = true\n\n for (const disposable of this.disposables) {\n disposable.dispose()\n }\n }\n}\n\n/**\n * Create a browser platform adapter with xterm.js.\n * @param options - Configuration options\n * @returns A new platform adapter\n * @public\n */\nexport function createBrowserPlatform(\n options: BrowserPlatformOptions,\n): PlatformAdapter {\n return new BrowserPlatformAdapter(options)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/style/index.ts","../../src/browser/archive.ts","../../src/browser/clipboard.ts","../../src/browser/environment.ts","../../src/browser/filesystem.ts","../../src/browser/path.ts","../../src/browser/signals.ts","../../src/bytes.ts","../../src/browser/terminal.ts","../../src/browser/index.ts"],"names":["r","g","b"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Pure JavaScript ANSI styling utility for terminal text.\n * Works identically in Node.js and browser/xterm.js contexts.\n */\n\nimport type { ColorSupport, StyleFn } from '../types.js'\n\n// ANSI escape codes\nconst ESC = '\\x1b['\nconst RESET = `${ESC}0m`\n\n// Modifier codes\nconst CODES = {\n // Modifiers (open, close)\n bold: ['1', '22'],\n dim: ['2', '22'],\n italic: ['3', '23'],\n underline: ['4', '24'],\n inverse: ['7', '27'],\n hidden: ['8', '28'],\n strikethrough: ['9', '29'],\n\n // Basic foreground colors (30-37)\n black: ['30', '39'],\n red: ['31', '39'],\n green: ['32', '39'],\n yellow: ['33', '39'],\n blue: ['34', '39'],\n magenta: ['35', '39'],\n cyan: ['36', '39'],\n white: ['37', '39'],\n\n // Bright foreground colors (90-97)\n blackBright: ['90', '39'],\n redBright: ['91', '39'],\n greenBright: ['92', '39'],\n yellowBright: ['93', '39'],\n blueBright: ['94', '39'],\n magentaBright: ['95', '39'],\n cyanBright: ['96', '39'],\n whiteBright: ['97', '39'],\n\n // Basic background colors (40-47)\n bgBlack: ['40', '49'],\n bgRed: ['41', '49'],\n bgGreen: ['42', '49'],\n bgYellow: ['43', '49'],\n bgBlue: ['44', '49'],\n bgMagenta: ['45', '49'],\n bgCyan: ['46', '49'],\n bgWhite: ['47', '49'],\n\n // Bright background colors (100-107)\n bgBlackBright: ['100', '49'],\n bgRedBright: ['101', '49'],\n bgGreenBright: ['102', '49'],\n bgYellowBright: ['103', '49'],\n bgBlueBright: ['104', '49'],\n bgMagentaBright: ['105', '49'],\n bgCyanBright: ['106', '49'],\n bgWhiteBright: ['107', '49'],\n} as const\n\ntype CodeName = keyof typeof CODES\n\n/**\n * Apply ANSI codes to text.\n * @param text - Text to style\n * @param open - Opening ANSI code\n * @param close - Closing ANSI code\n * @returns Styled text\n */\nfunction applyStyle(text: string, open: string, close: string): string {\n const openSeq = `${ESC}${open}m`\n const closeSeq = `${ESC}${close}m`\n\n // Replace any existing close codes with close+open to properly nest styles\n // This handles cases like style.bold(style.bold('text')) where the inner\n // bold close would prematurely end the outer bold\n const replaced = text.replace(\n new RegExp(closeSeq.replace(/[[\\](){}|^$+*?.\\\\]/g, '\\\\$&'), 'g'),\n closeSeq + openSeq,\n )\n\n return openSeq + replaced + closeSeq\n}\n\n/**\n * Convert hex color to RGB.\n * @param hex - Hex color string (with or without #)\n * @returns RGB array [r, g, b]\n */\nfunction hexToRgb(hex: string): [number, number, number] {\n const clean = hex.replace(/^#/, '')\n const num = parseInt(clean, 16)\n\n if (clean.length === 3) {\n // Short form: #RGB -> #RRGGBB\n const r = ((num >> 8) & 0xf) * 17\n const g = ((num >> 4) & 0xf) * 17\n const b = (num & 0xf) * 17\n return [r, g, b]\n }\n\n // Long form: #RRGGBB\n const r = (num >> 16) & 0xff\n const g = (num >> 8) & 0xff\n const b = num & 0xff\n return [r, g, b]\n}\n\n/**\n * Create a chainable style function.\n * @param colorSupport - Color support level information\n * @returns Chainable style function\n * @public\n */\nexport function createStyle(colorSupport: ColorSupport): StyleFn {\n const enabled = colorSupport.level > 0\n\n /**\n * Build a style function that can be chained.\n * @param stack - Array of [open, close] code pairs to apply\n * @returns Style function\n */\n function build(stack: Array<[string, string]>): StyleFn {\n // The function itself - applies all stacked styles\n const fn = (text: string): string => {\n if (!enabled || stack.length === 0) {\n return text\n }\n\n // Apply styles from inside out\n let result = text\n for (let i = stack.length - 1; i >= 0; i--) {\n const [open, close] = stack[i]!\n result = applyStyle(result, open, close)\n }\n return result\n }\n\n // Add all code-based style properties\n const codeNames = Object.keys(CODES) as CodeName[]\n for (const name of codeNames) {\n const [open, close] = CODES[name]\n Object.defineProperty(fn, name, {\n get() {\n return build([...stack, [open, close]])\n },\n })\n }\n\n // Add gray as alias for blackBright\n Object.defineProperty(fn, 'gray', {\n get() {\n const [open, close] = CODES.blackBright\n return build([...stack, [open, close]])\n },\n })\n\n // Add grey as alias for blackBright\n Object.defineProperty(fn, 'grey', {\n get() {\n const [open, close] = CODES.blackBright\n return build([...stack, [open, close]])\n },\n })\n\n // Add extended color methods\n\n // hex(color: string): StyleFn\n Object.defineProperty(fn, 'hex', {\n value: (color: string): StyleFn => {\n if (!enabled || !colorSupport.has16m) {\n return build(stack)\n }\n const [r, g, b] = hexToRgb(color)\n return build([...stack, [`38;2;${r};${g};${b}`, '39']])\n },\n writable: true,\n })\n\n // rgb(r: number, g: number, b: number): StyleFn\n Object.defineProperty(fn, 'rgb', {\n value: (r: number, g: number, b: number): StyleFn => {\n if (!enabled || !colorSupport.has16m) {\n return build(stack)\n }\n return build([...stack, [`38;2;${r};${g};${b}`, '39']])\n },\n writable: true,\n })\n\n // bgHex(color: string): StyleFn\n Object.defineProperty(fn, 'bgHex', {\n value: (color: string): StyleFn => {\n if (!enabled || !colorSupport.has16m) {\n return build(stack)\n }\n const [r, g, b] = hexToRgb(color)\n return build([...stack, [`48;2;${r};${g};${b}`, '49']])\n },\n writable: true,\n })\n\n // bgRgb(r: number, g: number, b: number): StyleFn\n Object.defineProperty(fn, 'bgRgb', {\n value: (r: number, g: number, b: number): StyleFn => {\n if (!enabled || !colorSupport.has16m) {\n return build(stack)\n }\n return build([...stack, [`48;2;${r};${g};${b}`, '49']])\n },\n writable: true,\n })\n\n // ansi256(code: number): StyleFn\n Object.defineProperty(fn, 'ansi256', {\n value: (code: number): StyleFn => {\n if (!enabled || !colorSupport.has256) {\n return build(stack)\n }\n return build([...stack, [`38;5;${code}`, '39']])\n },\n writable: true,\n })\n\n // bgAnsi256(code: number): StyleFn\n Object.defineProperty(fn, 'bgAnsi256', {\n value: (code: number): StyleFn => {\n if (!enabled || !colorSupport.has256) {\n return build(stack)\n }\n return build([...stack, [`48;5;${code}`, '49']])\n },\n writable: true,\n })\n\n return fn as StyleFn\n }\n\n return build([])\n}\n\n/**\n * Create a style function that always applies colors (for xterm.js).\n * @returns Chainable style function with full color support\n * @public\n */\nexport function createAlwaysEnabledStyle(): StyleFn {\n return createStyle({ level: 3, hasBasic: true, has256: true, has16m: true })\n}\n","/**\n * Browser archive adapter (not available).\n */\n\nimport type { ArchiveAdapter } from '../types.js'\n\n/**\n * Browser implementation of ArchiveAdapter.\n * Archive operations are not available in browser environments.\n * @public\n */\nexport class BrowserArchiveAdapter implements ArchiveAdapter {\n /**\n * Check if archive operations are available.\n * @returns Always false in browser environments\n */\n isAvailable(): boolean {\n return false\n }\n\n /**\n * Create a zip archive from a directory.\n * @param _sourceDir - Source directory to archive\n * @param _destPath - Destination path for the zip file\n * @throws Error - Always throws as archiving is not available in browser\n */\n async zip(_sourceDir: string, _destPath: string): Promise<void> {\n throw new Error('Archive operations not available in browser environment')\n }\n\n /**\n * Extract a zip archive to a directory.\n * @param _archivePath - Path to the zip file\n * @param _destDir - Destination directory for extraction\n * @throws Error - Always throws as archiving is not available in browser\n */\n async unzip(_archivePath: string, _destDir: string): Promise<void> {\n throw new Error('Archive operations not available in browser environment')\n }\n}\n","import type { ClipboardAdapter } from '../types.js'\n\n/**\n * Browser clipboard adapter using the Clipboard API.\n * Falls back gracefully when the API is not available.\n * @public\n */\nexport class BrowserClipboardAdapter implements ClipboardAdapter {\n async read(): Promise<string> {\n if (!this.isAvailable()) {\n throw new Error('Clipboard API not available')\n }\n\n try {\n return await navigator.clipboard.readText()\n } catch (error) {\n // The Clipboard API may throw if permission is denied\n throw new Error(\n `Failed to read from clipboard: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n async write(text: string): Promise<void> {\n if (!this.isAvailable()) {\n throw new Error('Clipboard API not available')\n }\n\n try {\n await navigator.clipboard.writeText(text)\n } catch (error) {\n // The Clipboard API may throw if permission is denied\n throw new Error(\n `Failed to write to clipboard: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n isAvailable(): boolean {\n return (\n typeof navigator !== 'undefined' &&\n typeof navigator.clipboard !== 'undefined' &&\n typeof navigator.clipboard.readText === 'function' &&\n typeof navigator.clipboard.writeText === 'function'\n )\n }\n}\n","import type {\n ColorSupport,\n EnvironmentAdapter,\n TerminalBackground,\n} from '../types.js'\n\n/**\n * Browser environment adapter.\n * Provides sensible defaults for browser environments.\n * @public\n */\nexport class BrowserEnvironmentAdapter implements EnvironmentAdapter {\n private readonly envOverrides: Map<string, string>\n private colorSupportCached: ColorSupport | null = null\n private backgroundCached: TerminalBackground | null = null\n\n /**\n * Create a new browser environment adapter.\n * @param envOverrides - Optional environment variable overrides\n */\n constructor(envOverrides: Record<string, string> = {}) {\n this.envOverrides = new Map(Object.entries(envOverrides))\n }\n\n get(name: string): string | undefined {\n // Check overrides first\n if (this.envOverrides.has(name)) {\n return this.envOverrides.get(name)\n }\n\n // In browsers, environment variables are not available\n return undefined\n }\n\n /**\n * Set an environment variable override.\n * @param name - Variable name\n * @param value - Variable value\n */\n set(name: string, value: string): void {\n this.envOverrides.set(name, value)\n // Clear caches that depend on env vars\n this.colorSupportCached = null\n this.backgroundCached = null\n }\n\n getColorSupport(): ColorSupport {\n if (this.colorSupportCached) {\n return this.colorSupportCached\n }\n\n // Modern browsers and xterm.js support true color\n const support: ColorSupport = {\n level: 3,\n hasBasic: true,\n has256: true,\n has16m: true,\n }\n\n this.colorSupportCached = support\n return support\n }\n\n getTerminalBackground(): TerminalBackground {\n if (this.backgroundCached) {\n return this.backgroundCached\n }\n\n // Check for overrides\n const override = this.envOverrides.get('TERM_BACKGROUND')?.toLowerCase()\n if (override === 'dark' || override === 'light') {\n this.backgroundCached = override\n return override\n }\n\n // Try to detect from CSS media query\n if (typeof window !== 'undefined' && window.matchMedia) {\n const darkQuery = window.matchMedia('(prefers-color-scheme: dark)')\n if (darkQuery.matches) {\n this.backgroundCached = 'dark'\n return 'dark'\n }\n\n const lightQuery = window.matchMedia('(prefers-color-scheme: light)')\n if (lightQuery.matches) {\n this.backgroundCached = 'light'\n return 'light'\n }\n }\n\n this.backgroundCached = 'unknown'\n return 'unknown'\n }\n}\n","import type { DirectoryEntry, FileStat, FileSystemAdapter } from '../types.js'\n\n/**\n * Browser filesystem adapter.\n * Throws errors for all filesystem operations as browsers do not have filesystem access.\n * This adapter exists for API compatibility but should not be used in browser environments.\n * @public\n */\nexport class BrowserFileSystemAdapter implements FileSystemAdapter {\n async readdir(_path: string, _options?: { withFileTypes?: boolean }): Promise<DirectoryEntry[] | string[]> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n async stat(_path: string): Promise<FileStat> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n async readFile(_path: string, _encoding?: string): Promise<string> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n async writeFile(_path: string, _content: string): Promise<void> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n async exists(_path: string): Promise<boolean> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n async mkdir(_path: string, _options?: { recursive?: boolean }): Promise<void> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n async unlink(_path: string): Promise<void> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n async rmdir(_path: string, _options?: { recursive?: boolean; force?: boolean }): Promise<void> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n async rename(_src: string, _dst: string): Promise<void> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n async copyFile(_src: string, _dst: string): Promise<void> {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n cwd(): string {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n\n homedir(): string {\n throw new Error('FileSystem operations are not available in browser environments')\n }\n}\n","import type { PathAdapter } from '../types.js'\n\n/**\n * Browser path adapter.\n * Pure JavaScript implementation of POSIX-style path operations for browsers.\n * Always uses forward slashes (/) as path separator.\n * @public\n */\nexport class BrowserPathAdapter implements PathAdapter {\n readonly sep = '/'\n\n join(...segments: string[]): string {\n if (segments.length === 0) {\n return '.'\n }\n\n // Filter out empty segments and join with separator\n const filtered = segments.filter((seg) => seg.length > 0)\n if (filtered.length === 0) {\n return '.'\n }\n\n const joined = filtered.join('/')\n // Use normalizeForResolve to strip trailing slashes (join should not preserve them)\n return this.normalizeForResolve(joined)\n }\n\n dirname(path: string): string {\n if (path.length === 0) {\n return '.'\n }\n\n // Remove trailing slashes\n const trimmed = path.replace(/\\/+$/, '')\n if (trimmed.length === 0) {\n return '/'\n }\n\n // Find last slash\n const lastSlash = trimmed.lastIndexOf('/')\n if (lastSlash === -1) {\n return '.'\n }\n\n if (lastSlash === 0) {\n return '/'\n }\n\n return trimmed.slice(0, lastSlash)\n }\n\n basename(path: string, ext?: string): string {\n if (path.length === 0) {\n return ''\n }\n\n // Remove trailing slashes\n const trimmed = path.replace(/\\/+$/, '')\n if (trimmed.length === 0) {\n return ''\n }\n\n // Find last slash\n const lastSlash = trimmed.lastIndexOf('/')\n let base = lastSlash === -1 ? trimmed : trimmed.slice(lastSlash + 1)\n\n // Remove extension if provided and matches\n if (ext && base.endsWith(ext)) {\n base = base.slice(0, -ext.length)\n }\n\n return base\n }\n\n extname(path: string): string {\n if (path.length === 0) {\n return ''\n }\n\n const base = this.basename(path)\n const lastDot = base.lastIndexOf('.')\n\n // No extension if:\n // - No dot found\n // - Dot is first character (hidden file like .gitignore)\n // - Dot is last character (file ending in dot)\n if (lastDot === -1 || lastDot === 0 || lastDot === base.length - 1) {\n return ''\n }\n\n return base.slice(lastDot)\n }\n\n resolve(...segments: string[]): string {\n let resolvedPath = ''\n let resolvedAbsolute = false\n\n // Process segments from right to left\n for (let i = segments.length - 1; i >= 0 && !resolvedAbsolute; i--) {\n const segment = segments[i]\n if (!segment || segment.length === 0) {\n continue\n }\n\n resolvedPath = resolvedPath.length > 0 ? `${segment}/${resolvedPath}` : segment\n resolvedAbsolute = segment[0] === '/'\n }\n\n // If still not absolute, prepend current working directory (/)\n if (!resolvedAbsolute) {\n resolvedPath = resolvedPath.length > 0 ? `/${resolvedPath}` : '/'\n }\n\n // Normalize the path\n const normalized = this.normalizeForResolve(resolvedPath)\n return normalized === '' ? '/' : normalized\n }\n\n /**\n * Normalize path specifically for resolve (never preserves trailing slash).\n * @param path - Path to normalize\n * @returns Normalized path without trailing slash\n */\n private normalizeForResolve(path: string): string {\n if (path.length === 0) {\n return '/'\n }\n\n const isAbsolute = path[0] === '/'\n\n // Split into segments and process\n const segments = path.split('/').filter((seg) => seg.length > 0 && seg !== '.')\n const normalized: string[] = []\n\n for (const segment of segments) {\n if (segment === '..') {\n // Go up one level if possible\n if (normalized.length > 0 && normalized[normalized.length - 1] !== '..') {\n normalized.pop()\n } else if (!isAbsolute) {\n // Can only add .. if not absolute path\n normalized.push('..')\n }\n } else {\n normalized.push(segment)\n }\n }\n\n let result = normalized.join('/')\n\n // Add prefix\n if (isAbsolute) {\n result = `/${result}`\n } else if (result.length === 0) {\n result = '.'\n }\n\n return result\n }\n\n isAbsolute(path: string): boolean {\n return path.length > 0 && path[0] === '/'\n }\n\n normalize(path: string): string {\n if (path.length === 0) {\n return '.'\n }\n\n const isAbsolute = path[0] === '/'\n const trailingSlash = path[path.length - 1] === '/'\n\n // Split into segments and process\n const segments = path.split('/').filter((seg) => seg.length > 0 && seg !== '.')\n const normalized: string[] = []\n\n for (const segment of segments) {\n if (segment === '..') {\n // Go up one level if possible\n if (normalized.length > 0 && normalized[normalized.length - 1] !== '..') {\n normalized.pop()\n } else if (!isAbsolute) {\n // Can only add .. if not absolute path\n normalized.push('..')\n }\n } else {\n normalized.push(segment)\n }\n }\n\n let result = normalized.join('/')\n\n // Add prefix\n if (isAbsolute) {\n result = `/${result}`\n } else if (result.length === 0) {\n result = '.'\n }\n\n // Preserve trailing slash for directories (except for root)\n if (trailingSlash && result !== '/' && result.length > 0) {\n result += '/'\n }\n\n return result\n }\n}\n","import type { Disposable, SignalAdapter, SignalHandler } from '../types.js'\n\n/**\n * Browser signal adapter using window events.\n * Maps browser events to the signal interface:\n * - beforeunload -\\> interrupt\n * - pagehide -\\> terminate\n * @public\n */\nexport class BrowserSignalAdapter implements SignalAdapter {\n private readonly interruptHandlers: Set<SignalHandler> = new Set()\n private readonly terminateHandlers: Set<SignalHandler> = new Set()\n private disposed = false\n private boundBeforeUnload: ((e: BeforeUnloadEvent) => void) | null = null\n private boundPageHide: (() => void) | null = null\n\n private handleBeforeUnload = (e: BeforeUnloadEvent): void => {\n for (const handler of this.interruptHandlers) {\n handler()\n }\n // Prevent the unload to allow handlers to run\n // This may show a confirmation dialog in some browsers\n if (this.interruptHandlers.size > 0) {\n e.preventDefault()\n }\n }\n\n private handlePageHide = (): void => {\n for (const handler of this.terminateHandlers) {\n handler()\n }\n }\n\n onInterrupt(handler: SignalHandler): Disposable {\n if (this.interruptHandlers.size === 0 && typeof window !== 'undefined') {\n this.boundBeforeUnload = this.handleBeforeUnload\n window.addEventListener('beforeunload', this.boundBeforeUnload)\n }\n this.interruptHandlers.add(handler)\n\n return {\n dispose: () => {\n this.interruptHandlers.delete(handler)\n if (\n this.interruptHandlers.size === 0 &&\n this.boundBeforeUnload &&\n typeof window !== 'undefined'\n ) {\n window.removeEventListener('beforeunload', this.boundBeforeUnload)\n this.boundBeforeUnload = null\n }\n },\n }\n }\n\n onTerminate(handler: SignalHandler): Disposable {\n if (this.terminateHandlers.size === 0 && typeof window !== 'undefined') {\n this.boundPageHide = this.handlePageHide\n window.addEventListener('pagehide', this.boundPageHide)\n }\n this.terminateHandlers.add(handler)\n\n return {\n dispose: () => {\n this.terminateHandlers.delete(handler)\n if (\n this.terminateHandlers.size === 0 &&\n this.boundPageHide &&\n typeof window !== 'undefined'\n ) {\n window.removeEventListener('pagehide', this.boundPageHide)\n this.boundPageHide = null\n }\n },\n }\n }\n\n dispose(): void {\n if (this.disposed) {\n return\n }\n this.disposed = true\n\n if (typeof window !== 'undefined') {\n if (this.boundBeforeUnload) {\n window.removeEventListener('beforeunload', this.boundBeforeUnload)\n }\n if (this.boundPageHide) {\n window.removeEventListener('pagehide', this.boundPageHide)\n }\n }\n\n this.interruptHandlers.clear()\n this.terminateHandlers.clear()\n }\n}\n","/**\n * Platform-agnostic byte utilities using Uint8Array.\n * These replace Node.js Buffer operations for cross-platform compatibility.\n */\n\n/** Shared TextEncoder instance for string encoding. */\nconst encoder = new TextEncoder()\n\n/** Shared TextDecoder instance for string decoding. */\nconst decoder = new TextDecoder('utf-8')\n\n/**\n * Encode a string to UTF-8 bytes.\n * Equivalent to `Buffer.from(text, 'utf8')`.\n * @param text - String to encode\n * @returns UTF-8 encoded bytes\n * @public\n */\nexport function encodeString(text: string): Uint8Array {\n return encoder.encode(text)\n}\n\n/**\n * Decode UTF-8 bytes to a string.\n * Equivalent to `buffer.toString('utf8')`.\n * @param bytes - Bytes to decode\n * @returns Decoded string\n * @public\n */\nexport function decodeString(bytes: Uint8Array): string {\n return decoder.decode(bytes)\n}\n\n/**\n * Get the byte length of a string when encoded as UTF-8.\n * Equivalent to `Buffer.byteLength(text, 'utf8')`.\n * @param text - String to measure\n * @returns Byte length\n * @public\n */\nexport function byteLength(text: string): number {\n return encoder.encode(text).length\n}\n\n/**\n * Concatenate multiple Uint8Arrays into one.\n * Equivalent to `Buffer.concat(arrays)`.\n * @param arrays - Arrays to concatenate\n * @returns Combined array\n * @public\n */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0)\n const result = new Uint8Array(totalLength)\n let offset = 0\n for (const arr of arrays) {\n result.set(arr, offset)\n offset += arr.length\n }\n return result\n}\n\n/**\n * Create a new Uint8Array of the specified size, filled with zeros.\n * Equivalent to `Buffer.alloc(size)`.\n * @param size - Size of the array\n * @returns New zero-filled array\n * @public\n */\nexport function allocBytes(size: number): Uint8Array {\n return new Uint8Array(size)\n}\n\n/**\n * Create a Uint8Array from an array of byte values.\n * Equivalent to `Buffer.from([...])`.\n * @param values - Byte values (0-255)\n * @returns New Uint8Array\n * @public\n */\nexport function fromBytes(values: number[]): Uint8Array {\n return new Uint8Array(values)\n}\n\n/**\n * Compare two Uint8Arrays for equality.\n * Equivalent to `buffer1.equals(buffer2)`.\n * @param a - First array\n * @param b - Second array\n * @returns True if arrays are equal\n * @public\n */\nexport function bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) {\n return false\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false\n }\n }\n return true\n}\n\n/**\n * Check if a byte array starts with a specific prefix.\n * @param bytes - Array to check\n * @param prefix - Prefix to look for\n * @returns True if bytes starts with prefix\n * @public\n */\nexport function startsWith(bytes: Uint8Array, prefix: Uint8Array): boolean {\n if (bytes.length < prefix.length) {\n return false\n }\n for (let i = 0; i < prefix.length; i++) {\n if (bytes[i] !== prefix[i]) {\n return false\n }\n }\n return true\n}\n\n/**\n * Check if a byte array starts with a specific string (UTF-8 encoded).\n * @param bytes - Array to check\n * @param prefix - String prefix to look for\n * @returns True if bytes starts with the encoded prefix\n * @public\n */\nexport function startsWithString(bytes: Uint8Array, prefix: string): boolean {\n return startsWith(bytes, encodeString(prefix))\n}\n\n/**\n * Find the index of a substring within a byte array.\n * Returns -1 if not found.\n * @param bytes - Array to search\n * @param needle - String to find\n * @param fromIndex - Start index (default 0)\n * @returns Index of first occurrence or -1\n * @public\n */\nexport function indexOfString(\n bytes: Uint8Array,\n needle: string,\n fromIndex: number = 0,\n): number {\n const needleBytes = encodeString(needle)\n const endIndex = bytes.length - needleBytes.length\n\n outer: for (let i = fromIndex; i <= endIndex; i++) {\n for (let j = 0; j < needleBytes.length; j++) {\n if (bytes[i + j] !== needleBytes[j]) {\n continue outer\n }\n }\n return i\n }\n return -1\n}\n\n/**\n * Decode the first complete UTF-8 character from a byte array.\n * Returns the character and its byte length, or null if incomplete.\n * @param bytes - Byte array to decode\n * @param offset - Start offset (default 0)\n * @returns Tuple of [character, byteLength] or [null, 0] if incomplete\n * @public\n */\nexport function decodeFirstRune(\n bytes: Uint8Array,\n offset: number = 0,\n): [string | null, number] {\n if (offset >= bytes.length) {\n return [null, 0]\n }\n\n const firstByte = bytes[offset]\n if (firstByte === undefined) {\n return [null, 0]\n }\n\n // Determine the byte length of this UTF-8 character\n let byteLen: number\n if ((firstByte & 0x80) === 0) {\n // Single byte character (ASCII)\n byteLen = 1\n } else if ((firstByte & 0xe0) === 0xc0) {\n // Two byte character\n byteLen = 2\n } else if ((firstByte & 0xf0) === 0xe0) {\n // Three byte character\n byteLen = 3\n } else if ((firstByte & 0xf8) === 0xf0) {\n // Four byte character\n byteLen = 4\n } else {\n // Invalid UTF-8 start byte, treat as single byte\n byteLen = 1\n }\n\n // Check if we have enough bytes\n if (offset + byteLen > bytes.length) {\n return [null, 0]\n }\n\n // Decode the character\n const slice = bytes.subarray(offset, offset + byteLen)\n const decoded = decoder.decode(slice)\n\n if (decoded.length === 0) {\n return [null, 0]\n }\n\n // Use codePointAt to properly handle surrogate pairs (emoji, etc.)\n // This returns the full Unicode code point, not just the first surrogate\n const codePoint = decoded.codePointAt(0)\n if (codePoint === undefined) {\n return [null, 0]\n }\n\n // Convert the code point back to a string (handles surrogate pairs correctly)\n const firstChar = String.fromCodePoint(codePoint)\n\n return [firstChar, byteLen]\n}\n\n/**\n * Slice a portion of a byte array.\n * Equivalent to `buffer.subarray(start, end)`.\n * @param bytes - Source array\n * @param start - Start index\n * @param end - End index (optional, defaults to length)\n * @returns New Uint8Array view of the slice\n * @public\n */\nexport function sliceBytes(\n bytes: Uint8Array,\n start: number,\n end?: number,\n): Uint8Array {\n return bytes.subarray(start, end)\n}\n\n/**\n * Create a copy of a byte array.\n * @param bytes - Array to copy\n * @returns New Uint8Array with copied data\n * @public\n */\nexport function copyBytes(bytes: Uint8Array): Uint8Array {\n return new Uint8Array(bytes)\n}\n","import { encodeString } from '../bytes.js'\nimport type {\n Disposable,\n InputHandler,\n ResizeHandler,\n TerminalAdapter,\n TerminalSize,\n} from '../types.js'\n\n/**\n * Minimal xterm.js Terminal interface.\n * This matches the core xterm.js API we need.\n * @public\n */\nexport interface XtermTerminal {\n readonly cols: number\n readonly rows: number\n write(data: string): void\n onData(listener: (data: string) => void): { dispose(): void }\n onResize(listener: (size: { cols: number; rows: number }) => void): {\n dispose(): void\n }\n}\n\n/**\n * Browser terminal adapter using xterm.js.\n * @public\n */\nexport class XtermTerminalAdapter implements TerminalAdapter {\n private disposed = false\n private readonly inputHandlers: Set<InputHandler> = new Set()\n private readonly resizeHandlers: Set<ResizeHandler> = new Set()\n private dataDisposable: { dispose(): void } | null = null\n private resizeDisposable: { dispose(): void } | null = null\n\n /**\n * Create a new xterm.js terminal adapter.\n * @param terminal - xterm.js Terminal instance\n */\n constructor(private readonly terminal: XtermTerminal) {}\n\n onInput(handler: InputHandler): Disposable {\n if (this.inputHandlers.size === 0) {\n this.dataDisposable = this.terminal.onData((data) => {\n const bytes = encodeString(data)\n for (const h of this.inputHandlers) {\n h(bytes)\n }\n })\n }\n this.inputHandlers.add(handler)\n\n return {\n dispose: () => {\n this.inputHandlers.delete(handler)\n if (this.inputHandlers.size === 0 && this.dataDisposable) {\n this.dataDisposable.dispose()\n this.dataDisposable = null\n }\n },\n }\n }\n\n onResize(handler: ResizeHandler): Disposable {\n if (this.resizeHandlers.size === 0) {\n this.resizeDisposable = this.terminal.onResize((size) => {\n const terminalSize: TerminalSize = {\n columns: size.cols,\n rows: size.rows,\n }\n for (const h of this.resizeHandlers) {\n h(terminalSize)\n }\n })\n }\n this.resizeHandlers.add(handler)\n\n return {\n dispose: () => {\n this.resizeHandlers.delete(handler)\n if (this.resizeHandlers.size === 0 && this.resizeDisposable) {\n this.resizeDisposable.dispose()\n this.resizeDisposable = null\n }\n },\n }\n }\n\n write(data: string): void {\n if (data.length === 0) {\n return\n }\n // Convert lone \\n to \\r\\n for proper terminal line handling\n // xterm.js requires \\r\\n for carriage return + line feed\n const normalized = data.replace(/(?<!\\r)\\n/g, '\\r\\n')\n this.terminal.write(normalized)\n }\n\n getSize(): TerminalSize {\n return {\n columns: this.terminal.cols,\n rows: this.terminal.rows,\n }\n }\n\n enableRawMode(): void {\n // xterm.js is always in \"raw mode\" - no action needed\n }\n\n disableRawMode(): void {\n // xterm.js is always in \"raw mode\" - no action needed\n }\n\n isTTY(): boolean {\n // xterm.js is always a TTY\n return true\n }\n\n dispose(): void {\n if (this.disposed) {\n return\n }\n this.disposed = true\n\n if (this.dataDisposable) {\n this.dataDisposable.dispose()\n this.dataDisposable = null\n }\n if (this.resizeDisposable) {\n this.resizeDisposable.dispose()\n this.resizeDisposable = null\n }\n\n this.inputHandlers.clear()\n this.resizeHandlers.clear()\n }\n}\n","/**\n * Browser platform adapters for \\@boba-cli/machine.\n * @packageDocumentation\n */\n\nimport type {\n ArchiveAdapter,\n ClipboardAdapter,\n Disposable,\n EnvironmentAdapter,\n FileSystemAdapter,\n PathAdapter,\n PlatformAdapter,\n SignalAdapter,\n StyleAdapter,\n TerminalAdapter,\n} from '../types.js'\nimport { createAlwaysEnabledStyle } from '../style/index.js'\nimport { BrowserArchiveAdapter } from './archive.js'\nimport { BrowserClipboardAdapter } from './clipboard.js'\nimport { BrowserEnvironmentAdapter } from './environment.js'\nimport { BrowserFileSystemAdapter } from './filesystem.js'\nimport { BrowserPathAdapter } from './path.js'\nimport { BrowserSignalAdapter } from './signals.js'\nimport { XtermTerminalAdapter, type XtermTerminal } from './terminal.js'\n\nexport { BrowserArchiveAdapter } from './archive.js'\nexport { BrowserClipboardAdapter } from './clipboard.js'\nexport { BrowserEnvironmentAdapter } from './environment.js'\nexport { BrowserFileSystemAdapter } from './filesystem.js'\nexport { BrowserPathAdapter } from './path.js'\nexport { BrowserSignalAdapter } from './signals.js'\nexport { XtermTerminalAdapter, type XtermTerminal } from './terminal.js'\n\n/**\n * Options for creating a browser platform adapter.\n * @public\n */\nexport interface BrowserPlatformOptions {\n /** xterm.js Terminal instance (required). */\n terminal: XtermTerminal\n /** Environment variable overrides. */\n env?: Record<string, string>\n /** Custom filesystem adapter (e.g., using memfs). If not provided, uses the default BrowserFileSystemAdapter which throws errors. */\n filesystem?: FileSystemAdapter\n}\n\n/**\n * Complete browser platform adapter.\n * Combines xterm.js terminal, browser signals, clipboard, environment, filesystem, path, archive, and style adapters.\n * @public\n */\nexport class BrowserPlatformAdapter implements PlatformAdapter {\n readonly terminal: TerminalAdapter\n readonly signals: SignalAdapter\n readonly clipboard: ClipboardAdapter\n readonly environment: EnvironmentAdapter\n readonly filesystem: FileSystemAdapter\n readonly path: PathAdapter\n readonly archive: ArchiveAdapter\n readonly style: StyleAdapter\n\n private disposed = false\n private readonly disposables: Disposable[] = []\n\n /**\n * Create a new browser platform adapter.\n * @param options - Configuration options (requires xterm.js Terminal)\n */\n constructor(options: BrowserPlatformOptions) {\n const terminalAdapter = new XtermTerminalAdapter(options.terminal)\n const signalAdapter = new BrowserSignalAdapter()\n const clipboardAdapter = new BrowserClipboardAdapter()\n const environmentAdapter = new BrowserEnvironmentAdapter(options.env)\n const filesystemAdapter = options.filesystem ?? new BrowserFileSystemAdapter()\n const pathAdapter = new BrowserPathAdapter()\n const archiveAdapter = new BrowserArchiveAdapter()\n\n // Browser/xterm.js always supports full colors\n const styleAdapter: StyleAdapter = {\n style: createAlwaysEnabledStyle(),\n enabled: true,\n level: 3,\n }\n\n this.terminal = terminalAdapter\n this.signals = signalAdapter\n this.clipboard = clipboardAdapter\n this.environment = environmentAdapter\n this.filesystem = filesystemAdapter\n this.path = pathAdapter\n this.archive = archiveAdapter\n this.style = styleAdapter\n\n this.disposables.push(terminalAdapter, signalAdapter)\n }\n\n dispose(): void {\n if (this.disposed) {\n return\n }\n this.disposed = true\n\n for (const disposable of this.disposables) {\n disposable.dispose()\n }\n }\n}\n\n/**\n * Create a browser platform adapter with xterm.js.\n * @param options - Configuration options\n * @returns A new platform adapter\n * @public\n */\nexport function createBrowserPlatform(\n options: BrowserPlatformOptions,\n): PlatformAdapter {\n return new BrowserPlatformAdapter(options)\n}\n"]}
|
package/dist/browser/index.d.cts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { T as TerminalAdapter, I as InputHandler,
|
|
1
|
+
import { T as TerminalAdapter, I as InputHandler, a as Disposable, R as ResizeHandler, g as TerminalSize, A as ArchiveAdapter, C as ClipboardAdapter, b as FileSystemAdapter, D as DirectoryEntry, F as FileStat, P as PathAdapter, d as SignalAdapter, e as SignalHandler, c as PlatformAdapter, f as StyleAdapter } from '../types-l5LiTaxI.cjs';
|
|
2
|
+
import { EnvironmentAdapter, ColorSupport, TerminalBackground } from '@boba-cli/core';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Minimal xterm.js Terminal interface.
|
|
@@ -197,6 +198,8 @@ interface BrowserPlatformOptions {
|
|
|
197
198
|
terminal: XtermTerminal;
|
|
198
199
|
/** Environment variable overrides. */
|
|
199
200
|
env?: Record<string, string>;
|
|
201
|
+
/** Custom filesystem adapter (e.g., using memfs). If not provided, uses the default BrowserFileSystemAdapter which throws errors. */
|
|
202
|
+
filesystem?: FileSystemAdapter;
|
|
200
203
|
}
|
|
201
204
|
/**
|
|
202
205
|
* Complete browser platform adapter.
|
package/dist/browser/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { T as TerminalAdapter, I as InputHandler,
|
|
1
|
+
import { T as TerminalAdapter, I as InputHandler, a as Disposable, R as ResizeHandler, g as TerminalSize, A as ArchiveAdapter, C as ClipboardAdapter, b as FileSystemAdapter, D as DirectoryEntry, F as FileStat, P as PathAdapter, d as SignalAdapter, e as SignalHandler, c as PlatformAdapter, f as StyleAdapter } from '../types-l5LiTaxI.js';
|
|
2
|
+
import { EnvironmentAdapter, ColorSupport, TerminalBackground } from '@boba-cli/core';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Minimal xterm.js Terminal interface.
|
|
@@ -197,6 +198,8 @@ interface BrowserPlatformOptions {
|
|
|
197
198
|
terminal: XtermTerminal;
|
|
198
199
|
/** Environment variable overrides. */
|
|
199
200
|
env?: Record<string, string>;
|
|
201
|
+
/** Custom filesystem adapter (e.g., using memfs). If not provided, uses the default BrowserFileSystemAdapter which throws errors. */
|
|
202
|
+
filesystem?: FileSystemAdapter;
|
|
200
203
|
}
|
|
201
204
|
/**
|
|
202
205
|
* Complete browser platform adapter.
|
package/dist/browser/index.js
CHANGED
|
@@ -649,7 +649,7 @@ var BrowserPlatformAdapter = class {
|
|
|
649
649
|
const signalAdapter = new BrowserSignalAdapter();
|
|
650
650
|
const clipboardAdapter = new BrowserClipboardAdapter();
|
|
651
651
|
const environmentAdapter = new BrowserEnvironmentAdapter(options.env);
|
|
652
|
-
const filesystemAdapter = new BrowserFileSystemAdapter();
|
|
652
|
+
const filesystemAdapter = options.filesystem ?? new BrowserFileSystemAdapter();
|
|
653
653
|
const pathAdapter = new BrowserPathAdapter();
|
|
654
654
|
const archiveAdapter = new BrowserArchiveAdapter();
|
|
655
655
|
const styleAdapter = {
|