fauxbase-svelte 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -27,6 +27,16 @@ function setFauxbaseContext(client) {
27
27
  };
28
28
  }
29
29
  };
30
+ const eventBus = client._eventBus;
31
+ if (eventBus) {
32
+ eventBus.onAny((event) => {
33
+ if (event.source !== "remote") return;
34
+ const svc = client[event.resource];
35
+ if (svc) {
36
+ value.invalidate(svc);
37
+ }
38
+ });
39
+ }
30
40
  svelte.setContext(FAUXBASE_KEY, value);
31
41
  return value;
32
42
  }
@@ -231,6 +241,14 @@ function useMutation(service, _ctx) {
231
241
  error: { subscribe: error.subscribe }
232
242
  };
233
243
  }
244
+ function useEvent(serviceOrResource, handler) {
245
+ const ctx = getFauxbaseContext();
246
+ const eventBus = ctx.client._eventBus;
247
+ if (!eventBus) return;
248
+ const resource = typeof serviceOrResource === "string" ? serviceOrResource : serviceOrResource.resourceName;
249
+ const unsub = eventBus.on(resource, handler);
250
+ svelte.onDestroy(unsub);
251
+ }
234
252
  function useAuth(_ctx) {
235
253
  const ctx = _ctx ?? getFauxbaseContext();
236
254
  const authService = ctx.client.auth;
@@ -301,6 +319,7 @@ exports.createFauxbaseContext = createFauxbaseContext;
301
319
  exports.getFauxbaseContext = getFauxbaseContext;
302
320
  exports.setFauxbaseContext = setFauxbaseContext;
303
321
  exports.useAuth = useAuth;
322
+ exports.useEvent = useEvent;
304
323
  exports.useFauxbase = useFauxbase;
305
324
  exports.useGet = useGet;
306
325
  exports.useList = useList;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context.ts","../src/use-fauxbase.ts","../src/use-list.ts","../src/use-get.ts","../src/use-mutation.ts","../src/use-auth.ts"],"names":["setContext","getContext","writable","onDestroy"],"mappings":";;;;;;AAIA,IAAM,YAAA,GAAe,UAAA;AAEd,SAAS,mBAAmB,MAAA,EAAmC;AACpE,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAmC;AAExD,EAAA,MAAM,KAAA,GAA8B;AAAA,IAClC,MAAA;AAAA,IACA,UAAA,EAAY,CAAC,OAAA,KAA0B;AACrC,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AACxC,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,UAAA,EAAA,EAAG;AAAA,QACL;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,OAAA,EAAuB,SAAA,KAA0B;AAC3D,MAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1B,QAAA,QAAA,CAAS,GAAA,CAAI,OAAA,kBAAS,IAAI,GAAA,EAAK,CAAA;AAAA,MACjC;AACA,MAAA,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,CAAG,GAAA,CAAI,SAAS,CAAA;AACpC,MAAA,OAAO,MAAM;AACX,QAAA,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG,MAAA,CAAO,SAAS,CAAA;AAAA,MACzC,CAAA;AAAA,IACF;AAAA,GACF;AAEA,EAAAA,iBAAA,CAAW,cAAc,KAAK,CAAA;AAC9B,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,kBAAA,GAA2C;AACzD,EAAA,MAAM,GAAA,GAAMC,kBAAiC,YAAY,CAAA;AACzD,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,mFAAmF,CAAA;AAAA,EACrG;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,sBAAsB,MAAA,EAAmC;AACvE,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAmC;AAExD,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,UAAA,EAAY,CAAC,OAAA,KAA0B;AACrC,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AACxC,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,UAAA,EAAA,EAAG;AAAA,QACL;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,OAAA,EAAuB,SAAA,KAA0B;AAC3D,MAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1B,QAAA,QAAA,CAAS,GAAA,CAAI,OAAA,kBAAS,IAAI,GAAA,EAAK,CAAA;AAAA,MACjC;AACA,MAAA,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,CAAG,GAAA,CAAI,SAAS,CAAA;AACpC,MAAA,OAAO,MAAM;AACX,QAAA,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG,MAAA,CAAO,SAAS,CAAA;AAAA,MACzC,CAAA;AAAA,IACF;AAAA,GACF;AACF;;;AChEO,SAAS,WAAA,GAAc;AAC5B,EAAA,MAAM,MAAM,kBAAA,EAAmB;AAC/B,EAAA,OAAO,GAAA,CAAI,MAAA;AACb;ACEO,SAAS,OAAA,CACd,OAAA,EACA,KAAA,EACA,OAAA,EACA,IAAA,EACkB;AAClB,EAAA,MAAM,GAAA,GAAM,QAAQ,kBAAA,EAAmB;AACvC,EAAA,MAAM,KAAA,GAAQC,cAAA,CAAc,EAAE,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAOA,eAA0B,IAAI,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAUA,eAAS,IAAI,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAQA,eAAuB,IAAI,CAAA;AACzC,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,KAAY,KAAA;AAErC,EAAA,MAAM,QAAQ,YAAY;AACxB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,IAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AACvC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,KAAA,CAAM,GAAA,CAAI,OAAO,KAAK,CAAA;AACtB,QAAA,IAAA,CAAK,GAAA,CAAI,OAAO,IAAI,CAAA;AAAA,MACtB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,KAAA,CAAM,GAAA,CAAI,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAAA,MAC/D;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,OAAA,EAAS,KAAK,CAAA;AAG1C,EAAA,KAAA,EAAM;AAGN,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,OAAA,EAAS,mBAAmB,OAAA,EAAS;AACvC,IAAA,UAAA,GAAa,WAAA,CAAY,KAAA,EAAO,OAAA,CAAQ,eAAe,CAAA;AAAA,EACzD;AAGA,EAAA,IAAI;AACF,IAAAC,gBAAA,CAAU,MAAM;AACd,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,KAAA,EAAM;AACN,MAAA,IAAI,UAAA,gBAA0B,UAAU,CAAA;AAAA,IAC1C,CAAC,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,KAAA,EAAM;AACN,IAAA,IAAI,UAAA,gBAA0B,UAAU,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,CAAM,SAAA,EAAU;AAAA,IACpC,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAU;AAAA,IAClC,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAU;AAAA,IACxC,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,CAAM,SAAA,EAAU;AAAA,IACpC,OAAA,EAAS,KAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AACF;ACzEO,SAAS,MAAA,CACd,OAAA,EACA,EAAA,EACA,OAAA,EACA,IAAA,EACiB;AACjB,EAAA,MAAM,GAAA,GAAM,QAAQ,kBAAA,EAAmB;AACvC,EAAA,MAAM,IAAA,GAAOD,eAAmB,IAAI,CAAA;AACpC,EAAA,MAAM,OAAA,GAAUA,eAAS,IAAI,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAQA,eAAuB,IAAI,CAAA;AACzC,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,MAAM,OAAA,GAAU,OAAA,EAAS,OAAA,KAAY,KAAA,IAAS,EAAA,IAAM,IAAA;AAEpD,EAAA,MAAM,QAAQ,YAAY;AACxB,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,EAAA,EAAI;AACnB,MAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,MAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AACjB,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,IAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACnC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,IAAA,CAAK,GAAA,CAAI,OAAO,IAAI,CAAA;AAAA,MACtB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,KAAA,CAAM,GAAA,CAAI,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAC7D,QAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,MACf;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,OAAA,EAAS,KAAK,CAAA;AAG1C,EAAA,KAAA,EAAM;AAEN,EAAA,IAAI;AACF,IAAAC,iBAAU,MAAM;AACd,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,KAAA,EAAM;AAAA,IACR,CAAC,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,KAAA,EAAM;AAAA,EACR,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAU;AAAA,IAClC,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAU;AAAA,IACxC,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,CAAM,SAAA,EAAU;AAAA,IACpC,OAAA,EAAS,KAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AACF;ACnEO,SAAS,WAAA,CACd,SACA,IAAA,EACsB;AACtB,EAAA,MAAM,GAAA,GAAM,QAAQ,kBAAA,EAAmB;AACvC,EAAA,MAAM,OAAA,GAAUD,eAAS,KAAK,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAQA,eAAuB,IAAI,CAAA;AAEzC,EAAA,MAAM,MAAA,GAAS,OAAO,IAAA,KAAiC;AACrD,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,IAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AACxC,MAAA,GAAA,CAAI,WAAW,OAAO,CAAA;AACtB,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,CAAA,GAAI,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAI,CAAC,CAAA;AACX,MAAA,MAAM,CAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,OAAO,EAAA,EAAY,IAAA,KAAiC;AACjE,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,IAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,IAAI,CAAA;AAC5C,MAAA,GAAA,CAAI,WAAW,OAAO,CAAA;AACtB,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,CAAA,GAAI,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAI,CAAC,CAAA;AACX,MAAA,MAAM,CAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,OAAO,EAAA,KAA2B;AAC/C,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,IAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA;AACtC,MAAA,GAAA,CAAI,WAAW,OAAO,CAAA;AACtB,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,CAAA,GAAI,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAI,CAAC,CAAA;AACX,MAAA,MAAM,CAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAU;AAAA,IACxC,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,CAAM,SAAA;AAAU,GACtC;AACF;AC/DO,SAAS,QACd,IAAA,EACkB;AAClB,EAAA,MAAM,GAAA,GAAM,QAAQ,kBAAA,EAAmB;AACvC,EAAA,MAAM,WAAA,GAAc,IAAI,MAAA,CAAO,IAAA;AAE/B,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,EAC1E;AAEA,EAAA,MAAM,IAAA,GAAOA,cAAAA,CAAmB,WAAA,CAAY,WAAW,CAAA;AACvD,EAAA,MAAM,UAAA,GAAaA,cAAAA,CAAkB,WAAA,CAAY,UAAU,CAAA;AAC3D,EAAA,MAAM,KAAA,GAAQA,cAAAA,CAAwB,WAAA,CAAY,KAAK,CAAA;AACvD,EAAA,MAAM,OAAA,GAAUA,eAAS,KAAK,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAQA,eAAuB,IAAI,CAAA;AAEzC,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAA,CAAK,GAAA,CAAI,YAAY,WAAW,CAAA;AAChC,IAAA,UAAA,CAAW,GAAA,CAAI,YAAY,UAAU,CAAA;AACrC,IAAA,KAAA,CAAM,GAAA,CAAI,YAAY,KAAK,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAO,WAAA,KAAiE;AACpF,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,IAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,KAAA,CAAM,WAAW,CAAA;AAClD,MAAA,SAAA,EAAU;AACV,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,CAAA,GAAI,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAI,CAAC,CAAA;AACX,MAAA,MAAM,CAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,OAAO,IAAA,KAAiC;AACvD,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,IAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,QAAA,CAAS,IAAI,CAAA;AAC9C,MAAA,SAAA,EAAU;AACV,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,CAAA,GAAI,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAI,CAAC,CAAA;AACX,MAAA,MAAM,CAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,WAAA,CAAY,MAAA,EAAO;AACnB,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAA0B;AACzC,IAAA,OAAO,WAAA,CAAY,QAAQ,IAAI,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAU;AAAA,IAClC,UAAA,EAAY,EAAE,SAAA,EAAW,UAAA,CAAW,SAAA,EAAU;AAAA,IAC9C,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,CAAM,SAAA,EAAU;AAAA,IACpC,KAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAU;AAAA,IACxC,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,CAAM,SAAA;AAAU,GACtC;AACF","file":"index.cjs","sourcesContent":["import { setContext, getContext } from 'svelte';\nimport type { Service } from 'fauxbase';\nimport type { FauxbaseContextValue } from './types';\n\nconst FAUXBASE_KEY = 'fauxbase';\n\nexport function setFauxbaseContext(client: any): FauxbaseContextValue {\n const registry = new Map<Service<any>, Set<() => void>>();\n\n const value: FauxbaseContextValue = {\n client,\n invalidate: (service: Service<any>) => {\n const subscribers = registry.get(service);\n if (subscribers) {\n for (const fn of subscribers) {\n fn();\n }\n }\n },\n subscribe: (service: Service<any>, refetchFn: () => void) => {\n if (!registry.has(service)) {\n registry.set(service, new Set());\n }\n registry.get(service)!.add(refetchFn);\n return () => {\n registry.get(service)?.delete(refetchFn);\n };\n },\n };\n\n setContext(FAUXBASE_KEY, value);\n return value;\n}\n\nexport function getFauxbaseContext(): FauxbaseContextValue {\n const ctx = getContext<FauxbaseContextValue>(FAUXBASE_KEY);\n if (!ctx) {\n throw new Error('getFauxbaseContext requires setFauxbaseContext to be called in a parent component');\n }\n return ctx;\n}\n\n// For testing: create context value without svelte's setContext/getContext\nexport function createFauxbaseContext(client: any): FauxbaseContextValue {\n const registry = new Map<Service<any>, Set<() => void>>();\n\n return {\n client,\n invalidate: (service: Service<any>) => {\n const subscribers = registry.get(service);\n if (subscribers) {\n for (const fn of subscribers) {\n fn();\n }\n }\n },\n subscribe: (service: Service<any>, refetchFn: () => void) => {\n if (!registry.has(service)) {\n registry.set(service, new Set());\n }\n registry.get(service)!.add(refetchFn);\n return () => {\n registry.get(service)?.delete(refetchFn);\n };\n },\n };\n}\n","import { getFauxbaseContext } from './context';\n\nexport function useFauxbase() {\n const ctx = getFauxbaseContext();\n return ctx.client;\n}\n","import { writable } from 'svelte/store';\nimport { onDestroy } from 'svelte';\nimport type { Service, Entity, QueryParams, PageMeta } from 'fauxbase';\nimport type { UseListResult, UseListOptions } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useList<T extends Entity>(\n service: Service<T>,\n query?: QueryParams,\n options?: UseListOptions,\n _ctx?: FauxbaseContextValue,\n): UseListResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const items = writable<T[]>([]);\n const meta = writable<PageMeta | null>(null);\n const loading = writable(true);\n const error = writable<Error | null>(null);\n let destroyed = false;\n\n const enabled = options?.enabled !== false;\n\n const fetch = async () => {\n if (!enabled) return;\n loading.set(true);\n error.set(null);\n try {\n const result = await service.list(query);\n if (!destroyed) {\n items.set(result.items);\n meta.set(result.meta);\n }\n } catch (err) {\n if (!destroyed) {\n error.set(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (!destroyed) {\n loading.set(false);\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n // Initial fetch\n fetch();\n\n // Refetch interval\n let intervalId: ReturnType<typeof setInterval> | undefined;\n if (options?.refetchInterval && enabled) {\n intervalId = setInterval(fetch, options.refetchInterval);\n }\n\n // Cleanup — try onDestroy but don't fail outside component context\n try {\n onDestroy(() => {\n destroyed = true;\n unsub();\n if (intervalId) clearInterval(intervalId);\n });\n } catch {\n // Outside component context (tests) — caller handles cleanup\n }\n\n const destroy = () => {\n destroyed = true;\n unsub();\n if (intervalId) clearInterval(intervalId);\n };\n\n return {\n items: { subscribe: items.subscribe },\n meta: { subscribe: meta.subscribe },\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n refetch: fetch,\n _destroy: destroy,\n } as UseListResult<T> & { _destroy: () => void };\n}\n","import { writable } from 'svelte/store';\nimport { onDestroy } from 'svelte';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseGetResult, UseGetOptions } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useGet<T extends Entity>(\n service: Service<T>,\n id: string | null | undefined,\n options?: UseGetOptions,\n _ctx?: FauxbaseContextValue,\n): UseGetResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const data = writable<T | null>(null);\n const loading = writable(true);\n const error = writable<Error | null>(null);\n let destroyed = false;\n\n const enabled = options?.enabled !== false && id != null;\n\n const fetch = async () => {\n if (!enabled || !id) {\n data.set(null);\n loading.set(false);\n return;\n }\n loading.set(true);\n error.set(null);\n try {\n const result = await service.get(id);\n if (!destroyed) {\n data.set(result.data);\n }\n } catch (err) {\n if (!destroyed) {\n error.set(err instanceof Error ? err : new Error(String(err)));\n data.set(null);\n }\n } finally {\n if (!destroyed) {\n loading.set(false);\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n // Initial fetch\n fetch();\n\n try {\n onDestroy(() => {\n destroyed = true;\n unsub();\n });\n } catch {\n // Outside component context\n }\n\n const destroy = () => {\n destroyed = true;\n unsub();\n };\n\n return {\n data: { subscribe: data.subscribe },\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n refetch: fetch,\n _destroy: destroy,\n } as UseGetResult<T> & { _destroy: () => void };\n}\n","import { writable } from 'svelte/store';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseMutationResult } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useMutation<T extends Entity>(\n service: Service<T>,\n _ctx?: FauxbaseContextValue,\n): UseMutationResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const loading = writable(false);\n const error = writable<Error | null>(null);\n\n const create = async (data: Partial<T>): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await service.create(data);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const update = async (id: string, data: Partial<T>): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await service.update(id, data);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const remove = async (id: string): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await service.delete(id);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n return {\n create,\n update,\n remove,\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n };\n}\n","import { writable } from 'svelte/store';\nimport type { Entity } from 'fauxbase';\nimport type { UseAuthResult } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useAuth<T extends Entity>(\n _ctx?: FauxbaseContextValue,\n): UseAuthResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const authService = ctx.client.auth;\n\n if (!authService) {\n throw new Error('useAuth requires auth to be configured in createClient');\n }\n\n const user = writable<T | null>(authService.currentUser);\n const isLoggedIn = writable<boolean>(authService.isLoggedIn);\n const token = writable<string | null>(authService.token);\n const loading = writable(false);\n const error = writable<Error | null>(null);\n\n const syncState = () => {\n user.set(authService.currentUser);\n isLoggedIn.set(authService.isLoggedIn);\n token.set(authService.token);\n };\n\n const login = async (credentials: { email: string; password: string }): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await authService.login(credentials);\n syncState();\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const register = async (data: Partial<T>): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await authService.register(data);\n syncState();\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const logout = () => {\n authService.logout();\n syncState();\n };\n\n const hasRole = (role: string): boolean => {\n return authService.hasRole(role);\n };\n\n return {\n user: { subscribe: user.subscribe },\n isLoggedIn: { subscribe: isLoggedIn.subscribe },\n token: { subscribe: token.subscribe },\n login,\n register,\n logout,\n hasRole,\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/context.ts","../src/use-fauxbase.ts","../src/use-list.ts","../src/use-get.ts","../src/use-mutation.ts","../src/use-event.ts","../src/use-auth.ts"],"names":["setContext","getContext","writable","onDestroy"],"mappings":";;;;;;AAIA,IAAM,YAAA,GAAe,UAAA;AAEd,SAAS,mBAAmB,MAAA,EAAmC;AACpE,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAmC;AAExD,EAAA,MAAM,KAAA,GAA8B;AAAA,IAClC,MAAA;AAAA,IACA,UAAA,EAAY,CAAC,OAAA,KAA0B;AACrC,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AACxC,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,UAAA,EAAA,EAAG;AAAA,QACL;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,OAAA,EAAuB,SAAA,KAA0B;AAC3D,MAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1B,QAAA,QAAA,CAAS,GAAA,CAAI,OAAA,kBAAS,IAAI,GAAA,EAAK,CAAA;AAAA,MACjC;AACA,MAAA,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,CAAG,GAAA,CAAI,SAAS,CAAA;AACpC,MAAA,OAAO,MAAM;AACX,QAAA,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG,MAAA,CAAO,SAAS,CAAA;AAAA,MACzC,CAAA;AAAA,IACF;AAAA,GACF;AAGA,EAAA,MAAM,WAAiC,MAAA,CAAO,SAAA;AAC9C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,QAAA,CAAS,KAAA,CAAM,CAAC,KAAA,KAAU;AACxB,MAAA,IAAI,KAAA,CAAM,WAAW,QAAA,EAAU;AAC/B,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AACjC,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,KAAA,CAAM,WAAW,GAAG,CAAA;AAAA,MACtB;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAEA,EAAAA,iBAAA,CAAW,cAAc,KAAK,CAAA;AAC9B,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,kBAAA,GAA2C;AACzD,EAAA,MAAM,GAAA,GAAMC,kBAAiC,YAAY,CAAA;AACzD,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,mFAAmF,CAAA;AAAA,EACrG;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,sBAAsB,MAAA,EAAmC;AACvE,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAmC;AAExD,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,UAAA,EAAY,CAAC,OAAA,KAA0B;AACrC,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AACxC,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,UAAA,EAAA,EAAG;AAAA,QACL;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,OAAA,EAAuB,SAAA,KAA0B;AAC3D,MAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1B,QAAA,QAAA,CAAS,GAAA,CAAI,OAAA,kBAAS,IAAI,GAAA,EAAK,CAAA;AAAA,MACjC;AACA,MAAA,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,CAAG,GAAA,CAAI,SAAS,CAAA;AACpC,MAAA,OAAO,MAAM;AACX,QAAA,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG,MAAA,CAAO,SAAS,CAAA;AAAA,MACzC,CAAA;AAAA,IACF;AAAA,GACF;AACF;;;AC5EO,SAAS,WAAA,GAAc;AAC5B,EAAA,MAAM,MAAM,kBAAA,EAAmB;AAC/B,EAAA,OAAO,GAAA,CAAI,MAAA;AACb;ACEO,SAAS,OAAA,CACd,OAAA,EACA,KAAA,EACA,OAAA,EACA,IAAA,EACkB;AAClB,EAAA,MAAM,GAAA,GAAM,QAAQ,kBAAA,EAAmB;AACvC,EAAA,MAAM,KAAA,GAAQC,cAAA,CAAc,EAAE,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAOA,eAA0B,IAAI,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAUA,eAAS,IAAI,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAQA,eAAuB,IAAI,CAAA;AACzC,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,KAAY,KAAA;AAErC,EAAA,MAAM,QAAQ,YAAY;AACxB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,IAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AACvC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,KAAA,CAAM,GAAA,CAAI,OAAO,KAAK,CAAA;AACtB,QAAA,IAAA,CAAK,GAAA,CAAI,OAAO,IAAI,CAAA;AAAA,MACtB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,KAAA,CAAM,GAAA,CAAI,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAAA,MAC/D;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,OAAA,EAAS,KAAK,CAAA;AAG1C,EAAA,KAAA,EAAM;AAGN,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,OAAA,EAAS,mBAAmB,OAAA,EAAS;AACvC,IAAA,UAAA,GAAa,WAAA,CAAY,KAAA,EAAO,OAAA,CAAQ,eAAe,CAAA;AAAA,EACzD;AAGA,EAAA,IAAI;AACF,IAAAC,gBAAA,CAAU,MAAM;AACd,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,KAAA,EAAM;AACN,MAAA,IAAI,UAAA,gBAA0B,UAAU,CAAA;AAAA,IAC1C,CAAC,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,KAAA,EAAM;AACN,IAAA,IAAI,UAAA,gBAA0B,UAAU,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,CAAM,SAAA,EAAU;AAAA,IACpC,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAU;AAAA,IAClC,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAU;AAAA,IACxC,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,CAAM,SAAA,EAAU;AAAA,IACpC,OAAA,EAAS,KAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AACF;ACzEO,SAAS,MAAA,CACd,OAAA,EACA,EAAA,EACA,OAAA,EACA,IAAA,EACiB;AACjB,EAAA,MAAM,GAAA,GAAM,QAAQ,kBAAA,EAAmB;AACvC,EAAA,MAAM,IAAA,GAAOD,eAAmB,IAAI,CAAA;AACpC,EAAA,MAAM,OAAA,GAAUA,eAAS,IAAI,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAQA,eAAuB,IAAI,CAAA;AACzC,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,MAAM,OAAA,GAAU,OAAA,EAAS,OAAA,KAAY,KAAA,IAAS,EAAA,IAAM,IAAA;AAEpD,EAAA,MAAM,QAAQ,YAAY;AACxB,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,EAAA,EAAI;AACnB,MAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,MAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AACjB,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,IAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACnC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,IAAA,CAAK,GAAA,CAAI,OAAO,IAAI,CAAA;AAAA,MACtB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,KAAA,CAAM,GAAA,CAAI,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAC7D,QAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,MACf;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,OAAA,EAAS,KAAK,CAAA;AAG1C,EAAA,KAAA,EAAM;AAEN,EAAA,IAAI;AACF,IAAAC,iBAAU,MAAM;AACd,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,KAAA,EAAM;AAAA,IACR,CAAC,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,KAAA,EAAM;AAAA,EACR,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAU;AAAA,IAClC,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAU;AAAA,IACxC,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,CAAM,SAAA,EAAU;AAAA,IACpC,OAAA,EAAS,KAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AACF;ACnEO,SAAS,WAAA,CACd,SACA,IAAA,EACsB;AACtB,EAAA,MAAM,GAAA,GAAM,QAAQ,kBAAA,EAAmB;AACvC,EAAA,MAAM,OAAA,GAAUD,eAAS,KAAK,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAQA,eAAuB,IAAI,CAAA;AAEzC,EAAA,MAAM,MAAA,GAAS,OAAO,IAAA,KAAiC;AACrD,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,IAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AACxC,MAAA,GAAA,CAAI,WAAW,OAAO,CAAA;AACtB,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,CAAA,GAAI,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAI,CAAC,CAAA;AACX,MAAA,MAAM,CAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,OAAO,EAAA,EAAY,IAAA,KAAiC;AACjE,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,IAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,IAAI,CAAA;AAC5C,MAAA,GAAA,CAAI,WAAW,OAAO,CAAA;AACtB,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,CAAA,GAAI,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAI,CAAC,CAAA;AACX,MAAA,MAAM,CAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,OAAO,EAAA,KAA2B;AAC/C,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,IAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA;AACtC,MAAA,GAAA,CAAI,WAAW,OAAO,CAAA;AACtB,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,CAAA,GAAI,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAI,CAAC,CAAA;AACX,MAAA,MAAM,CAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAU;AAAA,IACxC,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,CAAM,SAAA;AAAU,GACtC;AACF;ACjEO,SAAS,QAAA,CACd,mBACA,OAAA,EACM;AACN,EAAA,MAAM,MAAM,kBAAA,EAAmB;AAC/B,EAAA,MAAM,QAAA,GAAiC,IAAI,MAAA,CAAO,SAAA;AAClD,EAAA,IAAI,CAAC,QAAA,EAAU;AAEf,EAAA,MAAM,QAAA,GAAW,OAAO,iBAAA,KAAsB,QAAA,GAC1C,oBACC,iBAAA,CAA0B,YAAA;AAE/B,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,OAAO,CAAA;AAC3C,EAAAC,iBAAU,KAAK,CAAA;AACjB;ACZO,SAAS,QACd,IAAA,EACkB;AAClB,EAAA,MAAM,GAAA,GAAM,QAAQ,kBAAA,EAAmB;AACvC,EAAA,MAAM,WAAA,GAAc,IAAI,MAAA,CAAO,IAAA;AAE/B,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,EAC1E;AAEA,EAAA,MAAM,IAAA,GAAOD,cAAAA,CAAmB,WAAA,CAAY,WAAW,CAAA;AACvD,EAAA,MAAM,UAAA,GAAaA,cAAAA,CAAkB,WAAA,CAAY,UAAU,CAAA;AAC3D,EAAA,MAAM,KAAA,GAAQA,cAAAA,CAAwB,WAAA,CAAY,KAAK,CAAA;AACvD,EAAA,MAAM,OAAA,GAAUA,eAAS,KAAK,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAQA,eAAuB,IAAI,CAAA;AAEzC,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAA,CAAK,GAAA,CAAI,YAAY,WAAW,CAAA;AAChC,IAAA,UAAA,CAAW,GAAA,CAAI,YAAY,UAAU,CAAA;AACrC,IAAA,KAAA,CAAM,GAAA,CAAI,YAAY,KAAK,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAO,WAAA,KAAiE;AACpF,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,IAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,KAAA,CAAM,WAAW,CAAA;AAClD,MAAA,SAAA,EAAU;AACV,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,CAAA,GAAI,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAI,CAAC,CAAA;AACX,MAAA,MAAM,CAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,OAAO,IAAA,KAAiC;AACvD,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,IAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,QAAA,CAAS,IAAI,CAAA;AAC9C,MAAA,SAAA,EAAU;AACV,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,CAAA,GAAI,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAI,CAAC,CAAA;AACX,MAAA,MAAM,CAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,WAAA,CAAY,MAAA,EAAO;AACnB,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAA0B;AACzC,IAAA,OAAO,WAAA,CAAY,QAAQ,IAAI,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAU;AAAA,IAClC,UAAA,EAAY,EAAE,SAAA,EAAW,UAAA,CAAW,SAAA,EAAU;AAAA,IAC9C,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,CAAM,SAAA,EAAU;AAAA,IACpC,KAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAU;AAAA,IACxC,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,CAAM,SAAA;AAAU,GACtC;AACF","file":"index.cjs","sourcesContent":["import { setContext, getContext } from 'svelte';\nimport type { Service, EventBus } from 'fauxbase';\nimport type { FauxbaseContextValue } from './types';\n\nconst FAUXBASE_KEY = 'fauxbase';\n\nexport function setFauxbaseContext(client: any): FauxbaseContextValue {\n const registry = new Map<Service<any>, Set<() => void>>();\n\n const value: FauxbaseContextValue = {\n client,\n invalidate: (service: Service<any>) => {\n const subscribers = registry.get(service);\n if (subscribers) {\n for (const fn of subscribers) {\n fn();\n }\n }\n },\n subscribe: (service: Service<any>, refetchFn: () => void) => {\n if (!registry.has(service)) {\n registry.set(service, new Set());\n }\n registry.get(service)!.add(refetchFn);\n return () => {\n registry.get(service)?.delete(refetchFn);\n };\n },\n };\n\n // Bridge remote events → auto-invalidation\n const eventBus: EventBus | undefined = client._eventBus;\n if (eventBus) {\n eventBus.onAny((event) => {\n if (event.source !== 'remote') return;\n const svc = client[event.resource];\n if (svc) {\n value.invalidate(svc);\n }\n });\n }\n\n setContext(FAUXBASE_KEY, value);\n return value;\n}\n\nexport function getFauxbaseContext(): FauxbaseContextValue {\n const ctx = getContext<FauxbaseContextValue>(FAUXBASE_KEY);\n if (!ctx) {\n throw new Error('getFauxbaseContext requires setFauxbaseContext to be called in a parent component');\n }\n return ctx;\n}\n\n// For testing: create context value without svelte's setContext/getContext\nexport function createFauxbaseContext(client: any): FauxbaseContextValue {\n const registry = new Map<Service<any>, Set<() => void>>();\n\n return {\n client,\n invalidate: (service: Service<any>) => {\n const subscribers = registry.get(service);\n if (subscribers) {\n for (const fn of subscribers) {\n fn();\n }\n }\n },\n subscribe: (service: Service<any>, refetchFn: () => void) => {\n if (!registry.has(service)) {\n registry.set(service, new Set());\n }\n registry.get(service)!.add(refetchFn);\n return () => {\n registry.get(service)?.delete(refetchFn);\n };\n },\n };\n}\n","import { getFauxbaseContext } from './context';\n\nexport function useFauxbase() {\n const ctx = getFauxbaseContext();\n return ctx.client;\n}\n","import { writable } from 'svelte/store';\nimport { onDestroy } from 'svelte';\nimport type { Service, Entity, QueryParams, PageMeta } from 'fauxbase';\nimport type { UseListResult, UseListOptions } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useList<T extends Entity>(\n service: Service<T>,\n query?: QueryParams,\n options?: UseListOptions,\n _ctx?: FauxbaseContextValue,\n): UseListResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const items = writable<T[]>([]);\n const meta = writable<PageMeta | null>(null);\n const loading = writable(true);\n const error = writable<Error | null>(null);\n let destroyed = false;\n\n const enabled = options?.enabled !== false;\n\n const fetch = async () => {\n if (!enabled) return;\n loading.set(true);\n error.set(null);\n try {\n const result = await service.list(query);\n if (!destroyed) {\n items.set(result.items);\n meta.set(result.meta);\n }\n } catch (err) {\n if (!destroyed) {\n error.set(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (!destroyed) {\n loading.set(false);\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n // Initial fetch\n fetch();\n\n // Refetch interval\n let intervalId: ReturnType<typeof setInterval> | undefined;\n if (options?.refetchInterval && enabled) {\n intervalId = setInterval(fetch, options.refetchInterval);\n }\n\n // Cleanup — try onDestroy but don't fail outside component context\n try {\n onDestroy(() => {\n destroyed = true;\n unsub();\n if (intervalId) clearInterval(intervalId);\n });\n } catch {\n // Outside component context (tests) — caller handles cleanup\n }\n\n const destroy = () => {\n destroyed = true;\n unsub();\n if (intervalId) clearInterval(intervalId);\n };\n\n return {\n items: { subscribe: items.subscribe },\n meta: { subscribe: meta.subscribe },\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n refetch: fetch,\n _destroy: destroy,\n } as UseListResult<T> & { _destroy: () => void };\n}\n","import { writable } from 'svelte/store';\nimport { onDestroy } from 'svelte';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseGetResult, UseGetOptions } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useGet<T extends Entity>(\n service: Service<T>,\n id: string | null | undefined,\n options?: UseGetOptions,\n _ctx?: FauxbaseContextValue,\n): UseGetResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const data = writable<T | null>(null);\n const loading = writable(true);\n const error = writable<Error | null>(null);\n let destroyed = false;\n\n const enabled = options?.enabled !== false && id != null;\n\n const fetch = async () => {\n if (!enabled || !id) {\n data.set(null);\n loading.set(false);\n return;\n }\n loading.set(true);\n error.set(null);\n try {\n const result = await service.get(id);\n if (!destroyed) {\n data.set(result.data);\n }\n } catch (err) {\n if (!destroyed) {\n error.set(err instanceof Error ? err : new Error(String(err)));\n data.set(null);\n }\n } finally {\n if (!destroyed) {\n loading.set(false);\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n // Initial fetch\n fetch();\n\n try {\n onDestroy(() => {\n destroyed = true;\n unsub();\n });\n } catch {\n // Outside component context\n }\n\n const destroy = () => {\n destroyed = true;\n unsub();\n };\n\n return {\n data: { subscribe: data.subscribe },\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n refetch: fetch,\n _destroy: destroy,\n } as UseGetResult<T> & { _destroy: () => void };\n}\n","import { writable } from 'svelte/store';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseMutationResult } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useMutation<T extends Entity>(\n service: Service<T>,\n _ctx?: FauxbaseContextValue,\n): UseMutationResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const loading = writable(false);\n const error = writable<Error | null>(null);\n\n const create = async (data: Partial<T>): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await service.create(data);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const update = async (id: string, data: Partial<T>): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await service.update(id, data);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const remove = async (id: string): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await service.delete(id);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n return {\n create,\n update,\n remove,\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n };\n}\n","import { onDestroy } from 'svelte';\nimport type { Service, Entity, EventBus, EventHandler } from 'fauxbase';\nimport { getFauxbaseContext } from './context';\n\nexport function useEvent<T extends Entity>(\n serviceOrResource: Service<T> | string,\n handler: EventHandler<T>,\n): void {\n const ctx = getFauxbaseContext();\n const eventBus: EventBus | undefined = ctx.client._eventBus;\n if (!eventBus) return;\n\n const resource = typeof serviceOrResource === 'string'\n ? serviceOrResource\n : (serviceOrResource as any).resourceName;\n\n const unsub = eventBus.on(resource, handler);\n onDestroy(unsub);\n}\n","import { writable } from 'svelte/store';\nimport type { Entity } from 'fauxbase';\nimport type { UseAuthResult } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useAuth<T extends Entity>(\n _ctx?: FauxbaseContextValue,\n): UseAuthResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const authService = ctx.client.auth;\n\n if (!authService) {\n throw new Error('useAuth requires auth to be configured in createClient');\n }\n\n const user = writable<T | null>(authService.currentUser);\n const isLoggedIn = writable<boolean>(authService.isLoggedIn);\n const token = writable<string | null>(authService.token);\n const loading = writable(false);\n const error = writable<Error | null>(null);\n\n const syncState = () => {\n user.set(authService.currentUser);\n isLoggedIn.set(authService.isLoggedIn);\n token.set(authService.token);\n };\n\n const login = async (credentials: { email: string; password: string }): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await authService.login(credentials);\n syncState();\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const register = async (data: Partial<T>): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await authService.register(data);\n syncState();\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const logout = () => {\n authService.logout();\n syncState();\n };\n\n const hasRole = (role: string): boolean => {\n return authService.hasRole(role);\n };\n\n return {\n user: { subscribe: user.subscribe },\n isLoggedIn: { subscribe: isLoggedIn.subscribe },\n token: { subscribe: token.subscribe },\n login,\n register,\n logout,\n hasRole,\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n };\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Readable } from 'svelte/store';
2
- import { Service, PageMeta, Entity, QueryParams } from 'fauxbase';
2
+ import { Service, PageMeta, Entity, QueryParams, EventHandler } from 'fauxbase';
3
3
 
4
4
  interface UseListResult<T> {
5
5
  items: Readable<T[]>;
@@ -60,6 +60,8 @@ declare function useGet<T extends Entity>(service: Service<T>, id: string | null
60
60
 
61
61
  declare function useMutation<T extends Entity>(service: Service<T>, _ctx?: FauxbaseContextValue): UseMutationResult<T>;
62
62
 
63
+ declare function useEvent<T extends Entity>(serviceOrResource: Service<T> | string, handler: EventHandler<T>): void;
64
+
63
65
  declare function useAuth<T extends Entity>(_ctx?: FauxbaseContextValue): UseAuthResult<T>;
64
66
 
65
- export { type FauxbaseContextValue, type UseAuthResult, type UseGetOptions, type UseGetResult, type UseListOptions, type UseListResult, type UseMutationResult, createFauxbaseContext, getFauxbaseContext, setFauxbaseContext, useAuth, useFauxbase, useGet, useList, useMutation };
67
+ export { type FauxbaseContextValue, type UseAuthResult, type UseGetOptions, type UseGetResult, type UseListOptions, type UseListResult, type UseMutationResult, createFauxbaseContext, getFauxbaseContext, setFauxbaseContext, useAuth, useEvent, useFauxbase, useGet, useList, useMutation };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Readable } from 'svelte/store';
2
- import { Service, PageMeta, Entity, QueryParams } from 'fauxbase';
2
+ import { Service, PageMeta, Entity, QueryParams, EventHandler } from 'fauxbase';
3
3
 
4
4
  interface UseListResult<T> {
5
5
  items: Readable<T[]>;
@@ -60,6 +60,8 @@ declare function useGet<T extends Entity>(service: Service<T>, id: string | null
60
60
 
61
61
  declare function useMutation<T extends Entity>(service: Service<T>, _ctx?: FauxbaseContextValue): UseMutationResult<T>;
62
62
 
63
+ declare function useEvent<T extends Entity>(serviceOrResource: Service<T> | string, handler: EventHandler<T>): void;
64
+
63
65
  declare function useAuth<T extends Entity>(_ctx?: FauxbaseContextValue): UseAuthResult<T>;
64
66
 
65
- export { type FauxbaseContextValue, type UseAuthResult, type UseGetOptions, type UseGetResult, type UseListOptions, type UseListResult, type UseMutationResult, createFauxbaseContext, getFauxbaseContext, setFauxbaseContext, useAuth, useFauxbase, useGet, useList, useMutation };
67
+ export { type FauxbaseContextValue, type UseAuthResult, type UseGetOptions, type UseGetResult, type UseListOptions, type UseListResult, type UseMutationResult, createFauxbaseContext, getFauxbaseContext, setFauxbaseContext, useAuth, useEvent, useFauxbase, useGet, useList, useMutation };
package/dist/index.js CHANGED
@@ -25,6 +25,16 @@ function setFauxbaseContext(client) {
25
25
  };
26
26
  }
27
27
  };
28
+ const eventBus = client._eventBus;
29
+ if (eventBus) {
30
+ eventBus.onAny((event) => {
31
+ if (event.source !== "remote") return;
32
+ const svc = client[event.resource];
33
+ if (svc) {
34
+ value.invalidate(svc);
35
+ }
36
+ });
37
+ }
28
38
  setContext(FAUXBASE_KEY, value);
29
39
  return value;
30
40
  }
@@ -229,6 +239,14 @@ function useMutation(service, _ctx) {
229
239
  error: { subscribe: error.subscribe }
230
240
  };
231
241
  }
