mingo
Version:
MongoDB query language for in-memory objects
97 lines (96 loc) • 5.7 kB
TypeScript
import type { Context, ProcessingMode } from "./core";
import type { Iterator } from "./lazy";
import type { WindowOperatorInput } from "./operators/window/_internal";
export type Any = unknown;
export type AnyObject = Record<string, Any>;
export type ArrayOrObject = AnyObject | Any[];
export interface Callback<R = Any, T = Any> {
(...args: T[]): R;
}
export interface Predicate<T = Any> {
(...args: T[]): boolean;
}
export interface Comparator<T = Any> {
(left: T, right: T): number;
}
type CommonTypes = "null" | "undefined" | "string" | "date" | "array" | "object";
export type JsType = CommonTypes | "boolean" | "number" | "string" | "regexp" | "function";
export type BsonType = CommonTypes | "bool" | "int" | "long" | "double" | "decimal" | "regex";
/**
* Resolves the given string to a Collection.
* This is useful for operators that require a second collection to use such as $lookup and $out.
* The collection is not cached and will be resolved each time it is used.
*/
export type CollectionResolver = (name: string) => AnyObject[];
/** Specification for collation options */
export interface CollationSpec {
readonly locale: string;
readonly caseLevel?: boolean;
readonly caseFirst?: "upper" | "lower" | "off";
readonly strength?: 1 | 2 | 3;
readonly numericOrdering?: boolean;
readonly alternate?: string;
readonly maxVariable?: never;
readonly backwards?: never;
}
/**
* JSON schema validator
*/
export type JsonSchemaValidator = (schema: AnyObject) => Predicate<AnyObject>;
/**
* Generic options interface passed down to all operators
*/
export interface Options {
/** The key that is used to lookup the ID value of a document. @default "_id". */
readonly idKey: string;
/** The collation specification for string sorting operations. */
readonly collation?: CollationSpec;
/** Determines how to treat inputs and outputs. @default ProcessingMode.CLONE_OFF. */
readonly processingMode: ProcessingMode;
/** Enforces strict MongoDB compatibilty. See README. @default true. */
readonly useStrictMode: boolean;
/** Enable or disable custom script execution using `$where`, `$accumulator`, and `$function` operators. @default true. */
readonly scriptEnabled: boolean;
/** This option does nothing and will be removed in future versions. @deprecated */
readonly hashFunction?: (x: Any) => number;
/** Function to resolve strings to arrays for use with operators that reference other collections such as; `$lookup`, `$out` and `$merge`. */
readonly collectionResolver?: CollectionResolver;
/** JSON schema validator to use with the '$jsonSchema' operator. Required in order to use the operator. */
readonly jsonSchemaValidator?: JsonSchemaValidator;
/** Global variables. */
readonly variables?: Readonly<AnyObject>;
/** Extra references to operators to be used for processing. */
readonly context: Context;
}
export type AccumulatorOperator<R = Any> = (collection: Any[], expr: Any, options: Options) => R;
export type ExpressionOperator<R = Any> = (obj: AnyObject, expr: Any, options: Options) => R;
export type PipelineOperator = (collection: Iterator, expr: Any, options: Options) => Iterator;
export type ProjectionOperator = (obj: AnyObject, expr: Any, selector: string, options: Options) => Any;
export type QueryOperator = (selector: string, value: Any, options: Options) => (obj: AnyObject) => boolean;
export type WindowOperator = (obj: AnyObject, array: AnyObject[], expr: WindowOperatorInput, options: Options) => Any;
export type Operator = AccumulatorOperator | ExpressionOperator | PipelineOperator | ProjectionOperator | QueryOperator | WindowOperator;
export type OperatorName = `$${string}`;
export type AccumulatorOps = Record<OperatorName, AccumulatorOperator>;
export type ExpressionOps = Record<OperatorName, ExpressionOperator>;
export type ProjectionOps = Record<OperatorName, ProjectionOperator>;
export type QueryOps = Record<OperatorName, QueryOperator>;
export type PipelineOps = Record<OperatorName, PipelineOperator>;
export type WindowOps = Record<OperatorName, WindowOperator>;
type Primitive = string | number | boolean | bigint | symbol | null | undefined;
type NumericIndex = `${number}`;
type UpdateDotPaths<T> = {
[K in keyof T & string]: T[K] extends Primitive ? K : T[K] extends Array<infer U> ? K | `${K}.${NumericIndex}` | `${K}.${NumericIndex}.${UpdateDotPaths<U>}` | `${K}.$` | `${K}.$.${UpdateDotPaths<U>}` | `${K}.$[]` | `${K}.$[].${UpdateDotPaths<U>}` | `${K}.$[${string}]` | `${K}.$[${string}].${UpdateDotPaths<U>}` : K | `${K}.${UpdateDotPaths<T[K]>}`;
}[keyof T & string];
type SingleDollar<S extends string> = S extends `${string}$.${string}$.${string}` ? never : S;
type NoChainedPositional<S extends string> = S extends `${string}$.${string}$[]${string}` ? never : S extends `${string}$[].${string}$.${string}` ? never : S;
type UpdatePath<T> = UpdateDotPaths<T> extends infer P extends string ? P extends SingleDollar<P> ? P extends NoChainedPositional<P> ? P : never : never : never;
export type UpdateExpr<T, V = Any> = Partial<Record<UpdatePath<T>, V>>;
type FilterDotPaths<T> = {
[K in keyof T & string]: T[K] extends Primitive ? K : T[K] extends Array<infer U> ? K | `${K}.${NumericIndex}` | `${K}.${NumericIndex}.${FilterDotPaths<U>}` | (U extends Primitive ? never : `${K}.${FilterDotPaths<U>}`) : K | `${K}.${FilterDotPaths<T[K]>}`;
}[keyof T & string];
export type Criteria<T> = Partial<Record<FilterDotPaths<T>, Any>>;
type ProjectPath<T> = {
[K in keyof T & string]: K | `${K}.${string}`;
}[keyof T & string];
export type Projection<T> = Partial<Record<ProjectPath<T>, Any>>;
export {};