Comparing version 1.0.0 to 1.1.0
@@ -1,94 +0,5 @@ | ||
import { debugFactory, type DebuggerExtension, type ExtendedDebugger, type InternalDebugger, type UnextendableInternalDebugger } from '@-xun/debug'; | ||
import { LoggerType, type ExtendedLogger } from "./internal.js"; | ||
import { type ExtendedDebugger } from '@-xun/debug'; | ||
export { LoggerType, type ExtendedDebugger, type ExtendedLogger }; | ||
/** | ||
* These color codes correspond to a reddish color on the console. | ||
* https://gist.github.com/JBlond/2fea43a3049b38287e5e9cefc87b2124?permalink_comment_id=4481079#gistcomment-4481079 | ||
*/ | ||
export declare const ansiRedColorCodes: number[]; | ||
export declare const ansiOrangeColorCodes: number[]; | ||
export { debugFactory as extendedDebugFactory, type ExtendedDebugger }; | ||
/** | ||
* An enum representing the types of loggers classified by output target. | ||
*/ | ||
export declare enum LoggerType { | ||
All = "all", | ||
GenericOutput = "logger", | ||
DebugOnly = "debugger", | ||
} | ||
/** | ||
* @internal | ||
*/ | ||
export type WithExtendedParameters<T extends (...args: any[]) => any, Optional = true> = Optional extends true ? [tags?: string[], ...Parameters<T>] : [tags: string[], ...Parameters<T>]; | ||
/** | ||
* @internal | ||
*/ | ||
export type WithTagSupport<T extends (...args: any[]) => any, Optional = true> = ((...args: WithExtendedParameters<T, Optional>) => ReturnType<T> | undefined) & { [P in keyof T]: T[P] }; | ||
/** | ||
* @internal | ||
*/ | ||
export type ExtendedLoggerParameters = WithExtendedParameters<ExtendedDebugger, false>; | ||
/** | ||
* An instance of {@link UnextendableInternalDebugger} that that belongs to an | ||
* {@link ExtendedLogger}. | ||
*/ | ||
export interface UnextendableInternalLogger extends UnextendableInternalDebugger { | ||
/** | ||
* Send an optionally-formatted message to output. | ||
*/ | ||
(...args: Parameters<ExtendedDebugger>): ReturnType<ExtendedDebugger>; | ||
/** | ||
* Send a tagged optionally-formatted message to output. | ||
*/ | ||
(...args: ExtendedLoggerParameters): ReturnType<ExtendedDebugger>; | ||
} | ||
/** | ||
* A wrapper around {@link ExtendedDebugger } representing the extension from | ||
* mere "debug" logger to general purpose "logger". | ||
*/ | ||
export interface ExtendedLogger extends _ExtendedLogger<ExtendedLogger> { | ||
/** | ||
* Send an optionally-formatted message to output. | ||
*/ | ||
(...args: Parameters<ExtendedDebugger>): ReturnType<ExtendedDebugger>; | ||
/** | ||
* Send a tagged optionally-formatted message to output. | ||
*/ | ||
(...args: ExtendedLoggerParameters): ReturnType<ExtendedDebugger>; | ||
/** | ||
* Send a blank newline to output. | ||
* | ||
* `outputMethod` determines if the newline will be output via the default | ||
* output method or the alternate output method. This parameter only has an | ||
* effect when using certain logger backends and typically corresponds to | ||
* stdout (`"default"`) and stderr (`"alternate"`). | ||
*/ | ||
newline(...args: [...WithExtendedParameters<ExtendedDebugger['newline'], false>, outputMethod?: 'default' | 'alternate']): ReturnType<ExtendedDebugger['newline']>; | ||
/** | ||
* Send a blank newline to output. | ||
* | ||
* `outputMethod` determines if the newline will be output via the default | ||
* output method or the alternate output method. This parameter only has an | ||
* effect when using certain logger backends and typically corresponds to | ||
* stdout (`"default"`) and stderr (`"alternate"`). | ||
*/ | ||
newline(...args: [outputMethod?: 'default' | 'alternate']): ReturnType<ExtendedDebugger['newline']>; | ||
/** | ||
* Creates a new instance by appending `namespace` to the current logger's | ||
* namespace. | ||
*/ | ||
extend(...args: Parameters<ExtendedDebugger['extend']>): ExtendedLogger; | ||
} | ||
type _ExtendedLogger<T> = Omit<ExtendedDebugger, keyof DebuggerExtension | 'newline' | 'extend'> & DebuggerExtension<UnextendableInternalLogger, T>; | ||
/** | ||
* Keeps track of our various "logger" (i.e. debug) instances and their | ||
* associated metadata. Also keeps track of those tags for which we disable | ||
* output. | ||
* | ||
* @internal | ||
*/ | ||
export declare const metadata: { | ||
logger: (ExtendedLogger | UnextendableInternalLogger)[]; | ||
debugger: (ExtendedDebugger | UnextendableInternalDebugger)[]; | ||
denylist: Set<string>; | ||
}; | ||
/** | ||
* A string representing a single space (one space-ish character). Note that | ||
@@ -162,3 +73,3 @@ * space-ish characters will not be `trim()`'d. | ||
includeInternal?: boolean; | ||
}): (ExtendedLogger | UnextendableInternalDebugger | ExtendedDebugger)[]; | ||
}): (ExtendedLogger | import("@-xun/debug").UnextendableInternalDebugger | ExtendedDebugger)[]; | ||
/** | ||
@@ -241,51 +152,2 @@ * Disable all logger instances (coarse-grain). | ||
*/ | ||
export declare function getDisabledTags(): Set<string>; | ||
/** | ||
* A function that resets the internal logger cache. Essentially, calling this | ||
* function causes rejoinder to forget any disabled tags or loggers created | ||
* prior. | ||
* | ||
* @internal | ||
*/ | ||
export declare function resetInternalState(): void; | ||
/** | ||
* Transforms an {@link ExtendedDebugger} into an {@link ExtendedLogger}. | ||
* | ||
* @internal | ||
*/ | ||
export declare function makeExtendedLogger(extendedDebugger: ExtendedDebugger, type: Exclude<LoggerType, LoggerType.All>, | ||
/** | ||
* This function will be called with various arguments of unknown type when | ||
* default (e.g. stdout) output should be sent to the user, such as when | ||
* `::newline(...)` is called. | ||
*/ | ||
underlyingDefaultLogFn: NonNullable<InternalDebugger['log']>, | ||
/** | ||
* This function will be called with various arguments of unknown type when | ||
* alternate (e.g. stderr) output should be sent to the user, such as when | ||
* `::newline(..., 'alternate')` and `::error(...)`, `::warn(...)`, | ||
* `::message(...)`, etc are called. | ||
*/ | ||
underlyingAlternateLogFn?: NonNullable<InternalDebugger['log']>): ExtendedLogger; | ||
/** | ||
* Allows logging to be disabled via tags at the fine-grain message level. Set | ||
* `trapdoorArgLength` to the number of params necessary to trigger denylisting. | ||
* | ||
* @internal | ||
*/ | ||
export declare function decorateWithTagSupport<T extends (...args: any[]) => any>(fn: T, trapdoorArgsMinLength: number): WithTagSupport<T>; | ||
/** | ||
* Make rejoinder's internals aware of a new logger instance. | ||
* | ||
* @internal | ||
*/ | ||
export declare function withMetadataTracking(type: LoggerType.GenericOutput, logger: ExtendedLogger): ExtendedLogger; | ||
export declare function withMetadataTracking(type: LoggerType.DebugOnly, logger: ExtendedDebugger): ExtendedDebugger; | ||
export declare function withMetadataTracking(type: Exclude<LoggerType, LoggerType.All>, logger: ExtendedDebugger | ExtendedLogger): ExtendedDebugger | ExtendedLogger; | ||
/** | ||
* Recursively patches {@link ExtendedDebugger.extend} so that all debugger | ||
* instances are properly tracked. | ||
* | ||
* @internal | ||
*/ | ||
export declare function withPatchedExtend(instance: ExtendedDebugger): ExtendedDebugger; | ||
export declare function getDisabledTags(): Set<string>; |
@@ -6,6 +6,5 @@ "use strict"; | ||
}); | ||
exports.ansiRedColorCodes = exports.ansiOrangeColorCodes = exports.TAB = exports.SINGLE_SPACE = exports.SHORT_TAB = exports.LoggerType = void 0; | ||
exports.TAB = exports.SINGLE_SPACE = exports.SHORT_TAB = void 0; | ||
exports.createDebugLogger = createDebugLogger; | ||
exports.createGenericLogger = createGenericLogger; | ||
exports.decorateWithTagSupport = decorateWithTagSupport; | ||
exports.disableLoggers = disableLoggers; | ||
@@ -17,7 +16,2 @@ exports.disableLoggingByTag = disableLoggingByTag; | ||
exports.getLoggersByType = getLoggersByType; | ||
exports.makeExtendedLogger = makeExtendedLogger; | ||
exports.metadata = void 0; | ||
exports.resetInternalState = resetInternalState; | ||
exports.withMetadataTracking = withMetadataTracking; | ||
exports.withPatchedExtend = withPatchedExtend; | ||
require("core-js/modules/es.array.push.js"); | ||
@@ -34,26 +28,5 @@ require("core-js/modules/es.set.difference.v2.js"); | ||
require("core-js/modules/esnext.iterator.for-each.js"); | ||
require("core-js/modules/esnext.iterator.map.js"); | ||
require("core-js/modules/esnext.iterator.some.js"); | ||
var _nodeAssert = _interopRequireDefault(require("node:assert")); | ||
var _types = require("node:util/types"); | ||
var _internal = require("./internal.js"); | ||
exports.LoggerType = _internal.LoggerType; | ||
var _debug = require("@-xun/debug"); | ||
exports.extendedDebugFactory = _debug.debugFactory; | ||
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } | ||
const extendedLoggerFnPropsWeakMap = new WeakMap(); | ||
const ansiRedColorCodes = exports.ansiRedColorCodes = [1, 9, 52, 88, 124, 160, 196]; | ||
const ansiOrangeColorCodes = exports.ansiOrangeColorCodes = [3, 11, 94, 136, 178, 214, 220]; | ||
let LoggerType = exports.LoggerType = function (LoggerType) { | ||
LoggerType["All"] = "all"; | ||
LoggerType["GenericOutput"] = "logger"; | ||
LoggerType["DebugOnly"] = "debugger"; | ||
return LoggerType; | ||
}({}); | ||
const metadata = exports.metadata = { | ||
logger: [], | ||
debugger: [], | ||
denylist: new Set() | ||
}; | ||
const SINGLE_SPACE = exports.SINGLE_SPACE = '⠀'; | ||
const SHORT_TAB = exports.SHORT_TAB = SINGLE_SPACE.repeat(2); | ||
const TAB = exports.TAB = SINGLE_SPACE.repeat(4); | ||
const consoleLog = (...args) => { | ||
@@ -65,6 +38,9 @@ console.log(...args); | ||
}; | ||
const SINGLE_SPACE = exports.SINGLE_SPACE = '⠀'; | ||
const SHORT_TAB = exports.SHORT_TAB = SINGLE_SPACE.repeat(2); | ||
const TAB = exports.TAB = SINGLE_SPACE.repeat(4); | ||
function createGenericLogger({ | ||
namespace | ||
}) { | ||
return withMetadataTracking(LoggerType.GenericOutput, makeExtendedLogger((0, _debug.debugFactory)(namespace), LoggerType.GenericOutput, consoleLog, consoleError)); | ||
return (0, _internal.withMetadataTracking)(_internal.LoggerType.GenericOutput, (0, _internal.makeExtendedLogger)((0, _debug.debugFactory)(namespace), _internal.LoggerType.GenericOutput, consoleLog, consoleError)); | ||
} | ||
@@ -74,3 +50,3 @@ function createDebugLogger({ | ||
}) { | ||
const debug = withMetadataTracking(LoggerType.DebugOnly, withPatchedExtend((0, _debug.debugFactory)(namespace))); | ||
const debug = (0, _internal.withMetadataTracking)(_internal.LoggerType.DebugOnly, (0, _internal.withPatchedExtend)((0, _debug.debugFactory)(namespace))); | ||
debug.log = consoleError; | ||
@@ -84,7 +60,7 @@ return debug; | ||
const instances = []; | ||
if (type === LoggerType.All || type === LoggerType.GenericOutput) { | ||
instances.push(...metadata.logger); | ||
if (type === _internal.LoggerType.All || type === _internal.LoggerType.GenericOutput) { | ||
instances.push(..._internal.metadata.logger); | ||
} | ||
if (type === LoggerType.All || type === LoggerType.DebugOnly) { | ||
instances.push(...metadata.debugger); | ||
if (type === _internal.LoggerType.All || type === _internal.LoggerType.DebugOnly) { | ||
instances.push(..._internal.metadata.debugger); | ||
} | ||
@@ -120,3 +96,3 @@ return includeInternal ? instances : instances.filter(instance => 'newline' in instance); | ||
}) { | ||
tags.forEach(tag => metadata.denylist.add(tag)); | ||
tags.forEach(tag => _internal.metadata.denylist.add(tag)); | ||
} | ||
@@ -126,108 +102,6 @@ function enableLoggingByTag({ | ||
}) { | ||
tags.forEach(tag => metadata.denylist.delete(tag)); | ||
tags.forEach(tag => _internal.metadata.denylist.delete(tag)); | ||
} | ||
function getDisabledTags() { | ||
return new Set(metadata.denylist); | ||
} | ||
function resetInternalState() { | ||
metadata.debugger.length = 0; | ||
metadata.logger.length = 0; | ||
metadata.denylist.clear(); | ||
} | ||
function makeExtendedLogger(extendedDebugger, type, underlyingDefaultLogFn, underlyingAlternateLogFn = underlyingDefaultLogFn) { | ||
const baseLoggerFn = decorateWithTagSupport(extendedDebugger, 2); | ||
const baseNewlineFn = decorateWithTagSupport(outputMethod => { | ||
if (extendedLogger.enabled) { | ||
(outputMethod === 'alternate' ? underlyingAlternateLogFn : underlyingDefaultLogFn)(''); | ||
} | ||
}, 1); | ||
const extendedLogger = new Proxy(extendedDebugger, { | ||
apply(_target, _this, args) { | ||
return baseLoggerFn(...args); | ||
}, | ||
get(target, property, proxy) { | ||
if (property === 'extend') { | ||
return function (...args) { | ||
return withMetadataTracking(type, makeExtendedLogger(extendedDebugger.extend(...args), type, underlyingDefaultLogFn, underlyingAlternateLogFn)); | ||
}; | ||
} | ||
if (property === 'newline') { | ||
return function (...args) { | ||
baseNewlineFn(...args); | ||
}; | ||
} | ||
const value = target[property]; | ||
if (typeof value === 'function') { | ||
if (!extendedLoggerFnPropsWeakMap.has(value)) { | ||
extendedLoggerFnPropsWeakMap.set(value, new Proxy(value, { | ||
apply(_target, _this, args) { | ||
const returnValue = value.apply(target, args); | ||
return (0, _types.isPromise)(returnValue) ? returnValue.then(realReturnValue => maybeReturnProxy(realReturnValue)) : maybeReturnProxy(returnValue); | ||
} | ||
})); | ||
} | ||
return extendedLoggerFnPropsWeakMap.get(value); | ||
} | ||
return value; | ||
function maybeReturnProxy(returnValue) { | ||
return returnValue === target ? proxy : returnValue; | ||
} | ||
} | ||
}); | ||
for (const [key, instance] of Object.entries(extendedDebugger[_debug.$instances]).filter(o => o[0] !== '$log')) { | ||
if (key === 'error') { | ||
instance.color = 1; | ||
} else if (key === 'warn') { | ||
instance.color = 3; | ||
} else { | ||
ensureInstanceHasNonReservedColor(instance); | ||
} | ||
instance.log = underlyingAlternateLogFn; | ||
instance.enabled = true; | ||
extendedLogger[_debug.$instances][key] = decorateWithTagSupport(instance, 2); | ||
} | ||
extendedLogger[_debug.$instances].$log = extendedLogger; | ||
extendedLogger.log = underlyingDefaultLogFn; | ||
extendedLogger.enabled = true; | ||
ensureInstanceHasNonReservedColor(extendedLogger); | ||
return extendedLogger; | ||
function ensureInstanceHasNonReservedColor(instance) { | ||
if (ansiRedColorCodes.includes(instance.color)) { | ||
const hiddenInternals = _debug.debugFactory; | ||
(0, _nodeAssert.default)(Array.isArray(hiddenInternals.colors)); | ||
const oldAvailableColors = hiddenInternals.colors; | ||
hiddenInternals.colors = oldAvailableColors.filter(c => !ansiRedColorCodes.includes(c) && !ansiOrangeColorCodes.includes(c)); | ||
try { | ||
const selectedColor = hiddenInternals.selectColor(extendedDebugger.namespace); | ||
(0, _nodeAssert.default)(typeof selectedColor === 'number' || typeof selectedColor === 'string'); | ||
instance.color = selectedColor; | ||
} finally { | ||
hiddenInternals.colors = oldAvailableColors; | ||
} | ||
} | ||
} | ||
} | ||
function decorateWithTagSupport(fn, trapdoorArgsMinLength) { | ||
return new Proxy(fn, { | ||
apply(_target, _this, args) { | ||
if (args.length >= trapdoorArgsMinLength && Array.isArray(args[0])) { | ||
if (args[0].some(tag => metadata.denylist.has(tag))) { | ||
return undefined; | ||
} | ||
return fn(...args.slice(1)); | ||
} | ||
return fn(...args); | ||
} | ||
}); | ||
} | ||
function withMetadataTracking(type, logger) { | ||
metadata[type].push(logger, ..._debug.extendedDebuggerSubInstanceProperties.map(property => logger[property])); | ||
return logger; | ||
} | ||
function withPatchedExtend(instance) { | ||
const oldExtend = instance.extend.bind(instance); | ||
instance.extend = function (...args) { | ||
return withMetadataTracking(LoggerType.DebugOnly, withPatchedExtend(oldExtend(...args))); | ||
}; | ||
return instance; | ||
return new Set(_internal.metadata.denylist); | ||
} |
{ | ||
"name": "rejoinder", | ||
"version": "1.0.0", | ||
"version": "1.1.0", | ||
"description": "A tiny library for creating gorgeous terminal output", | ||
@@ -33,2 +33,6 @@ "keywords": [ | ||
}, | ||
"./internal": { | ||
"types": "./dist/src/internal.d.ts", | ||
"default": "./dist/src/internal.js" | ||
}, | ||
"./package": "./package.json", | ||
@@ -42,2 +46,5 @@ "./package.json": "./package.json" | ||
], | ||
"internal": [ | ||
"dist/src/internal.d.ts" | ||
], | ||
"package": [ | ||
@@ -44,0 +51,0 @@ "package.json" |
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
35250
7
524
1