@vielzeug/sourcerer 1.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -74
- package/dist/_dev.cjs +1 -1
- package/dist/_dev.cjs.map +1 -1
- package/dist/_dev.js +2 -8
- package/dist/_dev.js.map +1 -1
- package/dist/asyncSource.cjs +1 -1
- package/dist/asyncSource.cjs.map +1 -1
- package/dist/asyncSource.d.ts +14 -58
- package/dist/asyncSource.d.ts.map +1 -1
- package/dist/asyncSource.js +28 -27
- package/dist/asyncSource.js.map +1 -1
- package/dist/cursorSource.cjs +1 -1
- package/dist/cursorSource.cjs.map +1 -1
- package/dist/cursorSource.d.ts +3 -3
- package/dist/cursorSource.d.ts.map +1 -1
- package/dist/cursorSource.js +76 -109
- package/dist/cursorSource.js.map +1 -1
- package/dist/devtools.cjs +1 -1
- package/dist/devtools.cjs.map +1 -1
- package/dist/devtools.d.ts +4 -50
- package/dist/devtools.d.ts.map +1 -1
- package/dist/devtools.js +3 -15
- package/dist/devtools.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +2 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -13
- package/dist/infiniteSource.cjs +1 -1
- package/dist/infiniteSource.cjs.map +1 -1
- package/dist/infiniteSource.d.ts +3 -3
- package/dist/infiniteSource.d.ts.map +1 -1
- package/dist/infiniteSource.js +71 -106
- package/dist/infiniteSource.js.map +1 -1
- package/dist/localSource.cjs +1 -1
- package/dist/localSource.cjs.map +1 -1
- package/dist/localSource.d.ts +2 -22
- package/dist/localSource.d.ts.map +1 -1
- package/dist/localSource.js +58 -104
- package/dist/localSource.js.map +1 -1
- package/dist/pageSource.cjs +2 -0
- package/dist/pageSource.cjs.map +1 -0
- package/dist/pageSource.d.ts +4 -0
- package/dist/pageSource.d.ts.map +1 -0
- package/dist/pageSource.js +96 -0
- package/dist/pageSource.js.map +1 -0
- package/dist/pagination.cjs +1 -1
- package/dist/pagination.cjs.map +1 -1
- package/dist/pagination.d.ts +5 -30
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js +21 -27
- package/dist/pagination.js.map +1 -1
- package/dist/requestController.cjs +2 -0
- package/dist/requestController.cjs.map +1 -0
- package/dist/requestController.d.ts +13 -0
- package/dist/requestController.d.ts.map +1 -0
- package/dist/requestController.js +29 -0
- package/dist/requestController.js.map +1 -0
- package/dist/sourceStore.cjs +2 -0
- package/dist/sourceStore.cjs.map +1 -0
- package/dist/sourceStore.d.ts +10 -0
- package/dist/sourceStore.d.ts.map +1 -0
- package/dist/sourceStore.js +38 -0
- package/dist/sourceStore.js.map +1 -0
- package/dist/sourcerer.cjs +1 -1
- package/dist/sourcerer.cjs.map +1 -1
- package/dist/sourcerer.iife.js +1 -1
- package/dist/sourcerer.iife.js.map +1 -1
- package/dist/sourcerer.js +1 -1
- package/dist/sourcerer.js.map +1 -1
- package/dist/types.d.ts +128 -355
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -7
- package/dist/_utils.cjs +0 -2
- package/dist/_utils.cjs.map +0 -1
- package/dist/_utils.d.ts +0 -28
- package/dist/_utils.d.ts.map +0 -1
- package/dist/_utils.js +0 -20
- package/dist/_utils.js.map +0 -1
- package/dist/asyncSearch.cjs +0 -2
- package/dist/asyncSearch.cjs.map +0 -1
- package/dist/asyncSearch.d.ts +0 -13
- package/dist/asyncSearch.d.ts.map +0 -1
- package/dist/asyncSearch.js +0 -28
- package/dist/asyncSearch.js.map +0 -1
- package/dist/codecs.cjs +0 -2
- package/dist/codecs.cjs.map +0 -1
- package/dist/codecs.d.ts +0 -30
- package/dist/codecs.d.ts.map +0 -1
- package/dist/codecs.js +0 -38
- package/dist/codecs.js.map +0 -1
- package/dist/core.cjs +0 -2
- package/dist/core.cjs.map +0 -1
- package/dist/core.d.ts +0 -71
- package/dist/core.d.ts.map +0 -1
- package/dist/core.js +0 -59
- package/dist/core.js.map +0 -1
- package/dist/derive.cjs +0 -2
- package/dist/derive.cjs.map +0 -1
- package/dist/derive.d.ts +0 -29
- package/dist/derive.d.ts.map +0 -1
- package/dist/derive.js +0 -38
- package/dist/derive.js.map +0 -1
- package/dist/errors.cjs +0 -2
- package/dist/errors.cjs.map +0 -1
- package/dist/errors.d.ts +0 -62
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -29
- package/dist/errors.js.map +0 -1
- package/dist/fetchManager.cjs +0 -2
- package/dist/fetchManager.cjs.map +0 -1
- package/dist/fetchManager.d.ts +0 -40
- package/dist/fetchManager.d.ts.map +0 -1
- package/dist/fetchManager.js +0 -41
- package/dist/fetchManager.js.map +0 -1
- package/dist/merge.cjs +0 -2
- package/dist/merge.cjs.map +0 -1
- package/dist/merge.d.ts +0 -35
- package/dist/merge.d.ts.map +0 -1
- package/dist/merge.js +0 -41
- package/dist/merge.js.map +0 -1
- package/dist/prefetch.cjs +0 -2
- package/dist/prefetch.cjs.map +0 -1
- package/dist/prefetch.d.ts +0 -32
- package/dist/prefetch.d.ts.map +0 -1
- package/dist/prefetch.js +0 -38
- package/dist/prefetch.js.map +0 -1
- package/dist/presets.cjs +0 -2
- package/dist/presets.cjs.map +0 -1
- package/dist/presets.d.ts +0 -17
- package/dist/presets.d.ts.map +0 -1
- package/dist/presets.js +0 -43
- package/dist/presets.js.map +0 -1
- package/dist/remoteSource.cjs +0 -2
- package/dist/remoteSource.cjs.map +0 -1
- package/dist/remoteSource.d.ts +0 -4
- package/dist/remoteSource.d.ts.map +0 -1
- package/dist/remoteSource.js +0 -165
- package/dist/remoteSource.js.map +0 -1
- package/dist/state.cjs +0 -2
- package/dist/state.cjs.map +0 -1
- package/dist/state.d.ts +0 -23
- package/dist/state.d.ts.map +0 -1
- package/dist/state.js +0 -14
- package/dist/state.js.map +0 -1
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { warn as e } from "./_dev.js";
|
|
2
|
+
import { createAsyncSource as t } from "./asyncSource.js";
|
|
3
|
+
import { createPagePagination as n, positiveInteger as r, sameQuery as i, totalItems as a } from "./pagination.js";
|
|
4
|
+
//#region src/pageSource.ts
|
|
5
|
+
var o = (e, t = {}, n) => {
|
|
6
|
+
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);
|
|
7
|
+
return {
|
|
8
|
+
..."filter" in t ? t.filter !== void 0 && { filter: t.filter } : e.filter !== void 0 && { filter: e.filter },
|
|
9
|
+
..."sort" in t ? t.sort !== void 0 && { sort: t.sort } : e.sort !== void 0 && { sort: e.sort },
|
|
10
|
+
page: n === void 0 ? r(c, "page") : Math.min(r(c, "page"), n),
|
|
11
|
+
pageSize: r(a, "pageSize"),
|
|
12
|
+
search: o
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
function s(r) {
|
|
16
|
+
let s = o({
|
|
17
|
+
page: 1,
|
|
18
|
+
pageSize: 20,
|
|
19
|
+
search: ""
|
|
20
|
+
}, r.initialQuery), c = t({
|
|
21
|
+
data: [],
|
|
22
|
+
error: null,
|
|
23
|
+
isFetching: !1,
|
|
24
|
+
pagination: n(s.page, s.pageSize, 0),
|
|
25
|
+
query: s
|
|
26
|
+
}), l = (e) => c.fetch({
|
|
27
|
+
failure: (e, t) => ({
|
|
28
|
+
...e,
|
|
29
|
+
error: t,
|
|
30
|
+
isFetching: !1,
|
|
31
|
+
pendingQuery: void 0
|
|
32
|
+
}),
|
|
33
|
+
load: (t) => r.load({
|
|
34
|
+
query: e,
|
|
35
|
+
signal: t
|
|
36
|
+
}),
|
|
37
|
+
pending: (t) => ({
|
|
38
|
+
...t,
|
|
39
|
+
error: null,
|
|
40
|
+
isFetching: !0,
|
|
41
|
+
pendingQuery: e
|
|
42
|
+
}),
|
|
43
|
+
success: (t) => {
|
|
44
|
+
let r = a(t.total), i = n(e.page, e.pageSize, r), o = {
|
|
45
|
+
...e,
|
|
46
|
+
page: i.index
|
|
47
|
+
};
|
|
48
|
+
return s = o, {
|
|
49
|
+
data: t.data,
|
|
50
|
+
error: null,
|
|
51
|
+
isFetching: !1,
|
|
52
|
+
pagination: i,
|
|
53
|
+
query: o
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}), u = () => l(s), d = async (e) => {
|
|
57
|
+
let t = o(c.snapshot.pendingQuery ?? c.snapshot.query, e, c.snapshot.pagination.total > 0 ? c.snapshot.pagination.count : void 0);
|
|
58
|
+
i(t, s) || (s = t, await l(t));
|
|
59
|
+
}, f = {
|
|
60
|
+
get disposalSignal() {
|
|
61
|
+
return c.disposalSignal;
|
|
62
|
+
},
|
|
63
|
+
dispose: c.dispose,
|
|
64
|
+
get disposed() {
|
|
65
|
+
return c.disposed;
|
|
66
|
+
},
|
|
67
|
+
page: {
|
|
68
|
+
go(e) {
|
|
69
|
+
return c.snapshot.isFetching ? Promise.resolve() : d({ page: e });
|
|
70
|
+
},
|
|
71
|
+
last() {
|
|
72
|
+
return c.snapshot.isFetching ? Promise.resolve() : d({ page: c.snapshot.pagination.count });
|
|
73
|
+
},
|
|
74
|
+
next() {
|
|
75
|
+
return c.snapshot.isFetching || !c.snapshot.pagination.hasNext ? Promise.resolve() : d({ page: c.snapshot.pagination.index + 1 });
|
|
76
|
+
},
|
|
77
|
+
previous() {
|
|
78
|
+
return c.snapshot.isFetching || !c.snapshot.pagination.hasPrevious ? Promise.resolve() : d({ page: c.snapshot.pagination.index - 1 });
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
reload: u,
|
|
82
|
+
setQuery: d,
|
|
83
|
+
get snapshot() {
|
|
84
|
+
return c.snapshot;
|
|
85
|
+
},
|
|
86
|
+
subscribe: c.subscribe,
|
|
87
|
+
[Symbol.dispose]() {
|
|
88
|
+
f.dispose();
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
return r.autoStart !== !1 && u().catch(() => /* @__PURE__ */ e("Initial load failed. Inspect source.snapshot.error.")), f;
|
|
92
|
+
}
|
|
93
|
+
//#endregion
|
|
94
|
+
export { s as createPageSource };
|
|
95
|
+
|
|
96
|
+
//# sourceMappingURL=pageSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageSource.js","names":[],"sources":["../src/pageSource.ts"],"sourcesContent":["import type { PagePagination, PageQuery, PageQueryPatch, PageSource, PageSourceConfig } from './types';\n\nimport { warn } from './_dev';\nimport { createAsyncSource } from './asyncSource';\nimport { createPagePagination, positiveInteger, sameQuery, totalItems } from './pagination';\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":";;;;AAMA,IAAM,KACJ,GACA,IAAwC,CAAC,GACzC,MAC8B;CAC9B,IAAM,IAAO,EAAM,QAAQ,EAAQ,MAC7B,IAAW,EAAM,YAAY,EAAQ,UACrC,IAAS,EAAM,UAAU,EAAQ,QACjC,IAAa,YAAY,KAAS,EAAM,aAAa,KAAA,KAAa,EAAM,WAAW,KAAA,KAAa,UAAU,GAE1G,IAAgB,EAAM,SAAS,IAAa,IAAI;CAEtD,OAAO;EACL,GAAI,YAAY,IACZ,EAAM,WAAW,KAAA,KAAa,EAAE,QAAQ,EAAM,OAAO,IACrD,EAAQ,WAAW,KAAA,KAAa,EAAE,QAAQ,EAAQ,OAAO;EAC7D,GAAI,UAAU,IACV,EAAM,SAAS,KAAA,KAAa,EAAE,MAAM,EAAM,KAAK,IAC/C,EAAQ,SAAS,KAAA,KAAa,EAAE,MAAM,EAAQ,KAAK;EACvD,MACE,MAAY,KAAA,IACR,EAAgB,GAAe,MAAM,IACrC,KAAK,IAAI,EAAgB,GAAe,MAAM,GAAG,CAAO;EAC9D,UAAU,EAAgB,GAAU,UAAU;EAC9C;CACF;AACF;AAGA,SAAgB,EACd,GAC+B;CAM/B,IAAI,IAAiB,EAAe;EAJlC,MAAM;EACN,UAAU;EACV,QAAQ;CAE0B,GAAc,EAAO,YAAY,GAC/D,IAAc,EAAgE;EAClF,MAAM,CAAC;EACP,OAAO;EACP,YAAY;EACZ,YAAY,EAAqB,EAAe,MAAM,EAAe,UAAU,CAAC;EAChF,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,MAAW;GACnB,IAAM,IAAQ,EAAW,EAAO,KAAK,GAC/B,IAAa,EAAqB,EAAM,MAAM,EAAM,UAAU,CAAK,GACnE,IAAc;IAAE,GAAG;IAAO,MAAM,EAAW;GAAM;GAIvD,OAFA,IAAiB,GAEV;IACL,MAAM,EAAO;IACb,OAAO;IACP,YAAY;IACZ;IACA,OAAO;GACT;EACF;CACF,CAAC,GAEG,UAA8B,EAAM,CAAc,GAElD,IAAW,OAAO,MAAyD;EAE/E,IAAM,IAAO,EADG,EAAY,SAAS,gBAAgB,EAAY,SAAS,OAGxE,GACA,EAAY,SAAS,WAAW,QAAQ,IAAI,EAAY,SAAS,WAAW,QAAQ,KAAA,CACtF;EAEI,EAAU,GAAM,CAAc,MAElC,IAAiB,GACjB,MAAM,EAAM,CAAI;CAClB,GAEM,IAAwC;EAC5C,IAAI,iBAAiB;GACnB,OAAO,EAAY;EACrB;EAEA,SAAS,EAAY;EAErB,IAAI,WAAW;GACb,OAAO,EAAY;EACrB;EAEA,MAAM;GACJ,GAAG,GAAO;IACR,OAAO,EAAY,SAAS,aAAa,QAAQ,QAAQ,IAAI,EAAS,EAAE,MAAM,EAAM,CAAC;GACvF;GAEA,OAAO;IACL,OAAO,EAAY,SAAS,aACxB,QAAQ,QAAQ,IAChB,EAAS,EAAE,MAAM,EAAY,SAAS,WAAW,MAAM,CAAC;GAC9D;GAEA,OAAO;IACL,OAAO,EAAY,SAAS,cAAc,CAAC,EAAY,SAAS,WAAW,UACvE,QAAQ,QAAQ,IAChB,EAAS,EAAE,MAAM,EAAY,SAAS,WAAW,QAAQ,EAAE,CAAC;GAClE;GAEA,WAAW;IACT,OAAO,EAAY,SAAS,cAAc,CAAC,EAAY,SAAS,WAAW,cACvE,QAAQ,QAAQ,IAChB,EAAS,EAAE,MAAM,EAAY,SAAS,WAAW,QAAQ,EAAE,CAAC;GAClE;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"}
|
package/dist/pagination.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
function e(e,t){if(!Number.isInteger(e)||e<1)throw RangeError(`${t} must be a positive integer`);return e}function t(e){if(!Number.isInteger(e)||e<0)throw RangeError(`Source loader total must be a non-negative integer`);return e}function n(e,t,n){let r=Math.max(1,Math.ceil(n/t)),i=Math.min(e,r);return{count:r,hasNext:i<r,hasPrevious:i>1,index:i,kind:`page`,size:t,total:n}}function r(e,t){return[...new Set([...Object.keys(e),...Object.keys(t)])].every(n=>Object.is(e[n],t[n]))}exports.createPagePagination=n,exports.positiveInteger=e,exports.sameQuery=r,exports.totalItems=t;
|
|
2
2
|
//# sourceMappingURL=pagination.cjs.map
|
package/dist/pagination.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.cjs","names":[],"sources":["../src/pagination.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"pagination.cjs","names":[],"sources":["../src/pagination.ts"],"sourcesContent":["import type { PagePagination } from './types';\n\nexport function positiveInteger(value: number, name: string): number {\n if (!Number.isInteger(value) || value < 1) throw new RangeError(`${name} must be a positive integer`);\n\n return value;\n}\n\nexport function totalItems(value: number): number {\n if (!Number.isInteger(value) || value < 0) throw new RangeError('Source loader total must be a non-negative integer');\n\n return value;\n}\n\nexport function createPagePagination(index: number, size: number, total: number): PagePagination {\n const count = Math.max(1, Math.ceil(total / size));\n const safeIndex = Math.min(index, count);\n\n return {\n count,\n hasNext: safeIndex < count,\n hasPrevious: safeIndex > 1,\n index: safeIndex,\n kind: 'page',\n size,\n total,\n };\n}\n\nexport function sameQuery<T extends Record<string, unknown>>(left: T, right: T): boolean {\n const keys = new Set([...Object.keys(left), ...Object.keys(right)]);\n\n return [...keys].every((key) => Object.is(left[key], right[key]));\n}\n"],"mappings":"AAEA,SAAgB,EAAgB,EAAe,EAAsB,CACnE,GAAI,CAAC,OAAO,UAAU,CAAK,GAAK,EAAQ,EAAG,MAAU,WAAW,GAAG,EAAK,4BAA4B,EAEpG,OAAO,CACT,CAEA,SAAgB,EAAW,EAAuB,CAChD,GAAI,CAAC,OAAO,UAAU,CAAK,GAAK,EAAQ,EAAG,MAAU,WAAW,oDAAoD,EAEpH,OAAO,CACT,CAEA,SAAgB,EAAqB,EAAe,EAAc,EAA+B,CAC/F,IAAM,EAAQ,KAAK,IAAI,EAAG,KAAK,KAAK,EAAQ,CAAI,CAAC,EAC3C,EAAY,KAAK,IAAI,EAAO,CAAK,EAEvC,MAAO,CACL,QACA,QAAS,EAAY,EACrB,YAAa,EAAY,EACzB,MAAO,EACP,KAAM,OACN,OACA,OACF,CACF,CAEA,SAAgB,EAA6C,EAAS,EAAmB,CAGvF,MAAO,CAAC,GAAG,IAFM,IAAI,CAAC,GAAG,OAAO,KAAK,CAAI,EAAG,GAAG,OAAO,KAAK,CAAK,CAAC,CAEtD,CAAI,CAAC,CAAC,MAAO,GAAQ,OAAO,GAAG,EAAK,GAAM,EAAM,EAAI,CAAC,CAClE"}
|
package/dist/pagination.d.ts
CHANGED
|
@@ -1,31 +1,6 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare
|
|
3
|
-
export declare
|
|
4
|
-
export declare
|
|
5
|
-
|
|
6
|
-
isLoading: boolean;
|
|
7
|
-
isSearchPending: boolean;
|
|
8
|
-
pageNumber: number;
|
|
9
|
-
pageSize: number;
|
|
10
|
-
totalItems: number;
|
|
11
|
-
}) => SourceMeta;
|
|
12
|
-
/**
|
|
13
|
-
* Computes the 1-based display range of items on the current page.
|
|
14
|
-
* Returns `{ start: 0, end: 0 }` when there are no items.
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```ts
|
|
18
|
-
* const { start, end } = itemRange(source.meta);
|
|
19
|
-
* // "Showing 11–20 of 50"
|
|
20
|
-
* console.log(`Showing ${start}–${end} of ${source.meta.totalItems}`);
|
|
21
|
-
* ```
|
|
22
|
-
*/
|
|
23
|
-
export declare function itemRange(meta: Readonly<{
|
|
24
|
-
pageNumber: number;
|
|
25
|
-
pageSize: number;
|
|
26
|
-
totalItems: number;
|
|
27
|
-
}>): {
|
|
28
|
-
end: number;
|
|
29
|
-
start: number;
|
|
30
|
-
};
|
|
1
|
+
import type { PagePagination } from './types';
|
|
2
|
+
export declare function positiveInteger(value: number, name: string): number;
|
|
3
|
+
export declare function totalItems(value: number): number;
|
|
4
|
+
export declare function createPagePagination(index: number, size: number, total: number): PagePagination;
|
|
5
|
+
export declare function sameQuery<T extends Record<string, unknown>>(left: T, right: T): boolean;
|
|
31
6
|
//# sourceMappingURL=pagination.d.ts.map
|
package/dist/pagination.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAInE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAa/F;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAIvF"}
|
package/dist/pagination.js
CHANGED
|
@@ -1,34 +1,28 @@
|
|
|
1
1
|
//#region src/pagination.ts
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
return
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
isLoading: r.isLoading,
|
|
13
|
-
isSearchPending: r.isSearchPending,
|
|
14
|
-
pageCount: o,
|
|
15
|
-
pageNumber: s,
|
|
16
|
-
pageSize: i,
|
|
17
|
-
totalItems: a
|
|
18
|
-
};
|
|
19
|
-
};
|
|
20
|
-
function i(e) {
|
|
21
|
-
if (e.totalItems === 0) return {
|
|
22
|
-
end: 0,
|
|
23
|
-
start: 0
|
|
24
|
-
};
|
|
25
|
-
let t = (e.pageNumber - 1) * e.pageSize + 1;
|
|
2
|
+
function e(e, t) {
|
|
3
|
+
if (!Number.isInteger(e) || e < 1) throw RangeError(`${t} must be a positive integer`);
|
|
4
|
+
return e;
|
|
5
|
+
}
|
|
6
|
+
function t(e) {
|
|
7
|
+
if (!Number.isInteger(e) || e < 0) throw RangeError("Source loader total must be a non-negative integer");
|
|
8
|
+
return e;
|
|
9
|
+
}
|
|
10
|
+
function n(e, t, n) {
|
|
11
|
+
let r = Math.max(1, Math.ceil(n / t)), i = Math.min(e, r);
|
|
26
12
|
return {
|
|
27
|
-
|
|
28
|
-
|
|
13
|
+
count: r,
|
|
14
|
+
hasNext: i < r,
|
|
15
|
+
hasPrevious: i > 1,
|
|
16
|
+
index: i,
|
|
17
|
+
kind: "page",
|
|
18
|
+
size: t,
|
|
19
|
+
total: n
|
|
29
20
|
};
|
|
30
21
|
}
|
|
22
|
+
function r(e, t) {
|
|
23
|
+
return [.../* @__PURE__ */ new Set([...Object.keys(e), ...Object.keys(t)])].every((n) => Object.is(e[n], t[n]));
|
|
24
|
+
}
|
|
31
25
|
//#endregion
|
|
32
|
-
export { n as
|
|
26
|
+
export { n as createPagePagination, e as positiveInteger, r as sameQuery, t as totalItems };
|
|
33
27
|
|
|
34
28
|
//# sourceMappingURL=pagination.js.map
|
package/dist/pagination.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.js","names":[],"sources":["../src/pagination.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"pagination.js","names":[],"sources":["../src/pagination.ts"],"sourcesContent":["import type { PagePagination } from './types';\n\nexport function positiveInteger(value: number, name: string): number {\n if (!Number.isInteger(value) || value < 1) throw new RangeError(`${name} must be a positive integer`);\n\n return value;\n}\n\nexport function totalItems(value: number): number {\n if (!Number.isInteger(value) || value < 0) throw new RangeError('Source loader total must be a non-negative integer');\n\n return value;\n}\n\nexport function createPagePagination(index: number, size: number, total: number): PagePagination {\n const count = Math.max(1, Math.ceil(total / size));\n const safeIndex = Math.min(index, count);\n\n return {\n count,\n hasNext: safeIndex < count,\n hasPrevious: safeIndex > 1,\n index: safeIndex,\n kind: 'page',\n size,\n total,\n };\n}\n\nexport function sameQuery<T extends Record<string, unknown>>(left: T, right: T): boolean {\n const keys = new Set([...Object.keys(left), ...Object.keys(right)]);\n\n return [...keys].every((key) => Object.is(left[key], right[key]));\n}\n"],"mappings":";AAEA,SAAgB,EAAgB,GAAe,GAAsB;CACnE,IAAI,CAAC,OAAO,UAAU,CAAK,KAAK,IAAQ,GAAG,MAAU,WAAW,GAAG,EAAK,4BAA4B;CAEpG,OAAO;AACT;AAEA,SAAgB,EAAW,GAAuB;CAChD,IAAI,CAAC,OAAO,UAAU,CAAK,KAAK,IAAQ,GAAG,MAAU,WAAW,oDAAoD;CAEpH,OAAO;AACT;AAEA,SAAgB,EAAqB,GAAe,GAAc,GAA+B;CAC/F,IAAM,IAAQ,KAAK,IAAI,GAAG,KAAK,KAAK,IAAQ,CAAI,CAAC,GAC3C,IAAY,KAAK,IAAI,GAAO,CAAK;CAEvC,OAAO;EACL;EACA,SAAS,IAAY;EACrB,aAAa,IAAY;EACzB,OAAO;EACP,MAAM;EACN;EACA;CACF;AACF;AAEA,SAAgB,EAA6C,GAAS,GAAmB;CAGvF,OAAO,CAAC,mBAAG,IAFM,IAAI,CAAC,GAAG,OAAO,KAAK,CAAI,GAAG,GAAG,OAAO,KAAK,CAAK,CAAC,CAEtD,CAAI,CAAC,CAAC,OAAO,MAAQ,OAAO,GAAG,EAAK,IAAM,EAAM,EAAI,CAAC;AAClE"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(){let e,t=0;return{begin(){e?.abort();let n=new AbortController,r=++t;return e=n,{finish(){r===t&&(e=void 0)},isCurrent(){return r===t},signal:n.signal}},dispose(){e?.abort(),e=void 0,t++}}}function t(e){return e instanceof Error?e:Error(typeof e==`string`&&e.length>0?e:`Source request failed`)}exports.createRequestController=e,exports.toError=t;
|
|
2
|
+
//# sourceMappingURL=requestController.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestController.cjs","names":[],"sources":["../src/requestController.ts"],"sourcesContent":["export type RequestHandle = Readonly<{\n finish(): void;\n isCurrent(): boolean;\n signal: AbortSignal;\n}>;\n\nexport type RequestController = Readonly<{\n begin(): RequestHandle;\n dispose(): void;\n}>;\n\n/** A source owns one active request: newer query state always supersedes older work. */\nexport function createRequestController(): RequestController {\n let active: AbortController | undefined;\n let sequence = 0;\n\n return {\n begin() {\n active?.abort();\n\n const controller = new AbortController();\n const requestSequence = ++sequence;\n\n active = controller;\n\n return {\n finish() {\n if (requestSequence === sequence) active = undefined;\n },\n\n isCurrent() {\n return requestSequence === sequence;\n },\n\n signal: controller.signal,\n };\n },\n\n dispose() {\n active?.abort();\n active = undefined;\n sequence++;\n },\n };\n}\n\nexport function toError(reason: unknown): Error {\n if (reason instanceof Error) return reason;\n\n return new Error(typeof reason === 'string' && reason.length > 0 ? reason : 'Source request failed');\n}\n"],"mappings":"AAYA,SAAgB,GAA6C,CAC3D,IAAI,EACA,EAAW,EAEf,MAAO,CACL,OAAQ,CACN,GAAQ,MAAM,EAEd,IAAM,EAAa,IAAI,gBACjB,EAAkB,EAAE,EAI1B,MAFA,GAAS,EAEF,CACL,QAAS,CACH,IAAoB,IAAU,EAAS,IAAA,GAC7C,EAEA,WAAY,CACV,OAAO,IAAoB,CAC7B,EAEA,OAAQ,EAAW,MACrB,CACF,EAEA,SAAU,CACR,GAAQ,MAAM,EACd,EAAS,IAAA,GACT,GACF,CACF,CACF,CAEA,SAAgB,EAAQ,EAAwB,CAG9C,OAFI,aAAkB,MAAc,EAEzB,MAAM,OAAO,GAAW,UAAY,EAAO,OAAS,EAAI,EAAS,uBAAuB,CACrG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type RequestHandle = Readonly<{
|
|
2
|
+
finish(): void;
|
|
3
|
+
isCurrent(): boolean;
|
|
4
|
+
signal: AbortSignal;
|
|
5
|
+
}>;
|
|
6
|
+
export type RequestController = Readonly<{
|
|
7
|
+
begin(): RequestHandle;
|
|
8
|
+
dispose(): void;
|
|
9
|
+
}>;
|
|
10
|
+
/** A source owns one active request: newer query state always supersedes older work. */
|
|
11
|
+
export declare function createRequestController(): RequestController;
|
|
12
|
+
export declare function toError(reason: unknown): Error;
|
|
13
|
+
//# sourceMappingURL=requestController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestController.d.ts","sourceRoot":"","sources":["../src/requestController.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC;IACnC,MAAM,IAAI,IAAI,CAAC;IACf,SAAS,IAAI,OAAO,CAAC;IACrB,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,KAAK,IAAI,aAAa,CAAC;IACvB,OAAO,IAAI,IAAI,CAAC;CACjB,CAAC,CAAC;AAEH,wFAAwF;AACxF,wBAAgB,uBAAuB,IAAI,iBAAiB,CAgC3D;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK,CAI9C"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/requestController.ts
|
|
2
|
+
function e() {
|
|
3
|
+
let e, t = 0;
|
|
4
|
+
return {
|
|
5
|
+
begin() {
|
|
6
|
+
e?.abort();
|
|
7
|
+
let n = new AbortController(), r = ++t;
|
|
8
|
+
return e = n, {
|
|
9
|
+
finish() {
|
|
10
|
+
r === t && (e = void 0);
|
|
11
|
+
},
|
|
12
|
+
isCurrent() {
|
|
13
|
+
return r === t;
|
|
14
|
+
},
|
|
15
|
+
signal: n.signal
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
dispose() {
|
|
19
|
+
e?.abort(), e = void 0, t++;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function t(e) {
|
|
24
|
+
return e instanceof Error ? e : Error(typeof e == "string" && e.length > 0 ? e : "Source request failed");
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { e as createRequestController, t as toError };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=requestController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestController.js","names":[],"sources":["../src/requestController.ts"],"sourcesContent":["export type RequestHandle = Readonly<{\n finish(): void;\n isCurrent(): boolean;\n signal: AbortSignal;\n}>;\n\nexport type RequestController = Readonly<{\n begin(): RequestHandle;\n dispose(): void;\n}>;\n\n/** A source owns one active request: newer query state always supersedes older work. */\nexport function createRequestController(): RequestController {\n let active: AbortController | undefined;\n let sequence = 0;\n\n return {\n begin() {\n active?.abort();\n\n const controller = new AbortController();\n const requestSequence = ++sequence;\n\n active = controller;\n\n return {\n finish() {\n if (requestSequence === sequence) active = undefined;\n },\n\n isCurrent() {\n return requestSequence === sequence;\n },\n\n signal: controller.signal,\n };\n },\n\n dispose() {\n active?.abort();\n active = undefined;\n sequence++;\n },\n };\n}\n\nexport function toError(reason: unknown): Error {\n if (reason instanceof Error) return reason;\n\n return new Error(typeof reason === 'string' && reason.length > 0 ? reason : 'Source request failed');\n}\n"],"mappings":";AAYA,SAAgB,IAA6C;CAC3D,IAAI,GACA,IAAW;CAEf,OAAO;EACL,QAAQ;GACN,GAAQ,MAAM;GAEd,IAAM,IAAa,IAAI,gBAAgB,GACjC,IAAkB,EAAE;GAI1B,OAFA,IAAS,GAEF;IACL,SAAS;KACP,AAAI,MAAoB,MAAU,IAAS,KAAA;IAC7C;IAEA,YAAY;KACV,OAAO,MAAoB;IAC7B;IAEA,QAAQ,EAAW;GACrB;EACF;EAEA,UAAU;GAGR,AAFA,GAAQ,MAAM,GACd,IAAS,KAAA,GACT;EACF;CACF;AACF;AAEA,SAAgB,EAAQ,GAAwB;CAG9C,OAFI,aAAkB,QAAc,IAEzB,MAAM,OAAO,KAAW,YAAY,EAAO,SAAS,IAAI,IAAS,uBAAuB;AACrG"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e){let t=new AbortController,n=new Set,r=!1,i=e,a=()=>{r||(r=!0,n.clear(),t.abort())};return{get disposalSignal(){return t.signal},dispose:a,get disposed(){return r},set(e){if(!r){i=e;for(let e of n)try{e(i)}catch(e){queueMicrotask(()=>{throw e})}}},subscribe(e){return r?()=>{}:(n.add(e),()=>n.delete(e))},[Symbol.dispose]:a,get value(){return i}}}exports.createSourceStore=e;
|
|
2
|
+
//# sourceMappingURL=sourceStore.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceStore.cjs","names":[],"sources":["../src/sourceStore.ts"],"sourcesContent":["import type { Disposable } from './types';\n\ntype SourceStore<T> = Disposable & {\n set(value: T): void;\n subscribe(listener: (value: T) => void): () => void;\n readonly value: T;\n};\n\n/** Store commits source state before notifying; observer failures cannot rewrite committed state. */\nexport function createSourceStore<T>(initialValue: T): SourceStore<T> {\n const controller = new AbortController();\n const listeners = new Set<(value: T) => void>();\n let disposed = false;\n let value = initialValue;\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n listeners.clear();\n controller.abort();\n };\n\n return {\n get disposalSignal() {\n return controller.signal;\n },\n\n dispose,\n\n get disposed() {\n return disposed;\n },\n\n set(nextValue) {\n if (disposed) return;\n\n value = nextValue;\n\n for (const listener of listeners) {\n try {\n listener(value);\n } catch (error) {\n queueMicrotask(() => {\n throw error;\n });\n }\n }\n },\n\n subscribe(listener) {\n if (disposed) return () => {};\n\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n },\n\n [Symbol.dispose]: dispose,\n\n get value() {\n return value;\n },\n };\n}\n"],"mappings":"AASA,SAAgB,EAAqB,EAAiC,CACpE,IAAM,EAAa,IAAI,gBACjB,EAAY,IAAI,IAClB,EAAW,GACX,EAAQ,EAEN,MAAsB,CACtB,IAEJ,EAAW,GACX,EAAU,MAAM,EAChB,EAAW,MAAM,EACnB,EAEA,MAAO,CACL,IAAI,gBAAiB,CACnB,OAAO,EAAW,MACpB,EAEA,UAEA,IAAI,UAAW,CACb,OAAO,CACT,EAEA,IAAI,EAAW,CACT,MAEJ,GAAQ,EAER,IAAK,IAAM,KAAY,EACrB,GAAI,CACF,EAAS,CAAK,CAChB,OAAS,EAAO,CACd,mBAAqB,CACnB,MAAM,CACR,CAAC,CACH,CATM,CAWV,EAEA,UAAU,EAAU,CAKlB,OAJI,MAAuB,CAAC,GAE5B,EAAU,IAAI,CAAQ,MAET,EAAU,OAAO,CAAQ,EACxC,GAEC,OAAO,SAAU,EAElB,IAAI,OAAQ,CACV,OAAO,CACT,CACF,CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Disposable } from './types';
|
|
2
|
+
type SourceStore<T> = Disposable & {
|
|
3
|
+
set(value: T): void;
|
|
4
|
+
subscribe(listener: (value: T) => void): () => void;
|
|
5
|
+
readonly value: T;
|
|
6
|
+
};
|
|
7
|
+
/** Store commits source state before notifying; observer failures cannot rewrite committed state. */
|
|
8
|
+
export declare function createSourceStore<T>(initialValue: T): SourceStore<T>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=sourceStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceStore.d.ts","sourceRoot":"","sources":["../src/sourceStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,KAAK,WAAW,CAAC,CAAC,IAAI,UAAU,GAAG;IACjC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACpB,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACpD,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CACnB,CAAC;AAEF,qGAAqG;AACrG,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAuDpE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
//#region src/sourceStore.ts
|
|
2
|
+
function e(e) {
|
|
3
|
+
let t = new AbortController(), n = /* @__PURE__ */ new Set(), r = !1, i = e, a = () => {
|
|
4
|
+
r || (r = !0, n.clear(), t.abort());
|
|
5
|
+
};
|
|
6
|
+
return {
|
|
7
|
+
get disposalSignal() {
|
|
8
|
+
return t.signal;
|
|
9
|
+
},
|
|
10
|
+
dispose: a,
|
|
11
|
+
get disposed() {
|
|
12
|
+
return r;
|
|
13
|
+
},
|
|
14
|
+
set(e) {
|
|
15
|
+
if (!r) {
|
|
16
|
+
i = e;
|
|
17
|
+
for (let e of n) try {
|
|
18
|
+
e(i);
|
|
19
|
+
} catch (e) {
|
|
20
|
+
queueMicrotask(() => {
|
|
21
|
+
throw e;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
subscribe(e) {
|
|
27
|
+
return r ? () => {} : (n.add(e), () => n.delete(e));
|
|
28
|
+
},
|
|
29
|
+
[Symbol.dispose]: a,
|
|
30
|
+
get value() {
|
|
31
|
+
return i;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
export { e as createSourceStore };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=sourceStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceStore.js","names":[],"sources":["../src/sourceStore.ts"],"sourcesContent":["import type { Disposable } from './types';\n\ntype SourceStore<T> = Disposable & {\n set(value: T): void;\n subscribe(listener: (value: T) => void): () => void;\n readonly value: T;\n};\n\n/** Store commits source state before notifying; observer failures cannot rewrite committed state. */\nexport function createSourceStore<T>(initialValue: T): SourceStore<T> {\n const controller = new AbortController();\n const listeners = new Set<(value: T) => void>();\n let disposed = false;\n let value = initialValue;\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n listeners.clear();\n controller.abort();\n };\n\n return {\n get disposalSignal() {\n return controller.signal;\n },\n\n dispose,\n\n get disposed() {\n return disposed;\n },\n\n set(nextValue) {\n if (disposed) return;\n\n value = nextValue;\n\n for (const listener of listeners) {\n try {\n listener(value);\n } catch (error) {\n queueMicrotask(() => {\n throw error;\n });\n }\n }\n },\n\n subscribe(listener) {\n if (disposed) return () => {};\n\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n },\n\n [Symbol.dispose]: dispose,\n\n get value() {\n return value;\n },\n };\n}\n"],"mappings":";AASA,SAAgB,EAAqB,GAAiC;CACpE,IAAM,IAAa,IAAI,gBAAgB,GACjC,oBAAY,IAAI,IAAwB,GAC1C,IAAW,IACX,IAAQ,GAEN,UAAsB;EACtB,MAEJ,IAAW,IACX,EAAU,MAAM,GAChB,EAAW,MAAM;CACnB;CAEA,OAAO;EACL,IAAI,iBAAiB;GACnB,OAAO,EAAW;EACpB;EAEA;EAEA,IAAI,WAAW;GACb,OAAO;EACT;EAEA,IAAI,GAAW;GACT,QAEJ;QAAQ;IAER,KAAK,IAAM,KAAY,GACrB,IAAI;KACF,EAAS,CAAK;IAChB,SAAS,GAAO;KACd,qBAAqB;MACnB,MAAM;KACR,CAAC;IACH;GATM;EAWV;EAEA,UAAU,GAAU;GAKlB,OAJI,UAAuB,CAAC,KAE5B,EAAU,IAAI,CAAQ,SAET,EAAU,OAAO,CAAQ;EACxC;GAEC,OAAO,UAAU;EAElB,IAAI,QAAQ;GACV,OAAO;EACT;CACF;AACF"}
|
package/dist/sourcerer.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@vielzeug/arsenal");var t=!globalThis.__SOURCERER_PROD__;function n(e){t&&console.warn(`[@vielzeug/sourcerer] ${e}`)}function r(e){t&&e()}var i=e.hash,a=e=>e instanceof Error?e.message:typeof e==`string`&&e.length>0?e:`Request failed`,o=t=>(0,e.backoff)(t);function s(e,t=200){return e.replace(/\p{C}/gu,`?`).slice(0,t)}var c=new Set;function l(e,t,i){let a=Number.isFinite(e)?Math.max(1,Math.trunc(e)):1;if(!Number.isFinite(e)||e<1){let o=`${t}:${i}`;c.has(o)||(c.add(o),r(()=>n(`${t}: ${i} ${e} is invalid — clamped to ${a}. Must be a positive integer.`)))}return a}var u=class e extends Error{#e;constructor(e,t={}){super(e,t.cause===void 0?void 0:{cause:t.cause}),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype),this.#e=t}get attempt(){return this.#e.attempt??0}get context(){return this.#e.context}static is(t){return t instanceof e}},d=class extends u{timeoutMs;constructor(e){super(`Source.ready() timed out after ${e}ms`),this.timeoutMs=e}},f=class extends u{constructor(){super(`Source disposed while waiting for ready()`)}},p=e=>{let t={...e.search&&{search:e.search},limit:String(e.limit),page:String(e.page)},n=e;return n.filter!==void 0&&(t.filter=JSON.stringify(n.filter)),n.sort!==void 0&&(t.sort=JSON.stringify(n.sort)),t},m=(e,t={})=>{let i=e instanceof URLSearchParams?Object.fromEntries(e.entries()):e,{defaultLimit:a=20,strict:o=!1}=t,c=(e,t,i)=>{if(t===void 0)return i;let a=Array.isArray(t)?t[0]:t,o=Number(a);return Number.isInteger(o)&&o>0?o:(r(()=>n(`decodeQuery: ${e} "${s(a,80)}" is not a positive integer — using ${i}.`)),i)},l=(e,t)=>{if(t===void 0)return;let n=Array.isArray(t)?t[0]:t;try{return JSON.parse(n)}catch{if(o)throw new u(`Invalid query param "${e}": ${s(n,80)}`);return}},d=i.limit,f=i.page,p=i.search,m=i.filter,h=i.sort,g=m===void 0?void 0:l(`filter`,m),_=h===void 0?void 0:l(`sort`,h);return{...g!==void 0&&{filter:g},..._!==void 0&&{sort:_},...p!==void 0&&{search:Array.isArray(p)?p[0]:p},limit:c(`limit`,d,a),page:c(`page`,f,1)}};function h(e,t){let n=null,r=()=>{n&&=(n(),null)};return{cancel(){e.cancelTimer(),r()},dispose(){r()},schedule(i,a){r();let o=new Promise(e=>{n=e});return e.schedule(i,a),t(),o},settleIfIdle(e){e===0&&r()}}}function g(e){let t=new Set,n=new Set,r=new AbortController,i,a=!1;return{cancelTimer(){i&&=(clearTimeout(i),void 0)},get disposalSignal(){return r.signal},dispose(){i&&=(clearTimeout(i),void 0);for(let e of n)e.timeoutId!==void 0&&clearTimeout(e.timeoutId),e.reject(new f);n.clear(),t.clear(),a=!0,r.abort()},flush(e){return i?(clearTimeout(i),i=void 0,e()):Promise.resolve()},get isDisposed(){return a},get isScheduled(){return i!==void 0},notify(r){if(!a){(r??e?.onBeforeNotify)?.();for(let e of t)e();for(let e of n)e.check()}},ready(e,t){return a?Promise.reject(new f):e()?Promise.resolve():new Promise((r,i)=>{let a={check:()=>{e()&&(a.timeoutId!==void 0&&clearTimeout(a.timeoutId),n.delete(a),r())},reject:i};t!==void 0&&(a.timeoutId=setTimeout(()=>{n.delete(a),i(new d(t))},t)),n.add(a)})},schedule(e,t){a||(i&&clearTimeout(i),i=setTimeout(()=>{i=void 0,e()},t))},subscribe(e){return a?()=>{}:(t.add(e),()=>t.delete(e))}}}function _(e){let t=new Map,n=``,r=0;return{dispose(){for(let e of t.values())e.controller.abort();t.clear(),r=0},get pendingCount(){return r},async run(i,a,o){let s=e(i);n=s;for(let[e,n]of t)e!==s&&(n.controller.abort(),t.delete(e));let c=t.get(s);if(c){r++,o();try{await c.promise}finally{r--,o()}return}let l=new AbortController;r++,o();let u=a(i,l.signal,()=>s===n).finally(()=>{t.delete(s),r--,o()});t.set(s,{controller:l,promise:u}),await u}}}function v(e,t=i,n){let r=g({onBeforeNotify:n}),a=_(t),s=e.debounceMs??300,c=e.retry?.attempts??0,l=e.retry?.delay??o,u=e.autoFetch!==!1,d,f=()=>{r.isDisposed||(d!==void 0&&(clearInterval(d),d=void 0),a.dispose(),r.dispose())};return{autoFetch:u,core:r,debounceMs:s,get disposalSignal(){return r.disposalSignal},dispose:f,get disposed(){return r.isDisposed},fetch(e,t,n){return a.run(e,t,n)},pendingCount:()=>a.pendingCount,ready(e){return r.ready(()=>a.pendingCount===0&&!r.isScheduled,e)},retryAttempts:c,retryDelay:l,startRefreshInterval(t){e.refreshInterval!==void 0&&e.refreshInterval>0&&(d=setInterval(()=>{r.isDisposed||t()},e.refreshInterval))},[Symbol.dispose]:f}}function y(t){let n=t.queryKey??i,r=l(t.limit??20,`createCursorSource`,`limit`),o=``,s,c,d,f,p=[],m=0,g=null,_=[],y={error:null,hasNextPage:!1,hasPrevPage:!1,isLoading:!1,isSearchPending:!1,pageSize:r,totalItems:0},b=()=>{_=p,y={error:g,hasNextPage:d!==void 0,hasPrevPage:f!==void 0,isLoading:x.pendingCount()>0,isSearchPending:x.core.isScheduled,pageSize:r,totalItems:m}},x=v(t,n,b),{autoFetch:S,debounceMs:C,retryAttempts:w,retryDelay:T}=x;b();let E=()=>{x.disposed||x.core.notify()},D=h(x.core,E),O=()=>({...s!==void 0&&{after:s},...c!==void 0&&{before:c},...o&&{search:o},limit:r}),k=n=>(g=null,x.fetch(n,async(n,r,i)=>{let o=Date.now();try{let a=await(0,e.retry)(e=>t.fetch(n,e),{delay:T,signal:r,times:w+1});i()&&(p=a.items,m=a.total??a.items.length,d=a.nextCursor,f=a.prevCursor,g=null,t.onFetch?.({durationMs:Date.now()-o,query:n,status:`success`}))}catch(e){if(r.aborted)return;i()&&(p=[],m=0,d=void 0,f=void 0,g=new u(a(e),{cause:e,context:{kind:`cursor`,limit:n.limit,...n.search&&{search:n.search}}}),t.onFetch?.({durationMs:Date.now()-o,error:g,query:n,status:`error`}))}},()=>{E(),D.settleIfIdle(x.pendingCount())})),A=()=>k(O());return S&&A(),x.startRefreshInterval(()=>void A()),{get current(){return _},get disposalSignal(){return x.disposalSignal},dispose:()=>{D.cancel(),D.dispose(),x.dispose()},get disposed(){return x.disposed},get meta(){return y},next(){return d?(s=d,c=void 0,A()):Promise.resolve()},patch(e){let t=!1;if(e.limit!==void 0){let n=l(e.limit,`source.patch`,`limit`);n!==r&&(r=n,s=void 0,c=void 0,t=!0)}return`search`in e&&(e.search!==o||x.core.isScheduled)&&(o=e.search??``,s=void 0,c=void 0,t=!0),t?(D.cancel(),A()):Promise.resolve()},prev(){return f?(c=f,s=void 0,A()):Promise.resolve()},get query(){return{...s!==void 0&&{after:s},...c!==void 0&&{before:c},...o&&{search:o},limit:r}},ready(e){return x.ready(e)},refresh(){return A()},reset(){return D.cancel(),o=``,s=void 0,c=void 0,A()},search(e,t){return t?.immediate?e===o&&!x.core.isScheduled?Promise.resolve():(D.cancel(),o=e,s=void 0,c=void 0,A()):e===o?Promise.resolve():(o=e,s=void 0,c=void 0,D.schedule(()=>void A(),C))},subscribe:e=>x.core.subscribe(e),[Symbol.dispose]:()=>{D.cancel(),D.dispose(),x.dispose()}}}function b(e,t){let n=g(),r=[],i=()=>{r=t(e.current)};i();let a=e.subscribe(()=>{i(),n.notify()}),o={get current(){return r},get disposalSignal(){return n.disposalSignal},dispose(){n.isDisposed||(a(),n.dispose())},get disposed(){return n.isDisposed},get meta(){return e.meta},subscribe(e){return n.subscribe(e)},[Symbol.dispose](){o.dispose()}};return e.disposalSignal instanceof AbortSignal&&e.disposalSignal.addEventListener(`abort`,()=>o.dispose(),{once:!0}),o}function x(t){let n=t.queryKey??i,r=l(t.limit??20,`createInfiniteSource`,`limit`),o=``,s=1,c=0,d=[],f=0,p=null,m=!1,g=[],_={error:null,hasMore:!1,isLoading:!1,isLoadingMore:!1,isSearchPending:!1,loadedPages:0,pageSize:r,totalItems:0},y=()=>{g=d,_={error:p,hasMore:d.length<f,isLoading:b.pendingCount()>0&&!m,isLoadingMore:m,isSearchPending:b.core.isScheduled,loadedPages:c,pageSize:r,totalItems:f}},b=v(t,n,y),{autoFetch:x,debounceMs:S,retryAttempts:C,retryDelay:w}=b;y();let T=()=>{b.disposed||b.core.notify()},E=h(b.core,T),D=(n,i)=>{let l={...o&&{search:o},limit:r,page:n};return p=null,b.fetch(l,async(r,o,l)=>{let h=Date.now();try{let a=await(0,e.retry)(e=>t.fetch(r,e),{delay:w,signal:o,times:C+1});l()&&(d=i?[...d,...a.items]:a.items,f=a.total,s=n,c=i?c+1:1,p=null,t.onFetch?.({durationMs:Date.now()-h,query:r,status:`success`}))}catch(e){if(o.aborted)return;l()&&(i||(d=[]),f=i?f:0,p=new u(a(e),{cause:e,context:{kind:`infinite`,limit:r.limit,page:r.page,...r.search&&{search:r.search}}}),t.onFetch?.({durationMs:Date.now()-h,error:p,query:r,status:`error`}))}finally{m=!1}},()=>{T(),E.settleIfIdle(b.pendingCount())})},O=()=>D(1,!1);return x&&O(),b.startRefreshInterval(()=>void O()),{get current(){return g},get disposalSignal(){return b.disposalSignal},dispose:()=>{E.cancel(),E.dispose(),b.dispose()},get disposed(){return b.disposed},loadMore(){return!_.hasMore||b.pendingCount()>0||m?Promise.resolve():(m=!0,y(),D(s+1,!0))},get meta(){return _},patch(e){let t=!1;if(e.limit!==void 0){let n=l(e.limit,`source.patch`,`limit`);n!==r&&(r=n,t=!0)}return`search`in e&&(e.search!==o||b.core.isScheduled)&&(o=e.search??``,t=!0),t?(E.cancel(),d=[],f=0,s=1,c=0,O()):Promise.resolve()},get query(){return{...o&&{search:o},limit:r,page:s}},ready(e){return b.ready(e)},reset(){return E.cancel(),s=1,c=0,d=[],f=0,o=``,O()},search(e,t){return t?.immediate?e===o&&!b.core.isScheduled?Promise.resolve():(E.cancel(),o=e,d=[],f=0,c=0,s=1,O()):e===o?Promise.resolve():(o=e,d=[],f=0,c=0,s=1,E.schedule(()=>void O(),S))},subscribe:e=>b.core.subscribe(e),[Symbol.dispose]:()=>{E.cancel(),E.dispose(),b.dispose()}}}var S=(e,t)=>{let n=Math.trunc(e);return Number.isFinite(n)?Math.max(t,n):t},C=(e,t)=>{let n=S(e,0),r=S(t,1);return Math.max(1,Math.ceil(n/r))},w=(e,t)=>Math.max(1,Math.min(S(e,1),Math.max(1,t))),T=e=>{let t=S(e.pageSize,1),n=S(e.totalItems,0),r=C(n,t),i=w(e.pageNumber,r);return{error:e.error,isLoading:e.isLoading,isSearchPending:e.isSearchPending,pageCount:r,pageNumber:i,pageSize:t,totalItems:n}};function E(e){if(e.totalItems===0)return{end:0,start:0};let t=(e.pageNumber-1)*e.pageSize+1;return{end:Math.min(e.pageNumber*e.pageSize,e.totalItems),start:t}}var D=20,O=300;function k(e,t){let n=t.toLowerCase();return e.filter(e=>JSON.stringify(e).toLowerCase().includes(n))}function A(e,t={}){let n=g(),r=t.filterAsync!==void 0||t.sortAsync!==void 0,i=t.debounceMs??O,o=t.initialData??e,s=``,c=t.filter,d=t.sort,f=l(t.limit??D,`createLocalSource`,`limit`),p=1,m=[],_=!1,v=!1,y=null,b=null,x=()=>n.notify(),S=h(n,x),E=()=>{let e=o;return s&&(e=(t.searchFn??k)(e,s)),c&&(e=e.filter(c)),d&&(e=[...e].sort(d)),e},A=()=>{m=E();let e=C(m.length,f);p=w(p,e)},j=async()=>{b?.abort();let e=new AbortController;b=e,_=!0,y=null,x();try{let n=o;if(s&&(n=(t.searchFn??k)(n,s)),c&&(n=n.filter(c)),t.filterAsync&&!e.signal.aborted&&(n=await t.filterAsync(n,e.signal)),d&&(n=[...n].sort(d)),t.sortAsync&&!e.signal.aborted&&(n=await t.sortAsync(n,e.signal)),e.signal.aborted)return;m=n,_=!1,v=!1;let r=C(m.length,f);p=w(p,r)}catch(t){e.signal.aborted||(_=!1,v=!1,y=new u(a(t),{cause:t}))}finally{b===e&&(b=null)}x(),S.settleIfIdle(0)},M=()=>r?j():(v=!1,A(),x(),S.settleIfIdle(0),Promise.resolve());r?(m=E(),j()):A();let N={get current(){let e=(p-1)*f;return m.slice(e,e+f)},get disposalSignal(){return n.disposalSignal},dispose(){n.isDisposed||(b?.abort(),b=null,S.cancel(),S.dispose(),n.dispose())},get disposed(){return n.isDisposed},goTo(e){let t=w(e,C(m.length,f));return t===p?Promise.resolve():(p=t,x(),Promise.resolve())},goToLast(){return N.goTo(C(m.length,f))},get meta(){return T({error:y,isLoading:_,isSearchPending:v,pageNumber:p,pageSize:f,totalItems:m.length})},next(){return N.goTo(p+1)},patch(e){let t=!1;if(e.limit!==void 0){let n=l(e.limit,`source.patch`,`limit`);n!==f&&(f=n,t=!0)}if(`filter`in e&&(c=e.filter,t=!0),`sort`in e&&(d=e.sort,t=!0),`search`in e&&(e.search!==s||n.isScheduled)&&(s=e.search??``,t=!0),e.page!==void 0){let n=w(e.page,C(m.length,f));n!==p&&(p=n,t=!0)}return t?(S.cancel(),(e.limit!==void 0||`filter`in e||`sort`in e||`search`in e)&&e.page===void 0&&(p=1),M()):Promise.resolve()},prev(){return N.goTo(p-1)},get query(){return{limit:f,page:p,...s&&{search:s}}},ready(e){return n.ready(()=>!_&&!n.isScheduled,e)},reset(){return S.cancel(),v=!1,s=``,c=t.filter,d=t.sort,p=1,M()},search(e,t){return t?.immediate?e===s&&!n.isScheduled?Promise.resolve():(S.cancel(),v=!1,s=e,p=1,M()):e===s?Promise.resolve():(s=e,p=1,v=!0,S.schedule(()=>{v=!1,M()},i))},setData(e){return o=e,p=1,M()},subscribe(e){return n.subscribe(e)},[Symbol.dispose](){N.dispose()}};return N}function j(e,t){let n=g(),r=t(e.map(e=>e.current)),i=e.map(i=>i.subscribe(()=>{r=t(e.map(e=>e.current)),n.notify()})),a={get current(){return r},get disposalSignal(){return n.disposalSignal},dispose(){if(!n.isDisposed){for(let e of i)e();n.dispose()}},get disposed(){return n.isDisposed},subscribe(e){return n.subscribe(e)},[Symbol.dispose](){a.dispose()}},o=e.map(e=>e.disposalSignal).filter(e=>e instanceof AbortSignal);if(o.length===e.length&&o.length>0){let e=o.filter(e=>!e.aborted).length;if(e===0)a.dispose();else for(let t of o)t.aborted||t.addEventListener(`abort`,()=>{e--,e===0&&a.dispose()},{once:!0})}return a}function M(t){let n=t.queryKey??i,r=t.staleTime??0,o=l(t.limit??20,`createRemoteSource`,`limit`),s=1,c=``,d=t.filter,f=t.sort,p=[],m=0,g=null,_=0,y=``,b=null;t.snapshot&&(p=t.snapshot.items,m=t.snapshot.total,t.snapshot.page!==void 0&&(s=t.snapshot.page),t.snapshot.search&&(c=t.snapshot.search),_=Date.now());let x=[],S=T({error:null,isLoading:!1,isSearchPending:!1,pageNumber:1,pageSize:o,totalItems:0}),E=()=>{let e=C(m,o),t=w(s,e);x=p,S=T({error:g,isLoading:D.pendingCount()>0,isSearchPending:D.core.isScheduled,pageNumber:t,pageSize:o,totalItems:m})},D=v(t,n,E),{autoFetch:O,debounceMs:k,retryAttempts:A,retryDelay:j}=D;E();let M=()=>{D.disposed||D.core.notify()},N=h(D.core,M),P=e=>{b?.active&&(b.active=!1,b=null),p=e.items,m=e.total,s=w(s,C(m,o))},F=()=>({...d!==void 0&&{filter:d},...f!==void 0&&{sort:f},...c&&{search:c},limit:o,page:s}),I=i=>{let o=n(i);return r>0&&o===y&&m>0&&Date.now()-_<r&&!b?.active?Promise.resolve():(g=null,D.fetch(i,async(n,r,i)=>{let s=Date.now();try{let a=await(0,e.retry)(e=>t.fetch(n,e),{delay:j,signal:r,times:A+1});i()&&(P(a),g=null,y=o,_=Date.now(),t.onFetch?.({durationMs:Date.now()-s,query:n,status:`success`}))}catch(e){if(r.aborted)return;i()&&(b?.active?(b.active=!1,p=b.prevItems,m=b.prevTotal,b=null):(p=[],m=0),g=new u(a(e),{cause:e,context:{kind:`remote`,limit:n.limit,page:n.page,...n.search&&{search:n.search}}}),t.onFetch?.({durationMs:Date.now()-s,error:g,query:n,status:`error`}))}},()=>{M(),N.settleIfIdle(D.pendingCount())}))},L=()=>I(F());return O&&L(),D.startRefreshInterval(()=>void L()),{get current(){return x},get disposalSignal(){return D.disposalSignal},dispose:()=>{N.cancel(),N.dispose(),D.dispose()},get disposed(){return D.disposed},goTo(e){let t=m>0?w(e,C(m,o)):l(e,`source.goTo`,`target`);return t===s?Promise.resolve():(s=t,L())},goToLast(){let e=C(m,o);return s===e?Promise.resolve():(s=e,L())},get meta(){return S},next(){let e=C(m,o);return s>=e?Promise.resolve():(s++,L())},optimisticUpdate(e,t){if(b?.active)throw new u(`An optimistic update is already active. Rollback the previous update before starting another.`);let n=p,r=m;b={active:!0,prevItems:n,prevTotal:r};try{p=e(p)}catch(e){throw b=null,e}return m=t?.total??m,M(),()=>{b?.active&&(b.active=!1,p=n,m=r,b=null,M())}},patch(e){let t=!1;if(e.limit!==void 0){let n=l(e.limit,`source.patch`,`limit`);n!==o&&(o=n,t=!0)}if(`filter`in e&&(d=e.filter,t=!0),`sort`in e&&(f=e.sort,t=!0),`search`in e&&(e.search!==c||D.core.isScheduled)&&(c=e.search??``,t=!0),e.page!==void 0){let n=m>0?w(e.page,C(m,o)):l(e.page,`source.patch`,`page`);n!==s&&(s=n,t=!0)}return t?(N.cancel(),(e.limit!==void 0||`filter`in e||`sort`in e||`search`in e)&&e.page===void 0&&(s=1),L()):Promise.resolve()},prev(){return s<=1?Promise.resolve():(s--,L())},get query(){return{...d!==void 0&&{filter:d},...f!==void 0&&{sort:f},...c&&{search:c},limit:o,page:s}},ready(e){return D.ready(e)},refresh(){return L()},reset(){return N.cancel(),c=``,s=1,d=t.filter,f=t.sort,L()},search(e,t){return t?.immediate?e===c&&!D.core.isScheduled?Promise.resolve():(N.cancel(),c=e,s=1,L()):e===c?Promise.resolve():(c=e,s=1,N.schedule(()=>void L(),k))},subscribe:e=>D.core.subscribe(e),[Symbol.dispose]:()=>{N.cancel(),N.dispose(),D.dispose()}}}var N=e=>{let t=e.query;return{items:e.current,...t.search&&{search:t.search},page:e.meta.pageNumber,total:e.meta.totalItems}};async function P(e){let t=M({...e,autoFetch:!1});try{if(await t.refresh(),t.meta.error)throw t.meta.error;return N(t)}finally{t.dispose()}}async function F(e){let t=M({...e,autoFetch:!1});if(await t.refresh(),t.meta.error)throw t.dispose(),t.meta.error;return{snapshot:N(t),source:t}}var I=e=>{if(e==null)return``;if(typeof e==`bigint`||typeof e==`boolean`||typeof e==`number`||typeof e==`string`)return String(e);if(e instanceof Date)return e.toISOString();try{return JSON.stringify(e)??``}catch{return String(e)}},L=(e,t,n=!1)=>{let r=n?t:t.toLowerCase();return t=>{let i=e(t)??``;return(n?i:i.toLowerCase()).includes(r)}},R=(e,t)=>n=>Object.is(e(n),t),z=(e,t)=>{let n=e=>e instanceof Date?e.getTime():e,r=t.min===void 0?void 0:n(t.min),i=t.max===void 0?void 0:n(t.max);return t=>{let a=n(e(t));return!(r!==void 0&&a<r||i!==void 0&&a>i)}},B=(e,t=`asc`)=>{let n=t===`asc`?1:-1;return(t,r)=>{let i=e(t),a=e(r);return i instanceof Date&&a instanceof Date?(i.getTime()-a.getTime())*n:i<a?-1*n:i>a?1*n:0}},V=(e,t={})=>{let n=Array.isArray(e)?e:[e],r=t.caseSensitive===!0;return(e,t)=>{if(t.length===0)return e;let i=r?t:t.toLowerCase();return e.filter(e=>n.some(t=>{let n=I(t(e));return(r?n:n.toLowerCase()).includes(i)}))}};function H(e){return e.meta.isLoading||e.meta.isSearchPending?{status:`loading`}:e.meta.error?{error:e.meta.error,status:`error`}:{items:e.current,status:`success`}}exports.SourcererDisposedError=f,exports.SourcererError=u,exports.SourcererTimeoutError=d,exports.createCursorSource=y,exports.createInfiniteSource=x,exports.createLocalSource=A,exports.createRemoteSource=M,exports.decodeQuery=m,exports.deriveSource=b,exports.encodeQuery=p,exports.filterContains=L,exports.filterEquals=R,exports.filterRange=z,exports.itemRange=E,exports.mergeSource=j,exports.prefetchSource=P,exports.prefetchSourceAndKeep=F,exports.searchBy=V,exports.sortBy=B,exports.sourceState=H;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function e(){let e,t=0;return{begin(){e?.abort();let n=new AbortController,r=++t;return e=n,{finish(){r===t&&(e=void 0)},isCurrent(){return r===t},signal:n.signal}},dispose(){e?.abort(),e=void 0,t++}}}function t(e){return e instanceof Error?e:Error(typeof e==`string`&&e.length>0?e:`Source request failed`)}function n(e){let t=new AbortController,n=new Set,r=!1,i=e,a=()=>{r||(r=!0,n.clear(),t.abort())};return{get disposalSignal(){return t.signal},dispose:a,get disposed(){return r},set(e){if(!r){i=e;for(let e of n)try{e(i)}catch(e){queueMicrotask(()=>{throw e})}}},subscribe(e){return r?()=>{}:(n.add(e),()=>n.delete(e))},[Symbol.dispose]:a,get value(){return i}}}function r(r){let i=n(r),a=e();return{get disposalSignal(){return i.disposalSignal},dispose(){a.dispose(),i.dispose()},get disposed(){return i.disposed},async fetch(e){if(i.disposed)return;let n=a.begin(),r=i.value;i.set(e.pending(r));let o;try{o=e.success(await e.load(n.signal))}catch(a){if(!n.isCurrent()||i.disposed)return;let o=t(a);throw i.set(e.failure(r,o)),o}finally{n.finish()}!n.isCurrent()||i.disposed||i.set(o)},get snapshot(){return i.value},subscribe:i.subscribe}}function i(e,t){if(!Number.isInteger(e)||e<1)throw RangeError(`${t} must be a positive integer`);return e}function a(e){if(!Number.isInteger(e)||e<0)throw RangeError(`Source loader total must be a non-negative integer`);return e}function o(e,t,n){let r=Math.max(1,Math.ceil(n/t)),i=Math.min(e,r);return{count:r,hasNext:i<r,hasPrevious:i>1,index:i,kind:`page`,size:t,total:n}}function s(e,t){return[...new Set([...Object.keys(e),...Object.keys(t)])].every(n=>Object.is(e[n],t[n]))}var c=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:a(e.total)}}),l=(e,t={})=>{if(t.after!==void 0&&t.before!==void 0)throw RangeError(`Cursor query cannot include both after and before`);let n=t.pageSize!==void 0||t.search!==void 0,r=n||`before`in t?void 0:`after`in t?t.after:e.after,a=n||`after`in t?void 0:`before`in t?t.before:e.before;return{...r!==void 0&&{after:r},...a!==void 0&&{before:a},pageSize:i(t.pageSize??e.pageSize,`pageSize`),search:t.search??e.search}};function u(e){let t=l({pageSize:20,search:``},e.initialQuery),n=r({data:[],error:null,isFetching:!1,pagination:c(),query:t}),i=t=>n.fetch({failure:(e,t)=>({...e,error:t,isFetching:!1,pendingQuery:void 0}),load:n=>e.load({query:t,signal:n}),pending:e=>({...e,error:null,isFetching:!0,pendingQuery:t}),success:e=>({data:e.data,error:null,isFetching:!1,pagination:c(e),query:t})}),a=()=>i(t),o=async e=>{let r=l(n.snapshot.pendingQuery??n.snapshot.query,e);s(r,t)||(t=r,await i(r))},u={get disposalSignal(){return n.disposalSignal},dispose:n.dispose,get disposed(){return n.disposed},page:{next(){let e=n.snapshot.pagination.nextCursor;return n.snapshot.isFetching||e===void 0?Promise.resolve():o({after:e})},previous(){let e=n.snapshot.pagination.previousCursor;return n.snapshot.isFetching||e===void 0?Promise.resolve():o({before:e})}},reload:a,setQuery:o,get snapshot(){return n.snapshot},subscribe:n.subscribe,[Symbol.dispose](){u.dispose()}};return e.autoStart!==!1&&a().catch(()=>void 0),u}var d=(e,t,n)=>({hasMore:e<t,isLoadingMore:n,kind:`infinite`,loaded:e,total:t}),f=(e,t={})=>({pageSize:i(t.pageSize??e.pageSize,`pageSize`),search:t.search??e.search});function p(e){let t=f({pageSize:20,search:``},e.initialQuery),n=1,i=r({data:[],error:null,isFetching:!1,pagination:d(0,0,!1),query:t}),o=(t,r,o)=>{let s=i.snapshot.data;return i.fetch({failure:(e,t)=>({...e,error:t,isFetching:!1,pendingQuery:void 0}),load:n=>e.load({query:{...t,page:r,pageSize:t.pageSize},signal:n}),pending:e=>({...e,error:null,isFetching:!0,pagination:d(e.data.length,e.pagination.total,o),pendingQuery:t}),success:e=>{let i=a(e.total),c=o?[...s,...e.data]:e.data;return n=r+1,{data:c,error:null,isFetching:!1,pagination:d(c.length,i,!1),query:t}}})},c=()=>(n=1,o(t,1,!1)),l={get disposalSignal(){return i.disposalSignal},dispose:i.dispose,get disposed(){return i.disposed},loadMore(){let{isFetching:e,pagination:r}=i.snapshot;return e||i.snapshot.data.length>0&&!r.hasMore?Promise.resolve():o(t,n,!0)},reload:c,setQuery:async e=>{let r=f(i.snapshot.pendingQuery??i.snapshot.query,e);s(r,t)||(t=r,n=1,await o(r,1,!1))},get snapshot(){return i.snapshot},subscribe:i.subscribe,[Symbol.dispose](){l.dispose()}};return e.autoStart!==!1&&c().catch(()=>void 0),l}var m=(e,t={},n)=>{let r=t.page??e.page,a=t.pageSize??e.pageSize,o=t.search??e.search,s=t.pageSize!==void 0||t.search!==void 0,c=t.page??(s?1:r);return{page:n===void 0?i(c,`page`):Math.min(i(c,`page`),n),pageSize:i(a,`pageSize`),search:o}};function h(e,t={}){let r=e,i=m({page:1,pageSize:20,search:``},t.initialQuery),c=()=>{let e=i.search.length>0&&t.match?r.filter(e=>t.match(e,i.search)):r,n=a(e.length),s=o(i.page,i.pageSize,n),c=(s.index-1)*s.size;return i={...i,page:s.index},{data:e.slice(c,c+s.size),error:null,isFetching:!1,pagination:s,query:i}},l=n(c()),u=()=>{let e=c();return s(e.query,l.value.query)&&e.data===l.value.data&&e.pagination===l.value.pagination?!1:(l.set(e),!0)},d=e=>{let t=m(i,e,l.value.pagination.count);return!s(t,i)&&(i=t,u())},f={get disposalSignal(){return l.disposalSignal},dispose:l.dispose,get disposed(){return l.disposed},page:{go(e){return d({page:e})},last(){return d({page:l.value.pagination.count})},next(){return l.value.pagination.hasNext&&d({page:l.value.pagination.index+1})},previous(){return l.value.pagination.hasPrevious&&d({page:l.value.pagination.index-1})}},setData(e){return e!==r&&(r=e,u())},setQuery:d,get snapshot(){return l.value},subscribe:l.subscribe,[Symbol.dispose](){f.dispose()}};return f}var g=(e,t={},n)=>{let r=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:r);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:n===void 0?i(c,`page`):Math.min(i(c,`page`),n),pageSize:i(a,`pageSize`),search:o}};function _(e){let t=g({page:1,pageSize:20,search:``},e.initialQuery),n=r({data:[],error:null,isFetching:!1,pagination:o(t.page,t.pageSize,0),query:t}),i=r=>n.fetch({failure:(e,t)=>({...e,error:t,isFetching:!1,pendingQuery:void 0}),load:t=>e.load({query:r,signal:t}),pending:e=>({...e,error:null,isFetching:!0,pendingQuery:r}),success:e=>{let n=a(e.total),i=o(r.page,r.pageSize,n),s={...r,page:i.index};return t=s,{data:e.data,error:null,isFetching:!1,pagination:i,query:s}}}),c=()=>i(t),l=async e=>{let r=g(n.snapshot.pendingQuery??n.snapshot.query,e,n.snapshot.pagination.total>0?n.snapshot.pagination.count:void 0);s(r,t)||(t=r,await i(r))},u={get disposalSignal(){return n.disposalSignal},dispose:n.dispose,get disposed(){return n.disposed},page:{go(e){return n.snapshot.isFetching?Promise.resolve():l({page:e})},last(){return n.snapshot.isFetching?Promise.resolve():l({page:n.snapshot.pagination.count})},next(){return n.snapshot.isFetching||!n.snapshot.pagination.hasNext?Promise.resolve():l({page:n.snapshot.pagination.index+1})},previous(){return n.snapshot.isFetching||!n.snapshot.pagination.hasPrevious?Promise.resolve():l({page:n.snapshot.pagination.index-1})}},reload:c,setQuery:l,get snapshot(){return n.snapshot},subscribe:n.subscribe,[Symbol.dispose](){u.dispose()}};return e.autoStart!==!1&&c().catch(()=>void 0),u}exports.createCursorSource=u,exports.createInfiniteSource=p,exports.createLocalSource=h,exports.createPageSource=_;
|
|
2
2
|
//# sourceMappingURL=sourcerer.cjs.map
|