semola 0.2.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 (46) hide show
  1. package/README.md +669 -0
  2. package/dist/lib/cache/index.d.ts +21 -0
  3. package/dist/lib/cache/index.d.ts.map +1 -0
  4. package/dist/lib/cache/index.js +45 -0
  5. package/dist/lib/cache/index.js.map +1 -0
  6. package/dist/lib/cache/types.d.ts +5 -0
  7. package/dist/lib/cache/types.d.ts.map +1 -0
  8. package/dist/lib/cache/types.js +2 -0
  9. package/dist/lib/cache/types.js.map +1 -0
  10. package/dist/lib/errors/index.d.ts +9 -0
  11. package/dist/lib/errors/index.d.ts.map +1 -0
  12. package/dist/lib/errors/index.js +25 -0
  13. package/dist/lib/errors/index.js.map +1 -0
  14. package/dist/lib/errors/types.d.ts +2 -0
  15. package/dist/lib/errors/types.d.ts.map +1 -0
  16. package/dist/lib/errors/types.js +2 -0
  17. package/dist/lib/errors/types.js.map +1 -0
  18. package/dist/lib/http/index.d.ts +29 -0
  19. package/dist/lib/http/index.d.ts.map +1 -0
  20. package/dist/lib/http/index.js +641 -0
  21. package/dist/lib/http/index.js.map +1 -0
  22. package/dist/lib/http/types.d.ts +175 -0
  23. package/dist/lib/http/types.d.ts.map +1 -0
  24. package/dist/lib/http/types.js +2 -0
  25. package/dist/lib/http/types.js.map +1 -0
  26. package/dist/lib/i18n/index.d.ts +18 -0
  27. package/dist/lib/i18n/index.d.ts.map +1 -0
  28. package/dist/lib/i18n/index.js +38 -0
  29. package/dist/lib/i18n/index.js.map +1 -0
  30. package/dist/lib/i18n/types.d.ts +15 -0
  31. package/dist/lib/i18n/types.d.ts.map +1 -0
  32. package/dist/lib/i18n/types.js +2 -0
  33. package/dist/lib/i18n/types.js.map +1 -0
  34. package/dist/lib/policy/index.d.ts +9 -0
  35. package/dist/lib/policy/index.d.ts.map +1 -0
  36. package/dist/lib/policy/index.js +51 -0
  37. package/dist/lib/policy/index.js.map +1 -0
  38. package/dist/lib/policy/index.test.d.ts +2 -0
  39. package/dist/lib/policy/index.test.d.ts.map +1 -0
  40. package/dist/lib/policy/index.test.js +328 -0
  41. package/dist/lib/policy/index.test.js.map +1 -0
  42. package/dist/lib/policy/types.d.ts +27 -0
  43. package/dist/lib/policy/types.d.ts.map +1 -0
  44. package/dist/lib/policy/types.js +2 -0
  45. package/dist/lib/policy/types.js.map +1 -0
  46. package/package.json +53 -0
