@oneclick.dev/cms-core-modules 0.0.83 → 0.0.84
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/dist/{ContentEditor-CxKirDdL.mjs → ContentEditor-DPhhOkx3.mjs} +7068 -5926
- package/dist/{ContentEditor-CRFkD4tE.js → ContentEditor-DrxtH_Hq.js} +42 -42
- package/dist/{Create-CsqVYhPO.mjs → Create-6uT9HWar.mjs} +35 -35
- package/dist/{Create-ip0MnS0o.js → Create-DuZ5nZrX.js} +1 -1
- package/dist/{DateFormatter-CvOfaUnU.mjs → DateFormatter-2B0R-DY4.mjs} +204 -400
- package/dist/DateFormatter-DbtOLV0L.js +1 -0
- package/dist/{Detail-RMXFuSRQ.js → Detail-BZ-iE9vf.js} +1 -1
- package/dist/{Detail-B4b_FLDa.mjs → Detail-C1Blq61w.mjs} +90 -90
- package/dist/{Detail-BayNaAg9.js → Detail-C8wQiDcv.js} +1 -1
- package/dist/{Detail-CbLk1v37.mjs → Detail-CJVMJDP7.mjs} +17 -17
- package/dist/{Detail-CnK-qbhE.js → Detail-CPqug27l.js} +1 -1
- package/dist/Detail-CjuhjPby.js +1 -0
- package/dist/{Detail-U0mgLKt6.mjs → Detail-CtItxMX4.mjs} +62 -63
- package/dist/{Detail-CVgWHbMC.mjs → Detail-Dnpnmy4-.mjs} +158 -158
- package/dist/{Entries-D7MHylQE.mjs → Entries-BkOPae4R.mjs} +49 -49
- package/dist/Entries-CcEW98F5.js +1 -0
- package/dist/{NewReservationDialog.vue_vue_type_script_setup_true_lang-CDc8MIq2.mjs → NewReservationDialog.vue_vue_type_script_setup_true_lang-Bc946oSc.mjs} +1 -1
- package/dist/{NewReservationDialog.vue_vue_type_script_setup_true_lang-StaNp-3y.js → NewReservationDialog.vue_vue_type_script_setup_true_lang-CqERfyYb.js} +1 -1
- package/dist/{Overview-CwCAeBnX.js → Overview-CA8wh_BI.js} +1 -1
- package/dist/{Overview-CgViRnNc.mjs → Overview-D4MFwRI_.mjs} +67 -68
- package/dist/{Overview-B2bFNGhH.js → Overview-Da0XexiT.js} +1 -1
- package/dist/Overview-DeQQ0FY3.js +1 -0
- package/dist/{Overview--XpvBbqz.mjs → Overview-DoOASlNz.mjs} +1 -3
- package/dist/{Overview-Cczt_dcE.mjs → Overview-gJSvftdE.mjs} +34 -34
- package/dist/{ReservationDetailDialog.vue_vue_type_script_setup_true_lang-B7ks5mbf.mjs → ReservationDetailDialog.vue_vue_type_script_setup_true_lang-Cohhnd5x.mjs} +0 -1
- package/dist/{ReservationDetailDialog.vue_vue_type_script_setup_true_lang-Vxubki_v.js → ReservationDetailDialog.vue_vue_type_script_setup_true_lang-VWVIxIr6.js} +1 -1
- package/dist/{SeoHealth-ZpvB7CS2.mjs → SeoHealth-Bc5chnaa.mjs} +14 -14
- package/dist/{SeoHealth-DFZ0LLBH.js → SeoHealth-BkpJ1F2Y.js} +1 -1
- package/dist/TableView-BPWAx--G.mjs +5743 -0
- package/dist/TableView-D63QrVlK.js +4 -0
- package/dist/View-BL70u98U.js +1 -0
- package/dist/{View-DDXN0tKD.mjs → View-BO5N911y.mjs} +5 -5
- package/dist/{agenda-Cl3s_FIE.mjs → agenda-C5grvzSa.mjs} +166 -169
- package/dist/agenda-DXMwVWpN.js +1 -0
- package/dist/{availability-B-tRp8hB.mjs → availability-C1NqOFsQ.mjs} +81 -81
- package/dist/{availability-BiBbzEIM.js → availability-D_wnfLsH.js} +1 -1
- package/dist/cms-core-modules.css +1 -1
- package/dist/{exceptions-DQPSFSj7.mjs → exceptions-BIwMhYa4.mjs} +1 -1
- package/dist/{exceptions-BA3PsW4n.js → exceptions-Cn7zooEu.js} +1 -1
- package/dist/{index-CBC9dWZ9.js → index-C9pSS15N.js} +2 -2
- package/dist/{index-YOOlBEZB.mjs → index-MwjeLHPP.mjs} +3 -3
- package/dist/index.cjs.js +1 -1
- package/dist/index.mjs +22 -22
- package/dist/orders-CG1QUCN8.js +1 -0
- package/dist/{orders-DZzdsHOW.mjs → orders-CeixEBcU.mjs} +57 -58
- package/dist/server-handlers.cjs.js +1 -1
- package/dist/server-handlers.mjs +142 -147
- package/package.json +2 -2
- package/dist/DateFormatter-ls6HfWpS.js +0 -1
- package/dist/Detail-BcboL7NF.js +0 -1
- package/dist/Entries-BPkZ7Jg5.js +0 -1
- package/dist/Overview-B-8TLLjh.js +0 -1
- package/dist/TableView-BUPPcHUW.mjs +0 -89505
- package/dist/TableView-CksiPsTL.js +0 -586
- package/dist/View-DfzaVOzS.js +0 -1
- package/dist/agenda-rlFma_wn.js +0 -1
- package/dist/floating-ui.dom-B9WYoHj2.js +0 -1
- package/dist/floating-ui.dom-fpIfhXTZ.mjs +0 -1291
- package/dist/index-DYpruS-A-Cw57iwdY.mjs +0 -4210
- package/dist/index-DYpruS-A-DwDXo9Tq.js +0 -88
- package/dist/index-YMaY4uuk-BgpTtr73.js +0 -1
- package/dist/index-YMaY4uuk-C_xV5K9Z.mjs +0 -1300
- package/dist/orders-tP4WdF5q.js +0 -1
package/dist/server-handlers.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { createRouter as
|
|
1
|
+
import { createRouter as v, defineEventHandler as y, createError as w, getRouterParam as N, getQuery as D } from "h3";
|
|
2
2
|
import "vue";
|
|
3
|
-
function
|
|
4
|
-
const { initFirebase: R, normalizeTimestamps: A } = f, g =
|
|
5
|
-
async function
|
|
6
|
-
const { supabase: c, instanceId:
|
|
3
|
+
function $(f) {
|
|
4
|
+
const { initFirebase: R, normalizeTimestamps: A } = f, g = v();
|
|
5
|
+
async function m(d) {
|
|
6
|
+
const { supabase: c, instanceId: l } = d.context.module, { data: e, error: a } = await c.from("project_modules").select("config").eq("id", l).single();
|
|
7
7
|
if (a || !e?.config)
|
|
8
8
|
throw w({ statusCode: 500, statusMessage: "Failed to load module config." });
|
|
9
9
|
const n = e.config, t = n.project, s = n.productCollection || "products";
|
|
@@ -13,8 +13,8 @@ function O(f) {
|
|
|
13
13
|
}
|
|
14
14
|
return g.get("/products", y(async (d) => {
|
|
15
15
|
try {
|
|
16
|
-
const { firebase: c, collection:
|
|
17
|
-
return (await c.firestore().collection(
|
|
16
|
+
const { firebase: c, collection: l } = await m(d);
|
|
17
|
+
return (await c.firestore().collection(l).get()).docs.map((a) => A({
|
|
18
18
|
id: a.id,
|
|
19
19
|
...a.data()
|
|
20
20
|
}));
|
|
@@ -29,25 +29,25 @@ function O(f) {
|
|
|
29
29
|
if (!c)
|
|
30
30
|
throw w({ statusCode: 400, statusMessage: "Product ID is required." });
|
|
31
31
|
try {
|
|
32
|
-
const { firebase:
|
|
32
|
+
const { firebase: l, collection: e } = await m(d), a = await l.firestore().collection(e).doc(c).get();
|
|
33
33
|
if (!a.exists)
|
|
34
34
|
throw w({ statusCode: 404, statusMessage: "Product not found." });
|
|
35
35
|
return A({
|
|
36
36
|
id: a.id,
|
|
37
37
|
...a.data()
|
|
38
38
|
});
|
|
39
|
-
} catch (
|
|
40
|
-
throw console.error("Products handler — get error:",
|
|
41
|
-
statusCode:
|
|
42
|
-
statusMessage:
|
|
39
|
+
} catch (l) {
|
|
40
|
+
throw console.error("Products handler — get error:", l), w({
|
|
41
|
+
statusCode: l.statusCode || 500,
|
|
42
|
+
statusMessage: l.statusMessage || "Failed to get product"
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
45
|
})), g.get("/empty-stock", y(async (d) => {
|
|
46
|
-
const
|
|
46
|
+
const l = D(d).category;
|
|
47
47
|
try {
|
|
48
|
-
const { firebase: e, collection: a } = await
|
|
48
|
+
const { firebase: e, collection: a } = await m(d);
|
|
49
49
|
let n = e.firestore().collection(a).where("stock", "==", 0);
|
|
50
|
-
|
|
50
|
+
l && (n = n.where("collections", "array-contains", l));
|
|
51
51
|
const s = (await n.get()).docs.map((o) => A({
|
|
52
52
|
id: o.id,
|
|
53
53
|
...o.data()
|
|
@@ -72,10 +72,10 @@ function O(f) {
|
|
|
72
72
|
}
|
|
73
73
|
})), g.handler;
|
|
74
74
|
}
|
|
75
|
-
function
|
|
76
|
-
const { initFirebase: R, normalizeTimestamps: A } = f, g =
|
|
77
|
-
async function
|
|
78
|
-
const { supabase:
|
|
75
|
+
function x(f) {
|
|
76
|
+
const { initFirebase: R, normalizeTimestamps: A } = f, g = v();
|
|
77
|
+
async function m(c) {
|
|
78
|
+
const { supabase: l, instanceId: e } = c.context.module, { data: a, error: n } = await l.from("project_modules").select("config").eq("id", e).single();
|
|
79
79
|
if (n || !a?.config)
|
|
80
80
|
throw w({ statusCode: 500, statusMessage: "Failed to load module config." });
|
|
81
81
|
const t = a.config, s = t.project, o = t.reservationsCollection || "bookings_orders", r = t.agendaCollection || "agendas";
|
|
@@ -105,9 +105,9 @@ function G(f) {
|
|
|
105
105
|
}));
|
|
106
106
|
}
|
|
107
107
|
return g.get("/appointments", y(async (c) => {
|
|
108
|
-
const
|
|
108
|
+
const l = D(c), e = Math.min(Number(l.quantity) || 20, 100);
|
|
109
109
|
try {
|
|
110
|
-
const { firebase: a, reservationsCollection: n } = await
|
|
110
|
+
const { firebase: a, reservationsCollection: n } = await m(c), s = (await a.firestore().collection(n).orderBy("createdAt", "desc").limit(e).get()).docs.flatMap(
|
|
111
111
|
(o) => d(A({ id: o.id, ...o.data() }))
|
|
112
112
|
);
|
|
113
113
|
return {
|
|
@@ -121,16 +121,16 @@ function G(f) {
|
|
|
121
121
|
});
|
|
122
122
|
}
|
|
123
123
|
})), g.get("/appointments/find", y(async (c) => {
|
|
124
|
-
const
|
|
124
|
+
const l = D(c), e = (l.name || "").toLowerCase().trim(), a = (l.email || "").toLowerCase().trim(), n = l.date;
|
|
125
125
|
try {
|
|
126
|
-
const { firebase: t, reservationsCollection: s } = await
|
|
126
|
+
const { firebase: t, reservationsCollection: s } = await m(c);
|
|
127
127
|
let o = t.firestore().collection(s);
|
|
128
128
|
a && (o = o.where("customerInfo.email", "==", a));
|
|
129
129
|
let i = (await o.orderBy("createdAt", "desc").limit(200).get()).docs.flatMap(
|
|
130
|
-
(
|
|
130
|
+
(u) => d(A({ id: u.id, ...u.data() }))
|
|
131
131
|
);
|
|
132
|
-
return n && (i = i.filter((
|
|
133
|
-
const p = (
|
|
132
|
+
return n && (i = i.filter((u) => u.date === n)), e && (i = i.filter((u) => {
|
|
133
|
+
const p = (u.customerInfo?.firstName || "").toLowerCase(), h = (u.customerInfo?.lastName || "").toLowerCase();
|
|
134
134
|
return p.includes(e) || h.includes(e) || `${p} ${h}`.includes(e);
|
|
135
135
|
})), {
|
|
136
136
|
count: i.length,
|
|
@@ -143,13 +143,11 @@ function G(f) {
|
|
|
143
143
|
});
|
|
144
144
|
}
|
|
145
145
|
})), g.get("/appointments/:appointmentId", y(async (c) => {
|
|
146
|
-
const
|
|
147
|
-
if (!
|
|
146
|
+
const l = N(c, "appointmentId");
|
|
147
|
+
if (!l)
|
|
148
148
|
throw w({ statusCode: 400, statusMessage: "Appointment ID is required." });
|
|
149
149
|
try {
|
|
150
|
-
const { firebase: e, reservationsCollection: a } = await
|
|
151
|
-
console.log("Fetching appointment with ID:", m, a);
|
|
152
|
-
const n = await e.firestore().collection(a).doc(m).get();
|
|
150
|
+
const { firebase: e, reservationsCollection: a } = await m(c), n = await e.firestore().collection(a).doc(l).get();
|
|
153
151
|
if (!n.exists)
|
|
154
152
|
throw w({ statusCode: 404, statusMessage: "Appointment not found." });
|
|
155
153
|
const t = A({ id: n.id, ...n.data() });
|
|
@@ -165,17 +163,17 @@ function G(f) {
|
|
|
165
163
|
}
|
|
166
164
|
})), g.handler;
|
|
167
165
|
}
|
|
168
|
-
const
|
|
166
|
+
const M = "https://analyticsdata.googleapis.com/v1beta", F = [
|
|
169
167
|
"https://www.googleapis.com/auth/analytics.readonly",
|
|
170
168
|
"https://www.googleapis.com/auth/webmasters.readonly"
|
|
171
169
|
], b = "https://searchconsole.googleapis.com/webmasters/v3";
|
|
172
|
-
function
|
|
173
|
-
const { decrypt: R, getGoogleAccessToken: A } = f, g =
|
|
174
|
-
async function
|
|
170
|
+
function G(f) {
|
|
171
|
+
const { decrypt: R, getGoogleAccessToken: A } = f, g = v();
|
|
172
|
+
async function m(e) {
|
|
175
173
|
const { supabase: a, instanceId: n } = e.context.module, { data: t, error: s } = await a.from("project_modules").select("config").eq("id", n).single();
|
|
176
174
|
if (s || !t?.config)
|
|
177
175
|
throw w({ statusCode: 500, statusMessage: "Failed to load module config." });
|
|
178
|
-
const o = t.config, r = o.propertyId, i = o.serviceAccount,
|
|
176
|
+
const o = t.config, r = o.propertyId, i = o.serviceAccount, u = o.siteUrl || "";
|
|
179
177
|
if (!i)
|
|
180
178
|
throw w({ statusCode: 400, statusMessage: "No Google Service Account configured for this module." });
|
|
181
179
|
if (!r)
|
|
@@ -183,19 +181,19 @@ function x(f) {
|
|
|
183
181
|
const { data: p, error: h } = await a.from("integrations").select("config").eq("id", i).single();
|
|
184
182
|
let C = p?.config;
|
|
185
183
|
if (h || !C) {
|
|
186
|
-
const { data:
|
|
187
|
-
if (U || !
|
|
184
|
+
const { data: q, error: U } = await a.from("agency_integrations").select("config").eq("id", i).single();
|
|
185
|
+
if (U || !q?.config)
|
|
188
186
|
throw w({ statusCode: 500, statusMessage: "Failed to load Google Service Account credentials." });
|
|
189
|
-
C =
|
|
187
|
+
C = q.config;
|
|
190
188
|
}
|
|
191
|
-
const
|
|
189
|
+
const k = R(C.clientEmail), P = R(C.privateKey), S = R(C.projectId);
|
|
192
190
|
return { accessToken: await A(
|
|
193
|
-
{ clientEmail:
|
|
191
|
+
{ clientEmail: k, privateKey: P, projectId: S },
|
|
194
192
|
F
|
|
195
|
-
), propertyId: r, siteUrl:
|
|
193
|
+
), propertyId: r, siteUrl: u };
|
|
196
194
|
}
|
|
197
195
|
async function d(e, a, n) {
|
|
198
|
-
const t = await fetch(`${
|
|
196
|
+
const t = await fetch(`${M}/properties/${a}:runReport`, {
|
|
199
197
|
method: "POST",
|
|
200
198
|
headers: {
|
|
201
199
|
Authorization: `Bearer ${e}`,
|
|
@@ -215,7 +213,7 @@ function x(f) {
|
|
|
215
213
|
g.get(
|
|
216
214
|
"/report",
|
|
217
215
|
y(async (e) => {
|
|
218
|
-
const { accessToken: a, propertyId: n } = await
|
|
216
|
+
const { accessToken: a, propertyId: n } = await m(e), t = D(e), s = t.startDate || "30daysAgo", o = t.endDate || "today", r = s.match(/^(\d+)daysAgo$/), i = r ? parseInt(r[1], 10) : 30, u = `${i * 2}daysAgo`, p = `${i + 1}daysAgo`, h = [
|
|
219
217
|
{ name: "sessions" },
|
|
220
218
|
{ name: "totalUsers" },
|
|
221
219
|
{ name: "screenPageViews" },
|
|
@@ -226,12 +224,12 @@ function x(f) {
|
|
|
226
224
|
{ name: "sessionsPerUser" },
|
|
227
225
|
{ name: "screenPageViewsPerSession" }
|
|
228
226
|
];
|
|
229
|
-
let C,
|
|
227
|
+
let C, k = !0;
|
|
230
228
|
try {
|
|
231
229
|
C = await d(a, n, {
|
|
232
230
|
dateRanges: [
|
|
233
231
|
{ startDate: s, endDate: o, name: "current" },
|
|
234
|
-
{ startDate:
|
|
232
|
+
{ startDate: u, endDate: p, name: "previous" }
|
|
235
233
|
],
|
|
236
234
|
dimensions: [{ name: "date" }],
|
|
237
235
|
metrics: h,
|
|
@@ -239,7 +237,7 @@ function x(f) {
|
|
|
239
237
|
orderBys: [{ dimension: { dimensionName: "date" } }]
|
|
240
238
|
});
|
|
241
239
|
} catch {
|
|
242
|
-
|
|
240
|
+
k = !1, C = await d(a, n, {
|
|
243
241
|
dateRanges: [{ startDate: s, endDate: o }],
|
|
244
242
|
dimensions: [{ name: "date" }],
|
|
245
243
|
metrics: h,
|
|
@@ -247,13 +245,13 @@ function x(f) {
|
|
|
247
245
|
orderBys: [{ dimension: { dimensionName: "date" } }]
|
|
248
246
|
});
|
|
249
247
|
}
|
|
250
|
-
return V(C,
|
|
248
|
+
return V(C, k);
|
|
251
249
|
})
|
|
252
250
|
), g.get(
|
|
253
251
|
"/realtime",
|
|
254
252
|
y(async (e) => {
|
|
255
|
-
const { accessToken: a, propertyId: n } = await
|
|
256
|
-
`${
|
|
253
|
+
const { accessToken: a, propertyId: n } = await m(e), t = await fetch(
|
|
254
|
+
`${M}/properties/${n}:runRealtimeReport`,
|
|
257
255
|
{
|
|
258
256
|
method: "POST",
|
|
259
257
|
headers: {
|
|
@@ -273,7 +271,7 @@ function x(f) {
|
|
|
273
271
|
throw w({ statusCode: t.status, statusMessage: i?.error?.message || "Realtime API failed" });
|
|
274
272
|
}
|
|
275
273
|
const s = await t.json(), o = (s?.rows || []).reduce(
|
|
276
|
-
(i,
|
|
274
|
+
(i, u) => i + parseInt(u.metricValues?.[0]?.value || "0", 10),
|
|
277
275
|
0
|
|
278
276
|
), r = (s?.rows || []).map((i) => ({
|
|
279
277
|
page: i.dimensionValues?.[0]?.value || "(not set)",
|
|
@@ -284,7 +282,7 @@ function x(f) {
|
|
|
284
282
|
), g.get(
|
|
285
283
|
"/top-pages",
|
|
286
284
|
y(async (e) => {
|
|
287
|
-
const { accessToken: a, propertyId: n } = await
|
|
285
|
+
const { accessToken: a, propertyId: n } = await m(e), t = D(e), s = t.startDate || "30daysAgo", o = t.endDate || "today", r = parseInt(t.limit || "10", 10), i = await d(a, n, {
|
|
288
286
|
dateRanges: [{ startDate: s, endDate: o }],
|
|
289
287
|
dimensions: [{ name: "pagePath" }],
|
|
290
288
|
metrics: [
|
|
@@ -295,22 +293,22 @@ function x(f) {
|
|
|
295
293
|
orderBys: [{ metric: { metricName: "screenPageViews" }, desc: !0 }],
|
|
296
294
|
limit: r * 2
|
|
297
295
|
// fetch extra to account for duplicates before aggregation
|
|
298
|
-
}),
|
|
299
|
-
for (const C of
|
|
300
|
-
const
|
|
301
|
-
if (
|
|
302
|
-
|
|
303
|
-
const
|
|
304
|
-
|
|
296
|
+
}), u = I(i, "pagePath"), p = /* @__PURE__ */ new Map();
|
|
297
|
+
for (const C of u.rows) {
|
|
298
|
+
const k = C.pagePath.toLowerCase().replace(/\/+$/, ""), P = p.get(k);
|
|
299
|
+
if (P) {
|
|
300
|
+
P.screenPageViews += C.screenPageViews || 0, P.totalUsers += C.totalUsers || 0;
|
|
301
|
+
const S = P.screenPageViews;
|
|
302
|
+
S > 0 && (P.averageSessionDuration = (P.averageSessionDuration * (S - (C.screenPageViews || 0)) + (C.averageSessionDuration || 0) * (C.screenPageViews || 0)) / S);
|
|
305
303
|
} else
|
|
306
|
-
p.set(
|
|
304
|
+
p.set(k, { ...C });
|
|
307
305
|
}
|
|
308
|
-
return { rows: [...p.values()].sort((C,
|
|
306
|
+
return { rows: [...p.values()].sort((C, k) => (k.screenPageViews || 0) - (C.screenPageViews || 0)).slice(0, r), rowCount: u.rowCount };
|
|
309
307
|
})
|
|
310
308
|
), g.get(
|
|
311
309
|
"/top-sources",
|
|
312
310
|
y(async (e) => {
|
|
313
|
-
const { accessToken: a, propertyId: n } = await
|
|
311
|
+
const { accessToken: a, propertyId: n } = await m(e), t = D(e), s = t.startDate || "30daysAgo", o = t.endDate || "today", r = await d(a, n, {
|
|
314
312
|
dateRanges: [{ startDate: s, endDate: o }],
|
|
315
313
|
dimensions: [{ name: "sessionSource" }],
|
|
316
314
|
metrics: [
|
|
@@ -325,7 +323,7 @@ function x(f) {
|
|
|
325
323
|
), g.get(
|
|
326
324
|
"/devices",
|
|
327
325
|
y(async (e) => {
|
|
328
|
-
const { accessToken: a, propertyId: n } = await
|
|
326
|
+
const { accessToken: a, propertyId: n } = await m(e), t = D(e), s = t.startDate || "30daysAgo", o = t.endDate || "today", r = await d(a, n, {
|
|
329
327
|
dateRanges: [{ startDate: s, endDate: o }],
|
|
330
328
|
dimensions: [{ name: "deviceCategory" }],
|
|
331
329
|
metrics: [
|
|
@@ -339,7 +337,7 @@ function x(f) {
|
|
|
339
337
|
), g.get(
|
|
340
338
|
"/countries",
|
|
341
339
|
y(async (e) => {
|
|
342
|
-
const { accessToken: a, propertyId: n } = await
|
|
340
|
+
const { accessToken: a, propertyId: n } = await m(e), t = D(e), s = t.startDate || "30daysAgo", o = t.endDate || "today", r = await d(a, n, {
|
|
343
341
|
dateRanges: [{ startDate: s, endDate: o }],
|
|
344
342
|
dimensions: [{ name: "country" }],
|
|
345
343
|
metrics: [
|
|
@@ -354,7 +352,7 @@ function x(f) {
|
|
|
354
352
|
), g.get(
|
|
355
353
|
"/acquisition/channels",
|
|
356
354
|
y(async (e) => {
|
|
357
|
-
const { accessToken: a, propertyId: n } = await
|
|
355
|
+
const { accessToken: a, propertyId: n } = await m(e), t = D(e), s = t.startDate || "30daysAgo", o = t.endDate || "today", r = await d(a, n, {
|
|
358
356
|
dateRanges: [{ startDate: s, endDate: o }],
|
|
359
357
|
dimensions: [{ name: "sessionDefaultChannelGroup" }],
|
|
360
358
|
metrics: [
|
|
@@ -374,7 +372,7 @@ function x(f) {
|
|
|
374
372
|
), g.get(
|
|
375
373
|
"/acquisition/source-medium",
|
|
376
374
|
y(async (e) => {
|
|
377
|
-
const { accessToken: a, propertyId: n } = await
|
|
375
|
+
const { accessToken: a, propertyId: n } = await m(e), t = D(e), s = t.startDate || "30daysAgo", o = t.endDate || "today", r = await d(a, n, {
|
|
378
376
|
dateRanges: [{ startDate: s, endDate: o }],
|
|
379
377
|
dimensions: [{ name: "sessionSourceMedium" }],
|
|
380
378
|
metrics: [
|
|
@@ -393,7 +391,7 @@ function x(f) {
|
|
|
393
391
|
), g.get(
|
|
394
392
|
"/acquisition/referrals",
|
|
395
393
|
y(async (e) => {
|
|
396
|
-
const { accessToken: a, propertyId: n } = await
|
|
394
|
+
const { accessToken: a, propertyId: n } = await m(e), t = D(e), s = t.startDate || "30daysAgo", o = t.endDate || "today", r = await d(a, n, {
|
|
397
395
|
dateRanges: [{ startDate: s, endDate: o }],
|
|
398
396
|
dimensions: [{ name: "sessionSource" }],
|
|
399
397
|
dimensionFilter: {
|
|
@@ -416,7 +414,7 @@ function x(f) {
|
|
|
416
414
|
), g.get(
|
|
417
415
|
"/acquisition/campaigns",
|
|
418
416
|
y(async (e) => {
|
|
419
|
-
const { accessToken: a, propertyId: n } = await
|
|
417
|
+
const { accessToken: a, propertyId: n } = await m(e), t = D(e), s = t.startDate || "30daysAgo", o = t.endDate || "today", r = await d(a, n, {
|
|
420
418
|
dateRanges: [{ startDate: s, endDate: o }],
|
|
421
419
|
dimensions: [{ name: "sessionCampaignName" }],
|
|
422
420
|
dimensionFilter: {
|
|
@@ -441,7 +439,7 @@ function x(f) {
|
|
|
441
439
|
), g.get(
|
|
442
440
|
"/content/all-pages",
|
|
443
441
|
y(async (e) => {
|
|
444
|
-
const { accessToken: a, propertyId: n } = await
|
|
442
|
+
const { accessToken: a, propertyId: n } = await m(e), t = D(e), s = t.startDate || "30daysAgo", o = t.endDate || "today", r = parseInt(t.limit || "50", 10), i = await d(a, n, {
|
|
445
443
|
dateRanges: [{ startDate: s, endDate: o }],
|
|
446
444
|
dimensions: [{ name: "pagePath" }],
|
|
447
445
|
metrics: [
|
|
@@ -461,7 +459,7 @@ function x(f) {
|
|
|
461
459
|
), g.get(
|
|
462
460
|
"/content/landing-pages",
|
|
463
461
|
y(async (e) => {
|
|
464
|
-
const { accessToken: a, propertyId: n } = await
|
|
462
|
+
const { accessToken: a, propertyId: n } = await m(e), t = D(e), s = t.startDate || "30daysAgo", o = t.endDate || "today", r = await d(a, n, {
|
|
465
463
|
dateRanges: [{ startDate: s, endDate: o }],
|
|
466
464
|
dimensions: [{ name: "landingPagePlusQueryString" }],
|
|
467
465
|
metrics: [
|
|
@@ -480,7 +478,7 @@ function x(f) {
|
|
|
480
478
|
), g.get(
|
|
481
479
|
"/content/exit-pages",
|
|
482
480
|
y(async (e) => {
|
|
483
|
-
const { accessToken: a, propertyId: n } = await
|
|
481
|
+
const { accessToken: a, propertyId: n } = await m(e), t = D(e), s = t.startDate || "30daysAgo", o = t.endDate || "today", r = await d(a, n, {
|
|
484
482
|
dateRanges: [{ startDate: s, endDate: o }],
|
|
485
483
|
dimensions: [{ name: "pagePath" }],
|
|
486
484
|
metrics: [
|
|
@@ -492,20 +490,18 @@ function x(f) {
|
|
|
492
490
|
orderBys: [{ metric: { metricName: "screenPageViews" }, desc: !0 }],
|
|
493
491
|
limit: 20
|
|
494
492
|
}), i = I(r, "pagePath");
|
|
495
|
-
return i.rows = i.rows.map((
|
|
496
|
-
...
|
|
497
|
-
exitRate:
|
|
493
|
+
return i.rows = i.rows.map((u) => ({
|
|
494
|
+
...u,
|
|
495
|
+
exitRate: u.bounceRate || 0
|
|
498
496
|
})), i;
|
|
499
497
|
})
|
|
500
498
|
), g.get(
|
|
501
499
|
"/content/search-terms",
|
|
502
500
|
y(async (e) => {
|
|
503
|
-
const { accessToken: a, propertyId: n, siteUrl: t } = await
|
|
501
|
+
const { accessToken: a, propertyId: n, siteUrl: t } = await m(e), s = D(e), o = s.startDate || "30daysAgo", r = s.endDate || "today";
|
|
504
502
|
if (t)
|
|
505
503
|
try {
|
|
506
|
-
const p = `${b}/sites/${encodeURIComponent(t)}/searchAnalytics/query
|
|
507
|
-
console.log("[GA Module] Attempting Search Console query for site:", t);
|
|
508
|
-
const h = await fetch(
|
|
504
|
+
const p = `${b}/sites/${encodeURIComponent(t)}/searchAnalytics/query`, h = await fetch(
|
|
509
505
|
p,
|
|
510
506
|
{
|
|
511
507
|
method: "POST",
|
|
@@ -522,20 +518,19 @@ function x(f) {
|
|
|
522
518
|
}
|
|
523
519
|
);
|
|
524
520
|
if (h.ok) {
|
|
525
|
-
const
|
|
526
|
-
query:
|
|
527
|
-
clicks:
|
|
528
|
-
impressions:
|
|
529
|
-
ctr:
|
|
530
|
-
position:
|
|
521
|
+
const k = ((await h.json()).rows || []).map((P) => ({
|
|
522
|
+
query: P.keys[0],
|
|
523
|
+
clicks: P.clicks,
|
|
524
|
+
impressions: P.impressions,
|
|
525
|
+
ctr: P.ctr,
|
|
526
|
+
position: P.position
|
|
531
527
|
}));
|
|
532
|
-
if (
|
|
533
|
-
return
|
|
534
|
-
rows:
|
|
535
|
-
rowCount:
|
|
528
|
+
if (k.length > 0)
|
|
529
|
+
return {
|
|
530
|
+
rows: k,
|
|
531
|
+
rowCount: k.length,
|
|
536
532
|
source: "search_console"
|
|
537
533
|
};
|
|
538
|
-
console.log("[GA Module] Search Console returned 0 rows, falling through");
|
|
539
534
|
} else {
|
|
540
535
|
const C = await h.text().catch(() => "");
|
|
541
536
|
console.error(`[GA Module] Search Console API error (${h.status}):`, C);
|
|
@@ -622,7 +617,7 @@ function x(f) {
|
|
|
622
617
|
), g.get(
|
|
623
618
|
"/audience/overview",
|
|
624
619
|
y(async (e) => {
|
|
625
|
-
const { accessToken: a, propertyId: n } = await
|
|
620
|
+
const { accessToken: a, propertyId: n } = await m(e), t = D(e), s = t.startDate || "30daysAgo", o = t.endDate || "today", r = await d(a, n, {
|
|
626
621
|
dateRanges: [{ startDate: s, endDate: o }],
|
|
627
622
|
dimensions: [{ name: "newVsReturning" }],
|
|
628
623
|
metrics: [
|
|
@@ -639,9 +634,9 @@ function x(f) {
|
|
|
639
634
|
), g.get(
|
|
640
635
|
"/audience/technology",
|
|
641
636
|
y(async (e) => {
|
|
642
|
-
const { accessToken: a, propertyId: n } = await
|
|
637
|
+
const { accessToken: a, propertyId: n } = await m(e), t = D(e), s = t.startDate || "30daysAgo", o = t.endDate || "today", r = t.dimension || "browser", u = ["browser", "operatingSystem", "screenResolution"].includes(r) ? r : "browser", p = await d(a, n, {
|
|
643
638
|
dateRanges: [{ startDate: s, endDate: o }],
|
|
644
|
-
dimensions: [{ name:
|
|
639
|
+
dimensions: [{ name: u }],
|
|
645
640
|
metrics: [
|
|
646
641
|
{ name: "totalUsers" },
|
|
647
642
|
{ name: "sessions" },
|
|
@@ -650,12 +645,12 @@ function x(f) {
|
|
|
650
645
|
orderBys: [{ metric: { metricName: "totalUsers" }, desc: !0 }],
|
|
651
646
|
limit: 10
|
|
652
647
|
});
|
|
653
|
-
return I(p,
|
|
648
|
+
return I(p, u);
|
|
654
649
|
})
|
|
655
650
|
), g.get(
|
|
656
651
|
"/audience/languages",
|
|
657
652
|
y(async (e) => {
|
|
658
|
-
const { accessToken: a, propertyId: n } = await
|
|
653
|
+
const { accessToken: a, propertyId: n } = await m(e), t = D(e), s = t.startDate || "30daysAgo", o = t.endDate || "today", r = await d(a, n, {
|
|
659
654
|
dateRanges: [{ startDate: s, endDate: o }],
|
|
660
655
|
dimensions: [{ name: "language" }],
|
|
661
656
|
metrics: [
|
|
@@ -670,7 +665,7 @@ function x(f) {
|
|
|
670
665
|
), g.get(
|
|
671
666
|
"/audience/hours",
|
|
672
667
|
y(async (e) => {
|
|
673
|
-
const { accessToken: a, propertyId: n } = await
|
|
668
|
+
const { accessToken: a, propertyId: n } = await m(e), t = D(e), s = t.startDate || "30daysAgo", o = t.endDate || "today", r = await d(a, n, {
|
|
674
669
|
dateRanges: [{ startDate: s, endDate: o }],
|
|
675
670
|
dimensions: [{ name: "dayOfWeekName" }, { name: "hour" }],
|
|
676
671
|
metrics: [{ name: "sessions" }],
|
|
@@ -686,7 +681,7 @@ function x(f) {
|
|
|
686
681
|
), g.get(
|
|
687
682
|
"/audience/cities",
|
|
688
683
|
y(async (e) => {
|
|
689
|
-
const { accessToken: a, propertyId: n } = await
|
|
684
|
+
const { accessToken: a, propertyId: n } = await m(e), t = D(e), s = t.startDate || "30daysAgo", o = t.endDate || "today", r = await d(a, n, {
|
|
690
685
|
dateRanges: [{ startDate: s, endDate: o }],
|
|
691
686
|
dimensions: [{ name: "city" }, { name: "country" }],
|
|
692
687
|
metrics: [
|
|
@@ -720,7 +715,7 @@ function x(f) {
|
|
|
720
715
|
}
|
|
721
716
|
return e;
|
|
722
717
|
}
|
|
723
|
-
async function
|
|
718
|
+
async function l(e, a, n) {
|
|
724
719
|
const t = `${b}/sites/${encodeURIComponent(a)}/searchAnalytics/query`, s = await fetch(t, {
|
|
725
720
|
method: "POST",
|
|
726
721
|
headers: {
|
|
@@ -741,22 +736,22 @@ function x(f) {
|
|
|
741
736
|
return g.get(
|
|
742
737
|
"/seo/keywords",
|
|
743
738
|
y(async (e) => {
|
|
744
|
-
const { accessToken: a, siteUrl: n } = await
|
|
739
|
+
const { accessToken: a, siteUrl: n } = await m(e);
|
|
745
740
|
if (!n)
|
|
746
741
|
throw w({ statusCode: 400, statusMessage: "Search Console Site URL is not configured. Add it in module settings." });
|
|
747
|
-
const t = D(e), s = c(t.startDate || "30daysAgo"), o = c(t.endDate || "today"), r = Math.min(parseInt(t.limit) || 50, 100), i = await
|
|
742
|
+
const t = D(e), s = c(t.startDate || "30daysAgo"), o = c(t.endDate || "today"), r = Math.min(parseInt(t.limit) || 50, 100), i = await l(a, n, {
|
|
748
743
|
startDate: s,
|
|
749
744
|
endDate: o,
|
|
750
745
|
dimensions: ["query"],
|
|
751
746
|
rowLimit: r
|
|
752
747
|
});
|
|
753
748
|
return {
|
|
754
|
-
rows: (i.rows || []).map((
|
|
755
|
-
query:
|
|
756
|
-
clicks:
|
|
757
|
-
impressions:
|
|
758
|
-
ctr:
|
|
759
|
-
position:
|
|
749
|
+
rows: (i.rows || []).map((u) => ({
|
|
750
|
+
query: u.keys[0],
|
|
751
|
+
clicks: u.clicks,
|
|
752
|
+
impressions: u.impressions,
|
|
753
|
+
ctr: u.ctr,
|
|
754
|
+
position: u.position
|
|
760
755
|
})),
|
|
761
756
|
rowCount: i.rows?.length || 0
|
|
762
757
|
};
|
|
@@ -764,22 +759,22 @@ function x(f) {
|
|
|
764
759
|
), g.get(
|
|
765
760
|
"/seo/pages",
|
|
766
761
|
y(async (e) => {
|
|
767
|
-
const { accessToken: a, siteUrl: n } = await
|
|
762
|
+
const { accessToken: a, siteUrl: n } = await m(e);
|
|
768
763
|
if (!n)
|
|
769
764
|
throw w({ statusCode: 400, statusMessage: "Search Console Site URL is not configured." });
|
|
770
|
-
const t = D(e), s = c(t.startDate || "30daysAgo"), o = c(t.endDate || "today"), r = Math.min(parseInt(t.limit) || 50, 100), i = await
|
|
765
|
+
const t = D(e), s = c(t.startDate || "30daysAgo"), o = c(t.endDate || "today"), r = Math.min(parseInt(t.limit) || 50, 100), i = await l(a, n, {
|
|
771
766
|
startDate: s,
|
|
772
767
|
endDate: o,
|
|
773
768
|
dimensions: ["page"],
|
|
774
769
|
rowLimit: r
|
|
775
770
|
});
|
|
776
771
|
return {
|
|
777
|
-
rows: (i.rows || []).map((
|
|
778
|
-
page:
|
|
779
|
-
clicks:
|
|
780
|
-
impressions:
|
|
781
|
-
ctr:
|
|
782
|
-
position:
|
|
772
|
+
rows: (i.rows || []).map((u) => ({
|
|
773
|
+
page: u.keys[0],
|
|
774
|
+
clicks: u.clicks,
|
|
775
|
+
impressions: u.impressions,
|
|
776
|
+
ctr: u.ctr,
|
|
777
|
+
position: u.position
|
|
783
778
|
})),
|
|
784
779
|
rowCount: i.rows?.length || 0
|
|
785
780
|
};
|
|
@@ -787,10 +782,10 @@ function x(f) {
|
|
|
787
782
|
), g.get(
|
|
788
783
|
"/seo/trends",
|
|
789
784
|
y(async (e) => {
|
|
790
|
-
const { accessToken: a, siteUrl: n } = await
|
|
785
|
+
const { accessToken: a, siteUrl: n } = await m(e);
|
|
791
786
|
if (!n)
|
|
792
787
|
throw w({ statusCode: 400, statusMessage: "Search Console Site URL is not configured." });
|
|
793
|
-
const t = D(e), s = c(t.startDate || "30daysAgo"), o = c(t.endDate || "today"), i = ((await
|
|
788
|
+
const t = D(e), s = c(t.startDate || "30daysAgo"), o = c(t.endDate || "today"), i = ((await l(a, n, {
|
|
794
789
|
startDate: s,
|
|
795
790
|
endDate: o,
|
|
796
791
|
dimensions: ["date"],
|
|
@@ -801,22 +796,22 @@ function x(f) {
|
|
|
801
796
|
impressions: p.impressions,
|
|
802
797
|
ctr: p.ctr,
|
|
803
798
|
position: p.position
|
|
804
|
-
})).sort((p, h) => p.date.localeCompare(h.date)),
|
|
799
|
+
})).sort((p, h) => p.date.localeCompare(h.date)), u = i.reduce(
|
|
805
800
|
(p, h) => ({
|
|
806
801
|
clicks: p.clicks + h.clicks,
|
|
807
802
|
impressions: p.impressions + h.impressions
|
|
808
803
|
}),
|
|
809
804
|
{ clicks: 0, impressions: 0 }
|
|
810
805
|
);
|
|
811
|
-
return
|
|
806
|
+
return u.ctr = u.impressions > 0 ? u.clicks / u.impressions : 0, u.avgPosition = i.length > 0 ? i.reduce((p, h) => p + h.position, 0) / i.length : 0, { rows: i, totals: u, rowCount: i.length };
|
|
812
807
|
})
|
|
813
808
|
), g.get(
|
|
814
809
|
"/seo/query-pages",
|
|
815
810
|
y(async (e) => {
|
|
816
|
-
const { accessToken: a, siteUrl: n } = await
|
|
811
|
+
const { accessToken: a, siteUrl: n } = await m(e);
|
|
817
812
|
if (!n)
|
|
818
813
|
throw w({ statusCode: 400, statusMessage: "Search Console Site URL is not configured." });
|
|
819
|
-
const t = D(e), s = c(t.startDate || "30daysAgo"), o = c(t.endDate || "today"), r = await
|
|
814
|
+
const t = D(e), s = c(t.startDate || "30daysAgo"), o = c(t.endDate || "today"), r = await l(a, n, {
|
|
820
815
|
startDate: s,
|
|
821
816
|
endDate: o,
|
|
822
817
|
dimensions: ["query", "page"],
|
|
@@ -837,24 +832,24 @@ function x(f) {
|
|
|
837
832
|
), g.handler;
|
|
838
833
|
}
|
|
839
834
|
function V(f, R = !0) {
|
|
840
|
-
const A = (f.metricHeaders || []).map((s) => s.name),
|
|
835
|
+
const A = (f.metricHeaders || []).map((s) => s.name), m = (f.dimensionHeaders || []).map((s) => s.name).indexOf("date"), d = [];
|
|
841
836
|
(f.rows || []).forEach((s) => {
|
|
842
|
-
const o =
|
|
837
|
+
const o = m >= 0 ? s.dimensionValues[m]?.value : s.dimensionValues[0]?.value;
|
|
843
838
|
if (!o || o.length < 8) return;
|
|
844
839
|
const i = { date: `${o.slice(0, 4)}-${o.slice(4, 6)}-${o.slice(6, 8)}` };
|
|
845
|
-
A.forEach((
|
|
846
|
-
i[
|
|
840
|
+
A.forEach((u, p) => {
|
|
841
|
+
i[u] = parseFloat(s.metricValues[p]?.value || "0");
|
|
847
842
|
}), d.push(i);
|
|
848
843
|
});
|
|
849
|
-
const c = {},
|
|
844
|
+
const c = {}, l = {};
|
|
850
845
|
f.totals && f.totals.length >= 2 ? A.forEach((s, o) => {
|
|
851
|
-
c[s] = parseFloat(f.totals[0]?.metricValues?.[o]?.value || "0"),
|
|
846
|
+
c[s] = parseFloat(f.totals[0]?.metricValues?.[o]?.value || "0"), l[s] = parseFloat(f.totals[1]?.metricValues?.[o]?.value || "0");
|
|
852
847
|
}) : f.totals && f.totals.length === 1 && A.forEach((s, o) => {
|
|
853
848
|
c[s] = parseFloat(f.totals[0]?.metricValues?.[o]?.value || "0");
|
|
854
849
|
});
|
|
855
850
|
const e = {};
|
|
856
851
|
A.forEach((s) => {
|
|
857
|
-
const o = c[s] || 0, r =
|
|
852
|
+
const o = c[s] || 0, r = l[s];
|
|
858
853
|
r !== void 0 && r !== 0 ? e[s] = (o - r) / r * 100 : e[s] = null;
|
|
859
854
|
});
|
|
860
855
|
const a = /* @__PURE__ */ new Map();
|
|
@@ -864,40 +859,40 @@ function V(f, R = !0) {
|
|
|
864
859
|
return {
|
|
865
860
|
rows: t,
|
|
866
861
|
totals: c,
|
|
867
|
-
previousTotals:
|
|
862
|
+
previousTotals: l,
|
|
868
863
|
changes: e,
|
|
869
864
|
rowCount: t.length
|
|
870
865
|
};
|
|
871
866
|
}
|
|
872
867
|
function I(f, R) {
|
|
873
|
-
const A = (f.metricHeaders || []).map((
|
|
868
|
+
const A = (f.metricHeaders || []).map((m) => m.name), g = (f.rows || []).map((m) => {
|
|
874
869
|
const d = {
|
|
875
|
-
[R]:
|
|
870
|
+
[R]: m.dimensionValues[0].value
|
|
876
871
|
};
|
|
877
|
-
return A.forEach((c,
|
|
878
|
-
d[c] = parseFloat(
|
|
872
|
+
return A.forEach((c, l) => {
|
|
873
|
+
d[c] = parseFloat(m.metricValues[l].value);
|
|
879
874
|
}), d;
|
|
880
875
|
});
|
|
881
876
|
return { rows: g, rowCount: f.rowCount || g.length };
|
|
882
877
|
}
|
|
883
878
|
function T(f, R) {
|
|
884
|
-
const A = (f.metricHeaders || []).map((
|
|
879
|
+
const A = (f.metricHeaders || []).map((m) => m.name), g = (f.rows || []).map((m) => {
|
|
885
880
|
const d = {};
|
|
886
|
-
return R.forEach((c,
|
|
887
|
-
d[c] =
|
|
888
|
-
}), A.forEach((c,
|
|
889
|
-
d[c] = parseFloat(
|
|
881
|
+
return R.forEach((c, l) => {
|
|
882
|
+
d[c] = m.dimensionValues[l]?.value || "";
|
|
883
|
+
}), A.forEach((c, l) => {
|
|
884
|
+
d[c] = parseFloat(m.metricValues[l].value);
|
|
890
885
|
}), d;
|
|
891
886
|
});
|
|
892
887
|
return { rows: g, rowCount: f.rowCount || g.length };
|
|
893
888
|
}
|
|
894
889
|
function j(f) {
|
|
895
|
-
const { decrypt: R } = f, A =
|
|
896
|
-
async function g(
|
|
897
|
-
const { supabase: d, instanceId: c } =
|
|
898
|
-
if (e || !
|
|
890
|
+
const { decrypt: R } = f, A = v();
|
|
891
|
+
async function g(m) {
|
|
892
|
+
const { supabase: d, instanceId: c } = m.context.module, { data: l, error: e } = await d.from("project_modules").select("config").eq("id", c).single();
|
|
893
|
+
if (e || !l?.config)
|
|
899
894
|
throw w({ statusCode: 500, statusMessage: "Failed to load module config." });
|
|
900
|
-
const a =
|
|
895
|
+
const a = l.config, n = a.githubIntegration, t = a.githubRepo, s = a.githubOwner;
|
|
901
896
|
if (!n || !t || !s)
|
|
902
897
|
throw w({ statusCode: 400, statusMessage: "No GitHub integration configured for this module." });
|
|
903
898
|
const { data: o, error: r } = await d.from("integrations").select("config").eq("id", n).single();
|
|
@@ -912,10 +907,10 @@ function j(f) {
|
|
|
912
907
|
}
|
|
913
908
|
return A.post(
|
|
914
909
|
"/github/deploy",
|
|
915
|
-
y(async (
|
|
910
|
+
y(async (m) => {
|
|
916
911
|
try {
|
|
917
|
-
const { token: d, repo: c, owner:
|
|
918
|
-
await fetch(`https://api.github.com/repos/${
|
|
912
|
+
const { token: d, repo: c, owner: l } = await g(m);
|
|
913
|
+
await fetch(`https://api.github.com/repos/${l}/${c}/dispatches`, {
|
|
919
914
|
method: "POST",
|
|
920
915
|
headers: {
|
|
921
916
|
Authorization: `Bearer ${d}`,
|
|
@@ -932,8 +927,8 @@ function j(f) {
|
|
|
932
927
|
), A.handler;
|
|
933
928
|
}
|
|
934
929
|
export {
|
|
935
|
-
|
|
930
|
+
x as appointments,
|
|
936
931
|
j as contentManager,
|
|
937
|
-
|
|
938
|
-
|
|
932
|
+
G as googleAnalytics,
|
|
933
|
+
$ as products
|
|
939
934
|
};
|