@adaas/a-utils 0.1.7 → 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.
Files changed (35) hide show
  1. package/README.md +393 -6
  2. package/dist/index.d.ts +7 -2
  3. package/dist/index.js +38 -7
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/lib/A-Channel/A-Channel.component.d.ts +19 -0
  6. package/dist/src/lib/A-Channel/A-Channel.component.js +76 -0
  7. package/dist/src/lib/A-Channel/A-Channel.component.js.map +1 -1
  8. package/dist/src/lib/A-Channel/A-Channel.error.d.ts +1 -0
  9. package/dist/src/lib/A-Channel/A-Channel.error.js +1 -0
  10. package/dist/src/lib/A-Channel/A-Channel.error.js.map +1 -1
  11. package/dist/src/lib/A-Config/A-Config.container.js +1 -1
  12. package/dist/src/lib/A-Config/A-Config.container.js.map +1 -1
  13. package/dist/src/lib/A-Manifest/A-Manifest.context.d.ts +52 -0
  14. package/dist/src/lib/A-Manifest/A-Manifest.context.js +154 -0
  15. package/dist/src/lib/A-Manifest/A-Manifest.context.js.map +1 -0
  16. package/dist/src/lib/A-Manifest/A-Manifest.error.d.ts +4 -0
  17. package/dist/src/lib/A-Manifest/A-Manifest.error.js +9 -0
  18. package/dist/src/lib/A-Manifest/A-Manifest.error.js.map +1 -0
  19. package/dist/src/lib/A-Manifest/A-Manifest.types.d.ts +43 -0
  20. package/dist/src/lib/A-Manifest/A-Manifest.types.js +3 -0
  21. package/dist/src/lib/A-Manifest/A-Manifest.types.js.map +1 -0
  22. package/dist/src/lib/A-Manifest/classes/A-ManifestChecker.class.d.ts +13 -0
  23. package/dist/src/lib/A-Manifest/classes/A-ManifestChecker.class.js +24 -0
  24. package/dist/src/lib/A-Manifest/classes/A-ManifestChecker.class.js.map +1 -0
  25. package/index.ts +42 -10
  26. package/package.json +2 -2
  27. package/src/lib/A-Channel/A-Channel.component.ts +70 -2
  28. package/src/lib/A-Channel/A-Channel.error.ts +2 -0
  29. package/src/lib/A-Config/A-Config.container.ts +1 -1
  30. package/src/lib/A-Manifest/A-Manifest.context.ts +198 -0
  31. package/src/lib/A-Manifest/A-Manifest.error.ts +7 -0
  32. package/src/lib/A-Manifest/A-Manifest.types.ts +62 -0
  33. package/src/lib/A-Manifest/README.md +201 -0
  34. package/src/lib/A-Manifest/classes/A-ManifestChecker.class.ts +24 -0
  35. package/tests/A-Manifest.test.ts +290 -0
