@eminuckan/spine 0.2.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.
- package/CHANGELOG.md +47 -0
- package/LICENSE +21 -0
- package/README.md +425 -0
- package/dist/api-client/index.d.ts +3 -0
- package/dist/api-client/index.js +4 -0
- package/dist/api-client/server.d.ts +4 -0
- package/dist/api-client/server.js +5 -0
- package/dist/api-client-Ftxqm3Ep.js +212 -0
- package/dist/api-client-Ftxqm3Ep.js.map +1 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.js +0 -0
- package/dist/auth/server.d.ts +3 -0
- package/dist/auth/server.js +6 -0
- package/dist/auth.server-C979TR6W.js +724 -0
- package/dist/auth.server-C979TR6W.js.map +1 -0
- package/dist/auth.server-DU-x2LPA.js +5 -0
- package/dist/identity/index.d.ts +4 -0
- package/dist/identity/index.js +3 -0
- package/dist/identity/server.d.ts +4 -0
- package/dist/identity/server.js +4 -0
- package/dist/identity-CFa1txoj.js +235 -0
- package/dist/identity-CFa1txoj.js.map +1 -0
- package/dist/index-BIJOC8Fb.d.ts +272 -0
- package/dist/index-BIJOC8Fb.d.ts.map +1 -0
- package/dist/index-Bt9XE6gj.d.ts +104 -0
- package/dist/index-Bt9XE6gj.d.ts.map +1 -0
- package/dist/index-C2hGpzGr.d.ts +74 -0
- package/dist/index-C2hGpzGr.d.ts.map +1 -0
- package/dist/index-CfQsb3l_.d.ts +170 -0
- package/dist/index-CfQsb3l_.d.ts.map +1 -0
- package/dist/index-D6RK_5vm.d.ts +199 -0
- package/dist/index-D6RK_5vm.d.ts.map +1 -0
- package/dist/index-DrttYPAj.d.ts +30 -0
- package/dist/index-DrttYPAj.d.ts.map +1 -0
- package/dist/index-geY2ynnN.d.ts +141 -0
- package/dist/index-geY2ynnN.d.ts.map +1 -0
- package/dist/index-kr8Wk7v5.d.ts +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +10 -0
- package/dist/logging/index.d.ts +3 -0
- package/dist/logging/index.js +3 -0
- package/dist/logging-_h2mi3L9.js +118 -0
- package/dist/logging-_h2mi3L9.js.map +1 -0
- package/dist/permissions/index.d.ts +2 -0
- package/dist/permissions/index.js +3 -0
- package/dist/permissions-D5ScGGnd.js +281 -0
- package/dist/permissions-D5ScGGnd.js.map +1 -0
- package/dist/query-client/index.d.ts +2 -0
- package/dist/query-client/index.js +3 -0
- package/dist/query-client-DRPQIKHX.js +174 -0
- package/dist/query-client-DRPQIKHX.js.map +1 -0
- package/dist/react-router/index.d.ts +12 -0
- package/dist/react-router/index.js +10 -0
- package/dist/react-router/server.d.ts +18 -0
- package/dist/react-router/server.js +17 -0
- package/dist/redis-session-storage.server-DhufyPjd.js +250 -0
- package/dist/redis-session-storage.server-DhufyPjd.js.map +1 -0
- package/dist/server-BoeUiXSh.d.ts +40 -0
- package/dist/server-BoeUiXSh.d.ts.map +1 -0
- package/dist/server-C-DiVP9e.js +185 -0
- package/dist/server-C-DiVP9e.js.map +1 -0
- package/dist/server-CLbksnvg.d.ts +144 -0
- package/dist/server-CLbksnvg.d.ts.map +1 -0
- package/dist/server-CNp6gjFE.js +78 -0
- package/dist/server-CNp6gjFE.js.map +1 -0
- package/dist/server-CXGaRaiS.d.ts +256 -0
- package/dist/server-CXGaRaiS.d.ts.map +1 -0
- package/dist/server-CiSbg-9C.js +352 -0
- package/dist/server-CiSbg-9C.js.map +1 -0
- package/dist/server-DLgH3FRR.js +312 -0
- package/dist/server-DLgH3FRR.js.map +1 -0
- package/dist/server-DazqdM63.d.ts +93 -0
- package/dist/server-DazqdM63.d.ts.map +1 -0
- package/dist/server-iWm3oeCM.js +145 -0
- package/dist/server-iWm3oeCM.js.map +1 -0
- package/dist/server-zEKMDpP7.d.ts +80 -0
- package/dist/server-zEKMDpP7.d.ts.map +1 -0
- package/dist/server.d.ts +18 -0
- package/dist/server.js +17 -0
- package/dist/signalr/index.d.ts +4 -0
- package/dist/signalr/index.js +3 -0
- package/dist/signalr-BJGcXc0m.js +274 -0
- package/dist/signalr-BJGcXc0m.js.map +1 -0
- package/dist/src-D7mh9MKA.js +0 -0
- package/dist/tenant/index.d.ts +3 -0
- package/dist/tenant/index.js +3 -0
- package/dist/tenant/server.d.ts +3 -0
- package/dist/tenant/server.js +5 -0
- package/dist/tenant-C6KPaSCX.js +256 -0
- package/dist/tenant-C6KPaSCX.js.map +1 -0
- package/dist/types-BTjFzIhv.d.ts +31 -0
- package/dist/types-BTjFzIhv.d.ts.map +1 -0
- package/dist/types-DoIfDhl6.d.ts +55 -0
- package/dist/types-DoIfDhl6.d.ts.map +1 -0
- package/dist/types-DufLRY7A.d.ts +164 -0
- package/dist/types-DufLRY7A.d.ts.map +1 -0
- package/dist/types-uDrDMkCq.d.ts +93 -0
- package/dist/types-uDrDMkCq.d.ts.map +1 -0
- package/package.json +147 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { create } from "zustand";
|
|
2
|
+
import { useCallback, useEffect, useMemo } from "react";
|
|
3
|
+
import { Fragment, jsx } from "react/jsx-runtime";
|
|
4
|
+
|
|
5
|
+
//#region src/permissions/permission-service.ts
|
|
6
|
+
/**
|
|
7
|
+
* Permission Checker Class
|
|
8
|
+
*
|
|
9
|
+
* Provides methods for checking user permissions.
|
|
10
|
+
*/
|
|
11
|
+
var PermissionChecker = class {
|
|
12
|
+
permissions;
|
|
13
|
+
permissionArray;
|
|
14
|
+
constructor(permissions) {
|
|
15
|
+
this.permissionArray = permissions;
|
|
16
|
+
this.permissions = new Set(permissions);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if user has a single permission
|
|
20
|
+
*/
|
|
21
|
+
hasPermission(permission) {
|
|
22
|
+
return this.permissions.has(permission);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Check multiple permissions with AND/OR logic
|
|
26
|
+
*/
|
|
27
|
+
hasPermissions(permissions, options = {}) {
|
|
28
|
+
const { operator = "OR", wildcard = false } = options;
|
|
29
|
+
const matchedPermissions = [];
|
|
30
|
+
const missingPermissions = [];
|
|
31
|
+
for (const permission of permissions) {
|
|
32
|
+
const hasIt = wildcard ? this.hasWildcardPermission(permission) : this.hasPermission(permission);
|
|
33
|
+
if (hasIt) matchedPermissions.push(permission);
|
|
34
|
+
else missingPermissions.push(permission);
|
|
35
|
+
}
|
|
36
|
+
const hasPermission = operator === "AND" ? missingPermissions.length === 0 : matchedPermissions.length > 0;
|
|
37
|
+
return {
|
|
38
|
+
hasPermission,
|
|
39
|
+
matchedPermissions,
|
|
40
|
+
missingPermissions
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check wildcard permission pattern
|
|
45
|
+
*/
|
|
46
|
+
hasWildcardPermission(pattern) {
|
|
47
|
+
if (!pattern.includes("*")) return this.hasPermission(pattern);
|
|
48
|
+
const regex = new RegExp("^" + pattern.replace(/\./g, "\\.").replace(/\*/g, ".*") + "$");
|
|
49
|
+
return this.permissionArray.some((p) => regex.test(p));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if user has any permission in a module
|
|
53
|
+
*/
|
|
54
|
+
hasModulePermission(module) {
|
|
55
|
+
const prefix = `${module}.`;
|
|
56
|
+
return this.permissionArray.some((p) => p.startsWith(prefix));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get field-level permissions for an entity
|
|
60
|
+
*/
|
|
61
|
+
getFieldPermissions(module, entity) {
|
|
62
|
+
const base = `${module}.${entity}`;
|
|
63
|
+
return {
|
|
64
|
+
canView: this.hasPermission(`${base}.View`),
|
|
65
|
+
canEdit: this.hasPermission(`${base}.Edit`),
|
|
66
|
+
canCreate: this.hasPermission(`${base}.Create`),
|
|
67
|
+
canDelete: this.hasPermission(`${base}.Delete`)
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get all permissions
|
|
72
|
+
*/
|
|
73
|
+
getAllPermissions() {
|
|
74
|
+
return Object.freeze([...this.permissionArray]);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get permissions for a specific module
|
|
78
|
+
*/
|
|
79
|
+
getModulePermissions(module) {
|
|
80
|
+
const prefix = `${module}.`;
|
|
81
|
+
return this.permissionArray.filter((p) => p.startsWith(prefix));
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Check if user has any permissions
|
|
85
|
+
*/
|
|
86
|
+
hasAnyPermissions() {
|
|
87
|
+
return this.permissionArray.length > 0;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get permission count
|
|
91
|
+
*/
|
|
92
|
+
getPermissionCount() {
|
|
93
|
+
return this.permissionArray.length;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
//#endregion
|
|
98
|
+
//#region src/permissions/permission-store.ts
|
|
99
|
+
/**
|
|
100
|
+
* Selectors for selective subscription
|
|
101
|
+
*/
|
|
102
|
+
const selectChecker = (state) => state.checker;
|
|
103
|
+
/**
|
|
104
|
+
* Initial state
|
|
105
|
+
*/
|
|
106
|
+
const initialState = {
|
|
107
|
+
checker: new PermissionChecker([]),
|
|
108
|
+
permissions: [],
|
|
109
|
+
isLoading: false
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Permission store
|
|
113
|
+
*/
|
|
114
|
+
const usePermissionStore = create((set) => ({
|
|
115
|
+
...initialState,
|
|
116
|
+
setPermissions: (permissions) => {
|
|
117
|
+
set({
|
|
118
|
+
permissions,
|
|
119
|
+
checker: new PermissionChecker(permissions)
|
|
120
|
+
});
|
|
121
|
+
},
|
|
122
|
+
setLoading: (isLoading) => {
|
|
123
|
+
set({ isLoading });
|
|
124
|
+
},
|
|
125
|
+
reset: () => {
|
|
126
|
+
set(initialState);
|
|
127
|
+
}
|
|
128
|
+
}));
|
|
129
|
+
/**
|
|
130
|
+
* Initialize permission store
|
|
131
|
+
*/
|
|
132
|
+
function initializePermissions(permissions, isLoading = false) {
|
|
133
|
+
usePermissionStore.getState().setPermissions(permissions);
|
|
134
|
+
usePermissionStore.getState().setLoading(isLoading);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get permission checker outside React components
|
|
138
|
+
*/
|
|
139
|
+
function getPermissionChecker() {
|
|
140
|
+
return usePermissionStore.getState().checker;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get all permissions outside React components
|
|
144
|
+
*/
|
|
145
|
+
function getPermissions() {
|
|
146
|
+
return usePermissionStore.getState().permissions;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
//#endregion
|
|
150
|
+
//#region src/permissions/permission-initializer.tsx
|
|
151
|
+
/**
|
|
152
|
+
* Component that initializes permissions from props
|
|
153
|
+
*/
|
|
154
|
+
function PermissionInitializer({ permissions, isLoading = false, children }) {
|
|
155
|
+
useEffect(() => {
|
|
156
|
+
initializePermissions(permissions, isLoading);
|
|
157
|
+
}, [permissions, isLoading]);
|
|
158
|
+
return /* @__PURE__ */ jsx(Fragment, { children });
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
//#endregion
|
|
162
|
+
//#region src/permissions/hooks.ts
|
|
163
|
+
/**
|
|
164
|
+
* Hook for checking a single permission
|
|
165
|
+
*/
|
|
166
|
+
function usePermission(permission) {
|
|
167
|
+
const checker = usePermissionStore(selectChecker);
|
|
168
|
+
return useMemo(() => checker.hasPermission(permission), [checker, permission]);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Alias for usePermission
|
|
172
|
+
*/
|
|
173
|
+
const useHasPermission = usePermission;
|
|
174
|
+
/**
|
|
175
|
+
* Hook for checking multiple permissions
|
|
176
|
+
*/
|
|
177
|
+
function usePermissions(permissions, options) {
|
|
178
|
+
const checker = usePermissionStore(selectChecker);
|
|
179
|
+
return useMemo(() => checker.hasPermissions(permissions, options), [
|
|
180
|
+
checker,
|
|
181
|
+
permissions,
|
|
182
|
+
options
|
|
183
|
+
]);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Alias for usePermissions
|
|
187
|
+
*/
|
|
188
|
+
const useHasPermissions = usePermissions;
|
|
189
|
+
/**
|
|
190
|
+
* Hook for checking module-level permissions
|
|
191
|
+
*/
|
|
192
|
+
function useModulePermission(module) {
|
|
193
|
+
const checker = usePermissionStore(selectChecker);
|
|
194
|
+
return useMemo(() => checker.hasModulePermission(module), [checker, module]);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Alias for useModulePermission
|
|
198
|
+
*/
|
|
199
|
+
const useHasModulePermission = useModulePermission;
|
|
200
|
+
/**
|
|
201
|
+
* Hook for getting a memoized permission checker function
|
|
202
|
+
*/
|
|
203
|
+
function usePermissionChecker() {
|
|
204
|
+
const checker = usePermissionStore(selectChecker);
|
|
205
|
+
return useCallback((permission) => checker.hasPermission(permission), [checker]);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Hook for getting all user permissions
|
|
209
|
+
*/
|
|
210
|
+
function useAllPermissions() {
|
|
211
|
+
const checker = usePermissionStore(selectChecker);
|
|
212
|
+
return useMemo(() => checker.getAllPermissions(), [checker]);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
//#endregion
|
|
216
|
+
//#region src/permissions/components.tsx
|
|
217
|
+
/**
|
|
218
|
+
* Button that only renders if user has the required permission
|
|
219
|
+
*/
|
|
220
|
+
function ProtectedButton({ permission, fallback = null, children,...props }) {
|
|
221
|
+
const hasPermission = usePermission(permission);
|
|
222
|
+
if (!hasPermission) return /* @__PURE__ */ jsx(Fragment, { children: fallback });
|
|
223
|
+
return /* @__PURE__ */ jsx("button", {
|
|
224
|
+
...props,
|
|
225
|
+
children
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Link that only renders if user has the required permission
|
|
230
|
+
*/
|
|
231
|
+
function ProtectedLink({ permission, fallback = null, children,...props }) {
|
|
232
|
+
const hasPermission = usePermission(permission);
|
|
233
|
+
if (!hasPermission) return /* @__PURE__ */ jsx(Fragment, { children: fallback });
|
|
234
|
+
return /* @__PURE__ */ jsx("a", {
|
|
235
|
+
...props,
|
|
236
|
+
children
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Section that only renders if user has the required permission(s)
|
|
241
|
+
*/
|
|
242
|
+
function ProtectedSection({ permission, permissions, options, fallback = null, children }) {
|
|
243
|
+
const singlePermissionResult = usePermission(permission || "");
|
|
244
|
+
const multiplePermissionsResult = usePermissions(permissions || [], options);
|
|
245
|
+
let hasPermission = false;
|
|
246
|
+
if (permission) hasPermission = singlePermissionResult;
|
|
247
|
+
else if (permissions && permissions.length > 0) hasPermission = multiplePermissionsResult.hasPermission;
|
|
248
|
+
else hasPermission = true;
|
|
249
|
+
if (!hasPermission) return /* @__PURE__ */ jsx(Fragment, { children: fallback });
|
|
250
|
+
return /* @__PURE__ */ jsx(Fragment, { children });
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Render prop component for protected actions
|
|
254
|
+
*/
|
|
255
|
+
function ProtectedAction({ permission, onAction, children }) {
|
|
256
|
+
const hasPermission = usePermission(permission);
|
|
257
|
+
return /* @__PURE__ */ jsx(Fragment, { children: children({
|
|
258
|
+
onClick: hasPermission ? onAction : () => {},
|
|
259
|
+
disabled: !hasPermission
|
|
260
|
+
}) });
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
//#endregion
|
|
264
|
+
//#region src/permissions/constants.ts
|
|
265
|
+
/**
|
|
266
|
+
* Available permission modules
|
|
267
|
+
*/
|
|
268
|
+
const PERMISSION_MODULES = [
|
|
269
|
+
"Identity",
|
|
270
|
+
"PropertyManagement",
|
|
271
|
+
"Leasing",
|
|
272
|
+
"Accounting",
|
|
273
|
+
"Tasks",
|
|
274
|
+
"People",
|
|
275
|
+
"Organization",
|
|
276
|
+
"Subscription"
|
|
277
|
+
];
|
|
278
|
+
|
|
279
|
+
//#endregion
|
|
280
|
+
export { PERMISSION_MODULES, PermissionChecker, PermissionInitializer, ProtectedAction, ProtectedButton, ProtectedLink, ProtectedSection, getPermissionChecker, getPermissions, initializePermissions, useAllPermissions, useHasModulePermission, useHasPermission, useHasPermissions, useModulePermission, usePermission, usePermissionChecker, usePermissionStore, usePermissions };
|
|
281
|
+
//# sourceMappingURL=permissions-D5ScGGnd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions-D5ScGGnd.js","names":["permissions: PermissionCode[]","permission: PermissionCode","options: PermissionCheckOptions","matchedPermissions: PermissionCode[]","missingPermissions: PermissionCode[]","pattern: PermissionCode","module: PermissionModule","entity: string","state: PermissionState","permissions: PermissionCode[]","isLoading: boolean","permission: PermissionCode","permissions: PermissionCode[]","options?: PermissionCheckOptions","module: PermissionModule","PERMISSION_MODULES: PermissionModule[]"],"sources":["../src/permissions/permission-service.ts","../src/permissions/permission-store.ts","../src/permissions/permission-initializer.tsx","../src/permissions/hooks.ts","../src/permissions/components.tsx","../src/permissions/constants.ts"],"sourcesContent":["/**\n * Permission Service\n * \n * Core permission checking logic.\n */\n\nimport type {\n PermissionCode,\n PermissionModule,\n PermissionCheckOptions,\n PermissionCheckResult,\n FieldPermissionResult,\n} from './types';\n\n/**\n * Permission Checker Class\n * \n * Provides methods for checking user permissions.\n */\nexport class PermissionChecker {\n private permissions: Set<PermissionCode>;\n private permissionArray: PermissionCode[];\n\n constructor(permissions: PermissionCode[]) {\n this.permissionArray = permissions;\n this.permissions = new Set(permissions);\n }\n\n /**\n * Check if user has a single permission\n */\n hasPermission(permission: PermissionCode): boolean {\n return this.permissions.has(permission);\n }\n\n /**\n * Check multiple permissions with AND/OR logic\n */\n hasPermissions(\n permissions: PermissionCode[],\n options: PermissionCheckOptions = {}\n ): PermissionCheckResult {\n const { operator = 'OR', wildcard = false } = options;\n\n const matchedPermissions: PermissionCode[] = [];\n const missingPermissions: PermissionCode[] = [];\n\n for (const permission of permissions) {\n const hasIt = wildcard\n ? this.hasWildcardPermission(permission)\n : this.hasPermission(permission);\n\n if (hasIt) {\n matchedPermissions.push(permission);\n } else {\n missingPermissions.push(permission);\n }\n }\n\n const hasPermission =\n operator === 'AND'\n ? missingPermissions.length === 0\n : matchedPermissions.length > 0;\n\n return {\n hasPermission,\n matchedPermissions,\n missingPermissions,\n };\n }\n\n /**\n * Check wildcard permission pattern\n */\n private hasWildcardPermission(pattern: PermissionCode): boolean {\n if (!pattern.includes('*')) {\n return this.hasPermission(pattern);\n }\n\n const regex = new RegExp(\n '^' + pattern.replace(/\\./g, '\\\\.').replace(/\\*/g, '.*') + '$'\n );\n\n return this.permissionArray.some((p) => regex.test(p));\n }\n\n /**\n * Check if user has any permission in a module\n */\n hasModulePermission(module: PermissionModule): boolean {\n const prefix = `${module}.`;\n return this.permissionArray.some((p) => p.startsWith(prefix));\n }\n\n /**\n * Get field-level permissions for an entity\n */\n getFieldPermissions(\n module: PermissionModule,\n entity: string\n ): FieldPermissionResult {\n const base = `${module}.${entity}`;\n\n return {\n canView: this.hasPermission(`${base}.View`),\n canEdit: this.hasPermission(`${base}.Edit`),\n canCreate: this.hasPermission(`${base}.Create`),\n canDelete: this.hasPermission(`${base}.Delete`),\n };\n }\n\n /**\n * Get all permissions\n */\n getAllPermissions(): readonly PermissionCode[] {\n return Object.freeze([...this.permissionArray]);\n }\n\n /**\n * Get permissions for a specific module\n */\n getModulePermissions(module: PermissionModule): PermissionCode[] {\n const prefix = `${module}.`;\n return this.permissionArray.filter((p) => p.startsWith(prefix));\n }\n\n /**\n * Check if user has any permissions\n */\n hasAnyPermissions(): boolean {\n return this.permissionArray.length > 0;\n }\n\n /**\n * Get permission count\n */\n getPermissionCount(): number {\n return this.permissionArray.length;\n }\n}\n","/**\n * Permission Store (Zustand)\n * \n * State management for permissions.\n */\n\nimport { create } from 'zustand';\nimport { PermissionChecker } from './permission-service';\nimport type { PermissionCode } from './types';\n\n/**\n * Permission store state interface\n */\ninterface PermissionState {\n checker: PermissionChecker;\n permissions: PermissionCode[];\n isLoading: boolean;\n setPermissions: (permissions: PermissionCode[]) => void;\n setLoading: (isLoading: boolean) => void;\n reset: () => void;\n}\n\n/**\n * Selectors for selective subscription\n */\nexport const selectChecker = (state: PermissionState) => state.checker;\nexport const selectPermissions = (state: PermissionState) => state.permissions;\nexport const selectIsLoading = (state: PermissionState) => state.isLoading;\n\n/**\n * Initial state\n */\nconst initialState = {\n checker: new PermissionChecker([]),\n permissions: [] as PermissionCode[],\n isLoading: false,\n};\n\n/**\n * Permission store\n */\nexport const usePermissionStore = create<PermissionState>((set) => ({\n ...initialState,\n\n setPermissions: (permissions: PermissionCode[]) => {\n set({\n permissions,\n checker: new PermissionChecker(permissions),\n });\n },\n\n setLoading: (isLoading: boolean) => {\n set({ isLoading });\n },\n\n reset: () => {\n set(initialState);\n },\n}));\n\n/**\n * Initialize permission store\n */\nexport function initializePermissions(\n permissions: PermissionCode[],\n isLoading: boolean = false\n): void {\n usePermissionStore.getState().setPermissions(permissions);\n usePermissionStore.getState().setLoading(isLoading);\n}\n\n/**\n * Get permission checker outside React components\n */\nexport function getPermissionChecker(): PermissionChecker {\n return usePermissionStore.getState().checker;\n}\n\n/**\n * Get all permissions outside React components\n */\nexport function getPermissions(): PermissionCode[] {\n return usePermissionStore.getState().permissions;\n}\n","/**\n * Permission Initializer Component\n * \n * Initializes permission store from identity context.\n */\n\nimport { useEffect, type ReactNode } from 'react';\nimport { initializePermissions } from './permission-store';\nimport type { PermissionCode } from './types';\n\ninterface PermissionInitializerProps {\n permissions: PermissionCode[];\n isLoading?: boolean;\n children: ReactNode;\n}\n\n/**\n * Component that initializes permissions from props\n */\nexport function PermissionInitializer({\n permissions,\n isLoading = false,\n children,\n}: PermissionInitializerProps) {\n useEffect(() => {\n initializePermissions(permissions, isLoading);\n }, [permissions, isLoading]);\n\n return <>{children}</>;\n}\n","/**\n * Permission Hooks\n * \n * React hooks for permission checks.\n */\n\nimport { useMemo, useCallback } from 'react';\nimport { usePermissionStore, selectChecker } from './permission-store';\nimport type { PermissionCode, PermissionCheckOptions, PermissionModule } from './types';\n\n/**\n * Hook for checking a single permission\n */\nexport function usePermission(permission: PermissionCode): boolean {\n const checker = usePermissionStore(selectChecker);\n return useMemo(() => checker.hasPermission(permission), [checker, permission]);\n}\n\n/**\n * Alias for usePermission\n */\nexport const useHasPermission = usePermission;\n\n/**\n * Hook for checking multiple permissions\n */\nexport function usePermissions(\n permissions: PermissionCode[],\n options?: PermissionCheckOptions\n) {\n const checker = usePermissionStore(selectChecker);\n return useMemo(\n () => checker.hasPermissions(permissions, options),\n [checker, permissions, options]\n );\n}\n\n/**\n * Alias for usePermissions\n */\nexport const useHasPermissions = usePermissions;\n\n/**\n * Hook for checking module-level permissions\n */\nexport function useModulePermission(module: PermissionModule): boolean {\n const checker = usePermissionStore(selectChecker);\n return useMemo(() => checker.hasModulePermission(module), [checker, module]);\n}\n\n/**\n * Alias for useModulePermission\n */\nexport const useHasModulePermission = useModulePermission;\n\n/**\n * Hook for getting a memoized permission checker function\n */\nexport function usePermissionChecker() {\n const checker = usePermissionStore(selectChecker);\n return useCallback(\n (permission: PermissionCode) => checker.hasPermission(permission),\n [checker]\n );\n}\n\n/**\n * Hook for getting all user permissions\n */\nexport function useAllPermissions(): readonly PermissionCode[] {\n const checker = usePermissionStore(selectChecker);\n return useMemo(() => checker.getAllPermissions(), [checker]);\n}\n\n/**\n * Hook for field-level permissions\n */\nexport function useFieldPermissions(module: PermissionModule, entity: string) {\n const checker = usePermissionStore(selectChecker);\n return useMemo(\n () => checker.getFieldPermissions(module, entity),\n [checker, module, entity]\n );\n}\n\n/**\n * Hook for permission loading state\n */\nexport function usePermissionLoading(): boolean {\n return usePermissionStore((state) => state.isLoading);\n}\n","/**\n * Permission Components\n * \n * Protected UI components that conditionally render based on permissions.\n */\n\nimport React, { type ReactNode, type ComponentProps } from 'react';\nimport { usePermission, usePermissions } from './hooks';\nimport type { PermissionCode, PermissionCheckOptions } from './types';\n\n// ============================================================================\n// ProtectedButton\n// ============================================================================\n\ninterface ProtectedButtonProps extends ComponentProps<'button'> {\n permission: PermissionCode;\n fallback?: ReactNode;\n}\n\n/**\n * Button that only renders if user has the required permission\n */\nexport function ProtectedButton({\n permission,\n fallback = null,\n children,\n ...props\n}: ProtectedButtonProps) {\n const hasPermission = usePermission(permission);\n\n if (!hasPermission) {\n return <>{fallback}</>;\n }\n\n return <button {...props}>{children}</button>;\n}\n\n// ============================================================================\n// ProtectedLink\n// ============================================================================\n\ninterface ProtectedLinkProps extends ComponentProps<'a'> {\n permission: PermissionCode;\n fallback?: ReactNode;\n}\n\n/**\n * Link that only renders if user has the required permission\n */\nexport function ProtectedLink({\n permission,\n fallback = null,\n children,\n ...props\n}: ProtectedLinkProps) {\n const hasPermission = usePermission(permission);\n\n if (!hasPermission) {\n return <>{fallback}</>;\n }\n\n return <a {...props}>{children}</a>;\n}\n\n// ============================================================================\n// ProtectedSection\n// ============================================================================\n\ninterface ProtectedSectionProps {\n permission?: PermissionCode;\n permissions?: PermissionCode[];\n options?: PermissionCheckOptions;\n fallback?: ReactNode;\n children: ReactNode;\n}\n\n/**\n * Section that only renders if user has the required permission(s)\n */\nexport function ProtectedSection({\n permission,\n permissions,\n options,\n fallback = null,\n children,\n}: ProtectedSectionProps) {\n // Single permission check\n const singlePermissionResult = usePermission(permission || '');\n \n // Multiple permissions check\n const multiplePermissionsResult = usePermissions(permissions || [], options);\n\n // Determine if we should render\n let hasPermission = false;\n \n if (permission) {\n hasPermission = singlePermissionResult;\n } else if (permissions && permissions.length > 0) {\n hasPermission = multiplePermissionsResult.hasPermission;\n } else {\n // No permission specified, render by default\n hasPermission = true;\n }\n\n if (!hasPermission) {\n return <>{fallback}</>;\n }\n\n return <>{children}</>;\n}\n\n// ============================================================================\n// ProtectedAction\n// ============================================================================\n\ninterface ProtectedActionProps {\n permission: PermissionCode;\n onAction: () => void;\n children: (props: { onClick: () => void; disabled: boolean }) => ReactNode;\n}\n\n/**\n * Render prop component for protected actions\n */\nexport function ProtectedAction({\n permission,\n onAction,\n children,\n}: ProtectedActionProps) {\n const hasPermission = usePermission(permission);\n\n return (\n <>\n {children({\n onClick: hasPermission ? onAction : () => {},\n disabled: !hasPermission,\n })}\n </>\n );\n}\n","/**\n * Permission Constants\n */\n\nimport type { PermissionModule } from './types';\n\n/**\n * Available permission modules\n */\nexport const PERMISSION_MODULES: PermissionModule[] = [\n 'Identity',\n 'PropertyManagement',\n 'Leasing',\n 'Accounting',\n 'Tasks',\n 'People',\n 'Organization',\n 'Subscription',\n];\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { CachePreset, CachePresets, InvalidationHelpers, LogoutHandler, QueryClientConfig, QueryLogger, cachePresets$1 as cachePresets, createQueryClient$1 as createQueryClient, createQueryKeyFactory$1 as createQueryKeyFactory, invalidationHelpers$1 as invalidationHelpers } from "../index-CfQsb3l_.js";
|
|
2
|
+
export { CachePreset, CachePresets, InvalidationHelpers, LogoutHandler, QueryClientConfig, QueryLogger, cachePresets, createQueryClient, createQueryKeyFactory, invalidationHelpers };
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { MutationCache, QueryCache, QueryClient } from "@tanstack/react-query";
|
|
2
|
+
|
|
3
|
+
//#region src/query-client/query-config.ts
|
|
4
|
+
/**
|
|
5
|
+
* Default configuration
|
|
6
|
+
*/
|
|
7
|
+
const DEFAULT_CONFIG = {
|
|
8
|
+
staleTime: 5 * 60 * 1e3,
|
|
9
|
+
gcTime: 10 * 60 * 1e3,
|
|
10
|
+
maxRetries: 3,
|
|
11
|
+
maxMutationRetries: 1,
|
|
12
|
+
refetchOnWindowFocus: true,
|
|
13
|
+
refetchOnReconnect: false,
|
|
14
|
+
refetchOnMount: false
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Check if error is a 401 Unauthorized error
|
|
18
|
+
*/
|
|
19
|
+
function is401Error(error) {
|
|
20
|
+
if (error instanceof Response) return error.status === 401;
|
|
21
|
+
if (error && typeof error === "object" && "status" in error) return error.status === 401;
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Check if error requires logout (refresh token expired)
|
|
26
|
+
*/
|
|
27
|
+
function shouldLogout(error) {
|
|
28
|
+
if (error && typeof error === "object") {
|
|
29
|
+
if ("shouldLogout" in error && error.shouldLogout === true) return true;
|
|
30
|
+
if ("code" in error && error.code === "SESSION_EXPIRED") return true;
|
|
31
|
+
}
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create default logout handler
|
|
36
|
+
*/
|
|
37
|
+
function createDefaultLogoutHandler() {
|
|
38
|
+
return (returnUrl) => {
|
|
39
|
+
if (typeof window !== "undefined") {
|
|
40
|
+
const currentUrl = returnUrl || window.location.pathname + window.location.search;
|
|
41
|
+
window.location.href = `/auth/logout?returnUrl=${encodeURIComponent(currentUrl)}`;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Create optimized QueryClient instance
|
|
47
|
+
*
|
|
48
|
+
* @param config - Configuration options
|
|
49
|
+
* @returns Configured QueryClient with optimized defaults
|
|
50
|
+
*/
|
|
51
|
+
function createQueryClient(config = {}) {
|
|
52
|
+
const { staleTime, gcTime, maxRetries, maxMutationRetries, refetchOnWindowFocus, refetchOnReconnect, refetchOnMount, logger, onLogout } = {
|
|
53
|
+
...DEFAULT_CONFIG,
|
|
54
|
+
...config
|
|
55
|
+
};
|
|
56
|
+
const handleLogout = onLogout || createDefaultLogoutHandler();
|
|
57
|
+
const queryClient = new QueryClient({
|
|
58
|
+
defaultOptions: {
|
|
59
|
+
queries: {
|
|
60
|
+
staleTime,
|
|
61
|
+
gcTime,
|
|
62
|
+
retry: (failureCount, error) => {
|
|
63
|
+
if (is401Error(error)) {
|
|
64
|
+
logger?.debug?.("Query failed with 401, not retrying");
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return failureCount < maxRetries;
|
|
68
|
+
},
|
|
69
|
+
retryDelay: (attemptIndex) => Math.min(1e3 * 2 ** attemptIndex, 3e4),
|
|
70
|
+
refetchOnWindowFocus,
|
|
71
|
+
refetchOnReconnect,
|
|
72
|
+
refetchOnMount
|
|
73
|
+
},
|
|
74
|
+
mutations: {
|
|
75
|
+
retry: (failureCount, error) => {
|
|
76
|
+
if (is401Error(error)) {
|
|
77
|
+
logger?.debug?.("Mutation failed with 401, not retrying");
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
return failureCount < maxMutationRetries;
|
|
81
|
+
},
|
|
82
|
+
retryDelay: 1e3
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
queryCache: new QueryCache({ onError: (error) => {
|
|
86
|
+
if (shouldLogout(error)) {
|
|
87
|
+
handleLogout();
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
logger?.error?.("Query error", error instanceof Error ? error : void 0, { is401: is401Error(error) });
|
|
91
|
+
} }),
|
|
92
|
+
mutationCache: new MutationCache({ onError: (error) => {
|
|
93
|
+
if (shouldLogout(error)) {
|
|
94
|
+
handleLogout();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
logger?.error?.("Mutation error", error instanceof Error ? error : void 0, { is401: is401Error(error) });
|
|
98
|
+
} })
|
|
99
|
+
});
|
|
100
|
+
return queryClient;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Cache Presets for different data types
|
|
104
|
+
*
|
|
105
|
+
* Use these presets for consistent caching across the application.
|
|
106
|
+
*/
|
|
107
|
+
const cachePresets = {
|
|
108
|
+
static: {
|
|
109
|
+
staleTime: 30 * 60 * 1e3,
|
|
110
|
+
gcTime: 60 * 60 * 1e3,
|
|
111
|
+
refetchOnWindowFocus: false
|
|
112
|
+
},
|
|
113
|
+
normal: {
|
|
114
|
+
staleTime: 5 * 60 * 1e3,
|
|
115
|
+
gcTime: 10 * 60 * 1e3,
|
|
116
|
+
refetchOnWindowFocus: true
|
|
117
|
+
},
|
|
118
|
+
dynamic: {
|
|
119
|
+
staleTime: 1 * 60 * 1e3,
|
|
120
|
+
gcTime: 5 * 60 * 1e3,
|
|
121
|
+
refetchOnWindowFocus: true
|
|
122
|
+
},
|
|
123
|
+
realtime: {
|
|
124
|
+
staleTime: 0,
|
|
125
|
+
gcTime: 1 * 60 * 1e3,
|
|
126
|
+
refetchOnWindowFocus: true
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* Create base query keys for a module
|
|
131
|
+
*/
|
|
132
|
+
function createQueryKeyFactory(module) {
|
|
133
|
+
return {
|
|
134
|
+
all: [module],
|
|
135
|
+
lists: () => [module, "list"],
|
|
136
|
+
list: (filters) => [
|
|
137
|
+
module,
|
|
138
|
+
"list",
|
|
139
|
+
filters
|
|
140
|
+
],
|
|
141
|
+
details: () => [module, "detail"],
|
|
142
|
+
detail: (id) => [
|
|
143
|
+
module,
|
|
144
|
+
"detail",
|
|
145
|
+
id
|
|
146
|
+
]
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Invalidation helpers for common patterns
|
|
151
|
+
*/
|
|
152
|
+
const invalidationHelpers = {
|
|
153
|
+
invalidateModule: async (queryClient, module) => {
|
|
154
|
+
await queryClient.invalidateQueries({ queryKey: [module] });
|
|
155
|
+
},
|
|
156
|
+
invalidateLists: async (queryClient, module) => {
|
|
157
|
+
await queryClient.invalidateQueries({ queryKey: [module, "list"] });
|
|
158
|
+
},
|
|
159
|
+
invalidateDetail: async (queryClient, module, id) => {
|
|
160
|
+
await queryClient.invalidateQueries({ queryKey: [
|
|
161
|
+
module,
|
|
162
|
+
"detail",
|
|
163
|
+
id
|
|
164
|
+
] });
|
|
165
|
+
},
|
|
166
|
+
invalidateAndRefetch: async (queryClient, queryKey) => {
|
|
167
|
+
await queryClient.invalidateQueries({ queryKey });
|
|
168
|
+
await queryClient.refetchQueries({ queryKey });
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
//#endregion
|
|
173
|
+
export { cachePresets, createQueryClient, createQueryKeyFactory, invalidationHelpers };
|
|
174
|
+
//# sourceMappingURL=query-client-DRPQIKHX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-client-DRPQIKHX.js","names":["DEFAULT_CONFIG: Required<Omit<QueryClientConfig, 'logger' | 'onLogout'>>","error: unknown","returnUrl?: string","config: QueryClientConfig","cachePresets: CachePresets","module: T","filters?: Record<string, unknown>","id: string","queryClient: QueryClient","module: string","queryKey: readonly unknown[]"],"sources":["../src/query-client/query-config.ts"],"sourcesContent":["/**\n * Query Client Configuration\n * \n * Optimized caching strategy for different types of data:\n * - Static data (rarely changes): Long staleTime and gcTime\n * - Dynamic data (changes frequently): Short staleTime\n * - Critical data (needs to be fresh): Very short staleTime with prefetching\n */\n\nimport { QueryClient, QueryCache, MutationCache } from '@tanstack/react-query';\nimport type { QueryClientConfig, CachePresets } from './types';\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Required<Omit<QueryClientConfig, 'logger' | 'onLogout'>> = {\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 10 * 60 * 1000, // 10 minutes\n maxRetries: 3,\n maxMutationRetries: 1,\n refetchOnWindowFocus: true,\n refetchOnReconnect: false,\n refetchOnMount: false,\n};\n\n/**\n * Check if error is a 401 Unauthorized error\n */\nfunction is401Error(error: unknown): boolean {\n if (error instanceof Response) {\n return error.status === 401;\n }\n\n if (error && typeof error === 'object' && 'status' in error) {\n return (error as any).status === 401;\n }\n\n return false;\n}\n\n/**\n * Check if error requires logout (refresh token expired)\n */\nfunction shouldLogout(error: unknown): boolean {\n if (error && typeof error === 'object') {\n // Check for shouldLogout flag from server\n if ('shouldLogout' in error && (error as any).shouldLogout === true) {\n return true;\n }\n\n // Check for SESSION_EXPIRED code\n if ('code' in error && (error as any).code === 'SESSION_EXPIRED') {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Create default logout handler\n */\nfunction createDefaultLogoutHandler(): (returnUrl?: string) => void {\n return (returnUrl?: string) => {\n if (typeof window !== 'undefined') {\n const currentUrl = returnUrl || window.location.pathname + window.location.search;\n window.location.href = `/auth/logout?returnUrl=${encodeURIComponent(currentUrl)}`;\n }\n };\n}\n\n/**\n * Create optimized QueryClient instance\n * \n * @param config - Configuration options\n * @returns Configured QueryClient with optimized defaults\n */\nexport function createQueryClient(config: QueryClientConfig = {}): QueryClient {\n const {\n staleTime,\n gcTime,\n maxRetries,\n maxMutationRetries,\n refetchOnWindowFocus,\n refetchOnReconnect,\n refetchOnMount,\n logger,\n onLogout,\n } = { ...DEFAULT_CONFIG, ...config };\n\n const handleLogout = onLogout || createDefaultLogoutHandler();\n\n const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime,\n gcTime,\n retry: (failureCount, error) => {\n // Don't retry 401 errors - they're handled by Axios interceptor\n if (is401Error(error)) {\n logger?.debug?.('Query failed with 401, not retrying');\n return false;\n }\n return failureCount < maxRetries;\n },\n retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),\n refetchOnWindowFocus,\n refetchOnReconnect,\n refetchOnMount,\n },\n mutations: {\n retry: (failureCount, error) => {\n if (is401Error(error)) {\n logger?.debug?.('Mutation failed with 401, not retrying');\n return false;\n }\n return failureCount < maxMutationRetries;\n },\n retryDelay: 1000,\n },\n },\n queryCache: new QueryCache({\n onError: (error) => {\n if (shouldLogout(error)) {\n handleLogout();\n return;\n }\n logger?.error?.('Query error', error instanceof Error ? error : undefined, {\n is401: is401Error(error),\n });\n },\n }),\n mutationCache: new MutationCache({\n onError: (error) => {\n if (shouldLogout(error)) {\n handleLogout();\n return;\n }\n logger?.error?.('Mutation error', error instanceof Error ? error : undefined, {\n is401: is401Error(error),\n });\n },\n }),\n });\n\n return queryClient;\n}\n\n/**\n * Cache Presets for different data types\n * \n * Use these presets for consistent caching across the application.\n */\nexport const cachePresets: CachePresets = {\n /**\n * Static data - rarely changes\n * Good for: permissions, roles, system settings\n */\n static: {\n staleTime: 30 * 60 * 1000, // 30 minutes\n gcTime: 60 * 60 * 1000, // 1 hour\n refetchOnWindowFocus: false,\n },\n\n /**\n * Normal data - changes occasionally\n * Good for: properties, users, organizations\n */\n normal: {\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 10 * 60 * 1000, // 10 minutes\n refetchOnWindowFocus: true,\n },\n\n /**\n * Dynamic data - changes frequently\n * Good for: transactions, activities, notifications\n */\n dynamic: {\n staleTime: 1 * 60 * 1000, // 1 minute\n gcTime: 5 * 60 * 1000, // 5 minutes\n refetchOnWindowFocus: true,\n },\n\n /**\n * Realtime data - always fresh\n * Good for: live status, counters, dashboards\n */\n realtime: {\n staleTime: 0, // Always stale\n gcTime: 1 * 60 * 1000, // 1 minute\n refetchOnWindowFocus: true,\n },\n};\n\n/**\n * Create base query keys for a module\n */\nexport function createQueryKeyFactory<T extends string>(\n module: T\n): {\n all: readonly [T];\n lists: () => readonly [T, 'list'];\n list: (filters?: Record<string, unknown>) => readonly [T, 'list', Record<string, unknown>?];\n details: () => readonly [T, 'detail'];\n detail: (id: string) => readonly [T, 'detail', string];\n} {\n return {\n all: [module] as const,\n lists: () => [module, 'list'] as const,\n list: (filters?: Record<string, unknown>) => [module, 'list', filters] as const,\n details: () => [module, 'detail'] as const,\n detail: (id: string) => [module, 'detail', id] as const,\n };\n}\n\n/**\n * Invalidation helpers for common patterns\n */\nexport const invalidationHelpers = {\n /**\n * Invalidate all queries for a module\n */\n invalidateModule: async (queryClient: QueryClient, module: string): Promise<void> => {\n await queryClient.invalidateQueries({ queryKey: [module] });\n },\n\n /**\n * Invalidate all list queries for a module\n */\n invalidateLists: async (queryClient: QueryClient, module: string): Promise<void> => {\n await queryClient.invalidateQueries({ queryKey: [module, 'list'] });\n },\n\n /**\n * Invalidate a specific detail query\n */\n invalidateDetail: async (\n queryClient: QueryClient,\n module: string,\n id: string\n ): Promise<void> => {\n await queryClient.invalidateQueries({ queryKey: [module, 'detail', id] });\n },\n\n /**\n * Invalidate and refetch (useful for critical data)\n */\n invalidateAndRefetch: async (queryClient: QueryClient, queryKey: readonly unknown[]): Promise<void> => {\n await queryClient.invalidateQueries({ queryKey });\n await queryClient.refetchQueries({ queryKey });\n },\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { LogContext, LogEntry, LogLevel$1 as LogLevel, LoggerConfig } from "../types-BTjFzIhv.js";
|
|
2
|
+
import { APIConfig, APILogger, ApiError$1 as ApiError, CreateAPIConfigOptions, ErrorCodes$1 as ErrorCodes, ErrorHandler$1 as ErrorHandler, GetAccessTokenFn, GetCurrentTenantFn, ProblemDetails, RetryConfig, TokenRefreshFn, TokenRefreshResult, ValidationError, calculateBackoffDelay$1 as calculateBackoffDelay, createRetryFetch$1 as createRetryFetch, fetchWithTimeout$1 as fetchWithTimeout, handleApiError$1 as handleApiError, isRetryableError$1 as isRetryableError, withRetry$1 as withRetry } from "../index-D6RK_5vm.js";
|
|
3
|
+
import { OrganizationBranding, OrganizationData, TenantContextType, TenantInfo, TenantMembership } from "../types-DoIfDhl6.js";
|
|
4
|
+
import { AddressData, IdentityContextChangeHandler, IdentityContextChangedEvent, IdentityContextData } from "../types-uDrDMkCq.js";
|
|
5
|
+
import { IdentityContextProvider$1 as IdentityContextProvider, IdentityStoreConfig, IdentityUnauthorizedDetails, configureIdentityEndpoints$1 as configureIdentityEndpoints, configureIdentityStore$1 as configureIdentityStore, resetIdentityStoreConfig$1 as resetIdentityStoreConfig, useHasSubscription$1 as useHasSubscription, useIdentityContext$1 as useIdentityContext, useIdentityStore$1 as useIdentityStore, useIsOnboarded$1 as useIsOnboarded, useUserPermissions$1 as useUserPermissions, useUserTenants$1 as useUserTenants } from "../index-C2hGpzGr.js";
|
|
6
|
+
import { LOG_LEVEL_PRIORITY$1 as LOG_LEVEL_PRIORITY, Logger$1 as Logger, createLogger$1 as createLogger, defaultLoggerConfig$1 as defaultLoggerConfig, logger$1 as logger } from "../index-DrttYPAj.js";
|
|
7
|
+
import { FieldPermissionResult, PERMISSION_MODULES$1 as PERMISSION_MODULES, PermissionCheckOptions, PermissionCheckResult, PermissionChecker$1 as PermissionChecker, PermissionCode, PermissionInitializer$1 as PermissionInitializer, PermissionModule, ProtectedAction$1 as ProtectedAction, ProtectedButton$1 as ProtectedButton, ProtectedLink$1 as ProtectedLink, ProtectedSection$1 as ProtectedSection, getPermissionChecker$1 as getPermissionChecker, getPermissions$1 as getPermissions, initializePermissions$1 as initializePermissions, useAllPermissions$1 as useAllPermissions, useHasModulePermission$1 as useHasModulePermission, useHasPermission$1 as useHasPermission, useHasPermissions$1 as useHasPermissions, useModulePermission$1 as useModulePermission, usePermission$1 as usePermission, usePermissionChecker$1 as usePermissionChecker, usePermissionStore$1 as usePermissionStore, usePermissions$1 as usePermissions } from "../index-BIJOC8Fb.js";
|
|
8
|
+
import { TenantProvider$1 as TenantProvider, configureTenantEndpoints$1 as configureTenantEndpoints, initializeTenantStore$1 as initializeTenantStore, useCurrentOrganization$1 as useCurrentOrganization, useCurrentTenant$1 as useCurrentTenant, useOrganization$1 as useOrganization, useTenant$1 as useTenant, useTenantStore$1 as useTenantStore, useTenantSwitcher$1 as useTenantSwitcher } from "../index-Bt9XE6gj.js";
|
|
9
|
+
import { IdentitySignalRClient$1 as IdentitySignalRClient, SignalRClient$1 as SignalRClient, SignalRClientConfig, SignalRConnectionState, SignalREventHandler, cleanupSignalR$1 as cleanupSignalR, createIdentitySignalRClient$1 as createIdentitySignalRClient, getIdentitySignalRClient$1 as getIdentitySignalRClient, initializeSignalR$1 as initializeSignalR } from "../index-geY2ynnN.js";
|
|
10
|
+
import { CachePreset, CachePresets, InvalidationHelpers, LogoutHandler, QueryClientConfig, QueryLogger, cachePresets$1 as cachePresets, createQueryClient$1 as createQueryClient, createQueryKeyFactory$1 as createQueryKeyFactory, invalidationHelpers$1 as invalidationHelpers } from "../index-CfQsb3l_.js";
|
|
11
|
+
import "../index-kr8Wk7v5.js";
|
|
12
|
+
export { APIConfig, APILogger, AddressData, ApiError, CachePreset, CachePresets, CreateAPIConfigOptions, ErrorCodes, ErrorHandler, FieldPermissionResult, GetAccessTokenFn, GetCurrentTenantFn, IdentityContextChangeHandler, IdentityContextChangedEvent, IdentityContextData, IdentityContextProvider, IdentitySignalRClient, IdentityStoreConfig, IdentityUnauthorizedDetails, InvalidationHelpers, LOG_LEVEL_PRIORITY, LogContext, LogEntry, LogLevel, Logger, LoggerConfig, LogoutHandler, OrganizationBranding, OrganizationData, PERMISSION_MODULES, PermissionCheckOptions, PermissionCheckResult, PermissionChecker, PermissionCode, PermissionInitializer, PermissionModule, ProblemDetails, ProtectedAction, ProtectedButton, ProtectedLink, ProtectedSection, QueryClientConfig, QueryLogger, RetryConfig, SignalRClient, SignalRClientConfig, SignalRConnectionState, SignalREventHandler, TenantContextType, TenantInfo, TenantMembership, TenantProvider, TokenRefreshFn, TokenRefreshResult, ValidationError, cachePresets, calculateBackoffDelay, cleanupSignalR, configureIdentityEndpoints, configureIdentityStore, configureTenantEndpoints, createIdentitySignalRClient, createLogger, createQueryClient, createQueryKeyFactory, createRetryFetch, defaultLoggerConfig, fetchWithTimeout, getIdentitySignalRClient, getPermissionChecker, getPermissions, handleApiError, initializePermissions, initializeSignalR, initializeTenantStore, invalidationHelpers, isRetryableError, logger, resetIdentityStoreConfig, useAllPermissions, useCurrentOrganization, useCurrentTenant, useHasModulePermission, useHasPermission, useHasPermissions, useHasSubscription, useIdentityContext, useIdentityStore, useIsOnboarded, useModulePermission, useOrganization, usePermission, usePermissionChecker, usePermissionStore, usePermissions, useTenant, useTenantStore, useTenantSwitcher, useUserPermissions, useUserTenants, withRetry };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { LOG_LEVEL_PRIORITY, LogLevel, Logger, createLogger, defaultLoggerConfig, logger } from "../logging-_h2mi3L9.js";
|
|
2
|
+
import { PERMISSION_MODULES, PermissionChecker, PermissionInitializer, ProtectedAction, ProtectedButton, ProtectedLink, ProtectedSection, getPermissionChecker, getPermissions, initializePermissions, useAllPermissions, useHasModulePermission, useHasPermission, useHasPermissions, useModulePermission, usePermission, usePermissionChecker, usePermissionStore, usePermissions } from "../permissions-D5ScGGnd.js";
|
|
3
|
+
import { TenantProvider, configureTenantEndpoints, initializeTenantStore, useCurrentOrganization, useCurrentTenant, useOrganization, useTenant, useTenantStore, useTenantSwitcher } from "../tenant-C6KPaSCX.js";
|
|
4
|
+
import { IdentityContextProvider, configureIdentityEndpoints, configureIdentityStore, resetIdentityStoreConfig, useHasSubscription, useIdentityContext, useIdentityStore, useIsOnboarded, useUserPermissions, useUserTenants } from "../identity-CFa1txoj.js";
|
|
5
|
+
import { ApiError, ErrorCodes, ErrorHandler, calculateBackoffDelay, createRetryFetch, fetchWithTimeout, handleApiError, isRetryableError, withRetry } from "../api-client-Ftxqm3Ep.js";
|
|
6
|
+
import { IdentitySignalRClient, SignalRClient, cleanupSignalR, createIdentitySignalRClient, getIdentitySignalRClient, initializeSignalR } from "../signalr-BJGcXc0m.js";
|
|
7
|
+
import { cachePresets, createQueryClient, createQueryKeyFactory, invalidationHelpers } from "../query-client-DRPQIKHX.js";
|
|
8
|
+
import "../src-D7mh9MKA.js";
|
|
9
|
+
|
|
10
|
+
export { ApiError, ErrorCodes, ErrorHandler, IdentityContextProvider, IdentitySignalRClient, LOG_LEVEL_PRIORITY, LogLevel, Logger, PERMISSION_MODULES, PermissionChecker, PermissionInitializer, ProtectedAction, ProtectedButton, ProtectedLink, ProtectedSection, SignalRClient, TenantProvider, cachePresets, calculateBackoffDelay, cleanupSignalR, configureIdentityEndpoints, configureIdentityStore, configureTenantEndpoints, createIdentitySignalRClient, createLogger, createQueryClient, createQueryKeyFactory, createRetryFetch, defaultLoggerConfig, fetchWithTimeout, getIdentitySignalRClient, getPermissionChecker, getPermissions, handleApiError, initializePermissions, initializeSignalR, initializeTenantStore, invalidationHelpers, isRetryableError, logger, resetIdentityStoreConfig, useAllPermissions, useCurrentOrganization, useCurrentTenant, useHasModulePermission, useHasPermission, useHasPermissions, useHasSubscription, useIdentityContext, useIdentityStore, useIsOnboarded, useModulePermission, useOrganization, usePermission, usePermissionChecker, usePermissionStore, usePermissions, useTenant, useTenantStore, useTenantSwitcher, useUserPermissions, useUserTenants, withRetry };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { LogContext, LogEntry, LogLevel$1 as LogLevel, LoggerConfig } from "../types-BTjFzIhv.js";
|
|
2
|
+
import { APIConfig, APILogger, ApiError$1 as ApiError, CreateAPIConfigOptions, ErrorCodes$1 as ErrorCodes, ErrorHandler$1 as ErrorHandler, GetAccessTokenFn, GetCurrentTenantFn, ProblemDetails, RetryConfig, TokenRefreshFn, TokenRefreshResult, ValidationError, calculateBackoffDelay$1 as calculateBackoffDelay, createRetryFetch$1 as createRetryFetch, fetchWithTimeout$1 as fetchWithTimeout, handleApiError$1 as handleApiError, isRetryableError$1 as isRetryableError, withRetry$1 as withRetry } from "../index-D6RK_5vm.js";
|
|
3
|
+
import { APIConfigFactory, APIConfigFactoryOptions, AxiosSetupOptions, CreateEnhancedClientOptions, createAPIConfigFactory$1 as createAPIConfigFactory, createEnhancedClient$1 as createEnhancedClient, setupAxiosInterceptors$1 as setupAxiosInterceptors } from "../server-CLbksnvg.js";
|
|
4
|
+
import { ApplicationType, AuthClaimMapping, AuthConfig, AuthError, LoginOptions, OAuthState, ProtectedLoaderFn, ProtectionLevel, SessionData, SessionFlashData, TokenRefreshResult$1, UserInfo } from "../types-DufLRY7A.js";
|
|
5
|
+
import { AUTH_ERROR_COOKIE_PREFIX, AutomaticLogoutRequestContext, DefaultRouteIdentityContext, IdentityContextChecker, LoginReturnUrlContext, RouteProtectionConfig, RouteProtectionErrorHandlerContext, RouteProtectionRedirect, RouteProtectionResolverContext, SubscriptionChecker, TenantChecker, attemptTokenRefresh$1 as attemptTokenRefresh, authRoute$1 as authRoute, cleanupExpiredOAuthStates, clearAuthErrorHeaders, clearAuthServerCache, closeRedisConnection, configureAuthClaimMapping, configureRouteProtection$1 as configureRouteProtection, createAuthSession, createOAuthState, deleteOAuthState, destroyAuthSession, extractUserInfo, getAccessToken, getAuthError, getAuthSession, getOAuthState, getUser, handleCallback, hasAuthError, isSessionValid, isTokenExpiredResponse$1 as isTokenExpiredResponse, login, logout, onboardingRoute$1 as onboardingRoute, protectRoute$1 as protectRoute, publicRoute$1 as publicRoute, refreshTokens, requireAuth, requireAuthSession, resetAuthClaimMapping, resetRouteProtectionConfig$1 as resetRouteProtectionConfig, shouldAttemptTokenRefresh$1 as shouldAttemptTokenRefresh, shouldRefreshToken$1 as shouldRefreshToken, subscriptionRoute$1 as subscriptionRoute, updateAuthSession } from "../server-CXGaRaiS.js";
|
|
6
|
+
import { OrganizationBranding, OrganizationData, TenantContextType, TenantInfo, TenantMembership } from "../types-DoIfDhl6.js";
|
|
7
|
+
import { AddressData, IdentityContextChangeHandler, IdentityContextChangedEvent, IdentityContextData } from "../types-uDrDMkCq.js";
|
|
8
|
+
import { IdentityContextProvider$1 as IdentityContextProvider, IdentityStoreConfig, IdentityUnauthorizedDetails, configureIdentityEndpoints$1 as configureIdentityEndpoints, configureIdentityStore$1 as configureIdentityStore, resetIdentityStoreConfig$1 as resetIdentityStoreConfig, useHasSubscription$1 as useHasSubscription, useIdentityContext$1 as useIdentityContext, useIdentityStore$1 as useIdentityStore, useIsOnboarded$1 as useIsOnboarded, useUserPermissions$1 as useUserPermissions, useUserTenants$1 as useUserTenants } from "../index-C2hGpzGr.js";
|
|
9
|
+
import { ContextToUserInfoOptions, IdentityAPIFetcher, PermissionFetcher, UserContextInfo, clearIdentityContextCache$1 as clearIdentityContextCache, configureIdentityAPIFetcher$1 as configureIdentityAPIFetcher, configurePermissionFetcher$1 as configurePermissionFetcher, contextToUserInfo$1 as contextToUserInfo, fetchIdentityContext$1 as fetchIdentityContext, fetchUserPermissions$1 as fetchUserPermissions, getIdentityContext$1 as getIdentityContext, hasContextVersionChanged$1 as hasContextVersionChanged, updateContextVersion$1 as updateContextVersion } from "../server-zEKMDpP7.js";
|
|
10
|
+
import { LOG_LEVEL_PRIORITY$1 as LOG_LEVEL_PRIORITY, Logger$1 as Logger, createLogger$1 as createLogger, defaultLoggerConfig$1 as defaultLoggerConfig, logger$1 as logger } from "../index-DrttYPAj.js";
|
|
11
|
+
import { FieldPermissionResult, PERMISSION_MODULES$1 as PERMISSION_MODULES, PermissionCheckOptions, PermissionCheckResult, PermissionChecker$1 as PermissionChecker, PermissionCode, PermissionInitializer$1 as PermissionInitializer, PermissionModule, ProtectedAction$1 as ProtectedAction, ProtectedButton$1 as ProtectedButton, ProtectedLink$1 as ProtectedLink, ProtectedSection$1 as ProtectedSection, getPermissionChecker$1 as getPermissionChecker, getPermissions$1 as getPermissions, initializePermissions$1 as initializePermissions, useAllPermissions$1 as useAllPermissions, useHasModulePermission$1 as useHasModulePermission, useHasPermission$1 as useHasPermission, useHasPermissions$1 as useHasPermissions, useModulePermission$1 as useModulePermission, usePermission$1 as usePermission, usePermissionChecker$1 as usePermissionChecker, usePermissionStore$1 as usePermissionStore, usePermissions$1 as usePermissions } from "../index-BIJOC8Fb.js";
|
|
12
|
+
import { TenantProvider$1 as TenantProvider, configureTenantEndpoints$1 as configureTenantEndpoints, initializeTenantStore$1 as initializeTenantStore, useCurrentOrganization$1 as useCurrentOrganization, useCurrentTenant$1 as useCurrentTenant, useOrganization$1 as useOrganization, useTenant$1 as useTenant, useTenantStore$1 as useTenantStore, useTenantSwitcher$1 as useTenantSwitcher } from "../index-Bt9XE6gj.js";
|
|
13
|
+
import { IdentitySignalRClient$1 as IdentitySignalRClient, SignalRClient$1 as SignalRClient, SignalRClientConfig, SignalRConnectionState, SignalREventHandler, cleanupSignalR$1 as cleanupSignalR, createIdentitySignalRClient$1 as createIdentitySignalRClient, getIdentitySignalRClient$1 as getIdentitySignalRClient, initializeSignalR$1 as initializeSignalR } from "../index-geY2ynnN.js";
|
|
14
|
+
import { CachePreset, CachePresets, InvalidationHelpers, LogoutHandler, QueryClientConfig, QueryLogger, cachePresets$1 as cachePresets, createQueryClient$1 as createQueryClient, createQueryKeyFactory$1 as createQueryKeyFactory, invalidationHelpers$1 as invalidationHelpers } from "../index-CfQsb3l_.js";
|
|
15
|
+
import "../index-kr8Wk7v5.js";
|
|
16
|
+
import { IdentityContextFetcher, TenantCookieConfig, TenantCookieSameSite, clearActiveTenant$1 as clearActiveTenant, clearCurrentTenant$1 as clearCurrentTenant, configureIdentityContextFetcher$1 as configureIdentityContextFetcher, configureTenantCookie$1 as configureTenantCookie, getActiveTenant$1 as getActiveTenant, getAvailableTenants$1 as getAvailableTenants, getCurrentTenant$1 as getCurrentTenant, getTenantFromIdentityContext$1 as getTenantFromIdentityContext, initializeTenant$1 as initializeTenant, resetTenantCookieConfig$1 as resetTenantCookieConfig, setActiveTenant$1 as setActiveTenant, setCurrentTenant$1 as setCurrentTenant } from "../server-DazqdM63.js";
|
|
17
|
+
import { ForbiddenPermissionDetails, PermissionRouteContext, PermissionRouteProtectionConfig, PermissionRouteSession, checkPermission$1 as checkPermission, configurePermissionRouteProtection$1 as configurePermissionRouteProtection, requirePermission$1 as requirePermission, resetPermissionRouteProtection$1 as resetPermissionRouteProtection, withPermission$1 as withPermission } from "../server-BoeUiXSh.js";
|
|
18
|
+
export { APIConfig, APIConfigFactory, APIConfigFactoryOptions, APILogger, AUTH_ERROR_COOKIE_PREFIX, AddressData, ApiError, TokenRefreshResult as ApiTokenRefreshResult, ApplicationType, AuthClaimMapping, AuthConfig, AuthError, TokenRefreshResult$1 as AuthTokenRefreshResult, AutomaticLogoutRequestContext, AxiosSetupOptions, CachePreset, CachePresets, ContextToUserInfoOptions, CreateAPIConfigOptions, CreateEnhancedClientOptions, DefaultRouteIdentityContext, ErrorCodes, ErrorHandler, FieldPermissionResult, ForbiddenPermissionDetails, GetAccessTokenFn, GetCurrentTenantFn, IdentityAPIFetcher, IdentityContextChangeHandler, IdentityContextChangedEvent, IdentityContextChecker, IdentityContextData, IdentityContextFetcher, IdentityContextProvider, IdentitySignalRClient, IdentityStoreConfig, IdentityUnauthorizedDetails, InvalidationHelpers, LOG_LEVEL_PRIORITY, LogContext, LogEntry, LogLevel, Logger, LoggerConfig, LoginOptions, LoginReturnUrlContext, LogoutHandler, OAuthState, OrganizationBranding, OrganizationData, PERMISSION_MODULES, PermissionCheckOptions, PermissionCheckResult, PermissionChecker, PermissionCode, PermissionFetcher, PermissionInitializer, PermissionModule, PermissionRouteContext, PermissionRouteProtectionConfig, PermissionRouteSession, ProblemDetails, ProtectedAction, ProtectedButton, ProtectedLink, ProtectedLoaderFn, ProtectedSection, ProtectionLevel, QueryClientConfig, QueryLogger, RetryConfig, RouteProtectionConfig, RouteProtectionErrorHandlerContext, RouteProtectionRedirect, RouteProtectionResolverContext, SessionData, SessionFlashData, SignalRClient, SignalRClientConfig, SignalRConnectionState, SignalREventHandler, SubscriptionChecker, TenantChecker, TenantContextType, TenantCookieConfig, TenantCookieSameSite, TenantInfo, TenantMembership, TenantProvider, TokenRefreshFn, TokenRefreshResult, UserContextInfo, UserInfo, ValidationError, attemptTokenRefresh, authRoute, cachePresets, calculateBackoffDelay, checkPermission, cleanupExpiredOAuthStates, cleanupSignalR, clearActiveTenant, clearAuthErrorHeaders, clearAuthServerCache, clearCurrentTenant, clearIdentityContextCache, closeRedisConnection, configureAuthClaimMapping, configureIdentityAPIFetcher, configureIdentityContextFetcher, configureIdentityEndpoints, configureIdentityStore, configurePermissionFetcher, configurePermissionRouteProtection, configureRouteProtection, configureTenantCookie, configureTenantEndpoints, contextToUserInfo, createAPIConfigFactory, createAuthSession, createEnhancedClient, createIdentitySignalRClient, createLogger, createOAuthState, createQueryClient, createQueryKeyFactory, createRetryFetch, defaultLoggerConfig, deleteOAuthState, destroyAuthSession, extractUserInfo, fetchIdentityContext, fetchUserPermissions, fetchWithTimeout, getAccessToken, getActiveTenant, getAuthError, getAuthSession, getAvailableTenants, getCurrentTenant, getIdentityContext, getIdentitySignalRClient, getOAuthState, getPermissionChecker, getPermissions, getTenantFromIdentityContext, getUser, handleApiError, handleCallback, hasAuthError, hasContextVersionChanged, initializePermissions, initializeSignalR, initializeTenant, initializeTenantStore, invalidationHelpers, isRetryableError, isSessionValid, isTokenExpiredResponse, logger, login, logout, onboardingRoute, protectRoute, publicRoute, refreshTokens, requireAuth, requireAuthSession, requirePermission, resetAuthClaimMapping, resetIdentityStoreConfig, resetPermissionRouteProtection, resetRouteProtectionConfig, resetTenantCookieConfig, setActiveTenant, setCurrentTenant, setupAxiosInterceptors, shouldAttemptTokenRefresh, shouldRefreshToken, subscriptionRoute, updateAuthSession, updateContextVersion, useAllPermissions, useCurrentOrganization, useCurrentTenant, useHasModulePermission, useHasPermission, useHasPermissions, useHasSubscription, useIdentityContext, useIdentityStore, useIsOnboarded, useModulePermission, useOrganization, usePermission, usePermissionChecker, usePermissionStore, usePermissions, useTenant, useTenantStore, useTenantSwitcher, useUserPermissions, useUserTenants, withPermission, withRetry };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { LOG_LEVEL_PRIORITY, LogLevel, Logger, createLogger, defaultLoggerConfig, logger } from "../logging-_h2mi3L9.js";
|
|
2
|
+
import { PERMISSION_MODULES, PermissionChecker, PermissionInitializer, ProtectedAction, ProtectedButton, ProtectedLink, ProtectedSection, getPermissionChecker, getPermissions, initializePermissions, useAllPermissions, useHasModulePermission, useHasPermission, useHasPermissions, useModulePermission, usePermission, usePermissionChecker, usePermissionStore, usePermissions } from "../permissions-D5ScGGnd.js";
|
|
3
|
+
import { TenantProvider, configureTenantEndpoints, initializeTenantStore, useCurrentOrganization, useCurrentTenant, useOrganization, useTenant, useTenantStore, useTenantSwitcher } from "../tenant-C6KPaSCX.js";
|
|
4
|
+
import { IdentityContextProvider, configureIdentityEndpoints, configureIdentityStore, resetIdentityStoreConfig, useHasSubscription, useIdentityContext, useIdentityStore, useIsOnboarded, useUserPermissions, useUserTenants } from "../identity-CFa1txoj.js";
|
|
5
|
+
import { ApiError, ErrorCodes, ErrorHandler, calculateBackoffDelay, createRetryFetch, fetchWithTimeout, handleApiError, isRetryableError, withRetry } from "../api-client-Ftxqm3Ep.js";
|
|
6
|
+
import { IdentitySignalRClient, SignalRClient, cleanupSignalR, createIdentitySignalRClient, getIdentitySignalRClient, initializeSignalR } from "../signalr-BJGcXc0m.js";
|
|
7
|
+
import { cachePresets, createQueryClient, createQueryKeyFactory, invalidationHelpers } from "../query-client-DRPQIKHX.js";
|
|
8
|
+
import "../src-D7mh9MKA.js";
|
|
9
|
+
import { AUTH_ERROR_COOKIE_PREFIX$1 as AUTH_ERROR_COOKIE_PREFIX, cleanupExpiredOAuthStates$1 as cleanupExpiredOAuthStates, closeRedisConnection$1 as closeRedisConnection, createAuthSession$1 as createAuthSession, createOAuthState$1 as createOAuthState, deleteOAuthState$1 as deleteOAuthState, destroyAuthSession$1 as destroyAuthSession, getAuthSession$1 as getAuthSession, getOAuthState$1 as getOAuthState, isSessionValid$1 as isSessionValid, requireAuthSession$1 as requireAuthSession, updateAuthSession$1 as updateAuthSession } from "../redis-session-storage.server-DhufyPjd.js";
|
|
10
|
+
import { clearAuthErrorHeaders$1 as clearAuthErrorHeaders, clearAuthServerCache$1 as clearAuthServerCache, configureAuthClaimMapping$1 as configureAuthClaimMapping, extractUserInfo$1 as extractUserInfo, getAccessToken$1 as getAccessToken, getAuthError$1 as getAuthError, getUser$1 as getUser, handleCallback$1 as handleCallback, hasAuthError$1 as hasAuthError, login$1 as login, logout$1 as logout, refreshTokens$1 as refreshTokens, requireAuth$1 as requireAuth, resetAuthClaimMapping$1 as resetAuthClaimMapping } from "../auth.server-C979TR6W.js";
|
|
11
|
+
import { attemptTokenRefresh, authRoute, configureRouteProtection, isTokenExpiredResponse, onboardingRoute, protectRoute, publicRoute, resetRouteProtectionConfig, shouldAttemptTokenRefresh, shouldRefreshToken, subscriptionRoute } from "../server-CiSbg-9C.js";
|
|
12
|
+
import { clearActiveTenant, clearCurrentTenant, configureIdentityContextFetcher, configureTenantCookie, getActiveTenant, getAvailableTenants, getCurrentTenant, getTenantFromIdentityContext, initializeTenant, resetTenantCookieConfig, setActiveTenant, setCurrentTenant } from "../server-C-DiVP9e.js";
|
|
13
|
+
import { clearIdentityContextCache, configureIdentityAPIFetcher, configurePermissionFetcher, contextToUserInfo, fetchIdentityContext, fetchUserPermissions, getIdentityContext, hasContextVersionChanged, updateContextVersion } from "../server-iWm3oeCM.js";
|
|
14
|
+
import { checkPermission, configurePermissionRouteProtection, requirePermission, resetPermissionRouteProtection, withPermission } from "../server-CNp6gjFE.js";
|
|
15
|
+
import { createAPIConfigFactory, createEnhancedClient, setupAxiosInterceptors } from "../server-DLgH3FRR.js";
|
|
16
|
+
|
|
17
|
+
export { AUTH_ERROR_COOKIE_PREFIX, ApiError, ErrorCodes, ErrorHandler, IdentityContextProvider, IdentitySignalRClient, LOG_LEVEL_PRIORITY, LogLevel, Logger, PERMISSION_MODULES, PermissionChecker, PermissionInitializer, ProtectedAction, ProtectedButton, ProtectedLink, ProtectedSection, SignalRClient, TenantProvider, attemptTokenRefresh, authRoute, cachePresets, calculateBackoffDelay, checkPermission, cleanupExpiredOAuthStates, cleanupSignalR, clearActiveTenant, clearAuthErrorHeaders, clearAuthServerCache, clearCurrentTenant, clearIdentityContextCache, closeRedisConnection, configureAuthClaimMapping, configureIdentityAPIFetcher, configureIdentityContextFetcher, configureIdentityEndpoints, configureIdentityStore, configurePermissionFetcher, configurePermissionRouteProtection, configureRouteProtection, configureTenantCookie, configureTenantEndpoints, contextToUserInfo, createAPIConfigFactory, createAuthSession, createEnhancedClient, createIdentitySignalRClient, createLogger, createOAuthState, createQueryClient, createQueryKeyFactory, createRetryFetch, defaultLoggerConfig, deleteOAuthState, destroyAuthSession, extractUserInfo, fetchIdentityContext, fetchUserPermissions, fetchWithTimeout, getAccessToken, getActiveTenant, getAuthError, getAuthSession, getAvailableTenants, getCurrentTenant, getIdentityContext, getIdentitySignalRClient, getOAuthState, getPermissionChecker, getPermissions, getTenantFromIdentityContext, getUser, handleApiError, handleCallback, hasAuthError, hasContextVersionChanged, initializePermissions, initializeSignalR, initializeTenant, initializeTenantStore, invalidationHelpers, isRetryableError, isSessionValid, isTokenExpiredResponse, logger, login, logout, onboardingRoute, protectRoute, publicRoute, refreshTokens, requireAuth, requireAuthSession, requirePermission, resetAuthClaimMapping, resetIdentityStoreConfig, resetPermissionRouteProtection, resetRouteProtectionConfig, resetTenantCookieConfig, setActiveTenant, setCurrentTenant, setupAxiosInterceptors, shouldAttemptTokenRefresh, shouldRefreshToken, subscriptionRoute, updateAuthSession, updateContextVersion, useAllPermissions, useCurrentOrganization, useCurrentTenant, useHasModulePermission, useHasPermission, useHasPermissions, useHasSubscription, useIdentityContext, useIdentityStore, useIsOnboarded, useModulePermission, useOrganization, usePermission, usePermissionChecker, usePermissionStore, usePermissions, useTenant, useTenantStore, useTenantSwitcher, useUserPermissions, useUserTenants, withPermission, withRetry };
|