@pol-studios/db 1.0.31 → 1.0.34

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 (107) hide show
  1. package/dist/{DataLayerContext-Dc7nF2IG.d.ts → DataLayerContext-BwMk4VpG.d.ts} +92 -8
  2. package/dist/UserMetadataContext-QLIv-mfF.d.ts +171 -0
  3. package/dist/{UserMetadataContext-B8gVWGMl.d.ts → UserMetadataContext-pQb3A8_Q.d.ts} +1 -1
  4. package/dist/auth/context.d.ts +53 -5
  5. package/dist/auth/context.js +30 -8
  6. package/dist/auth/guards.d.ts +9 -9
  7. package/dist/auth/guards.js +2 -3
  8. package/dist/auth/hooks.d.ts +108 -4
  9. package/dist/auth/hooks.js +13 -9
  10. package/dist/auth/index.d.ts +6 -6
  11. package/dist/auth/index.js +45 -17
  12. package/dist/chunk-5HJLTYRA.js +355 -0
  13. package/dist/chunk-5HJLTYRA.js.map +1 -0
  14. package/dist/{chunk-WX4ABYIF.js → chunk-67HMVGV7.js} +292 -94
  15. package/dist/chunk-67HMVGV7.js.map +1 -0
  16. package/dist/chunk-6KN7KLEG.js +1 -0
  17. package/dist/{chunk-FZF26ZRB.js → chunk-7BGDQT5X.js} +29 -16
  18. package/dist/{chunk-FZF26ZRB.js.map → chunk-7BGDQT5X.js.map} +1 -1
  19. package/dist/{chunk-P4UZ7IXC.js → chunk-7D4SUZUM.js} +1 -5
  20. package/dist/{chunk-3PJTNH2L.js → chunk-AKIRHA4Q.js} +2 -2
  21. package/dist/{chunk-OQ7U6EQ3.js → chunk-AML2TLXJ.js} +3801 -3424
  22. package/dist/chunk-AML2TLXJ.js.map +1 -0
  23. package/dist/{chunk-5EFDS7SR.js → chunk-DMVUEJG2.js} +7 -2
  24. package/dist/chunk-DMVUEJG2.js.map +1 -0
  25. package/dist/{chunk-ADD5MIMK.js → chunk-FESQS4S5.js} +15 -15
  26. package/dist/{chunk-ADD5MIMK.js.map → chunk-FESQS4S5.js.map} +1 -1
  27. package/dist/{chunk-U5UNPBKB.js → chunk-FI6JAD5G.js} +3 -3
  28. package/dist/{chunk-TKWR5AAY.js → chunk-JOULSXOI.js} +2 -2
  29. package/dist/{chunk-HTJ2FQW5.js → chunk-LF3V3ERS.js} +13 -15
  30. package/dist/{chunk-HTJ2FQW5.js.map → chunk-LF3V3ERS.js.map} +1 -1
  31. package/dist/{chunk-5BLKZUKM.js → chunk-MREERKQU.js} +45 -14
  32. package/dist/chunk-MREERKQU.js.map +1 -0
  33. package/dist/{chunk-VGEMLNNM.js → chunk-NP34C3O3.js} +306 -704
  34. package/dist/chunk-NP34C3O3.js.map +1 -0
  35. package/dist/{chunk-CNIGRBRE.js → chunk-QJZUIAHA.js} +43 -19
  36. package/dist/{chunk-CNIGRBRE.js.map → chunk-QJZUIAHA.js.map} +1 -1
  37. package/dist/{chunk-HAWJTZCK.js → chunk-RT4O5H2E.js} +5 -7
  38. package/dist/chunk-RT4O5H2E.js.map +1 -0
  39. package/dist/{chunk-2NVSXZKQ.js → chunk-TN7QINPK.js} +74 -309
  40. package/dist/chunk-TN7QINPK.js.map +1 -0
  41. package/dist/chunk-UBHORKBS.js +215 -0
  42. package/dist/chunk-UBHORKBS.js.map +1 -0
  43. package/dist/{chunk-WVF7RUW5.js → chunk-WM25QE7E.js} +3 -3
  44. package/dist/{chunk-H6365JPC.js → chunk-YUX6RGLZ.js} +3 -3
  45. package/dist/{chunk-H6365JPC.js.map → chunk-YUX6RGLZ.js.map} +1 -1
  46. package/dist/{chunk-H3LNH2NT.js → chunk-Z456IHCB.js} +5 -9
  47. package/dist/{chunk-H3LNH2NT.js.map → chunk-Z456IHCB.js.map} +1 -1
  48. package/dist/{chunk-JAATANS3.js → chunk-ZCOFRJQD.js} +3 -3
  49. package/dist/{chunk-JAATANS3.js.map → chunk-ZCOFRJQD.js.map} +1 -1
  50. package/dist/client/index.d.ts +1 -1
  51. package/dist/client/index.js +2 -2
  52. package/dist/core/index.d.ts +54 -31
  53. package/dist/{executor-Br27YZvl.d.ts → executor-YJw4m7Q7.d.ts} +9 -1
  54. package/dist/gen/index.js +1 -1
  55. package/dist/hooks/index.d.ts +3 -22
  56. package/dist/hooks/index.js +12 -9
  57. package/dist/{index-CYFdO0iB.d.ts → index-lveh8qb0.d.ts} +1 -1
  58. package/dist/index.d.ts +38 -10
  59. package/dist/index.js +57 -36
  60. package/dist/index.native.d.ts +19 -13
  61. package/dist/index.native.js +64 -35
  62. package/dist/index.web.d.ts +18 -45
  63. package/dist/index.web.js +58 -49
  64. package/dist/index.web.js.map +1 -1
  65. package/dist/mutation/index.d.ts +2 -2
  66. package/dist/mutation/index.js +5 -5
  67. package/dist/parser/index.js +4 -4
  68. package/dist/powersync-bridge/index.d.ts +18 -3
  69. package/dist/powersync-bridge/index.js +2 -2
  70. package/dist/query/index.d.ts +1 -1
  71. package/dist/query/index.js +7 -8
  72. package/dist/realtime/index.js +7 -9
  73. package/dist/realtime/index.js.map +1 -1
  74. package/dist/types/index.d.ts +3 -3
  75. package/dist/types/index.js +6 -7
  76. package/dist/{useBatchUpsert-9OYjibLh.d.ts → useBatchUpsert-DAkiCNo3.d.ts} +1 -1
  77. package/dist/{useDbCount-Dk0yCKlT.d.ts → useDbCount-DWfYB2iu.d.ts} +16 -2
  78. package/dist/{useResolveFeedback-C1KucfdQ.d.ts → useResolveFeedback-CxLccZKK.d.ts} +197 -93
  79. package/dist/{useSupabase-DvWVuHHE.d.ts → useSupabase-DSZNeXnF.d.ts} +1 -1
  80. package/dist/with-auth/index.d.ts +2 -2
  81. package/dist/with-auth/index.js +46 -33
  82. package/dist/with-auth/index.js.map +1 -1
  83. package/package.json +18 -8
  84. package/dist/UserMetadataContext-DntmpK41.d.ts +0 -33
  85. package/dist/canvas-C4TBBDUL.node +0 -0
  86. package/dist/canvas-ZQNCL7JL.js +0 -1541
  87. package/dist/canvas-ZQNCL7JL.js.map +0 -1
  88. package/dist/chunk-2NVSXZKQ.js.map +0 -1
  89. package/dist/chunk-5BLKZUKM.js.map +0 -1
  90. package/dist/chunk-5EFDS7SR.js.map +0 -1
  91. package/dist/chunk-HAWJTZCK.js.map +0 -1
  92. package/dist/chunk-NSIAAYW3.js +0 -1
  93. package/dist/chunk-O7SETNGD.js +0 -3391
  94. package/dist/chunk-O7SETNGD.js.map +0 -1
  95. package/dist/chunk-OQ7U6EQ3.js.map +0 -1
  96. package/dist/chunk-VGEMLNNM.js.map +0 -1
  97. package/dist/chunk-WX4ABYIF.js.map +0 -1
  98. package/dist/dist-NDNRSNOG.js +0 -521
  99. package/dist/dist-NDNRSNOG.js.map +0 -1
  100. package/dist/pdf-PHXP7RHD.js +0 -20336
  101. package/dist/pdf-PHXP7RHD.js.map +0 -1
  102. /package/dist/{chunk-NSIAAYW3.js.map → chunk-6KN7KLEG.js.map} +0 -0
  103. /package/dist/{chunk-P4UZ7IXC.js.map → chunk-7D4SUZUM.js.map} +0 -0
  104. /package/dist/{chunk-3PJTNH2L.js.map → chunk-AKIRHA4Q.js.map} +0 -0
  105. /package/dist/{chunk-U5UNPBKB.js.map → chunk-FI6JAD5G.js.map} +0 -0
  106. /package/dist/{chunk-TKWR5AAY.js.map → chunk-JOULSXOI.js.map} +0 -0
  107. /package/dist/{chunk-WVF7RUW5.js.map → chunk-WM25QE7E.js.map} +0 -0
