@contractspec/lib.identity-rbac 1.57.0 → 1.58.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.
Files changed (82) hide show
  1. package/dist/browser/contracts/index.js +1045 -0
  2. package/dist/browser/contracts/organization.js +655 -0
  3. package/dist/browser/contracts/rbac.js +599 -0
  4. package/dist/browser/contracts/user.js +235 -0
  5. package/dist/browser/entities/index.js +464 -0
  6. package/dist/browser/entities/organization.js +150 -0
  7. package/dist/browser/entities/rbac.js +124 -0
  8. package/dist/browser/entities/user.js +168 -0
  9. package/dist/browser/events.js +374 -0
  10. package/dist/browser/identity-rbac.capability.js +28 -0
  11. package/dist/browser/identity-rbac.feature.js +67 -0
  12. package/dist/browser/index.js +2099 -0
  13. package/dist/browser/policies/engine.js +154 -0
  14. package/dist/browser/policies/index.js +154 -0
  15. package/dist/contracts/index.d.ts +4 -4
  16. package/dist/contracts/index.d.ts.map +1 -0
  17. package/dist/contracts/index.js +1045 -4
  18. package/dist/contracts/organization.d.ts +758 -764
  19. package/dist/contracts/organization.d.ts.map +1 -1
  20. package/dist/contracts/organization.js +653 -602
  21. package/dist/contracts/rbac.d.ts +517 -523
  22. package/dist/contracts/rbac.d.ts.map +1 -1
  23. package/dist/contracts/rbac.js +597 -481
  24. package/dist/contracts/user.d.ts +513 -519
  25. package/dist/contracts/user.d.ts.map +1 -1
  26. package/dist/contracts/user.js +222 -319
  27. package/dist/entities/index.d.ts +164 -169
  28. package/dist/entities/index.d.ts.map +1 -1
  29. package/dist/entities/index.js +462 -33
  30. package/dist/entities/organization.d.ts +58 -63
  31. package/dist/entities/organization.d.ts.map +1 -1
  32. package/dist/entities/organization.js +145 -145
  33. package/dist/entities/rbac.d.ts +62 -67
  34. package/dist/entities/rbac.d.ts.map +1 -1
  35. package/dist/entities/rbac.js +119 -132
  36. package/dist/entities/user.d.ts +66 -71
  37. package/dist/entities/user.d.ts.map +1 -1
  38. package/dist/entities/user.js +164 -189
  39. package/dist/events.d.ts +537 -543
  40. package/dist/events.d.ts.map +1 -1
  41. package/dist/events.js +343 -651
  42. package/dist/identity-rbac.capability.d.ts +2 -7
  43. package/dist/identity-rbac.capability.d.ts.map +1 -1
  44. package/dist/identity-rbac.capability.js +29 -29
  45. package/dist/identity-rbac.feature.d.ts +1 -6
  46. package/dist/identity-rbac.feature.d.ts.map +1 -1
  47. package/dist/identity-rbac.feature.js +66 -193
  48. package/dist/index.d.ts +6 -12
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +2100 -14
  51. package/dist/node/contracts/index.js +1045 -0
  52. package/dist/node/contracts/organization.js +655 -0
  53. package/dist/node/contracts/rbac.js +599 -0
  54. package/dist/node/contracts/user.js +235 -0
  55. package/dist/node/entities/index.js +464 -0
  56. package/dist/node/entities/organization.js +150 -0
  57. package/dist/node/entities/rbac.js +124 -0
  58. package/dist/node/entities/user.js +168 -0
  59. package/dist/node/events.js +374 -0
  60. package/dist/node/identity-rbac.capability.js +28 -0
  61. package/dist/node/identity-rbac.feature.js +67 -0
  62. package/dist/node/index.js +2099 -0
  63. package/dist/node/policies/engine.js +154 -0
  64. package/dist/node/policies/index.js +154 -0
  65. package/dist/policies/engine.d.ts +98 -101
  66. package/dist/policies/engine.d.ts.map +1 -1
  67. package/dist/policies/engine.js +151 -164
  68. package/dist/policies/index.d.ts +2 -2
  69. package/dist/policies/index.d.ts.map +1 -0
  70. package/dist/policies/index.js +154 -2
  71. package/package.json +149 -40
  72. package/dist/contracts/organization.js.map +0 -1
  73. package/dist/contracts/rbac.js.map +0 -1
  74. package/dist/contracts/user.js.map +0 -1
  75. package/dist/entities/index.js.map +0 -1
  76. package/dist/entities/organization.js.map +0 -1
  77. package/dist/entities/rbac.js.map +0 -1
  78. package/dist/entities/user.js.map +0 -1
  79. package/dist/events.js.map +0 -1
  80. package/dist/identity-rbac.capability.js.map +0 -1
  81. package/dist/identity-rbac.feature.js.map +0 -1
  82. package/dist/policies/engine.js.map +0 -1