@@ -0,0 +1,328 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { Policy } from "./index.js";
3
+ describe("Policy", () => {
4
+ test("should allow access when conditions match", () => {
5
+ const policy = new Policy();
6
+ policy.allow({
7
+ action: "read",
8
+ entity: "Post",
9
+ conditions: {
10
+ status: "published",
11
+ },
12
+ });
13
+ const post = {
14
+ id: 1,
15
+ title: "Sample Post",
16
+ authorId: 1,
17
+ status: "published",
18
+ };
19
+ expect(policy.can("read", "Post", post)).toMatchObject({
20
+ allowed: true,
21
+ });
22
+ });
23
+ test("should deny access when conditions do not match", () => {
24
+ const policy = new Policy();
25
+ policy.allow({
26
+ action: "read",
27
+ entity: "Post",
28
+ conditions: {
29
+ status: "published",
30
+ },
31
+ });
32
+ const post = {
33
+ id: 1,
34
+ title: "Draft Post",
35
+ authorId: 1,
36
+ status: "draft",
37
+ };
38
+ expect(policy.can("read", "Post", post)).toMatchObject({
39
+ allowed: false,
40
+ });
41
+ });
42
+ test("should forbid access when forbid conditions match", () => {
43
+ const policy = new Policy();
44
+ policy.forbid({
45
+ action: "update",
46
+ entity: "Post",
47
+ conditions: {
48
+ status: "published",
49
+ },
50
+ });
51
+ const post = {
52
+ id: 1,
53
+ title: "Published Post",
54
+ authorId: 1,
55
+ status: "published",
56
+ };
57
+ expect(policy.can("update", "Post", post)).toMatchObject({
58
+ allowed: false,
59
+ });
60
+ });
61
+ test("should allow access when forbid conditions do not match", () => {
62
+ const policy = new Policy();
63
+ policy.allow({
64
+ action: "update",
65
+ entity: "Post",
66
+ });
67
+ policy.forbid({
68
+ action: "update",
69
+ entity: "Post",
70
+ conditions: {
71
+ status: "published",
72
+ },
73
+ });
74
+ const post = {
75
+ id: 1,
76
+ title: "Draft Post",
77
+ authorId: 1,
78
+ status: "draft",
79
+ };
80
+ expect(policy.can("update", "Post", post)).toMatchObject({
81
+ allowed: true,
82
+ });
83
+ });
84
+ test("should work with multiple conditions", () => {
85
+ const policy = new Policy();
86
+ policy.allow({
87
+ action: "delete",
88
+ entity: "Post",
89
+ conditions: {
90
+ authorId: 1,
91
+ status: "draft",
92
+ },
93
+ });
94
+ const matchingPost = {
95
+ id: 1,
96
+ title: "My Draft",
97
+ authorId: 1,
98
+ status: "draft",
99
+ };
100
+ const nonMatchingPost1 = {
101
+ id: 2,
102
+ title: "Someone else's draft",
103
+ authorId: 2,
104
+ status: "draft",
105
+ };
106
+ const nonMatchingPost2 = {
107
+ id: 3,
108
+ title: "My published post",
109
+ authorId: 1,
110
+ status: "published",
111
+ };
112
+ expect(policy.can("delete", "Post", matchingPost)).toMatchObject({
113
+ allowed: true,
114
+ });
115
+ expect(policy.can("delete", "Post", nonMatchingPost1)).toMatchObject({
116
+ allowed: false,
117
+ });
118
+ expect(policy.can("delete", "Post", nonMatchingPost2)).toMatchObject({
119
+ allowed: false,
120
+ });
121
+ });
122
+ test("should allow access when no conditions are specified", () => {
123
+ const policy = new Policy();
124
+ policy.allow({
125
+ action: "read",
126
+ entity: "Post",
127
+ });
128
+ const post = {
129
+ id: 1,
130
+ title: "Any Post",
131
+ authorId: 1,
132
+ status: "published",
133
+ };
134
+ expect(policy.can("read", "Post", post)).toMatchObject({
135
+ allowed: true,
136
+ });
137
+ });
138
+ test("should deny access when no matching rule exists", () => {
139
+ const policy = new Policy();
140
+ policy.allow({
141
+ action: "read",
142
+ entity: "Post",
143
+ });
144
+ expect(policy.can("delete", "Post")).toMatchObject({ allowed: false });
145
+ });
146
+ test("should handle the example from requirements", () => {
147
+ const post = {
148
+ id: 1,
149
+ title: "Sample Post Title",
150
+ authorId: 1,
151
+ status: "published",
152
+ };
153
+ const policy = new Policy();
154
+ policy.allow({
155
+ action: "read",
156
+ entity: "Post",
157
+ conditions: {
158
+ status: "published",
159
+ },
160
+ });
161
+ policy.forbid({
162
+ action: "update",
163
+ entity: "Post",
164
+ conditions: {
165
+ status: "published",
166
+ },
167
+ });
168
+ expect(policy.can("read", "Post", post)).toMatchObject({
169
+ allowed: true,
170
+ });
171
+ expect(policy.can("update", "Post", post)).toMatchObject({
172
+ allowed: false,
173
+ });
174
+ });
175
+ test("should handle multiple rules with different actions", () => {
176
+ const policy = new Policy();
177
+ policy.allow({
178
+ action: "read",
179
+ entity: "Post",
180
+ conditions: {
181
+ status: "published",
182
+ },
183
+ });
184
+ policy.allow({
185
+ action: "update",
186
+ entity: "Post",
187
+ conditions: {
188
+ status: "draft",
189
+ },
190
+ });
191
+ const publishedPost = {
192
+ id: 1,
193
+ title: "Published",
194
+ authorId: 1,
195
+ status: "published",
196
+ };
197
+ const draftPost = {
198
+ id: 2,
199
+ title: "Draft",
200
+ authorId: 1,
201
+ status: "draft",
202
+ };
203
+ expect(policy.can("read", "Post", publishedPost)).toMatchObject({
204
+ allowed: true,
205
+ });
206
+ expect(policy.can("read", "Post", draftPost)).toMatchObject({
207
+ allowed: false,
208
+ });
209
+ expect(policy.can("update", "Post", publishedPost)).toMatchObject({
210
+ allowed: false,
211
+ });
212
+ expect(policy.can("update", "Post", draftPost)).toMatchObject({
213
+ allowed: true,
214
+ });
215
+ });
216
+ test("should handle different entities", () => {
217
+ const policy = new Policy();
218
+ policy.allow({
219
+ action: "read",
220
+ entity: "Post",
221
+ });
222
+ policy.allow({
223
+ action: "read",
224
+ entity: "Comment",
225
+ });
226
+ expect(policy.can("read", "Post")).toMatchObject({ allowed: true });
227
+ expect(policy.can("read", "Comment")).toMatchObject({ allowed: true });
228
+ expect(policy.can("read", "User")).toMatchObject({ allowed: false });
229
+ });
230
+ test("should return reason when forbid rule matches", () => {
231
+ const policy = new Policy();
232
+ policy.forbid({
233
+ action: "delete",
234
+ entity: "Post",
235
+ reason: "You cannot delete published posts",
236
+ conditions: {
237
+ status: "published",
238
+ },
239
+ });
240
+ const post = {
241
+ id: 1,
242
+ title: "Published Post",
243
+ authorId: 1,
244
+ status: "published",
245
+ };
246
+ const result = policy.can("delete", "Post", post);
247
+ expect(result).toMatchObject({
248
+ allowed: false,
249
+ reason: "You cannot delete published posts",
250
+ });
251
+ });
252
+ test("should return reason when allow rule matches", () => {
253
+ const policy = new Policy();
254
+ policy.allow({
255
+ action: "read",
256
+ entity: "Post",
257
+ reason: "Public posts are visible to everyone",
258
+ conditions: {
259
+ status: "published",
260
+ },
261
+ });
262
+ const post = {
263
+ id: 1,
264
+ title: "Published Post",
265
+ authorId: 1,
266
+ status: "published",
267
+ };
268
+ const result = policy.can("read", "Post", post);
269
+ expect(result).toMatchObject({
270
+ allowed: true,
271
+ reason: "Public posts are visible to everyone",
272
+ });
273
+ });
274
+ test("should return undefined reason when no reason is provided", () => {
275
+ const policy = new Policy();
276
+ policy.allow({
277
+ action: "read",
278
+ entity: "Post",
279
+ conditions: {
280
+ status: "published",
281
+ },
282
+ });
283
+ const post = {
284
+ id: 1,
285
+ title: "Published Post",
286
+ authorId: 1,
287
+ status: "published",
288
+ };
289
+ const result = policy.can("read", "Post", post);
290
+ expect(result).toMatchObject({ allowed: true });
291
+ expect(result.reason).toBeUndefined();
292
+ });
293
+ test("should return undefined reason when no rule matches", () => {
294
+ const policy = new Policy();
295
+ policy.allow({
296
+ action: "read",
297
+ entity: "Post",
298
+ reason: "Some reason",
299
+ });
300
+ const result = policy.can("delete", "Post");
301
+ expect(result).toMatchObject({ allowed: false });
302
+ expect(result.reason).toBeUndefined();
303
+ });
304
+ test("should handle reason with multiple conditions", () => {
305
+ const policy = new Policy();
306
+ policy.forbid({
307
+ action: "update",
308
+ entity: "Post",
309
+ reason: "Admins cannot update their own published posts",
310
+ conditions: {
311
+ authorId: 1,
312
+ status: "published",
313
+ },
314
+ });
315
+ const post = {
316
+ id: 1,
317
+ title: "Admin's Post",
318
+ authorId: 1,
319
+ status: "published",
320
+ };
321
+ const result = policy.can("update", "Post", post);
322
+ expect(result).toMatchObject({
323
+ allowed: false,
324
+ reason: "Admins cannot update their own published posts",
325
+ });
326
+ });
327
+ });
328
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/lib/policy/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export type Action = "read" | "create" | "update" | "delete" | (string & {});
2
+ export type Entity = string;
3
+ export type Conditions<T = any> = Partial<T>;
4
+ export type Rule<T = any> = {
5
+ action: Action;
6
+ entity: Entity;
7
+ conditions?: Conditions<T>;
8
+ inverted: boolean;
9
+ reason?: string;
10
+ };
11
+ export type AllowParams<T = any> = {
12
+ action: Action;
13
+ entity: Entity;
14
+ conditions?: Conditions<T>;
15
+ reason?: string;
16
+ };
17
+ export type ForbidParams<T = any> = {
18
+ action: Action;
19
+ entity: Entity;
20
+ conditions?: Conditions<T>;
21
+ reason?: string;
22
+ };
23
+ export type CanResult = {
24
+ allowed: boolean;
25
+ reason?: string;
26
+ };
27
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/policy/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAC7E,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAE5B,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;AAE7C,MAAM,MAAM,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,GAAG,IAAI;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,GAAG,IAAI;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/policy/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "semola",
3
+ "version": "0.2.0",
4
+ "description": "A TypeScript utility kit",
5
+ "type": "module",
6
+ "exports": {
7
+ "./errors": {
8
+ "import": "./dist/lib/errors/index.js",
9
+ "types": "./dist/lib/errors/index.d.ts"
10
+ },
11
+ "./cache": {
12
+ "import": "./dist/lib/cache/index.js",
13
+ "types": "./dist/lib/cache/index.d.ts"
14
+ },
15
+ "./i18n": {
16
+ "import": "./dist/lib/i18n/index.js",
17
+ "types": "./dist/lib/i18n/index.d.ts"
18
+ },
19
+ "./policy": {
20
+ "import": "./dist/lib/policy/index.js",
21
+ "types": "./dist/lib/policy/index.d.ts"
22
+ }
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "README.md"
27
+ ],
28
+ "scripts": {
29
+ "build": "tsc",
30
+ "check": "biome check --write . && tsc --noEmit",
31
+ "test": "bun test",
32
+ "prepublishOnly": "bun run build",
33
+ "publish": "bun publish --access public"
34
+ },
35
+ "keywords": [
36
+ "typescript",
37
+ "utilities",
38
+ "kit"
39
+ ],
40
+ "author": "Leonardo Dipace",
41
+ "license": "MIT",
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "https://github.com/leonardodipace/ts-kit"
45
+ },
46
+ "devDependencies": {
47
+ "@biomejs/biome": "2.3.10",
48
+ "@types/bun": "latest"
49
+ },
50
+ "peerDependencies": {
51
+ "typescript": "^5"
52
+ }
53
+ }