@vielzeug/sourcerer 2.2.1 → 2.3.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.
Files changed (42) hide show
  1. package/dist/asyncSource.cjs +1 -1
  2. package/dist/asyncSource.cjs.map +1 -1
  3. package/dist/asyncSource.d.ts +8 -6
  4. package/dist/asyncSource.d.ts.map +1 -1
  5. package/dist/asyncSource.js +20 -10
  6. package/dist/asyncSource.js.map +1 -1
  7. package/dist/cursorSource.cjs +1 -1
  8. package/dist/cursorSource.cjs.map +1 -1
  9. package/dist/cursorSource.d.ts.map +1 -1
  10. package/dist/cursorSource.js +31 -41
  11. package/dist/cursorSource.js.map +1 -1
  12. package/dist/errors.cjs +2 -0
  13. package/dist/errors.cjs.map +1 -0
  14. package/dist/errors.d.ts +8 -0
  15. package/dist/errors.d.ts.map +1 -0
  16. package/dist/errors.js +10 -0
  17. package/dist/errors.js.map +1 -0
  18. package/dist/index.cjs +1 -1
  19. package/dist/index.d.ts +1 -0
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +6 -5
  22. package/dist/infiniteSource.cjs +1 -1
  23. package/dist/infiniteSource.cjs.map +1 -1
  24. package/dist/infiniteSource.js +1 -6
  25. package/dist/infiniteSource.js.map +1 -1
  26. package/dist/pageSource.cjs +1 -1
  27. package/dist/pageSource.cjs.map +1 -1
  28. package/dist/pageSource.d.ts.map +1 -1
  29. package/dist/pageSource.js +1 -12
  30. package/dist/pageSource.js.map +1 -1
  31. package/dist/pagination.cjs +1 -1
  32. package/dist/pagination.cjs.map +1 -1
  33. package/dist/pagination.d.ts.map +1 -1
  34. package/dist/pagination.js +10 -9
  35. package/dist/pagination.js.map +1 -1
  36. package/dist/sourcerer.cjs +1 -1
  37. package/dist/sourcerer.cjs.map +1 -1
  38. package/dist/sourcerer.iife.js +1 -1
  39. package/dist/sourcerer.iife.js.map +1 -1
  40. package/dist/sourcerer.js +1 -1
  41. package/dist/sourcerer.js.map +1 -1
  42. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- const e=require("./requestController.cjs"),t=require("./sourceStore.cjs");function n(n){let r=t.createSourceStore(n),i=e.createRequestController();return{get disposalSignal(){return r.disposalSignal},dispose(){i.dispose(),r.dispose()},get disposed(){return r.disposed},async fetch(t){if(r.disposed)return;let n=i.begin(),a=r.value;r.set(t.pending(a));let o;try{o=t.success(await t.load(n.signal))}catch(i){if(!n.isCurrent()||r.disposed)return;let o=e.toError(i);throw r.set(t.failure(a,o)),o}finally{n.finish()}!n.isCurrent()||r.disposed||r.set(o)},get snapshot(){return r.value},subscribe:r.subscribe}}exports.createAsyncSource=n;
1
+ const e=require("./requestController.cjs"),t=require("./sourceStore.cjs");function n(n){let r=t.createSourceStore(n),i=e.createRequestController();return{get disposalSignal(){return r.disposalSignal},dispose(){i.dispose(),r.dispose()},get disposed(){return r.disposed},async fetch(t){if(r.disposed)return;let{query:n,load:a,success:o,pending:s,failure:c}=t,l=i.begin(),u=r.value;r.set(s?s(u):{...u,error:null,isFetching:!0,pendingQuery:n});let d;try{d=o(await a(l.signal))}catch(t){if(!l.isCurrent()||r.disposed)return;let n=e.toError(t);throw r.set(c?c(u,n):{...u,error:n,isFetching:!1,pendingQuery:void 0}),n}finally{l.finish()}!l.isCurrent()||r.disposed||r.set(d)},get snapshot(){return r.value},subscribe:r.subscribe}}exports.createAsyncSource=n;
2
2
  //# sourceMappingURL=asyncSource.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"asyncSource.cjs","names":[],"sources":["../src/asyncSource.ts"],"sourcesContent":["import { createRequestController, toError } from './requestController';\nimport { createSourceStore } from './sourceStore';\nimport type { AnyPagination, SourceSnapshot } from './types';\n\ntype AsyncSource<T, TQuery, TPagination extends AnyPagination> = Readonly<{\n readonly disposalSignal: AbortSignal;\n dispose(): void;\n readonly disposed: boolean;\n fetch<TResult>(options: {\n failure(previous: SourceSnapshot<T, TQuery, TPagination>, error: Error): SourceSnapshot<T, TQuery, TPagination>;\n load(signal: AbortSignal): Promise<TResult>;\n pending(previous: SourceSnapshot<T, TQuery, TPagination>): SourceSnapshot<T, TQuery, TPagination>;\n success(result: TResult): SourceSnapshot<T, TQuery, TPagination>;\n }): Promise<void>;\n readonly snapshot: SourceSnapshot<T, TQuery, TPagination>;\n subscribe(listener: (snapshot: SourceSnapshot<T, TQuery, TPagination>) => void): () => void;\n}>;\n\n/** Request failures and observer failures stay separate so observers cannot corrupt source state. */\nexport function createAsyncSource<T, TQuery, TPagination extends AnyPagination>(\n initial: SourceSnapshot<T, TQuery, TPagination>,\n): AsyncSource<T, TQuery, TPagination> {\n const store = createSourceStore(initial);\n const requests = createRequestController();\n\n return {\n get disposalSignal() {\n return store.disposalSignal;\n },\n\n dispose() {\n requests.dispose();\n store.dispose();\n },\n\n get disposed() {\n return store.disposed;\n },\n\n async fetch(options) {\n if (store.disposed) return;\n\n const request = requests.begin();\n const previous = store.value;\n\n store.set(options.pending(previous));\n\n let next: SourceSnapshot<T, TQuery, TPagination>;\n\n try {\n next = options.success(await options.load(request.signal));\n } catch (reason: unknown) {\n if (!request.isCurrent() || store.disposed) return;\n\n const error = toError(reason);\n\n store.set(options.failure(previous, error));\n throw error;\n } finally {\n request.finish();\n }\n\n if (!request.isCurrent() || store.disposed) return;\n\n store.set(next);\n },\n\n get snapshot() {\n return store.value;\n },\n\n subscribe: store.subscribe,\n };\n}\n"],"mappings":"0EAmBA,SAAgB,EACd,EACqC,CACrC,IAAM,EAAQ,EAAA,kBAAkB,CAAO,EACjC,EAAW,EAAA,wBAAwB,EAEzC,MAAO,CACL,IAAI,gBAAiB,CACnB,OAAO,EAAM,cACf,EAEA,SAAU,CACR,EAAS,QAAQ,EACjB,EAAM,QAAQ,CAChB,EAEA,IAAI,UAAW,CACb,OAAO,EAAM,QACf,EAEA,MAAM,MAAM,EAAS,CACnB,GAAI,EAAM,SAAU,OAEpB,IAAM,EAAU,EAAS,MAAM,EACzB,EAAW,EAAM,MAEvB,EAAM,IAAI,EAAQ,QAAQ,CAAQ,CAAC,EAEnC,IAAI,EAEJ,GAAI,CACF,EAAO,EAAQ,QAAQ,MAAM,EAAQ,KAAK,EAAQ,MAAM,CAAC,CAC3D,OAAS,EAAiB,CACxB,GAAI,CAAC,EAAQ,UAAU,GAAK,EAAM,SAAU,OAE5C,IAAM,EAAQ,EAAA,QAAQ,CAAM,EAG5B,MADA,EAAM,IAAI,EAAQ,QAAQ,EAAU,CAAK,CAAC,EACpC,CACR,QAAU,CACR,EAAQ,OAAO,CACjB,CAEI,CAAC,EAAQ,UAAU,GAAK,EAAM,UAElC,EAAM,IAAI,CAAI,CAChB,EAEA,IAAI,UAAW,CACb,OAAO,EAAM,KACf,EAEA,UAAW,EAAM,SACnB,CACF"}
1
+ {"version":3,"file":"asyncSource.cjs","names":[],"sources":["../src/asyncSource.ts"],"sourcesContent":["import { createRequestController, toError } from './requestController';\nimport { createSourceStore } from './sourceStore';\nimport type { AnyPagination, SourceSnapshot } from './types';\n\ntype FetchOptions<T, TQuery, TPagination extends AnyPagination, TResult> = {\n query: TQuery;\n load(signal: AbortSignal): Promise<TResult>;\n success(result: TResult): SourceSnapshot<T, TQuery, TPagination>;\n pending?(previous: SourceSnapshot<T, TQuery, TPagination>): SourceSnapshot<T, TQuery, TPagination>;\n failure?(previous: SourceSnapshot<T, TQuery, TPagination>, error: Error): SourceSnapshot<T, TQuery, TPagination>;\n};\n\ntype AsyncSource<T, TQuery, TPagination extends AnyPagination> = Readonly<{\n readonly disposalSignal: AbortSignal;\n dispose(): void;\n readonly disposed: boolean;\n fetch<TResult>(options: FetchOptions<T, TQuery, TPagination, TResult>): Promise<void>;\n readonly snapshot: SourceSnapshot<T, TQuery, TPagination>;\n subscribe(listener: (snapshot: SourceSnapshot<T, TQuery, TPagination>) => void): () => void;\n}>;\n\n/** Request failures and observer failures stay separate so observers cannot corrupt source state. */\nexport function createAsyncSource<T, TQuery, TPagination extends AnyPagination>(\n initial: SourceSnapshot<T, TQuery, TPagination>,\n): AsyncSource<T, TQuery, TPagination> {\n const store = createSourceStore(initial);\n const requests = createRequestController();\n\n return {\n get disposalSignal() {\n return store.disposalSignal;\n },\n\n dispose() {\n requests.dispose();\n store.dispose();\n },\n\n get disposed() {\n return store.disposed;\n },\n\n async fetch(options) {\n if (store.disposed) return;\n\n const { query, load, success, pending, failure } = options;\n const request = requests.begin();\n const previous = store.value;\n\n store.set(pending ? pending(previous) : { ...previous, error: null, isFetching: true, pendingQuery: query });\n\n let next: SourceSnapshot<T, TQuery, TPagination>;\n\n try {\n next = success(await load(request.signal));\n } catch (reason: unknown) {\n if (!request.isCurrent() || store.disposed) return;\n\n const error = toError(reason);\n\n store.set(\n failure ? failure(previous, error) : { ...previous, error, isFetching: false, pendingQuery: undefined },\n );\n throw error;\n } finally {\n request.finish();\n }\n\n if (!request.isCurrent() || store.disposed) return;\n\n store.set(next);\n },\n\n get snapshot() {\n return store.value;\n },\n\n subscribe: store.subscribe,\n };\n}\n"],"mappings":"0EAsBA,SAAgB,EACd,EACqC,CACrC,IAAM,EAAQ,EAAA,kBAAkB,CAAO,EACjC,EAAW,EAAA,wBAAwB,EAEzC,MAAO,CACL,IAAI,gBAAiB,CACnB,OAAO,EAAM,cACf,EAEA,SAAU,CACR,EAAS,QAAQ,EACjB,EAAM,QAAQ,CAChB,EAEA,IAAI,UAAW,CACb,OAAO,EAAM,QACf,EAEA,MAAM,MAAM,EAAS,CACnB,GAAI,EAAM,SAAU,OAEpB,GAAM,CAAE,QAAO,OAAM,UAAS,UAAS,WAAY,EAC7C,EAAU,EAAS,MAAM,EACzB,EAAW,EAAM,MAEvB,EAAM,IAAI,EAAU,EAAQ,CAAQ,EAAI,CAAE,GAAG,EAAU,MAAO,KAAM,WAAY,GAAM,aAAc,CAAM,CAAC,EAE3G,IAAI,EAEJ,GAAI,CACF,EAAO,EAAQ,MAAM,EAAK,EAAQ,MAAM,CAAC,CAC3C,OAAS,EAAiB,CACxB,GAAI,CAAC,EAAQ,UAAU,GAAK,EAAM,SAAU,OAE5C,IAAM,EAAQ,EAAA,QAAQ,CAAM,EAK5B,MAHA,EAAM,IACJ,EAAU,EAAQ,EAAU,CAAK,EAAI,CAAE,GAAG,EAAU,QAAO,WAAY,GAAO,aAAc,IAAA,EAAU,CACxG,EACM,CACR,QAAU,CACR,EAAQ,OAAO,CACjB,CAEI,CAAC,EAAQ,UAAU,GAAK,EAAM,UAElC,EAAM,IAAI,CAAI,CAChB,EAEA,IAAI,UAAW,CACb,OAAO,EAAM,KACf,EAEA,UAAW,EAAM,SACnB,CACF"}
@@ -1,14 +1,16 @@
1
1
  import type { AnyPagination, SourceSnapshot } from './types';
