@schorts/shared-kernel 2.2.5 → 2.3.1

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 (37) hide show
  1. package/CHANGELOG +14 -2
  2. package/dist/cjs/index.js +1 -0
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/rbac/index.js +6 -0
  5. package/dist/cjs/rbac/index.js.map +1 -0
  6. package/dist/cjs/rbac/permission.js +3 -0
  7. package/dist/cjs/rbac/permission.js.map +1 -0
  8. package/dist/cjs/rbac/rbac-policy.js +18 -0
  9. package/dist/cjs/rbac/rbac-policy.js.map +1 -0
  10. package/dist/cjs/rbac/resource.js +3 -0
  11. package/dist/cjs/rbac/resource.js.map +1 -0
  12. package/dist/esm/index.js +1 -0
  13. package/dist/esm/index.js.map +1 -1
  14. package/dist/esm/rbac/index.js +6 -0
  15. package/dist/esm/rbac/index.js.map +1 -0
  16. package/dist/esm/rbac/permission.js +3 -0
  17. package/dist/esm/rbac/permission.js.map +1 -0
  18. package/dist/esm/rbac/rbac-policy.js +18 -0
  19. package/dist/esm/rbac/rbac-policy.js.map +1 -0
  20. package/dist/esm/rbac/resource.js +3 -0
  21. package/dist/esm/rbac/resource.js.map +1 -0
  22. package/dist/types/index.d.ts +1 -0
  23. package/dist/types/index.d.ts.map +1 -1
  24. package/dist/types/rbac/index.d.ts +4 -0
  25. package/dist/types/rbac/index.d.ts.map +1 -0
  26. package/dist/types/rbac/permission.d.ts +5 -0
  27. package/dist/types/rbac/permission.d.ts.map +1 -0
  28. package/dist/types/rbac/rbac-policy.d.ts +11 -0
  29. package/dist/types/rbac/rbac-policy.d.ts.map +1 -0
  30. package/dist/types/rbac/resource.d.ts +5 -0
  31. package/dist/types/rbac/resource.d.ts.map +1 -0
  32. package/package.json +6 -1
  33. package/src/index.ts +1 -0
  34. package/src/rbac/index.ts +4 -0
  35. package/src/rbac/permission.ts +4 -0
  36. package/src/rbac/rbac-policy.ts +26 -0
  37. package/src/rbac/resource.ts +4 -0
package/CHANGELOG CHANGED
@@ -5,13 +5,25 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ### [2.2.4] - 2025-10-10
8
+ ## [2.3.1] - 2025-10-11
9
+
10
+ ### Changed
11
+
12
+ - `userID` now is protected in the `RBACPolicy`.
13
+
14
+ ## [2.3.0] - 2025-10-10
15
+
16
+ ### Added
17
+
18
+ - Added `RBAC` module.
19
+
20
+ ## [2.2.4] - 2025-10-10
9
21
 
10
22
  ### Changed
11
23
 
12
24
  - Remove `Optional` param in the `EnumValue`. Instead allow null values in the `allowedTypes` array.
13
25
 
14
- ### [2.2.3] - 2025-10-10
26
+ ## [2.2.3] - 2025-10-10
15
27
 
16
28
  ### Changed
17
29
 
package/dist/cjs/index.js CHANGED
@@ -25,6 +25,7 @@ __exportStar(require("./i18n"), exports);
25
25
  __exportStar(require("./json-api"), exports);
26
26
  __exportStar(require("./messages"), exports);
27
27
  __exportStar(require("./models"), exports);
28
+ __exportStar(require("./rbac"), exports);
28
29
  __exportStar(require("./result"), exports);
29
30
  __exportStar(require("./state-manager"), exports);
