feat(xo-server/logs-cli): can match on missing props

This commit is contained in:
Julien Fontanet 2020-07-03 08:39:43 +02:00
parent 4636109081
commit 2198853662

View File

@ -30,7 +30,7 @@ const getLogs = (db, args) => {
stream = stream.filter(({ value }) => {
for (const field of fields) {
const fieldValue = get(value, field)
if (fieldValue === undefined || !args.matchers[field](fieldValue)) {
if (!args.matchers[field](fieldValue)) {
return false
}
}
@ -161,7 +161,7 @@ xo-server-logs [--json] [--limit=<limit>] [--since=<date>] [--until=<date>] [<pa
<pattern>
Patterns can be used to filter the entries.
Patterns have the following format \`<field>=<value>\`/\`<field>\`.
Patterns have the following format \`<field>=<value>\`, \`<field>\` or \`!<field>\`.
xo-server-logs --gc
@ -210,20 +210,41 @@ function getArgs() {
const field = value.slice(0, i)
const pattern = value.slice(i + 1)
patterns[pattern]
? patterns[field].push(pattern)
: (patterns[field] = [pattern])
} else if (!patterns[value]) {
patterns[value] = null
const fieldPatterns = patterns[field]
if (fieldPatterns === undefined) {
patterns[field] = [pattern]
} else if (Array.isArray(fieldPatterns)) {
fieldPatterns.push(pattern)
} else {
throw new Error('cannot mix existence with equality patterns')
}
} else {
const negate = value[0] === '!'
if (negate) {
value = value.slice(1)
}
if (patterns[value]) {
throw new Error('cannot mix existence with equality patterns')
}
patterns[value] = !negate
}
}
const trueFunction = () => true
const mustExists = value => value !== undefined
const mustNotExists = value => value === undefined
args.matchers = {}
for (const field in patterns) {
const values = patterns[field]
args.matchers[field] = values === null ? trueFunction : globMatcher(values)
args.matchers[field] =
values === true
? mustExists
: values === false
? mustNotExists
: globMatcher(values)
}
// Warning: minimist makes one array of values if the same option is used many times.