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
TypeScript
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 {};