30
31
  __exportStar(require("./unit-of-work"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,6CAA2B;AAC3B,wCAAsB;AACtB,kDAAgC;AAChC,6CAA2B;AAC3B,+CAA6B;AAC7B,yCAAuB;AACvB,yCAAuB;AACvB,6CAA2B;AAC3B,6CAA2B;AAC3B,2CAAyB;AACzB,2CAAyB;AACzB,kDAAgC;AAChC,iDAA+B;AAC/B,0CAAwB;AACxB,kDAAgC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,6CAA2B;AAC3B,wCAAsB;AACtB,kDAAgC;AAChC,6CAA2B;AAC3B,+CAA6B;AAC7B,yCAAuB;AACvB,yCAAuB;AACvB,6CAA2B;AAC3B,6CAA2B;AAC3B,2CAAyB;AACzB,yCAAuB;AACvB,2CAAyB;AACzB,kDAAgC;AAChC,iDAA+B;AAC/B,0CAAwB;AACxB,kDAAgC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RBACPolicy = void 0;
4
+ var rbac_policy_1 = require("./rbac-policy");
5
+ Object.defineProperty(exports, "RBACPolicy", { enumerable: true, get: function () { return rbac_policy_1.RBACPolicy; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rbac/index.ts"],"names":[],"mappings":";;;AAGA,6CAA2C;AAAlC,yGAAA,UAAU,OAAA"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=permission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.js","sourceRoot":"","sources":["../../../src/rbac/permission.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RBACPolicy = void 0;
4
+ class RBACPolicy {
5
+ can(role, action, resource) {
6
+ const permissions = this.getPermissions(role);
7
+ return permissions.some((perm) => (perm.resource === '*' || perm.resource === resource.name) &&
8
+ (perm.action === action || perm.action === 'manage'));
9
+ }
10
+ canAccessOwnedResource(resource) {
11
+ return resource.owner_id === this.userID.value;
12
+ }
13
+ canWithOwnership(role, action, resource) {
14
+ return this.can(role, action, resource) && this.canAccessOwnedResource(resource);
15
+ }
16
+ }
17
+ exports.RBACPolicy = RBACPolicy;
18
+ //# sourceMappingURL=rbac-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac-policy.js","sourceRoot":"","sources":["../../../src/rbac/rbac-policy.ts"],"names":[],"mappings":";;;AAIA,MAAsB,UAAU;IAI9B,GAAG,CAAC,IAAU,EAAE,MAA4B,EAAE,QAAkB;QAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAE9C,OAAO,WAAW,CAAC,IAAI,CACrB,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,IAAI,CAAC,QAAQ,KAAK,GAAG,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,CAAC;YAC1D,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CACvD,CAAC;IACJ,CAAC;IAED,sBAAsB,CAAC,QAAkB;QACvC,OAAO,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IACjD,CAAC;IAED,gBAAgB,CAAC,IAAU,EAAE,MAA4B,EAAE,QAAkB;QAC3E,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACnF,CAAC;CACF;AArBD,gCAqBC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.js","sourceRoot":"","sources":["../../../src/rbac/resource.ts"],"names":[],"mappings":""}
package/dist/esm/index.js CHANGED
@@ -25,6 +25,7 @@ __exportStar(require("./i18n"), exports);
25
25
  __exportStar(require("./json-api"), exports);
26
26
  __exportStar(require("./messages"), exports);
27
27
  __exportStar(require("./models"), exports);
28
+ __exportStar(require("./rbac"), exports);
28
29
  __exportStar(require("./result"), exports);
29
30
  __exportStar(require("./state-manager"), exports);
30
31
  __exportStar(require("./unit-of-work"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,6CAA2B;AAC3B,wCAAsB;AACtB,kDAAgC;AAChC,6CAA2B;AAC3B,+CAA6B;AAC7B,yCAAuB;AACvB,yCAAuB;AACvB,6CAA2B;AAC3B,6CAA2B;AAC3B,2CAAyB;AACzB,2CAAyB;AACzB,kDAAgC;AAChC,iDAA+B;AAC/B,0CAAwB;AACxB,kDAAgC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,6CAA2B;AAC3B,wCAAsB;AACtB,kDAAgC;AAChC,6CAA2B;AAC3B,+CAA6B;AAC7B,yCAAuB;AACvB,yCAAuB;AACvB,6CAA2B;AAC3B,6CAA2B;AAC3B,2CAAyB;AACzB,yCAAuB;AACvB,2CAAyB;AACzB,kDAAgC;AAChC,iDAA+B;AAC/B,0CAAwB;AACxB,kDAAgC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RBACPolicy = void 0;
4
+ var rbac_policy_1 = require("./rbac-policy");
5
+ Object.defineProperty(exports, "RBACPolicy", { enumerable: true, get: function () { return rbac_policy_1.RBACPolicy; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rbac/index.ts"],"names":[],"mappings":";;;AAGA,6CAA2C;AAAlC,yGAAA,UAAU,OAAA"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=permission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.js","sourceRoot":"","sources":["../../../src/rbac/permission.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RBACPolicy = void 0;
4
+ class RBACPolicy {
5
+ can(role, action, resource) {
6
+ const permissions = this.getPermissions(role);
7
+ return permissions.some((perm) => (perm.resource === '*' || perm.resource === resource.name) &&
8
+ (perm.action === action || perm.action === 'manage'));
9
+ }
10
+ canAccessOwnedResource(resource) {
11
+ return resource.owner_id === this.userID.value;
12
+ }
13
+ canWithOwnership(role, action, resource) {
14
+ return this.can(role, action, resource) && this.canAccessOwnedResource(resource);
15
+ }
16
+ }
17
+ exports.RBACPolicy = RBACPolicy;
18
+ //# sourceMappingURL=rbac-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac-policy.js","sourceRoot":"","sources":["../../../src/rbac/rbac-policy.ts"],"names":[],"mappings":";;;AAIA,MAAsB,UAAU;IAI9B,GAAG,CAAC,IAAU,EAAE,MAA4B,EAAE,QAAkB;QAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAE9C,OAAO,WAAW,CAAC,IAAI,CACrB,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,IAAI,CAAC,QAAQ,KAAK,GAAG,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,CAAC;YAC1D,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CACvD,CAAC;IACJ,CAAC;IAED,sBAAsB,CAAC,QAAkB;QACvC,OAAO,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IACjD,CAAC;IAED,gBAAgB,CAAC,IAAU,EAAE,MAA4B,EAAE,QAAkB;QAC3E,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACnF,CAAC;CACF;AArBD,gCAqBC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.js","sourceRoot":"","sources":["../../../src/rbac/resource.ts"],"names":[],"mappings":""}
@@ -9,6 +9,7 @@ export * from "./i18n";
9
9
  export * from "./json-api";
10
10
  export * from "./messages";
11
11
  export * from "./models";
12
+ export * from "./rbac";
12
13
  export * from "./result";
13
14
  export * from "./state-manager";
14
15
  export * from "./unit-of-work";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,OAAO,CAAC;AACtB,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,OAAO,CAAC;AACtB,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type { Permission } from "./permission";
2
+ export type { Resource } from "./resource";
3
+ export { RBACPolicy } from "./rbac-policy";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/rbac/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type Permission = {
2
+ resource: string;
3
+ action: "read" | "write" | "delete" | "manage";
4
+ };
5
+ //# sourceMappingURL=permission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.d.ts","sourceRoot":"","sources":["../../../src/rbac/permission.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;CAChD,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { Permission } from './permission';
2
+ import { Resource } from './resource';
3
+ import { ValueObject } from '../value-objects';
4
+ export declare abstract class RBACPolicy<Role extends string, UserID extends ValueObject> {
5
+ protected abstract userID: UserID;
6
+ abstract getPermissions(role: Role): Permission[];
7
+ can(role: Role, action: Permission['action'], resource: Resource): boolean;
8
+ canAccessOwnedResource(resource: Resource): boolean;
9
+ canWithOwnership(role: Role, action: Permission['action'], resource: Resource): boolean;
10
+ }
11
+ //# sourceMappingURL=rbac-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac-policy.d.ts","sourceRoot":"","sources":["../../../src/rbac/rbac-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,8BAAsB,UAAU,CAAC,IAAI,SAAS,MAAM,EAAE,MAAM,SAAS,WAAW;IAC9E,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,EAAE;IAEjD,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO;IAU1E,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO;IAInD,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO;CAGxF"}
@@ -0,0 +1,5 @@
1
+ export type Resource = {
2
+ name: string;
3
+ owner_id?: string;
4
+ };
5
+ //# sourceMappingURL=resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../../../src/rbac/resource.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@schorts/shared-kernel",
3
- "version": "2.2.5",
3
+ "version": "2.3.1",
4
4
  "description": "A modular, type-safe foundation for building expressive, maintainable applications. This package provides core abstractions for domain modeling, HTTP integration, authentication, state management, and more — designed to be framework-agnostic and highly extensible.",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -66,6 +66,11 @@
66
66
  "require": "./dist/cjs/models/index.js",
67
67
  "types": "./dist/types/models/index.d.ts"
68
68
  },
69
+ "./rbac": {
70
+ "import": "./dist/esm/rbac/index.js",
71
+ "require": "./dist/cjs/rbac/index.js",
72
+ "types": "./dist/types/rbac/index.d.ts"
73
+ },
69
74
  "./result": {
70
75
  "import": "./dist/esm/result/index.js",
71
76
  "require": "./dist/cjs/result/index.js",
package/src/index.ts CHANGED
@@ -9,6 +9,7 @@ export * from "./i18n";
9
9
  export * from "./json-api";
10
10
  export * from "./messages";
11
11
  export * from "./models";
12
+ export * from "./rbac";
12
13
  export * from "./result";
13
14
  export * from "./state-manager";
14
15
  export * from "./unit-of-work";
@@ -0,0 +1,4 @@
1
+ export type { Permission } from "./permission";
2
+ export type { Resource } from "./resource";
3
+
4
+ export { RBACPolicy } from "./rbac-policy";
@@ -0,0 +1,4 @@
1
+ export type Permission = {
2
+ resource: string;
3
+ action: "read" | "write" | "delete" | "manage";
4
+ }
@@ -0,0 +1,26 @@
1
+ import { Permission } from './permission';
2
+ import { Resource } from './resource';
3
+ import { ValueObject } from '../value-objects';
4
+
5
+ export abstract class RBACPolicy<Role extends string, UserID extends ValueObject> {
6
+ protected abstract userID: UserID;
7
+ abstract getPermissions(role: Role): Permission[];
8
+
9
+ can(role: Role, action: Permission['action'], resource: Resource): boolean {
10
+ const permissions = this.getPermissions(role);
11
+
12
+ return permissions.some(
13
+ (perm) =>
14
+ (perm.resource === '*' || perm.resource === resource.name) &&
15
+ (perm.action === action || perm.action === 'manage')
16
+ );
17
+ }
18
+
19
+ canAccessOwnedResource(resource: Resource): boolean {
20
+ return resource.owner_id === this.userID.value;
21
+ }
22
+
23
+ canWithOwnership(role: Role, action: Permission['action'], resource: Resource): boolean {
24
+ return this.can(role, action, resource) && this.canAccessOwnedResource(resource);
25
+ }
26
+ }
@@ -0,0 +1,4 @@
1
+ export type Resource = {
2
+ name: string;
3
+ owner_id?: string;
4
+ };