@vuetify/one 2.3.1 → 2.4.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.
@@ -0,0 +1,518 @@
1
+ import { defineStore as k } from "pinia";
2
+ import { ref as E, reactive as z, watch as A, toRefs as V, computed as f, shallowRef as U, nextTick as M } from "vue";
3
+ import { merge as F } from "lodash-es";
4
+ import { useRoute as X, useRouter as H } from "vue-router";
5
+ const _ = k("queue", () => {
6
+ const e = E([]);
7
+ function s(o) {
8
+ const u = typeof o == "string" ? { text: o } : o;
9
+ e.value.push(u);
10
+ }
11
+ function t(o) {
12
+ s({
13
+ color: "error",
14
+ text: o,
15
+ location: "top end",
16
+ timeout: -1
17
+ });
18
+ }
19
+ return {
20
+ queue: e,
21
+ show: s,
22
+ showError: t
23
+ };
24
+ }), C = k("http", {
25
+ state: () => ({
26
+ url: ""
27
+ }),
28
+ actions: {
29
+ async fetch(e, s = {}) {
30
+ const t = await fetch(`${this.url}${e}`, {
31
+ credentials: "include",
32
+ ...s
33
+ });
34
+ if (!t.ok)
35
+ throw new Error(await t.text());
36
+ return t.status === 204 ? {} : t.json();
37
+ },
38
+ async post(e, s, t = {}) {
39
+ return this.fetch(e, {
40
+ method: "POST",
41
+ headers: {
42
+ "Content-Type": "application/json"
43
+ },
44
+ body: JSON.stringify(s),
45
+ ...t
46
+ });
47
+ },
48
+ async form(e, s, t = {}) {
49
+ return this.fetch(e, {
50
+ method: "POST",
51
+ body: s,
52
+ ...t
53
+ });
54
+ },
55
+ async get(e, s = {}) {
56
+ return this.fetch(e, s);
57
+ },
58
+ async delete(e, s = {}) {
59
+ return this.fetch(e, {
60
+ method: "DELETE",
61
+ ...s
62
+ });
63
+ }
64
+ }
65
+ }), Y = [
66
+ (e) => (e.v || (e.pwaRefresh = !0, typeof e.api == "boolean" && (e.api = e.api ? "inline" : "link-only"), typeof e.rtl == "boolean" && (e.direction = e.rtl ? "rtl" : "ltr", delete e.rtl), typeof e.theme == "object" && (e.mixedTheme = e.theme.mixed, e.theme = e.theme.system ? "system" : e.theme.dark ? "dark" : "light"), Array.isArray(e.notifications) && (e.notifications = { read: e.notifications }), typeof e.last == "object" && (e.notifications = e.notifications || {}, e.notifications.last = e.last, delete e.last), e.v = 1), e),
67
+ (e) => (e.v === 1 && (Array.isArray(e.composition) && (e.composition = "composition"), Array.isArray(e.notifications?.last?.banner) || (e.notifications = e.notifications || {}, e.notifications.last = e.notifications.last || {}, e.notifications.last.banner = []), e.v = 2), e),
68
+ (e) => (e.v === 2 && (e.syncSettings = !0, e.disableAds = !1, e.v = 3), e),
69
+ (e) => (e.v === 3 && (e.quickbar = !1, e.v = 4), e),
70
+ (e) => (e.v === 4 && (e.suits = { show: !1, elements: ["app-bar"], suit: "" }, e.notifications = e.notifications || {}, e.notifications.banners = !0, e.v = 5), e)
71
+ ];
72
+ function G(e) {
73
+ return {
74
+ version: 6,
75
+ ecosystem: {
76
+ bin: {
77
+ wordWrap: !1
78
+ },
79
+ play: {
80
+ showErrors: !0,
81
+ wordWrap: !1
82
+ },
83
+ docs: {
84
+ api: e.api || "link-only",
85
+ composition: e.composition || "composition",
86
+ pins: {
87
+ enabled: e.pins || !1,
88
+ pinned: Array.isArray(e.pinned) ? e.pinned.map((s) => s.name || s).filter(Boolean) : []
89
+ },
90
+ mixedTheme: e.mixedTheme ?? !0,
91
+ favorites: [],
92
+ slashSearch: e.slashSearch || !1,
93
+ railDrawer: e.railDrawer || !1
94
+ }
95
+ },
96
+ one: {
97
+ avatar: e.avatar || "",
98
+ ads: {
99
+ enabled: !e.disableAds,
100
+ house: e.showHouseAds || !1
101
+ },
102
+ command: {},
103
+ theme: e.theme || "system",
104
+ direction: e.direction || "ltr",
105
+ colors: {
106
+ primary: e.colors?.one || "surface-light"
107
+ },
108
+ suits: {
109
+ enabled: e.suits?.show || !1,
110
+ elements: e.suits?.elements || ["app-bar"],
111
+ suit: e.suits?.suit || ""
112
+ },
113
+ notifications: {
114
+ enabled: e.notifications?.show ?? !0,
115
+ read: e.notifications?.read || [],
116
+ last: ""
117
+ },
118
+ banners: {
119
+ enabled: e.notifications?.banners ?? !0,
120
+ read: e.notifications?.last?.banner || [],
121
+ last: ""
122
+ },
123
+ quicklinks: e.quickbar || !1,
124
+ sync: e.syncSettings ?? !0,
125
+ devmode: e.dev || !1
126
+ }
127
+ };
128
+ }
129
+ function K(e) {
130
+ const s = Y.reduce((t, o) => o(t), e);
131
+ return G(s);
132
+ }
133
+ const W = typeof window < "u", P = {
134
+ version: 6,
135
+ ecosystem: {
136
+ bin: {
137
+ wordWrap: !1
138
+ },
139
+ play: {
140
+ showErrors: !0,
141
+ wordWrap: !1
142
+ },
143
+ docs: {
144
+ api: "link-only",
145
+ composition: "composition",
146
+ pins: {
147
+ enabled: !1,
148
+ pinned: []
149
+ },
150
+ mixedTheme: !0,
151
+ favorites: [],
152
+ slashSearch: !1,
153
+ railDrawer: !1
154
+ }
155
+ },
156
+ one: {
157
+ avatar: "",
158
+ ads: {
159
+ enabled: !0,
160
+ house: !1
161
+ },
162
+ command: {},
163
+ theme: "system",
164
+ direction: "ltr",
165
+ colors: {
166
+ primary: "surface-light"
167
+ },
168
+ suits: {
169
+ enabled: !1,
170
+ elements: ["app-bar"],
171
+ suit: ""
172
+ },
173
+ notifications: {
174
+ enabled: !0,
175
+ read: [],
176
+ last: ""
177
+ },
178
+ banners: {
179
+ enabled: !0,
180
+ read: [],
181
+ last: ""
182
+ },
183
+ quicklinks: !1,
184
+ sync: !0,
185
+ devmode: !1
186
+ }
187
+ }, Z = k("user", () => {
188
+ const e = z(structuredClone(P));
189
+ A(e, t, { deep: !0 });
190
+ function s() {
191
+ if (!W)
192
+ return;
193
+ const u = localStorage.getItem("vuetify@user");
194
+ if (u)
195
+ try {
196
+ const n = JSON.parse(u);
197
+ if (n.version >= 6) {
198
+ const c = {
199
+ version: 6,
200
+ ecosystem: F(P.ecosystem, n.ecosystem || {}),
201
+ one: F(P.one, n.one || {})
202
+ };
203
+ Object.assign(e, c);
204
+ } else {
205
+ const c = K(n);
206
+ Object.assign(e, c);
207
+ }
208
+ t();
209
+ } catch (n) {
210
+ console.error("Failed to load user settings:", n);
211
+ }
212
+ }
213
+ function t() {
214
+ W && localStorage.setItem("vuetify@user", JSON.stringify(e, null, 2));
215
+ }
216
+ function o() {
217
+ W && (Object.assign(e, structuredClone(P)), t());
218
+ }
219
+ return s(), {
220
+ ...V(e),
221
+ load: s,
222
+ save: t,
223
+ reset: o
224
+ };
225
+ });
226
+ function J() {
227
+ const e = X();
228
+ return f(
229
+ () => e.query
230
+ );
231
+ }
232
+ const Q = k("one", () => {
233
+ const e = J(), s = H(), t = B(), o = C(), u = _(), n = U(!1), c = U(!1), d = E(), y = E([]), g = f(() => e.value.session_id), T = f(() => d.value?.items[0].plan.interval), p = f(() => d.value?.items[0].plan.type), I = E([]), h = f(() => t.user?.sponsorships.find((r) => r.platform === "stripe" && r.tierName.startsWith("sub_"))), q = f(() => !!h.value?.tierName), a = f(() => t.user?.sponsorships.reduce((r, m) => {
234
+ if (!m.isActive || m.interval === "once")
235
+ return r;
236
+ const b = m.interval === "month" ? m.amount : m.amount / 12;
237
+ return r + b / 100;
238
+ }, 0) ?? 0), i = f(() => t.user?.sponsorships.find((r) => r.tierName.startsWith("sub_") && r.isActive)), l = f(() => t.user?.sponsorships.find((r) => r.platform === "github" && r.isActive)), v = f(() => t.user?.sponsorships.find((r) => r.platform === "discord" && r.isActive)), L = f(() => t.user?.identities.find((r) => r.provider === "shopify")), N = f(() => !o.url || t.user?.isAdmin || h.value?.isActive || I.value.some((r) => ["one", "one/team"].includes(r)));
239
+ A(c, w), A(g, async (r) => {
240
+ r && await O();
241
+ }, { immediate: !0 }), A(e, (r) => {
242
+ if (r.one !== "subscribe" || t.user)
243
+ return;
244
+ t.dialog = !0;
245
+ const m = A(() => t.user, (b) => {
246
+ b && (t.dialog = !1, m());
247
+ });
248
+ }, { immediate: !0 });
249
+ async function O() {
250
+ try {
251
+ n.value = !0, await o.post("/one/activate", { sessionId: g.value }), await t.verify(!0), await $();
252
+ const r = new URL(window.location.href), m = r.searchParams;
253
+ m.delete("session_id"), m.delete("team"), history.pushState(null, "", r.toString());
254
+ } catch (r) {
255
+ u.showError(r?.message ?? "Error activating subscription, Please contact support");
256
+ } finally {
257
+ n.value = !1;
258
+ }
259
+ }
260
+ async function S() {
261
+ window.open(`${o.url}/one/manage`, "_blank");
262
+ }
263
+ async function R(r, m) {
264
+ n.value = !0;
265
+ const b = new URL("/one/subscribe", o.url);
266
+ b.searchParams.set("interval", r), b.searchParams.set("type", m), window.location.href = b.toString();
267
+ }
268
+ async function j() {
269
+ if (h.value)
270
+ try {
271
+ n.value = !0, await o.post(
272
+ `/one/cancel?subscriptionId=${h.value?.tierName}`
273
+ ), await t.verify(!0);
274
+ } catch (r) {
275
+ u.showError(r?.message ?? "Error cancelling subscription, Please contact support");
276
+ } finally {
277
+ n.value = !1;
278
+ }
279
+ }
280
+ async function x(r, m) {
281
+ if (h.value)
282
+ try {
283
+ n.value = !0, await o.post("/one/modify", {
284
+ subscriptionId: h.value.tierName,
285
+ interval: r,
286
+ type: m
287
+ }), await t.verify(!0);
288
+ } catch (b) {
289
+ u.showError(b?.message ?? "Error modifying subscription");
290
+ } finally {
291
+ n.value = !1;
292
+ }
293
+ }
294
+ async function $() {
295
+ try {
296
+ n.value = !0;
297
+ const r = await o.get("/one/info");
298
+ return d.value = r.subscription, y.value = r.invoices, r;
299
+ } catch (r) {
300
+ u.showError(r?.message ?? "Error fetching subscription info");
301
+ } finally {
302
+ n.value = !1;
303
+ }
304
+ }
305
+ function w() {
306
+ s.push({
307
+ query: {
308
+ ...e.value,
309
+ one: void 0
310
+ }
311
+ });
312
+ }
313
+ return {
314
+ info: d,
315
+ interval: T,
316
+ subscriptionType: p,
317
+ access: I,
318
+ invoices: y,
319
+ sessionId: g,
320
+ subscription: h,
321
+ monthlyTotal: a,
322
+ hasBilling: q,
323
+ isLoading: n,
324
+ isOpen: c,
325
+ isSubscriber: N,
326
+ github: l,
327
+ discord: v,
328
+ shopify: L,
329
+ one: i,
330
+ activate: O,
331
+ cancel: j,
332
+ manage: S,
333
+ modify: x,
334
+ resetQuery: w,
335
+ subscribe: R,
336
+ subscriptionInfo: $
337
+ };
338
+ }), D = k("team", () => {
339
+ const e = J(), s = B(), t = Q(), o = C(), u = _(), n = U(!1), c = E(null), d = E(!1), y = f(() => e.value.invite), g = f(
340
+ () => c.value ? t.access?.some((a) => ["one/team", "snips/team"].includes(a)) : !1
341
+ );
342
+ A(y, async () => {
343
+ if (y.value) {
344
+ s.user || (s.dialog = !0);
345
+ try {
346
+ n.value = !0;
347
+ const a = await o.get(`/one/team/${y.value}`);
348
+ c.value = a.team, d.value = !0;
349
+ } catch (a) {
350
+ h(), u.showError(a.message);
351
+ } finally {
352
+ n.value = !1;
353
+ }
354
+ }
355
+ }, { immediate: !0 });
356
+ async function T(a) {
357
+ try {
358
+ if (n.value = !0, !c.value)
359
+ return;
360
+ await o.post("/one/team/remove", { userId: a }), c.value.members = c.value.members.filter((i) => i.id !== a);
361
+ } catch (i) {
362
+ u.showError(i?.message ?? "Error removing user from team");
363
+ } finally {
364
+ n.value = !1;
365
+ }
366
+ }
367
+ async function p() {
368
+ try {
369
+ n.value = !0, await o.post("/one/team/leave", { teamId: c.value?.id }), await s.verify(!0);
370
+ } catch (a) {
371
+ u.showError(a?.message ?? "Error leaving team");
372
+ } finally {
373
+ n.value = !1;
374
+ }
375
+ }
376
+ async function I() {
377
+ try {
378
+ n.value = !0, await o.post("/one/team/join", { inviteCode: y.value }), await s.verify(!0), h();
379
+ } catch (a) {
380
+ u.showError(a?.message ?? "Error joining team");
381
+ } finally {
382
+ n.value = !1;
383
+ }
384
+ }
385
+ function h() {
386
+ d.value = !1;
387
+ const a = new URL(window.location.href);
388
+ a.searchParams.delete("invite"), window.history.replaceState({}, "", a.toString());
389
+ }
390
+ const q = f(() => s.user?.id === s.user?.team?.owner.id);
391
+ return {
392
+ team: c,
393
+ teamInviteDialog: d,
394
+ teamInviteCode: y,
395
+ hasTeamAccess: g,
396
+ isTeamOwner: q,
397
+ isLoading: n,
398
+ removeFromTeam: T,
399
+ leaveTeam: p,
400
+ joinTeam: I,
401
+ clearTeamQuery: h
402
+ };
403
+ }), B = k("auth", () => {
404
+ const e = E(!1), s = E(null), t = C(), o = Z(), u = H(), n = U(!1), c = Q(), d = D(), y = _();
405
+ let g = !!a();
406
+ A(s, (i) => {
407
+ if (!i?.settings)
408
+ return;
409
+ const l = localStorage.getItem("vuetify@user") || "{}";
410
+ JSON.stringify(i.settings, null, 2) !== l && (g = !0, Object.assign(o, i.settings));
411
+ }), o.$subscribe(() => {
412
+ g || T(), g = !1;
413
+ });
414
+ async function T() {
415
+ if (await M(), !(!s.value || !o.one.sync))
416
+ try {
417
+ await t.post("/user/settings", { settings: o.$state }), await p(!0);
418
+ } catch (i) {
419
+ y.showError(i?.message ?? "Error syncing settings");
420
+ }
421
+ }
422
+ async function p(i = !1) {
423
+ if (p.promise)
424
+ return p.promise;
425
+ if (!i && !document.cookie.includes("sx=1") && location.hostname.match(/([^.]+\.[^.]+)$/)?.[1] === new URL(t.url).hostname.match(/([^.]+\.[^.]+)$/)?.[1]) {
426
+ s.value = null;
427
+ return;
428
+ }
429
+ n.value = !0, p.promise = fetch(`${t.url}/auth/verify`, {
430
+ credentials: "include",
431
+ cache: i ? "reload" : void 0
432
+ }).then(
433
+ async (l) => {
434
+ if (l.ok || l.status === 401) {
435
+ const v = await l.json();
436
+ s.value = v.user, c.access = v.access, d.team = v.user?.team;
437
+ } else
438
+ console.error(l.statusText);
439
+ },
440
+ () => {
441
+ }
442
+ ).finally(() => {
443
+ n.value = !1, p.promise = null;
444
+ });
445
+ }
446
+ p.promise = null;
447
+ async function I(i = "github") {
448
+ n.value = !0;
449
+ const l = `${t.url}/auth/${i}/redirect`;
450
+ if (i === "shopify") {
451
+ window.location.assign(l + "?next=" + encodeURIComponent(window.location.href));
452
+ return;
453
+ }
454
+ const v = 400, L = 600, N = window.screenX + (window.innerWidth - v) / 2, O = window.screenY + (window.innerHeight - L) / 2, S = window.open(
455
+ "",
456
+ "vuetify:authorize:popup",
457
+ `popup,left=${N},top=${O},width=${v},height=${L},resizable`
458
+ );
459
+ if (!S) {
460
+ console.error("Failed to open popup");
461
+ return;
462
+ }
463
+ S.location.href = l;
464
+ let R = -1, j = -1;
465
+ function x(w) {
466
+ w.origin === t.url && w.data?.type === "auth-response" && (w.data.status === "success" ? (s.value || localStorage.setItem("vuetify@lastLoginProvider", i), s.value = w.data.body.user, c.access = w.data.body.access, d.team = w.data.body.user?.team, T()) : console.error(w.data.message), $());
467
+ }
468
+ function $() {
469
+ window.removeEventListener("message", x), window.clearInterval(R), window.clearTimeout(j), S?.close(), n.value = !1;
470
+ }
471
+ window.addEventListener("message", x), R = window.setInterval(() => {
472
+ !S || S.closed ? (console.error("Auth popup closed"), $()) : S.postMessage({ type: "auth-request" }, "*");
473
+ }, 1e3), j = window.setTimeout(() => {
474
+ $(), console.error("Auth timed out");
475
+ }, 120 * 1e3);
476
+ }
477
+ async function h(i) {
478
+ n.value = !0;
479
+ const l = i ? `/auth/${i}/logout` : "/auth/logout";
480
+ try {
481
+ await t.post(l), await p(!0), s.value = null;
482
+ } catch (v) {
483
+ y.showError(v?.message ?? "Error logging out");
484
+ } finally {
485
+ u.push({
486
+ path: "/",
487
+ query: u.currentRoute.value.query
488
+ }), n.value = !1;
489
+ }
490
+ }
491
+ function q(i) {
492
+ return s.value?.identities.find((l) => l.provider === i);
493
+ }
494
+ function a() {
495
+ return localStorage.getItem("vuetify@lastLoginProvider");
496
+ }
497
+ return p(), {
498
+ user: s,
499
+ url: t.url,
500
+ dialog: e,
501
+ isLoading: n,
502
+ verify: p,
503
+ findIdentity: q,
504
+ login: I,
505
+ logout: h,
506
+ lastLoginProvider: a,
507
+ sync: T
508
+ };
509
+ });
510
+ export {
511
+ B as a,
512
+ C as b,
513
+ Z as c,
514
+ Q as d,
515
+ J as e,
516
+ D as f,
517
+ _ as u
518
+ };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- import * as vue from 'vue';
2
1
  import { Ref, ComputedRef, ShallowRef, App } from 'vue';
