@ryuzaki13/react-foundation-lib 2.8.1 → 2.10.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 +1 -0
- package/dist/chunks/query-client-BsiuEoJD.js +525 -0
- package/dist/chunks/query-client-BsiuEoJD.js.map +1 -0
- package/dist/decimal/addDecimals.d.ts +4 -0
- package/dist/decimal/addDecimals.d.ts.map +1 -0
- package/dist/decimal/alignDecimalParts.d.ts +8 -0
- package/dist/decimal/alignDecimalParts.d.ts.map +1 -0
- package/dist/decimal/compareDecimalRatios.d.ts +4 -0
- package/dist/decimal/compareDecimalRatios.d.ts.map +1 -0
- package/dist/decimal/compareDecimals.d.ts +4 -0
- package/dist/decimal/compareDecimals.d.ts.map +1 -0
- package/dist/decimal/index.d.ts +10 -0
- package/dist/decimal/index.d.ts.map +1 -0
- package/dist/decimal/index.js +108 -0
- package/dist/decimal/index.js.map +1 -0
- package/dist/decimal/isCanonicalDecimal.d.ts +4 -0
- package/dist/decimal/isCanonicalDecimal.d.ts.map +1 -0
- package/dist/decimal/multiplyDecimals.d.ts +4 -0
- package/dist/decimal/multiplyDecimals.d.ts.map +1 -0
- package/dist/decimal/normalizeDecimal.d.ts +4 -0
- package/dist/decimal/normalizeDecimal.d.ts.map +1 -0
- package/dist/decimal/readDecimalParts.d.ts +4 -0
- package/dist/decimal/readDecimalParts.d.ts.map +1 -0
- package/dist/decimal/resolveDecimalMaxLength.d.ts +4 -0
- package/dist/decimal/resolveDecimalMaxLength.d.ts.map +1 -0
- package/dist/decimal/subtractDecimals.d.ts +4 -0
- package/dist/decimal/subtractDecimals.d.ts.map +1 -0
- package/dist/decimal/sumDecimals.d.ts +4 -0
- package/dist/decimal/sumDecimals.d.ts.map +1 -0
- package/dist/decimal/types.d.ts +16 -0
- package/dist/decimal/types.d.ts.map +1 -0
- package/dist/decimal/writeDecimalParts.d.ts +4 -0
- package/dist/decimal/writeDecimalParts.d.ts.map +1 -0
- package/dist/error-report/index.js +1 -1
- package/dist/query-client/index.d.ts +3 -0
- package/dist/query-client/index.d.ts.map +1 -1
- package/dist/query-client/index.js +2 -439
- package/dist/query-client/sessionScoped.d.ts +1 -15
- package/dist/query-client/sessionScoped.d.ts.map +1 -1
- package/dist/query-client/sessionScopedResetLifecycle.d.ts +16 -0
- package/dist/query-client/sessionScopedResetLifecycle.d.ts.map +1 -0
- package/dist/query-client/sessionScopedResetLifecycleTypes.d.ts +16 -0
- package/dist/query-client/sessionScopedResetLifecycleTypes.d.ts.map +1 -0
- package/dist/query-client/sessionScopedTypes.d.ts +15 -0
- package/dist/query-client/sessionScopedTypes.d.ts.map +1 -0
- package/package.json +5 -1
- package/src/decimal/README.md +43 -0
- package/src/query-client/README.mdx +101 -19
- package/dist/query-client/index.js.map +0 -1
|
@@ -1,439 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import { broadcastQueryClient as n } from "@tanstack/query-broadcast-client-experimental";
|
|
4
|
-
import { experimental_createQueryPersister as r } from "@tanstack/query-persist-client-core";
|
|
5
|
-
import { MutationCache as i, QueryCache as a, QueryClient as o } from "@tanstack/react-query";
|
|
6
|
-
//#region src/query-client/broadcast.ts
|
|
7
|
-
var s = null;
|
|
8
|
-
function c(e) {
|
|
9
|
-
s = e;
|
|
10
|
-
}
|
|
11
|
-
function l(e) {
|
|
12
|
-
s?.(e);
|
|
13
|
-
}
|
|
14
|
-
function u(e, r) {
|
|
15
|
-
if (typeof window > "u") return {
|
|
16
|
-
broadcast: () => {},
|
|
17
|
-
cleanup: () => {}
|
|
18
|
-
};
|
|
19
|
-
let i = !1, a = n({
|
|
20
|
-
queryClient: e,
|
|
21
|
-
broadcastChannel: r.queriesChannel
|
|
22
|
-
}), o = t(), s = new BroadcastChannel(r.eventsChannel), c = e.getQueryCache().subscribe((e) => {
|
|
23
|
-
i || e.type === "updated" && e.action.type === "invalidate" && l({
|
|
24
|
-
type: "invalidate",
|
|
25
|
-
keys: [e.query.queryKey],
|
|
26
|
-
refetchType: "none"
|
|
27
|
-
});
|
|
28
|
-
});
|
|
29
|
-
s.onmessage = (t) => {
|
|
30
|
-
let n = t.data;
|
|
31
|
-
if (!d(n) || n.tabId === o) return;
|
|
32
|
-
let r = n.event;
|
|
33
|
-
i = !0;
|
|
34
|
-
try {
|
|
35
|
-
if (r.type === "invalidate") {
|
|
36
|
-
let t = r.refetchType ?? "none";
|
|
37
|
-
for (let n of r.keys) e.invalidateQueries({
|
|
38
|
-
queryKey: n,
|
|
39
|
-
refetchType: t
|
|
40
|
-
});
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
if (r.type === "setQueryData") {
|
|
44
|
-
e.setQueryData(r.key, r.data);
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
} finally {
|
|
48
|
-
i = !1;
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
function l(e) {
|
|
52
|
-
let t = {
|
|
53
|
-
tabId: o,
|
|
54
|
-
event: e
|
|
55
|
-
};
|
|
56
|
-
s.postMessage(t);
|
|
57
|
-
}
|
|
58
|
-
return {
|
|
59
|
-
broadcast: l,
|
|
60
|
-
cleanup: () => {
|
|
61
|
-
c(), a(), s.close();
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
function d(t) {
|
|
66
|
-
return !e(t) || typeof t.tabId != "string" || !("event" in t) ? !1 : f(t.event);
|
|
67
|
-
}
|
|
68
|
-
function f(t) {
|
|
69
|
-
return e(t) ? t.type === "invalidate" ? Array.isArray(t.keys) ? t.refetchType === void 0 || t.refetchType === "none" || t.refetchType === "active" || t.refetchType === "inactive" || t.refetchType === "all" : !1 : t.type === "setQueryData" && "key" in t && "data" in t : !1;
|
|
70
|
-
}
|
|
71
|
-
//#endregion
|
|
72
|
-
//#region src/query-client/invalidationBroadcast.ts
|
|
73
|
-
function p(t) {
|
|
74
|
-
return e(t) && t.type === "query.invalidate" && typeof t.senderId == "string" && Array.isArray(t.queryKey);
|
|
75
|
-
}
|
|
76
|
-
function m(e, n) {
|
|
77
|
-
if (typeof window > "u" || typeof BroadcastChannel > "u") return {
|
|
78
|
-
broadcast: () => void 0,
|
|
79
|
-
cleanup: () => void 0
|
|
80
|
-
};
|
|
81
|
-
let r = t(), i = new BroadcastChannel(n.channelName), a = !1, o = !1, s = (e) => {
|
|
82
|
-
o || !n.matchesQuery(e) || i.postMessage({
|
|
83
|
-
type: "query.invalidate",
|
|
84
|
-
senderId: r,
|
|
85
|
-
queryKey: e
|
|
86
|
-
});
|
|
87
|
-
}, c = e.getQueryCache().subscribe((e) => {
|
|
88
|
-
a || e.type !== "updated" || e.action.type !== "invalidate" || s(e.query.queryKey);
|
|
89
|
-
});
|
|
90
|
-
return i.onmessage = (t) => {
|
|
91
|
-
let i = t.data;
|
|
92
|
-
if (!(o || !p(i) || i.senderId === r || !n.matchesQuery(i.queryKey))) {
|
|
93
|
-
a = !0;
|
|
94
|
-
try {
|
|
95
|
-
e.invalidateQueries({
|
|
96
|
-
queryKey: i.queryKey,
|
|
97
|
-
exact: !0,
|
|
98
|
-
refetchType: n.refetchType ?? "active"
|
|
99
|
-
});
|
|
100
|
-
} finally {
|
|
101
|
-
a = !1;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}, {
|
|
105
|
-
broadcast: s,
|
|
106
|
-
cleanup() {
|
|
107
|
-
o || (o = !0, c(), i.close());
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
//#endregion
|
|
112
|
-
//#region src/query-client/queryPersistenceAdapter.ts
|
|
113
|
-
var h = {};
|
|
114
|
-
function ee(e) {
|
|
115
|
-
h = e;
|
|
116
|
-
}
|
|
117
|
-
function g() {
|
|
118
|
-
return h;
|
|
119
|
-
}
|
|
120
|
-
//#endregion
|
|
121
|
-
//#region src/query-client/persistence.ts
|
|
122
|
-
var _ = "queries", v = "session", y = __REACT_QUERY_PERSISTENCE_BUSTER__, b = 7776e6, x = null;
|
|
123
|
-
function S(e) {
|
|
124
|
-
if (e) return e;
|
|
125
|
-
if (globalThis.indexedDB !== void 0) return globalThis.indexedDB;
|
|
126
|
-
}
|
|
127
|
-
function C(e) {
|
|
128
|
-
return new Promise((t, n) => {
|
|
129
|
-
e.onsuccess = () => t(e.result), e.onerror = () => n(e.error);
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
function w() {
|
|
133
|
-
if (__DEV__) return `dev:${__APP_ID__}`;
|
|
134
|
-
let e = g().resolveSystemIdentifier?.();
|
|
135
|
-
if (e) return e;
|
|
136
|
-
let t = typeof window > "u" ? "server" : window.location.hostname;
|
|
137
|
-
return `${__APP_ID__}:${t}`;
|
|
138
|
-
}
|
|
139
|
-
function T() {
|
|
140
|
-
return `${w()}`;
|
|
141
|
-
}
|
|
142
|
-
function E(e) {
|
|
143
|
-
return encodeURIComponent(e);
|
|
144
|
-
}
|
|
145
|
-
function D() {
|
|
146
|
-
return `${T()}-${v}-`;
|
|
147
|
-
}
|
|
148
|
-
function O(e) {
|
|
149
|
-
return `${D()}${E(e)}-`;
|
|
150
|
-
}
|
|
151
|
-
function k(e, t) {
|
|
152
|
-
return `${O(e)}${E(t)}`;
|
|
153
|
-
}
|
|
154
|
-
function A(e) {
|
|
155
|
-
return !!e?.id.trim() && Number.isFinite(Date.parse(e?.expiresAt ?? "")) && Date.parse(e?.expiresAt ?? "") > Date.now();
|
|
156
|
-
}
|
|
157
|
-
function j() {
|
|
158
|
-
return A(x) ? x : null;
|
|
159
|
-
}
|
|
160
|
-
async function M(e) {
|
|
161
|
-
let t = z();
|
|
162
|
-
if (!t?.entries) return;
|
|
163
|
-
let n = await t.entries();
|
|
164
|
-
await Promise.all(n.filter(([t]) => e(t)).map(([e]) => t.removeItem(e)));
|
|
165
|
-
}
|
|
166
|
-
async function N(e) {
|
|
167
|
-
let t = e === void 0 ? D() : O(e);
|
|
168
|
-
await M((e) => e.startsWith(t));
|
|
169
|
-
}
|
|
170
|
-
async function P(e) {
|
|
171
|
-
let t = e && A(e) ? {
|
|
172
|
-
id: e.id.trim(),
|
|
173
|
-
expiresAt: e.expiresAt
|
|
174
|
-
} : null;
|
|
175
|
-
if (x = t, !t) {
|
|
176
|
-
await N();
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
let n = O(t.id);
|
|
180
|
-
await M((e) => e.startsWith(D()) && !e.startsWith(n));
|
|
181
|
-
}
|
|
182
|
-
function F(e) {
|
|
183
|
-
return e.meta?.persist === !0 && e.meta.sessionScoped !== !0;
|
|
184
|
-
}
|
|
185
|
-
function I(e) {
|
|
186
|
-
let t = e.meta?.sessionPersistence;
|
|
187
|
-
if (e.meta?.sessionScoped !== !0 || !t || typeof t != "object" || !("cacheName" in t) || !("maxEntries" in t) || typeof t.cacheName != "string" || !/^[a-z0-9][a-z0-9_-]{0,63}$/u.test(t.cacheName) || !Number.isSafeInteger(t.maxEntries) || t.maxEntries < 1 || t.maxEntries > 5e3) return null;
|
|
188
|
-
let n = "refetchOnRestore" in t ? t.refetchOnRestore : void 0;
|
|
189
|
-
if (n !== void 0 && typeof n != "boolean") return null;
|
|
190
|
-
let r = "monotonicRevisionField" in t ? t.monotonicRevisionField : void 0;
|
|
191
|
-
return r !== void 0 && (typeof r != "string" || !/^[A-Za-z][A-Za-z0-9_]{0,63}$/u.test(r)) ? null : {
|
|
192
|
-
cacheName: t.cacheName,
|
|
193
|
-
maxEntries: t.maxEntries,
|
|
194
|
-
refetchOnRestore: n,
|
|
195
|
-
monotonicRevisionField: r
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
function L(e, t) {
|
|
199
|
-
let n = e.state.data;
|
|
200
|
-
if (typeof n != "object" || !n || Array.isArray(n)) return null;
|
|
201
|
-
let r = Reflect.get(n, t);
|
|
202
|
-
return typeof r != "string" || !/^\d+$/u.test(r) ? null : r.replace(/^0+(?=\d)/u, "");
|
|
203
|
-
}
|
|
204
|
-
function R(e, t) {
|
|
205
|
-
return e.length === t.length ? e === t ? 0 : e < t ? -1 : 1 : e.length - t.length;
|
|
206
|
-
}
|
|
207
|
-
function z(e = {}) {
|
|
208
|
-
let t = S(e.indexedDB);
|
|
209
|
-
if (!t) return;
|
|
210
|
-
let n = t, r = e.dbName ?? w(), i = e.storeName ?? _, a = null;
|
|
211
|
-
function o() {
|
|
212
|
-
return a || (a = new Promise((e, t) => {
|
|
213
|
-
let a = n.open(r, 1);
|
|
214
|
-
a.onupgradeneeded = () => {
|
|
215
|
-
let e = a.result;
|
|
216
|
-
e.objectStoreNames.contains(i) || e.createObjectStore(i);
|
|
217
|
-
}, a.onsuccess = () => e(a.result), a.onerror = () => t(a.error), a.onblocked = () => t(a.error ?? /* @__PURE__ */ Error("Открытие IndexedDB заблокировано"));
|
|
218
|
-
}), a);
|
|
219
|
-
}
|
|
220
|
-
async function s(e, t) {
|
|
221
|
-
return C(t((await o()).transaction(i, e).objectStore(i)));
|
|
222
|
-
}
|
|
223
|
-
async function c(e, t) {
|
|
224
|
-
let n = await o();
|
|
225
|
-
return new Promise((r, a) => {
|
|
226
|
-
let o = n.transaction(i, e), s = o.objectStore(i);
|
|
227
|
-
o.oncomplete = () => r(), o.onerror = () => a(o.error), o.onabort = () => a(o.error);
|
|
228
|
-
try {
|
|
229
|
-
t(s);
|
|
230
|
-
} catch (e) {
|
|
231
|
-
o.abort(), a(e);
|
|
232
|
-
}
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
async function l(e, t) {
|
|
236
|
-
let n = await o();
|
|
237
|
-
return new Promise((r, a) => {
|
|
238
|
-
let o = n.transaction(i, "readwrite"), s = o.objectStore(i), c = s.get(e), l, u = !1;
|
|
239
|
-
o.oncomplete = () => {
|
|
240
|
-
u ? r(l) : a(/* @__PURE__ */ Error("IndexedDB-транзакция завершилась без результата обновления"));
|
|
241
|
-
}, o.onerror = () => a(o.error), o.onabort = () => a(o.error), c.onerror = () => {
|
|
242
|
-
o.abort(), a(c.error);
|
|
243
|
-
}, c.onsuccess = () => {
|
|
244
|
-
try {
|
|
245
|
-
let n = t(c.result);
|
|
246
|
-
l = n.result, u = !0, n.action === "set" ? s.put(n.value, e) : n.action === "remove" && s.delete(e);
|
|
247
|
-
} catch (e) {
|
|
248
|
-
o.abort(), a(e);
|
|
249
|
-
}
|
|
250
|
-
};
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
return {
|
|
254
|
-
getItem: (e) => s("readonly", (t) => t.get(e)),
|
|
255
|
-
setItem: (e, t) => c("readwrite", (n) => n.put(t, e)),
|
|
256
|
-
removeItem: (e) => c("readwrite", (t) => t.delete(e)),
|
|
257
|
-
updateItem: l,
|
|
258
|
-
entries: async () => {
|
|
259
|
-
let e = await o();
|
|
260
|
-
return new Promise((t, n) => {
|
|
261
|
-
let r = e.transaction(i, "readonly"), a = r.objectStore(i).openCursor(), o = [];
|
|
262
|
-
r.oncomplete = () => t(o), r.onerror = () => n(r.error), r.onabort = () => n(r.error), a.onsuccess = () => {
|
|
263
|
-
let e = a.result;
|
|
264
|
-
e && (o.push([String(e.key), e.value]), e.continue());
|
|
265
|
-
}, a.onerror = () => n(a.error);
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
function B() {
|
|
271
|
-
let e = z();
|
|
272
|
-
if (!e) return;
|
|
273
|
-
let t = e, n = r({
|
|
274
|
-
storage: t,
|
|
275
|
-
serialize: (e) => e,
|
|
276
|
-
deserialize: (e) => e,
|
|
277
|
-
prefix: T(),
|
|
278
|
-
buster: g().persistenceBuster ?? y,
|
|
279
|
-
maxAge: b,
|
|
280
|
-
refetchOnRestore: !0,
|
|
281
|
-
filters: { predicate: F }
|
|
282
|
-
}), i = /* @__PURE__ */ new Map();
|
|
283
|
-
function a(e, n, a, o = !0, s) {
|
|
284
|
-
let c = k(e.id, n), l = `${c}:${a}:${o}:${s ?? ""}:${e.expiresAt}`, u = i.get(l);
|
|
285
|
-
if (u) return u;
|
|
286
|
-
let d = Promise.resolve(), f = r({
|
|
287
|
-
storage: {
|
|
288
|
-
getItem: (n) => j()?.id === e.id ? t.getItem(n) : void 0,
|
|
289
|
-
removeItem: (e) => t.removeItem(e),
|
|
290
|
-
entries: () => t.entries(),
|
|
291
|
-
setItem: async (n, r) => {
|
|
292
|
-
j()?.id === e.id && (s === void 0 ? await t.setItem(n, r) : await t.updateItem(n, (e) => {
|
|
293
|
-
if (!e || e.buster !== r.buster) return {
|
|
294
|
-
action: "set",
|
|
295
|
-
value: r,
|
|
296
|
-
result: void 0
|
|
297
|
-
};
|
|
298
|
-
let t = L(e, s), n = L(r, s);
|
|
299
|
-
return t !== null && n !== null && R(t, n) > 0 ? {
|
|
300
|
-
action: "keep",
|
|
301
|
-
result: void 0
|
|
302
|
-
} : {
|
|
303
|
-
action: "set",
|
|
304
|
-
value: r,
|
|
305
|
-
result: void 0
|
|
306
|
-
};
|
|
307
|
-
}), d = d.then(async () => {
|
|
308
|
-
let e = (await t.entries()).filter(([e]) => e.startsWith(`${c}-`));
|
|
309
|
-
e.sort((e, t) => (t[1].state.dataUpdatedAt ?? 0) - (e[1].state.dataUpdatedAt ?? 0)), await Promise.all(e.slice(a).map(([e]) => t.removeItem(e)));
|
|
310
|
-
}), await d);
|
|
311
|
-
}
|
|
312
|
-
},
|
|
313
|
-
serialize: (e) => e,
|
|
314
|
-
deserialize: (e) => e,
|
|
315
|
-
prefix: c,
|
|
316
|
-
buster: g().persistenceBuster ?? y,
|
|
317
|
-
maxAge: b,
|
|
318
|
-
refetchOnRestore: o,
|
|
319
|
-
filters: { predicate: (e) => I(e)?.cacheName === n }
|
|
320
|
-
});
|
|
321
|
-
return i.set(l, f), f;
|
|
322
|
-
}
|
|
323
|
-
return {
|
|
324
|
-
...n,
|
|
325
|
-
async persisterFn(e, t, r) {
|
|
326
|
-
let i = I(r);
|
|
327
|
-
if (!i) return n.persisterFn(e, t, r);
|
|
328
|
-
let o = j();
|
|
329
|
-
return o ? a(o, i.cacheName, i.maxEntries, i.refetchOnRestore, i.monotonicRevisionField).persisterFn(e, t, r) : Promise.resolve(e(t));
|
|
330
|
-
}
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
//#endregion
|
|
334
|
-
//#region src/query-client/queryMeta.ts
|
|
335
|
-
var V = { persist: !0 }, H = { sessionScoped: !0 };
|
|
336
|
-
function U(e) {
|
|
337
|
-
let t = e.cacheName.trim();
|
|
338
|
-
if (!/^[a-z0-9][a-z0-9_-]{0,63}$/u.test(t)) throw Error("Имя session query cache должно содержать только строчные латинские буквы, цифры, _ и -");
|
|
339
|
-
if (!Number.isSafeInteger(e.maxEntries) || e.maxEntries < 1 || e.maxEntries > 5e3) throw Error("Лимит session query cache должен быть целым числом от 1 до 5000");
|
|
340
|
-
if (e.refetchOnRestore !== void 0 && typeof e.refetchOnRestore != "boolean") throw Error("Политика refetch после восстановления должна быть boolean");
|
|
341
|
-
let n = e.monotonicRevisionField?.trim();
|
|
342
|
-
if (n !== void 0 && !/^[A-Za-z][A-Za-z0-9_]{0,63}$/u.test(n)) throw Error("Имя поля монотонной ревизии должно быть JavaScript-идентификатором длиной до 64 символов");
|
|
343
|
-
return {
|
|
344
|
-
sessionScoped: !0,
|
|
345
|
-
sessionPersistence: {
|
|
346
|
-
cacheName: t,
|
|
347
|
-
maxEntries: e.maxEntries,
|
|
348
|
-
...e.refetchOnRestore === void 0 ? {} : { refetchOnRestore: e.refetchOnRestore },
|
|
349
|
-
...n === void 0 ? {} : { monotonicRevisionField: n }
|
|
350
|
-
}
|
|
351
|
-
};
|
|
352
|
-
}
|
|
353
|
-
//#endregion
|
|
354
|
-
//#region src/query-client/queryClient.ts
|
|
355
|
-
function W({ onQueryError: e, onMutationError: t }) {
|
|
356
|
-
let n = B();
|
|
357
|
-
return new o({
|
|
358
|
-
queryCache: new a({ onError: e }),
|
|
359
|
-
mutationCache: new i({ onError: t }),
|
|
360
|
-
defaultOptions: {
|
|
361
|
-
queries: {
|
|
362
|
-
staleTime: 6e5,
|
|
363
|
-
gcTime: 18e5,
|
|
364
|
-
throwOnError: !1,
|
|
365
|
-
retry: !1,
|
|
366
|
-
...n ? { persister: n.persisterFn } : {}
|
|
367
|
-
},
|
|
368
|
-
mutations: {
|
|
369
|
-
throwOnError: !1,
|
|
370
|
-
retry: !1
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
async function G(e, t, n) {
|
|
376
|
-
await e.cancelQueries({ queryKey: t });
|
|
377
|
-
let r = e.getQueryData(t);
|
|
378
|
-
return e.setQueryData(t, n), { previous: r };
|
|
379
|
-
}
|
|
380
|
-
function K(e, t, n) {
|
|
381
|
-
n?.previous !== void 0 && e.setQueryData(t, n.previous);
|
|
382
|
-
}
|
|
383
|
-
function q(e, t, n, r) {
|
|
384
|
-
e.setQueryData(t, (e) => r(e, n));
|
|
385
|
-
}
|
|
386
|
-
async function J(e, t, n) {
|
|
387
|
-
let r = n?.refetchType ?? "none", i = Y(t) ? t : [t];
|
|
388
|
-
await Promise.all(i.map((t) => e.invalidateQueries({
|
|
389
|
-
queryKey: t,
|
|
390
|
-
refetchType: r
|
|
391
|
-
})));
|
|
392
|
-
}
|
|
393
|
-
function Y(e) {
|
|
394
|
-
return Array.isArray(e) ? Array.isArray(e[0]) : !1;
|
|
395
|
-
}
|
|
396
|
-
//#endregion
|
|
397
|
-
//#region src/query-client/sessionScoped.ts
|
|
398
|
-
var X = "session-scoped-query-cache-reset", Z;
|
|
399
|
-
function Q(e) {
|
|
400
|
-
return e.meta?.sessionScoped === !0;
|
|
401
|
-
}
|
|
402
|
-
async function $(e, t = {}) {
|
|
403
|
-
let n = { predicate: Q };
|
|
404
|
-
await e.cancelQueries(n);
|
|
405
|
-
let r = e.getQueryCache().findAll(n);
|
|
406
|
-
for (let t of r) {
|
|
407
|
-
if (t.getObserversCount() === 0) {
|
|
408
|
-
e.getQueryCache().remove(t);
|
|
409
|
-
continue;
|
|
410
|
-
}
|
|
411
|
-
t.reset(), t.setState({
|
|
412
|
-
data: void 0,
|
|
413
|
-
dataUpdatedAt: 0
|
|
414
|
-
});
|
|
415
|
-
}
|
|
416
|
-
await e.refetchQueries({
|
|
417
|
-
predicate: (e) => Q(e) && e.getObserversCount() > 0,
|
|
418
|
-
type: "active"
|
|
419
|
-
}, { cancelRefetch: !0 }), t.broadcast !== !1 && Z?.();
|
|
420
|
-
}
|
|
421
|
-
function te(e, t) {
|
|
422
|
-
if (typeof window > "u" || typeof BroadcastChannel > "u") return { cleanup: () => void 0 };
|
|
423
|
-
let n = new BroadcastChannel(t.channelName), r = () => {
|
|
424
|
-
let e = { type: X };
|
|
425
|
-
n.postMessage(e);
|
|
426
|
-
};
|
|
427
|
-
return Z = r, n.onmessage = (t) => {
|
|
428
|
-
ne(t.data) && $(e, { broadcast: !1 });
|
|
429
|
-
}, { cleanup: () => {
|
|
430
|
-
n.onmessage = null, n.close(), Z === r && (Z = void 0);
|
|
431
|
-
} };
|
|
432
|
-
}
|
|
433
|
-
function ne(e) {
|
|
434
|
-
return typeof e == "object" && !!e && "type" in e && e.type === X;
|
|
435
|
-
}
|
|
436
|
-
//#endregion
|
|
437
|
-
export { y as REACT_QUERY_PERSISTENCE_BUSTER, b as REACT_QUERY_PERSISTENCE_MAX_AGE, l as broadcastCacheEvent, N as clearSessionQueryPersistence, ee as configureQueryPersistenceProjectAdapter, z as createIndexedDbQueryStorage, W as createQueryClient, B as createReactQueryPersister, U as createSessionQueryPersistenceMeta, g as getQueryPersistenceProjectAdapter, j as getSessionQueryPersistenceScope, m as installQueryInvalidationBroadcast, u as installReactQueryBroadcast, te as installSessionScopedQueryReset, Q as isSessionScopedQuery, K as onErrorOptimistic, G as onMutateOptimistic, J as onSettledOptimistic, q as onSuccessOptimistic, V as persistedQueryMeta, $ as resetSessionScopedQueries, H as sessionScopedQueryMeta, c as setBroadcastFn, P as setSessionQueryPersistenceScope, F as shouldPersistQuery };
|
|
438
|
-
|
|
439
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
import { C as e, E as t, S as n, T as r, _ as i, a, b as o, c as s, d as c, f as l, g as u, h as d, i as f, l as p, m, n as h, o as g, p as _, r as v, s as y, t as b, u as x, v as S, w as C, x as w, y as T } from "../chunks/query-client-BsiuEoJD.js";
|
|
2
|
+
export { _ as REACT_QUERY_PERSISTENCE_BUSTER, m as REACT_QUERY_PERSISTENCE_MAX_AGE, C as broadcastCacheEvent, d as clearSessionQueryPersistence, w as configureQueryPersistenceProjectAdapter, u as createIndexedDbQueryStorage, a as createQueryClient, i as createReactQueryPersister, x as createSessionQueryPersistenceMeta, n as getQueryPersistenceProjectAdapter, S as getSessionQueryPersistenceScope, e as installQueryInvalidationBroadcast, r as installReactQueryBroadcast, b as installSessionScopedQueryReset, f as installSessionScopedQueryResetLifecycle, h as isSessionScopedQuery, g as onErrorOptimistic, y as onMutateOptimistic, s as onSettledOptimistic, p as onSuccessOptimistic, c as persistedQueryMeta, v as resetSessionScopedQueries, l as sessionScopedQueryMeta, t as setBroadcastFn, T as setSessionQueryPersistenceScope, o as shouldPersistQuery };
|
|
@@ -1,19 +1,5 @@
|
|
|
1
1
|
import { type Query, type QueryClient } from "@tanstack/react-query";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Передавать ли команду сброса другим вкладкам. При обработке входящего
|
|
5
|
-
* сообщения значение отключается, чтобы вкладки не создавали цикл событий.
|
|
6
|
-
*/
|
|
7
|
-
readonly broadcast?: boolean;
|
|
8
|
-
};
|
|
9
|
-
export type InstallSessionScopedQueryResetOptions = {
|
|
10
|
-
/** Уникальное для приложения имя служебного BroadcastChannel. */
|
|
11
|
-
readonly channelName: string;
|
|
12
|
-
};
|
|
13
|
-
export type InstalledSessionScopedQueryReset = {
|
|
14
|
-
/** Освобождает канал и прекращает межвкладочную синхронизацию. */
|
|
15
|
-
readonly cleanup: () => void;
|
|
16
|
-
};
|
|
2
|
+
import { type InstalledSessionScopedQueryReset, type InstallSessionScopedQueryResetOptions, type ResetSessionScopedQueriesOptions } from "./sessionScopedTypes";
|
|
17
3
|
/** Проверяет, относится ли query к данным текущей серверной сессии. */
|
|
18
4
|
export declare function isSessionScopedQuery(query: Pick<Query, "meta">): boolean;
|
|
19
5
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionScoped.d.ts","sourceRoot":"","sources":["../../src/query-client/sessionScoped.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"sessionScoped.d.ts","sourceRoot":"","sources":["../../src/query-client/sessionScoped.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGrE,OAAO,EACN,KAAK,gCAAgC,EACrC,KAAK,qCAAqC,EAC1C,KAAK,gCAAgC,EACrC,MAAM,sBAAsB,CAAC;AAU9B,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,OAAO,CAExE;AAED;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,GAAE,gCAAqC,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDvI;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAC7C,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,qCAAqC,GAC5C,gCAAgC,CA4ClC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type QueryClient } from "@tanstack/react-query";
|
|
2
|
+
import { type InstalledSessionScopedQueryResetLifecycle, type SessionScopedQueryResetLifecycle, type SessionScopedQueryResetOutcome } from "./sessionScopedResetLifecycleTypes";
|
|
3
|
+
type SessionScopedQueryResetBoundary = Readonly<{
|
|
4
|
+
retirement: Promise<readonly unknown[]> | null;
|
|
5
|
+
complete: (outcome: SessionScopedQueryResetOutcome) => Promise<readonly unknown[]>;
|
|
6
|
+
}>;
|
|
7
|
+
/**
|
|
8
|
+
* Устанавливать до запуска session-bound runtime на весь срок жизни QueryClient.
|
|
9
|
+
* Поздняя регистрация не может восстановить пропущенный before: вместо частичной
|
|
10
|
+
* защиты она синхронно отклоняется до startup нового consumer.
|
|
11
|
+
*/
|
|
12
|
+
export declare function installSessionScopedQueryResetLifecycle(queryClient: QueryClient, lifecycle: SessionScopedQueryResetLifecycle): InstalledSessionScopedQueryResetLifecycle;
|
|
13
|
+
/** Приватная пара одного reset: перекрывающиеся вызовы не объединяются и не меняют прежний Query flow. */
|
|
14
|
+
export declare function beginSessionScopedQueryReset(queryClient: QueryClient): SessionScopedQueryResetBoundary;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=sessionScopedResetLifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionScopedResetLifecycle.d.ts","sourceRoot":"","sources":["../../src/query-client/sessionScopedResetLifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EACN,KAAK,yCAAyC,EAC9C,KAAK,gCAAgC,EACrC,KAAK,8BAA8B,EACnC,MAAM,oCAAoC,CAAC;AAO5C,KAAK,+BAA+B,GAAG,QAAQ,CAAC;IAC/C,UAAU,EAAE,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;IAC/C,QAAQ,EAAE,CAAC,OAAO,EAAE,8BAA8B,KAAK,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;CACnF,CAAC,CAAC;AAmBH;;;;GAIG;AACH,wBAAgB,uCAAuC,CACtD,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,gCAAgC,GACzC,yCAAyC,CAc3C;AAED,0GAA0G;AAC1G,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,WAAW,GAAG,+BAA+B,CA+BtG"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Результат retirement и самого reset; ошибки остаются в отклонённом Promise вызывающего кода. */
|
|
2
|
+
export type SessionScopedQueryResetOutcome = Readonly<{
|
|
3
|
+
status: "completed" | "failed";
|
|
4
|
+
}>;
|
|
5
|
+
/** Техническая граница внешних session-bound ресурсов, без знания auth или содержимого Query. */
|
|
6
|
+
export type SessionScopedQueryResetLifecycle = Readonly<{
|
|
7
|
+
/** Синхронно отзывает допуск; Promise завершает освобождение ресурсов до отмены и очистки Query. */
|
|
8
|
+
beforeReset: () => void | Promise<void>;
|
|
9
|
+
/** Парный finally: вызывается и после cleanup регистрации; failed не разрешает восстановить прежний scope. */
|
|
10
|
+
afterReset: (outcome: SessionScopedQueryResetOutcome) => void;
|
|
11
|
+
}>;
|
|
12
|
+
export type InstalledSessionScopedQueryResetLifecycle = Readonly<{
|
|
13
|
+
/** Идемпотентно запрещает будущие before, не отменяя уже захваченную пару текущего reset. */
|
|
14
|
+
cleanup: () => void;
|
|
15
|
+
}>;
|
|
16
|
+
//# sourceMappingURL=sessionScopedResetLifecycleTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionScopedResetLifecycleTypes.d.ts","sourceRoot":"","sources":["../../src/query-client/sessionScopedResetLifecycleTypes.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,MAAM,MAAM,8BAA8B,GAAG,QAAQ,CAAC;IAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAA;CAAE,CAAC,CAAC;AAE1F,iGAAiG;AACjG,MAAM,MAAM,gCAAgC,GAAG,QAAQ,CAAC;IACvD,oGAAoG;IACpG,WAAW,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,8GAA8G;IAC9G,UAAU,EAAE,CAAC,OAAO,EAAE,8BAA8B,KAAK,IAAI,CAAC;CAC9D,CAAC,CAAC;AAEH,MAAM,MAAM,yCAAyC,GAAG,QAAQ,CAAC;IAChE,6FAA6F;IAC7F,OAAO,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type ResetSessionScopedQueriesOptions = Readonly<{
|
|
2
|
+
/** Отключается при обработке входящего сообщения, чтобы вкладки не создавали цикл reset. */
|
|
3
|
+
broadcast?: boolean;
|
|
4
|
+
}>;
|
|
5
|
+
export type InstallSessionScopedQueryResetOptions = Readonly<{
|
|
6
|
+
/** Уникальное для приложения имя служебного BroadcastChannel. */
|
|
7
|
+
channelName: string;
|
|
8
|
+
/** Ошибка входящего reset; без callback выводится в console.error, не становится unhandled rejection. */
|
|
9
|
+
onError?: (error: unknown) => void | Promise<void>;
|
|
10
|
+
}>;
|
|
11
|
+
export type InstalledSessionScopedQueryReset = Readonly<{
|
|
12
|
+
/** Освобождает канал и прекращает межвкладочную синхронизацию. */
|
|
13
|
+
cleanup: () => void;
|
|
14
|
+
}>;
|
|
15
|
+
//# sourceMappingURL=sessionScopedTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionScopedTypes.d.ts","sourceRoot":"","sources":["../../src/query-client/sessionScopedTypes.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gCAAgC,GAAG,QAAQ,CAAC;IACvD,4FAA4F;IAC5F,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,MAAM,qCAAqC,GAAG,QAAQ,CAAC;IAC5D,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,yGAAyG;IACzG,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD,CAAC,CAAC;AAEH,MAAM,MAAM,gCAAgC,GAAG,QAAQ,CAAC;IACvD,kEAAkE;IAClE,OAAO,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ryuzaki13/react-foundation-lib",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.10.0",
|
|
4
4
|
"description": "Reusable React and TypeScript foundation utilities, hooks, and primitives.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Ryuzaki13",
|
|
@@ -61,6 +61,10 @@
|
|
|
61
61
|
"types": "./dist/date-segments/index.d.ts",
|
|
62
62
|
"import": "./dist/date-segments/index.js"
|
|
63
63
|
},
|
|
64
|
+
"./decimal": {
|
|
65
|
+
"types": "./dist/decimal/index.d.ts",
|
|
66
|
+
"import": "./dist/decimal/index.js"
|
|
67
|
+
},
|
|
64
68
|
"./dom": {
|
|
65
69
|
"types": "./dist/dom/index.d.ts",
|
|
66
70
|
"import": "./dist/dom/index.js"
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Точные десятичные значения
|
|
2
|
+
|
|
3
|
+
Публичный импорт: `@ryuzaki13/react-foundation-lib/decimal`.
|
|
4
|
+
Модуль вычисляет конечные десятичные значения как целый коэффициент и число
|
|
5
|
+
десятичных разрядов. Строки не переводятся в `number`; округления нет.
|
|
6
|
+
React, browser API и дополнительные зависимости не требуются.
|
|
7
|
+
|
|
8
|
+
```ts
|
|
9
|
+
import { addDecimals, compareDecimalRatios } from "@ryuzaki13/react-foundation-lib/decimal";
|
|
10
|
+
|
|
11
|
+
addDecimals("0.1", "0.2"); // "0.3"
|
|
12
|
+
compareDecimalRatios({ numerator: "10", denominator: "3" }, { numerator: "3.33", denominator: "1" }); // 1
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
| API | Назначение |
|
|
16
|
+
| ----------------------------------------------------- | --------------------------------------------------------------------- |
|
|
17
|
+
| `isCanonicalDecimal(unknown, options?)` | Проверить внешнее значение без преобразования |
|
|
18
|
+
| `normalizeDecimal(string, options?)` | Убрать начальные и конечные нули; привести отрицательный ноль к `"0"` |
|
|
19
|
+
| `addDecimals`, `subtractDecimals`, `multiplyDecimals` | Получить точный канонический результат двух операндов |
|
|
20
|
+
| `sumDecimals(iterable, options?)` | Суммировать за один проход; пустой набор даёт `"0"` |
|
|
21
|
+
| `compareDecimals` | Вернуть `-1`, `0` или `1` |
|
|
22
|
+
| `compareDecimalRatios` | Сравнить отношения без деления; знаменатели строго положительные |
|
|
23
|
+
|
|
24
|
+
Каноническая строка содержит знак минус при необходимости, цифры и точку:
|
|
25
|
+
`"0"`, `"0.3"`, `"-12.05"`. Пробелы, плюс, экспонента, запятая, начальные
|
|
26
|
+
нули и конечные нули дробной части в арифметике отклоняются. Нормализация
|
|
27
|
+
допускает только лишние нули; обработка локализованного ввода и внешних JSON
|
|
28
|
+
чисел принадлежит соответствующей входной границе.
|
|
29
|
+
|
|
30
|
+
`DecimalOptions.maxLength` задаёт положительный безопасный целый предел длины
|
|
31
|
+
входа и результата, включая знак и точку; по умолчанию — 512 символов.
|
|
32
|
+
Вход отклоняется до создания `bigint` и выравнивания разрядов. Неверная форма
|
|
33
|
+
даёт `TypeError`, неверный предел, overflow результата и недопустимый знаменатель
|
|
34
|
+
— `RangeError`. `isCanonicalDecimal` возвращает `false` для неверного значения,
|
|
35
|
+
но неверная конфигурация предела также даёт `RangeError`.
|
|
36
|
+
|
|
37
|
+
Суммирование проверяет каждый промежуточный результат: даже последующее
|
|
38
|
+
взаимное сокращение не отменяет уже возникшее переполнение. При сравнении
|
|
39
|
+
отношений произведения не сериализуются; они могут превышать предел строки,
|
|
40
|
+
оставаясь ограниченными длиной проверенных операндов.
|
|
41
|
+
|
|
42
|
+
Предметные правила положительности, единиц измерения и допустимости нуля
|
|
43
|
+
остаются у приложения. Приватные коэффициенты и разрядность не входят в API.
|