@e-llm-studio/instant-learning 1.3.0-alpha.20 → 1.3.0-alpha.21

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 CHANGED
@@ -3,6 +3,14 @@
3
3
 
4
4
  ## Changelog
5
5
 
6
+ ### 1.3.0-alpha.21 - 2026, June 8th
7
+ **Permissions — Union-based access resolution**
8
+
9
+ - **Union model**: When a user holds multiple roles on the same resource (e.g. inherited group role + direct assignment), permissions from all roles are merged. If any role grants a permission, the user has it.
10
+ - **Removed**: `ROLE_HIERARCHY`, `getRolePrecedence()`, `resolveHighestRolePerResource()`, and the `resolvedData` store field are all gone.
11
+ - **`hasPermission()`** and **`hasApplicationAccess()`** now run against the raw `accessData` via a new internal `getUnionPermissionsForResource()` helper that builds a `Set` of all permissions across matching records.
12
+ - `fetchPermissions()` no longer calls the resolver — stores raw API response only.
13
+
6
14
  ### 1.3.0-alpha.20 - 2026, June 8th
7
15
  **TeachMe Popup — LHS Customisation via `dtt()`**
8
16
 
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("tslib"),r=require("zustand"),s=require("../apis/scopeApis.js"),n=require("./useEnvStore.js"),i=function(e,r){return!!r&&function(e){return e?"string"==typeof e?[e]:[e._id,e.id,e.resourceId,e.resource_id].filter(function(e){return"string"==typeof e&&e.length>0}):[]}(e).includes(r)},o=r.create(function(r,o){return{accessData:[],isLoading:!1,error:null,fetchPermissions:function(n,i){return e.__awaiter(void 0,void 0,void 0,function(){var o,t,a;return e.__generator(this,function(e){switch(e.label){case 0:if(!n)return[2];r({isLoading:!0,error:null}),e.label=1;case 1:return e.trys.push([1,3,,4]),[4,s.appsecApi.get("/users/me",{params:{appId:n,resourceId:i}})];case 2:return o=e.sent(),r({accessData:(null===(a=o.data)||void 0===a?void 0:a.data)||[],isLoading:!1}),[3,4];case 3:return t=e.sent(),console.error("Failed to fetch permissions:",t),r({error:t.message||"Failed to fetch permissions",isLoading:!1}),[3,4];case 4:return[2]}})})},hasPermission:function(e,r){var s,t=o().accessData,a=null===(s=n.default.getState().rbacConfig)||void 0===s?void 0:s.applicationResourceId,u=function(e,r){return t.some(function(s){var n,o,t;return i(s.resourceId,r)&&null!==(t=null===(o=null===(n=s.role)||void 0===n?void 0:n.permissions)||void 0===o?void 0:o.some(function(r){return r.name===e}))&&void 0!==t&&t})};return!(!a||!u(e,a))||u(e,r)},hasGlobalPermission:function(e,r){return!!r&&(o().hasApplicationAccess(r)||o().hasPermission(e,r))},hasApplicationAccess:function(e){return!!e&&o().accessData.some(function(r){var s,n,o;return i(r.resourceId,e)&&null!==(o=null===(n=null===(s=r.role)||void 0===s?void 0:s.permissions)||void 0===n?void 0:n.some(function(e){return"ilotj.scope.access.application.user.add"===e.name}))&&void 0!==o&&o})},reset:function(){return r({accessData:[],isLoading:!1,error:null})}}});exports.usePermissionsStore=o;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("tslib"),r=require("zustand"),s=require("../apis/scopeApis.js"),i=require("./useEnvStore.js"),n=function(e,r){return!!r&&function(e){return e?"string"==typeof e?[e]:[e._id,e.id,e.resourceId,e.resource_id].filter(function(e){return"string"==typeof e&&e.length>0}):[]}(e).includes(r)},t=function(e,r){for(var s,i,t=new Set,a=0,o=e;a<o.length;a++){var u=o[a];if(n(u.resourceId,r))for(var c=0,l=null!==(i=null===(s=u.role)||void 0===s?void 0:s.permissions)&&void 0!==i?i:[];c<l.length;c++){var d=l[c];t.add(d.name)}}return t},a=r.create(function(r,n){return{accessData:[],isLoading:!1,error:null,fetchPermissions:function(i,n){return e.__awaiter(void 0,void 0,void 0,function(){var t,a,o;return e.__generator(this,function(e){switch(e.label){case 0:if(!i)return[2];r({isLoading:!0,error:null}),e.label=1;case 1:return e.trys.push([1,3,,4]),[4,s.appsecApi.get("/users/me",{params:{appId:i,resourceId:n}})];case 2:return t=e.sent(),r({accessData:(null===(o=t.data)||void 0===o?void 0:o.data)||[],isLoading:!1}),[3,4];case 3:return a=e.sent(),console.error("Failed to fetch permissions:",a),r({error:a.message||"Failed to fetch permissions",isLoading:!1}),[3,4];case 4:return[2]}})})},hasPermission:function(e,r){var s,a=n().accessData,o=null===(s=i.default.getState().rbacConfig)||void 0===s?void 0:s.applicationResourceId;if(o&&t(a,o).has(e))return!0;if(r&&t(a,r).has(e))return!0;return!1},hasGlobalPermission:function(e,r){return!!r&&(n().hasApplicationAccess(r)||n().hasPermission(e,r))},hasApplicationAccess:function(e){if(!e)return!1;var r=n().accessData;return t(r,e).has("ilotj.scope.access.application.user.add")},reset:function(){return r({accessData:[],isLoading:!1,error:null})}}});exports.usePermissionsStore=a;
2
2
  //# sourceMappingURL=usePermissionsStore.js.map
