rbac-shield 0.1.8 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ProtectedRoute.d.mts +28 -0
- package/dist/ProtectedRoute.d.ts +28 -0
- package/dist/ProtectedRoute.d.ts.map +1 -0
- package/dist/checkPermission.d.mts +10 -0
- package/dist/checkPermission.d.ts +10 -0
- package/dist/checkPermission.d.ts.map +1 -0
- package/dist/factory.d.mts +47 -0
- package/dist/factory.d.ts +47 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/index.d.mts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/types.d.mts +14 -0
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { PermissionString } from './types.mjs';
|
|
2
|
+
interface ProtectedRouteProps<R extends string, A extends string> {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
requiredPermission: PermissionString<R, A>;
|
|
5
|
+
fallbackPath?: string;
|
|
6
|
+
fallback?: React.ReactNode;
|
|
7
|
+
useHasPermission: (permission: PermissionString<R, A>) => boolean;
|
|
8
|
+
isLoading: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Client-side route protection component
|
|
12
|
+
* Wraps pages that require specific permissions
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* <ProtectedRoute
|
|
17
|
+
* requiredPermission="billing:manage"
|
|
18
|
+
* fallbackPath="/unauthorized"
|
|
19
|
+
* useHasPermission={useHasPermission}
|
|
20
|
+
* isLoading={isLoading}
|
|
21
|
+
* >
|
|
22
|
+
* <BillingPage />
|
|
23
|
+
* </ProtectedRoute>
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare function ProtectedRoute<R extends string, A extends string>({ children, requiredPermission, fallbackPath, fallback, useHasPermission, isLoading, }: ProtectedRouteProps<R, A>): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=ProtectedRoute.d.ts.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { PermissionString } from "./types";
|
|
2
|
+
interface ProtectedRouteProps<R extends string, A extends string> {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
requiredPermission: PermissionString<R, A>;
|
|
5
|
+
fallbackPath?: string;
|
|
6
|
+
fallback?: React.ReactNode;
|
|
7
|
+
useHasPermission: (permission: PermissionString<R, A>) => boolean;
|
|
8
|
+
isLoading: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Client-side route protection component
|
|
12
|
+
* Wraps pages that require specific permissions
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* <ProtectedRoute
|
|
17
|
+
* requiredPermission="billing:manage"
|
|
18
|
+
* fallbackPath="/unauthorized"
|
|
19
|
+
* useHasPermission={useHasPermission}
|
|
20
|
+
* isLoading={isLoading}
|
|
21
|
+
* >
|
|
22
|
+
* <BillingPage />
|
|
23
|
+
* </ProtectedRoute>
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare function ProtectedRoute<R extends string, A extends string>({ children, requiredPermission, fallbackPath, fallback, useHasPermission, isLoading, }: ProtectedRouteProps<R, A>): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=ProtectedRoute.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProtectedRoute.d.ts","sourceRoot":"","sources":["../src/ProtectedRoute.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C,UAAU,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM;IAC9D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,kBAAkB,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,gBAAgB,EAAE,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC;IAClE,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,EAAE,EACjE,QAAQ,EACR,kBAAkB,EAClB,YAAkB,EAClB,QAAQ,EACR,gBAAgB,EAChB,SAAS,GACV,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,2CAgD3B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Permission Verifier
|
|
3
|
+
* Works in Browser, Node.js, and Edge Runtime (Middleware)
|
|
4
|
+
*
|
|
5
|
+
* @param heldPermissions - Array of permissions the user holds (e.g. ['projects:view', 'billing:*'])
|
|
6
|
+
* @param requiredPermission - The permission to check for (e.g. 'billing:edit')
|
|
7
|
+
* @returns boolean - True if access should be granted
|
|
8
|
+
*/
|
|
9
|
+
export declare function checkPermission(heldPermissions: string[], requiredPermission: string): boolean;
|
|
10
|
+
//# sourceMappingURL=checkPermission.d.ts.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Permission Verifier
|
|
3
|
+
* Works in Browser, Node.js, and Edge Runtime (Middleware)
|
|
4
|
+
*
|
|
5
|
+
* @param heldPermissions - Array of permissions the user holds (e.g. ['projects:view', 'billing:*'])
|
|
6
|
+
* @param requiredPermission - The permission to check for (e.g. 'billing:edit')
|
|
7
|
+
* @returns boolean - True if access should be granted
|
|
8
|
+
*/
|
|
9
|
+
export declare function checkPermission(heldPermissions: string[], requiredPermission: string): boolean;
|
|
10
|
+
//# sourceMappingURL=checkPermission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkPermission.d.ts","sourceRoot":"","sources":["../src/checkPermission.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,eAAe,EAAE,MAAM,EAAE,EACzB,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAcT"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { RBACState, TenantAuth, PermissionString } from './types.mjs';
|
|
3
|
+
export interface CanProps<R extends string, A extends string> {
|
|
4
|
+
/** Single permission or array of permissions to check */
|
|
5
|
+
permission: PermissionString<R, A> | PermissionString<R, A>[];
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
/** Content to render if permission is denied */
|
|
8
|
+
fallback?: React.ReactNode;
|
|
9
|
+
/** If true, requires ALL permissions. If false (default), requires ANY. */
|
|
10
|
+
requireAll?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface ProtectedRouteProps<R extends string, A extends string> {
|
|
13
|
+
children: React.ReactNode;
|
|
14
|
+
/** Single permission or array of permissions to check */
|
|
15
|
+
permission: PermissionString<R, A> | PermissionString<R, A>[];
|
|
16
|
+
/** Path to redirect to if access denied (if redirect is true) */
|
|
17
|
+
fallbackPath?: string;
|
|
18
|
+
/** Content to render if access denied (or while redirecting) */
|
|
19
|
+
fallback?: React.ReactNode;
|
|
20
|
+
/** If true, requires ALL permissions. If false (default), requires ANY. */
|
|
21
|
+
requireAll?: boolean;
|
|
22
|
+
/** Custom component to show while loading permissions */
|
|
23
|
+
loadingComponent?: React.ReactNode;
|
|
24
|
+
/** Whether to redirect on access denial. Default: true */
|
|
25
|
+
redirect?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface RBACProviderProps {
|
|
28
|
+
children: React.ReactNode;
|
|
29
|
+
debug?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface RBACFactory<R extends string, A extends string> {
|
|
32
|
+
RBACProvider: (props: RBACProviderProps) => React.JSX.Element;
|
|
33
|
+
useStore: () => RBACState<R, A> & {
|
|
34
|
+
setAuth: (authArray: TenantAuth<R, A>[]) => void;
|
|
35
|
+
switchTenant: (tenantId: string) => void;
|
|
36
|
+
reset: () => void;
|
|
37
|
+
};
|
|
38
|
+
useHasPermission: (permission: PermissionString<R, A>) => boolean;
|
|
39
|
+
useHasAnyPermission: (permissions: PermissionString<R, A>[]) => boolean;
|
|
40
|
+
useHasAllPermissions: (permissions: PermissionString<R, A>[]) => boolean;
|
|
41
|
+
usePermissions: () => PermissionString<R, A>[];
|
|
42
|
+
Can: (props: CanProps<R, A>) => React.JSX.Element;
|
|
43
|
+
RBACErrorBoundary: typeof React.Component;
|
|
44
|
+
ProtectedRoute: (props: ProtectedRouteProps<R, A>) => React.JSX.Element;
|
|
45
|
+
}
|
|
46
|
+
export declare function createRBAC<R extends string, A extends string>(): RBACFactory<R, A>;
|
|
47
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { RBACState, TenantAuth, PermissionString } from "./types";
|
|
3
|
+
export interface CanProps<R extends string, A extends string> {
|
|
4
|
+
/** Single permission or array of permissions to check */
|
|
5
|
+
permission: PermissionString<R, A> | PermissionString<R, A>[];
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
/** Content to render if permission is denied */
|
|
8
|
+
fallback?: React.ReactNode;
|
|
9
|
+
/** If true, requires ALL permissions. If false (default), requires ANY. */
|
|
10
|
+
requireAll?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface ProtectedRouteProps<R extends string, A extends string> {
|
|
13
|
+
children: React.ReactNode;
|
|
14
|
+
/** Single permission or array of permissions to check */
|
|
15
|
+
permission: PermissionString<R, A> | PermissionString<R, A>[];
|
|
16
|
+
/** Path to redirect to if access denied (if redirect is true) */
|
|
17
|
+
fallbackPath?: string;
|
|
18
|
+
/** Content to render if access denied (or while redirecting) */
|
|
19
|
+
fallback?: React.ReactNode;
|
|
20
|
+
/** If true, requires ALL permissions. If false (default), requires ANY. */
|
|
21
|
+
requireAll?: boolean;
|
|
22
|
+
/** Custom component to show while loading permissions */
|
|
23
|
+
loadingComponent?: React.ReactNode;
|
|
24
|
+
/** Whether to redirect on access denial. Default: true */
|
|
25
|
+
redirect?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface RBACProviderProps {
|
|
28
|
+
children: React.ReactNode;
|
|
29
|
+
debug?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface RBACFactory<R extends string, A extends string> {
|
|
32
|
+
RBACProvider: (props: RBACProviderProps) => React.JSX.Element;
|
|
33
|
+
useStore: () => RBACState<R, A> & {
|
|
34
|
+
setAuth: (authArray: TenantAuth<R, A>[]) => void;
|
|
35
|
+
switchTenant: (tenantId: string) => void;
|
|
36
|
+
reset: () => void;
|
|
37
|
+
};
|
|
38
|
+
useHasPermission: (permission: PermissionString<R, A>) => boolean;
|
|
39
|
+
useHasAnyPermission: (permissions: PermissionString<R, A>[]) => boolean;
|
|
40
|
+
useHasAllPermissions: (permissions: PermissionString<R, A>[]) => boolean;
|
|
41
|
+
usePermissions: () => PermissionString<R, A>[];
|
|
42
|
+
Can: (props: CanProps<R, A>) => React.JSX.Element;
|
|
43
|
+
RBACErrorBoundary: typeof React.Component;
|
|
44
|
+
ProtectedRoute: (props: ProtectedRouteProps<R, A>) => React.JSX.Element;
|
|
45
|
+
}
|
|
46
|
+
export declare function createRBAC<R extends string, A extends string>(): RBACFactory<R, A>;
|
|
47
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.tsx"],"names":[],"mappings":"AAEA,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAWlE,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM;IAC1D,yDAAyD;IACzD,UAAU,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC9D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM;IACrE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,yDAAyD;IACzD,UAAU,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC9D,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACnC,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM;IAC7D,YAAY,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;IAC9D,QAAQ,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;QAChC,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;QACjD,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;QACzC,KAAK,EAAE,MAAM,IAAI,CAAC;KACnB,CAAC;IACF,gBAAgB,EAAE,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC;IAClE,mBAAmB,EAAE,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC;IACxE,oBAAoB,EAAE,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC;IACzE,cAAc,EAAE,MAAM,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC/C,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;IAClD,iBAAiB,EAAE,OAAO,KAAK,CAAC,SAAS,CAAC;IAC1C,cAAc,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;CACzE;AAED,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,KAAK,WAAW,CAC3E,CAAC,EACD,CAAC,CACF,CA4cA"}
|
package/dist/index.d.mts
ADDED
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/types.d.mts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type PermissionString<R extends string, A extends string> = `${R}:${A}` | '*' | `routes:${string}`;
|
|
2
|
+
export interface TenantAuth<R extends string, A extends string> {
|
|
3
|
+
tenantId: string;
|
|
4
|
+
permissions: PermissionString<R, A>[];
|
|
5
|
+
}
|
|
6
|
+
export interface RBACState<R extends string, A extends string> {
|
|
7
|
+
activeTenantId: string | null;
|
|
8
|
+
tenants: Record<string, {
|
|
9
|
+
permissions: PermissionString<R, A>[];
|
|
10
|
+
map: Record<string, boolean>;
|
|
11
|
+
}>;
|
|
12
|
+
isLoading: boolean;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type PermissionString<R extends string, A extends string> = `${R}:${A}` | '*' | `routes:${string}`;
|
|
2
|
+
export interface TenantAuth<R extends string, A extends string> {
|
|
3
|
+
tenantId: string;
|
|
4
|
+
permissions: PermissionString<R, A>[];
|
|
5
|
+
}
|
|
6
|
+
export interface RBACState<R extends string, A extends string> {
|
|
7
|
+
activeTenantId: string | null;
|
|
8
|
+
tenants: Record<string, {
|
|
9
|
+
permissions: PermissionString<R, A>[];
|
|
10
|
+
map: Record<string, boolean>;
|
|
11
|
+
}>;
|
|
12
|
+
isLoading: boolean;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,IAC3D,GAAG,CAAC,IAAI,CAAC,EAAE,GACX,GAAG,GACH,UAAU,MAAM,EAAE,CAAC;AAEvB,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM;IAC3D,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QACtB,WAAW,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACtC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC9B,CAAC,CAAC;IACH,SAAS,EAAE,OAAO,CAAC;CACpB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rbac-shield",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"description": "A production-ready, type-safe Role-Based Access Control (RBAC) system for Next.js applications with multi-tenant support",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"build": "npm run clean && npm run build:esm && npm run build:cjs && npm run build:types",
|
|
37
37
|
"build:esm": "tsc --module esnext --outDir dist/esm && node scripts/rename-esm.js",
|
|
38
38
|
"build:cjs": "tsc --module commonjs --outDir dist/cjs && node scripts/copy-cjs.js",
|
|
39
|
-
"build:types": "tsc
|
|
39
|
+
"build:types": "tsc -b tsconfig.types.json --force && node scripts/copy-dts.js",
|
|
40
40
|
"prepublishOnly": "npm run build"
|
|
41
41
|
},
|
|
42
42
|
"keywords": [
|