242
+ function useEvent(serviceOrResource, handler) {
243
+ const ctx = getFauxbaseContext();
244
+ const eventBus = ctx.client._eventBus;
245
+ if (!eventBus) return;
246
+ const resource = typeof serviceOrResource === "string" ? serviceOrResource : serviceOrResource.resourceName;
247
+ const unsub = eventBus.on(resource, handler);
248
+ onDestroy(unsub);
249
+ }
232
250
  function useAuth(_ctx) {
233
251
  const ctx = _ctx ?? getFauxbaseContext();
234
252
  const authService = ctx.client.auth;
@@ -295,6 +313,6 @@ function useAuth(_ctx) {
295
313
  };
296
314
  }
297
315
 
298
- export { createFauxbaseContext, getFauxbaseContext, setFauxbaseContext, useAuth, useFauxbase, useGet, useList, useMutation };
316
+ export { createFauxbaseContext, getFauxbaseContext, setFauxbaseContext, useAuth, useEvent, useFauxbase, useGet, useList, useMutation };
299
317
  //# sourceMappingURL=index.js.map
300
318
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context.ts","../src/use-fauxbase.ts","../src/use-list.ts","../src/use-get.ts","../src/use-mutation.ts","../src/use-auth.ts"],"names":["writable","onDestroy"],"mappings":"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","file":"index.js","sourcesContent":["import { setContext, getContext } from 'svelte';\nimport type { Service } from 'fauxbase';\nimport type { FauxbaseContextValue } from './types';\n\nconst FAUXBASE_KEY = 'fauxbase';\n\nexport function setFauxbaseContext(client: any): FauxbaseContextValue {\n const registry = new Map<Service<any>, Set<() => void>>();\n\n const value: FauxbaseContextValue = {\n client,\n invalidate: (service: Service<any>) => {\n const subscribers = registry.get(service);\n if (subscribers) {\n for (const fn of subscribers) {\n fn();\n }\n }\n },\n subscribe: (service: Service<any>, refetchFn: () => void) => {\n if (!registry.has(service)) {\n registry.set(service, new Set());\n }\n registry.get(service)!.add(refetchFn);\n return () => {\n registry.get(service)?.delete(refetchFn);\n };\n },\n };\n\n setContext(FAUXBASE_KEY, value);\n return value;\n}\n\nexport function getFauxbaseContext(): FauxbaseContextValue {\n const ctx = getContext<FauxbaseContextValue>(FAUXBASE_KEY);\n if (!ctx) {\n throw new Error('getFauxbaseContext requires setFauxbaseContext to be called in a parent component');\n }\n return ctx;\n}\n\n// For testing: create context value without svelte's setContext/getContext\nexport function createFauxbaseContext(client: any): FauxbaseContextValue {\n const registry = new Map<Service<any>, Set<() => void>>();\n\n return {\n client,\n invalidate: (service: Service<any>) => {\n const subscribers = registry.get(service);\n if (subscribers) {\n for (const fn of subscribers) {\n fn();\n }\n }\n },\n subscribe: (service: Service<any>, refetchFn: () => void) => {\n if (!registry.has(service)) {\n registry.set(service, new Set());\n }\n registry.get(service)!.add(refetchFn);\n return () => {\n registry.get(service)?.delete(refetchFn);\n };\n },\n };\n}\n","import { getFauxbaseContext } from './context';\n\nexport function useFauxbase() {\n const ctx = getFauxbaseContext();\n return ctx.client;\n}\n","import { writable } from 'svelte/store';\nimport { onDestroy } from 'svelte';\nimport type { Service, Entity, QueryParams, PageMeta } from 'fauxbase';\nimport type { UseListResult, UseListOptions } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useList<T extends Entity>(\n service: Service<T>,\n query?: QueryParams,\n options?: UseListOptions,\n _ctx?: FauxbaseContextValue,\n): UseListResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const items = writable<T[]>([]);\n const meta = writable<PageMeta | null>(null);\n const loading = writable(true);\n const error = writable<Error | null>(null);\n let destroyed = false;\n\n const enabled = options?.enabled !== false;\n\n const fetch = async () => {\n if (!enabled) return;\n loading.set(true);\n error.set(null);\n try {\n const result = await service.list(query);\n if (!destroyed) {\n items.set(result.items);\n meta.set(result.meta);\n }\n } catch (err) {\n if (!destroyed) {\n error.set(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (!destroyed) {\n loading.set(false);\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n // Initial fetch\n fetch();\n\n // Refetch interval\n let intervalId: ReturnType<typeof setInterval> | undefined;\n if (options?.refetchInterval && enabled) {\n intervalId = setInterval(fetch, options.refetchInterval);\n }\n\n // Cleanup — try onDestroy but don't fail outside component context\n try {\n onDestroy(() => {\n destroyed = true;\n unsub();\n if (intervalId) clearInterval(intervalId);\n });\n } catch {\n // Outside component context (tests) — caller handles cleanup\n }\n\n const destroy = () => {\n destroyed = true;\n unsub();\n if (intervalId) clearInterval(intervalId);\n };\n\n return {\n items: { subscribe: items.subscribe },\n meta: { subscribe: meta.subscribe },\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n refetch: fetch,\n _destroy: destroy,\n } as UseListResult<T> & { _destroy: () => void };\n}\n","import { writable } from 'svelte/store';\nimport { onDestroy } from 'svelte';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseGetResult, UseGetOptions } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useGet<T extends Entity>(\n service: Service<T>,\n id: string | null | undefined,\n options?: UseGetOptions,\n _ctx?: FauxbaseContextValue,\n): UseGetResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const data = writable<T | null>(null);\n const loading = writable(true);\n const error = writable<Error | null>(null);\n let destroyed = false;\n\n const enabled = options?.enabled !== false && id != null;\n\n const fetch = async () => {\n if (!enabled || !id) {\n data.set(null);\n loading.set(false);\n return;\n }\n loading.set(true);\n error.set(null);\n try {\n const result = await service.get(id);\n if (!destroyed) {\n data.set(result.data);\n }\n } catch (err) {\n if (!destroyed) {\n error.set(err instanceof Error ? err : new Error(String(err)));\n data.set(null);\n }\n } finally {\n if (!destroyed) {\n loading.set(false);\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n // Initial fetch\n fetch();\n\n try {\n onDestroy(() => {\n destroyed = true;\n unsub();\n });\n } catch {\n // Outside component context\n }\n\n const destroy = () => {\n destroyed = true;\n unsub();\n };\n\n return {\n data: { subscribe: data.subscribe },\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n refetch: fetch,\n _destroy: destroy,\n } as UseGetResult<T> & { _destroy: () => void };\n}\n","import { writable } from 'svelte/store';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseMutationResult } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useMutation<T extends Entity>(\n service: Service<T>,\n _ctx?: FauxbaseContextValue,\n): UseMutationResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const loading = writable(false);\n const error = writable<Error | null>(null);\n\n const create = async (data: Partial<T>): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await service.create(data);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const update = async (id: string, data: Partial<T>): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await service.update(id, data);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const remove = async (id: string): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await service.delete(id);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n return {\n create,\n update,\n remove,\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n };\n}\n","import { writable } from 'svelte/store';\nimport type { Entity } from 'fauxbase';\nimport type { UseAuthResult } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useAuth<T extends Entity>(\n _ctx?: FauxbaseContextValue,\n): UseAuthResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const authService = ctx.client.auth;\n\n if (!authService) {\n throw new Error('useAuth requires auth to be configured in createClient');\n }\n\n const user = writable<T | null>(authService.currentUser);\n const isLoggedIn = writable<boolean>(authService.isLoggedIn);\n const token = writable<string | null>(authService.token);\n const loading = writable(false);\n const error = writable<Error | null>(null);\n\n const syncState = () => {\n user.set(authService.currentUser);\n isLoggedIn.set(authService.isLoggedIn);\n token.set(authService.token);\n };\n\n const login = async (credentials: { email: string; password: string }): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await authService.login(credentials);\n syncState();\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const register = async (data: Partial<T>): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await authService.register(data);\n syncState();\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const logout = () => {\n authService.logout();\n syncState();\n };\n\n const hasRole = (role: string): boolean => {\n return authService.hasRole(role);\n };\n\n return {\n user: { subscribe: user.subscribe },\n isLoggedIn: { subscribe: isLoggedIn.subscribe },\n token: { subscribe: token.subscribe },\n login,\n register,\n logout,\n hasRole,\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/context.ts","../src/use-fauxbase.ts","../src/use-list.ts","../src/use-get.ts","../src/use-mutation.ts","../src/use-event.ts","../src/use-auth.ts"],"names":["writable","onDestroy"],"mappings":"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","file":"index.js","sourcesContent":["import { setContext, getContext } from 'svelte';\nimport type { Service, EventBus } from 'fauxbase';\nimport type { FauxbaseContextValue } from './types';\n\nconst FAUXBASE_KEY = 'fauxbase';\n\nexport function setFauxbaseContext(client: any): FauxbaseContextValue {\n const registry = new Map<Service<any>, Set<() => void>>();\n\n const value: FauxbaseContextValue = {\n client,\n invalidate: (service: Service<any>) => {\n const subscribers = registry.get(service);\n if (subscribers) {\n for (const fn of subscribers) {\n fn();\n }\n }\n },\n subscribe: (service: Service<any>, refetchFn: () => void) => {\n if (!registry.has(service)) {\n registry.set(service, new Set());\n }\n registry.get(service)!.add(refetchFn);\n return () => {\n registry.get(service)?.delete(refetchFn);\n };\n },\n };\n\n // Bridge remote events → auto-invalidation\n const eventBus: EventBus | undefined = client._eventBus;\n if (eventBus) {\n eventBus.onAny((event) => {\n if (event.source !== 'remote') return;\n const svc = client[event.resource];\n if (svc) {\n value.invalidate(svc);\n }\n });\n }\n\n setContext(FAUXBASE_KEY, value);\n return value;\n}\n\nexport function getFauxbaseContext(): FauxbaseContextValue {\n const ctx = getContext<FauxbaseContextValue>(FAUXBASE_KEY);\n if (!ctx) {\n throw new Error('getFauxbaseContext requires setFauxbaseContext to be called in a parent component');\n }\n return ctx;\n}\n\n// For testing: create context value without svelte's setContext/getContext\nexport function createFauxbaseContext(client: any): FauxbaseContextValue {\n const registry = new Map<Service<any>, Set<() => void>>();\n\n return {\n client,\n invalidate: (service: Service<any>) => {\n const subscribers = registry.get(service);\n if (subscribers) {\n for (const fn of subscribers) {\n fn();\n }\n }\n },\n subscribe: (service: Service<any>, refetchFn: () => void) => {\n if (!registry.has(service)) {\n registry.set(service, new Set());\n }\n registry.get(service)!.add(refetchFn);\n return () => {\n registry.get(service)?.delete(refetchFn);\n };\n },\n };\n}\n","import { getFauxbaseContext } from './context';\n\nexport function useFauxbase() {\n const ctx = getFauxbaseContext();\n return ctx.client;\n}\n","import { writable } from 'svelte/store';\nimport { onDestroy } from 'svelte';\nimport type { Service, Entity, QueryParams, PageMeta } from 'fauxbase';\nimport type { UseListResult, UseListOptions } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useList<T extends Entity>(\n service: Service<T>,\n query?: QueryParams,\n options?: UseListOptions,\n _ctx?: FauxbaseContextValue,\n): UseListResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const items = writable<T[]>([]);\n const meta = writable<PageMeta | null>(null);\n const loading = writable(true);\n const error = writable<Error | null>(null);\n let destroyed = false;\n\n const enabled = options?.enabled !== false;\n\n const fetch = async () => {\n if (!enabled) return;\n loading.set(true);\n error.set(null);\n try {\n const result = await service.list(query);\n if (!destroyed) {\n items.set(result.items);\n meta.set(result.meta);\n }\n } catch (err) {\n if (!destroyed) {\n error.set(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (!destroyed) {\n loading.set(false);\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n // Initial fetch\n fetch();\n\n // Refetch interval\n let intervalId: ReturnType<typeof setInterval> | undefined;\n if (options?.refetchInterval && enabled) {\n intervalId = setInterval(fetch, options.refetchInterval);\n }\n\n // Cleanup — try onDestroy but don't fail outside component context\n try {\n onDestroy(() => {\n destroyed = true;\n unsub();\n if (intervalId) clearInterval(intervalId);\n });\n } catch {\n // Outside component context (tests) — caller handles cleanup\n }\n\n const destroy = () => {\n destroyed = true;\n unsub();\n if (intervalId) clearInterval(intervalId);\n };\n\n return {\n items: { subscribe: items.subscribe },\n meta: { subscribe: meta.subscribe },\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n refetch: fetch,\n _destroy: destroy,\n } as UseListResult<T> & { _destroy: () => void };\n}\n","import { writable } from 'svelte/store';\nimport { onDestroy } from 'svelte';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseGetResult, UseGetOptions } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useGet<T extends Entity>(\n service: Service<T>,\n id: string | null | undefined,\n options?: UseGetOptions,\n _ctx?: FauxbaseContextValue,\n): UseGetResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const data = writable<T | null>(null);\n const loading = writable(true);\n const error = writable<Error | null>(null);\n let destroyed = false;\n\n const enabled = options?.enabled !== false && id != null;\n\n const fetch = async () => {\n if (!enabled || !id) {\n data.set(null);\n loading.set(false);\n return;\n }\n loading.set(true);\n error.set(null);\n try {\n const result = await service.get(id);\n if (!destroyed) {\n data.set(result.data);\n }\n } catch (err) {\n if (!destroyed) {\n error.set(err instanceof Error ? err : new Error(String(err)));\n data.set(null);\n }\n } finally {\n if (!destroyed) {\n loading.set(false);\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n // Initial fetch\n fetch();\n\n try {\n onDestroy(() => {\n destroyed = true;\n unsub();\n });\n } catch {\n // Outside component context\n }\n\n const destroy = () => {\n destroyed = true;\n unsub();\n };\n\n return {\n data: { subscribe: data.subscribe },\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n refetch: fetch,\n _destroy: destroy,\n } as UseGetResult<T> & { _destroy: () => void };\n}\n","import { writable } from 'svelte/store';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseMutationResult } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useMutation<T extends Entity>(\n service: Service<T>,\n _ctx?: FauxbaseContextValue,\n): UseMutationResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const loading = writable(false);\n const error = writable<Error | null>(null);\n\n const create = async (data: Partial<T>): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await service.create(data);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const update = async (id: string, data: Partial<T>): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await service.update(id, data);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const remove = async (id: string): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await service.delete(id);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n return {\n create,\n update,\n remove,\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n };\n}\n","import { onDestroy } from 'svelte';\nimport type { Service, Entity, EventBus, EventHandler } from 'fauxbase';\nimport { getFauxbaseContext } from './context';\n\nexport function useEvent<T extends Entity>(\n serviceOrResource: Service<T> | string,\n handler: EventHandler<T>,\n): void {\n const ctx = getFauxbaseContext();\n const eventBus: EventBus | undefined = ctx.client._eventBus;\n if (!eventBus) return;\n\n const resource = typeof serviceOrResource === 'string'\n ? serviceOrResource\n : (serviceOrResource as any).resourceName;\n\n const unsub = eventBus.on(resource, handler);\n onDestroy(unsub);\n}\n","import { writable } from 'svelte/store';\nimport type { Entity } from 'fauxbase';\nimport type { UseAuthResult } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useAuth<T extends Entity>(\n _ctx?: FauxbaseContextValue,\n): UseAuthResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const authService = ctx.client.auth;\n\n if (!authService) {\n throw new Error('useAuth requires auth to be configured in createClient');\n }\n\n const user = writable<T | null>(authService.currentUser);\n const isLoggedIn = writable<boolean>(authService.isLoggedIn);\n const token = writable<string | null>(authService.token);\n const loading = writable(false);\n const error = writable<Error | null>(null);\n\n const syncState = () => {\n user.set(authService.currentUser);\n isLoggedIn.set(authService.isLoggedIn);\n token.set(authService.token);\n };\n\n const login = async (credentials: { email: string; password: string }): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await authService.login(credentials);\n syncState();\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const register = async (data: Partial<T>): Promise<T> => {\n loading.set(true);\n error.set(null);\n try {\n const result = await authService.register(data);\n syncState();\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const logout = () => {\n authService.logout();\n syncState();\n };\n\n const hasRole = (role: string): boolean => {\n return authService.hasRole(role);\n };\n\n return {\n user: { subscribe: user.subscribe },\n isLoggedIn: { subscribe: isLoggedIn.subscribe },\n token: { subscribe: token.subscribe },\n login,\n register,\n logout,\n hasRole,\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fauxbase-svelte",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -22,7 +22,7 @@
22
22
  },
23
23
  "peerDependencies": {
24
24
  "svelte": ">=4",
25
- "fauxbase": ">=0.4.0"
25
+ "fauxbase": ">=0.5.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "svelte": "^4.2.0",