@@ -1,2 +1,2 @@
1
- import{__awaiter as r,__generator as e}from"tslib";import{create as n}from"zustand";import{appsecApi as i}from"../apis/scopeApis.js";import o from"./useEnvStore.js";var s=function(r,e){return!!e&&function(r){return r?"string"==typeof r?[r]:[r._id,r.id,r.resourceId,r.resource_id].filter(function(r){return"string"==typeof r&&r.length>0}):[]}(r).includes(e)},t=n(function(n,t){return{accessData:[],isLoading:!1,error:null,fetchPermissions:function(o,s){return r(void 0,void 0,void 0,function(){var r,t,a;return e(this,function(e){switch(e.label){case 0:if(!o)return[2];n({isLoading:!0,error:null}),e.label=1;case 1:return e.trys.push([1,3,,4]),[4,i.get("/users/me",{params:{appId:o,resourceId:s}})];case 2:return r=e.sent(),n({accessData:(null===(a=r.data)||void 0===a?void 0:a.data)||[],isLoading:!1}),[3,4];case 3:return t=e.sent(),console.error("Failed to fetch permissions:",t),n({error:t.message||"Failed to fetch permissions",isLoading:!1}),[3,4];case 4:return[2]}})})},hasPermission:function(r,e){var n,i=t().accessData,a=null===(n=o.getState().rbacConfig)||void 0===n?void 0:n.applicationResourceId,u=function(r,e){return i.some(function(n){var i,o,t;return s(n.resourceId,e)&&null!==(t=null===(o=null===(i=n.role)||void 0===i?void 0:i.permissions)||void 0===o?void 0:o.some(function(e){return e.name===r}))&&void 0!==t&&t})};return!(!a||!u(r,a))||u(r,e)},hasGlobalPermission:function(r,e){return!!e&&(t().hasApplicationAccess(e)||t().hasPermission(r,e))},hasApplicationAccess:function(r){return!!r&&t().accessData.some(function(e){var n,i,o;return s(e.resourceId,r)&&null!==(o=null===(i=null===(n=e.role)||void 0===n?void 0:n.permissions)||void 0===i?void 0:i.some(function(r){return"ilotj.scope.access.application.user.add"===r.name}))&&void 0!==o&&o})},reset:function(){return n({accessData:[],isLoading:!1,error:null})}}});export{t as usePermissionsStore};
1
+ import{__awaiter as r,__generator as e}from"tslib";import{create as s}from"zustand";import{appsecApi as n}from"../apis/scopeApis.js";import i from"./useEnvStore.js";var t=function(r,e){return!!e&&function(r){return r?"string"==typeof r?[r]:[r._id,r.id,r.resourceId,r.resource_id].filter(function(r){return"string"==typeof r&&r.length>0}):[]}(r).includes(e)},o=function(r,e){for(var s,n,i=new Set,o=0,a=r;o<a.length;o++){var c=a[o];if(t(c.resourceId,e))for(var u=0,l=null!==(n=null===(s=c.role)||void 0===s?void 0:s.permissions)&&void 0!==n?n:[];u<l.length;u++){var d=l[u];i.add(d.name)}}return i},a=s(function(s,t){return{accessData:[],isLoading:!1,error:null,fetchPermissions:function(i,t){return r(void 0,void 0,void 0,function(){var r,o,a;return e(this,function(e){switch(e.label){case 0:if(!i)return[2];s({isLoading:!0,error:null}),e.label=1;case 1:return e.trys.push([1,3,,4]),[4,n.get("/users/me",{params:{appId:i,resourceId:t}})];case 2:return r=e.sent(),s({accessData:(null===(a=r.data)||void 0===a?void 0:a.data)||[],isLoading:!1}),[3,4];case 3:return o=e.sent(),console.error("Failed to fetch permissions:",o),s({error:o.message||"Failed to fetch permissions",isLoading:!1}),[3,4];case 4:return[2]}})})},hasPermission:function(r,e){var s,n=t().accessData,a=null===(s=i.getState().rbacConfig)||void 0===s?void 0:s.applicationResourceId;if(a&&o(n,a).has(r))return!0;if(e&&o(n,e).has(r))return!0;return!1},hasGlobalPermission:function(r,e){return!!e&&(t().hasApplicationAccess(e)||t().hasPermission(r,e))},hasApplicationAccess:function(r){if(!r)return!1;var e=t().accessData;return o(e,r).has("ilotj.scope.access.application.user.add")},reset:function(){return s({accessData:[],isLoading:!1,error:null})}}});export{a as usePermissionsStore};
2
2
  //# sourceMappingURL=usePermissionsStore.js.map