@@ -1,4 +1,7 @@
1
1
  import {
2
+ extractAccessKeys,
3
+ offlineAuthQueries,
4
+ offlineAuthQueryKeys,
2
5
  useAuth,
3
6
  useCanCreate,
4
7
  useCanDelete,
@@ -11,22 +14,23 @@ import {
11
14
  usePermissionLoading,
12
15
  usePermissionsBatch,
13
16
  useSetupAuth
14
- } from "../chunk-5BLKZUKM.js";
17
+ } from "../chunk-MREERKQU.js";
15
18
  import {
16
19
  useSetUserMetadata,
17
20
  useUserMetadata,
18
21
  useUserMetadataState,
19
22
  useUserMetadataValue
20
- } from "../chunk-WX4ABYIF.js";
21
- import "../chunk-VGEMLNNM.js";
22
- import "../chunk-GC3TBUWE.js";
23
+ } from "../chunk-67HMVGV7.js";
24
+ import "../chunk-UBHORKBS.js";
23
25
  import "../chunk-J4ZVCXZ4.js";
24
- import "../chunk-OQ7U6EQ3.js";
25
- import "../chunk-H6365JPC.js";
26
- import "../chunk-3PJTNH2L.js";
27
- import "../chunk-5EFDS7SR.js";
28
- import "../chunk-P4UZ7IXC.js";
26
+ import "../chunk-YUX6RGLZ.js";
27
+ import "../chunk-AKIRHA4Q.js";
28
+ import "../chunk-DMVUEJG2.js";
29
+ import "../chunk-7D4SUZUM.js";
29
30
  export {
31
+ extractAccessKeys,
32
+ offlineAuthQueries,
33
+ offlineAuthQueryKeys,
30
34
  useAuth,
31
35
  useCanCreate,
32
36
  useCanDelete,
@@ -1,11 +1,11 @@
1
- export { EntityWithPermission, useAuth, useCanCreate, useCanDelete, useCanEdit, useCanShare, useCanView, useInvalidatePermission, usePermission, usePermissionCheck, usePermissionLoading, usePermissionsBatch, useSetupAuth } from './hooks.js';
1
+ export { j as SimpleAuthContextValue, S as SimpleAuthProvider, i as SimpleAuthProviderProps, k as SimpleProfile, P as SimpleProfileStatus, l as SimpleUserAccess, U as UserMetadataContextType, r as UserMetadataInsert, s as UserMetadataProvider, t as UserMetadataRow, v as UserMetadataUpdate, g as getPermissionLevel, h as hasResourceAccess, a as useRequireAuth, b as useResourceAccess, m as useSetUserMetadata, u as useSimpleAuth, e as useSimpleCanDelete, d as useSimpleCanEdit, f as useSimpleCanShare, c as useSimpleCanView, n as useUserMetadata, o as useUserMetadataState, p as useUserMetadataValue, q as userMetadataContext } from '../UserMetadataContext-QLIv-mfF.js';
2
+ export { EntityWithPermission, OfflineAuthData, UseOfflineAuthOptions, extractAccessKeys, offlineAuthQueries, offlineAuthQueryKeys, useAuth, useCanCreate, useCanDelete, useCanEdit, useCanShare, useCanView, useInvalidatePermission, usePermission, usePermissionCheck, usePermissionLoading, usePermissionsBatch, useSetupAuth } from './hooks.js';
3
+ export { AuthProvider, AuthProviderProps, EntityPermissionContextValue, OfflineAuthProvider, OfflineAuthProviderProps, PermissionContextValue, PermissionProvider, entityPermissionContext, permissionContext, usePermissions } from './context.js';
2
4
  export { P as Profile, a as ProfileStatus, S as SetupAuthContext, b as SetupAuthContextProviderProps, s as setupAuthContext } from '../setupAuthContext-B76nbIP6.js';
3
- export { AuthProvider, AuthProviderProps, EntityPermissionContextValue, PermissionContextValue, PermissionProvider, entityPermissionContext, permissionContext, usePermissions } from './context.js';
4
- export { U as UserMetadataContextType, e as UserMetadataInsert, f as UserMetadataProvider, g as UserMetadataRow, h as UserMetadataUpdate, u as useSetUserMetadata, a as useUserMetadata, b as useUserMetadataState, c as useUserMetadataValue, d as userMetadataContext } from '../UserMetadataContext-DntmpK41.js';
5
5
  export { hasAccess, hasAllAccess, hasAllEntityAccess, hasAnyAccess, hasAnyEntityAccess, hasEntityAccess, isEntityAccessDenied, isPermissionLoaded } from './guards.js';
6
6
  export { E as EntityAccessRecord, a as EntityAction, b as EntityPermissionCheck, c as EntityPermissionLevel, d as EntityType, P as PermissionEffect } from '../EntityPermissions-DwFt4tUd.js';
7
- import '@supabase/supabase-js';
8
- import 'react';
9
7
  import 'react/jsx-runtime';
10
- import '../useSupabase-DvWVuHHE.js';
8
+ import 'react';
9
+ import '@supabase/supabase-js';
10
+ import '../useSupabase-DSZNeXnF.js';
11
11
  import '@supabase/supabase-js/dist/module/lib/types.js';
@@ -1,18 +1,34 @@
1
- import "../chunk-NSIAAYW3.js";
1
+ import "../chunk-6KN7KLEG.js";
2
2
  import {
3
- useAuth,
4
- useCanCreate,
3
+ OfflineAuthProvider,
4
+ SimpleAuthProvider,
5
+ getPermissionLevel,
6
+ hasResourceAccess,
5
7
  useCanDelete,
6
8
  useCanEdit,
7
9
  useCanShare,
8
10
  useCanView,
11
+ useRequireAuth,
12
+ useResourceAccess,
13
+ useSimpleAuth
14
+ } from "../chunk-5HJLTYRA.js";
15
+ import {
16
+ extractAccessKeys,
17
+ offlineAuthQueries,
18
+ offlineAuthQueryKeys,
19
+ useAuth,
20
+ useCanCreate,
21
+ useCanDelete as useCanDelete2,
22
+ useCanEdit as useCanEdit2,
23
+ useCanShare as useCanShare2,
24
+ useCanView as useCanView2,
9
25
  useInvalidatePermission,
10
26
  usePermission,
11
27
  usePermissionCheck,
12
28
  usePermissionLoading,
13
29
  usePermissionsBatch,
14
30
  useSetupAuth
15
- } from "../chunk-5BLKZUKM.js";
31
+ } from "../chunk-MREERKQU.js";
16
32
  import {
17
33
  AuthProvider,
18
34
  PermissionProvider,
@@ -26,8 +42,8 @@ import {
26
42
  useUserMetadataState,
27
43
  useUserMetadataValue,
28
44
  userMetadataContext
29
- } from "../chunk-WX4ABYIF.js";
30
- import "../chunk-VGEMLNNM.js";
45
+ } from "../chunk-67HMVGV7.js";
46
+ import "../chunk-UBHORKBS.js";
31
47
  import {
32
48
  hasAccess,
33
49
  hasAllAccess,
@@ -37,43 +53,55 @@ import {
37
53
  hasEntityAccess,
38
54
  isEntityAccessDenied,
39
55
  isPermissionLoaded
40
- } from "../chunk-HAWJTZCK.js";
41
- import "../chunk-GC3TBUWE.js";
56
+ } from "../chunk-RT4O5H2E.js";
42
57
  import "../chunk-J4ZVCXZ4.js";
