{"version":3,"sources":["../src/net/runtime.ts","../src/net/client.ts","../src/net/resource.ts","../src/net/directive.ts","../src/net/registry.ts","../src/net/index.ts"],"names":["signal"],"mappings":";;;;;;;AAcA,IAAI,OAAA;AAEG,SAAS,iBAAiB,EAAA,EAAyB;AACxD,EAAA,OAAA,GAAU,EAAA;AACZ;AAEO,SAAS,OAAU,OAAA,EAAuB;AAC/C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,QAAQ,OAAO,CAAA;AACxB;;;AChBO,IAAM,QAAA,GAAN,cAAuB,KAAA,CAAM;AAAA,EAOlC,WAAA,CACE,SACA,IAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA;AAChB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AAAA,EACtB;AACF;AA0CO,SAAS,YAAA,CAAa,QAAA,GAA6B,EAAC,EAAc;AACvE,EAAA,eAAe,OAAA,CAAqB,IAAA,EAAc,GAAA,GAAkB,EAAC,EAAe;AAClF,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,OAAA,IAAW,QAAA,CAAS,OAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,SAAS,CAAA,GAAI,MAAA;AAG5E,IAAA,IAAI,IAAI,MAAA,EAAQ;AACd,MAAA,IAAI,GAAA,CAAI,MAAA,CAAO,OAAA,EAAS,UAAA,CAAW,KAAA,EAAM;AAAA,WACpC,GAAA,CAAI,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,MAAM,UAAA,CAAW,KAAA,EAAM,EAAG,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,IACpF;AAEA,IAAA,MAAM,MAAA,GAAA,CAAU,GAAA,CAAI,MAAA,IAAU,KAAA,EAAO,WAAA,EAAY;AACjD,IAAA,MAAM,GAAA,GAAM,WAAW,OAAA,CAAQ,QAAA,CAAS,SAAS,IAAI,CAAA,EAAG,IAAI,MAAM,CAAA;AAClE,IAAA,MAAM,WAAA,GAAc,OAAO,QAAA,CAAS,OAAA,KAAY,aAAa,QAAA,CAAS,OAAA,KAAY,QAAA,CAAS,OAAA;AAC3F,IAAA,MAAM,UAAkC,EAAE,GAAG,WAAA,EAAa,GAAG,IAAI,OAAA,EAAQ;AAEzE,IAAA,IAAI,OAAgB,EAAE,GAAA,EAAK,QAAQ,OAAA,EAAS,MAAA,EAAQ,WAAW,MAAA,EAAO;AACtE,IAAA,IAAI,IAAI,IAAA,KAAS,MAAA,IAAa,MAAA,KAAW,KAAA,IAAS,WAAW,MAAA,EAAQ;AACnE,MAAA,IAAI,CAAC,UAAU,OAAA,EAAS,cAAc,KAAK,OAAO,GAAA,CAAI,SAAS,QAAA,EAAU;AACvE,QAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAAA,MAC5B;AACA,MAAA,IAAA,CAAK,IAAA,GAAO,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,GAAW,IAAI,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAAA,IAC/E;AAEA,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,GAAgB,IAAI,CAAA;AAC7C,IAAA,IAAI,SAAS,IAAA,GAAO,OAAA;AAEpB,IAAA,IAAI;AACF,MAAA,IAAI,GAAA,GAAM,MAAM,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AACpC,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,GAAgB,GAAG,CAAA;AAC5C,MAAA,IAAI,SAAS,GAAA,GAAM,OAAA;AACnB,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,GAAG,CAAA;AAC/B,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,MAAM,IAAI,QAAA,CAAS,CAAA,2BAAA,EAA8B,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI;AAAA,UAC7D,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,IAAA;AAAA,UACA,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,MAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AACA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,CAAA,GAAI,cAAA,CAAe,GAAA,EAAK,IAAA,CAAK,KAAK,MAAM,CAAA;AAC9C,MAAA,QAAA,CAAS,UAAU,CAAC,CAAA;AACpB,MAAA,MAAM,CAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAoB;AAAA,IACxB,OAAA;AAAA,IACA,GAAA,EAAK,CAAC,IAAA,EAAM,OAAA,KAAY,OAAA,CAAQ,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,IACnE,IAAA,EAAM,CAAC,IAAA,EAAM,IAAA,EAAM,OAAA,KAAY,OAAA,CAAQ,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,IACjF,GAAA,EAAK,CAAC,IAAA,EAAM,IAAA,EAAM,OAAA,KAAY,OAAA,CAAQ,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA;AAAA,IAC/E,KAAA,EAAO,CAAC,IAAA,EAAM,IAAA,EAAM,OAAA,KAAY,OAAA,CAAQ,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAAA,IACnF,MAAA,EAAQ,CAAC,IAAA,EAAM,OAAA,KAAY,OAAA,CAAQ,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,CAAA;AAAA,IACzE,OAAA,EAAS;AAAA,GACX;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAA,CAAe,GAAA,EAAc,GAAA,EAAa,MAAA,EAA0B;AAC3E,EAAA,IAAI,GAAA,YAAe,UAAU,OAAO,GAAA;AACpC,EAAA,MAAM,OAAA,GAAW,KAA2B,IAAA,KAAS,YAAA;AACrD,EAAA,OAAO,IAAI,QAAA,CAAS,OAAA,GAAU,iBAAA,GAAqB,GAAA,EAAe,WAAW,wBAAA,EAA0B;AAAA,IACrG,MAAA,EAAQ,CAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,GAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAEA,eAAe,SAAS,GAAA,EAAiC;AACvD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AAChD,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,EAAA,IAAI,IAAA,KAAS,IAAI,OAAO,MAAA;AACxB,EAAA,IAAI,KAAK,QAAA,CAAS,kBAAkB,KAAK,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAC/D,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,SAAA,CAAU,SAAiC,IAAA,EAAuB;AACzE,EAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAY,KAAM,KAAK,CAAA;AACnE;AAEA,SAAS,OAAA,CAAQ,MAA0B,IAAA,EAAsB;AAC/D,EAAA,IAAI,CAAC,IAAA,IAAQ,0BAAA,CAA2B,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA;AAC3D,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,CAAA;AAChE;AAEA,SAAS,UAAA,CAAW,KAAa,MAAA,EAA4B;AAC3D,EAAA,IAAI,CAAC,QAAQ,OAAO,GAAA;AACpB,EAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,SAAS,IAAA,EAAM,KAAA,CAAM,IAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACjD;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,EAAS;AAC9B,EAAA,IAAI,CAAC,QAAQ,OAAO,GAAA;AACpB,EAAA,OAAO,CAAA,EAAG,GAAG,CAAA,EAAG,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,EAAG,MAAM,CAAA,CAAA;AACxD;;;AClIO,SAAS,cAAA,CACd,MAAA,EACA,GAAA,EACA,OAAA,GAA2B,EAAC,EACf;AACb,EAAA,MAAM,OAAA,GAAU,OAAsB,MAAS,CAAA;AAC/C,EAAA,MAAM,QAAA,GAAW,OAA6B,MAAS,CAAA;AACvD,EAAA,MAAM,UAAA,GAAa,OAAO,KAAK,CAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,OAAuB,MAAM,CAAA;AAE/C,EAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,GAAG,iBAAgB,GAAI,OAAA;AACrD,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,UAAA;AAEJ,EAAA,eAAe,OAAA,CAAQ,SAAA,GAAwB,EAAC,EAA2B;AACzE,IAAA,MAAM,UAAU,EAAE,GAAA;AAClB,IAAA,UAAA,EAAY,KAAA,EAAM;AAClB,IAAA,UAAA,GAAa,IAAI,eAAA,EAAgB;AACjC,IAAA,UAAA,CAAW,IAAI,IAAI,CAAA;AACnB,IAAA,SAAA,CAAU,IAAI,SAAS,CAAA;AACvB,IAAA,QAAA,CAAS,IAAI,MAAS,CAAA;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,OAAO,GAAA,KAAQ,UAAA,GAAa,KAAI,GAAI,GAAA;AACnD,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAW,MAAA,EAAQ;AAAA,QAC7C,GAAG,eAAA;AAAA,QACH,GAAG,SAAA;AAAA,QACH,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AACD,MAAA,IAAI,OAAA,KAAY,KAAK,OAAO,KAAA,CAAA;AAC5B,MAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAClB,MAAA,SAAA,CAAU,IAAI,SAAS,CAAA;AACvB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAA,KAAY,KAAK,OAAO,MAAA;AAC5B,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,IAAI,EAAE,OAAA,EAAS;AACb,QAAA,SAAA,CAAU,IAAI,MAAM,CAAA;AACpB,QAAA,OAAO,MAAA;AAAA,MACT;AACA,MAAA,QAAA,CAAS,IAAI,CAAC,CAAA;AACd,MAAA,SAAA,CAAU,IAAI,OAAO,CAAA;AACrB,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,IAAI,OAAA,KAAY,GAAA,EAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAwB;AAAA,IAC5B,IAAI,IAAA,GAAO;AACT,MAAA,OAAO,OAAA,EAAQ;AAAA,IACjB,CAAA;AAAA,IACA,IAAI,KAAA,GAAQ;AACV,MAAA,OAAO,QAAA,EAAS;AAAA,IAClB,CAAA;AAAA,IACA,IAAI,OAAA,GAAU;AACZ,MAAA,OAAO,UAAA,EAAW;AAAA,IACpB,CAAA;AAAA,IACA,IAAI,MAAA,GAAS;AACX,MAAA,OAAO,SAAA,EAAU;AAAA,IACnB,CAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA,CAAO,IAAA,EAAM,aAAA,GAAgB,EAAC,EAAG;AAC/B,MAAA,MAAM,QAAA,GAAW,QAAQ,IAAA,EAAK;AAC9B,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,KAAU,OAAO,SAAS,UAAA,GAAc,IAAA,CAAiC,IAAI,CAAA,GAAI,IAAK,CAAA;AACnG,MAAA,IAAI,CAAC,cAAc,OAAA,EAAS;AAE5B,MAAA,KAAK,OAAA,CAAQ,SAAQ,CAClB,IAAA,CAAK,cAAc,OAAO,CAAA,CAC1B,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,QAAA,IAAI,aAAA,CAAc,eAAA,KAAoB,KAAA,EAAO,OAAA,CAAQ,IAAI,QAAQ,CAAA;AACjE,QAAA,QAAA,CAAS,IAAI,GAAe,CAAA;AAAA,MAC9B,CAAC,CAAA;AAAA,IACL,CAAA;AAAA,IACA,KAAA,GAAQ;AACN,MAAA,GAAA,EAAA;AACA,MAAA,UAAA,EAAY,KAAA,EAAM;AAClB,MAAA,UAAA,GAAa,MAAA;AACb,MAAA,UAAA,CAAW,IAAI,KAAK,CAAA;AACpB,MAAA,IAAI,UAAU,IAAA,EAAK,KAAM,SAAA,EAAW,SAAA,CAAU,IAAI,MAAM,CAAA;AAAA,IAC1D;AAAA,GACF;AAEA,EAAA,SAAA,GAAY,MAAM,QAAA,CAAS,KAAA,EAAO,CAAA;AAClC,EAAA,IAAI,SAAA,KAAc,KAAA,EAAO,KAAK,OAAA,EAAQ;AACtC,EAAA,OAAO,QAAA;AACT;;;AC1GO,SAAS,sBAAsB,MAAA,EAAqC;AACzE,EAAA,OAAO,CAAC,EAAA,EAAI,IAAA,EAAM,KAAA,KAAU;AAC1B,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAClB,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAA,CAAQ,IAAA,CAAK,oFAAsF,EAAE,CAAA;AACrG,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,SAAS,CAAC,CAAA;AAClD,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,KAAA;AAEJ,IAAA,MAAM,aAAa,MAAuB,KAAA,CAAM,SAAS,IAAA,CAAK,UAAU,KAAK,EAAC;AAE9E,IAAA,KAAA,CAAM,OAAO,MAAM;AACjB,MAAA,MAAM,MAAM,UAAA,EAAW;AACvB,MAAA,IAAI,CAAC,IAAI,GAAA,EAAK;AACd,MAAA,MAAM,MAAM,EAAE,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,SAAS,GAAA,CAAI,OAAA,EAAS,MAAA,EAAQ,GAAA,CAAI,QAAQ,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,OAAA,EAAS,IAAI,OAAA,EAAQ;AAEjH,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,QAAA,GAAW,eAAe,MAAA,EAAQ,MAAM,YAAW,CAAE,GAAA,IAAO,IAAI,GAAA,EAAM;AAAA,UACpE,GAAG,GAAA;AAAA,UACH,SAAA,EAAW,IAAI,SAAA,KAAc,KAAA;AAAA,UAC7B,WAAW,KAAA,CAAM;AAAA,SAClB,CAAA;AACD,QAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAI,CAAA,GAAI,QAAA;AACzB,QAAA;AAAA,MACF;AAIA,MAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAU,OAAA,CAAQ,GAAG,CAAA;AACvC,MAAA,IAAI,IAAI,QAAA,EAAU;AAChB,QAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAC7B,QAAA,KAAA,GAAQ,UAAA,CAAW,GAAA,EAAK,GAAA,CAAI,QAAQ,CAAA;AAAA,MACtC,CAAA,MAAO;AACL,QAAA,GAAA,EAAI;AAAA,MACN;AAAA,IACF,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,QAAQ,MAAM;AAClB,MAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAAA,IAC/B,CAAC,CAAA;AAAA,EACH,CAAA;AACF;;;AC1DO,IAAM,OAAkB,YAAA;AAO/B,SAAS,UAAA,CAAW,QAAmB,GAAA,EAAgC;AACrE,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,QAAA,CAAS,GAAA,EAAK,OAAA,GAAU,EAAC,EAAG;AAC1B,MAAA,OAAO,cAAA,CAAe,MAAA,EAAQ,GAAA,EAAK,EAAE,GAAG,OAAA,EAAS,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa,GAAA,CAAI,OAAA,EAAS,CAAA;AAAA,IAChG;AAAA,GACF;AACF;AAEA,SAAS,QAAA,CAAS,QAAsB,MAAA,EAAyB;AAC/D,EAAA,MAAA,CAAO,MAAM,OAAA,EAAS,CAAC,QAAQ,UAAA,CAAW,MAAA,EAAQ,GAAmB,CAAC,CAAA;AACtE,EAAA,MAAA,CAAO,SAAA,CAAU,UAAA,EAAY,qBAAA,CAAsB,MAAM,CAAC,CAAA;AAC5D;AAGO,SAAS,IAAI,MAAA,EAA4B;AAC9C,EAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AACvB;AAGO,SAAS,UAAU,OAAA,EAAiF;AACzG,EAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AACnC,EAAA,OAAO,CAAC,MAAA,KAAW,QAAA,CAAS,MAAA,EAAQ,MAAM,CAAA;AAC5C;;;AC1BA,gBAAA,CAAiBA,eAAM,CAAA","file":"net.cjs","sourcesContent":["/**\n * summitjs/net — signal-factory injection.\n *\n * The net layer must create signals with Summit's ONE reactivity runtime, but\n * it reaches that runtime differently per target: the npm entry imports it from\n * \"summitjs\" (deduped by the consumer's bundler), while the CDN drop-in reads it\n * off the global the core script already installed. Both wire it via\n * setSignalFactory before any resource is created; resource.ts makes its signals\n * through here.\n */\nimport type { Signal } from \"summitjs\";\n\ntype SignalFactory = <T>(initial: T) => Signal<T>;\n\nlet factory: SignalFactory | undefined;\n\nexport function setSignalFactory(fn: SignalFactory): void {\n  factory = fn;\n}\n\nexport function signal<T>(initial: T): Signal<T> {\n  if (!factory) {\n    throw new Error(\n      'summitjs/net: reactivity is not wired up. Import it from \"summitjs/net\", or load summit-net.min.js after summit.min.js.',\n    );\n  }\n  return factory(initial);\n}\n","/**\n * summitjs/net — the HTTP client.\n *\n * A thin, dependency-free wrapper over `fetch` that fixes fetch's real-world\n * footguns: it throws a structured error on non-2xx, sends and parses JSON\n * automatically, serializes params, supports a baseURL, default headers,\n * per-request timeout, and cancellation. No eval, no codegen, so it stays\n * CSP-safe like the rest of Summit.\n */\n\n/** A structured error thrown for non-2xx responses, timeouts, and aborts. */\nexport class NetError extends Error {\n  status: number;\n  body: unknown;\n  url: string;\n  method: string;\n  aborted: boolean;\n\n  constructor(\n    message: string,\n    init: { status: number; body: unknown; url: string; method: string; aborted: boolean },\n  ) {\n    super(message);\n    this.name = \"NetError\";\n    this.status = init.status;\n    this.body = init.body;\n    this.url = init.url;\n    this.method = init.method;\n    this.aborted = init.aborted;\n  }\n}\n\nexport type NetParams = Record<string, string | number | boolean | null | undefined>;\n\nexport interface NetRequest {\n  method?: string;\n  headers?: Record<string, string>;\n  params?: NetParams;\n  /** A value: objects/arrays are JSON-encoded; strings are sent as-is. */\n  body?: unknown;\n  /** Abort this request when the given signal aborts. */\n  signal?: AbortSignal;\n  /** Abort automatically after this many milliseconds. */\n  timeout?: number;\n}\n\nexport interface NetClientOptions {\n  baseURL?: string;\n  /** Static headers, or a function evaluated per request (e.g. for auth tokens). */\n  headers?: Record<string, string> | (() => Record<string, string>);\n  timeout?: number;\n  /** Inspect or replace the request just before it is sent. */\n  beforeRequest?: (req: NetInit) => void | NetInit;\n  /** Inspect or replace the response before the body is read. */\n  afterResponse?: (res: Response) => void | Response;\n  /** Called with every NetError (e.g. redirect on 401). Re-throws afterward. */\n  onError?: (err: NetError) => void;\n}\n\nexport type NetInit = RequestInit & { url: string };\n\nexport interface NetClient {\n  request<T = unknown>(path: string, options?: NetRequest): Promise<T>;\n  get<T = unknown>(path: string, options?: NetRequest): Promise<T>;\n  post<T = unknown>(path: string, body?: unknown, options?: NetRequest): Promise<T>;\n  put<T = unknown>(path: string, body?: unknown, options?: NetRequest): Promise<T>;\n  patch<T = unknown>(path: string, body?: unknown, options?: NetRequest): Promise<T>;\n  delete<T = unknown>(path: string, options?: NetRequest): Promise<T>;\n  /** The client's live defaults; mutate to reconfigure baseURL/headers at runtime. */\n  options: NetClientOptions;\n}\n\nexport function createClient(defaults: NetClientOptions = {}): NetClient {\n  async function request<T = unknown>(path: string, req: NetRequest = {}): Promise<T> {\n    const controller = new AbortController();\n    const timeoutMs = req.timeout ?? defaults.timeout;\n    const timer = timeoutMs ? setTimeout(() => controller.abort(), timeoutMs) : undefined;\n    // Chain an external signal onto our controller so both timeout and the\n    // caller's own cancellation abort the same request.\n    if (req.signal) {\n      if (req.signal.aborted) controller.abort();\n      else req.signal.addEventListener(\"abort\", () => controller.abort(), { once: true });\n    }\n\n    const method = (req.method ?? \"GET\").toUpperCase();\n    const url = withParams(joinURL(defaults.baseURL, path), req.params);\n    const baseHeaders = typeof defaults.headers === \"function\" ? defaults.headers() : defaults.headers;\n    const headers: Record<string, string> = { ...baseHeaders, ...req.headers };\n\n    let init: NetInit = { url, method, headers, signal: controller.signal };\n    if (req.body !== undefined && method !== \"GET\" && method !== \"HEAD\") {\n      if (!hasHeader(headers, \"content-type\") && typeof req.body !== \"string\") {\n        headers[\"content-type\"] = \"application/json\";\n      }\n      init.body = typeof req.body === \"string\" ? req.body : JSON.stringify(req.body);\n    }\n\n    const patched = defaults.beforeRequest?.(init);\n    if (patched) init = patched;\n\n    try {\n      let res = await fetch(init.url, init);\n      const swapped = defaults.afterResponse?.(res);\n      if (swapped) res = swapped;\n      const body = await readBody(res);\n      if (!res.ok) {\n        throw new NetError(`Request failed with status ${res.status}`, {\n          status: res.status,\n          body,\n          url: init.url,\n          method,\n          aborted: false,\n        });\n      }\n      return body as T;\n    } catch (err) {\n      const e = normalizeError(err, init.url, method);\n      defaults.onError?.(e);\n      throw e;\n    } finally {\n      if (timer) clearTimeout(timer);\n    }\n  }\n\n  const client: NetClient = {\n    request,\n    get: (path, options) => request(path, { ...options, method: \"GET\" }),\n    post: (path, body, options) => request(path, { ...options, method: \"POST\", body }),\n    put: (path, body, options) => request(path, { ...options, method: \"PUT\", body }),\n    patch: (path, body, options) => request(path, { ...options, method: \"PATCH\", body }),\n    delete: (path, options) => request(path, { ...options, method: \"DELETE\" }),\n    options: defaults,\n  };\n  return client;\n}\n\nfunction normalizeError(err: unknown, url: string, method: string): NetError {\n  if (err instanceof NetError) return err;\n  const aborted = (err as { name?: string })?.name === \"AbortError\";\n  return new NetError(aborted ? \"Request aborted\" : (err as Error)?.message ?? \"Network request failed\", {\n    status: 0,\n    body: undefined,\n    url,\n    method,\n    aborted,\n  });\n}\n\nasync function readBody(res: Response): Promise<unknown> {\n  const type = res.headers.get(\"content-type\") ?? \"\";\n  const text = await res.text();\n  if (text === \"\") return undefined;\n  if (type.includes(\"application/json\") || type.includes(\"+json\")) {\n    try {\n      return JSON.parse(text);\n    } catch {\n      return text; // malformed JSON: hand back the raw text rather than throwing\n    }\n  }\n  return text;\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n  const lower = name.toLowerCase();\n  return Object.keys(headers).some((k) => k.toLowerCase() === lower);\n}\n\nfunction joinURL(base: string | undefined, path: string): string {\n  if (!base || /^[a-z][a-z0-9+.-]*:\\/\\//i.test(path)) return path;\n  return `${base.replace(/\\/+$/, \"\")}/${path.replace(/^\\/+/, \"\")}`;\n}\n\nfunction withParams(url: string, params?: NetParams): string {\n  if (!params) return url;\n  const query = new URLSearchParams();\n  for (const [key, value] of Object.entries(params)) {\n    if (value != null) query.set(key, String(value));\n  }\n  const suffix = query.toString();\n  if (!suffix) return url;\n  return `${url}${url.includes(\"?\") ? \"&\" : \"?\"}${suffix}`;\n}\n","/**\n * summitjs/net — the reactive resource.\n *\n * A resource wraps a request in Summit signals: `data`, `error`, `loading`,\n * and `status` are exposed as auto-unwrapping getters, so reading them inside a\n * directive (`s-text=\"user.data.name\"`, `s-show=\"user.loading\"`) subscribes the\n * DOM to exactly that field. This is the key win over a promise wrapper: the\n * view updates itself.\n *\n * It also closes the footguns the stress test found:\n *  - out-of-order responses: a monotonic sequence means the latest wins;\n *  - non-2xx: surfaces through `error` (the client already throws);\n *  - unmount leaks: `onCleanup` aborts the in-flight request;\n *  - unhandled rejections: refetch never rejects — failures land in `error`.\n */\n\n// Signals come from the injected runtime factory (see runtime.ts) so the net\n// layer shares Summit's ONE reactivity runtime whether loaded via npm or CDN;\n// a second copy would mean resource signals could not drive the core's DOM.\nimport { signal } from \"./runtime.js\";\nimport type { NetClient, NetError, NetRequest } from \"./client.js\";\n\nexport type ResourceStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\nexport interface ResourceOptions extends NetRequest {\n  /** Fetch immediately on creation. Default true. */\n  immediate?: boolean;\n  /** Register a teardown callback (Summit passes the element's cleanup here). */\n  onCleanup?: (fn: () => void) => void;\n}\n\nexport interface MutateOptions {\n  /** Persist the optimistic change; on rejection the previous value is restored. */\n  request?: () => Promise<unknown>;\n  /** Roll back on a failed request. Default true. */\n  rollbackOnError?: boolean;\n}\n\nexport interface Resource<T> {\n  readonly data: T | undefined;\n  readonly error: NetError | undefined;\n  readonly loading: boolean;\n  readonly status: ResourceStatus;\n  /** Re-run the request (optionally overriding params/headers). Never rejects. */\n  refetch(overrides?: NetRequest): Promise<T | undefined>;\n  /** Optimistically set data; with `request`, roll back if the request fails. */\n  mutate(next: T | ((prev: T | undefined) => T), options?: MutateOptions): void;\n  /** Cancel the in-flight request and return to idle. */\n  abort(): void;\n}\n\nexport function createResource<T = unknown>(\n  client: NetClient,\n  url: string | (() => string),\n  options: ResourceOptions = {},\n): Resource<T> {\n  const dataSig = signal<T | undefined>(undefined);\n  const errorSig = signal<NetError | undefined>(undefined);\n  const loadingSig = signal(false);\n  const statusSig = signal<ResourceStatus>(\"idle\");\n\n  const { immediate, onCleanup, ...requestDefaults } = options;\n  let seq = 0;\n  let controller: AbortController | undefined;\n\n  async function refetch(overrides: NetRequest = {}): Promise<T | undefined> {\n    const current = ++seq;\n    controller?.abort();\n    controller = new AbortController();\n    loadingSig.set(true);\n    statusSig.set(\"loading\");\n    errorSig.set(undefined);\n    try {\n      const target = typeof url === \"function\" ? url() : url;\n      const result = await client.request<T>(target, {\n        ...requestDefaults,\n        ...overrides,\n        signal: controller.signal,\n      });\n      if (current !== seq) return undefined; // a newer request superseded this one\n      dataSig.set(result);\n      statusSig.set(\"success\");\n      return result;\n    } catch (err) {\n      if (current !== seq) return undefined; // stale failure, ignore\n      const e = err as NetError;\n      if (e.aborted) {\n        statusSig.set(\"idle\");\n        return undefined;\n      }\n      errorSig.set(e);\n      statusSig.set(\"error\");\n      return undefined;\n    } finally {\n      if (current === seq) loadingSig.set(false);\n    }\n  }\n\n  const resource: Resource<T> = {\n    get data() {\n      return dataSig();\n    },\n    get error() {\n      return errorSig();\n    },\n    get loading() {\n      return loadingSig();\n    },\n    get status() {\n      return statusSig();\n    },\n    refetch,\n    mutate(next, mutateOptions = {}) {\n      const previous = dataSig.peek();\n      dataSig.set((prev) => (typeof next === \"function\" ? (next as (p: T | undefined) => T)(prev) : next));\n      if (!mutateOptions.request) return;\n      // Persist the optimistic change; roll back and surface the error on failure.\n      void Promise.resolve()\n        .then(mutateOptions.request)\n        .catch((err) => {\n          if (mutateOptions.rollbackOnError !== false) dataSig.set(previous);\n          errorSig.set(err as NetError);\n        });\n    },\n    abort() {\n      seq++;\n      controller?.abort();\n      controller = undefined;\n      loadingSig.set(false);\n      if (statusSig.peek() === \"loading\") statusSig.set(\"idle\");\n    },\n  };\n\n  onCleanup?.(() => resource.abort());\n  if (immediate !== false) void refetch();\n  return resource;\n}\n","/**\n * summitjs/net — the `s-resource` directive.\n *\n *   <div s-resource:users=\"{ url: '/api/users', immediate: true }\">\n *     <p s-show=\"users.loading\">Loading…</p>\n *     <p s-show=\"users.error\" s-text=\"users.error.message\"></p>\n *     <template s-for=\"u in users.data || []\" :key=\"u.id\"><li s-text=\"u.name\"></li></template>\n *   </div>\n *\n * The config expression is evaluated reactively: when a value it reads changes\n * (e.g. a `params: { q }` bound to state), the resource refetches with the new\n * params, and latest-wins cancellation makes stale responses harmless. An\n * optional `debounce` throttles those refetches for search-as-you-type.\n */\n\nimport type { DirectiveHandler } from \"summitjs\";\nimport { createResource, type Resource } from \"./resource.js\";\nimport type { NetClient, NetParams } from \"./client.js\";\n\ninterface ResourceConfig {\n  url?: string;\n  params?: NetParams;\n  headers?: Record<string, string>;\n  method?: string;\n  body?: unknown;\n  immediate?: boolean;\n  debounce?: number;\n  timeout?: number;\n}\n\nexport function makeResourceDirective(client: NetClient): DirectiveHandler {\n  return (el, meta, utils) => {\n    const name = meta.value;\n    if (!name) {\n      console.warn(\"[summit] s-resource needs a name, e.g. s-resource:users=\\\"{ url: '/api/users' }\\\".\", el);\n      return;\n    }\n\n    const scope = utils.scopes[utils.scopes.length - 1] as Record<string, unknown> | undefined;\n    let resource: Resource<unknown> | undefined;\n    let timer: ReturnType<typeof setTimeout> | undefined;\n\n    const readConfig = (): ResourceConfig => (utils.evaluate(meta.expression) || {}) as ResourceConfig;\n\n    utils.effect(() => {\n      const cfg = readConfig(); // subscribes to reactive params (q, page, …)\n      if (!cfg.url) return;\n      const req = { params: cfg.params, headers: cfg.headers, method: cfg.method, body: cfg.body, timeout: cfg.timeout };\n\n      if (!resource) {\n        resource = createResource(client, () => readConfig().url ?? cfg.url!, {\n          ...req,\n          immediate: cfg.immediate !== false,\n          onCleanup: utils.cleanup,\n        });\n        if (scope) scope[name] = resource;\n        return;\n      }\n\n      // Config changed after creation: refetch with the new request options,\n      // debounced when asked. Latest-wins means out-of-order replies are safe.\n      const run = () => resource!.refetch(req);\n      if (cfg.debounce) {\n        if (timer) clearTimeout(timer);\n        timer = setTimeout(run, cfg.debounce);\n      } else {\n        run();\n      }\n    });\n\n    utils.cleanup(() => {\n      if (timer) clearTimeout(timer);\n    });\n  };\n}\n","/**\n * summitjs/net — plugin registration.\n *\n * Shared by both the npm entry (index.ts) and the CDN drop-in (cdn.ts). It only\n * *type*-imports from \"summitjs\", so it carries no runtime dependency on the\n * core — the CDN build can bundle it into a self-contained IIFE that reads the\n * core off the global instead.\n */\nimport type { SummitGlobal, MagicContext } from \"summitjs\";\nimport { createClient } from \"./client.js\";\nimport type { NetClient } from \"./client.js\";\nimport { createResource } from \"./resource.js\";\nimport type { Resource, ResourceOptions } from \"./resource.js\";\nimport { makeResourceDirective } from \"./directive.js\";\n\n/** The default client shared by the `$fetch` magic and `s-resource` directive. */\nexport const http: NetClient = createClient();\n\n/** A client bound to an element: resources it creates auto-abort on unmount. */\nexport interface BoundClient extends NetClient {\n  resource<T = unknown>(url: string | (() => string), options?: ResourceOptions): Resource<T>;\n}\n\nfunction bindClient(client: NetClient, ctx: MagicContext): BoundClient {\n  return {\n    ...client,\n    resource(url, options = {}) {\n      return createResource(client, url, { ...options, onCleanup: options.onCleanup ?? ctx.cleanup });\n    },\n  };\n}\n\nfunction register(summit: SummitGlobal, client: NetClient): void {\n  summit.magic(\"fetch\", (ctx) => bindClient(client, ctx as MagicContext));\n  summit.directive(\"resource\", makeResourceDirective(client));\n}\n\n/** Ready-to-use plugin backed by the default client: `Summit.plugin(net)`. */\nexport function net(summit: SummitGlobal): void {\n  register(summit, http);\n}\n\n/** A configured plugin: `Summit.plugin(createNet({ baseURL: \"/api\" }))`. */\nexport function createNet(options: import(\"./client.js\").NetClientOptions): (summit: SummitGlobal) => void {\n  const client = createClient(options);\n  return (summit) => register(summit, client);\n}\n","/**\n * summitjs/net — a tiny reactive data layer for Summit (npm entry).\n *\n * Optional, shipped as its own entry so the core stays lean. Use it either\n * imperatively (`createClient`, `createResource`) or through Summit by\n * registering the plugin, which adds the `$fetch` magic and the `s-resource`\n * directive:\n *\n *   import Summit from \"summitjs\";\n *   import { net } from \"summitjs/net\";\n *   Summit.plugin(net);            // or Summit.plugin(createNet({ baseURL: \"/api\" }))\n *   Summit.start();\n *\n * CDN users load summit-net.min.js after summit.min.js instead; see cdn.ts.\n */\nimport { signal } from \"summitjs\";\nimport { setSignalFactory } from \"./runtime.js\";\n\n// Wire the net layer to the core's reactivity runtime. `summitjs` is external in\n// this build, so a bundler dedupes it to the single installed copy.\nsetSignalFactory(signal);\n\nexport { createClient, NetError } from \"./client.js\";\nexport type { NetClient, NetClientOptions, NetRequest, NetParams, NetInit } from \"./client.js\";\nexport { createResource } from \"./resource.js\";\nexport type { Resource, ResourceOptions, ResourceStatus, MutateOptions } from \"./resource.js\";\nexport { http, net, createNet } from \"./registry.js\";\nexport type { BoundClient } from \"./registry.js\";\n"]}