@vpmedia/simplify 1.71.0 → 1.73.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/.vscode/extensions.json +6 -0
- package/.vscode/settings.json +27 -0
- package/CHANGELOG.md +55 -0
- package/package.json +12 -19
- package/src/index.js +1 -1
- package/src/logging/util.js +0 -2
- package/src/pagelifecycle/util.js +0 -3
- package/src/util/async.js +27 -0
- 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 +0 -2
- package/src/util/validate.js +0 -2
- package/types/index.d.ts +1 -1
- package/types/logging/util.d.ts.map +1 -1
- package/types/pagelifecycle/util.d.ts.map +1 -1
- package/types/util/async.d.ts +1 -0
- package/types/util/async.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.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 -53
- 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
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"files.watcherExclude": {
|
|
3
|
+
"**/.git/objects/**": true,
|
|
4
|
+
"**/.git/subtree-cache/**": true,
|
|
5
|
+
"**/build/**": true,
|
|
6
|
+
"**/node_modules/**": true
|
|
7
|
+
},
|
|
8
|
+
"editor.codeActionsOnSave": {
|
|
9
|
+
"source.removeUnusedImports": "explicit",
|
|
10
|
+
"source.organizeImports": "explicit"
|
|
11
|
+
},
|
|
12
|
+
"oxc.enable": true,
|
|
13
|
+
"[javascript]": {
|
|
14
|
+
"editor.defaultFormatter": "oxc.oxc-vscode"
|
|
15
|
+
},
|
|
16
|
+
"[javascriptreact]": {
|
|
17
|
+
"editor.defaultFormatter": "oxc.oxc-vscode"
|
|
18
|
+
},
|
|
19
|
+
"javascript.updateImportsOnFileMove.enabled": "always",
|
|
20
|
+
"[typescript]": {
|
|
21
|
+
"editor.defaultFormatter": "oxc.oxc-vscode",
|
|
22
|
+
},
|
|
23
|
+
"[typescriptreact]": {
|
|
24
|
+
"editor.defaultFormatter": "oxc.oxc-vscode"
|
|
25
|
+
},
|
|
26
|
+
"typescript.updateImportsOnFileMove.enabled": "always",
|
|
27
|
+
}
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,58 @@
|
|
|
1
|
+
## [1.73.0] - 2026-03-01
|
|
2
|
+
|
|
3
|
+
### 🚀 Features
|
|
4
|
+
|
|
5
|
+
- Added generic async retry helper
|
|
6
|
+
|
|
7
|
+
### 💼 Other
|
|
8
|
+
|
|
9
|
+
- *(deps)* Bump dependency versions
|
|
10
|
+
|
|
11
|
+
### ⚙️ Miscellaneous Tasks
|
|
12
|
+
|
|
13
|
+
- Release
|
|
14
|
+
- Migrate from prettier to oxfmt
|
|
15
|
+
- *(release)* V1.73.0
|
|
16
|
+
## [1.72.0] - 2026-02-28
|
|
17
|
+
|
|
18
|
+
### 🐛 Bug Fixes
|
|
19
|
+
|
|
20
|
+
- Fix runtime error with nodejs usage due to missing globalThis.location
|
|
21
|
+
|
|
22
|
+
### 💼 Other
|
|
23
|
+
|
|
24
|
+
- *(deps)* Bump dependency versions
|
|
25
|
+
- *(deps)* Bump dependency versions
|
|
26
|
+
- *(deps)* Bump dependency versions
|
|
27
|
+
- *(deps)* Bump dependency versions
|
|
28
|
+
- *(deps)* Bump dependency versions
|
|
29
|
+
- *(deps)* Bump dependency versions
|
|
30
|
+
- *(deps)* Bump dependency versions
|
|
31
|
+
- *(deps)* Bump dependency versions
|
|
32
|
+
- *(deps)* Bump dependency versions
|
|
33
|
+
- *(deps)* Bump dependency versions
|
|
34
|
+
- *(deps)* Bump dependency versions
|
|
35
|
+
- *(deps)* Bump dependency versions
|
|
36
|
+
- *(deps)* Bump dependency versions
|
|
37
|
+
- *(deps)* Bump dependency versions
|
|
38
|
+
- *(deps)* Bump dependency versions
|
|
39
|
+
- *(deps)* Bump dependency versions
|
|
40
|
+
- *(deps)* Bump dependency versions
|
|
41
|
+
- *(deps)* Update cli scripts
|
|
42
|
+
- *(deps)* Bump dependency versions
|
|
43
|
+
- *(deps)* Bump dependency versions
|
|
44
|
+
- *(deps)* Bump dependency versions
|
|
45
|
+
- *(deps)* Bump dependency versions
|
|
46
|
+
- Improve npmignore
|
|
47
|
+
- *(deps)* Bump dependency versions
|
|
48
|
+
|
|
49
|
+
### ⚙️ Miscellaneous Tasks
|
|
50
|
+
|
|
51
|
+
- Release
|
|
52
|
+
- Use oxlint only
|
|
53
|
+
- Use oxlint only
|
|
54
|
+
- Only audit production package
|
|
55
|
+
- *(release)* V1.72.0
|
|
1
56
|
## [1.71.0] - 2026-02-05
|
|
2
57
|
|
|
3
58
|
### 🚜 Refactor
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vpmedia/simplify",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.73.0",
|
|
4
4
|
"description": "@vpmedia/simplify",
|
|
5
5
|
"author": "Andras Csizmadia <andras@vpmedia.hu> (www.vpmedia.hu)",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,33 +19,26 @@
|
|
|
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.3",
|
|
29
28
|
"@vitest/coverage-v8": "^4.0.18",
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"jsdom": "^28.0.0",
|
|
36
|
-
"msw": "^2.12.8",
|
|
37
|
-
"oxlint": "^1.43.0",
|
|
38
|
-
"oxlint-tsgolint": "^0.11.4",
|
|
39
|
-
"prettier": "^3.8.1",
|
|
29
|
+
"jsdom": "^28.1.0",
|
|
30
|
+
"msw": "^2.12.10",
|
|
31
|
+
"oxfmt": "^0.35.0",
|
|
32
|
+
"oxlint": "^1.50.0",
|
|
33
|
+
"oxlint-tsgolint": "^0.15.0",
|
|
40
34
|
"typescript": "^5.9.3",
|
|
41
|
-
"typescript-eslint": "^8.54.0",
|
|
42
35
|
"vitest": "^4.0.18"
|
|
43
36
|
},
|
|
44
37
|
"scripts": {
|
|
45
38
|
"build": "rm -rf types && tsc -p ./tsconfig.build.json",
|
|
46
39
|
"check": "pnpm build && pnpm lint && pnpm test && pnpm typecheck",
|
|
47
|
-
"format": "
|
|
48
|
-
"lint": "oxlint src
|
|
40
|
+
"format": "oxfmt --write \"./**/*.{js,jsx,mjs,cjs,ts,tsx,json,css}\"",
|
|
41
|
+
"lint": "oxlint src",
|
|
49
42
|
"test": "vitest --coverage",
|
|
50
43
|
"typecheck": "tsc"
|
|
51
44
|
}
|
package/src/index.js
CHANGED
|
@@ -19,7 +19,7 @@ export {
|
|
|
19
19
|
export { typeChecker } from './typecheck/TypeChecker.js';
|
|
20
20
|
export { TypeCheckError } from './typecheck/TypeCheckError.js';
|
|
21
21
|
export { typeCheck, typeCheckArray, typeCheckEnum } from './typecheck/util.js';
|
|
22
|
-
export { delayPromise, loadJSON } from './util/async.js';
|
|
22
|
+
export { delayPromise, loadJSON, retryAsync } from './util/async.js';
|
|
23
23
|
export { getErrorDetails, getTypedError } from './util/error.js';
|
|
24
24
|
export { EventEmitter } from './util/event_emitter.js';
|
|
25
25
|
export { FetchError, fetchRetry, HTTP_0_ANY } from './util/fetch.js';
|
package/src/logging/util.js
CHANGED
package/src/util/async.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { getTypedError } from './error.js';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Returns a promise with delayed resolve.
|
|
3
5
|
* @param {number} delayMS - Promise resolve delay in milliseconds.
|
|
@@ -8,6 +10,31 @@ export const delayPromise = (delayMS) =>
|
|
|
8
10
|
setTimeout(resolve, delayMS);
|
|
9
11
|
});
|
|
10
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Async method call retry helper.
|
|
15
|
+
* @param {Function} method - Async function to call.
|
|
16
|
+
* @param {number} numTries - Max retries.
|
|
17
|
+
* @param {number} delayMs - Delay between attempts in ms.
|
|
18
|
+
* @returns {Promise<any>} Async function result.
|
|
19
|
+
*/
|
|
20
|
+
export const retryAsync = async (method, numTries = 1, delayMs = 100) => {
|
|
21
|
+
for (let attempt = 0; attempt <= numTries; attempt += 1) {
|
|
22
|
+
try {
|
|
23
|
+
// oxlint-disable-next-line no-await-in-loop
|
|
24
|
+
return await method();
|
|
25
|
+
} catch (error) {
|
|
26
|
+
if (attempt === numTries) {
|
|
27
|
+
throw getTypedError(error);
|
|
28
|
+
}
|
|
29
|
+
if (delayMs > 0) {
|
|
30
|
+
// oxlint-disable-next-line no-await-in-loop
|
|
31
|
+
await delayPromise(delayMs);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
throw new Error('Unknown error');
|
|
36
|
+
};
|
|
37
|
+
|
|
11
38
|
/**
|
|
12
39
|
* Load JSON file using a fetch GET request.
|
|
13
40
|
* @param {string} url - URL to load.
|
|
@@ -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
package/src/util/validate.js
CHANGED
package/types/index.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ export { uuidv4 } from "./util/uuid.js";
|
|
|
16
16
|
export { formatLogMessage, getLogLevelName } from "./logging/util.js";
|
|
17
17
|
export { addPageLifecycleCallback, getDocumentState, getPageLifecycleEventEmitter, getPageLifecycleState, initPageLifecycle, isPageLifecycleInitialized } from "./pagelifecycle/util.js";
|
|
18
18
|
export { typeCheck, typeCheckArray, typeCheckEnum } from "./typecheck/util.js";
|
|
19
|
-
export { delayPromise, loadJSON } from "./util/async.js";
|
|
19
|
+
export { delayPromise, loadJSON, retryAsync } from "./util/async.js";
|
|
20
20
|
export { getErrorDetails, getTypedError } from "./util/error.js";
|
|
21
21
|
export { FetchError, fetchRetry, HTTP_0_ANY } from "./util/fetch.js";
|
|
22
22
|
export { deg2rad, fixFloatPrecision, getRandomInt, isEqual, isGreater, isGreaterOrEqual, isInRange, isLess, isLessOrEqual, rad2deg } from "./util/number.js";
|
|
@@ -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"}
|
package/types/util/async.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../../src/util/async.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../../src/util/async.js"],"names":[],"mappings":"AAOO,sCAHI,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAKtB;AASG,wDAJI,MAAM,YACN,MAAM,GACJ,OAAO,CAAC,GAAG,CAAC,CAkBxB;AAOM,8BAHI,MAAM,GACJ,OAAO,CAAC,OAAO,CAAC,CAQ5B"}
|
|
@@ -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.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
|
-
});
|