UNPKG

unified-query

Version:

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

112 lines (111 loc) 2.79 kB
export type Kind = 'note' | 'log' | 'idea' | 'task' | 'issue' | 'image' | 'concept' | 'session' | 'goal' | 'collection' | 'project' | 'space' | 'book' | 'highlight' | 'article' | 'person' | 'post' | 'comment' | 'equation' | 'video' | 'question' | 'review' | 'aichat' | 'aiprompt' | 'airesponse' | 'self'; export type Keyword = 'head' | 'id' | 'kind' | 'name' | 'content' | 'in' | 'by' | 'draft' | 'archived' | 'deleted' | 'done' | 'todo' | 'created' | 'updated' | 'changed' | 'date' | 'time' | 'sort' | 'limit' | 'today' | 'yesterday' | Kind; interface BaseTok { from: number; to: number; raw: string; } /** single calendar points */ export type DatePointUtility = { util: 'today'; } | { util: 'yesterday'; }; /** closed interval ending “now” */ export type DateRangeUtility = { util: 'last'; unit: 'days' | 'weeks' | 'months' | 'years'; n: number; }; export type DateUtility = DatePointUtility | DateRangeUtility; export type DateValue = { y: number; m?: number; d?: number; }; export type TimeValue = { h: number; m?: number; clock: '24h' | '12h'; }; export type DateTimeValue = { y: number; m: number; d: number; h: number; min: number; }; export type TimestampValue = DateValue | TimeValue | DateTimeValue | Cmp<DateValue | TimeValue | DateTimeValue>; export type CmpOp = '<' | '>'; export type LexToken = ({ kind: 'date'; op?: CmpOp; value: DateValue; } & BaseTok) | ({ kind: 'time'; op?: CmpOp; value: TimeValue; } & BaseTok) | ({ kind: 'datetime'; op?: CmpOp; value: DateTimeValue; } & BaseTok) | ({ kind: 'dateutil'; op?: CmpOp; value: DateUtility; } & BaseTok) | ({ kind: 'boolean'; value: boolean; } & BaseTok) | ({ kind: 'uuid'; value: string; deep: boolean; } & BaseTok) | ({ kind: 'string'; value: string; } & BaseTok); export type MicroParser = (word: string, pos: number) => LexToken | null; export interface ParsedKeyword<K extends Keyword = Keyword, V = unknown> { keyword: K; parsed: V; from: number; to: number; raw: string; } export type Cmp<V> = { op: CmpOp; value: V; }; export interface InArg { id: string; deep: boolean; } export interface ByArg { id: string; } export interface SortArg { field: string; dir?: 'asc' | 'desc'; } export interface ParseError { from: number; to: number; message: string; token: string; } export interface ParseResult { segments: Segment[]; keywords: ParsedKeyword[]; errors: ParseError[]; } export interface Segment { keyword: 'head' | string; tokens: LexToken[]; errors: ParseError[]; from: number; to: number; body: string; raw: string; ignored: boolean; } export {};