@@ -13,7 +13,8 @@ interface AccessData {
13
13
  resourceId: any;
14
14
  resourceType: any;
15
15
  application: string;
16
- user_email: string;
16
+ groupId?: string;
17
+ user_email?: string;
17
18
  role: Role;
18
19
  grantedBy: string;
19
20
  grantedAt: string;
@@ -1 +1 @@
1
- {"version":3,"file":"usePermissionsStore.d.ts","sourceRoot":"","sources":["../../../../../../src/features/LearningManagement/store/usePermissionsStore.ts"],"names":[],"mappings":"AAOA,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,IAAI;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,GAAG,CAAC;IAChB,YAAY,EAAE,GAAG,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACtB;AAmBD,UAAU,gBAAgB;IACxB,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,aAAa,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IACxE,mBAAmB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;IAC7E,oBAAoB,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IACvD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,eAAO,MAAM,mBAAmB,+EAkE7B,CAAC"}
1
+ {"version":3,"file":"usePermissionsStore.d.ts","sourceRoot":"","sources":["../../../../../../src/features/LearningManagement/store/usePermissionsStore.ts"],"names":[],"mappings":"AAMA,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,IAAI;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,GAAG,CAAC;IAChB,YAAY,EAAE,GAAG,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACtB;AA0CD,UAAU,gBAAgB;IACxB,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,aAAa,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IACxE,mBAAmB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;IAC7E,oBAAoB,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IACvD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,eAAO,MAAM,mBAAmB,+EAqD7B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@e-llm-studio/instant-learning",
3
- "version": "1.3.0-alpha.20",
3
+ "version": "1.3.0-alpha.21",
4
4
  "author": "Devesh Patel",
5
5
  "description": "",
6
6
  "license": "MIT",