@datastax/astra-db-ts
Version:
Data API TypeScript client
61 lines (60 loc) • 2.48 kB
JavaScript
// 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;
});
}