@creejs/commons-logging
Version:
Common Utils About Logging
1 lines • 76.2 kB
Source Map (JSON)
{"version":3,"file":"index-dev.cjs","sources":["../../../lang/dist/esm/index-min.js","../../lib/log-level.js","../../lib/logger.js","../../lib/log-factory.js","../../lib/provider-type.js","../../lib/provider.js","../../lib/log-config.js","../../lib/console/console-logger.js","../../lib/console/console-log-factory.js","../../lib/console/console-log-provider.js","../../lib/console/index.js","../../lib/log4js/log4js-logger.js","../../lib/log4js/log4js-6x-config.js","../../lib/log4js/log4js-factory.js","../../lib/log4js/log4js-provider.js","../../lib/log4js/index.js","../../lib/index.js"],"sourcesContent":["var t={constructorName:function(t){return t?.constructor?.name},defaults:function(t,...e){if(null==t)throw new TypeError('\"target\" must not be null or undefined');for(const n of e)if(null!=n)for(const e in n)void 0===t[e]&&(t[e]=n[e]);return t},extend:e,extends:e,equals:function(t,e){if(t===e)return!0;if(\"function\"==typeof t?.equals)return t.equals(e);if(\"function\"==typeof e?.equals)return e.equals(t);return!1},isBrowser:n,isNode:function(){return!n()}};function e(t,...e){if(null==t)throw new TypeError('\"target\" must not be null or undefined');for(const n of e)if(null!=n)for(const e in n)t[e]=n[e];return t}function n(){return\"undefined\"!=typeof window&&\"undefined\"!=typeof document}var r={isArray:o,isBoolean:i,isBuffer:function(t){return null!=t&&Buffer.isBuffer(t)},isFunction:s,isInstance:u,isIterable:function(t){return null!=t&&\"function\"==typeof t[Symbol.iterator]},isDate:function(t){return null!=t&&t instanceof Date},isError:function(t){return null!=t&&t instanceof Error},isMap:function(t){return null!=t&&\"object\"==typeof t&&t.constructor===Map},isWeakMap:function(t){return null!=t&&\"object\"==typeof t&&t.constructor===WeakMap},isNumber:y,isPositive:l,isNegative:c,isNil:f,isNullOrUndefined:function(t){return null==t},isNull:a,isUndefined:p,isPlainObject:g,isObject:h,isPromise:w,isRegExp:function(t){return null!=t&&\"object\"==typeof t&&t.constructor===RegExp},isSet:function(t){return null!=t&&\"object\"==typeof t&&t.constructor===Set},isWeakSet:function(t){return null!=t&&\"object\"==typeof t&&t.constructor===WeakSet},isStream:function(t){return null!=t&&\"function\"==typeof t.pipe},isString:d,isSymbol:m,isPrimitive:function(t){return null!==t&&(\"string\"==typeof t||\"number\"==typeof t||\"boolean\"==typeof t)}};function o(t){return Array.isArray(t)}function i(t){return\"boolean\"==typeof t}function s(t){return\"function\"==typeof t}function u(t){return null!=t&&\"object\"==typeof t&&!g(t)}function f(t){return null==t}function l(t){return!!y(t)&&t>0}function c(t){return!!y(t)&&t<0}function a(t){return null===t}function p(t){return void 0===t}function y(t){return null!=t&&\"number\"==typeof t}function h(t){return null!=t&&\"object\"==typeof t}function g(t){return null!==t&&\"object\"==typeof t&&(t.constructor===Object||void 0===t.constructor)}function w(t){return null!=t&&\"function\"==typeof t.then}function d(t){return null!=t&&\"string\"==typeof t}function m(t){return null!=t&&\"symbol\"==typeof t}var b={assertNumber:$,assertPositive:function(t,e){if(!l(t))throw new Error(`${e?'\"'+e+'\" ':\" \"}Not Positive: ${t}`)},assertNegative:function(t,e){if(!c(t))throw new Error(`${e?'\"'+e+'\" ':\" \"}Not Negative: ${t}`)},assertBoolean:function(t,e){if(!i(t))throw new Error(`${e?'\"'+e+'\" ':\" \"}Not Boolean: type=${typeof t} value=${JSON.stringify(t)}`)},assertObject:v,assertPlainObject:function(t,e){if(!g(t))throw new Error(`${e?'\"'+e+'\" ':\" \"}Not PlainObject: type=${typeof t} value=${JSON.stringify(t)}`)},assertSymbol:function(t,e){if(!m(t))throw new Error(`${e?'\"'+e+'\" ':\" \"}Not Symbol: type=${typeof t} value=${JSON.stringify(t)}`)},assertFunction:E,assertInstance:function(t,e){if(!u(t))throw new Error(`${e?'\"'+e+'\" ':\" \"}Not Class Instance: type=${typeof t} value=${JSON.stringify(t)}`)},assertPromise:S,assertNil:function(t,e){if(!f(t))throw new Error(`${e?'\"'+e+'\" ':\" \"}Neither Null nor Undefined: type=${typeof t} value=${JSON.stringify(t)}`)},assertNotNil:function(t,e){if(f(t))throw new Error((e?'\"'+e+'\" ':\" \")+\"Should Not Nil\")},assertNull:function(t,e){if(!a(t))throw new Error(`${e?'\"'+e+'\" ':\" \"}Not Null: type=${typeof t} value=${JSON.stringify(t)}`)},assertNotNull:function(t,e){if(a(t))throw new Error((e?'\"'+e+'\" ':\" \")+\"Should Not Null\")},assertUndefined:function(t,e){if(!p(t))throw new Error(`${e?'\"'+e+'\" ':\" \"}Not Undefined: type=${typeof t} value=${JSON.stringify(t)}`)},assertString:O,assertArray:N,assertStringOrSymbol:function(t,e){if(!d(t)&&!m(t))throw new Error(`${e?'\"'+e+'\" ':\" \"}Not String or Symbol: type=${typeof t} value=${JSON.stringify(t)}`)}};function N(t,e){if(!Array.isArray(t))throw new Error(`${e?e+\"\":\" \"}Not Array: type=${typeof t} value=${JSON.stringify(t)}`)}function O(t,e){if(!d(t))throw new Error(`${e?'\"'+e+'\" ':\" \"}Not String: type=${typeof t} value=${JSON.stringify(t)}`)}function $(t,e){if(!y(t))throw new Error(`${e?'\"'+e+'\" ':\" \"}Not Number: type=${typeof t} value=${JSON.stringify(t)}`)}function v(t,e){if(!h(t))throw new Error(`${e?'\"'+e+'\" ':\" \"}Not Object: type=${typeof t} value=${JSON.stringify(t)}`)}function E(t,e){if(!s(t))throw new Error(`${e?'\"'+e+'\" ':\" \"}Not Function: type=${typeof t} value=${JSON.stringify(t)}`)}function S(t,e){if(!w(t))throw new Error(`${e?'\"'+e+'\" ':\" \"}Not Promise: type=${typeof t} value=${JSON.stringify(t)}`)}var j={isEmpty:P,assertNotEmpty:x,isBlank:k,assertNotBlank:function(t){if(k(t))throw new Error(`Blank String: ${t}`)},capitalize:function(t){if(O(t),0===t.length)return t;const e=t.charAt(0),n=e.toUpperCase();return e===n?t:n+t.slice(1)},decapitalize:function(t){if(O(t),0===t.length)return t;const e=t.charAt(0),n=e.toLowerCase();return e===n?t:n+t.slice(1)},splitWithFixedLength:function(t,e,n=\" \"){if(O(t),$(e),O(n),0===t.length)return[];if(e<=0)throw new Error(\"length muse >=0\");if(t.length<e)return[t.padEnd(e,n)];const r=[];for(let o=0;o<t.length;o+=e){const i=t.substring(o,o+e);r.push(i.padEnd(e,n))}return r},split:function(t,...e){O(t);if(0===t.length)return[];const n=[...e];0===e.length&&e.push(\",\");const r=T(t,...n);if(0===r.length)return[];const o=[];let i=\"\",s=0;for(const{marker:e,index:n}of r)i=t.substring(s,n),o.push(i),s=n+e.length;return i=t.substring(s),o.push(i),o},findMarkerPositions:function(t,...e){if(O(t),0===e.length)throw new Error(\"At least one marker must be provided\");const n=[];for(const r of new Set(e)){if(P(r))continue;O(r);let e=t.indexOf(r);for(;-1!==e;)n.push({marker:r,index:e}),e=t.indexOf(r,e+r.length)}return n.sort((t,e)=>t.index-e.index),n},findMarkerPositionsRegex:T,substringBefore:function(t,e){if(O(t),O(e),0===t.length||0===e.length)return;const n=t.indexOf(e);if(-1===n)return;return t.substring(0,n)},substringBeforeLast:function(t,e){if(O(t),O(e),0===t.length||0===e.length)return;const n=t.lastIndexOf(e);if(-1===n)return;return t.substring(0,n)},substringAfter:function(t,e){if(O(t),O(e),0===t.length||0===e.length)return;const n=t.indexOf(e);if(-1===n)return;return t.substring(n+e.length)},substringAfterLast:function(t,e){if(O(t),O(e),0===t.length||0===e.length)return;const n=t.lastIndexOf(e);if(-1===n)return;return t.substring(n+e.length)},substringBetween:function(t,e,n){x(t),x(e),x(n);const r=t.indexOf(e);if(-1===r)return;const o=t.indexOf(n,r+e.length);if(-1===o)return;return t.substring(r+e.length,o)},substringBetweenGreedy:function(t,e,n){x(t),x(e),x(n);const r=t.indexOf(e);if(-1===r)return;const o=t.lastIndexOf(n);if(-1===o||o<=r)return;return t.substring(r+e.length,o)},substringsBetween:function(t,e,n){x(t),x(e),x(n);const r=[];let o=0;for(;;){const i=t.indexOf(e,o);if(-1===i)break;const s=t.indexOf(n,i+e.length);if(-1===s)break;r.push(t.substring(i+e.length,s)),o=s+n.length}return r}};function P(t){return null==t||(O(t),0===t.length)}function x(t){if(P(t))throw new Error(`Empty String: ${t}`)}function k(t){return null==t||(O(t),0===t.trim().length)}function T(t,...e){if(O(t),0===e.length)throw new Error(\"At least one marker must be provided\");const n=[...new Set(e.filter(t=>null!=t))].map(t=>(O(t),t.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\"))),r=new RegExp(n.map(t=>`(${t})`).join(\"|\"),\"g\"),o=[];let i=null;for(;null!==(i=r.exec(t));){for(let t=1;t<i.length;t++)if(i[t]){o.push({marker:e[t-1],index:i.index});break}0===i[0].length&&r.lastIndex++}return o}var J={quiet:function(t){E(t);try{const e=t();return w(e)?e.catch(()=>{}):e}catch(t){}},quietKeepError:function(t,e){E(t),N(e);try{const n=t();return w(n)?n.catch(t=>e.push(t)):n}catch(t){e.push(t)}}},A={defer:B,delay:function(t,e){y(t)?(e=t,t=Promise.resolve()):null==t&&null==e&&(e=1,t=Promise.resolve());null!=t&&S(t),$(e=e??1e3);const n=B(),r=Date.now();return t.then((...t)=>{const o=Date.now()-r;o<e?setTimeout(()=>n.resolve(...t),e-o):n.resolve(...t)}).catch(t=>{const o=Date.now()-r;o<e?setTimeout(()=>n.reject(t),e-o):n.reject(t)}),n.promise},timeout:function(t,e,n){S(t),$(e=e??1);const r=B(e,n),o=Date.now();return t.then((...t)=>{Date.now()-o<=e?r.resolve(...t):r.reject(new Error(n??`Promise Timeout: ${e}ms`))}).catch(t=>{!r.resolved&&!r.rejected&&r.reject(t)}),r.promise},allSettled:U,returnValuePromised:C,series:async function(t){N(t);const e=[];for(const n of t)E(n),e.push(await n());return e},seriesAllSettled:async function(t){N(t);const e=[];for(const n of t){E(n);try{e.push({ok:!0,result:await n()})}catch(t){e.push({ok:!1,result:t})}}return e},parallel:async function(t,e=5){if(N(t),$(e),e<=0)throw new Error(`Invalid maxParallel: ${e}, should > 0`);t.forEach(t=>E(t));const n=[];if(t.length<=e){const e=await Promise.all(t.map(t=>C(t)));return n.push(...e),n}const r=[];for(const o of t)if(E(o),r.push(o),r.length>=e){const t=await Promise.all(r.map(t=>C(t)));n.push(...t),r.length=0}if(r.length>0&&r.length<e){const t=await Promise.all(r.map(t=>C(t)));n.push(...t)}return n},parallelAllSettled:async function(t,e=5){if(N(t),$(e),e<=0)throw new Error(`Invalid maxParallel: ${e}, should > 0`);t.forEach(t=>E(t));const n=[];if(t.length<=e){const e=await U(t.map(t=>C(t)));return n.push(...e),n}const r=[];for(const o of t)if(E(o),r.push(o),r.length>=e){const t=await U(r.map(t=>C(t)));n.push(...t),r.length=0}if(r.length>0&&r.length<e){const t=await U(r.map(t=>C(t)));n.push(...t)}return n}};function B(t=-1,e){$(t);const n={};let r;return t>=0&&(n.timerHandler=r=setTimeout(()=>{clearTimeout(r),n.timerCleared=!0,n.reject(new Error(e??`Promise Timeout: ${t}ms`))},t),n.timerHandler=r),n.promise=new Promise((t,e)=>{n.resolve=(...e)=>{null!=r&&(clearTimeout(r),n.timerCleared=!0),n.resolved=!0,t(...e)},n.reject=t=>{null!=r&&(clearTimeout(r),n.timerCleared=!0),n.rejected=!0,e(t)}}),n.promise.cancel=()=>{null!=r&&(clearTimeout(r),n.timerCleared=!0),n.rejected=!0,n.canceled=n.promise.canceled=!0,n.reject(new Error(\"Cancelled\"))},n}async function U(t){N(t);const e=await Promise.allSettled(t),n=[];for(const t of e)\"fulfilled\"===t.status&&n.push({ok:!0,result:t.value}),\"rejected\"===t.status&&n.push({ok:!1,result:t.reason});return n}function C(t){try{const e=t();return w(e)?e:Promise.resolve(e)}catch(t){return Promise.reject(t)}}const{isPlainObject:I}=r;var M={proxy:q,newProxyInstance:function(t,e,n,r=!0){const o=q(t,n,r);return Reflect.construct(o,e??[])}};function q(t,e,n=!0){if(\"function\"!=typeof t)throw new TypeError(`Not Class: type=${typeof t}, value=${JSON.stringify(t)}`);if(null!=e){if(!I(e))throw new TypeError(`Not PropertyHandler: type=${typeof e}, value=${JSON.stringify(e)}`);const{get:t,set:n}=e;if(null!=t&&\"function\"!=typeof t)throw new TypeError(`Not PropertyHandler.get: type=${typeof t}, value=${JSON.stringify(t)}`);if(null!=n&&\"function\"!=typeof n)throw new TypeError(`Not PropertyHandler.set: type=${typeof n}, value=${JSON.stringify(n)}`)}const r={construct(t,r,o){const i=Reflect.construct(t,r);return new Proxy(n?Object.preventExtensions(i):i,e??{})}};return new Proxy(t,r)}var D={proxy:function(t,e,n=!0){if(f(t)||!h(t)||o(t))throw new TypeError(`Not Object: type=${typeof t}, value=${JSON.stringify(t)}`);return new Proxy(n?Object.preventExtensions(t):t,e??{})}};function L(t){v(t,\"obj\");const e=new Set;let n=t;for(;n&&n!==Object.prototype;){const r=Object.getOwnPropertyNames(n);for(const n of r)\"constructor\"!==n&&\"function\"==typeof t[n]&&e.add(n);n=Object.getPrototypeOf(n)}return[...new Set(e)]}var R={getMethodsOfClass:function(t){E(t,\"cls\");const e=new Set;let n=t.prototype;for(;n&&n!==Object.prototype;){const t=Object.getOwnPropertyNames(n);for(const r of t)\"constructor\"!==r&&\"function\"==typeof n[r]&&e.add(r);n=Object.getPrototypeOf(n)}return[...new Set(e)]},getStaticMethodsOfClass:function(t){E(t,\"cls\");const e=new Set;let n=t;for(;n&&n!==Object.getPrototypeOf(Object);){const t=Object.getOwnPropertyNames(n);for(const r of t)\"function\"==typeof n[r]&&e.add(r);n=Object.getPrototypeOf(n)}return[...e]},getMethods:L,getMethodsOfObject:L},H={LangUtils:t,StringUtils:j,TypeUtils:r,TypeAssert:b,ExecUtils:J,PromiseUtils:A,Lang:t,Type:r,Exec:J,ClassProxyUtils:M,InstanceProxyUtils:D,ReflectUtils:R};export{M as ClassProxyUtils,J as Exec,J as ExecUtils,D as InstanceProxyUtils,t as Lang,t as LangUtils,A as PromiseUtils,R as ReflectUtils,j as StringUtils,r as Type,b as TypeAssert,r as TypeUtils,H as default};\n//# sourceMappingURL=index-min.js.map\n","import { TypeUtils } from '@creejs/commons-lang'\n\nconst { isNumber, isString } = TypeUtils\n/**\n * @namespace LogLevel\n * @description Defines the logging levels and provides utilities for working with them.\n */\n// module vars\nconst TRACE = 'TRACE'\nconst DEBUG = 'DEBUG'\nconst INFO = 'INFO'\nconst WARN = 'WARN'\nconst ERROR = 'ERROR'\nconst FATAL = 'FATAL'\nconst OFF = 'OFF'\nconst ALL = 'ALL'\n\nconst Names = new Set([TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF, ALL])\n/**\n * The logging level numbers, where OFF=-1, FATAL=0, ERROR=1, WARN=2, INFO=3, DEBUG=4, TRACE=5, ALL=6\n * @enum {number}\n * @memberof LogLevel\n * @static\n */\nconst Level = {\n OFF: -1,\n FATAL: 0,\n ERROR: 1,\n WARN: 2,\n INFO: 3,\n DEBUG: 4,\n TRACE: 5,\n ALL: 6\n}\n\n/**\n * Standard logging level names\n * @enum {string}\n * @memberof LogLevel\n * @static\n * @constant\n */\nconst Name = {\n TRACE,\n DEBUG,\n INFO,\n WARN,\n ERROR,\n FATAL,\n OFF\n}\n\n/**\n * Internal map for quick lookup of level names by their numeric values\n * @type {Map<number, string>}\n * @private\n */\nconst Value2Name = new Map()\nfor (const [name, value] of Object.entries(Level)) {\n Value2Name.set(value, name)\n}\n\n/**\n * The default logging level (ERROR)\n * @type {number}\n * @memberof LogLevel\n * @static\n */\nconst DefaultLevel = Level.ERROR\n\n/**\n * Converts a numeric logging level value to its corresponding name.\n * @param {number} value - The numeric logging level value to convert.\n * @returns {string|undefined} The name associated with the given logging level value, from {@link LogLevel.Name}.\n * @memberof LogLevel\n * @static\n */\nfunction value2Name (value) {\n if (!isNumber(value)) {\n return undefined\n }\n return Value2Name.get(value)\n}\n\n/**\n * Converts a logging level name to its corresponding numeric value.\n * @param {string} name - The name of the logging level.\n * @returns {number|undefined} The numeric value of the logging level from {@link LogLevel.Level}, or undefined if name is not supported.\n * @memberof LogLevel\n * @static\n */\nfunction name2Value (name) {\n if (!isString(name)) {\n return undefined\n }\n // @ts-ignore\n return Level[name.toUpperCase()]\n}\n\n/**\n * Checks if the given level is a valid log level.\n * @param {number} level - The log level to check.\n * @returns {boolean} True if the level is valid, false otherwise.\n * @memberof LogLevel\n * @static\n */\nfunction hasLevel (level) {\n return Value2Name.has(level)\n}\n\n/**\n * Checks if the given level name exists in the Name enum/object.\n * @param {string} levelName - The name of the log level to check.\n * @returns {boolean} True if the level name exists, false otherwise.\n * @memberof LogLevel\n * @static\n */\nfunction hasName (levelName) {\n if (!isString(levelName)) {\n return false\n }\n return Names.has(levelName.toUpperCase())\n}\n\n/**\n * Validates that a given level is a number and falls within the valid range.\n * @param {*} level - The log level to validate\n * @throws {Error} If level is not a number or outside valid range (Level.OFF to Level.ALL)\n * @memberof LogLevel\n * @static\n */\nfunction assertLevel (level) {\n if (!isNumber(level)) {\n throw new Error(`Level Not Number: type=${typeof level} value=${level}`)\n }\n if (level < Level.OFF || level > Level.ALL) {\n throw new Error(`Not Valid Level: ${level}, Expect between ${Level.OFF} and ${Level.ALL}`)\n }\n}\n\nconst LogLevel = {\n Name,\n Level,\n DefaultLevel,\n hasLevel,\n hasName,\n assertLevel,\n /**\n * Same with [Name]{@link LogLevel.Name}\n * @type {Object}\n * @memberof LogLevel\n * @static\n */\n LevelName: Name,\n /**\n * Same with [Level]{@link LogLevel.Level}\n * @type {Object}\n * @memberof LogLevel\n * @static\n */\n LevelValue: Level,\n\n value2Name,\n\n name2Value\n}\n\nexport default LogLevel\n\nexport {\n Name,\n Level,\n DefaultLevel,\n hasLevel,\n hasName,\n assertLevel,\n Name as LevelName,\n Level as LevelValue,\n value2Name,\n name2Value\n}\n","// internal\nimport { TypeAssert } from '@creejs/commons-lang'\n// owned\nimport LogLevel from './log-level.js'\n\nconst { Level, DefaultLevel, assertLevel } = LogLevel\nconst { assertString } = TypeAssert\n/**\n * Abstract Logger Class of All Logger\n * @abstract\n */\nexport default class Logger {\n /**\n * Creates a new Logger instance.\n * @constructor\n * @param {string} name - The name identifier for the logger\n * @param {*} [nativeLogger]\n * @param {number} [level] - The logging level, default is Level.ERROR=1\n */\n constructor (name, nativeLogger, level = DefaultLevel) {\n assertString(name)\n assertLevel(level)\n this._name = name\n this._nativeLogger = nativeLogger\n this._level = level\n }\n\n get nativeLogger () {\n return this._nativeLogger\n }\n\n get level () {\n return this._level\n }\n\n /**\n * Gets the name of the logger instance.\n * @returns {string} The name of the logger.\n */\n get name () {\n return this._name\n }\n\n /**\n * Checks if FATAL level logging is enabled for this logger.\n * @returns {boolean} True if FATAL level logging is enabled, false otherwise.\n */\n get fatalEnabled () {\n return this.level >= Level.FATAL\n }\n\n /**\n * Checks if ERROR level logging is enabled for this logger.\n * @returns {boolean} True if ERROR level logging is enabled, false otherwise.\n */\n get errorEnabled () {\n return this.level >= Level.ERROR\n }\n\n /**\n * Checks if WARN level logging is enabled for this logger.\n * @returns {boolean} True if WARN level logging is enabled, false otherwise.\n */\n get warnEnabled () {\n return this.level >= Level.WARN\n }\n\n /**\n * Checks if DEBUG level logging is enabled for this logger.\n * @returns {boolean} True if DEBUG level logging is enabled, false otherwise.\n */\n get debugEnabled () {\n return this.level >= Level.DEBUG\n }\n\n /**\n * Checks if INFO level logging is enabled for this logger.\n * @returns {boolean} True if INFO level logging is enabled, false otherwise.\n */\n get infoEnabled () {\n return this.level >= Level.INFO\n }\n\n /**\n * Checks if TRACE level logging is enabled for this logger.\n * @returns {boolean} True if TRACE level logging is enabled, false otherwise.\n */\n get traceEnabled () {\n return this.level >= Level.TRACE\n }\n\n /**\n * change log level for current logger instance.\n * @param {number} level - new log level to set\n * @throws {Error} Currently throws an error as this method is Not Impled Yet.\n * @abstract\n */\n setLevel (level) {\n LogLevel.assertLevel(level)\n this._setLevel(level)\n this._level = level\n }\n\n /**\n * Logs a fatal error message with timestamp and logger name.\n * Only outputs if fatal logging is enabled for this logger instance.\n * @param {...any} args - Arguments to log (will be space-separated)\n */\n fatal (...args) {\n if (this.fatalEnabled) {\n this._fatal(...args)\n }\n }\n\n /**\n * Logs an error message to the console with timestamp and logger name.\n * Only logs if error logging is enabled for this logger instance.\n * @param {...any} args - Arguments to be logged as error message\n */\n error (...args) {\n if (this.errorEnabled) {\n this._error(...args)\n }\n }\n\n /**\n * Logs a warning message to the console if warn logging is enabled.\n * @param {...any} args - The arguments to log as a warning message.\n */\n warn (...args) {\n if (this.warnEnabled) {\n this._warn(...args)\n }\n }\n\n /**\n * Logs debug messages to console if debug mode is enabled.\n * @param {...any} args - The data to be logged\n */\n debug (...args) {\n if (this.debugEnabled) {\n this._debug(...args)\n }\n }\n\n /**\n * Logs an info message to the console with timestamp and logger name.\n * @param {...any} args - The data to be logged. Accepts multiple arguments.\n */\n info (...args) {\n if (this.infoEnabled) {\n this._info(...args)\n }\n }\n\n /**\n * Logs a trace message with timestamp and logger name if trace logging is enabled.\n * @param {...any} args - Data to be logged as trace message.\n */\n trace (...args) {\n if (this.traceEnabled) {\n this._trace(...args)\n }\n }\n\n /**\n * Checks if FATAL level logging is enabled for this logger.\n * @returns {boolean} True if FATAL level logging is enabled, false otherwise.\n */\n isFatalEnabled () {\n return this.fatalEnabled\n }\n\n /**\n * Checks if ERROR level logging is enabled for this logger.\n * @returns {boolean} True if ERROR level logging is enabled, false otherwise.\n */\n isErrorEnabled () {\n return this.errorEnabled\n }\n\n /**\n * Checks if WARN level logging is enabled for this logger.\n * @returns {boolean} True if WARN level logging is enabled, false otherwise.\n */\n isWarnEnabled () {\n return this.warnEnabled\n }\n\n /**\n * Checks if DEBUG level logging is enabled for this logger.\n * @returns {boolean} True if DEBUG level logging is enabled, false otherwise.\n */\n isDebugEnabled () {\n return this.debugEnabled\n }\n\n /**\n * Checks if INFO level logging is enabled for this logger.\n * @returns {boolean} True if INFO level logging is enabled, false otherwise.\n */\n isInfoEnabled () {\n return this.infoEnabled\n }\n\n /**\n * Checks if TRACE level logging is enabled for this logger.\n * @returns {boolean} True if TRACE level logging is enabled, false otherwise.\n */\n isTraceEnabled () {\n return this.traceEnabled\n }\n\n /**\n * Sets the logging level\n * @param {number} level\n * @throws {Error} Always throws \"Not Impled Yet Yet\" error.\n * @protected\n * @abstract\n */\n _setLevel (level) {\n throw new Error('Not Impled Yet')\n }\n\n /**\n * Override this method to implement fatal logging.\n * @protected\n * @param {...*} args - Variable arguments\n * @throws {Error} Always throws \"Not Impled Yet Yet\" error\n */\n _fatal (...args) {\n throw new Error('Not Impled Yet')\n }\n\n /**\n * Override this method to implement error logging.\n * @protected\n * @param {...*} args - Variable arguments\n * @throws {Error} Always throws \"Not Impled Yet Yet\" error\n */\n _error (...args) {\n throw new Error('Not Impled Yet')\n }\n\n /**\n * Override this method to implement warn logging.\n * @protected\n * @param {...*} args - Variable arguments\n * @throws {Error} Always throws \"Not Impled Yet Yet\" error\n */\n _warn (...args) {\n throw new Error('Not Impled Yet')\n }\n\n /**\n * Override this method to implement debug logging.\n * @protected\n * @param {...*} args - Variable arguments\n * @throws {Error} Always throws \"Not Impled Yet Yet\" error\n */\n _debug (...args) {\n throw new Error('Not Impled Yet')\n }\n\n /**\n * Override this method to implement info logging.\n * @protected\n * @param {...*} args - Variable arguments\n * @throws {Error} Always throws \"Not Impled Yet Yet\" error\n */\n _info (...args) {\n throw new Error('Not Impled Yet')\n }\n\n /**\n * Override this method to implement trace logging.\n * @protected\n * @param {...*} args - Variable arguments\n * @throws {Error} Always throws \"Not Impled Yet Yet\" error\n */\n _trace (...args) {\n throw new Error('Not Impled Yet')\n }\n}\n","// owned\n// eslint-disable-next-line no-unused-vars\nimport Logger from './logger.js'\n\n/**\n * @abstract\n */\nexport default class LogFactory {\n /**\n * Checks if a value resembles a LogFactory by verifying it has required methods.\n * @param {*} value - The value to check\n * @returns {boolean}\n */\n static isLogFactoryLike (value) {\n if (value == null) {\n return false\n }\n return typeof value === 'object' && typeof value.createLogger === 'function' && typeof value.setLevel === 'function'\n }\n\n /**\n * Asserts that the given value is a valid LogFactory-Like object.\n * @throws {Error} Throws an error if the value is not LogFactory-Like\n * @param {*} value - The value to check.\n */\n static assertLogFactoryLike (value) {\n if (!this.isLogFactoryLike(value)) {\n throw new Error('Not LogFactory')\n }\n }\n\n /**\n * Creates a new logging provider instance.\n * @param {{}} libraryModule - the library module\n * @param {{}} setting - Configuration settings for the provider\n */\n constructor (libraryModule, setting) {\n this._libraryModule = libraryModule\n this._setting = setting\n }\n\n get libraryModule () {\n return this._libraryModule\n }\n\n get setting () {\n return this._setting\n }\n\n /**\n * Initializes the logging provider.\n * 1. Do nothing in the default implementation.\n * 2. Override this method to initialize the provider.\n * @returns {Promise<void>|void}\n */\n init () {\n // do nothing\n }\n\n /**\n * Update factory's Log Level\n * 1. Only Provider knows how to update\n * * update level in \"setting\", so the new created Logger will use the new level\n * 2. called when users want to change global log level via CommonsLogging.setLevel()\n * @param {number} level - The log level to set, see {@link LogLevel.Level}\n * @returns {void}\n * @throws {Error} Throws an error as this method is Not Impled Yet.\n * @abstract\n */\n setLevel (level) {\n throw new Error('Not Impled Yet')\n }\n\n /**\n * Creates a new logger named with the \"loggerName\"\n * @param {string} loggerName - The name to associate with the logger instance.\n * @throws {Error} Throws an error indicating the method is Not Impled Yet yet.\n * @returns {Logger} A new logger intance\n * @abstract\n */\n createLogger (loggerName) {\n throw new Error('Not Impled Yet')\n }\n}\n","/**\n * @type {string}\n * @memberof ProviderType\n */\nexport const Log4js = 'LOG4JS'\n/**\n * @type {string}\n * @memberof ProviderType\n */\nexport const Console = 'CONSOLE'\n\n/**\n * @namespace ProviderType\n * @description Define the static types\n */\nexport default {\n Log4js,\n Console\n}\n","// owned\n// eslint-disable-next-line no-unused-vars\nimport LogFactory from './log-factory.js'\n\n/**\n * A interface that All Provider module must export\n * @interface\n */\nexport default class Provider {\n /**\n * Checks if a value resembles a logging provider by verifying it has required methods.\n * @param {*} value - The value to check\n * @returns {boolean}\n */\n static isProviderLike (value) {\n if (value == null) {\n return false\n }\n return typeof value === 'object' && typeof value.createLogFactory === 'function' && typeof value.getType === 'function'\n }\n\n /**\n * Asserts that the given value is a valid provider-like object.\n * @throws {Error} Throws an error if the value is not provider-like.\n * @param {*} value - The value to check.\n */\n static assertProviderLike (value) {\n if (!this.isProviderLike(value)) {\n throw new Error('Not LogProvider')\n }\n }\n\n /**\n * The Type Name of current Provider\n * @return {String} The type of the provider.\n */\n getType () {\n throw new Error('Not Impled Yet')\n }\n\n /**\n * Create a new LogFactory instance\n * @param {*} [nativeLib] - The native library to use for logging.\n * @param {*} [setting] - Configuration settings for the logging provider.\n * @returns {LogFactory} A new instance of LogFactory.\n */\n createLogFactory (nativeLib, setting) {\n throw new Error('Not Impled Yet')\n }\n}\n","// internal\nimport { TypeAssert } from '@creejs/commons-lang'\n// owned\nimport { DefaultLevel } from './log-level.js'\n// eslint-disable-next-line no-unused-vars\nimport LogFactory from './log-factory.js'\nimport Provider from './provider.js'\n\nconst { assertString } = TypeAssert\n\n/**\n * @module LogConfig\n * @description Provide Impl of Log Configuration\n * @private\n */\n\n/**\n * type name of current provider\n * @type {string}\n * @public\n */\n// @ts-ignore\n// eslint-disable-next-line prefer-const\nlet currentProvider = null\n\n/**\n * Global logging level\n * @type {number}\n * @public\n */\n// @ts-ignore\n// eslint-disable-next-line prefer-const\nlet currentLevel = DefaultLevel\n\n/**\n * The map of registered logging libraries\n * @type {Map<string,Provider>}\n * @private\n */\nconst type2Provider = new Map()\n\n/**\n * Adds a logging provider for the specified type.\n * @param {string} typeName - The type identifier for the provider.\n * @param {Provider} provider - The logging provider implementation.\n * @returns {void}\n * @alias module:LogConfig.addProvider\n */\nfunction addProvider (typeName, provider) {\n assertString(typeName)\n Provider.assertProviderLike(provider)\n type2Provider.set(typeName.toUpperCase(), provider)\n}\n\n/**\n * Gets the logging provider for the specified type name.\n * @param {string} typeName - The type name to look up in the provider map.\n * @returns {Provider|undefined} The logging provider instance if found, otherwise undefined.\n */\nfunction getProvider (typeName) {\n assertString(typeName)\n return type2Provider.get(typeName.toUpperCase())\n}\n\n/**\n * Removes a logging provider of the specified type.\n * @param {string} typeName - The type name of the provider to remove.\n * @returns {boolean}\n */\nfunction removeProvider (typeName) {\n assertString(typeName)\n return type2Provider.delete(typeName.toUpperCase())\n}\n\nfunction clearProviders () {\n type2Provider.clear()\n}\n\n/**\n * Returns an array of all registered factory types and intances.\n * 1. Each entry is a [type, factory] pair\n * @returns {Array<{0:string, 1:Provider}>} An array of factory entries.\n */\nfunction listProviders () {\n return [...type2Provider.entries()]\n}\n\n/**\n * Created LogFactories Index with type name\n * @type {Map<string, LogFactory>}\n * @public\n */\nconst type2Factory = new Map()\n\n/**\n * Registers a log factory for a given type name.\n * @param {string} typeName - The name of the log type to register.\n * @param {LogFactory} logFactory - Factory function that creates a logger for the specified type.\n */\nfunction addFactory (typeName, logFactory) {\n assertString(typeName)\n LogFactory.assertLogFactoryLike(logFactory)\n type2Factory.set(typeName.toUpperCase(), logFactory)\n}\n\n/**\n * Removes a factory of the given type from the type-to-factory mapping.\n * @param {string} typeName - The name of the type whose factory should be removed.\n * @returns {boolean}\n */\nfunction removeFactory (typeName) {\n assertString(typeName)\n return type2Factory.delete(typeName.toUpperCase())\n}\n\n/**\n * Gets the factory function associated with the given type name.\n * @param {string} typeName - The name of the type to look up.\n * @returns {LogFactory|undefined} The factory function for the specified type.\n */\nfunction getFactory (typeName) {\n assertString(typeName)\n return type2Factory.get(typeName.toUpperCase())\n}\n\n/**\n * Clears all registered factories from the type2Factory instance.\n * This is typically used to reset the factory state during testing or teardown.\n */\nfunction clearFactories () {\n type2Factory.clear()\n}\n\n/**\n * Returns an array of all registered factory types and intances.\n * 1. Each entry is a [type, factory] pair\n * @returns {Array<{0:string, 1:LogFactory}>} An array of factory entries.\n */\nfunction listFactories () {\n return [...type2Factory.entries()]\n}\n\nfunction clear () {\n clearProviders()\n clearFactories()\n}\n\nexport default {\n currentProvider,\n currentLevel,\n type2Provider,\n type2Factory,\n addProvider,\n getProvider,\n removeProvider,\n clearProviders,\n listProviders,\n addFactory,\n getFactory,\n removeFactory,\n clearFactories,\n listFactories,\n clear\n}\n\nexport {\n currentProvider,\n currentLevel,\n type2Provider,\n type2Factory,\n addProvider,\n getProvider,\n removeProvider,\n clearProviders,\n listProviders,\n addFactory,\n getFactory,\n removeFactory,\n clearFactories,\n listFactories,\n clear\n}\n","// 3rd\n// internal\n// owned\nimport Logger from '../logger.js'\n// module vars\n/**\n * A Simple Implementation of the Logger interface that logs to the console.\n */\nexport default class ConsoleLogger extends Logger {\n /**\n * Creates a ConsoleLogger instance.\n * @constructor\n * @param {string} name - The logger name.\n * @param {*} nativeLogger - The native console object to use for logging.\n * @param {number} level - The initial log level.\n */\n constructor (name, nativeLogger, level) {\n super(name, nativeLogger, level)\n /**\n * @type {{error:function, warn:function, debug:function, log:function, info:function, trace:function}}\n */\n this.console = nativeLogger\n }\n\n /**\n * For ConsoleLogger, Nothing to do\n * @param {number} level\n * @override\n * @protectd\n */\n _setLevel (level) {\n // do nothing\n }\n\n /**\n * Logs a fatal error message with timestamp and logger name.\n * Only outputs if fatal logging is enabled for this logger instance.\n * @param {...any} args\n */\n _fatal (...args) {\n this.console.error(new Date().toISOString(), this.name, '[Fatal]', ...args)\n }\n\n /**\n * Logs an error message to the console with timestamp and logger name.\n * Only logs if error logging is enabled for this logger instance.\n * @param {...any} args\n */\n _error (...args) {\n this.console.error(new Date().toISOString(), this.name, '[Error]', ...args)\n }\n\n /**\n * Logs a warning message to the console if warn logging is enabled.\n * @param {...any} args\n */\n _warn (...args) {\n this.console.warn(new Date().toISOString(), this.name, '[Warn]', ...args)\n }\n\n /**\n * Logs debug messages to console if debug mode is enabled.\n * @param {...any} args\n */\n _debug (...args) {\n this.console.debug(new Date().toISOString(), this.name, '[Debug]', ...args)\n }\n\n /**\n * Logs an info message to the console with timestamp and logger name.\n * @param {...any} args\n */\n _info (...args) {\n this.console.log(new Date().toISOString(), this.name, '[Info]', ...args)\n }\n\n /**\n * Logs a trace message with timestamp and logger name if trace logging is enabled.\n * @param {...any} args\n */\n _trace (...args) {\n this.console.log(new Date().toISOString(), this.name, '[Trace]', ...args)\n }\n}\n","// owned\n// eslint-disable-next-line no-unused-vars\nimport Logger from '../logger.js'\n// eslint-disable-next-line no-unused-vars\nimport { Level, assertLevel } from '../log-level.js'\nimport LogFactory from '../log-factory.js'\nimport ConsoleLogger from './console-logger.js'\nimport LogConfig from '../log-config.js'\n\n/**\n * Use Console as the native library\n */\nexport default class ConsoleLogFactory extends LogFactory {\n /**\n * the underlying \"Console\" Object.\n * @returns {{}}\n */\n get console () {\n return this._libraryModule // it's the embedded \"console\" object\n }\n\n /**\n * Gets the current logging settings\n * @returns {{level:number}} The logging settings object containing the current log level.\n */\n get setting () {\n if (this._setting == null) {\n this._setting = {\n level: LogConfig.currentLevel\n }\n }\n // @ts-ignore\n return this._setting\n }\n\n /**\n * Update factory's Log Level\n * 1. Only Provider knows how to update\n * @param {number} level - The log level to set, see {@link LogLevel.Level}\n * @returns {void}\n * @throws {Error} Throws an error as this method is Not Impled Yet.\n * @abstract\n */\n setLevel (level) {\n assertLevel(level)\n if (level !== this.setting.level) {\n this.setting.level = level\n }\n // init again\n this.init()\n }\n\n /**\n * Initializes the log4js provider by configuring it with the provided settings.\n * @async\n * @override\n * @returns {Promise<void>|void}\n */\n init () {\n // do nothing\n }\n\n /**\n * Creates a new logger instance with the specified name and log level.\n * @param {string} loggerName - The name of the logger to create.\n * @returns {Logger} A new logger instance configured with the given name and level.\n * @override\n */\n createLogger (loggerName) {\n return new ConsoleLogger(loggerName, this.console, this.setting.level)\n }\n}\n","// owned\nimport ProviderType from '../provider-type.js'\nimport Provider from '../provider.js'\nimport ConsoleLogFactory from './console-log-factory.js'\n\nexport default class ConsoleProvider extends Provider {\n /**\n * Gets the provider type (Console).\n * @returns {string} \"CONSOLE\"\n * @override\n */\n getType () {\n return ProviderType.Console\n }\n\n /**\n * Creates a new Provider instance.\n * @param {Object} libraryModule - The library module to be used.\n * @param {Object} setting - Configuration settings for the provider.\n * @returns {ConsoleLogFactory} A new instance of ConsoleProvider.\n * @override\n */\n createLogFactory (libraryModule, setting) {\n return new ConsoleLogFactory(libraryModule, setting)\n }\n}\n","// internal\n\n// owned\nimport ConsoleProvider from './console-log-provider.js'\n\n// module vars\nconst provider = new ConsoleProvider()\n\nexport default provider\n","// 3rd\n// internal\n// owned\nimport { assertLevel, value2Name, name2Value, Level } from '../log-level.js'\nimport Logger from '../logger.js'\n// module vars\n\nexport default class Log4jsLogger extends Logger {\n /**\n * Creates a new ConsoleLogger instance.\n * @constructor\n * @param {string} name - The name of the logger.\n * @param {*} nativeLogger - Log4js library\n */\n constructor (name, nativeLogger) {\n super(name, nativeLogger)\n // @ts-ignore\n this._level = undefined // MUST NOT accept level from outside\n this._logger = nativeLogger\n }\n\n /**\n * 1. log4js may have many categories(loggerName) with diffirent level\n * 2. return the underlying log4js native logger's level\n * @returns {number} The current log level.\n */\n get level () {\n if (this._level == null) {\n const levelName = this._logger.level.levelStr\n if (levelName == null) {\n return Level.OFF\n }\n const level = name2Value(levelName)\n if (level == null) {\n throw new Error(`Unknown level name: ${levelName}`)\n }\n return level\n }\n return this._level\n }\n\n /**\n * set log4js native logger's level\n * @param {number} level\n * @override\n * @protectd\n */\n _setLevel (level) {\n assertLevel(level)\n const levelName = value2Name(level)\n if (levelName == null) {\n throw new Error(`Invalid log level: ${level}`)\n }\n // log4js use string level, eg. 'error, trace'\n this._logger.level = levelName.toLowerCase()\n }\n\n /**\n * Logs a fatal error message with timestamp and logger name.\n * Only outputs if fatal logging is enabled for this logger instance.\n * @param {...any} args - Arguments to log (will be space-separated)\n */\n _fatal (...args) {\n this._logger.fatal(...args)\n }\n\n /**\n * Logs an error message to the console with timestamp and logger name.\n * Only logs if error logging is enabled for this logger instance.\n * @param {...any} args - Arguments to be logged as error message\n */\n _error (...args) {\n this._logger.error(...args)\n }\n\n /**\n * Logs a warning message to the console if warn logging is enabled.\n * @param {...any} args - The arguments to log as a warning message.\n */\n _warn (...args) {\n this._logger.warn(...args)\n }\n\n /**\n * Logs debug messages to console if debug mode is enabled.\n * @param {...any} args - The data to be logged\n */\n _debug (...args) {\n this._logger.debug(...args)\n }\n\n /**\n * Logs an info message to the console with timestamp and logger name.\n * @param {...any} args - The data to be logged. Accepts multiple arguments.\n */\n _info (...args) {\n this._logger.info(...args)\n }\n\n /**\n * Logs a trace message with timestamp and logger name if trace logging is enabled.\n * @param {...any} args - Data to be logged as trace message.\n */\n _trace (...args) {\n this._logger.trace(...args)\n }\n}\n","const DefaultConfig = { // 6x fromat\n appenders: {\n out: { type: 'console' }\n },\n categories: {\n default: { appenders: ['out'], level: 'error' }\n }\n}\n\nexport default DefaultConfig\n\nexport { DefaultConfig }\n","// internal\nimport { TypeAssert } from '@creejs/commons-lang'\n// owned\n// eslint-disable-next-line no-unused-vars\nimport Logger from '../logger.js'\n// eslint-disable-next-line no-unused-vars\nimport { Level, value2Name } from '../log-level.js'\nimport LogFactory from '../log-factory.js'\n\nimport Log4jsLogger from './log4js-logger.js'\nimport DefaultConfig from './log4js-6x-config.js'\n\nconst { assertString } = TypeAssert\n\n/**\n * Use log4js as the logging provider.\n */\nexport default class Log4jsFactory extends LogFactory {\n /**\n * the log4js module instance.\n * @returns {{}} The log4js module instance.\n */\n get log4js () {\n return this._libraryModule\n }\n\n get setting () {\n if (this._setting == null) {\n this._setting = cloneDefaultConfig()\n }\n return this._setting\n }\n\n /**\n * Initializes the log4js provider by configuring it with the provided settings.\n * @override\n */\n init () {\n // @ts-ignore\n this.log4js.configure(this.setting)\n }\n\n /**\n * Update factory's Log Level\n * 1. Only Provider knows how to update\n * @param {number} level - The log level to set, see {@link LogLevel.Level}\n * @returns {void}\n * @throws {Error} Throws an error as this method is Not Impled Yet.\n * @abstract\n */\n setLevel (level) {\n let levelName = value2Name(level)\n if (levelName == null) {\n throw new Error(`Invalid log level: ${level}`)\n }\n levelName = levelName.toLowerCase()\n let updated = false\n // @ts-ignore\n const { categories } = this.setting\n for (const categoryKey in categories) {\n const category = categories[categoryKey]\n const { level: categoryLevel } = category\n if (categoryLevel !== levelName) {\n category.level = levelName.toLowerCase()\n updated = true\n }\n }\n // init log4js again\n updated && this.init()\n }\n\n /**\n * Creates a new logger instance with the specified name and log level.\n * @param {string} loggerName - The name of the logger to create.\n * @returns {Logger} A new logger instance configured with the given name and level.\n * @override\n */\n createLogger (loggerName) {\n assertString(loggerName)\n // @ts-ignore\n const nativeLogger = this.log4js.getLogger(loggerName)\n const logger = new Log4jsLogger(loggerName, nativeLogger)\n return logger\n }\n}\n\nfunction cloneDefaultConfig () {\n return JSON.parse(JSON.stringify(DefaultConfig))\n}\n","// internal\nimport { TypeAssert } from '@creejs/commons-lang'\n\n// owned\nimport ProviderType from '../provider-type.js'\nimport Provider from '../provider.js'\nimport Log4jsFactory from './log4js-factory.js'\n\nconst { assertNotNil } = TypeAssert\n\nexport default class Log4jsProvider extends Provider {\n /**\n * Gets the provider type (Log4js).\n * @returns {string} \"LOG4JS\"\n * @override\n */\n getType () {\n return ProviderType.Log4js\n }\n\n /**\n * Creates a new Provider instance.\n * @param {*} libraryModule - The library module to be used.\n * @param {*} setting - Configuration settings for the provider.\n * @returns {Log4jsFactory} A new instance of Log4jsFactory.\n * @override\n */\n createLogFactory (libraryModule, setting) {\n assertNotNil(libraryModule)\n const factory = new Log4jsFactory(libraryModule, setting)\n factory.init()\n return factory\n }\n}\n","// internal\n\n// owned\nimport Log4jsProvider from './log4js-provider.js'\n\n// module vars\nconst log4jsProvider = new Log4jsProvider()\nexport default log4jsProvider\n","/**\n * @module CommonsLogging\n * @description Common logging library\n *\n * Follow the sequence to init log system: addProvider() -> use() -> configure() -> getLogger()\n * 1. Add ability to handle the type of library\n * * eg. after adding Log4jsProvider, we can use Log4js library\n * 2. But we MAY NOT use it now.\n * * call useProvider(typeName) to select which kind of LogProvider Implementation to use.\n * * call configure(typeName, nativeLib, setting) to LogProvider Implementation\n */\n// 3rd\n// internal\nimport { TypeAssert, TypeUtils } from '@creejs/commons-lang'\n// owned\nimport LogFactory from './log-factory.js'\nimport Logger from './logger.js'\nimport ProviderType from './provider-type.js'\nimport LogLevel from './log-level.js'\nimport LogConfig from './log-config.js'\n\nimport ConsoleProvider from './console/index.js'\nimport Log4jsProvider from './log4js/index.js'\nimport Provider from './provider.js'\n\nconst { assertNotNil, assertString } = TypeAssert\nconst { isFunction, isNil } = TypeUtils\n\n/**\n * \"default\" export to support \"import CommonsLogging from '@creejs/commons-logging'\"\n */\nexport default {\n Provider,\n LogFactory,\n Logger,\n LogLevel,\n ProviderType,\n getLogger,\n setLevel,\n useProvider,\n /**\n * alias for {@link CommonsLogging.useProvider}\n * @see {@link CommonsLogging.useProvider}\n * @function\n * @alias module:CommonsLogging.use\n */\n use: useProvider,\n configureProvider,\n /**\n * @function\n * @alias module:CommonsLogging.confiure\n */\n configure: configureProvider,\n configureThenUseProvider,\n /**\n * @function\n * @alias module:CommonsLogging.configureThenUseProvider\n */\n configureThenUse: configureThenUseProvider,\n addProvider,\n add: addProvider,\n clearProviders,\n currentProvider,\n /**\n * @function\n * @alias module:CommonsLogging.current\n */\n current: currentProvider,\n removeProvider,\n /**\n * @function\n * @alias module:CommonsLogging.remove\n */\n remove: removeProvider,\n /**\n * @alias module:CommonsLogging.ConsoleProvider\n */\n ConsoleProvider,\n /**\n * @alias module:CommonsLogging.Log4jsProvider\n */\n Log4jsProvider\n}\n/**\n * \"named\" export to support\n * 1. import { getLogger, ... } from '@creejs/commons-logging'\n * 2. import * as CommonsLogging from '@creejs/commons-logging'\n */\nexport { Provider }\nexport { LogFactory }\nexport { Logger }\nexport { LogLevel }\nexport { ProviderType }\nexport { getLogger }\nexport { setLevel }\nexport { useProvider }\nexport { useProvider as use }\nexport { configureProvider }\nexport { configureProvider as configure }\nexport { configureThenUseProvider }\nexport { configureThenUseProvider as configureThenUse }\nexport { addProvider }\nexport { addProvider as add }\nexport { clearProviders }\nexport { currentProvider }\nexport { currentProvider as current }\nexport { removeProvider }\nexport { removeProvider as remove }\nexport { ConsoleProvider }\nexport { Log4jsProvider }\n\n// module vars\n\n/**\n * Store Created Loggers, indexed with Names\n * @type {Map<string, Logger>}\n * @private\n */\nconst name2Logger = new Map()\n\n/**\n * set Global logging level\n * @param {'TRACE'|'DEBUG'|'INFO'|'WARN'|'ERROR'|'FATAL'|'OFF'|'trace'|'debug'|'info'|'warn'|'error'|'fatal'|'off'} level - The log level\n */\nfunction setLevel (level) {\n assertString(level)\n const upperLevel = level.toUpperCase()\n const levelNumber = LogLevel.name2Value(upperLevel)\n if (levelNumber == null) {\n throw new Error(`Invalid log level: ${level}`)\n }\n if (levelNumber === LogConfig.currentLevel) {\n return // no change\n }\n LogConfig.currentLevel = levelNumber\n\n // refresh existed factories\n // @ts-ignore\n // eslint-disable-next-line no-unused-vars\n for (const [typeName, factory] of LogConfig.listFactories()) {\n factory.setLevel(levelNumber)\n }\n // refresh existed Loggers\n for (const logger of name2Logger.values()) {\n if (logger.level !== levelNumber) {\n logger.setLevel(levelNumber)\n }\n }\n}\n\nfunction currentProvider () {\n return LogConfig.currentProvider\n}\n\n/**\n * Set the provider using currently\n * @param {stri