UNPKG

@datastax/astra-db-ts

Version:
61 lines (60 loc) 2.48 kB
// Copyright Datastax, Inc // SPDX-License-Identifier: Apache-2.0 import { MonoidalOptionsHandler, monoids } from '../../lib/opts-handlers.js'; import { array, either, exact, instanceOf, nonEmptyArray, nullish, oneOf } from 'decoders'; import { LoggingDefaultOutputs, LoggingDefaults, LoggingEventsWithAll, LoggingEvents, LoggingOutputs, } from '../../lib/logging/constants.js'; import { oneOrMany, toArray } from '../../lib/utils.js'; const monoid = monoids.object({ layers: monoids.array(), }); const oneOfLoggingEvents = either(oneOf(LoggingEventsWithAll), instanceOf(RegExp)).describe('one of LoggingEvent (including "all"), or a regex which matches such'); const oneOfLoggingEventsWithoutAll = either(oneOf(LoggingEvents), instanceOf(RegExp)).describe('one of LoggingEvent (excluding "all"), or a regex which matches such'); const decoder = nullish(either(oneOfLoggingEvents, array(either(oneOfLoggingEvents, exact({ events: either(oneOfLoggingEvents, nonEmptyArray(oneOfLoggingEventsWithoutAll)), emits: oneOrMany(oneOf(LoggingOutputs)), }))))); const transformer = decoder.transform((config) => { if (!config) { return monoid.empty; } if (config === 'all') { return { layers: LoggingDefaults }; } if (typeof config === 'string') { return { layers: [{ events: [config], emits: LoggingDefaultOutputs[config] }] }; } if (config instanceof RegExp) { config = regex2events(config); } const layers = config.flatMap((c) => { if (c === 'all') { return LoggingDefaults; } if (typeof c === 'string') { return [{ events: [c], emits: LoggingDefaultOutputs[c] }]; } if (c instanceof RegExp) { return regex2events(c).map((e) => ({ events: [e], emits: LoggingDefaultOutputs[e] })); } return [{ events: buildEvents(c.events), emits: Array.isArray(c.emits) ? c.emits : [c.emits], }]; }); return { layers }; }); export const LoggingCfgHandler = new MonoidalOptionsHandler(transformer, monoid); function regex2events(regex) { return LoggingEvents.filter((e) => regex.test(e)); } function buildEvents(events) { return toArray(events).flatMap((e) => { if (e === 'all') { return LoggingEvents; } if (e instanceof RegExp) { return LoggingEvents.filter((ee) => e.test(ee)); } return e; }); }