43
- import "../chunk-OQ7U6EQ3.js";
44
- import "../chunk-H6365JPC.js";
45
- import "../chunk-3PJTNH2L.js";
46
- import "../chunk-5EFDS7SR.js";
47
- import "../chunk-P4UZ7IXC.js";
58
+ import "../chunk-YUX6RGLZ.js";
59
+ import "../chunk-AKIRHA4Q.js";
60
+ import "../chunk-DMVUEJG2.js";
61
+ import "../chunk-7D4SUZUM.js";
48
62
  export {
49
63
  AuthProvider,
64
+ OfflineAuthProvider,
50
65
  PermissionProvider,
66
+ SimpleAuthProvider,
51
67
  UserMetadataProvider,
52
68
  entityPermissionContext,
69
+ extractAccessKeys,
70
+ getPermissionLevel,
53
71
  hasAccess,
54
72
  hasAllAccess,
55
73
  hasAllEntityAccess,
56
74
  hasAnyAccess,
57
75
  hasAnyEntityAccess,
58
76
  hasEntityAccess,
77
+ hasResourceAccess,
59
78
  isEntityAccessDenied,
60
79
  isPermissionLoaded,
80
+ offlineAuthQueries,
81
+ offlineAuthQueryKeys,
61
82
  permissionContext,
62
83
  setupAuthContext,
63
84
  useAuth,
64
85
  useCanCreate,
65
- useCanDelete,
66
- useCanEdit,
67
- useCanShare,
68
- useCanView,
86
+ useCanDelete2 as useCanDelete,
87
+ useCanEdit2 as useCanEdit,
88
+ useCanShare2 as useCanShare,
89
+ useCanView2 as useCanView,
69
90
  useInvalidatePermission,
70
91
  usePermission,
71
92
  usePermissionCheck,
72
93
  usePermissionLoading,
73
94
  usePermissions,
74
95
  usePermissionsBatch,
96
+ useRequireAuth,
97
+ useResourceAccess,
75
98
  useSetUserMetadata,
76
99
  useSetupAuth,
100
+ useSimpleAuth,
101
+ useCanDelete as useSimpleCanDelete,
102
+ useCanEdit as useSimpleCanEdit,
103
+ useCanShare as useSimpleCanShare,
104
+ useCanView as useSimpleCanView,
77
105
  useUserMetadata,
78
106
  useUserMetadataState,
79
107
  useUserMetadataValue,
@@ -0,0 +1,355 @@
1
+ // src/auth/context/SimpleAuthProvider.tsx
2
+ import { c as _c } from "react/compiler-runtime";
3
+ import { createContext, useContext } from "react";
4
+ import { jsx } from "react/jsx-runtime";
5
+ var SimpleAuthContext = createContext(null);
6
+ function matchesAccessPattern(pattern, requestedKey) {
7
+ if (pattern === requestedKey) return true;
8
+ if (pattern === "*:*:*") return true;
9
+ const patternParts = pattern.split(":");
10
+ const keyParts = requestedKey.split(":");
11
+ if (patternParts.length !== keyParts.length) {
12
+ return false;
13
+ }
14
+ for (let i = 0; i < patternParts.length; i++) {
15
+ const patternPart = patternParts[i];
16
+ const keyPart = keyParts[i];
17
+ if (patternPart === "*") continue;
18
+ if (patternPart !== keyPart) return false;
19
+ }
20
+ return true;
21
+ }
22
+ function checkAccess(accessKeys, requestedKey) {
23
+ if (!requestedKey) return true;
24
+ if (!accessKeys || accessKeys.length === 0) return false;
25
+ return accessKeys.some((pattern) => matchesAccessPattern(pattern, requestedKey));
26
+ }
27
+ function getPermissionLevel(action) {
28
+ switch (action.toLowerCase()) {
29
+ case "view":
30
+ case "read":
31
+ return 1;
32
+ case "edit":
33
+ case "write":
34
+ return 2;
35
+ case "admin":
36
+ case "delete":
37
+ case "share":
38
+ return 3;
39
+ default:
40
+ return 0;
41
+ }
42
+ }
43
+ function hasResourceAccess(accessKeys, resourceType, resourceId, requiredAction) {
44
+ if (!accessKeys || accessKeys.length === 0) return false;
45
+ if (accessKeys.includes("*:*:*")) return true;
46
+ const requiredLevel = getPermissionLevel(requiredAction);
47
+ for (const key of accessKeys) {
48
+ const parts = key.split(":");
49
+ if (parts.length !== 3) continue;
50
+ const [keyType, keyId, keyAction] = parts;
51
+ if (keyType !== "*" && keyType.toLowerCase() !== resourceType.toLowerCase()) {
52
+ continue;
53
+ }
54
+ if (keyId !== "*" && keyId !== resourceId) {
55
+ continue;
56
+ }
57
+ const grantedLevel = getPermissionLevel(keyAction);
58
+ if (grantedLevel >= requiredLevel) {
59
+ return true;
60
+ }
61
+ }
62
+ return false;
63
+ }
64
+ function SimpleAuthProvider(t0) {
65
+ const $ = _c(20);
66
+ const {
67
+ children,
68
+ user,
69
+ profile,
70
+ userAccess,
71
+ isLoading: t1,
72
+ onSignOut
73
+ } = t0;
74
+ const isLoading = t1 === void 0 ? false : t1;
75
+ let t2;
76
+ bb0: {
77
+ if (!userAccess) {
78
+ let t33;
79
+ if ($[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
80
+ t33 = [];
81
+ $[0] = t33;
82
+ } else {
83
+ t33 = $[0];
84
+ }
85
+ t2 = t33;
86
+ break bb0;
87
+ }
88
+ let t32;
89
+ if ($[1] !== userAccess) {
90
+ t32 = userAccess.map(_temp).filter(Boolean);
91
+ $[1] = userAccess;
92
+ $[2] = t32;
93
+ } else {
94
+ t32 = $[2];
95
+ }
96
+ t2 = t32;
97
+ }
98
+ const accessKeys = t2;
99
+ const profileStatus = profile?.status;
100
+ const isArchived = profileStatus === "archived";
101
+ const isSuspended = profileStatus === "suspended";
102
+ let t3;
103
+ if ($[3] !== accessKeys || $[4] !== isArchived || $[5] !== isSuspended) {
104
+ t3 = (requestedKey) => {
105
+ if (isArchived || isSuspended) {
106
+ return false;
107
+ }
108
+ return checkAccess(accessKeys, requestedKey);
109
+ };
110
+ $[3] = accessKeys;
111
+ $[4] = isArchived;
112
+ $[5] = isSuspended;
113
+ $[6] = t3;
114
+ } else {
115
+ t3 = $[6];
116
+ }
117
+ const hasAccess = t3;
118
+ let t4;
119
+ if ($[7] !== accessKeys || $[8] !== hasAccess || $[9] !== isArchived || $[10] !== isLoading || $[11] !== isSuspended || $[12] !== onSignOut || $[13] !== profile || $[14] !== profileStatus || $[15] !== user) {
120
+ t4 = {
121
+ user,
122
+ profile,
123
+ accessKeys,
124
+ isLoading,
125
+ isArchived,
126
+ isSuspended,
127
+ profileStatus,
128
+ hasAccess,
129
+ signOut: onSignOut
130
+ };
131
+ $[7] = accessKeys;
132
+ $[8] = hasAccess;
133
+ $[9] = isArchived;
134
+ $[10] = isLoading;
135
+ $[11] = isSuspended;
136
+ $[12] = onSignOut;
137
+ $[13] = profile;
138
+ $[14] = profileStatus;
139
+ $[15] = user;
140
+ $[16] = t4;
141
+ } else {
142
+ t4 = $[16];
143
+ }
144
+ const value = t4;
145
+ let t5;
146
+ if ($[17] !== children || $[18] !== value) {
147
+ t5 = /* @__PURE__ */ jsx(SimpleAuthContext.Provider, { value, children });
148
+ $[17] = children;
149
+ $[18] = value;
150
+ $[19] = t5;
151
+ } else {
152
+ t5 = $[19];
153
+ }
154
+ return t5;
155
+ }
156
+ function _temp(ua) {
157
+ return ua.accessKey;
158
+ }
159
+ function useSimpleAuth() {
160
+ const context = useContext(SimpleAuthContext);
161
+ if (!context) {
162
+ throw new Error("useSimpleAuth must be used within a SimpleAuthProvider");
163
+ }
164
+ return context;
165
+ }
166
+ function useRequireAuth() {
167
+ const auth = useSimpleAuth();
168
+ if (!auth.user) {
169
+ throw new Error("User must be authenticated. Use useSimpleAuth() for nullable user.");
170
+ }
171
+ return auth;
172
+ }
173
+ function useResourceAccess(resourceType, resourceId, requiredAction) {
174
+ const $ = _c(5);
175
+ const {
176
+ accessKeys,
177
+ isArchived,
178
+ isSuspended
179
+ } = useSimpleAuth();
180
+ let t0;
181
+ bb0: {
182
+ if (resourceId === void 0 || resourceId === null) {
183
+ t0 = false;
184
+ break bb0;
185
+ }
186
+ if (isArchived || isSuspended) {
187
+ t0 = false;
188
+ break bb0;
189
+ }
190
+ const t1 = String(resourceId);
191
+ let t2;
192
+ if ($[0] !== accessKeys || $[1] !== requiredAction || $[2] !== resourceType || $[3] !== t1) {
193
+ t2 = hasResourceAccess(accessKeys, resourceType, t1, requiredAction);
194
+ $[0] = accessKeys;
195
+ $[1] = requiredAction;
196
+ $[2] = resourceType;
197
+ $[3] = t1;
198
+ $[4] = t2;
199
+ } else {
200
+ t2 = $[4];
201
+ }
202
+ t0 = t2;
203
+ }
204
+ return t0;
205
+ }
206
+ function useCanView(resourceType, resourceId) {
207
+ return useResourceAccess(resourceType, resourceId, "view");
208
+ }
209
+ function useCanEdit(resourceType, resourceId) {
210
+ return useResourceAccess(resourceType, resourceId, "edit");
211
+ }
212
+ function useCanDelete(resourceType, resourceId) {
213
+ return useResourceAccess(resourceType, resourceId, "admin");
214
+ }
215
+ function useCanShare(resourceType, resourceId) {
216
+ return useResourceAccess(resourceType, resourceId, "admin");
217
+ }
218
+
219
+ // src/auth/context/OfflineAuthProvider.tsx
220
+ import { useCallback as useCallback2, useEffect, useState } from "react";
221
+ import { jsx as jsx2 } from "react/jsx-runtime";
222
+ var PROFILE_QUERY = `
223
+ SELECT id, email, firstName, lastName, fullName, status, profilePath
224
+ FROM Profile
225
+ WHERE id = ?
226
+ LIMIT 1
227
+ `;
228
+ var USER_ACCESS_QUERY = `
229
+ SELECT id, userId, accessKey
230
+ FROM UserAccess
231
+ WHERE userId = ?
232
+ `;
233
+ function OfflineAuthProvider({
234
+ children,
235
+ db,
236
+ supabase,
237
+ isDbReady = true
238
+ }) {
239
+ const [user, setUser] = useState(null);
240
+ const [profile, setProfile] = useState(null);
241
+ const [userAccess, setUserAccess] = useState(null);
242
+ const [isLoadingUser, setIsLoadingUser] = useState(true);
243
+ const [isLoadingData, setIsLoadingData] = useState(true);
244
+ useEffect(() => {
245
+ let mounted = true;
246
+ async function loadUser() {
247
+ try {
248
+ const {
249
+ data
250
+ } = await supabase.auth.getSession();
251
+ if (mounted) {
252
+ setUser(data.session?.user ?? null);
253
+ setIsLoadingUser(false);
254
+ }
255
+ } catch (error) {
256
+ console.error("[OfflineAuthProvider] Error loading user:", error);
257
+ if (mounted) {
258
+ setUser(null);
259
+ setIsLoadingUser(false);
260
+ }
261
+ }
262
+ }
263
+ loadUser();
264
+ const {
265
+ data: {
266
+ subscription
267
+ }
268
+ } = supabase.auth.onAuthStateChange((_event, session) => {
269
+ if (mounted) {
270
+ setUser(session?.user ?? null);
271
+ }
272
+ });
273
+ return () => {
274
+ mounted = false;
275
+ subscription.unsubscribe();
276
+ };
277
+ }, [supabase]);
278
+ useEffect(() => {
279
+ if (!db || !isDbReady || !user?.id) {
280
+ setProfile(null);
281
+ setUserAccess(null);
282
+ setIsLoadingData(false);
283
+ return;
284
+ }
285
+ let mounted_0 = true;
286
+ const abortController = new AbortController();
287
+ async function loadData() {
288
+ try {
289
+ setIsLoadingData(true);
290
+ const [profileResult, accessResult] = await Promise.all([db.getOptional(PROFILE_QUERY, [user.id]), db.getAll(USER_ACCESS_QUERY, [user.id])]);
291
+ if (mounted_0) {
292
+ setProfile(profileResult);
293
+ setUserAccess(accessResult);
294
+ setIsLoadingData(false);
295
+ }
296
+ } catch (error_0) {
297
+ console.error("[OfflineAuthProvider] Error loading auth data:", error_0);
298
+ if (mounted_0) {
299
+ setIsLoadingData(false);
300
+ }
301
+ }
302
+ }
303
+ loadData();
304
+ db.watch(PROFILE_QUERY, [user.id], {
305
+ onResult: (result) => {
306
+ if (mounted_0) {
307
+ const rows = result.rows?._array || [];
308
+ setProfile(rows[0] || null);
309
+ }
310
+ }
311
+ }, {
312
+ signal: abortController.signal
313
+ });
314
+ db.watch(USER_ACCESS_QUERY, [user.id], {
315
+ onResult: (result_0) => {
316
+ if (mounted_0) {
317
+ const rows_0 = result_0.rows?._array || [];
318
+ setUserAccess(rows_0);
319
+ }
320
+ }
321
+ }, {
322
+ signal: abortController.signal
323
+ });
324
+ return () => {
325
+ mounted_0 = false;
326
+ abortController.abort();
327
+ };
328
+ }, [db, isDbReady, user?.id]);
329
+ const handleSignOut = useCallback2(async () => {
330
+ const {
331
+ error: error_1
332
+ } = await supabase.auth.signOut();
333
+ if (error_1) {
334
+ console.error("[OfflineAuthProvider] Sign out error:", error_1);
335
+ throw error_1;
336
+ }
337
+ }, [supabase]);
338
+ const isLoading = isLoadingUser || !!user && isLoadingData;
339
+ return /* @__PURE__ */ jsx2(SimpleAuthProvider, { user, profile, userAccess, isLoading, onSignOut: handleSignOut, children });
340
+ }
341
+
342
+ export {
343
+ getPermissionLevel,
344
+ hasResourceAccess,
345
+ SimpleAuthProvider,
346
+ useSimpleAuth,
347
+ useRequireAuth,
348
+ useResourceAccess,
349
+ useCanView,
350
+ useCanEdit,
351
+ useCanDelete,
352
+ useCanShare,
353
+ OfflineAuthProvider
354
+ };
355
+ //# sourceMappingURL=chunk-5HJLTYRA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth/context/SimpleAuthProvider.tsx","../src/auth/context/OfflineAuthProvider.tsx"],"sourcesContent":["import { c as _c } from \"react/compiler-runtime\";\n/**\n * SimpleAuthProvider - Dead simple auth that works offline\n *\n * This provider is designed for offline-first apps using PowerSync.\n * All permission data is synced locally, no RPC calls needed.\n *\n * Features:\n * - Reads Profile from PowerSync (local SQLite)\n * - Reads UserAccess from PowerSync (local SQLite)\n * - Simple hasAccess() function with wildcard matching\n * - No batching, no caching, no TTL, no real-time subscriptions\n * - Works 100% offline\n */\n\nimport { ReactNode, useCallback, useMemo, createContext, useContext } from \"react\";\nimport { User } from \"@supabase/supabase-js\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport type ProfileStatus = \"active\" | \"archived\" | \"suspended\";\nexport interface SimpleProfile {\n id: string;\n email?: string | null;\n firstName?: string | null;\n lastName?: string | null;\n fullName?: string | null;\n status?: ProfileStatus | null;\n profilePath?: string | null;\n [key: string]: unknown;\n}\nexport interface SimpleUserAccess {\n id: string;\n userId: string;\n accessKey: string;\n}\nexport interface SimpleAuthContextValue {\n /** Supabase user (from auth session) */\n user: User | null;\n /** Profile from PowerSync (local SQLite) */\n profile: SimpleProfile | null;\n /** Access keys from PowerSync (local SQLite) */\n accessKeys: string[];\n /** Whether auth data is loading */\n isLoading: boolean;\n /** Whether profile is archived */\n isArchived: boolean;\n /** Whether profile is suspended */\n isSuspended: boolean;\n /** Profile status */\n profileStatus: ProfileStatus | undefined;\n /**\n * Check if user has access to a resource.\n * Supports wildcards: *:*:*, project:*:read, project:123:*\n *\n * @example\n * hasAccess(\"admin\") // exact match\n * hasAccess(\"project:123:read\") // check specific resource\n */\n hasAccess: (accessKey: string) => boolean;\n /** Sign out the user */\n signOut: () => Promise<void>;\n}\n\n// ─── Context ─────────────────────────────────────────────────────────────────\n\nconst SimpleAuthContext = createContext<SimpleAuthContextValue | null>(null);\n\n// ─── Wildcard Matching ───────────────────────────────────────────────────────\n\n/**\n * Check if an access key pattern matches a requested key.\n * Supports wildcards (*) in any segment.\n *\n * Pattern examples:\n * - \"*:*:*\" matches everything (super admin)\n * - \"project:*:read\" matches project:123:read, project:456:read\n * - \"project:123:*\" matches project:123:read, project:123:write\n * - \"project:123:read\" exact match only\n */\nfunction matchesAccessPattern(pattern: string, requestedKey: string): boolean {\n // Exact match\n if (pattern === requestedKey) return true;\n\n // Super admin - matches everything\n if (pattern === \"*:*:*\") return true;\n\n // Split into segments for wildcard matching\n const patternParts = pattern.split(\":\");\n const keyParts = requestedKey.split(\":\");\n\n // Different number of segments - can't match\n // (unless pattern is shorter and last part is *)\n if (patternParts.length !== keyParts.length) {\n return false;\n }\n\n // Check each segment\n for (let i = 0; i < patternParts.length; i++) {\n const patternPart = patternParts[i];\n const keyPart = keyParts[i];\n\n // Wildcard matches anything\n if (patternPart === \"*\") continue;\n\n // Must match exactly\n if (patternPart !== keyPart) return false;\n }\n return true;\n}\n\n/**\n * Check if any of the user's access keys match the requested key.\n */\nfunction checkAccess(accessKeys: string[], requestedKey: string): boolean {\n // Empty key = no restriction\n if (!requestedKey) return true;\n\n // No access keys = no access\n if (!accessKeys || accessKeys.length === 0) return false;\n return accessKeys.some(pattern => matchesAccessPattern(pattern, requestedKey));\n}\n\n// ─── Permission Level Helpers ────────────────────────────────────────────────\n\n/**\n * Maps permission action strings to numeric levels for comparison.\n * Higher numbers grant more access.\n */\nexport function getPermissionLevel(action: string): number {\n switch (action.toLowerCase()) {\n case \"view\":\n case \"read\":\n return 1;\n case \"edit\":\n case \"write\":\n return 2;\n case \"admin\":\n case \"delete\":\n case \"share\":\n return 3;\n default:\n return 0;\n }\n}\n\n/**\n * Check if a user has at least the required permission level for a resource.\n * Checks all matching access keys and returns true if any grants sufficient access.\n *\n * @param accessKeys - User's access keys\n * @param resourceType - e.g., \"project\", \"client\", \"database\"\n * @param resourceId - The ID of the resource\n * @param requiredAction - e.g., \"read\", \"edit\", \"admin\"\n */\nexport function hasResourceAccess(accessKeys: string[], resourceType: string, resourceId: string, requiredAction: string): boolean {\n if (!accessKeys || accessKeys.length === 0) return false;\n\n // Super admin bypasses all checks\n if (accessKeys.includes(\"*:*:*\")) return true;\n const requiredLevel = getPermissionLevel(requiredAction);\n\n // Check each access key\n for (const key of accessKeys) {\n const parts = key.split(\":\");\n if (parts.length !== 3) continue;\n const [keyType, keyId, keyAction] = parts;\n\n // Check if type matches (or wildcard)\n if (keyType !== \"*\" && keyType.toLowerCase() !== resourceType.toLowerCase()) {\n continue;\n }\n\n // Check if ID matches (or wildcard)\n if (keyId !== \"*\" && keyId !== resourceId) {\n continue;\n }\n\n // Check permission level\n const grantedLevel = getPermissionLevel(keyAction);\n if (grantedLevel >= requiredLevel) {\n return true;\n }\n }\n return false;\n}\n\n// ─── Provider Props ──────────────────────────────────────────────────────────\n\nexport interface SimpleAuthProviderProps {\n children: ReactNode;\n /** Supabase user from auth session */\n user: User | null;\n /** Profile from PowerSync query */\n profile: SimpleProfile | null;\n /** User access records from PowerSync query */\n userAccess: SimpleUserAccess[] | null;\n /** Whether the data is loading */\n isLoading?: boolean;\n /** Sign out function */\n onSignOut: () => Promise<void>;\n}\n\n// ─── Provider Component ──────────────────────────────────────────────────────\n\nexport function SimpleAuthProvider(t0) {\n const $ = _c(20);\n const {\n children,\n user,\n profile,\n userAccess,\n isLoading: t1,\n onSignOut\n } = t0;\n const isLoading = t1 === undefined ? false : t1;\n let t2;\n bb0: {\n if (!userAccess) {\n let t3;\n if ($[0] === Symbol.for(\"react.memo_cache_sentinel\")) {\n t3 = [];\n $[0] = t3;\n } else {\n t3 = $[0];\n }\n t2 = t3;\n break bb0;\n }\n let t3;\n if ($[1] !== userAccess) {\n t3 = userAccess.map(_temp).filter(Boolean);\n $[1] = userAccess;\n $[2] = t3;\n } else {\n t3 = $[2];\n }\n t2 = t3;\n }\n const accessKeys = t2;\n const profileStatus = profile?.status as ProfileStatus | undefined;\n const isArchived = profileStatus === \"archived\";\n const isSuspended = profileStatus === \"suspended\";\n let t3;\n if ($[3] !== accessKeys || $[4] !== isArchived || $[5] !== isSuspended) {\n t3 = requestedKey => {\n if (isArchived || isSuspended) {\n return false;\n }\n return checkAccess(accessKeys, requestedKey);\n };\n $[3] = accessKeys;\n $[4] = isArchived;\n $[5] = isSuspended;\n $[6] = t3;\n } else {\n t3 = $[6];\n }\n const hasAccess = t3;\n let t4;\n if ($[7] !== accessKeys || $[8] !== hasAccess || $[9] !== isArchived || $[10] !== isLoading || $[11] !== isSuspended || $[12] !== onSignOut || $[13] !== profile || $[14] !== profileStatus || $[15] !== user) {\n t4 = {\n user,\n profile,\n accessKeys,\n isLoading,\n isArchived,\n isSuspended,\n profileStatus,\n hasAccess,\n signOut: onSignOut\n };\n $[7] = accessKeys;\n $[8] = hasAccess;\n $[9] = isArchived;\n $[10] = isLoading;\n $[11] = isSuspended;\n $[12] = onSignOut;\n $[13] = profile;\n $[14] = profileStatus;\n $[15] = user;\n $[16] = t4;\n } else {\n t4 = $[16];\n }\n const value = t4;\n let t5;\n if ($[17] !== children || $[18] !== value) {\n t5 = <SimpleAuthContext.Provider value={value}>{children}</SimpleAuthContext.Provider>;\n $[17] = children;\n $[18] = value;\n $[19] = t5;\n } else {\n t5 = $[19];\n }\n return t5;\n}\n\n// ─── Hook ────────────────────────────────────────────────────────────────────\n\n/**\n * Hook to access auth state and hasAccess function.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { user, profile, hasAccess, isLoading } = useSimpleAuth();\n *\n * if (isLoading) return <Loading />;\n * if (!user) return <Login />;\n *\n * // Check simple access\n * if (hasAccess(\"admin\")) {\n * return <AdminPanel />;\n * }\n *\n * // Check resource access\n * if (hasAccess(\"project:123:edit\")) {\n * return <Editor />;\n * }\n *\n * return <ReadOnlyView />;\n * }\n * ```\n */\nfunction _temp(ua) {\n return ua.accessKey;\n}\nexport function useSimpleAuth() {\n const context = useContext(SimpleAuthContext);\n if (!context) {\n throw new Error(\"useSimpleAuth must be used within a SimpleAuthProvider\");\n }\n return context;\n}\n\n/**\n * Hook that requires authentication.\n * Throws if user is not authenticated.\n *\n * @example\n * ```tsx\n * function ProtectedComponent() {\n * const { user, hasAccess } = useRequireAuth();\n * // user is guaranteed to be non-null here\n * }\n * ```\n */\nexport function useRequireAuth() {\n const auth = useSimpleAuth();\n if (!auth.user) {\n throw new Error(\"User must be authenticated. Use useSimpleAuth() for nullable user.\");\n }\n return auth as SimpleAuthContextValue & {\n user: User;\n };\n}\n\n// ─── Utility Hook for Resource Access ────────────────────────────────────────\n\n/**\n * Hook to check resource-level access with permission levels.\n *\n * @example\n * ```tsx\n * function ProjectEditor({ projectId }: { projectId: string }) {\n * const canEdit = useResourceAccess(\"project\", projectId, \"edit\");\n * const canDelete = useResourceAccess(\"project\", projectId, \"admin\");\n *\n * return (\n * <div>\n * <button disabled={!canEdit}>Edit</button>\n * <button disabled={!canDelete}>Delete</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useResourceAccess(resourceType, resourceId, requiredAction) {\n const $ = _c(5);\n const {\n accessKeys,\n isArchived,\n isSuspended\n } = useSimpleAuth();\n let t0;\n bb0: {\n if (resourceId === undefined || resourceId === null) {\n t0 = false;\n break bb0;\n }\n if (isArchived || isSuspended) {\n t0 = false;\n break bb0;\n }\n const t1 = String(resourceId);\n let t2;\n if ($[0] !== accessKeys || $[1] !== requiredAction || $[2] !== resourceType || $[3] !== t1) {\n t2 = hasResourceAccess(accessKeys, resourceType, t1, requiredAction);\n $[0] = accessKeys;\n $[1] = requiredAction;\n $[2] = resourceType;\n $[3] = t1;\n $[4] = t2;\n } else {\n t2 = $[4];\n }\n t0 = t2;\n }\n return t0;\n}\n\n// ─── Convenience Hooks ───────────────────────────────────────────────────────\n\nexport function useCanView(resourceType, resourceId) {\n return useResourceAccess(resourceType, resourceId, \"view\");\n}\nexport function useCanEdit(resourceType, resourceId) {\n return useResourceAccess(resourceType, resourceId, \"edit\");\n}\nexport function useCanDelete(resourceType, resourceId) {\n return useResourceAccess(resourceType, resourceId, \"admin\");\n}\nexport function useCanShare(resourceType, resourceId) {\n return useResourceAccess(resourceType, resourceId, \"admin\");\n}","/**\n * OfflineAuthProvider - Pre-built auth provider for PowerSync apps\n *\n * This provider reads Profile and UserAccess from PowerSync (local SQLite)\n * and provides the SimpleAuthProvider context.\n *\n * Works 100% offline once data is synced.\n *\n * @example\n * ```tsx\n * import { OfflineAuthProvider } from \"@pol-studios/db\";\n * import { usePowerSync } from \"@pol-studios/powersync\";\n *\n * function App() {\n * const db = usePowerSync();\n * const supabase = useSupabase();\n *\n * return (\n * <OfflineAuthProvider db={db} supabase={supabase}>\n * <MyApp />\n * </OfflineAuthProvider>\n * );\n * }\n * ```\n */\n\nimport { ReactNode, useCallback, useEffect, useMemo, useState } from \"react\";\nimport { User } from \"@supabase/supabase-js\";\nimport { SimpleAuthProvider, type SimpleProfile, type SimpleUserAccess } from \"./SimpleAuthProvider\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\ninterface PowerSyncDB {\n getAll: <T>(sql: string, params?: any[]) => Promise<T[]>;\n getOptional: <T>(sql: string, params?: any[]) => Promise<T | null>;\n watch: (sql: string, params: any[], options: {\n onResult: (result: any) => void;\n }, abortOptions?: {\n signal: AbortSignal;\n }) => void;\n}\ninterface SupabaseClient {\n auth: {\n getUser: () => Promise<{\n data: {\n user: User | null;\n };\n error: any;\n }>;\n getSession: () => Promise<{\n data: {\n session: {\n user: User;\n } | null;\n };\n error: any;\n }>;\n signOut: () => Promise<{\n error: any;\n }>;\n onAuthStateChange: (callback: (event: string, session: any) => void) => {\n data: {\n subscription: {\n unsubscribe: () => void;\n };\n };\n };\n };\n}\nexport interface OfflineAuthProviderProps {\n children: ReactNode;\n /** PowerSync database instance */\n db: PowerSyncDB | null;\n /** Supabase client for auth */\n supabase: SupabaseClient;\n /** Whether PowerSync is ready */\n isDbReady?: boolean;\n}\n\n// ─── SQL Queries ─────────────────────────────────────────────────────────────\n\nconst PROFILE_QUERY = `\n SELECT id, email, firstName, lastName, fullName, status, profilePath\n FROM Profile\n WHERE id = ?\n LIMIT 1\n`;\nconst USER_ACCESS_QUERY = `\n SELECT id, userId, accessKey\n FROM UserAccess\n WHERE userId = ?\n`;\n\n// ─── Provider Component ──────────────────────────────────────────────────────\n\nexport function OfflineAuthProvider({\n children,\n db,\n supabase,\n isDbReady = true\n}: OfflineAuthProviderProps) {\n // ─── State ───────────────────────────────────────────────────────────────────\n const [user, setUser] = useState<User | null>(null);\n const [profile, setProfile] = useState<SimpleProfile | null>(null);\n const [userAccess, setUserAccess] = useState<SimpleUserAccess[] | null>(null);\n const [isLoadingUser, setIsLoadingUser] = useState(true);\n const [isLoadingData, setIsLoadingData] = useState(true);\n\n // ─── Auth State ──────────────────────────────────────────────────────────────\n\n // Get initial user\n useEffect(() => {\n let mounted = true;\n async function loadUser() {\n try {\n const {\n data\n } = await supabase.auth.getSession();\n if (mounted) {\n setUser(data.session?.user ?? null);\n setIsLoadingUser(false);\n }\n } catch (error) {\n console.error(\"[OfflineAuthProvider] Error loading user:\", error);\n if (mounted) {\n setUser(null);\n setIsLoadingUser(false);\n }\n }\n }\n loadUser();\n\n // Subscribe to auth changes\n const {\n data: {\n subscription\n }\n } = supabase.auth.onAuthStateChange((_event, session) => {\n if (mounted) {\n setUser(session?.user ?? null);\n }\n });\n return () => {\n mounted = false;\n subscription.unsubscribe();\n };\n }, [supabase]);\n\n // ─── Profile & UserAccess from PowerSync ─────────────────────────────────────\n\n // Load profile and user access when user or db changes\n useEffect(() => {\n if (!db || !isDbReady || !user?.id) {\n setProfile(null);\n setUserAccess(null);\n setIsLoadingData(false);\n return;\n }\n let mounted_0 = true;\n const abortController = new AbortController();\n\n // Initial load\n async function loadData() {\n try {\n setIsLoadingData(true);\n const [profileResult, accessResult] = await Promise.all([db!.getOptional<SimpleProfile>(PROFILE_QUERY, [user!.id]), db!.getAll<SimpleUserAccess>(USER_ACCESS_QUERY, [user!.id])]);\n if (mounted_0) {\n setProfile(profileResult);\n setUserAccess(accessResult);\n setIsLoadingData(false);\n }\n } catch (error_0) {\n console.error(\"[OfflineAuthProvider] Error loading auth data:\", error_0);\n if (mounted_0) {\n setIsLoadingData(false);\n }\n }\n }\n loadData();\n\n // Watch for profile changes\n db.watch(PROFILE_QUERY, [user.id], {\n onResult: result => {\n if (mounted_0) {\n const rows = result.rows?._array || [];\n setProfile(rows[0] || null);\n }\n }\n }, {\n signal: abortController.signal\n });\n\n // Watch for user access changes\n db.watch(USER_ACCESS_QUERY, [user.id], {\n onResult: result_0 => {\n if (mounted_0) {\n const rows_0 = result_0.rows?._array || [];\n setUserAccess(rows_0);\n }\n }\n }, {\n signal: abortController.signal\n });\n return () => {\n mounted_0 = false;\n abortController.abort();\n };\n }, [db, isDbReady, user?.id]);\n\n // ─── Sign Out ────────────────────────────────────────────────────────────────\n\n const handleSignOut = useCallback(async () => {\n const {\n error: error_1\n } = await supabase.auth.signOut();\n if (error_1) {\n console.error(\"[OfflineAuthProvider] Sign out error:\", error_1);\n throw error_1;\n }\n }, [supabase]);\n\n // ─── Loading State ───────────────────────────────────────────────────────────\n\n const isLoading = isLoadingUser || !!user && isLoadingData;\n\n // ─── Render ──────────────────────────────────────────────────────────────────\n\n return <SimpleAuthProvider user={user} profile={profile} userAccess={userAccess} isLoading={isLoading} onSignOut={handleSignOut}>\n {children}\n </SimpleAuthProvider>;\n}"],"mappings":"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","names":["t3","useCallback","jsx","useCallback"]}