3
2
  import * as pinia from 'pinia';
4
3
  import { PiniaPluginContext } from 'pinia';
@@ -54,7 +53,7 @@ declare const useTeamStore: pinia.StoreDefinition<"team", Pick<{
54
53
  teamInviteCode: ComputedRef<string>;
55
54
  hasTeamAccess: ComputedRef<boolean>;
56
55
  isTeamOwner: ComputedRef<boolean>;
57
- isLoading: ShallowRef<boolean, boolean>;
56
+ isLoading: ShallowRef<boolean>;
58
57
  removeFromTeam: (id: string) => Promise<void>;
59
58
  leaveTeam: () => Promise<void>;
60
59
  joinTeam: () => Promise<void>;
@@ -93,7 +92,7 @@ declare const useTeamStore: pinia.StoreDefinition<"team", Pick<{
93
92
  teamInviteCode: ComputedRef<string>;
94
93
  hasTeamAccess: ComputedRef<boolean>;
95
94
  isTeamOwner: ComputedRef<boolean>;
96
- isLoading: ShallowRef<boolean, boolean>;
95
+ isLoading: ShallowRef<boolean>;
97
96
  removeFromTeam: (id: string) => Promise<void>;
98
97
  leaveTeam: () => Promise<void>;
99
98
  joinTeam: () => Promise<void>;
@@ -132,7 +131,7 @@ declare const useTeamStore: pinia.StoreDefinition<"team", Pick<{
132
131
  teamInviteCode: ComputedRef<string>;
133
132
  hasTeamAccess: ComputedRef<boolean>;
134
133
  isTeamOwner: ComputedRef<boolean>;
135
- isLoading: ShallowRef<boolean, boolean>;
134
+ isLoading: ShallowRef<boolean>;
136
135
  removeFromTeam: (id: string) => Promise<void>;
137
136
  leaveTeam: () => Promise<void>;
138
137
  joinTeam: () => Promise<void>;
@@ -180,7 +179,7 @@ interface AuthState {
180
179
  lastLoginProvider: () => string | null;
181
180
  sync: () => Promise<void>;
182
181
  }
183
- declare const useAuthStore: pinia.StoreDefinition<"auth", Pick<AuthState, "isLoading" | "user" | "url" | "dialog">, Pick<AuthState, never>, Pick<AuthState, "verify" | "sync" | "findIdentity" | "login" | "logout" | "lastLoginProvider">>;
182
+ declare const useAuthStore: pinia.StoreDefinition<"auth", Pick<AuthState, "isLoading" | "user" | "url" | "dialog">, Pick<AuthState, never>, Pick<AuthState, "sync" | "verify" | "findIdentity" | "login" | "logout" | "lastLoginProvider">>;
184
183
 
185
184
  interface VOneBanner {
186
185
  id: string;
@@ -281,7 +280,7 @@ declare const useDownloadsStore: pinia.StoreDefinition<"downloads", Pick<{
281
280
  created_at: string;
282
281
  download_url: string;
283
282
  }[]>;
284
- isLoading: ShallowRef<boolean, boolean>;
283
+ isLoading: ShallowRef<boolean>;
285
284
  index: () => Promise<{
286
285
  id: number;
287
286
  download_items: {
@@ -321,7 +320,7 @@ declare const useDownloadsStore: pinia.StoreDefinition<"downloads", Pick<{
321
320
  created_at: string;
322
321
  download_url: string;
323
322
  }[]>;
324
- isLoading: ShallowRef<boolean, boolean>;
323
+ isLoading: ShallowRef<boolean>;
325
324
  index: () => Promise<{
326
325
  id: number;
327
326
  download_items: {
@@ -361,7 +360,7 @@ declare const useDownloadsStore: pinia.StoreDefinition<"downloads", Pick<{
361
360
  created_at: string;
362
361
  download_url: string;
363
362
  }[]>;
364
- isLoading: ShallowRef<boolean, boolean>;
363
+ isLoading: ShallowRef<boolean>;
365
364
  index: () => Promise<{
366
365
  id: number;
367
366
  download_items: {
@@ -467,9 +466,8 @@ interface OneState {
467
466
  resetQuery: () => void;
468
467
  subscribe: (interval: SubscriptionItemPlan['interval'], type: SubscriptionItemPlan['type']) => Promise<void>;
469
468
  subscriptionInfo: () => Promise<any>;
470
- verify: () => Promise<void>;
471
469
  }
472
- declare const useOneStore: pinia.StoreDefinition<"one", Pick<OneState, "info" | "access" | "invoices" | "isLoading" | "isOpen">, Pick<OneState, "one" | "interval" | "subscriptionType" | "sessionId" | "subscription" | "monthlyTotal" | "hasBilling" | "isSubscriber" | "github" | "discord" | "shopify">, Pick<OneState, "activate" | "cancel" | "manage" | "modify" | "resetQuery" | "subscribe" | "subscriptionInfo" | "verify">>;
470
+ declare const useOneStore: pinia.StoreDefinition<"one", Pick<OneState, "info" | "access" | "invoices" | "isLoading" | "isOpen">, Pick<OneState, "one" | "interval" | "subscriptionType" | "sessionId" | "subscription" | "monthlyTotal" | "hasBilling" | "isSubscriber" | "github" | "discord" | "shopify">, Pick<OneState, "activate" | "cancel" | "manage" | "modify" | "resetQuery" | "subscribe" | "subscriptionInfo">>;
473
471
 
474
472
  interface ShopifyProduct {
475
473
  id: string;
@@ -587,8 +585,8 @@ declare const usePromotionsStore: pinia.StoreDefinition<"promotions", Pick<{
587
585
  type: "theme" | "video" | "book" | "course" | "website" | "job" | "merch" | "digital" | "services" | "documentation";
588
586
  };
589
587
  }[]>;
590
- isLoading: vue.ShallowRef<boolean, boolean>;
591
- hasLoaded: vue.ShallowRef<boolean, boolean>;
588
+ isLoading: globalThis.ShallowRef<boolean>;
589
+ hasLoaded: globalThis.ShallowRef<boolean>;
592
590
  discoverable: globalThis.ComputedRef<{
593
591
  id: string;
594
592
  slug: string;
@@ -730,8 +728,8 @@ declare const usePromotionsStore: pinia.StoreDefinition<"promotions", Pick<{
730
728
  type: "theme" | "video" | "book" | "course" | "website" | "job" | "merch" | "digital" | "services" | "documentation";
731
729
  };
732
730
  }[]>;
733
- isLoading: vue.ShallowRef<boolean, boolean>;
734
- hasLoaded: vue.ShallowRef<boolean, boolean>;
731
+ isLoading: globalThis.ShallowRef<boolean>;
732
+ hasLoaded: globalThis.ShallowRef<boolean>;
735
733
  discoverable: globalThis.ComputedRef<{
736
734
  id: string;
737
735
  slug: string;
@@ -873,8 +871,8 @@ declare const usePromotionsStore: pinia.StoreDefinition<"promotions", Pick<{
873
871
  type: "theme" | "video" | "book" | "course" | "website" | "job" | "merch" | "digital" | "services" | "documentation";
874
872
  };
875
873
  }[]>;
876
- isLoading: vue.ShallowRef<boolean, boolean>;
877
- hasLoaded: vue.ShallowRef<boolean, boolean>;
874
+ isLoading: globalThis.ShallowRef<boolean>;
875
+ hasLoaded: globalThis.ShallowRef<boolean>;
878
876
  discoverable: globalThis.ComputedRef<{
879
877
  id: string;
880
878
  slug: string;