@percy/logger
Advanced tools
Comparing version 1.1.0 to 1.1.1
@@ -1,16 +0,6 @@ | ||
import Logger from '#logger'; | ||
import Logger from './logger.js'; | ||
export function logger(name) { | ||
return new Logger().group(name); | ||
} | ||
Object.assign(logger, { | ||
format: (...args) => new Logger().format(...args), | ||
query: (...args) => new Logger().query(...args), | ||
connect: (...args) => new Logger().connect(...args), | ||
remote: (...args) => new Logger().remote(...args), | ||
loglevel: (...args) => new Logger().loglevel(...args) | ||
}); | ||
Object.defineProperties(logger, { | ||
Logger: { | ||
get: () => Logger | ||
}, | ||
stdout: { | ||
@@ -21,4 +11,19 @@ get: () => Logger.stdout | ||
get: () => Logger.stderr | ||
}, | ||
constructor: { | ||
get: () => Logger | ||
}, | ||
instance: { | ||
get: () => new Logger() | ||
}, | ||
query: { | ||
value: (...args) => logger.instance.query(...args) | ||
}, | ||
format: { | ||
value: (...args) => logger.instance.format(...args) | ||
}, | ||
loglevel: { | ||
value: (...args) => logger.instance.loglevel(...args) | ||
} | ||
}); | ||
export default logger; |
@@ -161,9 +161,2 @@ import { colors } from './utils.js'; | ||
this.log(debug, 'warn', `Warning: ${message}`, meta); | ||
} // Returns true if a socket is present and ready | ||
get isRemote() { | ||
var _this$socket; | ||
return ((_this$socket = this.socket) === null || _this$socket === void 0 ? void 0 : _this$socket.readyState) === 1; | ||
} // Generic log method accepts a debug group, log level, log message, and optional meta | ||
@@ -174,24 +167,8 @@ // information to store with the message and other info | ||
log(debug, level, message, meta = {}) { | ||
// message might be an error object | ||
let isError = typeof message !== 'string' && (level === 'error' || level === 'debug'); | ||
let error = isError && message; // if remote, send logs there | ||
// message might be an error-like object | ||
let err = typeof message !== 'string' && (level === 'debug' || level === 'error'); | ||
err && (err = message.message ? Error.prototype.toString.call(message) : message.toString()); // save log entries | ||
if (this.isRemote) { | ||
// serialize error messages | ||
message = isError && 'stack' in error ? { | ||
message: error.message, | ||
stack: error.stack | ||
} : message; | ||
return this.socket.send(JSON.stringify({ | ||
log: [debug, level, message, { | ||
remote: true, | ||
...meta | ||
}] | ||
})); | ||
} // ensure the message is a string | ||
message = isError && message.stack || message.message || message.toString(); // timestamp each log | ||
let timestamp = Date.now(); | ||
message = err ? message.stack || err : message.toString(); | ||
let entry = { | ||
@@ -207,5 +184,5 @@ debug, | ||
if (this.shouldLog(debug, level)) { | ||
if (err && this.level !== 'debug') message = err; | ||
let elapsed = timestamp - (this.lastlog || timestamp); | ||
if (isError && this.level !== 'debug') message = error.toString(); | ||
this.write(level, this.format(debug, error ? 'error' : level, message, elapsed)); | ||
this.write(level, this.format(debug, err ? 'error' : level, message, elapsed)); | ||
this.lastlog = timestamp; | ||
@@ -224,99 +201,5 @@ } | ||
let progress = stdout.isTTY && this._progress; | ||
if (progress) { | ||
stdout.cursorTo(0); | ||
stdout.clearLine(); | ||
} | ||
if (progress) stdout.cursorTo(0).clearLine(); | ||
(level === 'info' ? stdout : stderr).write(message + '\n'); | ||
if (!((_this$_progress = this._progress) !== null && _this$_progress !== void 0 && _this$_progress.persist)) delete this._progress;else if (progress) stdout.write(progress.message); | ||
} // Opens a socket logging connection | ||
connect(socket) { | ||
// send logging environment info | ||
let PERCY_DEBUG = process.env.PERCY_DEBUG; | ||
let PERCY_LOGLEVEL = process.env.PERCY_LOGLEVEL || this.loglevel(); | ||
socket.send(JSON.stringify({ | ||
env: { | ||
PERCY_DEBUG, | ||
PERCY_LOGLEVEL | ||
} | ||
})); // attach remote logging handler | ||
socket.onmessage = ({ | ||
data | ||
}) => { | ||
let { | ||
log, | ||
logAll | ||
} = JSON.parse(data); | ||
if (logAll) logAll.forEach(e => this.messages.add(e)); | ||
if (log) this.log(...log); | ||
}; // return a cleanup function | ||
return () => { | ||
socket.onmessage = null; | ||
}; | ||
} // Connects to a remote logger | ||
async remote(createSocket, timeout = 1000) { | ||
if (this.isRemote) return; // if not already connected, wait until the timeout | ||
let err = await new Promise(resolve => { | ||
let done = event => { | ||
if (timeoutid == null) return; | ||
timeoutid = clearTimeout(timeoutid); | ||
if (this.socket) this.socket.onopen = this.socket.onerror = null; | ||
resolve((event === null || event === void 0 ? void 0 : event.error) || (event === null || event === void 0 ? void 0 : event.type) === 'error' && 'Error: Socket connection failed'); | ||
}; | ||
let timeoutid = setTimeout(done, timeout, { | ||
error: 'Error: Socket connection timed out' | ||
}); | ||
Promise.resolve().then(async () => { | ||
this.socket = await createSocket(); | ||
if (this.isRemote) return done(); | ||
this.socket.onopen = this.socket.onerror = done; | ||
}).catch(error => done({ | ||
error | ||
})); | ||
}); // there was an error connecting, will fallback to normal logging | ||
if (err) { | ||
this.log('logger', 'debug', 'Unable to connect to remote logger'); | ||
this.log('logger', 'debug', err); | ||
return; | ||
} // send any messages already logged in this environment | ||
if (this.messages.size) { | ||
this.socket.send(JSON.stringify({ | ||
logAll: Array.from(this.messages).map(entry => ({ ...entry, | ||
meta: { | ||
remote: true, | ||
...entry.meta | ||
} | ||
})) | ||
})); | ||
} // attach an incoming message handler | ||
this.socket.onmessage = ({ | ||
data | ||
}) => { | ||
let { | ||
env | ||
} = JSON.parse(data); // update local environment info | ||
if (env) Object.assign(process.env, env); | ||
}; // return a cleanup function | ||
return () => { | ||
this.socket.onmessage = null; | ||
this.socket = null; | ||
}; | ||
} | ||
@@ -323,0 +206,0 @@ |
{ | ||
"name": "@percy/logger", | ||
"version": "1.1.0", | ||
"version": "1.1.1", | ||
"license": "MIT", | ||
@@ -18,7 +18,5 @@ "repository": { | ||
"dist", | ||
"test/helpers.js", | ||
"test/client.js" | ||
"test/helpers.js" | ||
], | ||
"main": "./dist/index.js", | ||
"browser": "./dist/bundle.js", | ||
"type": "module", | ||
@@ -31,8 +29,2 @@ "exports": { | ||
}, | ||
"imports": { | ||
"#logger": { | ||
"node": "./dist/logger.js", | ||
"default": "./dist/browser.js" | ||
} | ||
}, | ||
"scripts": { | ||
@@ -44,8 +36,3 @@ "build": "node ../../scripts/build", | ||
}, | ||
"rollup": { | ||
"output": { | ||
"name": "PercyLogger" | ||
} | ||
}, | ||
"gitHead": "bf551295a8a618502bb2db92ff302e19dc956b51" | ||
"gitHead": "d74af6a294f89fcb23c4ec598bb68a884ce47907" | ||
} |
@@ -36,12 +36,11 @@ import logger from '@percy/logger'; | ||
const { | ||
Logger, | ||
loglevel | ||
} = logger; | ||
const helpers = { | ||
stdout: [], | ||
stderr: [], | ||
loglevel, | ||
loglevel: logger.loglevel, | ||
get instance() { | ||
return logger.instance; | ||
}, | ||
async mock(options = {}) { | ||
@@ -51,7 +50,7 @@ helpers.reset(); | ||
if (options.level) { | ||
loglevel(options.level); | ||
logger.loglevel(options.level); | ||
} | ||
if (process.env.__PERCY_BROWSERIFIED__) { | ||
spy(Logger.prototype, 'write', function(lvl, msg) { | ||
spy(logger.constructor.prototype, 'write', function(lvl, msg) { | ||
let stdio = lvl === 'info' ? 'stdout' : 'stderr'; | ||
@@ -69,8 +68,7 @@ helpers[stdio].push(sanitizeLog(msg, options)); | ||
for (let stdio of ['stdout', 'stderr']) { | ||
Logger[stdio] = Object.assign(new Writable(), { | ||
logger.constructor[stdio] = Object.assign(new Writable(), { | ||
isTTY: options.isTTY, | ||
columns: options.isTTY ? 100 : null, | ||
isTTY: options.isTTY, | ||
cursorTo() {}, | ||
clearLine() {}, | ||
cursorTo() { return this; }, | ||
clearLine() { return this; }, | ||
_write(chunk, encoding, callback) { | ||
@@ -86,4 +84,4 @@ helpers[stdio].push(sanitizeLog(chunk.toString(), options)); | ||
reset(soft) { | ||
if (soft) loglevel('info'); | ||
else delete Logger.instance; | ||
if (soft) logger.loglevel('info'); | ||
else delete logger.constructor.instance; | ||
@@ -101,3 +99,3 @@ helpers.stdout.length = 0; | ||
dump() { | ||
let msgs = Array.from((Logger.instance && Logger.instance.messages) || []); | ||
let msgs = Array.from(logger.instance.messages); | ||
if (!msgs.length) return; | ||
@@ -104,0 +102,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
6
15132
7
302
1