UNPKG

unified-query

Version:

Composable search input with autocompletion and a rich query-language parser for the Unified Data System

48 lines (47 loc) 1.56 kB
/* recognised sortable fields */ const FIELDS = ['name', 'created', 'updated', 'deleted', 'archived', 'completed']; function isField(x) { return FIELDS.includes(x); } export function analyzeSort(seg) { const list = []; const errors = []; if (seg.tokens.length === 0) list.push({ field: 'name', dir: 'asc' }); for (const tok of seg.tokens) { if (tok.kind !== 'string') { errors.push(invalid(tok)); continue; } const [fieldRaw, dirRaw] = tok.value.split(':', 2); if (!isField(fieldRaw)) { errors.push(badField(tok)); continue; } let dir; if (dirRaw) { if (dirRaw === 'asc' || dirRaw === 'desc') dir = dirRaw; else { errors.push(badDir(tok)); continue; } } list.push({ field: fieldRaw, dir }); } seg.errors.push(...errors); return { keyword: 'sort', parsed: list, from: seg.from, to: seg.to, raw: seg.raw }; /* helpers */ function invalid(tok) { return { message: `invalid token "${tok.raw}" for @sort`, token: tok.raw, from: tok.from, to: tok.to }; } function badDir(tok) { return { message: `invalid sort direction in "${tok.raw}"`, token: tok.raw, from: tok.from, to: tok.to }; } function badField(tok) { return { message: `unrecognised sort field "${tok.raw.split(':')[0]}"`, token: tok.raw, from: tok.from, to: tok.to }; } }