@@ -0,0 +1,154 @@
1
+ // src/policies/engine.ts
2
+ var Permission = {
3
+ USER_CREATE: "user.create",
4
+ USER_READ: "user.read",
5
+ USER_UPDATE: "user.update",
6
+ USER_DELETE: "user.delete",
7
+ USER_LIST: "user.list",
8
+ USER_MANAGE: "user.manage",
9
+ ORG_CREATE: "org.create",
10
+ ORG_READ: "org.read",
11
+ ORG_UPDATE: "org.update",
12
+ ORG_DELETE: "org.delete",
13
+ ORG_LIST: "org.list",
14
+ MEMBER_INVITE: "member.invite",
15
+ MEMBER_REMOVE: "member.remove",
16
+ MEMBER_UPDATE_ROLE: "member.update_role",
17
+ MEMBER_LIST: "member.list",
18
+ MANAGE_MEMBERS: "org.manage_members",
19
+ TEAM_CREATE: "team.create",
20
+ TEAM_UPDATE: "team.update",
21
+ TEAM_DELETE: "team.delete",
22
+ TEAM_MANAGE: "team.manage",
23
+ ROLE_CREATE: "role.create",
24
+ ROLE_UPDATE: "role.update",
25
+ ROLE_DELETE: "role.delete",
26
+ ROLE_ASSIGN: "role.assign",
27
+ ROLE_REVOKE: "role.revoke",
28
+ BILLING_VIEW: "billing.view",
29
+ BILLING_MANAGE: "billing.manage",
30
+ PROJECT_CREATE: "project.create",
31
+ PROJECT_READ: "project.read",
32
+ PROJECT_UPDATE: "project.update",
33
+ PROJECT_DELETE: "project.delete",
34
+ PROJECT_MANAGE: "project.manage",
35
+ ADMIN_ACCESS: "admin.access",
36
+ ADMIN_IMPERSONATE: "admin.impersonate"
37
+ };
38
+ var StandardRole = {
39
+ OWNER: {
40
+ name: "owner",
41
+ description: "Organization owner with full access",
42
+ permissions: Object.values(Permission)
43
+ },
44
+ ADMIN: {
45
+ name: "admin",
46
+ description: "Administrator with most permissions",
47
+ permissions: [
48
+ Permission.USER_READ,
49
+ Permission.USER_LIST,
50
+ Permission.ORG_READ,
51
+ Permission.ORG_UPDATE,
52
+ Permission.MEMBER_INVITE,
53
+ Permission.MEMBER_REMOVE,
54
+ Permission.MEMBER_UPDATE_ROLE,
55
+ Permission.MEMBER_LIST,
56
+ Permission.MANAGE_MEMBERS,
57
+ Permission.TEAM_CREATE,
58
+ Permission.TEAM_UPDATE,
59
+ Permission.TEAM_DELETE,
60
+ Permission.TEAM_MANAGE,
61
+ Permission.PROJECT_CREATE,
62
+ Permission.PROJECT_READ,
63
+ Permission.PROJECT_UPDATE,
64
+ Permission.PROJECT_DELETE,
65
+ Permission.PROJECT_MANAGE,
66
+ Permission.BILLING_VIEW
67
+ ]
68
+ },
69
+ MEMBER: {
70
+ name: "member",
71
+ description: "Regular organization member",
72
+ permissions: [
73
+ Permission.USER_READ,
74
+ Permission.ORG_READ,
75
+ Permission.MEMBER_LIST,
76
+ Permission.PROJECT_READ,
77
+ Permission.PROJECT_CREATE
78
+ ]
79
+ },
80
+ VIEWER: {
81
+ name: "viewer",
82
+ description: "Read-only access",
83
+ permissions: [
84
+ Permission.USER_READ,
85
+ Permission.ORG_READ,
86
+ Permission.MEMBER_LIST,
87
+ Permission.PROJECT_READ
88
+ ]
89
+ }
90
+ };
91
+
92
+ class RBACPolicyEngine {
93
+ roleCache = new Map;
94
+ bindingCache = new Map;
95
+ async checkPermission(input, bindings) {
96
+ const { userId, orgId, permission } = input;
97
+ const now = new Date;
98
+ const userBindings = bindings.filter((b) => b.targetType === "user" && b.targetId === userId);
99
+ const orgBindings = orgId ? bindings.filter((b) => b.targetType === "organization" && b.targetId === orgId) : [];
100
+ const allBindings = [...userBindings, ...orgBindings];
101
+ const activeBindings = allBindings.filter((b) => !b.expiresAt || b.expiresAt > now);
102
+ if (activeBindings.length === 0) {
103
+ return {
104
+ allowed: false,
105
+ reason: "No active role bindings found"
106
+ };
107
+ }
108
+ for (const binding of activeBindings) {
109
+ if (binding.role.permissions.includes(permission)) {
110
+ return {
111
+ allowed: true,
112
+ matchedRole: binding.role.name
113
+ };
114
+ }
115
+ }
116
+ return {
117
+ allowed: false,
118
+ reason: `No role grants the "${permission}" permission`
119
+ };
120
+ }
121
+ async getPermissions(userId, orgId, bindings) {
122
+ const now = new Date;
123
+ const userBindings = bindings.filter((b) => b.targetType === "user" && b.targetId === userId);
124
+ const orgBindings = orgId ? bindings.filter((b) => b.targetType === "organization" && b.targetId === orgId) : [];
125
+ const allBindings = [...userBindings, ...orgBindings];
126
+ const activeBindings = allBindings.filter((b) => !b.expiresAt || b.expiresAt > now);
127
+ const permissions = new Set;
128
+ const roles = [];
129
+ for (const binding of activeBindings) {
130
+ roles.push(binding.role);
131
+ for (const perm of binding.role.permissions) {
132
+ permissions.add(perm);
133
+ }
134
+ }
135
+ return { permissions, roles };
136
+ }
137
+ async hasAnyPermission(userId, orgId, permissions, bindings) {
138
+ const { permissions: userPerms } = await this.getPermissions(userId, orgId, bindings);
139
+ return permissions.some((p) => userPerms.has(p));
140
+ }
141
+ async hasAllPermissions(userId, orgId, permissions, bindings) {
142
+ const { permissions: userPerms } = await this.getPermissions(userId, orgId, bindings);
143
+ return permissions.every((p) => userPerms.has(p));
144
+ }
145
+ }
146
+ function createRBACEngine() {
147
+ return new RBACPolicyEngine;
148
+ }
149
+ export {
150
+ createRBACEngine,
151
+ StandardRole,
152
+ RBACPolicyEngine,
153
+ Permission
154
+ };
@@ -0,0 +1,154 @@
1
+ // src/policies/engine.ts
2
+ var Permission = {
3
+ USER_CREATE: "user.create",
4
+ USER_READ: "user.read",
5
+ USER_UPDATE: "user.update",
6
+ USER_DELETE: "user.delete",
7
+ USER_LIST: "user.list",
8
+ USER_MANAGE: "user.manage",
9
+ ORG_CREATE: "org.create",
10
+ ORG_READ: "org.read",
11
+ ORG_UPDATE: "org.update",
12
+ ORG_DELETE: "org.delete",
13
+ ORG_LIST: "org.list",
14
+ MEMBER_INVITE: "member.invite",
15
+ MEMBER_REMOVE: "member.remove",
16
+ MEMBER_UPDATE_ROLE: "member.update_role",
17
+ MEMBER_LIST: "member.list",
18
+ MANAGE_MEMBERS: "org.manage_members",
19
+ TEAM_CREATE: "team.create",
20
+ TEAM_UPDATE: "team.update",
21
+ TEAM_DELETE: "team.delete",
22
+ TEAM_MANAGE: "team.manage",
23
+ ROLE_CREATE: "role.create",
24
+ ROLE_UPDATE: "role.update",
25
+ ROLE_DELETE: "role.delete",
26
+ ROLE_ASSIGN: "role.assign",
27
+ ROLE_REVOKE: "role.revoke",
28
+ BILLING_VIEW: "billing.view",
29
+ BILLING_MANAGE: "billing.manage",
30
+ PROJECT_CREATE: "project.create",
31
+ PROJECT_READ: "project.read",
32
+ PROJECT_UPDATE: "project.update",
33
+ PROJECT_DELETE: "project.delete",
34
+ PROJECT_MANAGE: "project.manage",
35
+ ADMIN_ACCESS: "admin.access",
36
+ ADMIN_IMPERSONATE: "admin.impersonate"
37
+ };
38
+ var StandardRole = {
39
+ OWNER: {
40
+ name: "owner",
41
+ description: "Organization owner with full access",
42
+ permissions: Object.values(Permission)
43
+ },
44
+ ADMIN: {
45
+ name: "admin",
46
+ description: "Administrator with most permissions",
47
+ permissions: [
48
+ Permission.USER_READ,
49
+ Permission.USER_LIST,
50
+ Permission.ORG_READ,
51
+ Permission.ORG_UPDATE,
52
+ Permission.MEMBER_INVITE,
53
+ Permission.MEMBER_REMOVE,
54
+ Permission.MEMBER_UPDATE_ROLE,
55
+ Permission.MEMBER_LIST,
56
+ Permission.MANAGE_MEMBERS,
57
+ Permission.TEAM_CREATE,
58
+ Permission.TEAM_UPDATE,
59
+ Permission.TEAM_DELETE,
60
+ Permission.TEAM_MANAGE,
61
+ Permission.PROJECT_CREATE,
62
+ Permission.PROJECT_READ,
63
+ Permission.PROJECT_UPDATE,
64
+ Permission.PROJECT_DELETE,
65
+ Permission.PROJECT_MANAGE,
66
+ Permission.BILLING_VIEW
67
+ ]
68
+ },
69
+ MEMBER: {
70
+ name: "member",
71
+ description: "Regular organization member",
72
+ permissions: [
73
+ Permission.USER_READ,
74
+ Permission.ORG_READ,
75
+ Permission.MEMBER_LIST,
76
+ Permission.PROJECT_READ,
77
+ Permission.PROJECT_CREATE
78
+ ]
79
+ },
80
+ VIEWER: {
81
+ name: "viewer",
82
+ description: "Read-only access",
83
+ permissions: [
84
+ Permission.USER_READ,
85
+ Permission.ORG_READ,
86
+ Permission.MEMBER_LIST,
87
+ Permission.PROJECT_READ
88
+ ]
89
+ }
90
+ };
91
+
92
+ class RBACPolicyEngine {
93
+ roleCache = new Map;
94
+ bindingCache = new Map;
95
+ async checkPermission(input, bindings) {
96
+ const { userId, orgId, permission } = input;
97
+ const now = new Date;
98
+ const userBindings = bindings.filter((b) => b.targetType === "user" && b.targetId === userId);
99
+ const orgBindings = orgId ? bindings.filter((b) => b.targetType === "organization" && b.targetId === orgId) : [];
100
+ const allBindings = [...userBindings, ...orgBindings];
101
+ const activeBindings = allBindings.filter((b) => !b.expiresAt || b.expiresAt > now);
102
+ if (activeBindings.length === 0) {
103
+ return {
104
+ allowed: false,
105
+ reason: "No active role bindings found"
106
+ };
107
+ }
108
+ for (const binding of activeBindings) {
109
+ if (binding.role.permissions.includes(permission)) {
110
+ return {
111
+ allowed: true,
112
+ matchedRole: binding.role.name
113
+ };
114
+ }
115
+ }
116
+ return {
117
+ allowed: false,
118
+ reason: `No role grants the "${permission}" permission`
119
+ };
120
+ }
121
+ async getPermissions(userId, orgId, bindings) {
122
+ const now = new Date;
123
+ const userBindings = bindings.filter((b) => b.targetType === "user" && b.targetId === userId);
124
+ const orgBindings = orgId ? bindings.filter((b) => b.targetType === "organization" && b.targetId === orgId) : [];
125
+ const allBindings = [...userBindings, ...orgBindings];
126
+ const activeBindings = allBindings.filter((b) => !b.expiresAt || b.expiresAt > now);
127
+ const permissions = new Set;
128
+ const roles = [];
129
+ for (const binding of activeBindings) {
130
+ roles.push(binding.role);
131
+ for (const perm of binding.role.permissions) {
132
+ permissions.add(perm);
133
+ }
134
+ }
135
+ return { permissions, roles };
136
+ }
137
+ async hasAnyPermission(userId, orgId, permissions, bindings) {
138
+ const { permissions: userPerms } = await this.getPermissions(userId, orgId, bindings);
139
+ return permissions.some((p) => userPerms.has(p));
140
+ }
141
+ async hasAllPermissions(userId, orgId, permissions, bindings) {
142
+ const { permissions: userPerms } = await this.getPermissions(userId, orgId, bindings);
143
+ return permissions.every((p) => userPerms.has(p));
144
+ }
145
+ }
146
+ function createRBACEngine() {
147
+ return new RBACPolicyEngine;
148
+ }
149
+ export {
150
+ createRBACEngine,
151
+ StandardRole,
152
+ RBACPolicyEngine,
153
+ Permission
154
+ };
@@ -1,4 +1,4 @@
1
- import { CreateUserContract, CreateUserInputModel, DeleteUserContract, DeleteUserInputModel, GetCurrentUserContract, ListUsersContract, ListUsersInputModel, ListUsersOutputModel, SuccessResultModel, UpdateUserContract, UpdateUserInputModel, UserDeletedPayloadModel, UserProfileModel } from "./user.js";
2
- import { AcceptInviteContract, AcceptInviteInputModel, CreateOrgContract, CreateOrgInputModel, GetOrgContract, GetOrgInputModel, InvitationModel, InviteMemberContract, InviteMemberInputModel, ListMembersContract, ListMembersInputModel, ListMembersOutputModel, ListUserOrgsContract, ListUserOrgsOutputModel, MemberModel, MemberRemovedPayloadModel, MemberUserModel, OrganizationModel, OrganizationWithRoleModel, RemoveMemberContract, RemoveMemberInputModel, UpdateOrgContract, UpdateOrgInputModel } from "./organization.js";
3
- import { AssignRoleContract, AssignRoleInputModel, BindingIdPayloadModel, CheckPermissionContract, CheckPermissionInputModel, CreateRoleContract, CreateRoleInputModel, DeleteRoleContract, DeleteRoleInputModel, ListRolesContract, ListRolesOutputModel, ListUserPermissionsContract, ListUserPermissionsInputModel, ListUserPermissionsOutputModel, PermissionCheckResultModel, PolicyBindingModel, RevokeRoleContract, RevokeRoleInputModel, RoleModel, UpdateRoleContract, UpdateRoleInputModel } from "./rbac.js";
4
- export { AcceptInviteContract, AcceptInviteInputModel, AssignRoleContract, AssignRoleInputModel, BindingIdPayloadModel, CheckPermissionContract, CheckPermissionInputModel, CreateOrgContract, CreateOrgInputModel, CreateRoleContract, CreateRoleInputModel, CreateUserContract, CreateUserInputModel, DeleteRoleContract, DeleteRoleInputModel, DeleteUserContract, DeleteUserInputModel, GetCurrentUserContract, GetOrgContract, GetOrgInputModel, InvitationModel, InviteMemberContract, InviteMemberInputModel, ListMembersContract, ListMembersInputModel, ListMembersOutputModel, ListRolesContract, ListRolesOutputModel, ListUserOrgsContract, ListUserOrgsOutputModel, ListUserPermissionsContract, ListUserPermissionsInputModel, ListUserPermissionsOutputModel, ListUsersContract, ListUsersInputModel, ListUsersOutputModel, MemberModel, MemberRemovedPayloadModel, MemberUserModel, OrganizationModel, OrganizationWithRoleModel, PermissionCheckResultModel, PolicyBindingModel, RemoveMemberContract, RemoveMemberInputModel, RevokeRoleContract, RevokeRoleInputModel, RoleModel, SuccessResultModel, UpdateOrgContract, UpdateOrgInputModel, UpdateRoleContract, UpdateRoleInputModel, UpdateUserContract, UpdateUserInputModel, UserDeletedPayloadModel, UserProfileModel };
1
+ export { UserProfileModel, CreateUserInputModel, UpdateUserInputModel, SuccessResultModel, UserDeletedPayloadModel, ListUsersInputModel, ListUsersOutputModel, DeleteUserInputModel, CreateUserContract, GetCurrentUserContract, UpdateUserContract, DeleteUserContract, ListUsersContract, } from './user';
2
+ export { OrganizationModel, MemberModel, MemberUserModel, InvitationModel, CreateOrgInputModel, GetOrgInputModel, UpdateOrgInputModel, InviteMemberInputModel, AcceptInviteInputModel, RemoveMemberInputModel, MemberRemovedPayloadModel, ListMembersInputModel, ListMembersOutputModel, OrganizationWithRoleModel, ListUserOrgsOutputModel, CreateOrgContract, GetOrgContract, UpdateOrgContract, InviteMemberContract, AcceptInviteContract, RemoveMemberContract, ListMembersContract, ListUserOrgsContract, } from './organization';
3
+ export { RoleModel, PolicyBindingModel, PermissionCheckResultModel, CreateRoleInputModel, UpdateRoleInputModel, DeleteRoleInputModel, ListRolesOutputModel, AssignRoleInputModel, RevokeRoleInputModel, BindingIdPayloadModel, CheckPermissionInputModel, ListUserPermissionsInputModel, ListUserPermissionsOutputModel, CreateRoleContract, UpdateRoleContract, DeleteRoleContract, ListRolesContract, AssignRoleContract, RevokeRoleContract, CheckPermissionContract, ListUserPermissionsContract, } from './rbac';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,uBAAuB,EACvB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,0BAA0B,EAC1B,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,6BAA6B,EAC7B,8BAA8B,EAC9B,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,QAAQ,CAAC"}