@qtpy/state-management-observable
Version:
1. [Основная идея и архитектура](#основная-идея-и-архитектура) 1.1. [Прозрачная реактивность](#прозрачная-реактивность) 1.2. [Поддержка типизированных строковых ключей](#поддержка-типизированных-строковых-ключей) 1.3. [Подписки с «гранул
282 lines (281 loc) • 8.47 kB
JavaScript
function E(t) {
const e = t.match(/\((.*?)\)/);
return e ? e[1].split(/\s*,\s*/).filter(Boolean) : [];
}
function k(t, e) {
const r = e.toString().trim(), n = E(r), i = r.match(
/^\s*(?:\([^)]*\)|[a-zA-Z_$][\w$]*)\s*=>\s*([\s\S]+)$/
);
if (!i)
throw new Error("Invalid function format");
let c = i[1].trim();
c.startsWith("(") && c.endsWith(")") && (c = c.slice(1, -1).trim());
let s = c.replace(/\s+/g, "");
const l = /\[([^\[\]]+),([^\[\]]+)\]/;
for (; l.test(s); )
s = s.replace(/\[([^\[\]]+),([^\[\]]+)\]/g, "[$1][$2]");
if (n.length < 2) {
let f = s.replace(/\[['"]([^[\]]+)['"]\]/g, ".$1").replace(/\[([^[\]]+)\]/g, ".$1");
return f.startsWith(".") && (f = f.slice(1)), f;
}
const o = n[1], a = o.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), R = new RegExp(`${a}\\(\\s*([^\\)]+)\\s*\\)`), w = new RegExp(`${a}\\(\\s*([^\\)]+)\\s*\\)`, "g");
if (!R.test(s)) {
let f = s.replace(/\[['"]([^[\]]+)['"]\]/g, ".$1").replace(/\[([^[\]]+)\]/g, ".$1");
return f.startsWith(".") && (f = f.slice(1)), f;
}
const $ = [];
let O;
for (; (O = w.exec(s)) !== null; )
$.push(O[1]);
const m = [];
let A = 0;
function T(f) {
const u = $[A];
return m.push([`${o}(${u})`, f]), A++, f;
}
try {
e(t, T);
} catch {
}
const _ = {};
for (const [f, u] of m) {
const y = f.slice(o.length + 1, -1);
_[y] = u;
}
let h = s.replace(w, (f, u) => {
const y = _[u];
return y === void 0 ? "undefined" : String(y);
});
h = h.replace(/\[['"]([^[\]]+)['"]\]/g, (f, u) => `.${u}`).replace(/\[([^[\]]+)\]/g, (f, u) => `.${u}`);
const d = h.replace(/\.\./g, ".");
return d.startsWith(".") ? d.slice(1) : d;
}
function q(t) {
if (!(typeof t == "string") && !(typeof t == "function")) {
const n = t === null ? "null" : typeof t, i = typeof t == "object" ? JSON.stringify(Object.keys(t)) : String(t);
throw new Error(`[store] Ожидался путь (строка или функция-доступ), получено: ${n} (${i}).`);
}
}
function v(t, e) {
let r;
typeof e == "string" ? r = e : r = k(t, e);
let n = "$";
if (typeof e != "string") {
const s = e.toString().trim();
n = E(s)[0] || "$";
}
const i = `${n}.`, c = r.indexOf(i);
return c >= 0 ? r.slice(c + i.length) : r;
}
function C(t, e) {
return Array.isArray(t) ? t.map((r) => C(r, e)).filter((r) => r !== "").join(".") : typeof t == "function" ? v(e, t) : t == null ? "" : String(t);
}
function G(t, e) {
if (t === e) return !0;
if (t == null || e == null) return t === e;
if (typeof t != typeof e) return !1;
if (t instanceof Date && e instanceof Date)
return t.getTime() === e.getTime();
if (typeof t != "object") return !1;
const r = Object.keys(t), n = Object.keys(e);
if (r.length !== n.length) return !1;
for (let i = 0; i < r.length; i++) {
const c = r[i];
if (!Object.prototype.hasOwnProperty.call(e, c) || t[c] !== e[c])
return !1;
}
return !0;
}
function D(t) {
return t.split(".").map((e) => /^\d+$/.test(e) ? Number(e) : e);
}
function U(t, e = []) {
switch (t) {
case "push":
case "pop":
case "splice":
case "shift":
case "unshift":
case "sort":
case "reverse":
return !e.length || e.includes(t);
}
return !1;
}
function p(t, e) {
return t === void 0 ? !1 : e == null ? void 0 : e();
}
function g(t, e, r, n, i) {
typeof e == "object" && e !== null && t ? p(e, () => t.set(e, r)) : i && n.set(i, r);
}
function N(t, e, r, n) {
if (typeof e == "object" && e !== null)
return p(e, () => t.get(e));
if (n)
return r == null ? void 0 : r.get(n);
}
function F(t, e, r, n) {
typeof e == "object" && e !== null ? p(e, () => t.delete(e)) : n && r.delete(n);
}
function J(t) {
try {
if (t == null || typeof t != "object")
return String(t);
const e = JSON.stringify(t);
let r = 5381;
for (let n = 0; n < e.length; n++) {
const i = e.charCodeAt(n);
r = ((r << 5) + r ^ i) >>> 0;
}
return (r >>> 0).toString(16);
} catch {
return !1;
}
}
function V() {
return `${Math.floor(performance.now()).toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
}
const z = () => typeof window > "u";
function j(t, e = "ssrStoreId_default") {
const r = t;
let n = Promise.resolve();
const i = r.asyncUpdate;
function c(s) {
return (...l) => {
const o = n.then(() => s(...l));
return n = o.catch(() => {
}), o;
};
}
return r.updateSSR = c(i), r.updateSSR.quiet = c(i.quiet), r.getIsSSR = () => z(), r.getSSRStoreId = () => e, r.snapshot = async () => {
try {
return await n, t.getRawStore();
} catch (s) {
throw console.error("Failed to create snapshot:", s), s;
}
}, r.getSerializedStore = async (s) => {
const l = await r.snapshot(), o = JSON.stringify(l);
return {
window: `window['${e}'] = ${o};`,
scriptTag: `<script id="${e}" type="application/json">${o}<\/script>`,
serializedData: o
}[s];
}, r.hydrate = () => {
if (!r.getIsSSR() && window[e]) {
const s = document.getElementById(e);
r.setRawStore(window[e]), delete window[e], s == null || s.remove();
}
}, r.hydrateWithDocument = (s = 0, l) => {
r.getIsSSR() || (window.onload = () => {
setTimeout(() => {
r.hydrate(), l == null || l();
}, s);
});
}, r;
}
function M(t, e) {
const r = D(e);
let n = t;
for (const i of r) {
if (n == null || typeof n != "object")
return !1;
n = n[i];
}
return !0;
}
function Z(t, e) {
if (!e) return t;
const r = D(e);
let n = t;
for (const i of r) {
if (n == null) return;
n = n[i];
}
return n;
}
const P = {
array: ["push", "pop", "shift", "unshift", "splice", "sort", "reverse", "fill", "copyWithin"],
object: ["assign", "defineProperty", "defineProperties"]
};
class x extends Array {
constructor(...e) {
super(...e);
}
}
function H(t, e) {
var r;
return !Array.isArray(t) || (r = N(e, t)) != null && r._isWrapped || (P.array.forEach((n) => {
x.prototype[n] = function(...i) {
return p(this, () => {
g(e, this, {
_prevSignature: "CHANGED_METHOD",
_mutated: !0,
_isWrapped: !0
});
}), Array.prototype[n].apply(this, i);
};
}), Object.setPrototypeOf(t, x.prototype), g(e, t, { _isWrapped: !0 })), t;
}
class S extends Object {
constructor(...e) {
super(...e);
}
}
function I(t, e) {
var r;
return typeof t != "object" || t === null || (r = N(e, t)) != null && r._isWrapped || (P.object.forEach((n) => {
n in S.prototype || (S.prototype[n] = function(...i) {
return p(this, () => {
g(e, this, {
_prevSignature: "CHANGED_METHOD",
_mutated: !0,
_isWrapped: !0
});
}), Object[n](this, ...i);
});
}), Object.setPrototypeOf(t, S.prototype), g(e, t, { _isWrapped: !0 })), t;
}
function L(t, e, r, n) {
let i = t;
return Array.isArray(t) ? i = H(t, n) : t && typeof t == "object" && (i = I(t, n)), i !== t && e && r != null && (e[r] = i), i;
}
function* W(t, e = !0, r = /* @__PURE__ */ new WeakSet(), n = "", i = null, c = null) {
if (!(t == null || t == null || typeof t != "object" || r.has(t)))
if (r.add(t), yield { node: t, path: n, parent: i, key: c }, Array.isArray(t))
for (let s = t.length - 1; s >= 0; s--) {
const l = n ? `${n}.${s}` : String(s);
(e || t[s] && typeof t[s] == "object") && (yield { node: t[s], path: l, parent: t, key: s }, t[s] && typeof t[s] == "object" && (yield* W(t[s], e, r, l, t, s)));
}
else {
const s = Object.keys(t);
for (let l = s.length - 1; l >= 0; l--) {
const o = s[l], a = n ? `${n}.${o}` : o;
(e || t[o] && typeof t[o] == "object") && (yield { node: t[o], path: a, parent: t, key: o }, t[o] && typeof t[o] == "object" && (yield* W(t[o], e, r, a, t, o)));
}
}
}
export {
x as WrapArray,
S as WrapObject,
J as calculateSnapshotHash,
F as deleteMetaData,
Z as getByPath,
z as getCheckIsSSR,
N as getMetaData,
V as getRandomId,
k as getStringOfObject,
v as getStringPath,
U as isArrayMethod,
M as isPathValid,
W as iterateObjectTree,
C as normalizeCacheKey,
g as setMetaData,
G as shallowEqual,
D as splitPath,
j as ssrStore,
q as validatePath,
p as withMetaSupport,
H as wrapArrayMethods,
L as wrapNode,
I as wrapObjectMethods
};