@@ -0,0 +1,290 @@
1
+ import { A_Component } from "@adaas/a-concept";
2
+ import { A_Manifest } from "../src/lib/A-Manifest/A-Manifest.context";
3
+
4
+ describe('A_Manifest', () => {
5
+ it('Should deny access to excluded components at component level', () => {
6
+ class UserController extends A_Component {
7
+ get() { return 'user.get'; }
8
+ post() { return 'user.post'; }
9
+ }
10
+ class GuestUser extends A_Component {}
11
+ class RegisteredUser extends A_Component {}
12
+
13
+ const manifest = new A_Manifest([
14
+ {
15
+ component: UserController,
16
+ exclude: [GuestUser]
17
+ }
18
+ ]);
19
+
20
+ expect(manifest.isAllowed(UserController, 'get').for(GuestUser)).toBe(false);
21
+ expect(manifest.isAllowed(UserController, 'post').for(GuestUser)).toBe(false);
22
+ expect(manifest.isAllowed(UserController, 'get').for(RegisteredUser)).toBe(true);
23
+ });
24
+
25
+ it('Should allow access only to included components at component level', () => {
26
+ class AdminController extends A_Component {
27
+ get() { return 'admin.get'; }
28
+ adminPanel() { return 'admin.adminPanel'; }
29
+ }
30
+ class AdminUser extends A_Component {}
31
+ class SuperAdmin extends A_Component {}
32
+ class RegisteredUser extends A_Component {}
33
+
34
+ const manifest = new A_Manifest([
35
+ {
36
+ component: AdminController,
37
+ apply: [AdminUser, SuperAdmin]
38
+ }
39
+ ]);
40
+
41
+ expect(manifest.isAllowed(AdminController, 'get').for(RegisteredUser)).toBe(false);
42
+ expect(manifest.isAllowed(AdminController, 'get').for(AdminUser)).toBe(true);
43
+ expect(manifest.isAllowed(AdminController, 'adminPanel').for(SuperAdmin)).toBe(true);
44
+ });
45
+
46
+ it('Should respect method-level exclusion rules', () => {
47
+ class UserController extends A_Component {
48
+ get() { return 'user.get'; }
49
+ post() { return 'user.post'; }
50
+ delete() { return 'user.delete'; }
51
+ }
52
+ class GuestUser extends A_Component {}
53
+ class RegisteredUser extends A_Component {}
54
+ class AdminUser extends A_Component {}
55
+ class SuperAdmin extends A_Component {}
56
+
57
+ const manifest = new A_Manifest([
58
+ {
59
+ component: UserController,
60
+ methods: [
61
+ {
62
+ method: 'delete',
63
+ apply: [AdminUser, SuperAdmin]
64
+ },
65
+ {
66
+ method: 'post',
67
+ exclude: [GuestUser]
68
+ }
69
+ ]
70
+ }
71
+ ]);
72
+
73
+ expect(manifest.isAllowed(UserController, 'get').for(GuestUser)).toBe(true);
74
+ expect(manifest.isAllowed(UserController, 'post').for(GuestUser)).toBe(false);
75
+ expect(manifest.isAllowed(UserController, 'post').for(RegisteredUser)).toBe(true);
76
+ expect(manifest.isAllowed(UserController, 'delete').for(RegisteredUser)).toBe(false);
77
+ expect(manifest.isAllowed(UserController, 'delete').for(AdminUser)).toBe(true);
78
+ });
79
+
80
+ it('Should handle regex patterns for method matching', () => {
81
+ class UserController extends A_Component {
82
+ get() { return 'user.get'; }
83
+ post() { return 'user.post'; }
84
+ put() { return 'user.put'; }
85
+ delete() { return 'user.delete'; }
86
+ }
87
+ class GuestUser extends A_Component {}
88
+ class RegisteredUser extends A_Component {}
89
+
90
+ const manifest = new A_Manifest([
91
+ {
92
+ component: UserController,
93
+ methods: [
94
+ {
95
+ method: /^(post|put|delete)$/,
96
+ exclude: [GuestUser]
97
+ }
98
+ ]
99
+ }
100
+ ]);
101
+
102
+ expect(manifest.isAllowed(UserController, 'get').for(GuestUser)).toBe(true);
103
+ expect(manifest.isAllowed(UserController, 'post').for(GuestUser)).toBe(false);
104
+ expect(manifest.isAllowed(UserController, 'put').for(GuestUser)).toBe(false);
105
+ expect(manifest.isAllowed(UserController, 'delete').for(GuestUser)).toBe(false);
106
+ expect(manifest.isAllowed(UserController, 'post').for(RegisteredUser)).toBe(true);
107
+ });
108
+
109
+ it('Should allow method-level overrides of component-level rules', () => {
110
+ class UserController extends A_Component {
111
+ get() { return 'user.get'; }
112
+ post() { return 'user.post'; }
113
+ }
114
+ class AdminController extends A_Component {
115
+ get() { return 'admin.get'; }
116
+ }
117
+ class GuestUser extends A_Component {}
118
+ class RegisteredUser extends A_Component {}
119
+ class AdminUser extends A_Component {}
120
+ class SuperAdmin extends A_Component {}
121
+
122
+ const manifest = new A_Manifest([
123
+ {
124
+ component: UserController,
125
+ exclude: [GuestUser],
126
+ methods: [
127
+ {
128
+ method: 'get',
129
+ apply: [GuestUser, RegisteredUser, AdminUser, SuperAdmin]
130
+ }
131
+ ]
132
+ },
133
+ {
134
+ component: AdminController,
135
+ apply: [AdminUser, SuperAdmin]
136
+ }
137
+ ]);
138
+
139
+ // Method-level rule Should override component-level exclusion
140
+ expect(manifest.isAllowed(UserController, 'get').for(GuestUser)).toBe(true);
141
+
142
+ // Component-level exclusion Should apply to methods without specific rules
143
+ expect(manifest.isAllowed(UserController, 'post').for(GuestUser)).toBe(false);
144
+
145
+ // Other component rules Should work independently
146
+ expect(manifest.isAllowed(AdminController, 'get').for(RegisteredUser)).toBe(false);
147
+ expect(manifest.isAllowed(AdminController, 'get').for(AdminUser)).toBe(true);
148
+ });
149
+
150
+ it('Should work with isExcluded method', () => {
151
+ class UserController extends A_Component {
152
+ post() { return 'user.post'; }
153
+ }
154
+ class GuestUser extends A_Component {}
155
+ class RegisteredUser extends A_Component {}
156
+
157
+ const manifest = new A_Manifest([
158
+ {
159
+ component: UserController,
160
+ exclude: [GuestUser]
161
+ }
162
+ ]);
163
+
164
+ expect(manifest.isExcluded(UserController, 'post').for(GuestUser)).toBe(true);
165
+ expect(manifest.isExcluded(UserController, 'post').for(RegisteredUser)).toBe(false);
166
+ });
167
+
168
+ it('Should handle empty configuration and allow all by default', () => {
169
+ class UserController extends A_Component {
170
+ get() { return 'user.get'; }
171
+ }
172
+ class GuestUser extends A_Component {}
173
+
174
+ const manifest = new A_Manifest([]);
175
+
176
+ expect(manifest.isAllowed(UserController, 'get').for(GuestUser)).toBe(true);
177
+ });
178
+
179
+ it('Should handle component with no specific rules and allow all by default', () => {
180
+ class UserController extends A_Component {
181
+ get() { return 'user.get'; }
182
+ }
183
+ class GuestUser extends A_Component {}
184
+
185
+ const manifest = new A_Manifest([
186
+ {
187
+ component: UserController
188
+ // No apply or exclude rules
189
+ }
190
+ ]);
191
+
192
+ expect(manifest.isAllowed(UserController, 'get').for(GuestUser)).toBe(true);
193
+ });
194
+
195
+ it('Should apply component-level rules to all methods when no method rules exist', () => {
196
+ class UserController extends A_Component {
197
+ get() { return 'user.get'; }
198
+ post() { return 'user.post'; }
199
+ }
200
+ class GuestUser extends A_Component {}
201
+
202
+ const manifest = new A_Manifest([
203
+ {
204
+ component: UserController,
205
+ exclude: [GuestUser]
206
+ }
207
+ ]);
208
+
209
+ expect(manifest.isAllowed(UserController, 'get').for(GuestUser)).toBe(false);
210
+ expect(manifest.isAllowed(UserController, 'post').for(GuestUser)).toBe(false);
211
+ expect(manifest.isAllowed(UserController, 'anyMethod').for(GuestUser)).toBe(false);
212
+ });
213
+
214
+ it('Should throw error for invalid configuration type', () => {
215
+ expect(() => {
216
+ // @ts-ignore - Testing runtime error
217
+ new A_Manifest("invalid");
218
+ }).toThrow();
219
+ });
220
+
221
+ it('Should throw error for non-component constructor in configuration', () => {
222
+ class GuestUser extends A_Component {}
223
+
224
+ expect(() => {
225
+ new A_Manifest([
226
+ {
227
+ // @ts-ignore - Testing runtime error
228
+ component: "not-a-constructor",
229
+ exclude: [GuestUser]
230
+ }
231
+ ]);
232
+ }).toThrow();
233
+ });
234
+
235
+ it('Should handle multiple method rules for the same component', () => {
236
+ class UserController extends A_Component {
237
+ get() { return 'user.get'; }
238
+ post() { return 'user.post'; }
239
+ put() { return 'user.put'; }
240
+ delete() { return 'user.delete'; }
241
+ }
242
+ class GuestUser extends A_Component {}
243
+ class RegisteredUser extends A_Component {}
244
+ class AdminUser extends A_Component {}
245
+
246
+ const manifest = new A_Manifest([
247
+ {
248
+ component: UserController,
249
+ methods: [
250
+ {
251
+ method: 'get',
252
+ apply: [GuestUser, RegisteredUser, AdminUser]
253
+ },
254
+ {
255
+ method: 'post',
256
+ apply: [RegisteredUser, AdminUser]
257
+ },
258
+ {
259
+ method: 'delete',
260
+ apply: [AdminUser]
261
+ }
262
+ ]
263
+ }
264
+ ]);
265
+
266
+ expect(manifest.isAllowed(UserController, 'get').for(GuestUser)).toBe(true);
267
+ expect(manifest.isAllowed(UserController, 'post').for(GuestUser)).toBe(false);
268
+ expect(manifest.isAllowed(UserController, 'post').for(RegisteredUser)).toBe(true);
269
+ expect(manifest.isAllowed(UserController, 'delete').for(RegisteredUser)).toBe(false);
270
+ expect(manifest.isAllowed(UserController, 'delete').for(AdminUser)).toBe(true);
271
+ expect(manifest.isAllowed(UserController, 'put').for(GuestUser)).toBe(true); // No rule = allow
272
+ });
273
+
274
+ it('Should prioritize exclude rules over apply rules', () => {
275
+ class UserController extends A_Component {
276
+ post() { return 'user.post'; }
277
+ }
278
+ class RegisteredUser extends A_Component {}
279
+
280
+ const manifest = new A_Manifest([
281
+ {
282
+ component: UserController,
283
+ apply: [RegisteredUser],
284
+ exclude: [RegisteredUser] // Exclude Should take precedence
285
+ }
286
+ ]);
287
+
288
+ expect(manifest.isAllowed(UserController, 'post').for(RegisteredUser)).toBe(false);
289
+ });
290
+ });