diff --git a/cc.js b/cc.js new file mode 100644 index 0000000..0fe2d53 --- /dev/null +++ b/cc.js @@ -0,0 +1,85 @@ +const util = require('util') + +function deepStringify (args = []) { + if (globalThis.process?.release?.name === 'node') { + return globalThis.wo?.envar?.logDeep ? util.inspect(args, { showHidden: false, depth: null, colors: typeof globalThis.wo?.envar?.logColor === 'undefined' ? true : globalThis.wo?.envar?.logColor }) : args // JSON.stringify(args, null, 2) // in nodejs console, object only shows children of depth < 3 by default. 如果要完整数据,就要进行扩展。 + } else if (globalThis.uni && globalThis.UniApp) { + // 可再分为 web 和 app,通过 #ifdef 或 globalThis.window/location 判断 + return globalThis.wo?.envar?.logDeep ? util.inspect(args, { showHidden: false, depth: null, colors: typeof globalThis.wo?.envar?.logColor === 'undefined' ? true : globalThis.wo?.envar?.logColor }) : args // in browser console, object is expandable by default. + } else if (globalThis.uniCloud) { + return args + } else { + return args + } +} + +function routeNow () { + if (globalThis.process?.release?.name === 'node') { + return {} // { _from: routeNow.caller.name } // new Error().stack?.split('\n') , .match(/at (.*?) /g)[2] + } else if (globalThis.uni && globalThis.UniApp) { + return { _from: globalThis.getCurrentPages?.()?.pop?.()?.route?.substring?.(6) || 'VueApp' } + } else { + return {} + } +} + +function expandArgs (args) { + if (args.length > 1) { + return { _args: args } + } else if (typeof args[0] === 'object') { + return args[0] + } else { + return { _arg: args[0] } + } +} + +module.exports = +{ + cclog (...args) { + console.log(deepStringify({ + _at: new Date().toJSON(), + _type: 'CLOG', // arguments.callee.name doesn't work in nodejs strict mode + ...routeNow(), + ...expandArgs(args) + })) + globalThis.UniApp || console.log(',') + }, + ccinfo (...args) { + console.info(deepStringify({ + _at: new Date().toJSON(), + _type: 'CINFO', + ...routeNow(), + ...expandArgs(args) + })) + globalThis.UniApp || console.log(',') + }, + ccwarn (...args) { + console.warn(deepStringify({ + _at: new Date().toJSON(), + _type: 'CWARN', + ...routeNow(), + ...expandArgs(args) + })) + globalThis.UniApp || console.log(',') + }, + ccerror (...args) { + console.error(deepStringify({ + _at: new Date().toJSON(), + _type: 'CERROR', + ...routeNow(), + ...expandArgs(args) + })) + globalThis.UniApp || console.log(',') + }, + ccdebug (...args) { + if (process.env.NODE_ENV !== 'production') { + console.debug(deepStringify({ + _at: new Date().toJSON(), + _type: 'CDEBUG', + ...routeNow(), + ...expandArgs(args) + })) + globalThis.UniApp || console.log(',') + } + } +} diff --git a/coco-app.js b/coco-app.js new file mode 100644 index 0000000..4df0d00 --- /dev/null +++ b/coco-app.js @@ -0,0 +1,8 @@ +module.exports = { + cclog () { }, + ccinfo () { }, + ccgood () { }, + ccwarn () { }, + ccerror () { }, + ccdebug () { } +} \ No newline at end of file diff --git a/coco-browser.js b/coco-browser.js new file mode 100644 index 0000000..a17857d --- /dev/null +++ b/coco-browser.js @@ -0,0 +1,56 @@ +function routeNow () { + const pageNow = globalThis.getCurrentPages()[globalThis.getCurrentPages().length - 1] + return pageNow?.route || 'VueApp' +} + +function deepStringify (args = []) { + return JSON.stringify(args, null, 2) // used in web browser console, to avoid clicking to expand by hand. +} + +module.exports = +{ + cclog (...args) { + console.log( + `%c ${new Date().toJSON()} [LOG] ${routeNow()}`, + 'background: #808080; border-radius: 0.5em;color: white; font-weight: bold; padding: 2px 0.5em;', + deepStringify(args) + ) + }, + ccinfo (...args) { + console.info( + `%c ${new Date().toJSON()} [INFO] ${routeNow()}`, + 'background: #0000ff; border-radius: 0.5em;color: white; font-weight: bold; padding: 2px 0.5em;', + deepStringify(args) + ) + }, + ccgood (...args) { + console.info( + `%c ${new Date().toJSON()} [GOOD] ${routeNow()}`, + 'background: #2ecc71; border-radius: 0.5em;color: white; font-weight: bold; padding: 2px 0.5em;', + deepStringify(args) + ) + }, + ccwarn (...args) { + console.warn( + `%c ${new Date().toJSON()} [WARN] ${routeNow()}`, + 'background: #f39c12; border-radius: 0.5em;color: white; font-weight: bold; padding: 2px 0.5em;', + deepStringify(args) + ) + }, + ccerror (...args) { + console.error( + `%c ${new Date().toJSON()} [ERROR] ${routeNow()}`, + 'background: #c0392b; border-radius: 0.5em;color: white; font-weight: bold; padding: 2px 0.5em;', + deepStringify(args) + ) + }, + ccdebug (...args) { + if (process.env.NODE_ENV !== 'production') { + console.debug( + `%c ${new Date().toJSON()} [DEBUG] ${routeNow()}`, + 'background: purple; border-radius: 0.5em;color: white; font-weight: bold; padding: 2px 0.5em;', + deepStringify(args) + ) + } + }, +} diff --git a/coco-nodejs.js b/coco-nodejs.js new file mode 100644 index 0000000..15c2fcc --- /dev/null +++ b/coco-nodejs.js @@ -0,0 +1,53 @@ +// colors only works in nodejs cli +// consola works in nodejs and browser +// chalk 和 colors 用法类似。 + +const util = require('util') +const colors = require('colors') + +function deepInspect (args = [], colors = false) { + return args.map((arg) => util.inspect(arg, { showHidden: false, depth: null, colors })) // 如果用这个方案,在下面的方法里就要用 ...deepInspect(args) 否则会显示成一整字符串 +} + +module.exports = +{ + // 后台服务器命令行。注意如果输出重定向到文件里,会有 ESC[34m2023-10-07T12:32:00.915ZESC[39m 这样的特殊标识。 + // 在 pm2 里,为了防止特殊标志,可用 --no-color + cclog (...args) { + console.log(colors.bgWhite(new Date().toJSON()), colors.bgBlue('[LOG]'), ...deepInspect(args, true)) + }, + ccinfo (...args) { + console.info(colors.bgWhite(new Date().toJSON()), colors.bgBlue('[INFO]'), ...deepInspect(args, true)) + }, + ccgood (...args) { + console.info(colors.bgWhite(new Date().toJSON()), colors.bgGreen('[GOOD]'), ...deepInspect(args, true)) + }, + ccwarn (...args) { + // console.warn will appear in pm2's error log + console.warn(colors.bgWhite(new Date().toJSON()), colors.bgYellow('[WARN]'), ...deepInspect(args, true)) + }, + ccerror (...args) { + // console.error will appear in pm2's error log + console.error(colors.bgWhite(new Date().toJSON()), colors.bgRed('[ERROR]'), ...deepInspect(args, true)) + }, + ccdebug (...args) { + if ('production' !== process.env.NODE_ENV) { + // 在server的测试环境下. 注意在 uniCloud 环境下,`process.env.NODE_ENV` 不存在. 如要应用本方法,需要手动设置 `process.env.NODE_ENV` + console.log(colors.rainbow(new Date().toJSON()), colors.rainbow('[DEBUG]'), ...deepInspect(args, true)) + } + }, + ccinput (headers, path, indata) { + console.log(colors.bgWhite(new Date().toJSON()), colors.bgCyan('[Headers]'), colors.cyan(headers)) + console.info(colors.bgWhite(new Date().toJSON()), colors.bgBrightBlue(`[INDATA] ${path}`), colors.brightBlue(util.inspect(indata, { showHidden: false, depth: null, colors: false }))) // 已经被 colors.xxx 进行上色了 + }, + ccoutput (path, outdata) { + console.log(colors.bgWhite(new Date().toJSON()), colors.bgGreen(`[OUTDATA] ${path}`), colors.green(util.inspect(outdata, { showHidden: false, depth: null, colors: false }))) // 已经被 colors.xxx 进行上色了 + }, + ccexcept (path, error) { + outdata = { _state: 'WOBASE_EXCEPTION', error } + console.error(colors.bgWhite(new Date().toJSON()), colors.bgRed(`[EXCEPTION] ${path}`), colors.red(util.inspect(outdata, { showHidden: false, depth: null, colors: true }))) + }, + ccunknown (path) { + console.warn(colors.bgWhite(new Date().toJSON()), colors.bgYellow(`[UNKNOWN] ${path}`), colors.yellow({ _state: 'WOBASE_API_UNKNOWN', response: 401 })) + } +} diff --git a/coco-unicloud.js b/coco-unicloud.js new file mode 100644 index 0000000..50f499d --- /dev/null +++ b/coco-unicloud.js @@ -0,0 +1,31 @@ +function deepStringify (args = []) { + return JSON.stringify(args, null, 2) // used in web browser console, to avoid clicking to expand by hand. +} + +module.exports = { + // HBuilder 内置环境的 云空间 console 不支持颜色。为了检查是否支持颜色,测试 uniCloud 是否存在(不存在说明在自己的server环境里), + // 或 require('supports-color'),相应的返回不同的函数。 + cclog (...args) { + console.log(new Date().toJSON(), '[LOG]', deepStringify(args)) + }, + ccinfo (...args) { + console.info(new Date().toJSON(), '[INFO]', deepStringify(args)) + }, + ccgood (...args) { + console.info(new Date().toJSON(), '[GOOD]', deepStringify(args)) + }, + ccwarn (...args) { + // console.warn will appear in pm2's error log + console.warn(new Date().toJSON(), '[WARN]', deepStringify(args)) + }, + ccerror (...args) { + // console.error will appear in pm2's error log + console.error(new Date().toJSON(), '[ERROR]', deepStringify(args)) + }, + ccdebug (...args) { + if ('production' !== process.env.NODE_ENV) { + // 在server的测试环境下. 注意在 uniCloud 环境下,`process.env.NODE_ENV` 不存在. 如要应用本方法,需要手动设置 `process.env.NODE_ENV` + console.log(new Date().toJSON(), '[DEBUG]', deepStringify(args)) + } + }, +} \ No newline at end of file diff --git a/coco.js b/coco.js index fb69527..aad1e89 100644 --- a/coco.js +++ b/coco.js @@ -2,135 +2,12 @@ // consola works in nodejs and browser // chalk 和 colors 用法类似。 -const util = require('util') -const colors = require('colors') +// in uniapp: globalThis.uni && globalThis.UniApp +// in vue: globalThis.getApp?.()?.constructor?.name === 'Vue' -function routeNow () { - const pageNow = globalThis.getCurrentPages()[globalThis.getCurrentPages().length - 1] - return pageNow?.route || 'VueApp' -} - -function deepInspect (args = [], colors = false) { - return args.map((arg) => util.inspect(arg, { showHidden: false, depth: null, colors })) -} module.exports = - globalThis.uni && globalThis.UniApp // && globalThis.getApp?.()?.constructor?.name === 'Vue' - ? { - // 客户端 uniapp - cclog (...args) { - console.log( - `%c ${new Date().toJSON()} [LOG] ${routeNow()}`, - 'background: #808080; border-radius: 0.5em;color: white; font-weight: bold; padding: 2px 0.5em;', - ...deepInspect(args) - ) - }, - ccinfo (...args) { - console.info( - `%c ${new Date().toJSON()} [INFO] ${routeNow()}`, - 'background: #0000ff; border-radius: 0.5em;color: white; font-weight: bold; padding: 2px 0.5em;', - ...deepInspect(args) - ) - }, - ccgood (...args) { - console.info( - `%c ${new Date().toJSON()} [GOOD] ${routeNow()}`, - 'background: #2ecc71; border-radius: 0.5em;color: white; font-weight: bold; padding: 2px 0.5em;', - ...deepInspect(args) - ) - }, - ccwarn (...args) { - console.warn( - `%c ${new Date().toJSON()} [WARN] ${routeNow()}`, - 'background: #f39c12; border-radius: 0.5em;color: white; font-weight: bold; padding: 2px 0.5em;', - ...deepInspect(args) - ) - }, - ccerror (...args) { - console.error( - `%c ${new Date().toJSON()} [ERROR] ${routeNow()}`, - 'background: #c0392b; border-radius: 0.5em;color: white; font-weight: bold; padding: 2px 0.5em;', - ...deepInspect(args) - ) - }, - ccdebug (...args) { - if (process.env.NODE_ENV !== 'production') { - console.debug( - `%c ${new Date().toJSON()} [DEBUG] ${routeNow()}`, - 'background: #ff0000; border-radius: 0.5em;color: white; font-weight: bold; padding: 2px 0.5em;', - ...deepInspect(args) - ) - } - }, - } - : typeof uniCloud !== 'undefined' - ? { - // uniCloud 云空间 - // HBuilder 内置环境的 console 不支持颜色。为了检查是否支持颜色,测试 uniCloud 是否存在(不存在说明在自己的server环境里), - // 或 require('supports-color'),相应的返回不同的函数。 - cclog (...args) { - console.log(new Date().toJSON(), '[LOG]', ...deepInspect(args)) - }, - ccinfo (...args) { - console.info(new Date().toJSON(), '[INFO]', ...deepInspect(args)) - }, - ccgood (...args) { - console.info(new Date().toJSON(), '[GOOD]', ...deepInspect(args)) - }, - ccwarn (...args) { - // console.warn will appear in pm2's error log - console.warn(new Date().toJSON(), '[WARN]', ...deepInspect(args)) - }, - ccerror (...args) { - // console.error will appear in pm2's error log - console.error(new Date().toJSON(), '[ERROR]', ...deepInspect(args)) - }, - ccdebug (...args) { - if ('production' !== process.env.NODE_ENV) { - // 在server的测试环境下. 注意在 uniCloud 环境下,`process.env.NODE_ENV` 不存在. 如要应用本方法,需要手动设置 `process.env.NODE_ENV` - console.log(new Date().toJSON(), '[DEBUG]', ...deepInspect(args)) - } - }, - } - : { - // 后台服务器命令行。注意如果输出重定向到文件里,会有 ESC[34m2023-10-07T12:32:00.915ZESC[39m 这样的特殊标识。 - // 在 pm2 里,为了防止特殊标志,可用 --no-color - cclog (...args) { - console.log(colors.bgWhite(new Date().toJSON()), colors.bgBlue('[LOG]'), ...deepInspect(args, true)) - }, - ccinfo (...args) { - console.info(colors.bgWhite(new Date().toJSON()), colors.bgBlue('[INFO]'), ...deepInspect(args, true)) - }, - ccgood (...args) { - console.info(colors.bgWhite(new Date().toJSON()), colors.bgGreen('[GOOD]'), ...deepInspect(args, true)) - }, - ccwarn (...args) { - // console.warn will appear in pm2's error log - console.warn(colors.bgWhite(new Date().toJSON()), colors.bgYellow('[WARN]'), ...deepInspect(args, true)) - }, - ccerror (...args) { - // console.error will appear in pm2's error log - console.error(colors.bgWhite(new Date().toJSON()), colors.bgRed('[ERROR]'), ...deepInspect(args, true)) - }, - ccdebug (...args) { - if ('production' !== process.env.NODE_ENV) { - // 在server的测试环境下. 注意在 uniCloud 环境下,`process.env.NODE_ENV` 不存在. 如要应用本方法,需要手动设置 `process.env.NODE_ENV` - console.log(colors.rainbow(new Date().toJSON()), colors.rainbow('[DEBUG]'), ...deepInspect(args, true)) - } - }, - ccinput (headers, path, indata) { - console.log(colors.bgWhite(new Date().toJSON()), colors.bgCyan('[Headers]'), colors.cyan(headers)) - console.info(colors.bgWhite(new Date().toJSON()), colors.bgBrightBlue(`[INDATA] ${path}`), colors.brightBlue(util.inspect(indata, { showHidden: false, depth: null, colors: false }))) // 已经被 colors.xxx 进行上色了 - }, - ccoutput (path, outdata) { - console.log(colors.bgWhite(new Date().toJSON()), colors.bgGreen(`[OUTDATA] ${path}`), colors.green(util.inspect(outdata, { showHidden: false, depth: null, colors: false }))) // 已经被 colors.xxx 进行上色了 - }, - ccexcept (path, error) { - outdata = { _state: 'WOBASE_EXCEPTION', error } - console.error(colors.bgWhite(new Date().toJSON()), colors.bgRed(`[EXCEPTION] ${path}`), colors.red(util.inspect(outdata, { showHidden: false, depth: null, colors: true }))) - }, - ccunknown (path) { - console.warn(colors.bgWhite(new Date().toJSON()), colors.bgYellow(`[UNKNOWN] ${path}`), colors.yellow({ _state: 'WOBASE_API_UNKNOWN', response: 401 })) - } - - } + process?.release?.name === 'node' ? require('./coco-nodejs.js') + : globalThis.window && globalThis.location ? require('./coco-browser.js') + : globalThis.uniCloud ? require('./coco-unicloud.js') + : require('./coco-app.js') diff --git a/package.json b/package.json index d57effc..c96ee6a 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "wo-core-coco", "version": "1.0.0", "description": "", - "main": "coco.js", + "main": "cc.js", "scripts": {}, "author": "", "license": "ISC",