2
+ type FetchOptions<T, TQuery, TPagination extends AnyPagination, TResult> = {
3
+ query: TQuery;
4
+ load(signal: AbortSignal): Promise<TResult>;
5
+ success(result: TResult): SourceSnapshot<T, TQuery, TPagination>;
6
+ pending?(previous: SourceSnapshot<T, TQuery, TPagination>): SourceSnapshot<T, TQuery, TPagination>;
7
+ failure?(previous: SourceSnapshot<T, TQuery, TPagination>, error: Error): SourceSnapshot<T, TQuery, TPagination>;
8
+ };
2
9
  type AsyncSource<T, TQuery, TPagination extends AnyPagination> = Readonly<{
3
10
  readonly disposalSignal: AbortSignal;
4
11
  dispose(): void;
5
12
  readonly disposed: boolean;
6
- fetch<TResult>(options: {
7
- failure(previous: SourceSnapshot<T, TQuery, TPagination>, error: Error): SourceSnapshot<T, TQuery, TPagination>;
8
- load(signal: AbortSignal): Promise<TResult>;
9
- pending(previous: SourceSnapshot<T, TQuery, TPagination>): SourceSnapshot<T, TQuery, TPagination>;
10
- success(result: TResult): SourceSnapshot<T, TQuery, TPagination>;
11
- }): Promise<void>;
13
+ fetch<TResult>(options: FetchOptions<T, TQuery, TPagination, TResult>): Promise<void>;
12
14
  readonly snapshot: SourceSnapshot<T, TQuery, TPagination>;
13
15
  subscribe(listener: (snapshot: SourceSnapshot<T, TQuery, TPagination>) => void): () => void;
14
16
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"asyncSource.d.ts","sourceRoot":"","sources":["../src/asyncSource.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE7D,KAAK,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,SAAS,aAAa,IAAI,QAAQ,CAAC;IACxE,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE;QACtB,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAChH,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAClG,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;KAClE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC1D,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC7F,CAAC,CAAC;AAEH,qGAAqG;AACrG,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,SAAS,aAAa,EAC5E,OAAO,EAAE,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,GAC9C,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAoDrC"}
1
+ {"version":3,"file":"asyncSource.d.ts","sourceRoot":"","sources":["../src/asyncSource.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE7D,KAAK,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,SAAS,aAAa,EAAE,OAAO,IAAI;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACjE,OAAO,CAAC,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACnG,OAAO,CAAC,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;CAClH,CAAC;AAEF,KAAK,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,SAAS,aAAa,IAAI,QAAQ,CAAC;IACxE,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtF,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC1D,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC7F,CAAC,CAAC;AAEH,qGAAqG;AACrG,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,SAAS,aAAa,EAC5E,OAAO,EAAE,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,GAC9C,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAuDrC"}
@@ -15,19 +15,29 @@ function r(r) {
15
15
  },
16
16
  async fetch(e) {
17
17
  if (i.disposed) return;
18
- let n = a.begin(), r = i.value;
19
- i.set(e.pending(r));
20
- let o;
18
+ let { query: n, load: r, success: o, pending: s, failure: c } = e, l = a.begin(), u = i.value;
19
+ i.set(s ? s(u) : {
20
+ ...u,
21
+ error: null,
22
+ isFetching: !0,
23
+ pendingQuery: n
24
+ });
25
+ let d;
21
26
  try {
22
- o = e.success(await e.load(n.signal));
23
- } catch (a) {
24
- if (!n.isCurrent() || i.disposed) return;
25
- let o = t(a);
26
- throw i.set(e.failure(r, o)), o;
27
+ d = o(await r(l.signal));
28
+ } catch (e) {
29
+ if (!l.isCurrent() || i.disposed) return;
30
+ let n = t(e);
31
+ throw i.set(c ? c(u, n) : {
32
+ ...u,
33
+ error: n,
34
+ isFetching: !1,
35
+ pendingQuery: void 0
36
+ }), n;
27
37
  } finally {
28
- n.finish();
38
+ l.finish();
29
39
  }
30
- !n.isCurrent() || i.disposed || i.set(o);
40
+ !l.isCurrent() || i.disposed || i.set(d);
31
41
  },
32
42
  get snapshot() {
33
43
  return i.value;
@@ -1 +1 @@
1
- {"version":3,"file":"asyncSource.js","names":[],"sources":["../src/asyncSource.ts"],"sourcesContent":["import { createRequestController, toError } from './requestController';\nimport { createSourceStore } from './sourceStore';\nimport type { AnyPagination, SourceSnapshot } from './types';\n\ntype AsyncSource<T, TQuery, TPagination extends AnyPagination> = Readonly<{\n readonly disposalSignal: AbortSignal;\n dispose(): void;\n readonly disposed: boolean;\n fetch<TResult>(options: {\n failure(previous: SourceSnapshot<T, TQuery, TPagination>, error: Error): SourceSnapshot<T, TQuery, TPagination>;\n load(signal: AbortSignal): Promise<TResult>;\n pending(previous: SourceSnapshot<T, TQuery, TPagination>): SourceSnapshot<T, TQuery, TPagination>;\n success(result: TResult): SourceSnapshot<T, TQuery, TPagination>;\n }): Promise<void>;\n readonly snapshot: SourceSnapshot<T, TQuery, TPagination>;\n subscribe(listener: (snapshot: SourceSnapshot<T, TQuery, TPagination>) => void): () => void;\n}>;\n\n/** Request failures and observer failures stay separate so observers cannot corrupt source state. */\nexport function createAsyncSource<T, TQuery, TPagination extends AnyPagination>(\n initial: SourceSnapshot<T, TQuery, TPagination>,\n): AsyncSource<T, TQuery, TPagination> {\n const store = createSourceStore(initial);\n const requests = createRequestController();\n\n return {\n get disposalSignal() {\n return store.disposalSignal;\n },\n\n dispose() {\n requests.dispose();\n store.dispose();\n },\n\n get disposed() {\n return store.disposed;\n },\n\n async fetch(options) {\n if (store.disposed) return;\n\n const request = requests.begin();\n const previous = store.value;\n\n store.set(options.pending(previous));\n\n let next: SourceSnapshot<T, TQuery, TPagination>;\n\n try {\n next = options.success(await options.load(request.signal));\n } catch (reason: unknown) {\n if (!request.isCurrent() || store.disposed) return;\n\n const error = toError(reason);\n\n store.set(options.failure(previous, error));\n throw error;\n } finally {\n request.finish();\n }\n\n if (!request.isCurrent() || store.disposed) return;\n\n store.set(next);\n },\n\n get snapshot() {\n return store.value;\n },\n\n subscribe: store.subscribe,\n };\n}\n"],"mappings":";;;AAmBA,SAAgB,EACd,GACqC;CACrC,IAAM,IAAQ,EAAkB,CAAO,GACjC,IAAW,EAAwB;CAEzC,OAAO;EACL,IAAI,iBAAiB;GACnB,OAAO,EAAM;EACf;EAEA,UAAU;GAER,AADA,EAAS,QAAQ,GACjB,EAAM,QAAQ;EAChB;EAEA,IAAI,WAAW;GACb,OAAO,EAAM;EACf;EAEA,MAAM,MAAM,GAAS;GACnB,IAAI,EAAM,UAAU;GAEpB,IAAM,IAAU,EAAS,MAAM,GACzB,IAAW,EAAM;GAEvB,EAAM,IAAI,EAAQ,QAAQ,CAAQ,CAAC;GAEnC,IAAI;GAEJ,IAAI;IACF,IAAO,EAAQ,QAAQ,MAAM,EAAQ,KAAK,EAAQ,MAAM,CAAC;GAC3D,SAAS,GAAiB;IACxB,IAAI,CAAC,EAAQ,UAAU,KAAK,EAAM,UAAU;IAE5C,IAAM,IAAQ,EAAQ,CAAM;IAG5B,MADA,EAAM,IAAI,EAAQ,QAAQ,GAAU,CAAK,CAAC,GACpC;GACR,UAAU;IACR,EAAQ,OAAO;GACjB;GAEI,CAAC,EAAQ,UAAU,KAAK,EAAM,YAElC,EAAM,IAAI,CAAI;EAChB;EAEA,IAAI,WAAW;GACb,OAAO,EAAM;EACf;EAEA,WAAW,EAAM;CACnB;AACF"}
1
+ {"version":3,"file":"asyncSource.js","names":[],"sources":["../src/asyncSource.ts"],"sourcesContent":["import { createRequestController, toError } from './requestController';\nimport { createSourceStore } from './sourceStore';\nimport type { AnyPagination, SourceSnapshot } from './types';\n\ntype FetchOptions<T, TQuery, TPagination extends AnyPagination, TResult> = {\n query: TQuery;\n load(signal: AbortSignal): Promise<TResult>;\n success(result: TResult): SourceSnapshot<T, TQuery, TPagination>;\n pending?(previous: SourceSnapshot<T, TQuery, TPagination>): SourceSnapshot<T, TQuery, TPagination>;\n failure?(previous: SourceSnapshot<T, TQuery, TPagination>, error: Error): SourceSnapshot<T, TQuery, TPagination>;\n};\n\ntype AsyncSource<T, TQuery, TPagination extends AnyPagination> = Readonly<{\n readonly disposalSignal: AbortSignal;\n dispose(): void;\n readonly disposed: boolean;\n fetch<TResult>(options: FetchOptions<T, TQuery, TPagination, TResult>): Promise<void>;\n readonly snapshot: SourceSnapshot<T, TQuery, TPagination>;\n subscribe(listener: (snapshot: SourceSnapshot<T, TQuery, TPagination>) => void): () => void;\n}>;\n\n/** Request failures and observer failures stay separate so observers cannot corrupt source state. */\nexport function createAsyncSource<T, TQuery, TPagination extends AnyPagination>(\n initial: SourceSnapshot<T, TQuery, TPagination>,\n): AsyncSource<T, TQuery, TPagination> {\n const store = createSourceStore(initial);\n const requests = createRequestController();\n\n return {\n get disposalSignal() {\n return store.disposalSignal;\n },\n\n dispose() {\n requests.dispose();\n store.dispose();\n },\n\n get disposed() {\n return store.disposed;\n },\n\n async fetch(options) {\n if (store.disposed) return;\n\n const { query, load, success, pending, failure } = options;\n const request = requests.begin();\n const previous = store.value;\n\n store.set(pending ? pending(previous) : { ...previous, error: null, isFetching: true, pendingQuery: query });\n\n let next: SourceSnapshot<T, TQuery, TPagination>;\n\n try {\n next = success(await load(request.signal));\n } catch (reason: unknown) {\n if (!request.isCurrent() || store.disposed) return;\n\n const error = toError(reason);\n\n store.set(\n failure ? failure(previous, error) : { ...previous, error, isFetching: false, pendingQuery: undefined },\n );\n throw error;\n } finally {\n request.finish();\n }\n\n if (!request.isCurrent() || store.disposed) return;\n\n store.set(next);\n },\n\n get snapshot() {\n return store.value;\n },\n\n subscribe: store.subscribe,\n };\n}\n"],"mappings":";;;AAsBA,SAAgB,EACd,GACqC;CACrC,IAAM,IAAQ,EAAkB,CAAO,GACjC,IAAW,EAAwB;CAEzC,OAAO;EACL,IAAI,iBAAiB;GACnB,OAAO,EAAM;EACf;EAEA,UAAU;GAER,AADA,EAAS,QAAQ,GACjB,EAAM,QAAQ;EAChB;EAEA,IAAI,WAAW;GACb,OAAO,EAAM;EACf;EAEA,MAAM,MAAM,GAAS;GACnB,IAAI,EAAM,UAAU;GAEpB,IAAM,EAAE,UAAO,SAAM,YAAS,YAAS,eAAY,GAC7C,IAAU,EAAS,MAAM,GACzB,IAAW,EAAM;GAEvB,EAAM,IAAI,IAAU,EAAQ,CAAQ,IAAI;IAAE,GAAG;IAAU,OAAO;IAAM,YAAY;IAAM,cAAc;GAAM,CAAC;GAE3G,IAAI;GAEJ,IAAI;IACF,IAAO,EAAQ,MAAM,EAAK,EAAQ,MAAM,CAAC;GAC3C,SAAS,GAAiB;IACxB,IAAI,CAAC,EAAQ,UAAU,KAAK,EAAM,UAAU;IAE5C,IAAM,IAAQ,EAAQ,CAAM;IAK5B,MAHA,EAAM,IACJ,IAAU,EAAQ,GAAU,CAAK,IAAI;KAAE,GAAG;KAAU;KAAO,YAAY;KAAO,cAAc,KAAA;IAAU,CACxG,GACM;GACR,UAAU;IACR,EAAQ,OAAO;GACjB;GAEI,CAAC,EAAQ,UAAU,KAAK,EAAM,YAElC,EAAM,IAAI,CAAI;EAChB;EAEA,IAAI,WAAW;GACb,OAAO,EAAM;EACf;EAEA,WAAW,EAAM;CACnB;AACF"}
@@ -1,2 +1,2 @@
1
- const e=require("./_dev.cjs"),t=require("./asyncSource.cjs"),n=require("./pagination.cjs");var r=e=>({hasNext:e?.nextCursor!==void 0,hasPrevious:e?.previousCursor!==void 0,kind:`cursor`,...e?.nextCursor!==void 0&&{nextCursor:e.nextCursor},...e?.previousCursor!==void 0&&{previousCursor:e.previousCursor},...e?.total!==void 0&&{total:n.totalItems(e.total)}}),i=(e,t={})=>{if(t.after!==void 0&&t.before!==void 0)throw RangeError(`Cursor query cannot include both after and before`);let r=t.pageSize!==void 0||t.search!==void 0,i=r||`before`in t?void 0:`after`in t?t.after:e.after,a=r||`after`in t?void 0:`before`in t?t.before:e.before;return{...i!==void 0&&{after:i},...a!==void 0&&{before:a},pageSize:n.positiveInteger(t.pageSize??e.pageSize,`pageSize`),search:t.search??e.search}};function a(a){let o=i({pageSize:20,search:``},a.initialQuery),s=t.createAsyncSource({data:[],error:null,isFetching:!1,pagination:r(),query:o}),c=e=>s.fetch({failure:(e,t)=>({...e,error:t,isFetching:!1,pendingQuery:void 0}),load:t=>a.load({query:e,signal:t}),pending:t=>({...t,error:null,isFetching:!0,pendingQuery:e}),success:t=>({data:t.data,error:null,isFetching:!1,pagination:r(t),query:e})}),l=()=>c(o),u=async e=>{let t=i(s.snapshot.pendingQuery??s.snapshot.query,e);n.sameQuery(t,o)||(o=t,await c(t))},d={get disposalSignal(){return s.disposalSignal},dispose:s.dispose,get disposed(){return s.disposed},page:{next(){let e=s.snapshot.pagination.nextCursor;return s.snapshot.isFetching||e===void 0?Promise.resolve():u({after:e})},previous(){let e=s.snapshot.pagination.previousCursor;return s.snapshot.isFetching||e===void 0?Promise.resolve():u({before:e})}},reload:l,setQuery:u,get snapshot(){return s.snapshot},subscribe:s.subscribe,[Symbol.dispose](){d.dispose()}};return a.autoStart!==!1&&l().catch(()=>e.warn(`Initial load failed. Inspect source.snapshot.error.`)),d}exports.createCursorSource=a;
1
+ const e=require("./_dev.cjs"),t=require("./asyncSource.cjs"),n=require("./errors.cjs"),r=require("./pagination.cjs");var i=e=>({hasNext:e?.nextCursor!==void 0,hasPrevious:e?.previousCursor!==void 0,kind:`cursor`,...e?.nextCursor!==void 0&&{nextCursor:e.nextCursor},...e?.previousCursor!==void 0&&{previousCursor:e.previousCursor},...e?.total!==void 0&&{total:r.totalItems(e.total)}}),a=(e,t={})=>{if(t.after!==void 0&&t.before!==void 0)throw new n.SourcererConfigurationError(`Cursor query cannot include both after and before`);let i=t.pageSize!==void 0||t.search!==void 0,a=i||`before`in t?void 0:`after`in t?t.after:e.after,o=i||`after`in t?void 0:`before`in t?t.before:e.before;return{...a!==void 0&&{after:a},...o!==void 0&&{before:o},pageSize:r.positiveInteger(t.pageSize??e.pageSize,`pageSize`),search:t.search??e.search}};function o(n){let o=a({pageSize:20,search:``},n.initialQuery),s=t.createAsyncSource({data:[],error:null,isFetching:!1,pagination:i(),query:o}),c=e=>s.fetch({load:t=>n.load({query:e,signal:t}),query:e,success:t=>({data:t.data,error:null,isFetching:!1,pagination:i(t),query:e})}),l=()=>c(o),u=async e=>{let t=a(s.snapshot.pendingQuery??s.snapshot.query,e);r.sameQuery(t,o)||(o=t,await c(t))},d={get disposalSignal(){return s.disposalSignal},dispose:s.dispose,get disposed(){return s.disposed},page:{next(){let e=s.snapshot.pagination.nextCursor;return s.snapshot.isFetching||e===void 0?Promise.resolve():u({after:e})},previous(){let e=s.snapshot.pagination.previousCursor;return s.snapshot.isFetching||e===void 0?Promise.resolve():u({before:e})}},reload:l,setQuery:u,get snapshot(){return s.snapshot},subscribe:s.subscribe,[Symbol.dispose](){d.dispose()}};return n.autoStart!==!1&&l().catch(()=>e.warn(`Initial load failed. Inspect source.snapshot.error.`)),d}exports.createCursorSource=o;
2
2
  //# sourceMappingURL=cursorSource.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cursorSource.cjs","names":[],"sources":["../src/cursorSource.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { createAsyncSource } from './asyncSource';\nimport { positiveInteger, sameQuery, totalItems } from './pagination';\nimport type { CursorPagination, CursorQuery, CursorQueryPatch, CursorSource, CursorSourceConfig } from './types';\n\nconst createPagination = <TCursor>(result?: {\n nextCursor?: TCursor;\n previousCursor?: TCursor;\n total?: number;\n}): CursorPagination<TCursor> => ({\n hasNext: result?.nextCursor !== undefined,\n hasPrevious: result?.previousCursor !== undefined,\n kind: 'cursor',\n ...(result?.nextCursor !== undefined && { nextCursor: result.nextCursor }),\n ...(result?.previousCursor !== undefined && { previousCursor: result.previousCursor }),\n ...(result?.total !== undefined && { total: totalItems(result.total) }),\n});\n\nconst normalizeQuery = <TCursor>(\n current: CursorQuery<TCursor>,\n patch: CursorQueryPatch<TCursor> = {},\n): CursorQuery<TCursor> => {\n if (patch.after !== undefined && patch.before !== undefined) {\n throw new RangeError('Cursor query cannot include both after and before');\n }\n\n const resetsCursor = patch.pageSize !== undefined || patch.search !== undefined;\n const after = resetsCursor || 'before' in patch ? undefined : 'after' in patch ? patch.after : current.after;\n const before = resetsCursor || 'after' in patch ? undefined : 'before' in patch ? patch.before : current.before;\n\n return {\n ...(after !== undefined && { after }),\n ...(before !== undefined && { before }),\n pageSize: positiveInteger(patch.pageSize ?? current.pageSize, 'pageSize'),\n search: patch.search ?? current.search,\n };\n};\n\n/** Cursor sources retain loaded cursors while pendingQuery records newer navigation. */\nexport function createCursorSource<T, TCursor = string>(\n config: CursorSourceConfig<T, TCursor>,\n): CursorSource<T, TCursor> {\n const initialQuery: CursorQuery<TCursor> = { pageSize: 20, search: '' };\n let requestedQuery = normalizeQuery(initialQuery, config.initialQuery);\n const asyncSource = createAsyncSource<T, CursorQuery<TCursor>, CursorPagination<TCursor>>({\n data: [],\n error: null,\n isFetching: false,\n pagination: createPagination(),\n query: requestedQuery,\n });\n\n const fetch = (query: CursorQuery<TCursor>): Promise<void> =>\n asyncSource.fetch({\n failure: (previous, error) => ({ ...previous, error, isFetching: false, pendingQuery: undefined }),\n load: (signal) => config.load({ query, signal }),\n pending: (previous) => ({ ...previous, error: null, isFetching: true, pendingQuery: query }),\n success: (result) => ({\n data: result.data,\n error: null,\n isFetching: false,\n pagination: createPagination(result),\n query,\n }),\n });\n\n const reload = (): Promise<void> => fetch(requestedQuery);\n\n const setQuery = async (patch: CursorQueryPatch<TCursor>): Promise<void> => {\n const current = asyncSource.snapshot.pendingQuery ?? asyncSource.snapshot.query;\n const next = normalizeQuery(current, patch);\n\n if (sameQuery(next, requestedQuery)) return;\n\n requestedQuery = next;\n await fetch(next);\n };\n\n const source: CursorSource<T, TCursor> = {\n get disposalSignal() {\n return asyncSource.disposalSignal;\n },\n\n dispose: asyncSource.dispose,\n\n get disposed() {\n return asyncSource.disposed;\n },\n\n page: {\n next() {\n const cursor = asyncSource.snapshot.pagination.nextCursor;\n\n return asyncSource.snapshot.isFetching || cursor === undefined\n ? Promise.resolve()\n : setQuery({ after: cursor });\n },\n\n previous() {\n const cursor = asyncSource.snapshot.pagination.previousCursor;\n\n return asyncSource.snapshot.isFetching || cursor === undefined\n ? Promise.resolve()\n : setQuery({ before: cursor });\n },\n },\n\n reload,\n setQuery,\n\n get snapshot() {\n return asyncSource.snapshot;\n },\n\n subscribe: asyncSource.subscribe,\n\n [Symbol.dispose]() {\n source.dispose();\n },\n };\n\n if (config.autoStart !== false)\n void reload().catch(() => warn('Initial load failed. Inspect source.snapshot.error.'));\n\n return source;\n}\n"],"mappings":"2FAKA,IAAM,EAA6B,IAID,CAChC,QAAS,GAAQ,aAAe,IAAA,GAChC,YAAa,GAAQ,iBAAmB,IAAA,GACxC,KAAM,SACN,GAAI,GAAQ,aAAe,IAAA,IAAa,CAAE,WAAY,EAAO,UAAW,EACxE,GAAI,GAAQ,iBAAmB,IAAA,IAAa,CAAE,eAAgB,EAAO,cAAe,EACpF,GAAI,GAAQ,QAAU,IAAA,IAAa,CAAE,MAAO,EAAA,WAAW,EAAO,KAAK,CAAE,CACvE,GAEM,GACJ,EACA,EAAmC,CAAC,IACX,CACzB,GAAI,EAAM,QAAU,IAAA,IAAa,EAAM,SAAW,IAAA,GAChD,MAAU,WAAW,mDAAmD,EAG1E,IAAM,EAAe,EAAM,WAAa,IAAA,IAAa,EAAM,SAAW,IAAA,GAChE,EAAQ,GAAgB,WAAY,EAAQ,IAAA,GAAY,UAAW,EAAQ,EAAM,MAAQ,EAAQ,MACjG,EAAS,GAAgB,UAAW,EAAQ,IAAA,GAAY,WAAY,EAAQ,EAAM,OAAS,EAAQ,OAEzG,MAAO,CACL,GAAI,IAAU,IAAA,IAAa,CAAE,OAAM,EACnC,GAAI,IAAW,IAAA,IAAa,CAAE,QAAO,EACrC,SAAU,EAAA,gBAAgB,EAAM,UAAY,EAAQ,SAAU,UAAU,EACxE,OAAQ,EAAM,QAAU,EAAQ,MAClC,CACF,EAGA,SAAgB,EACd,EAC0B,CAE1B,IAAI,EAAiB,EAAe,CADS,SAAU,GAAI,OAAQ,EAC/B,EAAc,EAAO,YAAY,EAC/D,EAAc,EAAA,kBAAsE,CACxF,KAAM,CAAC,EACP,MAAO,KACP,WAAY,GACZ,WAAY,EAAiB,EAC7B,MAAO,CACT,CAAC,EAEK,EAAS,GACb,EAAY,MAAM,CAChB,SAAU,EAAU,KAAW,CAAE,GAAG,EAAU,QAAO,WAAY,GAAO,aAAc,IAAA,EAAU,GAChG,KAAO,GAAW,EAAO,KAAK,CAAE,QAAO,QAAO,CAAC,EAC/C,QAAU,IAAc,CAAE,GAAG,EAAU,MAAO,KAAM,WAAY,GAAM,aAAc,CAAM,GAC1F,QAAU,IAAY,CACpB,KAAM,EAAO,KACb,MAAO,KACP,WAAY,GACZ,WAAY,EAAiB,CAAM,EACnC,OACF,EACF,CAAC,EAEG,MAA8B,EAAM,CAAc,EAElD,EAAW,KAAO,IAAoD,CAE1E,IAAM,EAAO,EADG,EAAY,SAAS,cAAgB,EAAY,SAAS,MACrC,CAAK,EAEtC,EAAA,UAAU,EAAM,CAAc,IAElC,EAAiB,EACjB,MAAM,EAAM,CAAI,EAClB,EAEM,EAAmC,CACvC,IAAI,gBAAiB,CACnB,OAAO,EAAY,cACrB,EAEA,QAAS,EAAY,QAErB,IAAI,UAAW,CACb,OAAO,EAAY,QACrB,EAEA,KAAM,CACJ,MAAO,CACL,IAAM,EAAS,EAAY,SAAS,WAAW,WAE/C,OAAO,EAAY,SAAS,YAAc,IAAW,IAAA,GACjD,QAAQ,QAAQ,EAChB,EAAS,CAAE,MAAO,CAAO,CAAC,CAChC,EAEA,UAAW,CACT,IAAM,EAAS,EAAY,SAAS,WAAW,eAE/C,OAAO,EAAY,SAAS,YAAc,IAAW,IAAA,GACjD,QAAQ,QAAQ,EAChB,EAAS,CAAE,OAAQ,CAAO,CAAC,CACjC,CACF,EAEA,SACA,WAEA,IAAI,UAAW,CACb,OAAO,EAAY,QACrB,EAEA,UAAW,EAAY,UAEvB,CAAC,OAAO,UAAW,CACjB,EAAO,QAAQ,CACjB,CACF,EAKA,OAHI,EAAO,YAAc,IACvB,EAAY,CAAC,CAAC,UAAY,EAAA,KAAK,qDAAqD,CAAC,EAEhF,CACT"}
1
+ {"version":3,"file":"cursorSource.cjs","names":[],"sources":["../src/cursorSource.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { createAsyncSource } from './asyncSource';\nimport { SourcererConfigurationError } from './errors';\nimport { positiveInteger, sameQuery, totalItems } from './pagination';\nimport type { CursorPagination, CursorQuery, CursorQueryPatch, CursorSource, CursorSourceConfig } from './types';\n\nconst createPagination = <TCursor>(result?: {\n nextCursor?: TCursor;\n previousCursor?: TCursor;\n total?: number;\n}): CursorPagination<TCursor> => ({\n hasNext: result?.nextCursor !== undefined,\n hasPrevious: result?.previousCursor !== undefined,\n kind: 'cursor',\n ...(result?.nextCursor !== undefined && { nextCursor: result.nextCursor }),\n ...(result?.previousCursor !== undefined && { previousCursor: result.previousCursor }),\n ...(result?.total !== undefined && { total: totalItems(result.total) }),\n});\n\nconst normalizeQuery = <TCursor>(\n current: CursorQuery<TCursor>,\n patch: CursorQueryPatch<TCursor> = {},\n): CursorQuery<TCursor> => {\n if (patch.after !== undefined && patch.before !== undefined) {\n throw new SourcererConfigurationError('Cursor query cannot include both after and before');\n }\n\n const resetsCursor = patch.pageSize !== undefined || patch.search !== undefined;\n const after = resetsCursor || 'before' in patch ? undefined : 'after' in patch ? patch.after : current.after;\n const before = resetsCursor || 'after' in patch ? undefined : 'before' in patch ? patch.before : current.before;\n\n return {\n ...(after !== undefined && { after }),\n ...(before !== undefined && { before }),\n pageSize: positiveInteger(patch.pageSize ?? current.pageSize, 'pageSize'),\n search: patch.search ?? current.search,\n };\n};\n\n/** Cursor sources retain loaded cursors while pendingQuery records newer navigation. */\nexport function createCursorSource<T, TCursor = string>(\n config: CursorSourceConfig<T, TCursor>,\n): CursorSource<T, TCursor> {\n const initialQuery: CursorQuery<TCursor> = { pageSize: 20, search: '' };\n let requestedQuery = normalizeQuery(initialQuery, config.initialQuery);\n const asyncSource = createAsyncSource<T, CursorQuery<TCursor>, CursorPagination<TCursor>>({\n data: [],\n error: null,\n isFetching: false,\n pagination: createPagination(),\n query: requestedQuery,\n });\n\n const fetch = (query: CursorQuery<TCursor>): Promise<void> =>\n asyncSource.fetch({\n load: (signal) => config.load({ query, signal }),\n query,\n success: (result) => ({\n data: result.data,\n error: null,\n isFetching: false,\n pagination: createPagination(result),\n query,\n }),\n });\n\n const reload = (): Promise<void> => fetch(requestedQuery);\n\n const setQuery = async (patch: CursorQueryPatch<TCursor>): Promise<void> => {\n const current = asyncSource.snapshot.pendingQuery ?? asyncSource.snapshot.query;\n const next = normalizeQuery(current, patch);\n\n if (sameQuery(next, requestedQuery)) return;\n\n requestedQuery = next;\n await fetch(next);\n };\n\n const source: CursorSource<T, TCursor> = {\n get disposalSignal() {\n return asyncSource.disposalSignal;\n },\n\n dispose: asyncSource.dispose,\n\n get disposed() {\n return asyncSource.disposed;\n },\n\n page: {\n next() {\n const cursor = asyncSource.snapshot.pagination.nextCursor;\n\n return asyncSource.snapshot.isFetching || cursor === undefined\n ? Promise.resolve()\n : setQuery({ after: cursor });\n },\n\n previous() {\n const cursor = asyncSource.snapshot.pagination.previousCursor;\n\n return asyncSource.snapshot.isFetching || cursor === undefined\n ? Promise.resolve()\n : setQuery({ before: cursor });\n },\n },\n\n reload,\n setQuery,\n\n get snapshot() {\n return asyncSource.snapshot;\n },\n\n subscribe: asyncSource.subscribe,\n\n [Symbol.dispose]() {\n source.dispose();\n },\n };\n\n if (config.autoStart !== false)\n void reload().catch(() => warn('Initial load failed. Inspect source.snapshot.error.'));\n\n return source;\n}\n"],"mappings":"qHAMA,IAAM,EAA6B,IAID,CAChC,QAAS,GAAQ,aAAe,IAAA,GAChC,YAAa,GAAQ,iBAAmB,IAAA,GACxC,KAAM,SACN,GAAI,GAAQ,aAAe,IAAA,IAAa,CAAE,WAAY,EAAO,UAAW,EACxE,GAAI,GAAQ,iBAAmB,IAAA,IAAa,CAAE,eAAgB,EAAO,cAAe,EACpF,GAAI,GAAQ,QAAU,IAAA,IAAa,CAAE,MAAO,EAAA,WAAW,EAAO,KAAK,CAAE,CACvE,GAEM,GACJ,EACA,EAAmC,CAAC,IACX,CACzB,GAAI,EAAM,QAAU,IAAA,IAAa,EAAM,SAAW,IAAA,GAChD,MAAM,IAAI,EAAA,4BAA4B,mDAAmD,EAG3F,IAAM,EAAe,EAAM,WAAa,IAAA,IAAa,EAAM,SAAW,IAAA,GAChE,EAAQ,GAAgB,WAAY,EAAQ,IAAA,GAAY,UAAW,EAAQ,EAAM,MAAQ,EAAQ,MACjG,EAAS,GAAgB,UAAW,EAAQ,IAAA,GAAY,WAAY,EAAQ,EAAM,OAAS,EAAQ,OAEzG,MAAO,CACL,GAAI,IAAU,IAAA,IAAa,CAAE,OAAM,EACnC,GAAI,IAAW,IAAA,IAAa,CAAE,QAAO,EACrC,SAAU,EAAA,gBAAgB,EAAM,UAAY,EAAQ,SAAU,UAAU,EACxE,OAAQ,EAAM,QAAU,EAAQ,MAClC,CACF,EAGA,SAAgB,EACd,EAC0B,CAE1B,IAAI,EAAiB,EAAe,CADS,SAAU,GAAI,OAAQ,EAC/B,EAAc,EAAO,YAAY,EAC/D,EAAc,EAAA,kBAAsE,CACxF,KAAM,CAAC,EACP,MAAO,KACP,WAAY,GACZ,WAAY,EAAiB,EAC7B,MAAO,CACT,CAAC,EAEK,EAAS,GACb,EAAY,MAAM,CAChB,KAAO,GAAW,EAAO,KAAK,CAAE,QAAO,QAAO,CAAC,EAC/C,QACA,QAAU,IAAY,CACpB,KAAM,EAAO,KACb,MAAO,KACP,WAAY,GACZ,WAAY,EAAiB,CAAM,EACnC,OACF,EACF,CAAC,EAEG,MAA8B,EAAM,CAAc,EAElD,EAAW,KAAO,IAAoD,CAE1E,IAAM,EAAO,EADG,EAAY,SAAS,cAAgB,EAAY,SAAS,MACrC,CAAK,EAEtC,EAAA,UAAU,EAAM,CAAc,IAElC,EAAiB,EACjB,MAAM,EAAM,CAAI,EAClB,EAEM,EAAmC,CACvC,IAAI,gBAAiB,CACnB,OAAO,EAAY,cACrB,EAEA,QAAS,EAAY,QAErB,IAAI,UAAW,CACb,OAAO,EAAY,QACrB,EAEA,KAAM,CACJ,MAAO,CACL,IAAM,EAAS,EAAY,SAAS,WAAW,WAE/C,OAAO,EAAY,SAAS,YAAc,IAAW,IAAA,GACjD,QAAQ,QAAQ,EAChB,EAAS,CAAE,MAAO,CAAO,CAAC,CAChC,EAEA,UAAW,CACT,IAAM,EAAS,EAAY,SAAS,WAAW,eAE/C,OAAO,EAAY,SAAS,YAAc,IAAW,IAAA,GACjD,QAAQ,QAAQ,EAChB,EAAS,CAAE,OAAQ,CAAO,CAAC,CACjC,CACF,EAEA,SACA,WAEA,IAAI,UAAW,CACb,OAAO,EAAY,QACrB,EAEA,UAAW,EAAY,UAEvB,CAAC,OAAO,UAAW,CACjB,EAAO,QAAQ,CACjB,CACF,EAKA,OAHI,EAAO,YAAc,IACvB,EAAY,CAAC,CAAC,UAAY,EAAA,KAAK,qDAAqD,CAAC,EAEhF,CACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"cursorSource.d.ts","sourceRoot":"","sources":["../src/cursorSource.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAmD,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAmCjH,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,EACpD,MAAM,EAAE,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,GACrC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAoF1B"}
1
+ {"version":3,"file":"cursorSource.d.ts","sourceRoot":"","sources":["../src/cursorSource.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAmD,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAmCjH,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,EACpD,MAAM,EAAE,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,GACrC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAmF1B"}
@@ -1,85 +1,75 @@
1
1
  import { warn as e } from "./_dev.js";
2
2
  import { createAsyncSource as t } from "./asyncSource.js";
3
- import { positiveInteger as n, sameQuery as r, totalItems as i } from "./pagination.js";
3
+ import { SourcererConfigurationError as n } from "./errors.js";
4
+ import { positiveInteger as r, sameQuery as i, totalItems as a } from "./pagination.js";
4
5
  //#region src/cursorSource.ts
5
- var a = (e) => ({
6
+ var o = (e) => ({
6
7
  hasNext: e?.nextCursor !== void 0,
7
8
  hasPrevious: e?.previousCursor !== void 0,
8
9
  kind: "cursor",
9
10
  ...e?.nextCursor !== void 0 && { nextCursor: e.nextCursor },
10
11
  ...e?.previousCursor !== void 0 && { previousCursor: e.previousCursor },
11
- ...e?.total !== void 0 && { total: i(e.total) }
12
- }), o = (e, t = {}) => {
13
- if (t.after !== void 0 && t.before !== void 0) throw RangeError("Cursor query cannot include both after and before");
14
- let r = t.pageSize !== void 0 || t.search !== void 0, i = r || "before" in t ? void 0 : "after" in t ? t.after : e.after, a = r || "after" in t ? void 0 : "before" in t ? t.before : e.before;
12
+ ...e?.total !== void 0 && { total: a(e.total) }
13
+ }), s = (e, t = {}) => {
14
+ if (t.after !== void 0 && t.before !== void 0) throw new n("Cursor query cannot include both after and before");
15
+ let i = t.pageSize !== void 0 || t.search !== void 0, a = i || "before" in t ? void 0 : "after" in t ? t.after : e.after, o = i || "after" in t ? void 0 : "before" in t ? t.before : e.before;
15
16
  return {
16
- ...i !== void 0 && { after: i },
17
- ...a !== void 0 && { before: a },
18
- pageSize: n(t.pageSize ?? e.pageSize, "pageSize"),
17
+ ...a !== void 0 && { after: a },
18
+ ...o !== void 0 && { before: o },
19
+ pageSize: r(t.pageSize ?? e.pageSize, "pageSize"),
19
20
  search: t.search ?? e.search
20
21
  };
21
22
  };
22
- function s(n) {
23
- let i = o({
23
+ function c(n) {
24
+ let r = s({
24
25
  pageSize: 20,
25
26
  search: ""
26
- }, n.initialQuery), s = t({
27
+ }, n.initialQuery), a = t({
27
28
  data: [],
28
29
  error: null,
29
30
  isFetching: !1,
30
- pagination: a(),
31
- query: i
32
- }), c = (e) => s.fetch({
33
- failure: (e, t) => ({
34
- ...e,
35
- error: t,
36
- isFetching: !1,
37
- pendingQuery: void 0
38
- }),
31
+ pagination: o(),
32
+ query: r
33
+ }), c = (e) => a.fetch({
39
34
  load: (t) => n.load({
40
35
  query: e,
41
36
  signal: t
42
37
  }),
43
- pending: (t) => ({
44
- ...t,
45
- error: null,
46
- isFetching: !0,
47
- pendingQuery: e
48
- }),
38
+ query: e,
49
39
  success: (t) => ({
50
40
  data: t.data,
51
41
  error: null,
52
42
  isFetching: !1,
53
- pagination: a(t),
43
+ pagination: o(t),
54
44
  query: e
55
45
  })
56
- }), l = () => c(i), u = async (e) => {
57
- let t = o(s.snapshot.pendingQuery ?? s.snapshot.query, e);
58
- r(t, i) || (i = t, await c(t));
46
+ }), l = () => c(r), u = async (e) => {
47
+ let t = s(a.snapshot.pendingQuery ?? a.snapshot.query, e);
48
+ i(t, r) || (r = t, await c(t));
59
49
  }, d = {
60
50
  get disposalSignal() {
61
- return s.disposalSignal;
51
+ return a.disposalSignal;
62
52
  },
63
- dispose: s.dispose,
53
+ dispose: a.dispose,
64
54
  get disposed() {
65
- return s.disposed;
55
+ return a.disposed;
66
56
  },
67
57
  page: {
68
58
  next() {
69
- let e = s.snapshot.pagination.nextCursor;
70
- return s.snapshot.isFetching || e === void 0 ? Promise.resolve() : u({ after: e });
59
+ let e = a.snapshot.pagination.nextCursor;
60
+ return a.snapshot.isFetching || e === void 0 ? Promise.resolve() : u({ after: e });
71
61
  },
72
62
  previous() {
73
- let e = s.snapshot.pagination.previousCursor;
74
- return s.snapshot.isFetching || e === void 0 ? Promise.resolve() : u({ before: e });
63
+ let e = a.snapshot.pagination.previousCursor;
64
+ return a.snapshot.isFetching || e === void 0 ? Promise.resolve() : u({ before: e });
75
65
  }
76
66
  },
77
67
  reload: l,
78
68
  setQuery: u,
79
69
  get snapshot() {
80
- return s.snapshot;
70
+ return a.snapshot;
81
71
  },
82
- subscribe: s.subscribe,
72
+ subscribe: a.subscribe,
83
73
  [Symbol.dispose]() {
84
74
  d.dispose();
85
75
  }
@@ -87,6 +77,6 @@ function s(n) {
87
77
  return n.autoStart !== !1 && l().catch(() => /* @__PURE__ */ e("Initial load failed. Inspect source.snapshot.error.")), d;
88
78
  }
89
79
  //#endregion
90
- export { s as createCursorSource };
80
+ export { c as createCursorSource };
91
81
 
92
82
  //# sourceMappingURL=cursorSource.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cursorSource.js","names":[],"sources":["../src/cursorSource.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { createAsyncSource } from './asyncSource';\nimport { positiveInteger, sameQuery, totalItems } from './pagination';\nimport type { CursorPagination, CursorQuery, CursorQueryPatch, CursorSource, CursorSourceConfig } from './types';\n\nconst createPagination = <TCursor>(result?: {\n nextCursor?: TCursor;\n previousCursor?: TCursor;\n total?: number;\n}): CursorPagination<TCursor> => ({\n hasNext: result?.nextCursor !== undefined,\n hasPrevious: result?.previousCursor !== undefined,\n kind: 'cursor',\n ...(result?.nextCursor !== undefined && { nextCursor: result.nextCursor }),\n ...(result?.previousCursor !== undefined && { previousCursor: result.previousCursor }),\n ...(result?.total !== undefined && { total: totalItems(result.total) }),\n});\n\nconst normalizeQuery = <TCursor>(\n current: CursorQuery<TCursor>,\n patch: CursorQueryPatch<TCursor> = {},\n): CursorQuery<TCursor> => {\n if (patch.after !== undefined && patch.before !== undefined) {\n throw new RangeError('Cursor query cannot include both after and before');\n }\n\n const resetsCursor = patch.pageSize !== undefined || patch.search !== undefined;\n const after = resetsCursor || 'before' in patch ? undefined : 'after' in patch ? patch.after : current.after;\n const before = resetsCursor || 'after' in patch ? undefined : 'before' in patch ? patch.before : current.before;\n\n return {\n ...(after !== undefined && { after }),\n ...(before !== undefined && { before }),\n pageSize: positiveInteger(patch.pageSize ?? current.pageSize, 'pageSize'),\n search: patch.search ?? current.search,\n };\n};\n\n/** Cursor sources retain loaded cursors while pendingQuery records newer navigation. */\nexport function createCursorSource<T, TCursor = string>(\n config: CursorSourceConfig<T, TCursor>,\n): CursorSource<T, TCursor> {\n const initialQuery: CursorQuery<TCursor> = { pageSize: 20, search: '' };\n let requestedQuery = normalizeQuery(initialQuery, config.initialQuery);\n const asyncSource = createAsyncSource<T, CursorQuery<TCursor>, CursorPagination<TCursor>>({\n data: [],\n error: null,\n isFetching: false,\n pagination: createPagination(),\n query: requestedQuery,\n });\n\n const fetch = (query: CursorQuery<TCursor>): Promise<void> =>\n asyncSource.fetch({\n failure: (previous, error) => ({ ...previous, error, isFetching: false, pendingQuery: undefined }),\n load: (signal) => config.load({ query, signal }),\n pending: (previous) => ({ ...previous, error: null, isFetching: true, pendingQuery: query }),\n success: (result) => ({\n data: result.data,\n error: null,\n isFetching: false,\n pagination: createPagination(result),\n query,\n }),\n });\n\n const reload = (): Promise<void> => fetch(requestedQuery);\n\n const setQuery = async (patch: CursorQueryPatch<TCursor>): Promise<void> => {\n const current = asyncSource.snapshot.pendingQuery ?? asyncSource.snapshot.query;\n const next = normalizeQuery(current, patch);\n\n if (sameQuery(next, requestedQuery)) return;\n\n requestedQuery = next;\n await fetch(next);\n };\n\n const source: CursorSource<T, TCursor> = {\n get disposalSignal() {\n return asyncSource.disposalSignal;\n },\n\n dispose: asyncSource.dispose,\n\n get disposed() {\n return asyncSource.disposed;\n },\n\n page: {\n next() {\n const cursor = asyncSource.snapshot.pagination.nextCursor;\n\n return asyncSource.snapshot.isFetching || cursor === undefined\n ? Promise.resolve()\n : setQuery({ after: cursor });\n },\n\n previous() {\n const cursor = asyncSource.snapshot.pagination.previousCursor;\n\n return asyncSource.snapshot.isFetching || cursor === undefined\n ? Promise.resolve()\n : setQuery({ before: cursor });\n },\n },\n\n reload,\n setQuery,\n\n get snapshot() {\n return asyncSource.snapshot;\n },\n\n subscribe: asyncSource.subscribe,\n\n [Symbol.dispose]() {\n source.dispose();\n },\n };\n\n if (config.autoStart !== false)\n void reload().catch(() => warn('Initial load failed. Inspect source.snapshot.error.'));\n\n return source;\n}\n"],"mappings":";;;;AAKA,IAAM,KAA6B,OAID;CAChC,SAAS,GAAQ,eAAe,KAAA;CAChC,aAAa,GAAQ,mBAAmB,KAAA;CACxC,MAAM;CACN,GAAI,GAAQ,eAAe,KAAA,KAAa,EAAE,YAAY,EAAO,WAAW;CACxE,GAAI,GAAQ,mBAAmB,KAAA,KAAa,EAAE,gBAAgB,EAAO,eAAe;CACpF,GAAI,GAAQ,UAAU,KAAA,KAAa,EAAE,OAAO,EAAW,EAAO,KAAK,EAAE;AACvE,IAEM,KACJ,GACA,IAAmC,CAAC,MACX;CACzB,IAAI,EAAM,UAAU,KAAA,KAAa,EAAM,WAAW,KAAA,GAChD,MAAU,WAAW,mDAAmD;CAG1E,IAAM,IAAe,EAAM,aAAa,KAAA,KAAa,EAAM,WAAW,KAAA,GAChE,IAAQ,KAAgB,YAAY,IAAQ,KAAA,IAAY,WAAW,IAAQ,EAAM,QAAQ,EAAQ,OACjG,IAAS,KAAgB,WAAW,IAAQ,KAAA,IAAY,YAAY,IAAQ,EAAM,SAAS,EAAQ;CAEzG,OAAO;EACL,GAAI,MAAU,KAAA,KAAa,EAAE,SAAM;EACnC,GAAI,MAAW,KAAA,KAAa,EAAE,UAAO;EACrC,UAAU,EAAgB,EAAM,YAAY,EAAQ,UAAU,UAAU;EACxE,QAAQ,EAAM,UAAU,EAAQ;CAClC;AACF;AAGA,SAAgB,EACd,GAC0B;CAE1B,IAAI,IAAiB,EAAe;EADS,UAAU;EAAI,QAAQ;CAC/B,GAAc,EAAO,YAAY,GAC/D,IAAc,EAAsE;EACxF,MAAM,CAAC;EACP,OAAO;EACP,YAAY;EACZ,YAAY,EAAiB;EAC7B,OAAO;CACT,CAAC,GAEK,KAAS,MACb,EAAY,MAAM;EAChB,UAAU,GAAU,OAAW;GAAE,GAAG;GAAU;GAAO,YAAY;GAAO,cAAc,KAAA;EAAU;EAChG,OAAO,MAAW,EAAO,KAAK;GAAE;GAAO;EAAO,CAAC;EAC/C,UAAU,OAAc;GAAE,GAAG;GAAU,OAAO;GAAM,YAAY;GAAM,cAAc;EAAM;EAC1F,UAAU,OAAY;GACpB,MAAM,EAAO;GACb,OAAO;GACP,YAAY;GACZ,YAAY,EAAiB,CAAM;GACnC;EACF;CACF,CAAC,GAEG,UAA8B,EAAM,CAAc,GAElD,IAAW,OAAO,MAAoD;EAE1E,IAAM,IAAO,EADG,EAAY,SAAS,gBAAgB,EAAY,SAAS,OACrC,CAAK;EAEtC,EAAU,GAAM,CAAc,MAElC,IAAiB,GACjB,MAAM,EAAM,CAAI;CAClB,GAEM,IAAmC;EACvC,IAAI,iBAAiB;GACnB,OAAO,EAAY;EACrB;EAEA,SAAS,EAAY;EAErB,IAAI,WAAW;GACb,OAAO,EAAY;EACrB;EAEA,MAAM;GACJ,OAAO;IACL,IAAM,IAAS,EAAY,SAAS,WAAW;IAE/C,OAAO,EAAY,SAAS,cAAc,MAAW,KAAA,IACjD,QAAQ,QAAQ,IAChB,EAAS,EAAE,OAAO,EAAO,CAAC;GAChC;GAEA,WAAW;IACT,IAAM,IAAS,EAAY,SAAS,WAAW;IAE/C,OAAO,EAAY,SAAS,cAAc,MAAW,KAAA,IACjD,QAAQ,QAAQ,IAChB,EAAS,EAAE,QAAQ,EAAO,CAAC;GACjC;EACF;EAEA;EACA;EAEA,IAAI,WAAW;GACb,OAAO,EAAY;EACrB;EAEA,WAAW,EAAY;EAEvB,CAAC,OAAO,WAAW;GACjB,EAAO,QAAQ;EACjB;CACF;CAKA,OAHI,EAAO,cAAc,MACvB,EAAY,CAAC,CAAC,YAAY,kBAAK,qDAAqD,CAAC,GAEhF;AACT"}
1
+ {"version":3,"file":"cursorSource.js","names":[],"sources":["../src/cursorSource.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { createAsyncSource } from './asyncSource';\nimport { SourcererConfigurationError } from './errors';\nimport { positiveInteger, sameQuery, totalItems } from './pagination';\nimport type { CursorPagination, CursorQuery, CursorQueryPatch, CursorSource, CursorSourceConfig } from './types';\n\nconst createPagination = <TCursor>(result?: {\n nextCursor?: TCursor;\n previousCursor?: TCursor;\n total?: number;\n}): CursorPagination<TCursor> => ({\n hasNext: result?.nextCursor !== undefined,\n hasPrevious: result?.previousCursor !== undefined,\n kind: 'cursor',\n ...(result?.nextCursor !== undefined && { nextCursor: result.nextCursor }),\n ...(result?.previousCursor !== undefined && { previousCursor: result.previousCursor }),\n ...(result?.total !== undefined && { total: totalItems(result.total) }),\n});\n\nconst normalizeQuery = <TCursor>(\n current: CursorQuery<TCursor>,\n patch: CursorQueryPatch<TCursor> = {},\n): CursorQuery<TCursor> => {\n if (patch.after !== undefined && patch.before !== undefined) {\n throw new SourcererConfigurationError('Cursor query cannot include both after and before');\n }\n\n const resetsCursor = patch.pageSize !== undefined || patch.search !== undefined;\n const after = resetsCursor || 'before' in patch ? undefined : 'after' in patch ? patch.after : current.after;\n const before = resetsCursor || 'after' in patch ? undefined : 'before' in patch ? patch.before : current.before;\n\n return {\n ...(after !== undefined && { after }),\n ...(before !== undefined && { before }),\n pageSize: positiveInteger(patch.pageSize ?? current.pageSize, 'pageSize'),\n search: patch.search ?? current.search,\n };\n};\n\n/** Cursor sources retain loaded cursors while pendingQuery records newer navigation. */\nexport function createCursorSource<T, TCursor = string>(\n config: CursorSourceConfig<T, TCursor>,\n): CursorSource<T, TCursor> {\n const initialQuery: CursorQuery<TCursor> = { pageSize: 20, search: '' };\n let requestedQuery = normalizeQuery(initialQuery, config.initialQuery);\n const asyncSource = createAsyncSource<T, CursorQuery<TCursor>, CursorPagination<TCursor>>({\n data: [],\n error: null,\n isFetching: false,\n pagination: createPagination(),\n query: requestedQuery,\n });\n\n const fetch = (query: CursorQuery<TCursor>): Promise<void> =>\n asyncSource.fetch({\n load: (signal) => config.load({ query, signal }),\n query,\n success: (result) => ({\n data: result.data,\n error: null,\n isFetching: false,\n pagination: createPagination(result),\n query,\n }),\n });\n\n const reload = (): Promise<void> => fetch(requestedQuery);\n\n const setQuery = async (patch: CursorQueryPatch<TCursor>): Promise<void> => {\n const current = asyncSource.snapshot.pendingQuery ?? asyncSource.snapshot.query;\n const next = normalizeQuery(current, patch);\n\n if (sameQuery(next, requestedQuery)) return;\n\n requestedQuery = next;\n await fetch(next);\n };\n\n const source: CursorSource<T, TCursor> = {\n get disposalSignal() {\n return asyncSource.disposalSignal;\n },\n\n dispose: asyncSource.dispose,\n\n get disposed() {\n return asyncSource.disposed;\n },\n\n page: {\n next() {\n const cursor = asyncSource.snapshot.pagination.nextCursor;\n\n return asyncSource.snapshot.isFetching || cursor === undefined\n ? Promise.resolve()\n : setQuery({ after: cursor });\n },\n\n previous() {\n const cursor = asyncSource.snapshot.pagination.previousCursor;\n\n return asyncSource.snapshot.isFetching || cursor === undefined\n ? Promise.resolve()\n : setQuery({ before: cursor });\n },\n },\n\n reload,\n setQuery,\n\n get snapshot() {\n return asyncSource.snapshot;\n },\n\n subscribe: asyncSource.subscribe,\n\n [Symbol.dispose]() {\n source.dispose();\n },\n };\n\n if (config.autoStart !== false)\n void reload().catch(() => warn('Initial load failed. Inspect source.snapshot.error.'));\n\n return source;\n}\n"],"mappings":";;;;;AAMA,IAAM,KAA6B,OAID;CAChC,SAAS,GAAQ,eAAe,KAAA;CAChC,aAAa,GAAQ,mBAAmB,KAAA;CACxC,MAAM;CACN,GAAI,GAAQ,eAAe,KAAA,KAAa,EAAE,YAAY,EAAO,WAAW;CACxE,GAAI,GAAQ,mBAAmB,KAAA,KAAa,EAAE,gBAAgB,EAAO,eAAe;CACpF,GAAI,GAAQ,UAAU,KAAA,KAAa,EAAE,OAAO,EAAW,EAAO,KAAK,EAAE;AACvE,IAEM,KACJ,GACA,IAAmC,CAAC,MACX;CACzB,IAAI,EAAM,UAAU,KAAA,KAAa,EAAM,WAAW,KAAA,GAChD,MAAM,IAAI,EAA4B,mDAAmD;CAG3F,IAAM,IAAe,EAAM,aAAa,KAAA,KAAa,EAAM,WAAW,KAAA,GAChE,IAAQ,KAAgB,YAAY,IAAQ,KAAA,IAAY,WAAW,IAAQ,EAAM,QAAQ,EAAQ,OACjG,IAAS,KAAgB,WAAW,IAAQ,KAAA,IAAY,YAAY,IAAQ,EAAM,SAAS,EAAQ;CAEzG,OAAO;EACL,GAAI,MAAU,KAAA,KAAa,EAAE,SAAM;EACnC,GAAI,MAAW,KAAA,KAAa,EAAE,UAAO;EACrC,UAAU,EAAgB,EAAM,YAAY,EAAQ,UAAU,UAAU;EACxE,QAAQ,EAAM,UAAU,EAAQ;CAClC;AACF;AAGA,SAAgB,EACd,GAC0B;CAE1B,IAAI,IAAiB,EAAe;EADS,UAAU;EAAI,QAAQ;CAC/B,GAAc,EAAO,YAAY,GAC/D,IAAc,EAAsE;EACxF,MAAM,CAAC;EACP,OAAO;EACP,YAAY;EACZ,YAAY,EAAiB;EAC7B,OAAO;CACT,CAAC,GAEK,KAAS,MACb,EAAY,MAAM;EAChB,OAAO,MAAW,EAAO,KAAK;GAAE;GAAO;EAAO,CAAC;EAC/C;EACA,UAAU,OAAY;GACpB,MAAM,EAAO;GACb,OAAO;GACP,YAAY;GACZ,YAAY,EAAiB,CAAM;GACnC;EACF;CACF,CAAC,GAEG,UAA8B,EAAM,CAAc,GAElD,IAAW,OAAO,MAAoD;EAE1E,IAAM,IAAO,EADG,EAAY,SAAS,gBAAgB,EAAY,SAAS,OACrC,CAAK;EAEtC,EAAU,GAAM,CAAc,MAElC,IAAiB,GACjB,MAAM,EAAM,CAAI;CAClB,GAEM,IAAmC;EACvC,IAAI,iBAAiB;GACnB,OAAO,EAAY;EACrB;EAEA,SAAS,EAAY;EAErB,IAAI,WAAW;GACb,OAAO,EAAY;EACrB;EAEA,MAAM;GACJ,OAAO;IACL,IAAM,IAAS,EAAY,SAAS,WAAW;IAE/C,OAAO,EAAY,SAAS,cAAc,MAAW,KAAA,IACjD,QAAQ,QAAQ,IAChB,EAAS,EAAE,OAAO,EAAO,CAAC;GAChC;GAEA,WAAW;IACT,IAAM,IAAS,EAAY,SAAS,WAAW;IAE/C,OAAO,EAAY,SAAS,cAAc,MAAW,KAAA,IACjD,QAAQ,QAAQ,IAChB,EAAS,EAAE,QAAQ,EAAO,CAAC;GACjC;EACF;EAEA;EACA;EAEA,IAAI,WAAW;GACb,OAAO,EAAY;EACrB;EAEA,WAAW,EAAY;EAEvB,CAAC,OAAO,WAAW;GACjB,EAAO,QAAQ;EACjB;CACF;CAKA,OAHI,EAAO,cAAc,MACvB,EAAY,CAAC,CAAC,YAAY,kBAAK,qDAAqD,CAAC,GAEhF;AACT"}
@@ -0,0 +1,2 @@
1
+ var e=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},t=class extends e{};exports.SourcererConfigurationError=t,exports.SourcererError=e;
2
+ //# sourceMappingURL=errors.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/** Base class for all sourcerer errors. Use `instanceof SourcererError` to catch any sourcerer-originated error. */\nexport class SourcererError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when a source is configured or queried with invalid arguments. */\nexport class SourcererConfigurationError extends SourcererError {}\n"],"mappings":"AACA,IAAa,EAAb,cAAoC,KAAM,CACxC,YAAY,EAAiB,EAAqB,CAChD,MAAM,EAAS,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAGa,EAAb,cAAiD,CAAe,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** Base class for all sourcerer errors. Use `instanceof SourcererError` to catch any sourcerer-originated error. */
2
+ export declare class SourcererError extends Error {
3
+ constructor(message: string, opts?: ErrorOptions);
4
+ }
5
+ /** Thrown when a source is configured or queried with invalid arguments. */
6
+ export declare class SourcererConfigurationError extends SourcererError {
7
+ }
8
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,oHAAoH;AACpH,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY;CAKjD;AAED,4EAA4E;AAC5E,qBAAa,2BAA4B,SAAQ,cAAc;CAAG"}
package/dist/errors.js ADDED
@@ -0,0 +1,10 @@
1
+ //#region src/errors.ts
2
+ var e = class extends Error {
3
+ constructor(e, t) {
4
+ super(e, t), this.name = new.target.name, Object.setPrototypeOf(this, new.target.prototype);
5
+ }
6
+ }, t = class extends e {};
7
+ //#endregion
8
+ export { t as SourcererConfigurationError, e as SourcererError };
9
+
10
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/** Base class for all sourcerer errors. Use `instanceof SourcererError` to catch any sourcerer-originated error. */\nexport class SourcererError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when a source is configured or queried with invalid arguments. */\nexport class SourcererConfigurationError extends SourcererError {}\n"],"mappings":";AACA,IAAa,IAAb,cAAoC,MAAM;CACxC,YAAY,GAAiB,GAAqB;EAGhD,AAFA,MAAM,GAAS,CAAI,GACnB,KAAK,OAAO,WAAW,MACvB,OAAO,eAAe,MAAM,WAAW,SAAS;CAClD;AACF,GAGa,IAAb,cAAiD,EAAe,CAAC"}
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./cursorSource.cjs"),t=require("./infiniteSource.cjs"),n=require("./localSource.cjs"),r=require("./pageSource.cjs");exports.createCursorSource=e.createCursorSource,exports.createInfiniteSource=t.createInfiniteSource,exports.createLocalSource=n.createLocalSource,exports.createPageSource=r.createPageSource;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./errors.cjs"),t=require("./cursorSource.cjs"),n=require("./infiniteSource.cjs"),r=require("./localSource.cjs"),i=require("./pageSource.cjs");exports.SourcererConfigurationError=e.SourcererConfigurationError,exports.SourcererError=e.SourcererError,exports.createCursorSource=t.createCursorSource,exports.createInfiniteSource=n.createInfiniteSource,exports.createLocalSource=r.createLocalSource,exports.createPageSource=i.createPageSource;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { createCursorSource } from './cursorSource';
2
+ export { SourcererConfigurationError, SourcererError } from './errors';
2
3
  export { createInfiniteSource } from './infiniteSource';
3
4
  export { createLocalSource } from './localSource';
4
5
  export { createPageSource } from './pageSource';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,WAAW,EACX,UAAU,EACV,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,cAAc,EACd,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,MAAM,EACN,cAAc,GACf,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,2BAA2B,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,WAAW,EACX,UAAU,EACV,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,cAAc,EACd,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,MAAM,EACN,cAAc,GACf,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
- import { createCursorSource as e } from "./cursorSource.js";
2
- import { createInfiniteSource as t } from "./infiniteSource.js";
3
- import { createLocalSource as n } from "./localSource.js";
4
- import { createPageSource as r } from "./pageSource.js";
5
- export { e as createCursorSource, t as createInfiniteSource, n as createLocalSource, r as createPageSource };
1
+ import { SourcererConfigurationError as e, SourcererError as t } from "./errors.js";
2
+ import { createCursorSource as n } from "./cursorSource.js";
3
+ import { createInfiniteSource as r } from "./infiniteSource.js";
4
+ import { createLocalSource as i } from "./localSource.js";
5
+ import { createPageSource as a } from "./pageSource.js";
6
+ export { e as SourcererConfigurationError, t as SourcererError, n as createCursorSource, r as createInfiniteSource, i as createLocalSource, a as createPageSource };
@@ -1,2 +1,2 @@
1
- const e=require("./_dev.cjs"),t=require("./asyncSource.cjs"),n=require("./pagination.cjs");var r=(e,t)=>({hasMore:e<t,kind:`infinite`,loaded:e,total:t}),i=(e,t={})=>({pageSize:n.positiveInteger(t.pageSize??e.pageSize,`pageSize`),search:t.search??e.search});function a(a){let o=i({pageSize:20,search:``},a.initialQuery),s=1,c=t.createAsyncSource({data:[],error:null,isFetching:!1,pagination:r(0,0),query:o}),l=(e,t,i)=>{let o=c.snapshot.data;return c.fetch({failure:(e,t)=>({...e,error:t,isFetching:!1,pendingQuery:void 0}),load:n=>a.load({query:{page:t,pageSize:e.pageSize,search:e.search},signal:n}),pending:t=>({...t,error:null,isFetching:!0,pagination:r(t.data.length,t.pagination.total),...i?{}:{pendingQuery:e}}),success:a=>{let c=n.totalItems(a.total),l=i?[...o,...a.data]:a.data;return s=t+1,{data:l,error:null,isFetching:!1,pagination:r(l.length,c),query:e}}})},u=()=>(s=1,l(o,1,!1)),d={get disposalSignal(){return c.disposalSignal},dispose:c.dispose,get disposed(){return c.disposed},loadMore(){let{isFetching:e,pagination:t}=c.snapshot;return e||c.snapshot.data.length>0&&!t.hasMore?Promise.resolve():l(o,s,!0)},reload:u,setQuery:async e=>{let t=i(c.snapshot.pendingQuery??c.snapshot.query,e);n.sameQuery(t,o)||(o=t,s=1,await l(t,1,!1))},get snapshot(){return c.snapshot},subscribe:c.subscribe,[Symbol.dispose](){d.dispose()}};return a.autoStart!==!1&&u().catch(()=>e.warn(`Initial load failed. Inspect source.snapshot.error.`)),d}exports.createInfiniteSource=a;
1
+ const e=require("./_dev.cjs"),t=require("./asyncSource.cjs"),n=require("./pagination.cjs");var r=(e,t)=>({hasMore:e<t,kind:`infinite`,loaded:e,total:t}),i=(e,t={})=>({pageSize:n.positiveInteger(t.pageSize??e.pageSize,`pageSize`),search:t.search??e.search});function a(a){let o=i({pageSize:20,search:``},a.initialQuery),s=1,c=t.createAsyncSource({data:[],error:null,isFetching:!1,pagination:r(0,0),query:o}),l=(e,t,i)=>{let o=c.snapshot.data;return c.fetch({load:n=>a.load({query:{page:t,pageSize:e.pageSize,search:e.search},signal:n}),pending:t=>({...t,error:null,isFetching:!0,pagination:r(t.data.length,t.pagination.total),...i?{}:{pendingQuery:e}}),query:e,success:a=>{let c=n.totalItems(a.total),l=i?[...o,...a.data]:a.data;return s=t+1,{data:l,error:null,isFetching:!1,pagination:r(l.length,c),query:e}}})},u=()=>(s=1,l(o,1,!1)),d={get disposalSignal(){return c.disposalSignal},dispose:c.dispose,get disposed(){return c.disposed},loadMore(){let{isFetching:e,pagination:t}=c.snapshot;return e||c.snapshot.data.length>0&&!t.hasMore?Promise.resolve():l(o,s,!0)},reload:u,setQuery:async e=>{let t=i(c.snapshot.pendingQuery??c.snapshot.query,e);n.sameQuery(t,o)||(o=t,s=1,await l(t,1,!1))},get snapshot(){return c.snapshot},subscribe:c.subscribe,[Symbol.dispose](){d.dispose()}};return a.autoStart!==!1&&u().catch(()=>e.warn(`Initial load failed. Inspect source.snapshot.error.`)),d}exports.createInfiniteSource=a;
2
2
  //# sourceMappingURL=infiniteSource.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"infiniteSource.cjs","names":[],"sources":["../src/infiniteSource.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { createAsyncSource } from './asyncSource';\nimport { positiveInteger, sameQuery, totalItems } from './pagination';\nimport type {\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n} from './types';\n\nconst createPagination = (loaded: number, total: number): InfinitePagination => ({\n hasMore: loaded < total,\n kind: 'infinite',\n loaded,\n total,\n});\n\nconst normalizeQuery = (current: InfiniteQuery, patch: InfiniteQueryPatch = {}): InfiniteQuery => ({\n pageSize: positiveInteger(patch.pageSize ?? current.pageSize, 'pageSize'),\n search: patch.search ?? current.search,\n});\n\n/** Infinite sources preserve loaded collection state while a pending query replaces it. */\nexport function createInfiniteSource<T>(config: InfiniteSourceConfig<T>): InfiniteSource<T> {\n const initialQuery: InfiniteQuery = { pageSize: 20, search: '' };\n let requestedQuery = normalizeQuery(initialQuery, config.initialQuery);\n let nextPage = 1;\n const asyncSource = createAsyncSource<T, InfiniteQuery, InfinitePagination>({\n data: [],\n error: null,\n isFetching: false,\n pagination: createPagination(0, 0),\n query: requestedQuery,\n });\n\n const fetch = (query: InfiniteQuery, page: number, append: boolean): Promise<void> => {\n const loadedData = asyncSource.snapshot.data;\n\n return asyncSource.fetch({\n failure: (previous, error) => ({ ...previous, error, isFetching: false, pendingQuery: undefined }),\n load: (signal) => config.load({ query: { page, pageSize: query.pageSize, search: query.search }, signal }),\n pending: (previous) => ({\n ...previous,\n error: null,\n isFetching: true,\n pagination: createPagination(previous.data.length, previous.pagination.total),\n ...(append ? {} : { pendingQuery: query }),\n }),\n success: (result) => {\n const total = totalItems(result.total);\n const data = append ? [...loadedData, ...result.data] : result.data;\n\n nextPage = page + 1;\n\n return {\n data,\n error: null,\n isFetching: false,\n pagination: createPagination(data.length, total),\n query,\n };\n },\n });\n };\n\n const reload = (): Promise<void> => {\n nextPage = 1;\n\n return fetch(requestedQuery, 1, false);\n };\n\n const setQuery = async (patch: InfiniteQueryPatch): Promise<void> => {\n const current = asyncSource.snapshot.pendingQuery ?? asyncSource.snapshot.query;\n const next = normalizeQuery(current, patch);\n\n if (sameQuery(next, requestedQuery)) return;\n\n requestedQuery = next;\n nextPage = 1;\n await fetch(next, 1, false);\n };\n\n const source: InfiniteSource<T> = {\n get disposalSignal() {\n return asyncSource.disposalSignal;\n },\n\n dispose: asyncSource.dispose,\n\n get disposed() {\n return asyncSource.disposed;\n },\n\n loadMore() {\n const { isFetching, pagination } = asyncSource.snapshot;\n\n return isFetching || (asyncSource.snapshot.data.length > 0 && !pagination.hasMore)\n ? Promise.resolve()\n : fetch(requestedQuery, nextPage, true);\n },\n\n reload,\n setQuery,\n\n get snapshot() {\n return asyncSource.snapshot;\n },\n\n subscribe: asyncSource.subscribe,\n\n [Symbol.dispose]() {\n source.dispose();\n },\n };\n\n if (config.autoStart !== false)\n void reload().catch(() => warn('Initial load failed. Inspect source.snapshot.error.'));\n\n return source;\n}\n"],"mappings":"2FAWA,IAAM,GAAoB,EAAgB,KAAuC,CAC/E,QAAS,EAAS,EAClB,KAAM,WACN,SACA,OACF,GAEM,GAAkB,EAAwB,EAA4B,CAAC,KAAsB,CACjG,SAAU,EAAA,gBAAgB,EAAM,UAAY,EAAQ,SAAU,UAAU,EACxE,OAAQ,EAAM,QAAU,EAAQ,MAClC,GAGA,SAAgB,EAAwB,EAAoD,CAE1F,IAAI,EAAiB,EAAe,CADE,SAAU,GAAI,OAAQ,EACxB,EAAc,EAAO,YAAY,EACjE,EAAW,EACT,EAAc,EAAA,kBAAwD,CAC1E,KAAM,CAAC,EACP,MAAO,KACP,WAAY,GACZ,WAAY,EAAiB,EAAG,CAAC,EACjC,MAAO,CACT,CAAC,EAEK,GAAS,EAAsB,EAAc,IAAmC,CACpF,IAAM,EAAa,EAAY,SAAS,KAExC,OAAO,EAAY,MAAM,CACvB,SAAU,EAAU,KAAW,CAAE,GAAG,EAAU,QAAO,WAAY,GAAO,aAAc,IAAA,EAAU,GAChG,KAAO,GAAW,EAAO,KAAK,CAAE,MAAO,CAAE,OAAM,SAAU,EAAM,SAAU,OAAQ,EAAM,MAAO,EAAG,QAAO,CAAC,EACzG,QAAU,IAAc,CACtB,GAAG,EACH,MAAO,KACP,WAAY,GACZ,WAAY,EAAiB,EAAS,KAAK,OAAQ,EAAS,WAAW,KAAK,EAC5E,GAAI,EAAS,CAAC,EAAI,CAAE,aAAc,CAAM,CAC1C,GACA,QAAU,GAAW,CACnB,IAAM,EAAQ,EAAA,WAAW,EAAO,KAAK,EAC/B,EAAO,EAAS,CAAC,GAAG,EAAY,GAAG,EAAO,IAAI,EAAI,EAAO,KAI/D,MAFA,GAAW,EAAO,EAEX,CACL,OACA,MAAO,KACP,WAAY,GACZ,WAAY,EAAiB,EAAK,OAAQ,CAAK,EAC/C,OACF,CACF,CACF,CAAC,CACH,EAEM,OACJ,EAAW,EAEJ,EAAM,EAAgB,EAAG,EAAK,GAcjC,EAA4B,CAChC,IAAI,gBAAiB,CACnB,OAAO,EAAY,cACrB,EAEA,QAAS,EAAY,QAErB,IAAI,UAAW,CACb,OAAO,EAAY,QACrB,EAEA,UAAW,CACT,GAAM,CAAE,aAAY,cAAe,EAAY,SAE/C,OAAO,GAAe,EAAY,SAAS,KAAK,OAAS,GAAK,CAAC,EAAW,QACtE,QAAQ,QAAQ,EAChB,EAAM,EAAgB,EAAU,EAAI,CAC1C,EAEA,SACA,cA/BsB,IAA6C,CAEnE,IAAM,EAAO,EADG,EAAY,SAAS,cAAgB,EAAY,SAAS,MACrC,CAAK,EAEtC,EAAA,UAAU,EAAM,CAAc,IAElC,EAAiB,EACjB,EAAW,EACX,MAAM,EAAM,EAAM,EAAG,EAAK,EAC5B,EAwBE,IAAI,UAAW,CACb,OAAO,EAAY,QACrB,EAEA,UAAW,EAAY,UAEvB,CAAC,OAAO,UAAW,CACjB,EAAO,QAAQ,CACjB,CACF,EAKA,OAHI,EAAO,YAAc,IACvB,EAAY,CAAC,CAAC,UAAY,EAAA,KAAK,qDAAqD,CAAC,EAEhF,CACT"}
1
+ {"version":3,"file":"infiniteSource.cjs","names":[],"sources":["../src/infiniteSource.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { createAsyncSource } from './asyncSource';\nimport { positiveInteger, sameQuery, totalItems } from './pagination';\nimport type {\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n} from './types';\n\nconst createPagination = (loaded: number, total: number): InfinitePagination => ({\n hasMore: loaded < total,\n kind: 'infinite',\n loaded,\n total,\n});\n\nconst normalizeQuery = (current: InfiniteQuery, patch: InfiniteQueryPatch = {}): InfiniteQuery => ({\n pageSize: positiveInteger(patch.pageSize ?? current.pageSize, 'pageSize'),\n search: patch.search ?? current.search,\n});\n\n/** Infinite sources preserve loaded collection state while a pending query replaces it. */\nexport function createInfiniteSource<T>(config: InfiniteSourceConfig<T>): InfiniteSource<T> {\n const initialQuery: InfiniteQuery = { pageSize: 20, search: '' };\n let requestedQuery = normalizeQuery(initialQuery, config.initialQuery);\n let nextPage = 1;\n const asyncSource = createAsyncSource<T, InfiniteQuery, InfinitePagination>({\n data: [],\n error: null,\n isFetching: false,\n pagination: createPagination(0, 0),\n query: requestedQuery,\n });\n\n const fetch = (query: InfiniteQuery, page: number, append: boolean): Promise<void> => {\n const loadedData = asyncSource.snapshot.data;\n\n return asyncSource.fetch({\n load: (signal) => config.load({ query: { page, pageSize: query.pageSize, search: query.search }, signal }),\n pending: (previous) => ({\n ...previous,\n error: null,\n isFetching: true,\n pagination: createPagination(previous.data.length, previous.pagination.total),\n ...(append ? {} : { pendingQuery: query }),\n }),\n query,\n success: (result) => {\n const total = totalItems(result.total);\n const data = append ? [...loadedData, ...result.data] : result.data;\n\n nextPage = page + 1;\n\n return {\n data,\n error: null,\n isFetching: false,\n pagination: createPagination(data.length, total),\n query,\n };\n },\n });\n };\n\n const reload = (): Promise<void> => {\n nextPage = 1;\n\n return fetch(requestedQuery, 1, false);\n };\n\n const setQuery = async (patch: InfiniteQueryPatch): Promise<void> => {\n const current = asyncSource.snapshot.pendingQuery ?? asyncSource.snapshot.query;\n const next = normalizeQuery(current, patch);\n\n if (sameQuery(next, requestedQuery)) return;\n\n requestedQuery = next;\n nextPage = 1;\n await fetch(next, 1, false);\n };\n\n const source: InfiniteSource<T> = {\n get disposalSignal() {\n return asyncSource.disposalSignal;\n },\n\n dispose: asyncSource.dispose,\n\n get disposed() {\n return asyncSource.disposed;\n },\n\n loadMore() {\n const { isFetching, pagination } = asyncSource.snapshot;\n\n return isFetching || (asyncSource.snapshot.data.length > 0 && !pagination.hasMore)\n ? Promise.resolve()\n : fetch(requestedQuery, nextPage, true);\n },\n\n reload,\n setQuery,\n\n get snapshot() {\n return asyncSource.snapshot;\n },\n\n subscribe: asyncSource.subscribe,\n\n [Symbol.dispose]() {\n source.dispose();\n },\n };\n\n if (config.autoStart !== false)\n void reload().catch(() => warn('Initial load failed. Inspect source.snapshot.error.'));\n\n return source;\n}\n"],"mappings":"2FAWA,IAAM,GAAoB,EAAgB,KAAuC,CAC/E,QAAS,EAAS,EAClB,KAAM,WACN,SACA,OACF,GAEM,GAAkB,EAAwB,EAA4B,CAAC,KAAsB,CACjG,SAAU,EAAA,gBAAgB,EAAM,UAAY,EAAQ,SAAU,UAAU,EACxE,OAAQ,EAAM,QAAU,EAAQ,MAClC,GAGA,SAAgB,EAAwB,EAAoD,CAE1F,IAAI,EAAiB,EAAe,CADE,SAAU,GAAI,OAAQ,EACxB,EAAc,EAAO,YAAY,EACjE,EAAW,EACT,EAAc,EAAA,kBAAwD,CAC1E,KAAM,CAAC,EACP,MAAO,KACP,WAAY,GACZ,WAAY,EAAiB,EAAG,CAAC,EACjC,MAAO,CACT,CAAC,EAEK,GAAS,EAAsB,EAAc,IAAmC,CACpF,IAAM,EAAa,EAAY,SAAS,KAExC,OAAO,EAAY,MAAM,CACvB,KAAO,GAAW,EAAO,KAAK,CAAE,MAAO,CAAE,OAAM,SAAU,EAAM,SAAU,OAAQ,EAAM,MAAO,EAAG,QAAO,CAAC,EACzG,QAAU,IAAc,CACtB,GAAG,EACH,MAAO,KACP,WAAY,GACZ,WAAY,EAAiB,EAAS,KAAK,OAAQ,EAAS,WAAW,KAAK,EAC5E,GAAI,EAAS,CAAC,EAAI,CAAE,aAAc,CAAM,CAC1C,GACA,QACA,QAAU,GAAW,CACnB,IAAM,EAAQ,EAAA,WAAW,EAAO,KAAK,EAC/B,EAAO,EAAS,CAAC,GAAG,EAAY,GAAG,EAAO,IAAI,EAAI,EAAO,KAI/D,MAFA,GAAW,EAAO,EAEX,CACL,OACA,MAAO,KACP,WAAY,GACZ,WAAY,EAAiB,EAAK,OAAQ,CAAK,EAC/C,OACF,CACF,CACF,CAAC,CACH,EAEM,OACJ,EAAW,EAEJ,EAAM,EAAgB,EAAG,EAAK,GAcjC,EAA4B,CAChC,IAAI,gBAAiB,CACnB,OAAO,EAAY,cACrB,EAEA,QAAS,EAAY,QAErB,IAAI,UAAW,CACb,OAAO,EAAY,QACrB,EAEA,UAAW,CACT,GAAM,CAAE,aAAY,cAAe,EAAY,SAE/C,OAAO,GAAe,EAAY,SAAS,KAAK,OAAS,GAAK,CAAC,EAAW,QACtE,QAAQ,QAAQ,EAChB,EAAM,EAAgB,EAAU,EAAI,CAC1C,EAEA,SACA,cA/BsB,IAA6C,CAEnE,IAAM,EAAO,EADG,EAAY,SAAS,cAAgB,EAAY,SAAS,MACrC,CAAK,EAEtC,EAAA,UAAU,EAAM,CAAc,IAElC,EAAiB,EACjB,EAAW,EACX,MAAM,EAAM,EAAM,EAAG,EAAK,EAC5B,EAwBE,IAAI,UAAW,CACb,OAAO,EAAY,QACrB,EAEA,UAAW,EAAY,UAEvB,CAAC,OAAO,UAAW,CACjB,EAAO,QAAQ,CACjB,CACF,EAKA,OAHI,EAAO,YAAc,IACvB,EAAY,CAAC,CAAC,UAAY,EAAA,KAAK,qDAAqD,CAAC,EAEhF,CACT"}
@@ -24,12 +24,6 @@ function s(n) {
24
24
  }), u = (e, t, r) => {
25
25
  let o = l.snapshot.data;
26
26
  return l.fetch({
27
- failure: (e, t) => ({
28
- ...e,
29
- error: t,
30
- isFetching: !1,
31
- pendingQuery: void 0
32
- }),
33
27
  load: (r) => n.load({
34
28
  query: {
35
29
  page: t,
@@ -45,6 +39,7 @@ function s(n) {
45
39
  pagination: a(t.data.length, t.pagination.total),
46
40
  ...r ? {} : { pendingQuery: e }
47
41
  }),
42
+ query: e,
48
43
  success: (n) => {
49
44
  let s = i(n.total), l = r ? [...o, ...n.data] : n.data;
50
45
  return c = t + 1, {
@@ -1 +1 @@
1
- {"version":3,"file":"infiniteSource.js","names":[],"sources":["../src/infiniteSource.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { createAsyncSource } from './asyncSource';\nimport { positiveInteger, sameQuery, totalItems } from './pagination';\nimport type {\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n} from './types';\n\nconst createPagination = (loaded: number, total: number): InfinitePagination => ({\n hasMore: loaded < total,\n kind: 'infinite',\n loaded,\n total,\n});\n\nconst normalizeQuery = (current: InfiniteQuery, patch: InfiniteQueryPatch = {}): InfiniteQuery => ({\n pageSize: positiveInteger(patch.pageSize ?? current.pageSize, 'pageSize'),\n search: patch.search ?? current.search,\n});\n\n/** Infinite sources preserve loaded collection state while a pending query replaces it. */\nexport function createInfiniteSource<T>(config: InfiniteSourceConfig<T>): InfiniteSource<T> {\n const initialQuery: InfiniteQuery = { pageSize: 20, search: '' };\n let requestedQuery = normalizeQuery(initialQuery, config.initialQuery);\n let nextPage = 1;\n const asyncSource = createAsyncSource<T, InfiniteQuery, InfinitePagination>({\n data: [],\n error: null,\n isFetching: false,\n pagination: createPagination(0, 0),\n query: requestedQuery,\n });\n\n const fetch = (query: InfiniteQuery, page: number, append: boolean): Promise<void> => {\n const loadedData = asyncSource.snapshot.data;\n\n return asyncSource.fetch({\n failure: (previous, error) => ({ ...previous, error, isFetching: false, pendingQuery: undefined }),\n load: (signal) => config.load({ query: { page, pageSize: query.pageSize, search: query.search }, signal }),\n pending: (previous) => ({\n ...previous,\n error: null,\n isFetching: true,\n pagination: createPagination(previous.data.length, previous.pagination.total),\n ...(append ? {} : { pendingQuery: query }),\n }),\n success: (result) => {\n const total = totalItems(result.total);\n const data = append ? [...loadedData, ...result.data] : result.data;\n\n nextPage = page + 1;\n\n return {\n data,\n error: null,\n isFetching: false,\n pagination: createPagination(data.length, total),\n query,\n };\n },\n });\n };\n\n const reload = (): Promise<void> => {\n nextPage = 1;\n\n return fetch(requestedQuery, 1, false);\n };\n\n const setQuery = async (patch: InfiniteQueryPatch): Promise<void> => {\n const current = asyncSource.snapshot.pendingQuery ?? asyncSource.snapshot.query;\n const next = normalizeQuery(current, patch);\n\n if (sameQuery(next, requestedQuery)) return;\n\n requestedQuery = next;\n nextPage = 1;\n await fetch(next, 1, false);\n };\n\n const source: InfiniteSource<T> = {\n get disposalSignal() {\n return asyncSource.disposalSignal;\n },\n\n dispose: asyncSource.dispose,\n\n get disposed() {\n return asyncSource.disposed;\n },\n\n loadMore() {\n const { isFetching, pagination } = asyncSource.snapshot;\n\n return isFetching || (asyncSource.snapshot.data.length > 0 && !pagination.hasMore)\n ? Promise.resolve()\n : fetch(requestedQuery, nextPage, true);\n },\n\n reload,\n setQuery,\n\n get snapshot() {\n return asyncSource.snapshot;\n },\n\n subscribe: asyncSource.subscribe,\n\n [Symbol.dispose]() {\n source.dispose();\n },\n };\n\n if (config.autoStart !== false)\n void reload().catch(() => warn('Initial load failed. Inspect source.snapshot.error.'));\n\n return source;\n}\n"],"mappings":";;;;AAWA,IAAM,KAAoB,GAAgB,OAAuC;CAC/E,SAAS,IAAS;CAClB,MAAM;CACN;CACA;AACF,IAEM,KAAkB,GAAwB,IAA4B,CAAC,OAAsB;CACjG,UAAU,EAAgB,EAAM,YAAY,EAAQ,UAAU,UAAU;CACxE,QAAQ,EAAM,UAAU,EAAQ;AAClC;AAGA,SAAgB,EAAwB,GAAoD;CAE1F,IAAI,IAAiB,EAAe;EADE,UAAU;EAAI,QAAQ;CACxB,GAAc,EAAO,YAAY,GACjE,IAAW,GACT,IAAc,EAAwD;EAC1E,MAAM,CAAC;EACP,OAAO;EACP,YAAY;EACZ,YAAY,EAAiB,GAAG,CAAC;EACjC,OAAO;CACT,CAAC,GAEK,KAAS,GAAsB,GAAc,MAAmC;EACpF,IAAM,IAAa,EAAY,SAAS;EAExC,OAAO,EAAY,MAAM;GACvB,UAAU,GAAU,OAAW;IAAE,GAAG;IAAU;IAAO,YAAY;IAAO,cAAc,KAAA;GAAU;GAChG,OAAO,MAAW,EAAO,KAAK;IAAE,OAAO;KAAE;KAAM,UAAU,EAAM;KAAU,QAAQ,EAAM;IAAO;IAAG;GAAO,CAAC;GACzG,UAAU,OAAc;IACtB,GAAG;IACH,OAAO;IACP,YAAY;IACZ,YAAY,EAAiB,EAAS,KAAK,QAAQ,EAAS,WAAW,KAAK;IAC5E,GAAI,IAAS,CAAC,IAAI,EAAE,cAAc,EAAM;GAC1C;GACA,UAAU,MAAW;IACnB,IAAM,IAAQ,EAAW,EAAO,KAAK,GAC/B,IAAO,IAAS,CAAC,GAAG,GAAY,GAAG,EAAO,IAAI,IAAI,EAAO;IAI/D,OAFA,IAAW,IAAO,GAEX;KACL;KACA,OAAO;KACP,YAAY;KACZ,YAAY,EAAiB,EAAK,QAAQ,CAAK;KAC/C;IACF;GACF;EACF,CAAC;CACH,GAEM,WACJ,IAAW,GAEJ,EAAM,GAAgB,GAAG,EAAK,IAcjC,IAA4B;EAChC,IAAI,iBAAiB;GACnB,OAAO,EAAY;EACrB;EAEA,SAAS,EAAY;EAErB,IAAI,WAAW;GACb,OAAO,EAAY;EACrB;EAEA,WAAW;GACT,IAAM,EAAE,eAAY,kBAAe,EAAY;GAE/C,OAAO,KAAe,EAAY,SAAS,KAAK,SAAS,KAAK,CAAC,EAAW,UACtE,QAAQ,QAAQ,IAChB,EAAM,GAAgB,GAAU,EAAI;EAC1C;EAEA;EACA,iBA/BsB,MAA6C;GAEnE,IAAM,IAAO,EADG,EAAY,SAAS,gBAAgB,EAAY,SAAS,OACrC,CAAK;GAEtC,EAAU,GAAM,CAAc,MAElC,IAAiB,GACjB,IAAW,GACX,MAAM,EAAM,GAAM,GAAG,EAAK;EAC5B;EAwBE,IAAI,WAAW;GACb,OAAO,EAAY;EACrB;EAEA,WAAW,EAAY;EAEvB,CAAC,OAAO,WAAW;GACjB,EAAO,QAAQ;EACjB;CACF;CAKA,OAHI,EAAO,cAAc,MACvB,EAAY,CAAC,CAAC,YAAY,kBAAK,qDAAqD,CAAC,GAEhF;AACT"}
1
+ {"version":3,"file":"infiniteSource.js","names":[],"sources":["../src/infiniteSource.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { createAsyncSource } from './asyncSource';\nimport { positiveInteger, sameQuery, totalItems } from './pagination';\nimport type {\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n} from './types';\n\nconst createPagination = (loaded: number, total: number): InfinitePagination => ({\n hasMore: loaded < total,\n kind: 'infinite',\n loaded,\n total,\n});\n\nconst normalizeQuery = (current: InfiniteQuery, patch: InfiniteQueryPatch = {}): InfiniteQuery => ({\n pageSize: positiveInteger(patch.pageSize ?? current.pageSize, 'pageSize'),\n search: patch.search ?? current.search,\n});\n\n/** Infinite sources preserve loaded collection state while a pending query replaces it. */\nexport function createInfiniteSource<T>(config: InfiniteSourceConfig<T>): InfiniteSource<T> {\n const initialQuery: InfiniteQuery = { pageSize: 20, search: '' };\n let requestedQuery = normalizeQuery(initialQuery, config.initialQuery);\n let nextPage = 1;\n const asyncSource = createAsyncSource<T, InfiniteQuery, InfinitePagination>({\n data: [],\n error: null,\n isFetching: false,\n pagination: createPagination(0, 0),\n query: requestedQuery,\n });\n\n const fetch = (query: InfiniteQuery, page: number, append: boolean): Promise<void> => {\n const loadedData = asyncSource.snapshot.data;\n\n return asyncSource.fetch({\n load: (signal) => config.load({ query: { page, pageSize: query.pageSize, search: query.search }, signal }),\n pending: (previous) => ({\n ...previous,\n error: null,\n isFetching: true,\n pagination: createPagination(previous.data.length, previous.pagination.total),\n ...(append ? {} : { pendingQuery: query }),\n }),\n query,\n success: (result) => {\n const total = totalItems(result.total);\n const data = append ? [...loadedData, ...result.data] : result.data;\n\n nextPage = page + 1;\n\n return {\n data,\n error: null,\n isFetching: false,\n pagination: createPagination(data.length, total),\n query,\n };\n },\n });\n };\n\n const reload = (): Promise<void> => {\n nextPage = 1;\n\n return fetch(requestedQuery, 1, false);\n };\n\n const setQuery = async (patch: InfiniteQueryPatch): Promise<void> => {\n const current = asyncSource.snapshot.pendingQuery ?? asyncSource.snapshot.query;\n const next = normalizeQuery(current, patch);\n\n if (sameQuery(next, requestedQuery)) return;\n\n requestedQuery = next;\n nextPage = 1;\n await fetch(next, 1, false);\n };\n\n const source: InfiniteSource<T> = {\n get disposalSignal() {\n return asyncSource.disposalSignal;\n },\n\n dispose: asyncSource.dispose,\n\n get disposed() {\n return asyncSource.disposed;\n },\n\n loadMore() {\n const { isFetching, pagination } = asyncSource.snapshot;\n\n return isFetching || (asyncSource.snapshot.data.length > 0 && !pagination.hasMore)\n ? Promise.resolve()\n : fetch(requestedQuery, nextPage, true);\n },\n\n reload,\n setQuery,\n\n get snapshot() {\n return asyncSource.snapshot;\n },\n\n subscribe: asyncSource.subscribe,\n\n [Symbol.dispose]() {\n source.dispose();\n },\n };\n\n if (config.autoStart !== false)\n void reload().catch(() => warn('Initial load failed. Inspect source.snapshot.error.'));\n\n return source;\n}\n"],"mappings":";;;;AAWA,IAAM,KAAoB,GAAgB,OAAuC;CAC/E,SAAS,IAAS;CAClB,MAAM;CACN;CACA;AACF,IAEM,KAAkB,GAAwB,IAA4B,CAAC,OAAsB;CACjG,UAAU,EAAgB,EAAM,YAAY,EAAQ,UAAU,UAAU;CACxE,QAAQ,EAAM,UAAU,EAAQ;AAClC;AAGA,SAAgB,EAAwB,GAAoD;CAE1F,IAAI,IAAiB,EAAe;EADE,UAAU;EAAI,QAAQ;CACxB,GAAc,EAAO,YAAY,GACjE,IAAW,GACT,IAAc,EAAwD;EAC1E,MAAM,CAAC;EACP,OAAO;EACP,YAAY;EACZ,YAAY,EAAiB,GAAG,CAAC;EACjC,OAAO;CACT,CAAC,GAEK,KAAS,GAAsB,GAAc,MAAmC;EACpF,IAAM,IAAa,EAAY,SAAS;EAExC,OAAO,EAAY,MAAM;GACvB,OAAO,MAAW,EAAO,KAAK;IAAE,OAAO;KAAE;KAAM,UAAU,EAAM;KAAU,QAAQ,EAAM;IAAO;IAAG;GAAO,CAAC;GACzG,UAAU,OAAc;IACtB,GAAG;IACH,OAAO;IACP,YAAY;IACZ,YAAY,EAAiB,EAAS,KAAK,QAAQ,EAAS,WAAW,KAAK;IAC5E,GAAI,IAAS,CAAC,IAAI,EAAE,cAAc,EAAM;GAC1C;GACA;GACA,UAAU,MAAW;IACnB,IAAM,IAAQ,EAAW,EAAO,KAAK,GAC/B,IAAO,IAAS,CAAC,GAAG,GAAY,GAAG,EAAO,IAAI,IAAI,EAAO;IAI/D,OAFA,IAAW,IAAO,GAEX;KACL;KACA,OAAO;KACP,YAAY;KACZ,YAAY,EAAiB,EAAK,QAAQ,CAAK;KAC/C;IACF;GACF;EACF,CAAC;CACH,GAEM,WACJ,IAAW,GAEJ,EAAM,GAAgB,GAAG,EAAK,IAcjC,IAA4B;EAChC,IAAI,iBAAiB;GACnB,OAAO,EAAY;EACrB;EAEA,SAAS,EAAY;EAErB,IAAI,WAAW;GACb,OAAO,EAAY;EACrB;EAEA,WAAW;GACT,IAAM,EAAE,eAAY,kBAAe,EAAY;GAE/C,OAAO,KAAe,EAAY,SAAS,KAAK,SAAS,KAAK,CAAC,EAAW,UACtE,QAAQ,QAAQ,IAChB,EAAM,GAAgB,GAAU,EAAI;EAC1C;EAEA;EACA,iBA/BsB,MAA6C;GAEnE,IAAM,IAAO,EADG,EAAY,SAAS,gBAAgB,EAAY,SAAS,OACrC,CAAK;GAEtC,EAAU,GAAM,CAAc,MAElC,IAAiB,GACjB,IAAW,GACX,MAAM,EAAM,GAAM,GAAG,EAAK;EAC5B;EAwBE,IAAI,WAAW;GACb,OAAO,EAAY;EACrB;EAEA,WAAW,EAAY;EAEvB,CAAC,OAAO,WAAW;GACjB,EAAO,QAAQ;EACjB;CACF;CAKA,OAHI,EAAO,cAAc,MACvB,EAAY,CAAC,CAAC,YAAY,kBAAK,qDAAqD,CAAC,GAEhF;AACT"}
@@ -1,2 +1,2 @@
1
- const e=require("./_dev.cjs"),t=require("./asyncSource.cjs"),n=require("./pagination.cjs");var r=(e,t={},r)=>{let i=t.page??e.page,a=t.pageSize??e.pageSize,o=t.search??e.search,s=`filter`in t||t.pageSize!==void 0||t.search!==void 0||`sort`in t,c=t.page??(s?1:i);return{...`filter`in t?t.filter!==void 0&&{filter:t.filter}:e.filter!==void 0&&{filter:e.filter},...`sort`in t?t.sort!==void 0&&{sort:t.sort}:e.sort!==void 0&&{sort:e.sort},page:r===void 0?n.positiveInteger(c,`page`):Math.min(n.positiveInteger(c,`page`),r),pageSize:n.positiveInteger(a,`pageSize`),search:o}};function i(i){let a=r({page:1,pageSize:20,search:``},i.initialQuery),o=t.createAsyncSource({data:[],error:null,isFetching:!1,pagination:n.createPagePagination(a.page,a.pageSize,0),query:a}),s=e=>o.fetch({failure:(e,t)=>({...e,error:t,isFetching:!1,pendingQuery:void 0}),load:t=>i.load({query:e,signal:t}),pending:t=>({...t,error:null,isFetching:!0,pendingQuery:e}),success:t=>{let r=n.totalItems(t.total),i=n.createPagePagination(e.page,e.pageSize,r),o={...e,page:i.index};return a=o,{data:t.data,error:null,isFetching:!1,pagination:i,query:o}}}),c=()=>s(a),l=async e=>{let t=r(o.snapshot.pendingQuery??o.snapshot.query,e,o.snapshot.pagination.total>0?o.snapshot.pagination.count:void 0);n.sameQuery(t,a)||(a=t,await s(t))},u={get disposalSignal(){return o.disposalSignal},dispose:o.dispose,get disposed(){return o.disposed},page:{go(e){return o.snapshot.isFetching?Promise.resolve():l({page:e})},last(){return o.snapshot.isFetching?Promise.resolve():l({page:o.snapshot.pagination.count})},next(){return o.snapshot.isFetching||!o.snapshot.pagination.hasNext?Promise.resolve():l({page:o.snapshot.pagination.index+1})},previous(){return o.snapshot.isFetching||!o.snapshot.pagination.hasPrevious?Promise.resolve():l({page:o.snapshot.pagination.index-1})}},reload:c,setQuery:l,get snapshot(){return o.snapshot},subscribe:o.subscribe,[Symbol.dispose](){u.dispose()}};return i.autoStart!==!1&&c().catch(()=>e.warn(`Initial load failed. Inspect source.snapshot.error.`)),u}exports.createPageSource=i;
1
+ const e=require("./_dev.cjs"),t=require("./asyncSource.cjs"),n=require("./pagination.cjs");var r=(e,t={},r)=>{let i=t.page??e.page,a=t.pageSize??e.pageSize,o=t.search??e.search,s=`filter`in t||t.pageSize!==void 0||t.search!==void 0||`sort`in t,c=t.page??(s?1:i);return{...`filter`in t?t.filter!==void 0&&{filter:t.filter}:e.filter!==void 0&&{filter:e.filter},...`sort`in t?t.sort!==void 0&&{sort:t.sort}:e.sort!==void 0&&{sort:e.sort},page:r===void 0?n.positiveInteger(c,`page`):Math.min(n.positiveInteger(c,`page`),r),pageSize:n.positiveInteger(a,`pageSize`),search:o}};function i(i){let a=r({page:1,pageSize:20,search:``},i.initialQuery),o=t.createAsyncSource({data:[],error:null,isFetching:!1,pagination:n.createPagePagination(a.page,a.pageSize,0),query:a}),s=e=>o.fetch({load:t=>i.load({query:e,signal:t}),query:e,success:t=>{let r=n.totalItems(t.total),i=n.createPagePagination(e.page,e.pageSize,r),o={...e,page:i.index};return a=o,{data:t.data,error:null,isFetching:!1,pagination:i,query:o}}}),c=()=>s(a),l=async e=>{let t=r(o.snapshot.pendingQuery??o.snapshot.query,e,o.snapshot.pagination.total>0?o.snapshot.pagination.count:void 0);n.sameQuery(t,a)||(a=t,await s(t))},u={get disposalSignal(){return o.disposalSignal},dispose:o.dispose,get disposed(){return o.disposed},page:{go(e){return o.snapshot.isFetching?Promise.resolve():l({page:e})},last(){return o.snapshot.isFetching?Promise.resolve():l({page:o.snapshot.pagination.count})},next(){return o.snapshot.isFetching||!o.snapshot.pagination.hasNext?Promise.resolve():l({page:o.snapshot.pagination.index+1})},previous(){return o.snapshot.isFetching||!o.snapshot.pagination.hasPrevious?Promise.resolve():l({page:o.snapshot.pagination.index-1})}},reload:c,setQuery:l,get snapshot(){return o.snapshot},subscribe:o.subscribe,[Symbol.dispose](){u.dispose()}};return i.autoStart!==!1&&c().catch(()=>e.warn(`Initial load failed. Inspect source.snapshot.error.`)),u}exports.createPageSource=i;
2
2
  //# sourceMappingURL=pageSource.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pageSource.cjs","names":[],"sources":["../src/pageSource.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { createAsyncSource } from './asyncSource';\nimport { createPagePagination, positiveInteger, sameQuery, totalItems } from './pagination';\nimport type { PagePagination, PageQuery, PageQueryPatch, PageSource, PageSourceConfig } from './types';\n\nconst normalizeQuery = <TFilter, TSort>(\n current: PageQuery<TFilter, TSort>,\n patch: PageQueryPatch<TFilter, TSort> = {},\n maxPage?: number,\n): PageQuery<TFilter, TSort> => {\n const page = patch.page ?? current.page;\n const pageSize = patch.pageSize ?? current.pageSize;\n const search = patch.search ?? current.search;\n const resetsPage = 'filter' in patch || patch.pageSize !== undefined || patch.search !== undefined || 'sort' in patch;\n\n const requestedPage = patch.page ?? (resetsPage ? 1 : page);\n\n return {\n ...('filter' in patch\n ? patch.filter !== undefined && { filter: patch.filter }\n : current.filter !== undefined && { filter: current.filter }),\n ...('sort' in patch\n ? patch.sort !== undefined && { sort: patch.sort }\n : current.sort !== undefined && { sort: current.sort }),\n page:\n maxPage === undefined\n ? positiveInteger(requestedPage, 'page')\n : Math.min(positiveInteger(requestedPage, 'page'), maxPage),\n pageSize: positiveInteger(pageSize, 'pageSize'),\n search,\n };\n};\n\n/** Page sources retain loaded state while pendingQuery records newer work. */\nexport function createPageSource<T, TFilter = unknown, TSort = unknown>(\n config: PageSourceConfig<T, TFilter, TSort>,\n): PageSource<T, TFilter, TSort> {\n const initialQuery: PageQuery<TFilter, TSort> = {\n page: 1,\n pageSize: 20,\n search: '',\n };\n let requestedQuery = normalizeQuery(initialQuery, config.initialQuery);\n const asyncSource = createAsyncSource<T, PageQuery<TFilter, TSort>, PagePagination>({\n data: [],\n error: null,\n isFetching: false,\n pagination: createPagePagination(requestedQuery.page, requestedQuery.pageSize, 0),\n query: requestedQuery,\n });\n\n const fetch = (query: PageQuery<TFilter, TSort>): Promise<void> =>\n asyncSource.fetch({\n failure: (previous, error) => ({ ...previous, error, isFetching: false, pendingQuery: undefined }),\n load: (signal) => config.load({ query, signal }),\n pending: (previous) => ({ ...previous, error: null, isFetching: true, pendingQuery: query }),\n success: (result) => {\n const total = totalItems(result.total);\n const pagination = createPagePagination(query.page, query.pageSize, total);\n const loadedQuery = { ...query, page: pagination.index };\n\n requestedQuery = loadedQuery;\n\n return {\n data: result.data,\n error: null,\n isFetching: false,\n pagination,\n query: loadedQuery,\n };\n },\n });\n\n const reload = (): Promise<void> => fetch(requestedQuery);\n\n const setQuery = async (patch: PageQueryPatch<TFilter, TSort>): Promise<void> => {\n const current = asyncSource.snapshot.pendingQuery ?? asyncSource.snapshot.query;\n const next = normalizeQuery(\n current,\n patch,\n asyncSource.snapshot.pagination.total > 0 ? asyncSource.snapshot.pagination.count : undefined,\n );\n\n if (sameQuery(next, requestedQuery)) return;\n\n requestedQuery = next;\n await fetch(next);\n };\n\n const source: PageSource<T, TFilter, TSort> = {\n get disposalSignal() {\n return asyncSource.disposalSignal;\n },\n\n dispose: asyncSource.dispose,\n\n get disposed() {\n return asyncSource.disposed;\n },\n\n page: {\n go(index) {\n return asyncSource.snapshot.isFetching ? Promise.resolve() : setQuery({ page: index });\n },\n\n last() {\n return asyncSource.snapshot.isFetching\n ? Promise.resolve()\n : setQuery({ page: asyncSource.snapshot.pagination.count });\n },\n\n next() {\n return asyncSource.snapshot.isFetching || !asyncSource.snapshot.pagination.hasNext\n ? Promise.resolve()\n : setQuery({ page: asyncSource.snapshot.pagination.index + 1 });\n },\n\n previous() {\n return asyncSource.snapshot.isFetching || !asyncSource.snapshot.pagination.hasPrevious\n ? Promise.resolve()\n : setQuery({ page: asyncSource.snapshot.pagination.index - 1 });\n },\n },\n\n reload,\n setQuery,\n\n get snapshot() {\n return asyncSource.snapshot;\n },\n\n subscribe: asyncSource.subscribe,\n\n [Symbol.dispose]() {\n source.dispose();\n },\n };\n\n if (config.autoStart !== false)\n void reload().catch(() => warn('Initial load failed. Inspect source.snapshot.error.'));\n\n return source;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pageSource.cjs","names":[],"sources":["../src/pageSource.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { createAsyncSource } from './asyncSource';\nimport { createPagePagination, positiveInteger, sameQuery, totalItems } from './pagination';\nimport type { PagePagination, PageQuery, PageQueryPatch, PageSource, PageSourceConfig } from './types';\n\nconst normalizeQuery = <TFilter, TSort>(\n current: PageQuery<TFilter, TSort>,\n patch: PageQueryPatch<TFilter, TSort> = {},\n maxPage?: number,\n): PageQuery<TFilter, TSort> => {\n const page = patch.page ?? current.page;\n const pageSize = patch.pageSize ?? current.pageSize;\n const search = patch.search ?? current.search;\n const resetsPage = 'filter' in patch || patch.pageSize !== undefined || patch.search !== undefined || 'sort' in patch;\n\n const requestedPage = patch.page ?? (resetsPage ? 1 : page);\n\n return {\n ...('filter' in patch\n ? patch.filter !== undefined && { filter: patch.filter }\n : current.filter !== undefined && { filter: current.filter }),\n ...('sort' in patch\n ? patch.sort !== undefined && { sort: patch.sort }\n : current.sort !== undefined && { sort: current.sort }),\n page:\n maxPage === undefined\n ? positiveInteger(requestedPage, 'page')\n : Math.min(positiveInteger(requestedPage, 'page'), maxPage),\n pageSize: positiveInteger(pageSize, 'pageSize'),\n search,\n };\n};\n\n/** Page sources retain loaded state while pendingQuery records newer work. */\nexport function createPageSource<T, TFilter = unknown, TSort = unknown>(\n config: PageSourceConfig<T, TFilter, TSort>,\n): PageSource<T, TFilter, TSort> {\n const initialQuery: PageQuery<TFilter, TSort> = {\n page: 1,\n pageSize: 20,\n search: '',\n };\n let requestedQuery = normalizeQuery(initialQuery, config.initialQuery);\n const asyncSource = createAsyncSource<T, PageQuery<TFilter, TSort>, PagePagination>({\n data: [],\n error: null,\n isFetching: false,\n pagination: createPagePagination(requestedQuery.page, requestedQuery.pageSize, 0),\n query: requestedQuery,\n });\n\n const fetch = (query: PageQuery<TFilter, TSort>): Promise<void> =>\n asyncSource.fetch({\n load: (signal) => config.load({ query, signal }),\n query,\n success: (result) => {\n const total = totalItems(result.total);\n const pagination = createPagePagination(query.page, query.pageSize, total);\n const loadedQuery = { ...query, page: pagination.index };\n\n requestedQuery = loadedQuery;\n\n return {\n data: result.data,\n error: null,\n isFetching: false,\n pagination,\n query: loadedQuery,\n };\n },\n });\n\n const reload = (): Promise<void> => fetch(requestedQuery);\n\n const setQuery = async (patch: PageQueryPatch<TFilter, TSort>): Promise<void> => {\n const current = asyncSource.snapshot.pendingQuery ?? asyncSource.snapshot.query;\n const next = normalizeQuery(\n current,\n patch,\n asyncSource.snapshot.pagination.total > 0 ? asyncSource.snapshot.pagination.count : undefined,\n );\n\n if (sameQuery(next, requestedQuery)) return;\n\n requestedQuery = next;\n await fetch(next);\n };\n\n const source: PageSource<T, TFilter, TSort> = {\n get disposalSignal() {\n return asyncSource.disposalSignal;\n },\n\n dispose: asyncSource.dispose,\n\n get disposed() {\n return asyncSource.disposed;\n },\n\n page: {\n go(index) {\n return asyncSource.snapshot.isFetching ? Promise.resolve() : setQuery({ page: index });\n },\n\n last() {\n return asyncSource.snapshot.isFetching\n ? Promise.resolve()\n : setQuery({ page: asyncSource.snapshot.pagination.count });\n },\n\n next() {\n return asyncSource.snapshot.isFetching || !asyncSource.snapshot.pagination.hasNext\n ? Promise.resolve()\n : setQuery({ page: asyncSource.snapshot.pagination.index + 1 });\n },\n\n previous() {\n return asyncSource.snapshot.isFetching || !asyncSource.snapshot.pagination.hasPrevious\n ? Promise.resolve()\n : setQuery({ page: asyncSource.snapshot.pagination.index - 1 });\n },\n },\n\n reload,\n setQuery,\n\n get snapshot() {\n return asyncSource.snapshot;\n },\n\n subscribe: asyncSource.subscribe,\n\n [Symbol.dispose]() {\n source.dispose();\n },\n };\n\n if (config.autoStart !== false)\n void reload().catch(() => warn('Initial load failed. Inspect source.snapshot.error.'));\n\n return source;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pageSource.d.ts","sourceRoot":"","sources":["../src/pageSource.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAA6C,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA8BvG,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,EACpE,MAAM,EAAE,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,GAC1C,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CA0G/B"}
1
+ {"version":3,"file":"pageSource.d.ts","sourceRoot":"","sources":["../src/pageSource.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAA6C,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA8BvG,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,EACpE,MAAM,EAAE,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,GAC1C,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAyG/B"}
@@ -24,22 +24,11 @@ function s(r) {
24
24
  pagination: n(s.page, s.pageSize, 0),
25
25
  query: s
26
26
  }), l = (e) => c.fetch({
27
- failure: (e, t) => ({
28
- ...e,
29
- error: t,
30
- isFetching: !1,
31
- pendingQuery: void 0
32
- }),
33
27
  load: (t) => r.load({
34
28
  query: e,
35
29
  signal: t
36
30
  }),
37
- pending: (t) => ({
38
- ...t,
39
- error: null,
40
- isFetching: !0,
41
- pendingQuery: e
42
- }),
31
+ query: e,
43
32
  success: (t) => {
44
33
  let r = a(t.total), i = n(e.page, e.pageSize, r), o = {
45
34
  ...e,