@thenewlabs/entangle-utils 2.0.0 → 2.0.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.
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
- package/dist/counters.test.d.ts +0 -2
- package/dist/counters.test.d.ts.map +0 -1
- package/dist/counters.test.js +0 -72
- package/dist/counters.test.js.map +0 -1
- package/dist/logger.d.ts +0 -3
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -49
- package/dist/logger.js.map +0 -1
- package/dist/validation.test.d.ts +0 -2
- package/dist/validation.test.d.ts.map +0 -1
- package/dist/validation.test.js +0 -121
- package/dist/validation.test.js.map +0 -1
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thenewlabs/entangle-utils",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -16,11 +16,11 @@
|
|
|
16
16
|
},
|
|
17
17
|
"scripts": {
|
|
18
18
|
"build": "tsc",
|
|
19
|
-
"clean": "rm -rf dist",
|
|
19
|
+
"clean": "rm -rf dist tsconfig.tsbuildinfo",
|
|
20
20
|
"prepublishOnly": "npm run build"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@thenewlabs/entangle-protocol": "^2.0.
|
|
23
|
+
"@thenewlabs/entangle-protocol": "^2.0.1",
|
|
24
24
|
"dotenv": "^17.4.2",
|
|
25
25
|
"pino": "^10.3.1"
|
|
26
26
|
},
|
package/dist/counters.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"counters.test.d.ts","sourceRoot":"","sources":["../src/counters.test.ts"],"names":[],"mappings":""}
|
package/dist/counters.test.js
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { MonotonicCounter, BidirectionalCounters } from './counters.js';
|
|
3
|
-
describe('Counters', () => {
|
|
4
|
-
describe('MonotonicCounter', () => {
|
|
5
|
-
it('should start at -1', () => {
|
|
6
|
-
const counter = new MonotonicCounter();
|
|
7
|
-
expect(counter.current()).toBe(-1);
|
|
8
|
-
});
|
|
9
|
-
it('should increment with next()', () => {
|
|
10
|
-
const counter = new MonotonicCounter();
|
|
11
|
-
expect(counter.next()).toBe(0);
|
|
12
|
-
expect(counter.next()).toBe(1);
|
|
13
|
-
expect(counter.next()).toBe(2);
|
|
14
|
-
expect(counter.current()).toBe(2);
|
|
15
|
-
});
|
|
16
|
-
it('should validate strictly increasing values', () => {
|
|
17
|
-
const counter = new MonotonicCounter();
|
|
18
|
-
expect(() => counter.validate(0)).not.toThrow();
|
|
19
|
-
expect(() => counter.validate(1)).not.toThrow();
|
|
20
|
-
expect(() => counter.validate(2)).not.toThrow();
|
|
21
|
-
});
|
|
22
|
-
it('should reject non-increasing values', () => {
|
|
23
|
-
const counter = new MonotonicCounter();
|
|
24
|
-
counter.validate(5);
|
|
25
|
-
expect(() => counter.validate(5))
|
|
26
|
-
.toThrow('Counter not strictly increasing: 5 <= 5');
|
|
27
|
-
expect(() => counter.validate(4))
|
|
28
|
-
.toThrow('Counter not strictly increasing: 4 <= 5');
|
|
29
|
-
});
|
|
30
|
-
it('should reject zero after positive value', () => {
|
|
31
|
-
const counter = new MonotonicCounter();
|
|
32
|
-
counter.validate(10);
|
|
33
|
-
expect(() => counter.validate(0))
|
|
34
|
-
.toThrow('Counter not strictly increasing: 0 <= 10');
|
|
35
|
-
});
|
|
36
|
-
it('should handle large values', () => {
|
|
37
|
-
const counter = new MonotonicCounter();
|
|
38
|
-
counter.validate(1000000);
|
|
39
|
-
expect(() => counter.validate(1000001)).not.toThrow();
|
|
40
|
-
expect(counter.current()).toBe(1000001);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
describe('BidirectionalCounters', () => {
|
|
44
|
-
it('should maintain separate incoming and outgoing counters', () => {
|
|
45
|
-
const counters = new BidirectionalCounters();
|
|
46
|
-
expect(counters.incoming.current()).toBe(-1);
|
|
47
|
-
expect(counters.outgoing.current()).toBe(-1);
|
|
48
|
-
});
|
|
49
|
-
it('should increment counters independently', () => {
|
|
50
|
-
const counters = new BidirectionalCounters();
|
|
51
|
-
expect(counters.incoming.next()).toBe(0);
|
|
52
|
-
expect(counters.incoming.next()).toBe(1);
|
|
53
|
-
expect(counters.outgoing.next()).toBe(0);
|
|
54
|
-
expect(counters.outgoing.next()).toBe(1);
|
|
55
|
-
expect(counters.outgoing.next()).toBe(2);
|
|
56
|
-
expect(counters.incoming.current()).toBe(1);
|
|
57
|
-
expect(counters.outgoing.current()).toBe(2);
|
|
58
|
-
});
|
|
59
|
-
it('should validate counters independently', () => {
|
|
60
|
-
const counters = new BidirectionalCounters();
|
|
61
|
-
counters.incoming.validate(5);
|
|
62
|
-
counters.outgoing.validate(10);
|
|
63
|
-
expect(() => counters.incoming.validate(6)).not.toThrow();
|
|
64
|
-
expect(() => counters.outgoing.validate(11)).not.toThrow();
|
|
65
|
-
expect(() => counters.incoming.validate(5))
|
|
66
|
-
.toThrow('Counter not strictly increasing: 5 <= 6');
|
|
67
|
-
expect(() => counters.outgoing.validate(10))
|
|
68
|
-
.toThrow('Counter not strictly increasing: 10 <= 11');
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
//# sourceMappingURL=counters.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"counters.test.js","sourceRoot":"","sources":["../src/counters.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAExE,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;YAC5B,MAAM,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACvC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAEvC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAEvC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAChD,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAChD,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAEvC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAEpB,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;iBAC9B,OAAO,CAAC,yCAAyC,CAAC,CAAC;YAEtD,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;iBAC9B,OAAO,CAAC,yCAAyC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAEvC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAErB,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;iBAC9B,OAAO,CAAC,0CAA0C,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAEvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC1B,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACtD,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,QAAQ,GAAG,IAAI,qBAAqB,EAAE,CAAC;YAE7C,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,QAAQ,GAAG,IAAI,qBAAqB,EAAE,CAAC;YAE7C,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEzC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEzC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,QAAQ,GAAG,IAAI,qBAAqB,EAAE,CAAC;YAE7C,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC9B,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAE/B,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAC1D,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAE3D,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;iBACxC,OAAO,CAAC,yCAAyC,CAAC,CAAC;YAEtD,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;iBACzC,OAAO,CAAC,2CAA2C,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/logger.d.ts
DELETED
package/dist/logger.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAQxB,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAmD3E"}
|
package/dist/logger.js
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import pino from 'pino';
|
|
2
|
-
import { Writable } from 'stream';
|
|
3
|
-
import { OutputHandler, parseOutputMode } from './output.js';
|
|
4
|
-
export function createLogger(name, outputMode) {
|
|
5
|
-
const level = process.env.LOG_LEVEL || 'info';
|
|
6
|
-
const mode = parseOutputMode(outputMode || process.env.OUTPUT_MODE);
|
|
7
|
-
const outputHandler = new OutputHandler({ mode });
|
|
8
|
-
// Create a custom writable stream that routes Pino logs through OutputHandler
|
|
9
|
-
const destination = new Writable({
|
|
10
|
-
write(chunk, _encoding, callback) {
|
|
11
|
-
try {
|
|
12
|
-
const str = typeof chunk === 'string' ? chunk : chunk.toString();
|
|
13
|
-
const obj = JSON.parse(str);
|
|
14
|
-
const { level: lvl, msg, ...data } = obj;
|
|
15
|
-
// Convert pino numeric level to name; if already a string, keep it
|
|
16
|
-
const levelName = typeof lvl === 'number'
|
|
17
|
-
? (pino.levels.labels[lvl] || 'info')
|
|
18
|
-
: (typeof lvl === 'string' ? lvl : 'info');
|
|
19
|
-
// Remove boilerplate fields
|
|
20
|
-
if (data.name === name)
|
|
21
|
-
delete data.name;
|
|
22
|
-
delete data.time;
|
|
23
|
-
delete data.pid;
|
|
24
|
-
delete data.hostname;
|
|
25
|
-
const hasData = Object.keys(data).length > 0;
|
|
26
|
-
outputHandler.log(levelName, msg, hasData ? data : undefined);
|
|
27
|
-
}
|
|
28
|
-
catch (_err) {
|
|
29
|
-
// Fallback for non-JSON chunk
|
|
30
|
-
const str = typeof chunk === 'string' ? chunk : chunk.toString();
|
|
31
|
-
outputHandler.write(str);
|
|
32
|
-
}
|
|
33
|
-
finally {
|
|
34
|
-
callback();
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
const logger = pino({
|
|
39
|
-
name,
|
|
40
|
-
level,
|
|
41
|
-
formatters: {
|
|
42
|
-
level: (label) => ({ level: label }),
|
|
43
|
-
},
|
|
44
|
-
}, destination);
|
|
45
|
-
// Attach outputHandler for direct access if needed
|
|
46
|
-
logger.outputHandler = outputHandler;
|
|
47
|
-
return logger;
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=logger.js.map
|
package/dist/logger.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAM7D,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,UAAmB;IAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC;IAC9C,MAAM,IAAI,GAAG,eAAe,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACpE,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,8EAA8E;IAC9E,MAAM,WAAW,GAAG,IAAI,QAAQ,CAAC;QAC/B,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ;YAC9B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACjE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5B,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,GAAU,CAAC;gBAEhD,mEAAmE;gBACnE,MAAM,SAAS,GAAG,OAAO,GAAG,KAAK,QAAQ;oBACvC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAsC,CAAC,IAAI,MAAM,CAAC;oBACxE,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAEzD,4BAA4B;gBAC5B,IAAK,IAAY,CAAC,IAAI,KAAK,IAAI;oBAAE,OAAQ,IAAY,CAAC,IAAI,CAAC;gBAC3D,OAAQ,IAAY,CAAC,IAAI,CAAC;gBAC1B,OAAQ,IAAY,CAAC,GAAG,CAAC;gBACzB,OAAQ,IAAY,CAAC,QAAQ,CAAC;gBAE9B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC7C,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAChE,CAAC;YAAC,OAAO,IAAI,EAAE,CAAC;gBACd,8BAA8B;gBAC9B,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACjE,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;oBAAS,CAAC;gBACT,QAAQ,EAAE,CAAC;YACb,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,CACjB;QACE,IAAI;QACJ,KAAK;QACL,UAAU,EAAE;YACV,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;SAC7C;KACF,EACD,WAAgD,CAC7B,CAAC;IAEtB,mDAAmD;IACnD,MAAM,CAAC,aAAa,GAAG,aAAa,CAAC;IAErC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.test.d.ts","sourceRoot":"","sources":["../src/validation.test.ts"],"names":[],"mappings":""}
|
package/dist/validation.test.js
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { validateArguments, validateCwd, validateLimits } from './validation.js';
|
|
3
|
-
describe('Validation Utils', () => {
|
|
4
|
-
describe('validateArguments', () => {
|
|
5
|
-
it('should accept valid arguments', () => {
|
|
6
|
-
const argv = ['--help', 'test', 'file.txt'];
|
|
7
|
-
expect(() => validateArguments(argv, 10, 100)).not.toThrow();
|
|
8
|
-
});
|
|
9
|
-
it('should reject too many arguments', () => {
|
|
10
|
-
const argv = new Array(10).fill('arg');
|
|
11
|
-
expect(() => validateArguments(argv, 5, 100))
|
|
12
|
-
.toThrow('Too many arguments: 10 > 5');
|
|
13
|
-
});
|
|
14
|
-
it('should reject arguments that are too long', () => {
|
|
15
|
-
const argv = ['x'.repeat(101)];
|
|
16
|
-
expect(() => validateArguments(argv, 10, 100))
|
|
17
|
-
.toThrow('Argument too long: 101 > 100');
|
|
18
|
-
});
|
|
19
|
-
it('should reject arguments with NUL bytes', () => {
|
|
20
|
-
const argv = ['test\0arg'];
|
|
21
|
-
expect(() => validateArguments(argv, 10, 100))
|
|
22
|
-
.toThrow('Arguments cannot contain NUL bytes');
|
|
23
|
-
});
|
|
24
|
-
it('should reject arguments with unpaired surrogates', () => {
|
|
25
|
-
const argv = ['test\uD800'];
|
|
26
|
-
expect(() => validateArguments(argv, 10, 100))
|
|
27
|
-
.toThrow('Arguments cannot contain unpaired surrogates');
|
|
28
|
-
});
|
|
29
|
-
it('should accept empty arguments array', () => {
|
|
30
|
-
expect(() => validateArguments([], 10, 100)).not.toThrow();
|
|
31
|
-
});
|
|
32
|
-
it('should accept arguments with paired surrogates', () => {
|
|
33
|
-
const argv = ['test\uD800\uDC00']; // Valid surrogate pair
|
|
34
|
-
expect(() => validateArguments(argv, 10, 100)).not.toThrow();
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
describe('validateCwd', () => {
|
|
38
|
-
it('should accept any cwd when no prefixes specified', () => {
|
|
39
|
-
expect(() => validateCwd('/any/path')).not.toThrow();
|
|
40
|
-
expect(() => validateCwd('/etc/passwd')).not.toThrow();
|
|
41
|
-
});
|
|
42
|
-
it('should accept cwd with empty prefixes array', () => {
|
|
43
|
-
expect(() => validateCwd('/any/path', [])).not.toThrow();
|
|
44
|
-
});
|
|
45
|
-
it('should accept cwd matching allowed prefix', () => {
|
|
46
|
-
const prefixes = ['/home', '/srv'];
|
|
47
|
-
expect(() => validateCwd('/home/user/project', prefixes)).not.toThrow();
|
|
48
|
-
expect(() => validateCwd('/srv/app', prefixes)).not.toThrow();
|
|
49
|
-
});
|
|
50
|
-
it('should reject cwd not matching any prefix', () => {
|
|
51
|
-
const prefixes = ['/home', '/srv'];
|
|
52
|
-
expect(() => validateCwd('/etc/passwd', prefixes))
|
|
53
|
-
.toThrow('CWD not in allowed directories: /etc/passwd');
|
|
54
|
-
});
|
|
55
|
-
it('should normalize Windows paths', () => {
|
|
56
|
-
const prefixes = ['/home'];
|
|
57
|
-
expect(() => validateCwd('\\home\\user', prefixes)).not.toThrow();
|
|
58
|
-
});
|
|
59
|
-
it('should handle trailing slashes', () => {
|
|
60
|
-
const prefixes = ['/home/'];
|
|
61
|
-
expect(() => validateCwd('/home/user', prefixes)).not.toThrow();
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
describe('validateLimits', () => {
|
|
65
|
-
it('should accept undefined limits', () => {
|
|
66
|
-
expect(() => validateLimits()).not.toThrow();
|
|
67
|
-
});
|
|
68
|
-
it('should accept valid limits', () => {
|
|
69
|
-
const limits = {
|
|
70
|
-
cpuMs: 1000,
|
|
71
|
-
memMB: 256,
|
|
72
|
-
wallMs: 5000,
|
|
73
|
-
maxOutBytes: 1024,
|
|
74
|
-
};
|
|
75
|
-
expect(() => validateLimits(limits)).not.toThrow();
|
|
76
|
-
});
|
|
77
|
-
it('should reject zero CPU limit', () => {
|
|
78
|
-
expect(() => validateLimits({ cpuMs: 0 }))
|
|
79
|
-
.toThrow('Invalid CPU limit: 0');
|
|
80
|
-
});
|
|
81
|
-
it('should reject negative CPU limit', () => {
|
|
82
|
-
expect(() => validateLimits({ cpuMs: -1 }))
|
|
83
|
-
.toThrow('Invalid CPU limit: -1');
|
|
84
|
-
});
|
|
85
|
-
it('should reject CPU limit exceeding max', () => {
|
|
86
|
-
expect(() => validateLimits({ cpuMs: 100000 }))
|
|
87
|
-
.toThrow('Invalid CPU limit: 100000');
|
|
88
|
-
});
|
|
89
|
-
it('should reject zero memory limit', () => {
|
|
90
|
-
expect(() => validateLimits({ memMB: 0 }))
|
|
91
|
-
.toThrow('Invalid memory limit: 0');
|
|
92
|
-
});
|
|
93
|
-
it('should reject memory limit exceeding max', () => {
|
|
94
|
-
expect(() => validateLimits({ memMB: 1024 }))
|
|
95
|
-
.toThrow('Invalid memory limit: 1024');
|
|
96
|
-
});
|
|
97
|
-
it('should reject zero wall time limit', () => {
|
|
98
|
-
expect(() => validateLimits({ wallMs: 0 }))
|
|
99
|
-
.toThrow('Invalid wall time limit: 0');
|
|
100
|
-
});
|
|
101
|
-
it('should reject wall time limit exceeding max', () => {
|
|
102
|
-
expect(() => validateLimits({ wallMs: 400000 }))
|
|
103
|
-
.toThrow('Invalid wall time limit: 400000');
|
|
104
|
-
});
|
|
105
|
-
it('should reject zero output limit', () => {
|
|
106
|
-
expect(() => validateLimits({ maxOutBytes: 0 }))
|
|
107
|
-
.toThrow('Invalid output limit: 0');
|
|
108
|
-
});
|
|
109
|
-
it('should reject output limit exceeding max', () => {
|
|
110
|
-
expect(() => validateLimits({ maxOutBytes: 20000000 }))
|
|
111
|
-
.toThrow('Invalid output limit: 20000000');
|
|
112
|
-
});
|
|
113
|
-
it('should accept partial limits', () => {
|
|
114
|
-
expect(() => validateLimits({ cpuMs: 1000 })).not.toThrow();
|
|
115
|
-
expect(() => validateLimits({ memMB: 256 })).not.toThrow();
|
|
116
|
-
expect(() => validateLimits({ wallMs: 5000 })).not.toThrow();
|
|
117
|
-
expect(() => validateLimits({ maxOutBytes: 1024 })).not.toThrow();
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
//# sourceMappingURL=validation.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../src/validation.test.ts"],"names":[],"mappings":"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"}
|