izen-react-starter 2.0.0 → 2.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/README.md +51 -10
- package/dist/{MIMHJGAX-DM3PPc6i.js → MIMHJGAX-D6lE7oii.js} +1 -1
- package/dist/{Q7LWSL4U-Dp8mxbtM.js → Q7LWSL4U-v0l_umPn.js} +2 -2
- package/dist/{VLTTJS3N-Dfn6o7Pv.js → VLTTJS3N-BqFxuU2V.js} +2 -2
- package/dist/components/ui/badge.d.ts +1 -1
- package/dist/components/ui/toast.d.ts +1 -1
- package/dist/{index-Dnn3beiE.js → index-BVgl5TkI.js} +52103 -51445
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/izen-react-starter.css +1 -1
- package/dist/lib/api/axios/axios.d.ts +44 -0
- package/dist/lib/api/axios/axios.d.ts.map +1 -0
- package/dist/lib/api/axios/delete-item.d.ts +39 -0
- package/dist/lib/api/axios/delete-item.d.ts.map +1 -0
- package/dist/lib/api/axios/hooks/useAxiosAuth.d.ts +61 -0
- package/dist/lib/api/axios/hooks/useAxiosAuth.d.ts.map +1 -0
- package/dist/lib/api/axios/hooks/useAxiosHeadersUrl.d.ts +35 -0
- package/dist/lib/api/axios/hooks/useAxiosHeadersUrl.d.ts.map +1 -0
- package/dist/lib/api/axios/hooks/useFetchSingleAxios.d.ts +61 -0
- package/dist/lib/api/axios/hooks/useFetchSingleAxios.d.ts.map +1 -0
- package/dist/lib/api/axios/index.d.ts +13 -0
- package/dist/lib/api/axios/index.d.ts.map +1 -0
- package/dist/lib/api/axios/useRefreshToken.d.ts +38 -0
- package/dist/lib/api/axios/useRefreshToken.d.ts.map +1 -0
- package/dist/lib/api/index.d.ts +14 -0
- package/dist/lib/api/index.d.ts.map +1 -0
- package/dist/lib/api/mutation/file-uploading.d.ts +88 -0
- package/dist/lib/api/mutation/file-uploading.d.ts.map +1 -0
- package/dist/lib/api/mutation/index.d.ts +5 -0
- package/dist/lib/api/mutation/index.d.ts.map +1 -0
- package/dist/lib/api/mutation/send-email.d.ts +74 -0
- package/dist/lib/api/mutation/send-email.d.ts.map +1 -0
- package/dist/lib/api/queries/generic.d.ts +102 -0
- package/dist/lib/api/queries/generic.d.ts.map +1 -0
- package/dist/lib/api/queries/index.d.ts +3 -0
- package/dist/lib/api/queries/index.d.ts.map +1 -0
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/rbac/AccessControlWrapper.d.ts +32 -5
- package/dist/rbac/AccessControlWrapper.d.ts.map +1 -1
- package/dist/rbac/RBACProvider.d.ts +55 -0
- package/dist/rbac/RBACProvider.d.ts.map +1 -0
- package/dist/rbac/UpdateAccessControlWrapper.d.ts +14 -2
- package/dist/rbac/UpdateAccessControlWrapper.d.ts.map +1 -1
- package/dist/rbac/access-rules.d.ts +26 -45
- package/dist/rbac/access-rules.d.ts.map +1 -1
- package/dist/rbac/index.d.ts +4 -1
- package/dist/rbac/index.d.ts.map +1 -1
- package/dist/rbac/useAccessControl.d.ts +16 -3
- package/dist/rbac/useAccessControl.d.ts.map +1 -1
- package/dist/react-starter.js +246 -237
- package/dist/react-starter.umd.cjs +147 -147
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/mutation/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGnG,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { UseMutationResult } from '@tanstack/react-query';
|
|
2
|
+
import { AxiosInstance } from 'axios';
|
|
3
|
+
export interface SendEmailResponse {
|
|
4
|
+
success: boolean;
|
|
5
|
+
message: string;
|
|
6
|
+
[key: string]: any;
|
|
7
|
+
}
|
|
8
|
+
export interface SendEmailParams {
|
|
9
|
+
to: string | string[];
|
|
10
|
+
subject: string;
|
|
11
|
+
body: string;
|
|
12
|
+
[key: string]: any;
|
|
13
|
+
}
|
|
14
|
+
export interface UseSendEmailOptions {
|
|
15
|
+
/**
|
|
16
|
+
* Custom API endpoint
|
|
17
|
+
*/
|
|
18
|
+
endpoint?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Callback on success
|
|
21
|
+
*/
|
|
22
|
+
onSuccess?: (response: SendEmailResponse) => void;
|
|
23
|
+
/**
|
|
24
|
+
* Callback on error
|
|
25
|
+
*/
|
|
26
|
+
onError?: (error: Error) => void;
|
|
27
|
+
/**
|
|
28
|
+
* Callback on settle (success or error)
|
|
29
|
+
*/
|
|
30
|
+
onSettled?: () => void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Hook to send emails through API
|
|
34
|
+
*
|
|
35
|
+
* @param axios - Configured axios instance
|
|
36
|
+
* @param options - Email configuration options
|
|
37
|
+
* @returns Mutation result object
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```tsx
|
|
41
|
+
* import { useSendEmail } from 'izen-react-starter';
|
|
42
|
+
* import useAxiosAuth from './hooks/useAxiosAuth';
|
|
43
|
+
*
|
|
44
|
+
* function EmailSender() {
|
|
45
|
+
* const axios = useAxiosAuth({ axiosInstance: myAxios });
|
|
46
|
+
* const sendEmail = useSendEmail(axios, {
|
|
47
|
+
* endpoint: '/email/send',
|
|
48
|
+
* onSuccess: (response) => {
|
|
49
|
+
* console.log('Email sent successfully');
|
|
50
|
+
* }
|
|
51
|
+
* });
|
|
52
|
+
*
|
|
53
|
+
* const handleSendEmail = () => {
|
|
54
|
+
* sendEmail.mutate({
|
|
55
|
+
* to: 'user@example.com',
|
|
56
|
+
* subject: 'Hello',
|
|
57
|
+
* body: 'This is a test email'
|
|
58
|
+
* });
|
|
59
|
+
* };
|
|
60
|
+
*
|
|
61
|
+
* return (
|
|
62
|
+
* <div>
|
|
63
|
+
* {sendEmail.isPending && <div>Sending...</div>}
|
|
64
|
+
* {sendEmail.isError && <div>Error: {sendEmail.error?.message}</div>}
|
|
65
|
+
* {sendEmail.isSuccess && <div>Email sent!</div>}
|
|
66
|
+
* <button onClick={handleSendEmail}>Send Email</button>
|
|
67
|
+
* </div>
|
|
68
|
+
* );
|
|
69
|
+
* }
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
declare const useSendEmail: (axios: AxiosInstance, options?: UseSendEmailOptions) => UseMutationResult<SendEmailResponse, Error, SendEmailParams>;
|
|
73
|
+
export { useSendEmail };
|
|
74
|
+
//# sourceMappingURL=send-email.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-email.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/mutation/send-email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAClD;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,QAAA,MAAM,YAAY,GAChB,OAAO,aAAa,EACpB,UAAS,mBAAwB,KAChC,iBAAiB,CAAC,iBAAiB,EAAE,KAAK,EAAE,eAAe,CAqB7D,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { UseQueryResult } from '@tanstack/react-query';
|
|
2
|
+
import { AxiosInstance } from 'axios';
|
|
3
|
+
export interface UseGetOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Cache key for the query
|
|
6
|
+
*/
|
|
7
|
+
queryKey?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Query parameters
|
|
10
|
+
*/
|
|
11
|
+
params?: Record<string, any>;
|
|
12
|
+
/**
|
|
13
|
+
* Override URL (if different from key)
|
|
14
|
+
*/
|
|
15
|
+
url?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Time in milliseconds until data is considered stale
|
|
18
|
+
*/
|
|
19
|
+
staleTime?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Enable refetch on window focus
|
|
22
|
+
*/
|
|
23
|
+
refetchOnWindowFocus?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Enable refetch on mount
|
|
26
|
+
*/
|
|
27
|
+
refetchOnMount?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Enable refetch on reconnect
|
|
30
|
+
*/
|
|
31
|
+
refetchOnReconnect?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Enable the query (useful for conditional queries)
|
|
34
|
+
*/
|
|
35
|
+
enabled?: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Generic hook to fetch multiple items
|
|
39
|
+
*
|
|
40
|
+
* @param axios - Configured axios instance
|
|
41
|
+
* @param key - Query key / API endpoint
|
|
42
|
+
* @param options - Query configuration options
|
|
43
|
+
* @returns React Query result object
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```tsx
|
|
47
|
+
* import { useGet } from 'izen-react-starter';
|
|
48
|
+
* import useAxiosAuth from './hooks/useAxiosAuth';
|
|
49
|
+
*
|
|
50
|
+
* function UsersList() {
|
|
51
|
+
* const axios = useAxiosAuth({ axiosInstance: myAxios });
|
|
52
|
+
* const { data, isLoading, error } = useGet(axios, '/users', {
|
|
53
|
+
* queryKey: 'users',
|
|
54
|
+
* params: { page: 1, limit: 10 }
|
|
55
|
+
* });
|
|
56
|
+
*
|
|
57
|
+
* if (isLoading) return <div>Loading...</div>;
|
|
58
|
+
* if (error) return <div>Error: {error.message}</div>;
|
|
59
|
+
*
|
|
60
|
+
* return (
|
|
61
|
+
* <ul>
|
|
62
|
+
* {data?.map(user => (
|
|
63
|
+
* <li key={user.id}>{user.name}</li>
|
|
64
|
+
* ))}
|
|
65
|
+
* </ul>
|
|
66
|
+
* );
|
|
67
|
+
* }
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
declare const useGet: <T = any>(axios: AxiosInstance, key: string, options?: UseGetOptions) => UseQueryResult<T[], Error>;
|
|
71
|
+
/**
|
|
72
|
+
* Generic hook to fetch a single item
|
|
73
|
+
*
|
|
74
|
+
* @param axios - Configured axios instance
|
|
75
|
+
* @param key - Query key / API endpoint
|
|
76
|
+
* @param options - Query configuration options
|
|
77
|
+
* @returns React Query result object with single item
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```tsx
|
|
81
|
+
* import { useGetSingle } from 'izen-react-starter';
|
|
82
|
+
* import useAxiosAuth from './hooks/useAxiosAuth';
|
|
83
|
+
*
|
|
84
|
+
* function UserDetail({ userId }) {
|
|
85
|
+
* const axios = useAxiosAuth({ axiosInstance: myAxios });
|
|
86
|
+
* const { data: user, isLoading, error } = useGetSingle(axios, `/users/${userId}`, {
|
|
87
|
+
* queryKey: `user-${userId}`,
|
|
88
|
+
* enabled: !!userId
|
|
89
|
+
* });
|
|
90
|
+
*
|
|
91
|
+
* if (isLoading) return <div>Loading...</div>;
|
|
92
|
+
* if (error) return <div>Error: {error.message}</div>;
|
|
93
|
+
*
|
|
94
|
+
* return <div>{user?.name}</div>;
|
|
95
|
+
* }
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
declare const useGetSingle: <T = any>(axios: AxiosInstance, key: string, options?: UseGetOptions & {
|
|
99
|
+
defaultValue?: T;
|
|
100
|
+
}) => UseQueryResult<T, Error>;
|
|
101
|
+
export { useGet, useGetSingle };
|
|
102
|
+
//# sourceMappingURL=generic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/queries/generic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,QAAA,MAAM,MAAM,GAAI,CAAC,GAAG,GAAG,EACrB,OAAO,aAAa,EACpB,KAAK,MAAM,EACX,UAAS,aAAkB,KAC1B,cAAc,CAAC,CAAC,EAAE,EAAE,KAAK,CAkC3B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,QAAA,MAAM,YAAY,GAAI,CAAC,GAAG,GAAG,EAC3B,OAAO,aAAa,EACpB,KAAK,MAAM,EACX,UAAS,aAAa,GAAG;IAAE,YAAY,CAAC,EAAE,CAAC,CAAA;CAAO,KACjD,cAAc,CAAC,CAAC,EAAE,KAAK,CAmCzB,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/queries/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/lib/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { cn, capitalize, convertToHourMinuteString, formatErrorToList, formatDate, appendFormData, debounce, throttle } from './utils';
|
|
2
2
|
export { handleEditCache, handleSingleEditCache } from './cache-util';
|
|
3
3
|
export type { CacheEditOptions } from './cache-util';
|
|
4
|
+
export * from './api';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACvI,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACtE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACvI,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACtE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGrD,cAAc,OAAO,CAAC"}
|
|
@@ -1,16 +1,43 @@
|
|
|
1
1
|
import { default as React, ReactElement } from 'react';
|
|
2
|
-
import { Action, Resource } from './access-rules';
|
|
3
2
|
export interface AccessControlWrapperProps {
|
|
4
3
|
children: ReactElement;
|
|
5
|
-
resource:
|
|
6
|
-
action?:
|
|
4
|
+
resource: string;
|
|
5
|
+
action?: string;
|
|
7
6
|
fallback?: ReactElement | null;
|
|
8
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* Component to conditionally render children based on RBAC permissions
|
|
10
|
+
*
|
|
11
|
+
* @param resource - The resource to check access for
|
|
12
|
+
* @param action - The action to check (default: 'read')
|
|
13
|
+
* @param fallback - Component to render if access is denied
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* <AccessControlWrapper resource="posts" action="create">
|
|
18
|
+
* <CreatePostButton />
|
|
19
|
+
* </AccessControlWrapper>
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
9
22
|
export declare const AccessControlWrapper: React.FC<AccessControlWrapperProps>;
|
|
10
23
|
export interface WithAccessControlProps {
|
|
11
|
-
accessedResource:
|
|
12
|
-
accessAction?:
|
|
24
|
+
accessedResource: string;
|
|
25
|
+
accessAction?: string;
|
|
13
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* HOC to wrap components with access control
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```tsx
|
|
32
|
+
* const ProtectedComponent = withAccessControl(MyComponent);
|
|
33
|
+
*
|
|
34
|
+
* <ProtectedComponent
|
|
35
|
+
* accessedResource="posts"
|
|
36
|
+
* accessAction="create"
|
|
37
|
+
* // ... other props
|
|
38
|
+
* />
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
14
41
|
export declare const withAccessControl: <P extends object>(WrappedComponent: React.ComponentType<P>) => React.ForwardRefExoticComponent<React.PropsWithoutRef<P & WithAccessControlProps> & React.RefAttributes<any>>;
|
|
15
42
|
export default withAccessControl;
|
|
16
43
|
//# sourceMappingURL=AccessControlWrapper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessControlWrapper.d.ts","sourceRoot":"","sources":["../../src/rbac/AccessControlWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AccessControlWrapper.d.ts","sourceRoot":"","sources":["../../src/rbac/AccessControlWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG5C,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CAChC;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CAapE,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,MAAM,EAChD,kBAAkB,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,kHAYzC,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { RBACConfig, Rules } from './access-rules';
|
|
3
|
+
export interface RBACContextType {
|
|
4
|
+
config: RBACConfig;
|
|
5
|
+
rules: Rules;
|
|
6
|
+
defaultResource?: string;
|
|
7
|
+
resources: string[];
|
|
8
|
+
roles: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface RBACProviderProps {
|
|
11
|
+
children: ReactNode;
|
|
12
|
+
config: RBACConfig;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* RBACProvider - Provides RBAC configuration to the application
|
|
16
|
+
*
|
|
17
|
+
* @param config - The RBAC configuration object containing:
|
|
18
|
+
* - roles: Array of role identifiers
|
|
19
|
+
* - resources: Array of resource identifiers
|
|
20
|
+
* - rules: Object mapping roles to their permissions
|
|
21
|
+
* - roleLabels: Optional array of role display labels
|
|
22
|
+
* - defaultResource: Optional default/undefined resource identifier
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* const rbacConfig = {
|
|
27
|
+
* roles: ['admin', 'user'],
|
|
28
|
+
* resources: ['posts', 'comments'],
|
|
29
|
+
* rules: {
|
|
30
|
+
* admin: {
|
|
31
|
+
* manage: { can: 'all' },
|
|
32
|
+
* create: { can: 'all' },
|
|
33
|
+
* read: { can: 'all' },
|
|
34
|
+
* update: { can: 'all' },
|
|
35
|
+
* delete: { can: 'all' },
|
|
36
|
+
* },
|
|
37
|
+
* user: {
|
|
38
|
+
* read: { can: ['posts', 'comments'] },
|
|
39
|
+
* create: { can: ['comments'] },
|
|
40
|
+
* }
|
|
41
|
+
* },
|
|
42
|
+
* roleLabels: [
|
|
43
|
+
* { label: 'Administrator', value: 'admin' },
|
|
44
|
+
* { label: 'User', value: 'user' }
|
|
45
|
+
* ]
|
|
46
|
+
* };
|
|
47
|
+
*
|
|
48
|
+
* <RBACProvider config={rbacConfig}>
|
|
49
|
+
* <App />
|
|
50
|
+
* </RBACProvider>
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare const RBACProvider: ({ children, config }: RBACProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
54
|
+
export declare function useRBAC(): RBACContextType;
|
|
55
|
+
//# sourceMappingURL=RBACProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RBACProvider.d.ts","sourceRoot":"","sources":["../../src/rbac/RBACProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAID,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,eAAO,MAAM,YAAY,GAAI,sBAAsB,iBAAiB,4CAcnE,CAAC;AAEF,wBAAgB,OAAO,oBAMtB"}
|
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
import { default as React, ReactElement } from 'react';
|
|
2
|
-
import { Resource } from './access-rules';
|
|
3
2
|
export interface UpdateAccessControlWrapperProps {
|
|
4
3
|
children: ReactElement;
|
|
5
|
-
resource:
|
|
4
|
+
resource: string;
|
|
6
5
|
fallback?: ReactElement | null;
|
|
7
6
|
}
|
|
7
|
+
/**
|
|
8
|
+
* Component to conditionally render children based on update permissions
|
|
9
|
+
*
|
|
10
|
+
* @param resource - The resource to check update access for
|
|
11
|
+
* @param fallback - Component to render if access is denied
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <UpdateAccessControlWrapper resource="posts">
|
|
16
|
+
* <EditPostButton />
|
|
17
|
+
* </UpdateAccessControlWrapper>
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
8
20
|
export declare const UpdateAccessControlWrapper: React.FC<UpdateAccessControlWrapperProps>;
|
|
9
21
|
export default UpdateAccessControlWrapper;
|
|
10
22
|
//# sourceMappingURL=UpdateAccessControlWrapper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpdateAccessControlWrapper.d.ts","sourceRoot":"","sources":["../../src/rbac/UpdateAccessControlWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"UpdateAccessControlWrapper.d.ts","sourceRoot":"","sources":["../../src/rbac/UpdateAccessControlWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG5C,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CAChC;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,0BAA0B,EAAE,KAAK,CAAC,EAAE,CAAC,+BAA+B,CAYhF,CAAC;AAEF,eAAe,0BAA0B,CAAC"}
|
|
@@ -1,52 +1,33 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
UserGroups = "user-groups",
|
|
13
|
-
Clients = "clients",
|
|
14
|
-
Shared = "shared",
|
|
15
|
-
Reports = "reports",
|
|
16
|
-
Preferences = "preferences",
|
|
17
|
-
Locations = "locations",
|
|
18
|
-
IssueTypes = "issue-types",
|
|
19
|
-
Checkpoint = "checkpoints",
|
|
20
|
-
LocationShift = "location",
|
|
21
|
-
Employees = "employees",
|
|
22
|
-
EmployeeAvailabilities = "employee-availabilities",
|
|
23
|
-
EmployeeShift = "employee-shifts",
|
|
24
|
-
UserDevice = "user-devices",
|
|
25
|
-
EmployeeShift_SelfSchedule = "employee-shifts/self-schedule",
|
|
26
|
-
Map = "map",
|
|
27
|
-
Issue = "issues"
|
|
28
|
-
}
|
|
29
|
-
export declare enum Role {
|
|
30
|
-
Admin = "admin",
|
|
31
|
-
Manager = "manager",
|
|
32
|
-
Reader = "reader",
|
|
33
|
-
Client = "client"
|
|
34
|
-
}
|
|
35
|
-
export declare const RolesNames: {
|
|
1
|
+
export type Action = string;
|
|
2
|
+
export type Resource = string;
|
|
3
|
+
export type Role = string;
|
|
4
|
+
export declare const CommonActions: {
|
|
5
|
+
readonly Manage: "manage";
|
|
6
|
+
readonly Create: "create";
|
|
7
|
+
readonly Read: "read";
|
|
8
|
+
readonly Update: "update";
|
|
9
|
+
readonly Delete: "delete";
|
|
10
|
+
};
|
|
11
|
+
export interface RoleLabel {
|
|
36
12
|
label: string;
|
|
37
|
-
value:
|
|
38
|
-
}
|
|
39
|
-
interface Rule {
|
|
13
|
+
value: string;
|
|
14
|
+
}
|
|
15
|
+
export interface Rule {
|
|
40
16
|
can: string | string[];
|
|
41
17
|
cannot?: string[];
|
|
42
18
|
}
|
|
43
|
-
type RoleRules = {
|
|
44
|
-
[
|
|
19
|
+
export type RoleRules = {
|
|
20
|
+
[action: string]: Rule;
|
|
45
21
|
};
|
|
46
|
-
type Rules = {
|
|
47
|
-
[
|
|
22
|
+
export type Rules = {
|
|
23
|
+
[role: string]: RoleRules;
|
|
48
24
|
};
|
|
49
|
-
export
|
|
50
|
-
|
|
51
|
-
|
|
25
|
+
export interface RBACConfig {
|
|
26
|
+
roles: string[];
|
|
27
|
+
resources: string[];
|
|
28
|
+
rules: Rules;
|
|
29
|
+
roleLabels?: RoleLabel[];
|
|
30
|
+
defaultResource?: string;
|
|
31
|
+
}
|
|
32
|
+
export declare const userCan: (userRoles: string[], action: string, target: string, rules: Rules, defaultResource?: string) => boolean;
|
|
52
33
|
//# sourceMappingURL=access-rules.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access-rules.d.ts","sourceRoot":"","sources":["../../src/rbac/access-rules.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"access-rules.d.ts","sourceRoot":"","sources":["../../src/rbac/access-rules.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAC5B,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAC9B,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC;AAG1B,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC;AAGX,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,IAAI;IACnB,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAA;AAED,MAAM,MAAM,KAAK,GAAG;IAClB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,CAAA;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAGD,eAAO,MAAM,OAAO,GAClB,WAAW,MAAM,EAAE,EACnB,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,OAAO,KAAK,EACZ,kBAAkB,MAAM,KACvB,OA6BF,CAAC"}
|
package/dist/rbac/index.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { CommonActions, userCan } from './access-rules';
|
|
2
|
+
export type { Action, Resource, Role, RoleLabel, Rule, RoleRules, Rules, RBACConfig } from './access-rules';
|
|
2
3
|
export { useAccessControl } from './useAccessControl';
|
|
3
4
|
export type { UseAccessControlReturn } from './useAccessControl';
|
|
4
5
|
export { AccessControlWrapper, withAccessControl } from './AccessControlWrapper';
|
|
5
6
|
export type { AccessControlWrapperProps, WithAccessControlProps } from './AccessControlWrapper';
|
|
6
7
|
export { UpdateAccessControlWrapper } from './UpdateAccessControlWrapper';
|
|
7
8
|
export type { UpdateAccessControlWrapperProps } from './UpdateAccessControlWrapper';
|
|
9
|
+
export { RBACProvider, useRBAC } from './RBACProvider';
|
|
10
|
+
export type { RBACProviderProps, RBACContextType } from './RBACProvider';
|
|
8
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/rbac/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rbac/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rbac/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,OAAO,EACR,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,MAAM,EACN,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,IAAI,EACJ,SAAS,EACT,KAAK,EACL,UAAU,EACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACjF,YAAY,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChG,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,YAAY,EAAE,+BAA+B,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -1,8 +1,21 @@
|
|
|
1
|
-
import { Action, Resource } from './access-rules';
|
|
2
1
|
export interface UseAccessControlReturn {
|
|
3
|
-
isAllowed: (action:
|
|
4
|
-
getResourceByUrl: (url: string) =>
|
|
2
|
+
isAllowed: (action: string, target: string) => boolean;
|
|
3
|
+
getResourceByUrl: (url: string) => string;
|
|
5
4
|
}
|
|
5
|
+
/**
|
|
6
|
+
* Hook to check access control permissions
|
|
7
|
+
*
|
|
8
|
+
* @returns Object with isAllowed and getResourceByUrl functions
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* const { isAllowed } = useAccessControl();
|
|
13
|
+
*
|
|
14
|
+
* if (isAllowed('create', 'posts')) {
|
|
15
|
+
* // User can create posts
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
6
19
|
export declare const useAccessControl: () => UseAccessControlReturn;
|
|
7
20
|
export default useAccessControl;
|
|
8
21
|
//# sourceMappingURL=useAccessControl.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAccessControl.d.ts","sourceRoot":"","sources":["../../src/rbac/useAccessControl.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useAccessControl.d.ts","sourceRoot":"","sources":["../../src/rbac/useAccessControl.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IACvD,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CAC3C;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,QAAO,sBA+BnC,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|