@stoker-platform/web-client 0.5.44 → 0.5.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/bundle.js +106 -77
  2. package/package.json +3 -3
package/dist/bundle.js CHANGED
@@ -1986,7 +1986,7 @@ const ay = /* @__PURE__ */ In(iy), Dr = {
1986
1986
  for (const c of o)
1987
1987
  if (_e(c) && c.collection === s.collection && c.dependencyFields)
1988
1988
  for (const l of c.dependencyFields)
1989
- l.field == r.name && (i = !0);
1989
+ l.field === r.name && (i = !0);
1990
1990
  }
1991
1991
  return i;
1992
1992
  }, Yd = (r, e) => {
@@ -2147,7 +2147,7 @@ const ay = /* @__PURE__ */ In(iy), Dr = {
2147
2147
  }), s;
2148
2148
  }, va = async (r, e, t) => {
2149
2149
  if (e) {
2150
- const n = await ve(e, t);
2150
+ const n = await ve(e, [t]);
2151
2151
  if (n === !1)
2152
2152
  throw new Error(`CANCELLED: Operation cancelled by ${r}`);
2153
2153
  return n;
@@ -2160,7 +2160,7 @@ async function ae(r, e, t, n) {
2160
2160
  if (r !== "setEmbedding" && (await va(r, e?.[r], n), r === "postWriteError"))
2161
2161
  return s;
2162
2162
  }
2163
- const Ko = (r, e, t, n, s, i, a, o, c, l) => (r == "create" && (t.Collection_Path = e, l || (t.Created_At = o), t.Saved_At = c, t.Created_By = a || "System"), t.Last_Write_App = s, l || (t.Last_Write_At = o), t.Last_Save_At = c, t.Last_Write_By = a || "System", t.Last_Write_Connection_Status = i, t.Last_Write_Version = n.version, t), Qd = (r, e) => {
2163
+ const Ko = (r, e, t, n, s, i, a, o, c, l) => (r === "create" && (t.Collection_Path = e, l || (t.Created_At = o), t.Saved_At = c, t.Created_By = a || "System"), t.Last_Write_App = s, l || (t.Last_Write_At = o), t.Last_Save_At = c, t.Last_Write_By = a || "System", t.Last_Write_Connection_Status = i, t.Last_Write_Version = n.version, t), Qd = (r, e) => {
2164
2164
  const { access: t, queries: n } = r, { serverReadOnly: s } = t, i = /* @__PURE__ */ new Set();
2165
2165
  if (n)
2166
2166
  for (const a of n) {
@@ -10479,7 +10479,7 @@ function Or(r) {
10479
10479
  }
10480
10480
  const Yf = async (r, e) => {
10481
10481
  if (r) {
10482
- const t = await ve(r, e);
10482
+ const t = await ve(r, [e]);
10483
10483
  if (!t.valid)
10484
10484
  throw new Error(t.message);
10485
10485
  }
@@ -11378,7 +11378,7 @@ const fw = async (r, e) => {
11378
11378
  e.pagination.orderByField && e.pagination.orderByDirection ? e.pagination.startAfter || e.pagination.endBefore ? e.pagination.startAfter ? C = C.map((k, P) => me(k, rt(e.pagination.orderByField, e.pagination.orderByDirection), eo(I.last.get(P)), Xt(e.pagination.number))) : C = C.map((k, P) => me(k, rt(e.pagination.orderByField, e.pagination.orderByDirection), to(I.first.get(P)), Fr(e.pagination.number))) : C = C.map((k) => me(k, rt(e.pagination.orderByField, e.pagination.orderByDirection), Xt(e.pagination.number))) : !e.pagination.startAfter && !e.pagination.endBefore ? C = C.map((k) => me(k, Xt(e.pagination.number))) : e.pagination.startAfter ? C = C.map((k, P) => me(k, eo(I.last.get(P)), Xt(e.pagination.number))) : C = C.map((k, P) => me(k, to(I.first.get(P)), Fr(e.pagination.number)));
11379
11379
  }
11380
11380
  const y = { collection: c.collection };
11381
- await ae("preOperation", d, w, ["read", void 0, void 0, y]), await ae("preRead", d, w, [y, C, !0, !1]);
11381
+ await ae("preOperation", d, w, { operation: "read", context: y }), await ae("preRead", d, w, { context: y, refs: C, multiple: !0, listener: !1 });
11382
11382
  const v = /* @__PURE__ */ new Map(), x = C.map(async (m) => {
11383
11383
  let R;
11384
11384
  return e?.only === "cache" ? R = await Od(m) : e?.only === "server" ? R = await Hm(m) : R = await Km(m), R;
@@ -11440,8 +11440,8 @@ const fw = async (r, e) => {
11440
11440
  m[U.name] = z;
11441
11441
  })), e?.noEmbeddingFields && U.type === "Embedding" && delete m[U.name];
11442
11442
  await Promise.all(P);
11443
- const N = ["read", m, m.id, y];
11444
- await ae("postOperation", d, w, N), await ae("postRead", d, w, [y, T, m, !1]);
11443
+ const N = { operation: "read", data: m, docId: m.id, context: y };
11444
+ await ae("postOperation", d, w, N), await ae("postRead", d, w, { context: y, refs: T, doc: m, listener: !1 });
11445
11445
  }
11446
11446
  return { cursor: I, pages: O, docs: Array.from(v.values()) };
11447
11447
  }, mw = async (r, e, t) => {
@@ -11539,7 +11539,7 @@ const fw = async (r, e) => {
11539
11539
  if (b.length === 0)
11540
11540
  throw new Error("PERMISSION_DENIED");
11541
11541
  const T = { collection: d.collection };
11542
- await ae("preOperation", o, w, ["read", void 0, e, T]), await ae("preRead", o, w, [T, b, !1, !1]);
11542
+ await ae("preOperation", o, w, { operation: "read", docId: e, context: T }), await ae("preRead", o, w, { context: T, refs: b, multiple: !1, listener: !1 });
11543
11543
  let y = {};
11544
11544
  const E = b.map(async (A) => {
11545
11545
  let m;
@@ -11564,7 +11564,7 @@ const fw = async (r, e) => {
11564
11564
  if (t?.noEmbeddingFields)
11565
11565
  for (const A of f.fields)
11566
11566
  A.type === "Embedding" && delete y[A.name];
11567
- return await ae("postOperation", o, w, ["read", y, e, T]), await ae("postRead", o, w, [T, b, y, !1]), y;
11567
+ return await ae("postOperation", o, w, { operation: "read", data: y, docId: e, context: T }), await ae("postRead", o, w, { context: T, refs: b, doc: y, listener: !1 }), y;
11568
11568
  }, pw = (r) => r !== null && typeof r == "object", _m = (r) => {
11569
11569
  const e = (t) => {
11570
11570
  Object.entries(t).forEach(([n, s]) => {
@@ -11629,13 +11629,13 @@ const fw = async (r, e) => {
11629
11629
  }
11630
11630
  }
11631
11631
  }
11632
- const M = [
11633
- "update",
11634
- { ...g, ...t },
11635
- A,
11636
- O,
11637
- we(g)
11638
- ];
11632
+ const M = {
11633
+ operation: "update",
11634
+ record: { ...g, ...t },
11635
+ context: A,
11636
+ batch: O,
11637
+ originalRecord: we(g)
11638
+ };
11639
11639
  return await ae("preValidate", l, E, M), await gw(r, e, t, s ? { operation: s.operation, permissions: s.permissions, password: s.password } : void 0);
11640
11640
  }
11641
11641
  delete t.id;
@@ -11643,22 +11643,29 @@ const fw = async (r, e) => {
11643
11643
  for (const M of C)
11644
11644
  !_e(M) && ir(F[M.name]) && M.nullable && (F[M.name] = null);
11645
11645
  if (Nt(F), Nt(g), !v && I && Ye("update", "started", F, r, e, _, x.uid, void 0, g), !v) {
11646
- const M = [
11647
- "update",
11648
- F,
11649
- e,
11650
- A,
11651
- O,
11652
- we(g)
11653
- ];
11646
+ const M = {
11647
+ operation: "update",
11648
+ data: F,
11649
+ docId: e,
11650
+ context: A,
11651
+ batch: O,
11652
+ originalRecord: we(g)
11653
+ };
11654
11654
  await ae("preOperation", l, E, M);
11655
- const oe = ["update", F, e, A, O, we(g)];
11655
+ const oe = {
11656
+ operation: "update",
11657
+ data: F,
11658
+ docId: e,
11659
+ context: A,
11660
+ batch: O,
11661
+ originalRecord: we(g)
11662
+ };
11656
11663
  await ae("preWrite", l, E, oe);
11657
11664
  }
11658
11665
  if (Xd(_, F, a), eh(_, F), !v)
11659
11666
  try {
11660
11667
  const M = { ...g, ...F };
11661
- tr(M), await om("update", M, _, E, ["update", M, A, O, we(g)], a), P && (N(), await lc("update", e, F, _, d));
11668
+ tr(M), await om("update", M, _, E, { operation: "update", record: M, context: A, batch: O, originalRecord: we(g) }, a), P && (N(), await lc("update", e, F, _, d));
11662
11669
  } catch (M) {
11663
11670
  throw new Error(`VALIDATION_ERROR: ${M.message}`);
11664
11671
  }
@@ -11667,7 +11674,14 @@ const fw = async (r, e) => {
11667
11674
  return tr(M), { id: e, ...M };
11668
11675
  }
11669
11676
  I && Ye("update", "success", F, r, e, _, x.uid, void 0, g);
11670
- const U = ["update", F, e, A, !!v, we(g)], z = [...U];
11677
+ const U = {
11678
+ operation: "update",
11679
+ data: F,
11680
+ docId: e,
11681
+ context: A,
11682
+ retry: !!v,
11683
+ originalRecord: we(g)
11684
+ }, z = { ...U };
11671
11685
  await ae("postWrite", l, E, U), await ae("postOperation", l, E, z);
11672
11686
  const ee = { ...g, ...F };
11673
11687
  return tr(ee), { id: e, ...ee };
@@ -11722,17 +11736,17 @@ const fw = async (r, e) => {
11722
11736
  }
11723
11737
  }
11724
11738
  }
11725
- const y = C || T, E = [
11726
- r,
11727
- n,
11728
- t,
11729
- s,
11730
- y,
11731
- o,
11732
- f,
11733
- _,
11734
- r === "update" ? d : void 0
11735
- ], S = T.code === "unavailable", v = await ae("postWriteError", p, a, E);
11739
+ const y = C || T, E = {
11740
+ operation: r,
11741
+ data: n,
11742
+ docId: t,
11743
+ context: s,
11744
+ error: y,
11745
+ batch: o,
11746
+ retry: f,
11747
+ retries: _,
11748
+ originalRecord: r === "update" ? d : void 0
11749
+ }, S = T.code === "unavailable", v = await ae("postWriteError", p, a, E);
11736
11750
  if (v?.resolved)
11737
11751
  return;
11738
11752
  if (!S && v?.retry) {
@@ -11806,20 +11820,25 @@ const fw = async (r, e) => {
11806
11820
  }
11807
11821
  }
11808
11822
  }
11809
- return await ae("preValidate", o, I, ["create", e, A, g]), t?.onValid && t.onValid(), await yw(r, e, n ? { permissions: n.permissions, password: n.password } : void 0, O);
11823
+ return await ae("preValidate", o, I, {
11824
+ operation: "create",
11825
+ record: e,
11826
+ context: A,
11827
+ batch: g
11828
+ }), t?.onValid && t.onValid(), await yw(r, e, n ? { permissions: n.permissions, password: n.password } : void 0, O);
11810
11829
  }
11811
11830
  e.id = O;
11812
11831
  const m = Ko("create", r, e, i, y, zt(), S.uid, Bt.now(), Lr(), !!E);
11813
- if (T && (m[T.archivedField] = !1), Nt(m), !E && b && Ye("create", "started", m, r, O, p, S.uid), E || (await ae("preOperation", o, I, ["create", m, O, A, g]), await ae("preWrite", o, I, ["create", m, O, A, g])), Xd(p, m, i), eh(p, m), E || await hy(m, p, I, u.Role), !E)
11832
+ if (T && (m[T.archivedField] = !1), Nt(m), !E && b && Ye("create", "started", m, r, O, p, S.uid), E || (await ae("preOperation", o, I, { operation: "create", data: m, docId: O, context: A, batch: g }), await ae("preWrite", o, I, { operation: "create", data: m, docId: O, context: A, batch: g })), Xd(p, m, i), eh(p, m), E || await hy(m, p, I, u.Role), !E)
11814
11833
  try {
11815
- await om("create", m, p, I, ["create", m, A, g], i), v && (x(), await lc("create", O, m, p, u));
11834
+ await om("create", m, p, I, { operation: "create", record: m, context: A, batch: g }, i), v && (x(), await lc("create", O, m, p, u));
11816
11835
  } catch (N) {
11817
11836
  throw new Error(`VALIDATION_ERROR: ${N.message}`);
11818
11837
  }
11819
11838
  if (t?.onValid && t.onValid(), Nt(m), bg(m, O, p, i, S.uid, u), ac("create", g, r, O, m, i, p, t, a, Io, ko, Cn, (N) => ke(l, "tenants", s, "system_fields", w.collection, `${w.collection}-${N.name}`, O), (N, F) => ke(l, "tenants", s, "system_unique", w.collection, `Unique-${w.collection}-${N.name}`, F), (N) => ke(l, "tenants", s, "system_fields", w.collection, `${w.collection}-${N}`, O)), g.set(ke(l, "tenants", s, r.join("/"), O), m), !E && b && Ye("create", "written", m, r, O, p, S.uid), await dc("create", r, O, m, A, p, I, g, S.uid, b || !1, u, !!E), E?.type === "unique")
11820
11839
  return { id: O, ...m };
11821
11840
  b && Ye("create", "success", m, r, O, p, S.uid);
11822
- const R = ["create", m, O, A, !!E], k = [...R];
11841
+ const R = { operation: "create", data: m, docId: O, context: A, retry: !!E }, k = { ...R };
11823
11842
  return await ae("postWrite", o, I, R), await ae("postOperation", o, I, k), { id: O, ...m };
11824
11843
  }, _w = async (r, e) => {
11825
11844
  const t = it(), n = ze(), s = Ve(t, n.STOKER_FB_FUNCTIONS_REGION);
@@ -11866,8 +11885,8 @@ const fw = async (r, e) => {
11866
11885
  return await _w(r, e);
11867
11886
  delete x.id;
11868
11887
  const g = Ao(o), O = { collection: p.collection }, A = Ko("delete", r, x, s, I, zt(), E.uid, Bt.now(), Lr(), !!y);
11869
- Nt(A), !y && _ && Ye("delete", "started", A, r, e, h, E.uid), y || (await ae("preOperation", c, C, ["delete", A, e, O, g]), await ae("preWrite", c, C, ["delete", A, e, O, g])), Nt(A), Eg(A, e, h, s, E.uid, l), ac("delete", g, r, e, A, s, h, t, i, Io, ko, Cn, (N) => ke(o, "tenants", n, "system_fields", p.collection, `${p.collection}-${N.name}`, e), (N, F) => ke(o, "tenants", n, "system_unique", p.collection, `Unique-${p.collection}-${N.name}`, F), (N) => ke(o, "tenants", n, "system_fields", p.collection, `${p.collection}-${N}`, e)), g.delete(ke(o, "tenants", n, r.join("/"), e)), !y && _ && Ye("delete", "written", A, r, e, h, E.uid), await dc("delete", r, e, A, O, h, C, g, E.uid, _ || !1, l, !!y), _ && Ye("delete", "success", { ...A, ...y?.record || {} }, r, e, h, E.uid);
11870
- const R = ["delete", A, e, O, !!y], k = [...R];
11888
+ Nt(A), !y && _ && Ye("delete", "started", A, r, e, h, E.uid), y || (await ae("preOperation", c, C, { operation: "delete", data: A, docId: e, context: O, batch: g }), await ae("preWrite", c, C, { operation: "delete", data: A, docId: e, context: O, batch: g })), Nt(A), Eg(A, e, h, s, E.uid, l), ac("delete", g, r, e, A, s, h, t, i, Io, ko, Cn, (N) => ke(o, "tenants", n, "system_fields", p.collection, `${p.collection}-${N.name}`, e), (N, F) => ke(o, "tenants", n, "system_unique", p.collection, `Unique-${p.collection}-${N.name}`, F), (N) => ke(o, "tenants", n, "system_fields", p.collection, `${p.collection}-${N}`, e)), g.delete(ke(o, "tenants", n, r.join("/"), e)), !y && _ && Ye("delete", "written", A, r, e, h, E.uid), await dc("delete", r, e, A, O, h, C, g, E.uid, _ || !1, l, !!y), _ && Ye("delete", "success", { ...A, ...y?.record || {} }, r, e, h, E.uid);
11889
+ const R = { operation: "delete", data: A, docId: e, context: O, retry: !!y }, k = { ...R };
11871
11890
  return await ae("postWrite", c, C, R), await ae("postOperation", c, C, k), { id: e, ...A };
11872
11891
  }, wm = (r) => {
11873
11892
  if (typeof r == "object")
@@ -12414,7 +12433,7 @@ const Gw = async (r, e, t, n) => {
12414
12433
  if (C.length === 0)
12415
12434
  throw new Error("PERMISSION_DENIED");
12416
12435
  const I = h?.roles?.includes(a.Role), y = { collection: d.collection };
12417
- await ae("preOperation", p, b, ["read", void 0, e, y]), await ae("preRead", p, b, [y, C, !1, !0]);
12436
+ await ae("preOperation", p, b, { operation: "read", docId: e, context: y }), await ae("preRead", p, b, { context: y, refs: C, multiple: !1, listener: !0 });
12418
12437
  const v = /* @__PURE__ */ new Map(), x = [];
12419
12438
  let g = {};
12420
12439
  const O = /* @__PURE__ */ new Map();
@@ -12490,17 +12509,17 @@ const Gw = async (r, e, t, n) => {
12490
12509
  z.set(`${M.name}_${ie}`, !0), m.delete(`${M.name}_${ie}`);
12491
12510
  return;
12492
12511
  }
12493
- oe[ie] = K, z.set(`${M.name}_${ie}`, !0), Array.from(z.values()).every(($) => $) && (F({}), A(), N.fromCache === !1 && (ae("postOperation", p, b, [
12494
- "read",
12495
- g,
12496
- e,
12497
- y
12498
- ]), ae("postRead", p, b, [
12499
- y,
12500
- C,
12501
- g,
12502
- !0
12503
- ])));
12512
+ oe[ie] = K, z.set(`${M.name}_${ie}`, !0), Array.from(z.values()).every(($) => $) && (F({}), A(), N.fromCache === !1 && (ae("postOperation", p, b, {
12513
+ operation: "read",
12514
+ data: g,
12515
+ docId: e,
12516
+ context: y
12517
+ }), ae("postRead", p, b, {
12518
+ context: y,
12519
+ refs: C,
12520
+ doc: g,
12521
+ listener: !0
12522
+ })));
12504
12523
  }).catch((K) => {
12505
12524
  delete oe[ie], K.code !== "permission-denied" && n && n(new Error(`Error fetching relation document in collection ${M.collection} with ID ${e} at location ${Me.Collection_Path?.join("/")}`, {
12506
12525
  cause: K
@@ -12517,17 +12536,17 @@ const Gw = async (r, e, t, n) => {
12517
12536
  R.get(`${M.name}_${ie}`) && R.get(`${M.name}_${ie}`).listener(), z.set(`${M.name}_${ie}`, !0), m.delete(`${M.name}_${ie}`);
12518
12537
  return;
12519
12538
  }
12520
- oe[ie] = K, z.set(`${M.name}_${ie}`, !0), Array.from(z.values()).every(($) => $) && (F({}), A(), N.fromCache === !1 && (ae("postOperation", p, b, [
12521
- "read",
12522
- g,
12523
- e,
12524
- y
12525
- ]), ae("postRead", p, b, [
12526
- y,
12527
- C,
12528
- g,
12529
- !0
12530
- ])));
12539
+ oe[ie] = K, z.set(`${M.name}_${ie}`, !0), Array.from(z.values()).every(($) => $) && (F({}), A(), N.fromCache === !1 && (ae("postOperation", p, b, {
12540
+ operation: "read",
12541
+ data: g,
12542
+ docId: e,
12543
+ context: y
12544
+ }), ae("postRead", p, b, {
12545
+ context: y,
12546
+ refs: C,
12547
+ doc: g,
12548
+ listener: !0
12549
+ })));
12531
12550
  },
12532
12551
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
12533
12552
  (K) => {
@@ -12563,14 +12582,19 @@ const Gw = async (r, e, t, n) => {
12563
12582
  v.set(N.path, !0), g ||= {}, g.id ||= U.id, g = { ...g, ...z }, delete g.Collection_Path_String;
12564
12583
  const ee = O.get(N) || /* @__PURE__ */ new Set();
12565
12584
  lm(z, ee), O.set(N, ee), v.size === C.length && P(U.metadata).then(() => {
12566
- A(), U.metadata.fromCache === !1 && (ae("postOperation", p, b, [
12567
- "read",
12568
- g,
12569
- e,
12570
- y
12571
- ]), ae("postRead", p, b, [y, C, g, !0]));
12585
+ A(), U.metadata.fromCache === !1 && (ae("postOperation", p, b, {
12586
+ operation: "read",
12587
+ data: g,
12588
+ docId: e,
12589
+ context: y
12590
+ }), ae("postRead", p, b, {
12591
+ context: y,
12592
+ refs: C,
12593
+ doc: g,
12594
+ listener: !0
12595
+ }));
12572
12596
  });
12573
- } else g && (g = void 0, A(), U.metadata.fromCache === !1 && (ae("postOperation", p, b, ["read", void 0, e, y]), ae("postRead", p, b, [y, C, void 0, !0])));
12597
+ } else g && (g = void 0, A(), U.metadata.fromCache === !1 && (ae("postOperation", p, b, { operation: "read", docId: e, context: y }), ae("postRead", p, b, { context: y, refs: C, listener: !0 })));
12574
12598
  }, (U) => {
12575
12599
  n && n(U), x.forEach((z) => z());
12576
12600
  });
@@ -12656,7 +12680,7 @@ const Gw = async (r, e, t, n) => {
12656
12680
  });
12657
12681
  }
12658
12682
  const x = { collection: d.collection };
12659
- await ae("preOperation", _, C, ["read", void 0, void 0, x]), await ae("preRead", _, C, [x, S, !0, !0]);
12683
+ await ae("preOperation", _, C, { operation: "read", context: x }), await ae("preRead", _, C, { context: x, refs: S, multiple: !0, listener: !0 });
12660
12684
  let A = !0;
12661
12685
  const m = /* @__PURE__ */ new Map(), R = /* @__PURE__ */ new Map(), k = [], P = /* @__PURE__ */ new Map(), N = /* @__PURE__ */ new Map(), F = /* @__PURE__ */ new Map(), U = (G, K, $) => {
12662
12686
  const Y = [];
@@ -12668,8 +12692,13 @@ const Gw = async (r, e, t, n) => {
12668
12692
  })), n?.noEmbeddingFields && Z.type === "Embedding" && delete j[Z.name];
12669
12693
  }), Promise.all(Y).then(() => {
12670
12694
  e(Array.from(P.values()), G, K), K?.fromCache === !1 && P.forEach((j) => {
12671
- const Z = ["read", j, j.id, x];
12672
- ae("postOperation", _, C, Z), ae("postRead", _, C, [x, E, j, !0]);
12695
+ const Z = {
12696
+ operation: "read",
12697
+ data: j,
12698
+ docId: j.id,
12699
+ context: x
12700
+ };
12701
+ ae("postOperation", _, C, Z), ae("postRead", _, C, { context: x, refs: E, doc: j, listener: !0 });
12673
12702
  });
12674
12703
  });
12675
12704
  }, z = (G, K) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stoker-platform/web-client",
3
- "version": "0.5.44",
3
+ "version": "0.5.45",
4
4
  "type": "module",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "files": [
@@ -24,8 +24,8 @@
24
24
  "test": "echo \"Error: no test specified\""
25
25
  },
26
26
  "dependencies": {
27
- "@stoker-platform/types": "0.5.28",
28
- "@stoker-platform/utils": "0.5.37",
27
+ "@stoker-platform/types": "0.5.29",
28
+ "@stoker-platform/utils": "0.5.38",
29
29
  "@types/lodash": "^4.17.24",
30
30
  "@types/luxon": "^3.7.1",
31
31
  "firebase": "^12.11.0",