@vpmedia/simplify 1.70.0 โ 1.72.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.
- package/CHANGELOG.md +56 -0
- package/package.json +10 -16
- package/src/logging/util.js +0 -2
- package/src/pagelifecycle/util.js +0 -3
- package/src/util/event_emitter.js +0 -2
- package/src/util/fetch.js +0 -2
- package/src/util/query.js +1 -1
- package/src/util/uuid.js +29 -13
- package/src/util/validate.js +0 -2
- package/types/logging/util.d.ts.map +1 -1
- package/types/pagelifecycle/util.d.ts.map +1 -1
- package/types/util/event_emitter.d.ts.map +1 -1
- package/types/util/fetch.d.ts.map +1 -1
- package/types/util/uuid.d.ts +2 -2
- package/types/util/uuid.d.ts.map +1 -1
- package/types/util/validate.d.ts.map +1 -1
- package/src/const/http_status.test.js +0 -7
- package/src/logging/Logger.test.js +0 -73
- package/src/logging/util.test.js +0 -33
- package/src/pagelifecycle/util.test.js +0 -102
- package/src/typecheck/TypeChecker.test.js +0 -70
- package/src/typecheck/util.test.js +0 -35
- package/src/util/async.test.js +0 -31
- package/src/util/error.test.js +0 -34
- package/src/util/event_emitter.test.js +0 -231
- package/src/util/fetch.test.js +0 -62
- package/src/util/number.test.js +0 -126
- package/src/util/object.test.js +0 -205
- package/src/util/query.test.js +0 -73
- package/src/util/state.test.js +0 -47
- package/src/util/string.test.js +0 -66
- package/src/util/uuid.test.js +0 -39
- package/src/util/validate.test.js +0 -311
- package/tests/mocks/handlers/fetch.js +0 -34
- package/tests/mocks/handlers.js +0 -3
- package/tsconfig.build.json +0 -24
- package/vitest.setup.js +0 -17
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,59 @@
|
|
|
1
|
+
## [1.72.0] - 2026-02-28
|
|
2
|
+
|
|
3
|
+
### ๐ Bug Fixes
|
|
4
|
+
|
|
5
|
+
- Fix runtime error with nodejs usage due to missing globalThis.location
|
|
6
|
+
|
|
7
|
+
### ๐ผ Other
|
|
8
|
+
|
|
9
|
+
- *(deps)* Bump dependency versions
|
|
10
|
+
- *(deps)* Bump dependency versions
|
|
11
|
+
- *(deps)* Bump dependency versions
|
|
12
|
+
- *(deps)* Bump dependency versions
|
|
13
|
+
- *(deps)* Bump dependency versions
|
|
14
|
+
- *(deps)* Bump dependency versions
|
|
15
|
+
- *(deps)* Bump dependency versions
|
|
16
|
+
- *(deps)* Bump dependency versions
|
|
17
|
+
- *(deps)* Bump dependency versions
|
|
18
|
+
- *(deps)* Bump dependency versions
|
|
19
|
+
- *(deps)* Bump dependency versions
|
|
20
|
+
- *(deps)* Bump dependency versions
|
|
21
|
+
- *(deps)* Bump dependency versions
|
|
22
|
+
- *(deps)* Bump dependency versions
|
|
23
|
+
- *(deps)* Bump dependency versions
|
|
24
|
+
- *(deps)* Bump dependency versions
|
|
25
|
+
- *(deps)* Bump dependency versions
|
|
26
|
+
- *(deps)* Update cli scripts
|
|
27
|
+
- *(deps)* Bump dependency versions
|
|
28
|
+
- *(deps)* Bump dependency versions
|
|
29
|
+
- *(deps)* Bump dependency versions
|
|
30
|
+
- *(deps)* Bump dependency versions
|
|
31
|
+
- Improve npmignore
|
|
32
|
+
- *(deps)* Bump dependency versions
|
|
33
|
+
|
|
34
|
+
### โ๏ธ Miscellaneous Tasks
|
|
35
|
+
|
|
36
|
+
- Release
|
|
37
|
+
- Use oxlint only
|
|
38
|
+
- Use oxlint only
|
|
39
|
+
- Only audit production package
|
|
40
|
+
- *(release)* V1.72.0
|
|
41
|
+
## [1.71.0] - 2026-02-05
|
|
42
|
+
|
|
43
|
+
### ๐ Refactor
|
|
44
|
+
|
|
45
|
+
- Improve uuidv4 generator
|
|
46
|
+
|
|
47
|
+
### ๐งช Testing
|
|
48
|
+
|
|
49
|
+
- Adjusted uuid test
|
|
50
|
+
- Improve uuid tests
|
|
51
|
+
|
|
52
|
+
### โ๏ธ Miscellaneous Tasks
|
|
53
|
+
|
|
54
|
+
- Release
|
|
55
|
+
- Regenerate types and source maps
|
|
56
|
+
- *(release)* V1.71.0
|
|
1
57
|
## [1.70.0] - 2026-02-04
|
|
2
58
|
|
|
3
59
|
### ๐ Features
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vpmedia/simplify",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.72.0",
|
|
4
4
|
"description": "@vpmedia/simplify",
|
|
5
5
|
"author": "Andras Csizmadia <andras@vpmedia.hu> (www.vpmedia.hu)",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,33 +19,27 @@
|
|
|
19
19
|
"types": "./types/index.d.ts",
|
|
20
20
|
"type": "module",
|
|
21
21
|
"optionalDependencies": {
|
|
22
|
-
"@sentry/browser": "^10.
|
|
22
|
+
"@sentry/browser": "^10.40.0"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"@commitlint/cli": "^20.4.
|
|
26
|
-
"@commitlint/config-conventional": "^20.4.
|
|
27
|
-
"@
|
|
28
|
-
"@types/node": "^25.2.0",
|
|
25
|
+
"@commitlint/cli": "^20.4.2",
|
|
26
|
+
"@commitlint/config-conventional": "^20.4.2",
|
|
27
|
+
"@types/node": "^25.3.2",
|
|
29
28
|
"@vitest/coverage-v8": "^4.0.18",
|
|
30
|
-
"eslint": "^9.39.2",
|
|
31
|
-
"eslint-plugin-jsdoc": "^62.5.1",
|
|
32
|
-
"eslint-plugin-oxlint": "^1.43.0",
|
|
33
|
-
"eslint-plugin-unicorn": "^62.0.0",
|
|
34
29
|
"globals": "^17.3.0",
|
|
35
|
-
"jsdom": "^28.
|
|
36
|
-
"msw": "^2.12.
|
|
37
|
-
"oxlint": "^1.
|
|
38
|
-
"oxlint-tsgolint": "^0.
|
|
30
|
+
"jsdom": "^28.1.0",
|
|
31
|
+
"msw": "^2.12.10",
|
|
32
|
+
"oxlint": "^1.50.0",
|
|
33
|
+
"oxlint-tsgolint": "^0.15.0",
|
|
39
34
|
"prettier": "^3.8.1",
|
|
40
35
|
"typescript": "^5.9.3",
|
|
41
|
-
"typescript-eslint": "^8.54.0",
|
|
42
36
|
"vitest": "^4.0.18"
|
|
43
37
|
},
|
|
44
38
|
"scripts": {
|
|
45
39
|
"build": "rm -rf types && tsc -p ./tsconfig.build.json",
|
|
46
40
|
"check": "pnpm build && pnpm lint && pnpm test && pnpm typecheck",
|
|
47
41
|
"format": "prettier --write \"./**/*.{js,jsx,mjs,cjs,ts,tsx,json,css}\"",
|
|
48
|
-
"lint": "oxlint src
|
|
42
|
+
"lint": "oxlint src",
|
|
49
43
|
"test": "vitest --coverage",
|
|
50
44
|
"typecheck": "tsc"
|
|
51
45
|
}
|
package/src/logging/util.js
CHANGED
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
* Internal listener wrapper that stores metadata
|
|
10
10
|
* about a registered event listener.
|
|
11
11
|
*/
|
|
12
|
-
// oxlint-disable-next-line no-extraneous-class
|
|
13
12
|
class Listener {
|
|
14
13
|
/**
|
|
15
14
|
* @param {EventListener} fn - The listener callback function.
|
|
@@ -85,7 +84,6 @@ export class EventEmitter {
|
|
|
85
84
|
}
|
|
86
85
|
|
|
87
86
|
// Clone to prevent mutation during iteration
|
|
88
|
-
// eslint-disable-next-line unicorn/no-useless-spread
|
|
89
87
|
for (const listener of [...listeners]) {
|
|
90
88
|
listener.fn.apply(listener.context, args);
|
|
91
89
|
if (listener.once) {
|
package/src/util/fetch.js
CHANGED
package/src/util/query.js
CHANGED
package/src/util/uuid.js
CHANGED
|
@@ -1,19 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Convert a byte (0โ255) to a 2โcharacter hex string.
|
|
3
|
+
* @param {number} byte - Byte value.
|
|
4
|
+
* @returns {string} Hex value.
|
|
5
|
+
*/
|
|
6
|
+
export const byteToHex = (byte) => (byte >>> 4).toString(16) + (byte & 0b1111).toString(16);
|
|
4
7
|
|
|
8
|
+
/**
|
|
9
|
+
* UUIDv4 fallback generator (RFC 4122 compliant).
|
|
10
|
+
* @returns {string} UUIDv4 string.
|
|
11
|
+
*/
|
|
5
12
|
export const randomUUIDFallback = () => {
|
|
6
|
-
const
|
|
13
|
+
const bytes = crypto.getRandomValues
|
|
7
14
|
? crypto.getRandomValues(new Uint8Array(16))
|
|
8
15
|
: Array.from({ length: 16 }, () => Math.floor(Math.random() * 256));
|
|
9
|
-
r[6] = (r[6] & 0x0f) | 0x40;
|
|
10
|
-
r[8] = (r[8] & 0x3f) | 0x80;
|
|
11
|
-
return [...r].reduce((uuid, b, i) => uuid + hex(i === 4 || i === 6 || i === 8 || i === 10 ? '-' : '', b), '');
|
|
12
|
-
};
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
// RFC 4122 version & variant bits
|
|
18
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
|
19
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
20
|
+
|
|
21
|
+
let uuid = '';
|
|
22
|
+
for (const [index, byte] of bytes.entries()) {
|
|
23
|
+
if (index === 4 || index === 6 || index === 8 || index === 10) {
|
|
24
|
+
uuid += '-';
|
|
25
|
+
}
|
|
26
|
+
uuid += byteToHex(byte);
|
|
27
|
+
}
|
|
28
|
+
return uuid;
|
|
29
|
+
};
|
|
18
30
|
|
|
19
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Crypto UUIDv4 wrapper with fallback.
|
|
33
|
+
* @returns {string} UUIDv4 string.
|
|
34
|
+
*/
|
|
35
|
+
export const uuidv4 = () => (typeof crypto.randomUUID === 'function' ? crypto.randomUUID() : randomUUIDFallback());
|
package/src/util/validate.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/logging/util.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/logging/util.js"],"names":[],"mappings":"AAUO,yCANI,OAAO,aAAa,EAAE,MAAM,aAC5B,MAAM,SACN,MAAM,WACN,MAAM,GACJ,MAAM,CAE8F;AAO1G,uCAHI,MAAM,GACJ,MAAM,CAE6C;AAMzD,qCAFM,MAAM,CAmBlB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/pagelifecycle/util.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/pagelifecycle/util.js"],"names":[],"mappings":"AAgGO,0CAyBN;AAMM,yCAFM,MAAM,GAAG,IAAI,GAAG,SAAS,CAE8B;AAM7D,oCAFM,OAAO,cAAc,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,CAEV;AAMnD,gDAFM,YAAY,CAOxB;AAMM,8CAFM,OAAO,CAEyC;AAOtD,gDAHI,OAAO,cAAc,EAAE,aAAa,GAAG,OAAO,cAAc,EAAE,kBAAkB,YAChF,MAAM,IAAI,QAMpB;6BA3J4B,0BAA0B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event_emitter.d.ts","sourceRoot":"","sources":["../../src/util/event_emitter.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"event_emitter.d.ts","sourceRoot":"","sources":["../../src/util/event_emitter.js"],"names":[],"mappings":"AA6BA;;;GAGG;AACH;IAWE;;;OAGG;IACH,cAFa,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAI/B;IAED;;;;OAIG;IACH,iBAHW,MAAM,GAAG,MAAM,GACb,aAAa,EAAE,CAK3B;IAED;;;;OAIG;IACH,qBAHW,MAAM,GAAG,MAAM,GACb,MAAM,CAKlB;IAED;;;;;;OAMG;IACH,YAJW,MAAM,GAAG,MAAM,WACZ,GAAG,EAAA,GACJ,OAAO,CAiBnB;IA2BD;;;;;;OAMG;IACH,UALW,MAAM,GAAG,MAAM,MACf,aAAa,YACb,GAAG,GACD,YAAY,CAIxB;IAED;;;;;;;OAOG;IACH,YALW,MAAM,GAAG,MAAM,MACf,aAAa,YACb,GAAG,GACD,YAAY,CAIxB;IAED;;;;;;OAMG;IACH,WALW,MAAM,GAAG,MAAM,OACf,aAAa,YACb,GAAG,GACD,YAAY,CA6BxB;IAED;;;;;OAKG;IACH,2BAHW,MAAM,GAAG,MAAM,GACb,YAAY,CAUxB;;CACF;;;;sCAhMa,GAAG,EAAA,KACJ,IAAI"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/util/fetch.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/util/fetch.js"],"names":[],"mappings":"AAYA,yBAA0B,CAAC,CAAC;AAE5B;IACE;;;;;;OAMG;IACH,qBALW,MAAM,YACN,MAAM,GAAG,GAAG,GAAG,OAAO,gBACtB,WAAW,YACX,QAAQ,EASlB;IAJC,iCAAwB;IACxB,0BAAgC;IAChC,mBAAwB;IACxB,cAAqC;CAExC;AASM,qCALI,MAAM,GAAG,GAAG,GAAG,OAAO,gBACtB,WAAW,iBACX;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAC,GAC9E,OAAO,CAAC,QAAQ,CAAC,CAmD7B"}
|
package/types/util/uuid.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export function
|
|
1
|
+
export function byteToHex(byte: number): string;
|
|
2
2
|
export function randomUUIDFallback(): string;
|
|
3
|
-
export function uuidv4():
|
|
3
|
+
export function uuidv4(): string;
|
|
4
4
|
//# sourceMappingURL=uuid.d.ts.map
|
package/types/util/uuid.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../../src/util/uuid.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../../src/util/uuid.js"],"names":[],"mappings":"AAKO,gCAHI,MAAM,GACJ,MAAM,CAEwE;AAMpF,sCAFM,MAAM,CAmBlB;AAMM,0BAFM,MAAM,CAE+F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/util/validate.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/util/validate.js"],"names":[],"mappings":"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"}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { AbstractLogHandler } from './AbstractLogHandler.js';
|
|
2
|
-
import { LOG_LEVEL_DEBUG, LOG_LEVEL_ERROR, LOG_LEVEL_FATAL, LOG_LEVEL_INFO, LOG_LEVEL_WARNING } from './const.js';
|
|
3
|
-
import { Logger } from './Logger.js';
|
|
4
|
-
|
|
5
|
-
class TestLogHandler extends AbstractLogHandler {
|
|
6
|
-
/**
|
|
7
|
-
* Test log handler.
|
|
8
|
-
*/
|
|
9
|
-
constructor() {
|
|
10
|
-
super(LOG_LEVEL_DEBUG);
|
|
11
|
-
this.emitLogLogger = null;
|
|
12
|
-
this.emitLogTimestamp = null;
|
|
13
|
-
this.emitLogLevel = null;
|
|
14
|
-
this.emitLogMessage = null;
|
|
15
|
-
this.emitLogExtra = null;
|
|
16
|
-
this.emitLogError = null;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Emit log record.
|
|
21
|
-
* @param {import('./Logger.js').Logger} logger - Logger instance.
|
|
22
|
-
* @param {number} timestamp - Log timestamp.
|
|
23
|
-
* @param {number} level - Log level.
|
|
24
|
-
* @param {string} message - Log message.
|
|
25
|
-
* @param {object} extra - Log extra data.
|
|
26
|
-
* @param {Error} error - Log error.
|
|
27
|
-
*/
|
|
28
|
-
emit(logger, timestamp, level, message, extra, error) {
|
|
29
|
-
this.emitLogLogger = logger;
|
|
30
|
-
this.emitLogTimestamp = timestamp;
|
|
31
|
-
this.emitLogLevel = level;
|
|
32
|
-
this.emitLogMessage = message;
|
|
33
|
-
this.emitLogExtra = extra;
|
|
34
|
-
this.emitLogError = error;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
test('Tests Logger default level', () => {
|
|
39
|
-
const logger = new Logger('test');
|
|
40
|
-
expect(logger.level).toBe(LOG_LEVEL_DEBUG);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
test('Tests Logger custom handler', () => {
|
|
44
|
-
const logger = new Logger('test');
|
|
45
|
-
const testLogHandler = new TestLogHandler();
|
|
46
|
-
Logger.addHandler(testLogHandler);
|
|
47
|
-
// debug
|
|
48
|
-
logger.debug('debug');
|
|
49
|
-
expect(testLogHandler.emitLogLevel).toBe(LOG_LEVEL_DEBUG);
|
|
50
|
-
expect(testLogHandler.emitLogMessage).toBe('debug');
|
|
51
|
-
// info
|
|
52
|
-
logger.info('info');
|
|
53
|
-
expect(testLogHandler.emitLogLevel).toBe(LOG_LEVEL_INFO);
|
|
54
|
-
expect(testLogHandler.emitLogMessage).toBe('info');
|
|
55
|
-
// warning
|
|
56
|
-
logger.warn('warning');
|
|
57
|
-
expect(testLogHandler.emitLogLevel).toBe(LOG_LEVEL_WARNING);
|
|
58
|
-
expect(testLogHandler.emitLogMessage).toBe('warning');
|
|
59
|
-
logger.warning('warning');
|
|
60
|
-
expect(testLogHandler.emitLogLevel).toBe(LOG_LEVEL_WARNING);
|
|
61
|
-
expect(testLogHandler.emitLogMessage).toBe('warning');
|
|
62
|
-
// error
|
|
63
|
-
logger.error('error');
|
|
64
|
-
expect(testLogHandler.emitLogLevel).toBe(LOG_LEVEL_ERROR);
|
|
65
|
-
expect(testLogHandler.emitLogMessage).toBe('error');
|
|
66
|
-
// exception
|
|
67
|
-
logger.exception('test', new Error('test_error'), { context: 'ctx' });
|
|
68
|
-
expect(testLogHandler.emitLogLevel).toBe(LOG_LEVEL_FATAL);
|
|
69
|
-
expect(testLogHandler.emitLogMessage).toBe('test');
|
|
70
|
-
expect(testLogHandler.emitLogError.message).toBe('test_error');
|
|
71
|
-
expect(testLogHandler.emitLogLogger).toBe(logger);
|
|
72
|
-
expect(testLogHandler.emitLogExtra.context).toBe('ctx');
|
|
73
|
-
});
|
package/src/logging/util.test.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
LOG_LEVEL_DEBUG,
|
|
3
|
-
LOG_LEVEL_ERROR,
|
|
4
|
-
LOG_LEVEL_FATAL,
|
|
5
|
-
LOG_LEVEL_INFO,
|
|
6
|
-
LOG_LEVEL_NAME_DEBUG,
|
|
7
|
-
LOG_LEVEL_NAME_ERROR,
|
|
8
|
-
LOG_LEVEL_NAME_FATAL,
|
|
9
|
-
LOG_LEVEL_NAME_INFO,
|
|
10
|
-
LOG_LEVEL_NAME_SILENT,
|
|
11
|
-
LOG_LEVEL_NAME_WARNING,
|
|
12
|
-
LOG_LEVEL_SILENT,
|
|
13
|
-
LOG_LEVEL_WARNING,
|
|
14
|
-
} from './const.js';
|
|
15
|
-
import { Logger } from './Logger.js';
|
|
16
|
-
import { formatLogMessage, getLogLevelName } from './util.js';
|
|
17
|
-
|
|
18
|
-
test('formatLogMessage()', () => {
|
|
19
|
-
expect(
|
|
20
|
-
formatLogMessage(new Logger('loggerName'), Date.now(), LOG_LEVEL_INFO, 'logMessage').endsWith(
|
|
21
|
-
'[loggerName] logMessage'
|
|
22
|
-
)
|
|
23
|
-
).toBe(true);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
test('getLogLevelName()', () => {
|
|
27
|
-
expect(getLogLevelName(LOG_LEVEL_DEBUG)).toBe(LOG_LEVEL_NAME_DEBUG);
|
|
28
|
-
expect(getLogLevelName(LOG_LEVEL_INFO)).toBe(LOG_LEVEL_NAME_INFO);
|
|
29
|
-
expect(getLogLevelName(LOG_LEVEL_WARNING)).toBe(LOG_LEVEL_NAME_WARNING);
|
|
30
|
-
expect(getLogLevelName(LOG_LEVEL_ERROR)).toBe(LOG_LEVEL_NAME_ERROR);
|
|
31
|
-
expect(getLogLevelName(LOG_LEVEL_FATAL)).toBe(LOG_LEVEL_NAME_FATAL);
|
|
32
|
-
expect(getLogLevelName(LOG_LEVEL_SILENT)).toBe(LOG_LEVEL_NAME_SILENT);
|
|
33
|
-
});
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { beforeAll, describe, expect, it } from 'vitest';
|
|
2
|
-
import {
|
|
3
|
-
DOCUMENT_STATE_CHANGE_EVENT,
|
|
4
|
-
DOCUMENT_STATES,
|
|
5
|
-
PAGE_LIFECYCLE_STATE_CHANGE_EVENT,
|
|
6
|
-
PAGE_LIFECYCLE_STATE_HIDDEN,
|
|
7
|
-
PAGE_LIFECYCLE_STATES,
|
|
8
|
-
} from './const.js';
|
|
9
|
-
import {
|
|
10
|
-
addPageLifecycleCallback,
|
|
11
|
-
getDocumentState,
|
|
12
|
-
getPageLifecycleEventEmitter,
|
|
13
|
-
getPageLifecycleState,
|
|
14
|
-
initPageLifecycle,
|
|
15
|
-
isPageLifecycleInitialized,
|
|
16
|
-
} from './util.js';
|
|
17
|
-
import { delayPromise } from '../util/async.js';
|
|
18
|
-
|
|
19
|
-
describe('Page Lifecycle', () => {
|
|
20
|
-
beforeAll(() => {
|
|
21
|
-
initPageLifecycle();
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
it('should initialize page lifecycle', () => {
|
|
25
|
-
expect(isPageLifecycleInitialized()).toBe(true);
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('should return current page lifecycle state', () => {
|
|
29
|
-
const state = getPageLifecycleState();
|
|
30
|
-
expect(state).toBeOneOf(PAGE_LIFECYCLE_STATES);
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it('should return current document state', () => {
|
|
34
|
-
const state = getDocumentState();
|
|
35
|
-
expect(state).toBeOneOf(DOCUMENT_STATES);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('should return event emitter instance', () => {
|
|
39
|
-
const emitter = getPageLifecycleEventEmitter();
|
|
40
|
-
expect(emitter).toBeDefined();
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('should handle page lifecycle state changes', () => {
|
|
44
|
-
const emitter = getPageLifecycleEventEmitter();
|
|
45
|
-
let stateChanged = false;
|
|
46
|
-
|
|
47
|
-
emitter.on(PAGE_LIFECYCLE_STATE_CHANGE_EVENT, (data) => {
|
|
48
|
-
stateChanged = true;
|
|
49
|
-
expect(data).toHaveProperty('previousState');
|
|
50
|
-
expect(data).toHaveProperty('nextState');
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
// Trigger visibility change
|
|
54
|
-
const originalVisibilityState = document.visibilityState;
|
|
55
|
-
Object.defineProperty(document, 'visibilityState', {
|
|
56
|
-
value: originalVisibilityState === 'visible' ? 'hidden' : 'visible',
|
|
57
|
-
writable: true,
|
|
58
|
-
configurable: true,
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
document.dispatchEvent(new Event('visibilitychange'));
|
|
62
|
-
|
|
63
|
-
// Restore original state
|
|
64
|
-
Object.defineProperty(document, 'visibilityState', {
|
|
65
|
-
value: originalVisibilityState,
|
|
66
|
-
writable: true,
|
|
67
|
-
configurable: true,
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
expect(stateChanged).toBe(true);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('should handle document state changes', () => {
|
|
74
|
-
const emitter = getPageLifecycleEventEmitter();
|
|
75
|
-
let stateChanged = false;
|
|
76
|
-
|
|
77
|
-
emitter.on(DOCUMENT_STATE_CHANGE_EVENT, (data) => {
|
|
78
|
-
stateChanged = true;
|
|
79
|
-
expect(data).toHaveProperty('previousState');
|
|
80
|
-
expect(data).toHaveProperty('nextState');
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
// Trigger ready state change
|
|
84
|
-
const originalReadyState = document.readyState;
|
|
85
|
-
Object.defineProperty(document, 'readyState', {
|
|
86
|
-
value: originalReadyState === 'complete' ? 'interactive' : 'complete',
|
|
87
|
-
writable: true,
|
|
88
|
-
configurable: true,
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
document.dispatchEvent(new Event('readystatechange'));
|
|
92
|
-
|
|
93
|
-
// Restore original state
|
|
94
|
-
Object.defineProperty(document, 'readyState', {
|
|
95
|
-
value: originalReadyState,
|
|
96
|
-
writable: true,
|
|
97
|
-
configurable: true,
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
expect(stateChanged).toBe(true);
|
|
101
|
-
});
|
|
102
|
-
});
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { typeChecker } from './TypeChecker.js';
|
|
3
|
-
import { TypeCheckError } from './TypeCheckError.js';
|
|
4
|
-
|
|
5
|
-
const stringValidator = (value) => typeof value === 'string';
|
|
6
|
-
|
|
7
|
-
describe('TypeChecker', () => {
|
|
8
|
-
it('should check value type correctly', () => {
|
|
9
|
-
const result = typeChecker.check('test', stringValidator);
|
|
10
|
-
expect(result).toBe('test');
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
it('should throw TypeCheckError for invalid type', () => {
|
|
14
|
-
expect(() => typeChecker.check(123, stringValidator)).toThrow(TypeCheckError);
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it('should swallow errors when enabled', () => {
|
|
18
|
-
typeChecker.setSwallowErrors(true);
|
|
19
|
-
const result = typeChecker.check(123, stringValidator);
|
|
20
|
-
expect(result).toBe(123);
|
|
21
|
-
typeChecker.setSwallowErrors(false);
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
it('should check array type correctly', () => {
|
|
25
|
-
const result = typeChecker.checkArray(['a', 'b', 'c'], stringValidator);
|
|
26
|
-
expect(result).toEqual(['a', 'b', 'c']);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it('should throw TypeCheckError for invalid array type', () => {
|
|
30
|
-
expect(() => typeChecker.checkArray([1, 2, 3], stringValidator)).toThrow(TypeCheckError);
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it('should swallow array errors when enabled', () => {
|
|
34
|
-
typeChecker.setSwallowErrors(true);
|
|
35
|
-
const result = typeChecker.checkArray([1, 2, 3], stringValidator);
|
|
36
|
-
expect(result).toEqual([1, 2, 3]);
|
|
37
|
-
typeChecker.setSwallowErrors(false);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it('should check enum value correctly', () => {
|
|
41
|
-
const choices = ['option1', 'option2', 'option3'];
|
|
42
|
-
const result = typeChecker.checkEnum('option2', choices);
|
|
43
|
-
expect(result).toBe('option2');
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('should throw TypeCheckError for invalid enum value', () => {
|
|
47
|
-
const choices = ['option1', 'option2', 'option3'];
|
|
48
|
-
expect(() => typeChecker.checkEnum('invalid', choices)).toThrow(TypeCheckError);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it('should swallow enum errors when enabled', () => {
|
|
52
|
-
typeChecker.setSwallowErrors(true);
|
|
53
|
-
const choices = ['option1', 'option2', 'option3'];
|
|
54
|
-
const result = typeChecker.checkEnum('invalid', choices);
|
|
55
|
-
expect(result).toBe('invalid');
|
|
56
|
-
typeChecker.setSwallowErrors(false);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it('should handle number enum values', () => {
|
|
60
|
-
const choices = [1, 2, 3];
|
|
61
|
-
const result = typeChecker.checkEnum(2, choices);
|
|
62
|
-
expect(result).toBe(2);
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it('should handle mixed string and number enum values', () => {
|
|
66
|
-
const choices = ['option1', 2, 'option3'];
|
|
67
|
-
const result = typeChecker.checkEnum(2, choices);
|
|
68
|
-
expect(result).toBe(2);
|
|
69
|
-
});
|
|
70
|
-
});
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { isNumber, isPositiveInteger } from '../util/validate.js';
|
|
2
|
-
import { TypeCheckError } from './TypeCheckError.js';
|
|
3
|
-
import { typeCheck, typeCheckArray, typeCheckEnum } from './util.js';
|
|
4
|
-
|
|
5
|
-
describe('typecheck', () => {
|
|
6
|
-
test('typeCheck', () => {
|
|
7
|
-
expect(() => typeCheck(0.1, isNumber)).not.toThrowError(TypeCheckError);
|
|
8
|
-
expect(() => typeCheck(-0.1, isPositiveInteger)).toThrowError(TypeCheckError);
|
|
9
|
-
expect(() => typeCheck('string', isNumber)).toThrowError(TypeCheckError);
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
test('typeCheckArray', () => {
|
|
13
|
-
expect(() => typeCheckArray([0.1], isNumber)).not.toThrowError(TypeCheckError);
|
|
14
|
-
expect(() => typeCheckArray(['string'], isNumber)).toThrowError(TypeCheckError);
|
|
15
|
-
// @ts-expect-error
|
|
16
|
-
expect(() => typeCheckArray(-0.1, isPositiveInteger)).toThrowError(TypeCheckError);
|
|
17
|
-
// @ts-expect-error
|
|
18
|
-
expect(() => typeCheckArray('string', isNumber)).toThrowError(TypeCheckError);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
test('typeCheckEnum', () => {
|
|
22
|
-
expect(() => typeCheckEnum('AA', ['AA'])).not.toThrowError(TypeCheckError);
|
|
23
|
-
expect(() => typeCheckEnum('AA', ['BB'])).toThrowError(TypeCheckError);
|
|
24
|
-
expect(() => typeCheckEnum(null, ['BB'])).toThrowError(TypeCheckError);
|
|
25
|
-
// @ts-expect-error
|
|
26
|
-
expect(() => typeCheckEnum(['AA'], null)).toThrowError(TypeCheckError);
|
|
27
|
-
try {
|
|
28
|
-
typeCheckEnum('AA', ['BB']);
|
|
29
|
-
} catch (error) {
|
|
30
|
-
if (error instanceof Error) {
|
|
31
|
-
expect(error.message).toBe('Validation failed: isEnum - "AA" (string)');
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
});
|
package/src/util/async.test.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { delayPromise, loadJSON } from './async.js';
|
|
2
|
-
|
|
3
|
-
describe('delayPromise', () => {
|
|
4
|
-
test('Returns a promise that resolves after specified delay', async () => {
|
|
5
|
-
const start = Date.now();
|
|
6
|
-
await delayPromise(10);
|
|
7
|
-
const end = Date.now();
|
|
8
|
-
|
|
9
|
-
// Should resolve within a reasonable time frame
|
|
10
|
-
expect(end - start).toBeGreaterThanOrEqual(9);
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
test('delayPromise with zero delay', async () => {
|
|
14
|
-
const start = Date.now();
|
|
15
|
-
await delayPromise(0);
|
|
16
|
-
const end = Date.now();
|
|
17
|
-
|
|
18
|
-
// Should resolve immediately
|
|
19
|
-
expect(end - start).toBeGreaterThanOrEqual(0);
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
describe('loadJSON', () => {
|
|
24
|
-
test('Load JSON data', async () => {
|
|
25
|
-
const data = await loadJSON('/test.json');
|
|
26
|
-
expect(data).toMatchObject({
|
|
27
|
-
method: 'GET',
|
|
28
|
-
success: true,
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
});
|
package/src/util/error.test.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/* eslint-disable unicorn/no-useless-undefined */
|
|
2
|
-
|
|
3
|
-
import { getErrorDetails, getTypedError } from './error.js';
|
|
4
|
-
|
|
5
|
-
describe('error', () => {
|
|
6
|
-
test('getErrorDetails', () => {
|
|
7
|
-
const error = new Error('Test error', { cause: 'Test cause' });
|
|
8
|
-
const errorDetails = getErrorDetails(error);
|
|
9
|
-
expect(errorDetails.type).toBe('Error');
|
|
10
|
-
expect(errorDetails.message).toBe('Test error');
|
|
11
|
-
expect(errorDetails.cause).toBe('Test cause');
|
|
12
|
-
expect(errorDetails.stack).toBe(undefined);
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
test('getErrorDetails with Error cause', () => {
|
|
16
|
-
const error = new SyntaxError('Test error', { cause: new TypeError('Cause error') });
|
|
17
|
-
const errorDetails = getErrorDetails(error);
|
|
18
|
-
expect(errorDetails.type).toBe('SyntaxError');
|
|
19
|
-
expect(errorDetails.message).toBe('Test error');
|
|
20
|
-
expect(errorDetails.cause instanceof Error).toBe(true);
|
|
21
|
-
if (errorDetails.cause instanceof Error) {
|
|
22
|
-
expect(errorDetails.cause.message).toBe('Cause error');
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
test('getTypedError', () => {
|
|
27
|
-
expect(getTypedError(new Error('Error message')).message).toBe('Error message');
|
|
28
|
-
expect(getTypedError('Error message').message).toBe('Error message');
|
|
29
|
-
expect(getTypedError(1).message).toBe('1');
|
|
30
|
-
expect(getTypedError(true).message).toBe('true');
|
|
31
|
-
expect(getTypedError(null).message).toBe('null');
|
|
32
|
-
expect(getTypedError(undefined).message).toBe('undefined');
|
|
33
|
-
});
|
|
34
|
-
});
|