@pthm/melange 0.4.0 → 0.6.4
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 +294 -18
- package/dist/adapters/index.d.ts +10 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +8 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/pg.d.ts +42 -0
- package/dist/adapters/pg.d.ts.map +1 -0
- package/dist/adapters/pg.js +38 -0
- package/dist/adapters/pg.js.map +1 -0
- package/dist/adapters/postgres.d.ts +37 -0
- package/dist/adapters/postgres.d.ts.map +1 -0
- package/dist/adapters/postgres.js +35 -0
- package/dist/adapters/postgres.js.map +1 -0
- package/dist/cache.d.ts +90 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +93 -0
- package/dist/cache.js.map +1 -0
- package/dist/cache.test.d.ts +5 -0
- package/dist/cache.test.d.ts.map +1 -0
- package/dist/cache.test.js +127 -0
- package/dist/cache.test.js.map +1 -0
- package/dist/checker.d.ts +169 -7
- package/dist/checker.d.ts.map +1 -1
- package/dist/checker.js +214 -9
- package/dist/checker.js.map +1 -1
- package/dist/database.d.ts +45 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +8 -0
- package/dist/database.js.map +1 -0
- package/dist/errors.d.ts +45 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +58 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +37 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/validator.d.ts +28 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +60 -0
- package/dist/validator.js.map +1 -0
- package/dist/validator.test.d.ts +5 -0
- package/dist/validator.test.d.ts.map +1 -0
- package/dist/validator.test.js +88 -0
- package/dist/validator.test.js.map +1 -0
- package/package.json +24 -8
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for validators.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, test, expect } from 'vitest';
|
|
5
|
+
import { validateObject, validateRelation } from './validator.js';
|
|
6
|
+
describe('validateObject', () => {
|
|
7
|
+
test('accepts valid object', () => {
|
|
8
|
+
const obj = { type: 'user', id: '123' };
|
|
9
|
+
expect(() => validateObject(obj, 'subject')).not.toThrow();
|
|
10
|
+
});
|
|
11
|
+
test('accepts object with wildcard id', () => {
|
|
12
|
+
const obj = { type: 'user', id: '*' };
|
|
13
|
+
expect(() => validateObject(obj, 'subject')).not.toThrow();
|
|
14
|
+
});
|
|
15
|
+
test('accepts object with userset relation', () => {
|
|
16
|
+
const obj = { type: 'group', id: '456', relation: 'member' };
|
|
17
|
+
expect(() => validateObject(obj, 'subject')).not.toThrow();
|
|
18
|
+
});
|
|
19
|
+
test('rejects missing type', () => {
|
|
20
|
+
const obj = { type: '', id: '123' };
|
|
21
|
+
expect(() => validateObject(obj, 'subject')).toThrow('subject.type is required');
|
|
22
|
+
});
|
|
23
|
+
test('rejects non-string type', () => {
|
|
24
|
+
const obj = { type: 123, id: '123' };
|
|
25
|
+
expect(() => validateObject(obj, 'subject')).toThrow('subject.type must be a string');
|
|
26
|
+
});
|
|
27
|
+
test('rejects missing id', () => {
|
|
28
|
+
const obj = { type: 'user', id: '' };
|
|
29
|
+
expect(() => validateObject(obj, 'object')).toThrow('object.id is required');
|
|
30
|
+
});
|
|
31
|
+
test('rejects non-string id', () => {
|
|
32
|
+
const obj = { type: 'user', id: 123 };
|
|
33
|
+
expect(() => validateObject(obj, 'object')).toThrow('object.id must be a string');
|
|
34
|
+
});
|
|
35
|
+
test('accepts empty relation when provided', () => {
|
|
36
|
+
const obj = { type: 'group', id: '456', relation: '' };
|
|
37
|
+
// Validator doesn't check relation field on object - that's validated separately
|
|
38
|
+
expect(() => validateObject(obj, 'subject')).not.toThrow();
|
|
39
|
+
});
|
|
40
|
+
test('accepts non-string relation when provided', () => {
|
|
41
|
+
const obj = {
|
|
42
|
+
type: 'group',
|
|
43
|
+
id: '456',
|
|
44
|
+
relation: 123,
|
|
45
|
+
};
|
|
46
|
+
// Validator doesn't check relation field on object - that's validated separately
|
|
47
|
+
expect(() => validateObject(obj, 'subject')).not.toThrow();
|
|
48
|
+
});
|
|
49
|
+
test('rejects null object', () => {
|
|
50
|
+
const obj = null;
|
|
51
|
+
expect(() => validateObject(obj, 'subject')).toThrow('subject is required');
|
|
52
|
+
});
|
|
53
|
+
test('rejects undefined object', () => {
|
|
54
|
+
const obj = undefined;
|
|
55
|
+
expect(() => validateObject(obj, 'subject')).toThrow('subject is required');
|
|
56
|
+
});
|
|
57
|
+
test('custom field name appears in error message', () => {
|
|
58
|
+
const obj = { type: '', id: '123' };
|
|
59
|
+
expect(() => validateObject(obj, 'customField')).toThrow('customField.type is required');
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe('validateRelation', () => {
|
|
63
|
+
test('accepts valid relation', () => {
|
|
64
|
+
expect(() => validateRelation('can_read')).not.toThrow();
|
|
65
|
+
});
|
|
66
|
+
test('accepts relation with underscores', () => {
|
|
67
|
+
expect(() => validateRelation('can_read_write')).not.toThrow();
|
|
68
|
+
});
|
|
69
|
+
test('accepts relation with numbers', () => {
|
|
70
|
+
expect(() => validateRelation('level_1_admin')).not.toThrow();
|
|
71
|
+
});
|
|
72
|
+
test('rejects empty relation', () => {
|
|
73
|
+
expect(() => validateRelation('')).toThrow('relation is required');
|
|
74
|
+
});
|
|
75
|
+
test('rejects non-string relation', () => {
|
|
76
|
+
expect(() => validateRelation(123)).toThrow('relation must be a string');
|
|
77
|
+
});
|
|
78
|
+
test('rejects null relation', () => {
|
|
79
|
+
expect(() => validateRelation(null)).toThrow('relation is required');
|
|
80
|
+
});
|
|
81
|
+
test('rejects undefined relation', () => {
|
|
82
|
+
expect(() => validateRelation(undefined)).toThrow('relation is required');
|
|
83
|
+
});
|
|
84
|
+
test('rejects whitespace-only relation', () => {
|
|
85
|
+
expect(() => validateRelation(' ')).toThrow('relation cannot be empty');
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=validator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.test.js","sourceRoot":"","sources":["../src/validator.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pthm/melange",
|
|
3
|
-
"version": "0.4
|
|
3
|
+
"version": "0.6.4",
|
|
4
4
|
"description": "TypeScript client for Melange PostgreSQL authorization",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"authorization",
|
|
@@ -29,15 +29,31 @@
|
|
|
29
29
|
"dist",
|
|
30
30
|
"README.md"
|
|
31
31
|
],
|
|
32
|
-
"scripts": {
|
|
33
|
-
"build": "tsc",
|
|
34
|
-
"clean": "rm -rf dist",
|
|
35
|
-
"prepublishOnly": "npm run build"
|
|
36
|
-
},
|
|
37
32
|
"devDependencies": {
|
|
38
|
-
"
|
|
33
|
+
"@types/node": "^18.0.0",
|
|
34
|
+
"@types/pg": "^8.11.0",
|
|
35
|
+
"@vitest/coverage-v8": "^2.1.8",
|
|
36
|
+
"pg": "^8.13.1",
|
|
37
|
+
"typescript": "^5.0.0",
|
|
38
|
+
"vitest": "^2.1.8"
|
|
39
|
+
},
|
|
40
|
+
"peerDependencies": {
|
|
41
|
+
"pg": "^8.0.0"
|
|
42
|
+
},
|
|
43
|
+
"peerDependenciesMeta": {
|
|
44
|
+
"pg": {
|
|
45
|
+
"optional": true
|
|
46
|
+
}
|
|
39
47
|
},
|
|
40
48
|
"engines": {
|
|
41
49
|
"node": ">=18"
|
|
50
|
+
},
|
|
51
|
+
"scripts": {
|
|
52
|
+
"build": "tsc",
|
|
53
|
+
"clean": "rm -rf dist",
|
|
54
|
+
"typecheck": "tsc --noEmit",
|
|
55
|
+
"test": "vitest run",
|
|
56
|
+
"test:watch": "vitest",
|
|
57
|
+
"test:coverage": "vitest run --coverage"
|
|
42
58
|
}
|
|
43
|
-
}
|
|
59
|
+
}
|