@gmencz/faunadb
Version:
TypeScript-first FaunaDB client with static type inference
2,193 lines (1,947 loc) • 55.2 kB
text/typescript
import { O } from 'ts-toolbelt';
import { Expression, wrap, wrapValues } from './expression';
type SchemaTypes = {
AccessProviders?: string[];
Collections?: Record<string, unknown>;
Databases?: string[];
Functions?: Record<string, unknown>;
Indexes?: string[];
Roles?: string[];
};
type OrExpression<TValue = unknown> = Expression | TValue;
type Normalizer = 'NFKCCaseFold' | 'NFC' | 'NFD' | 'NFKC' | 'NFKD';
type CreateParams<TData extends unknown> = {
data?: OrExpression<TData>;
credentials?: OrExpression<{ password: string } & Record<string, unknown>>;
ttl?: Expression;
};
type CreateAccessProviderParams<TAccessProviderName extends string> = {
name: OrExpression<TAccessProviderName>;
issuer: OrExpression<string>;
jwks_uri: OrExpression<string>;
roles?:
| Expression[]
| {
role: Expression;
predicate: Expression;
}[];
data?: OrExpression<Record<string, unknown>>;
};
type CreateCollectionParams<
TSchema extends SchemaTypes,
TCollectionName extends keyof TSchema['Collections']
> = {
name: OrExpression<TCollectionName>;
data?: OrExpression<Record<string, unknown>>;
history_days?: OrExpression<number | null>;
ttl_days?: OrExpression<number | null>;
};
type CreateDatabaseParams<TDatabaseName extends string> = {
name: OrExpression<TDatabaseName>;
data?: OrExpression<Record<string, unknown>>;
};
type BuiltInRole = 'admin' | 'server' | 'server-readonly' | 'client';
type CreateFunctionParams<TFunctionName extends string> = {
name: OrExpression<TFunctionName>;
body: Expression;
data?: OrExpression<Record<string, unknown>>;
role?: BuiltInRole | Expression;
};
type CreateKeyParams = {
role: BuiltInRole | Expression | Expression[];
database?: Expression;
data?: OrExpression<{ name?: string } & Record<string, unknown>>;
};
type SourceObject = {
collection: Expression;
fields: OrExpression<Record<string, Expression>>;
};
type TermObject = {
field?: OrExpression<string | string[]>;
binding?: OrExpression<string>;
};
type ValueObject = {
field?: OrExpression<string | string[]>;
binding?: OrExpression<string>;
reverse?: OrExpression<boolean>;
};
type EpochUnit =
| 'day'
| 'days'
| 'half day'
| 'half days'
| 'hour'
| 'hours'
| 'minute'
| 'minutes'
| 'second'
| 'seconds'
| 'millisecond'
| 'milliseconds'
| 'microsecond'
| 'microseconds'
| 'nanosecond'
| 'nanoseconds';
type CreateIndexParams<TIndexName extends string> = {
name: OrExpression<TIndexName>;
source: OrExpression<SourceObject>;
terms?: OrExpression<TermObject[]>;
values?: OrExpression<ValueObject[]>;
unique?: OrExpression<boolean>;
serialized?: OrExpression<boolean>;
data?: OrExpression<Record<string, unknown>>;
};
type PrivilegeActions = {
create: boolean | Expression;
delete: boolean | Expression;
read: boolean | Expression;
write: boolean | Expression;
history_read: boolean | Expression;
history_write: boolean | Expression;
unrestricted_read: boolean | Expression;
call: boolean | Expression;
};
type PrivilegeConfigurationObject = {
resource: Expression;
actions: OrExpression<O.AtLeast<PrivilegeActions>>;
};
type MembershipConfigurationObject = {
resource: Expression;
predicate?: Expression;
};
type CreateRoleParams<TRoleName extends string> = {
name: OrExpression<TRoleName>;
privileges: OrExpression<PrivilegeConfigurationObject[]>;
membership?: OrExpression<MembershipConfigurationObject[]>;
data?: OrExpression<Record<string, unknown>>;
};
type InsertParams = {
data: OrExpression<Record<string, unknown>>;
credentials: OrExpression<Record<string, unknown>>;
delegates: OrExpression<Record<string, unknown>>;
};
type LoginParams = {
data?: OrExpression<Record<string, unknown>>;
password: OrExpression<string>;
ttl?: Expression;
};
type PaginateParams = {
ts?: OrExpression<number>;
before?: Expression[];
after?: Expression[];
size?: OrExpression<number>;
events?: OrExpression<boolean>;
sources?: OrExpression<boolean>;
};
type ReplaceParams = {
data: OrExpression<Record<string, unknown>>;
};
type UpdateParams = {
data: OrExpression<Record<string, unknown>>;
credentials: OrExpression<Record<string, unknown>>;
delegates: OrExpression<Record<string, unknown>>;
ttl?: Expression;
};
class QueryBuilder<TSchema extends SchemaTypes = SchemaTypes> {
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/abort
*/
Abort = (message: OrExpression<string>) => {
return new Expression({ abort: message });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/abs
*/
Abs = (value: OrExpression<number>) => {
return new Expression({ abs: value });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/accessprovider
*/
AccessProvider = <
TAccessProviderName extends TSchema['AccessProviders'] extends string[]
? TSchema['AccessProviders'][number]
: string = TSchema['AccessProviders'] extends string[]
? TSchema['AccessProviders'][number]
: string
>(
name: OrExpression<TAccessProviderName>
) => {
return new Expression({ access_provider: name });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/accessproviders
*/
AccessProviders = (database?: Expression) => {
if (!database) {
return new Expression({ access_providers: null });
}
return new Expression({ access_providers: database });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/acos
*/
Acos = (value: OrExpression<number>) => {
return new Expression({ acos: value });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/add
*/
Add = (...values: OrExpression<number>[]) => {
if (values.length === 1) {
return new Expression({ add: values[0] });
}
return new Expression({ add: values });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/all
*/
All = (...values: OrExpression<number>[]) => {
if (values.length === 1) {
return new Expression({ all: values[0] });
}
return new Expression({ all: values });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/and
*/
And = (...values: OrExpression<boolean>[]) => {
if (values.length === 1) {
return new Expression({ and: values[0] });
}
return new Expression({ and: values });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/any
*/
Any = (...values: OrExpression<boolean>[]) => {
if (values.length === 1) {
return new Expression({ any: values[0] });
}
return new Expression({ any: values });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/append
*/
Append = (base: unknown[] | Expression, elems: unknown[] | Expression) => {
return new Expression({
append: wrap(base),
collection: wrap(elems),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/asin
*/
Asin = (value: OrExpression<number>) => {
return new Expression({ asin: value });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/at
*/
At = (timestamp: Expression, expression: unknown) => {
return new Expression({ at: timestamp, expr: wrap(expression) });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/atan
*/
Atan = (value: OrExpression<number>) => {
return new Expression({ atan: value });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/bitand
*/
BitAnd = (...values: OrExpression<number>[]) => {
if (values.length === 1) {
return new Expression({ bitand: values[0] });
}
return new Expression({ bitand: values });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/bitnot
*/
BitNot = (value: OrExpression<number>) => {
return new Expression({ bitnot: value });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/bitor
*/
BitOr = (...values: OrExpression<number>[]) => {
if (values.length === 1) {
return new Expression({ bitor: values[0] });
}
return new Expression({ bitor: values });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/bitxor
*/
BitXor = (...values: OrExpression<number>[]) => {
if (values.length === 1) {
return new Expression({ bitxor: values[0] });
}
return new Expression({ bitxor: values });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/call
*/
Call = <
TFunctionName extends keyof TSchema['Functions'] = keyof TSchema['Functions'],
TArgs extends TSchema['Functions'][TFunctionName] = TSchema['Functions'][TFunctionName]
>(
fn: OrExpression<TFunctionName>,
args: OrExpression<TArgs>
) => {
return new Expression({
call: fn,
arguments: wrap(args),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/casefold
*/
Casefold = (
value: OrExpression<string>,
normalizer?: OrExpression<Normalizer>
) => {
if (normalizer) {
return new Expression({
casefold: value,
normalizer,
});
}
return new Expression({
casefold: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/ceil
*/
Ceil = (value: OrExpression<number>) => {
return new Expression({
ceil: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/collection
*/
Collection = <
TCollectionName extends keyof TSchema['Collections'] = keyof TSchema['Collections']
>(
name: OrExpression<TCollectionName>,
database?: Expression
) => {
if (database) {
return new Expression({
collection: name,
scope: database,
});
}
return new Expression({
collection: name,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/collections
*/
Collections = (database?: Expression) => {
if (database) {
return new Expression({
collections: database,
});
}
return new Expression({
collections: null,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/concat
*/
Concat = (value: OrExpression<string>[], separator?: string | Expression) => {
if (separator) {
return new Expression({
concat: value,
separator,
});
}
return new Expression({
concat: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/containsfield
*/
ContainsField = (field: OrExpression<string>, value: unknown) => {
return new Expression({
contains_field: field,
in: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/containspath
*/
ContainsPath = (path: OrExpression<string | number>[], value: unknown) => {
return new Expression({
contains_path: path,
in: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/containsstr
*/
ContainsStr = (value: OrExpression<string>, search: OrExpression<string>) => {
return new Expression({
containsstr: value,
search,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/containsstrregex
*/
ContainsStrRegex = (
value: OrExpression<string>,
pattern: OrExpression<string>
) => {
return new Expression({
containsstrregex: value,
pattern,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/containsvalue
*/
ContainsValue = (value: unknown, inValue: unknown) => {
return new Expression({
contains_value: wrap(value),
in: wrap(inValue),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/cos
*/
Cos = (value: OrExpression<number>) => {
return new Expression({
cos: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/cosh
*/
Cosh = (value: OrExpression<number>) => {
return new Expression({
cosh: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/count
*/
Count = (arrayOrSet: OrExpression<unknown[]>) => {
return new Expression({
count: wrap(arrayOrSet),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/create
*/
Create = <
TCollectionName extends keyof TSchema['Collections'] = keyof TSchema['Collections'],
TData extends TSchema['Collections'][TCollectionName] = TSchema['Collections'][TCollectionName]
>(
collection: OrExpression<TCollectionName>,
params: OrExpression<CreateParams<TData> & Record<string, unknown>>
) => {
return new Expression({
create: collection,
params: wrap(params),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/createaccessprovider
*/
CreateAccessProvider = <
TAccessProviderName extends TSchema['AccessProviders'] extends string[]
? TSchema['AccessProviders'][number]
: string = TSchema['AccessProviders'] extends string[]
? TSchema['AccessProviders'][number]
: string
>(
params: OrExpression<CreateAccessProviderParams<TAccessProviderName>>
) => {
return new Expression({
create_access_provider: wrap(params),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/createcollection
*/
CreateCollection = (
params: OrExpression<
CreateCollectionParams<TSchema, keyof TSchema['Collections']>
>
) => {
return new Expression({
create_collection: wrap(params),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/createdatabase
*/
CreateDatabase = <
TDatabaseName extends TSchema['Databases'] extends string[]
? TSchema['Databases'][number]
: string = TSchema['Databases'] extends string[]
? TSchema['Databases'][number]
: string
>(
params: OrExpression<CreateDatabaseParams<TDatabaseName>>
) => {
return new Expression({
create_database: wrap(params),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/createfunction
*/
CreateFunction = <
TFunctionName extends TSchema['Functions'] extends string[]
? TSchema['Functions'][number]
: string = TSchema['Functions'] extends string[]
? TSchema['Functions'][number]
: string
>(
params: OrExpression<CreateFunctionParams<TFunctionName>>
) => {
return new Expression({
create_function: wrap(params),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/createindex
*/
CreateIndex = <
TIndexName extends TSchema['Indexes'] extends string[]
? TSchema['Indexes'][number]
: string = TSchema['Indexes'] extends string[]
? TSchema['Indexes'][number]
: string
>(
params: OrExpression<CreateIndexParams<TIndexName>>
) => {
return new Expression({
create_index: wrap(params),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/createkey
*/
CreateKey = (params: OrExpression<CreateKeyParams>) => {
return new Expression({
create_key: wrap(params),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/createrole
*/
CreateRole = <
TRoleName extends TSchema['Roles'] extends string[]
? TSchema['Roles'][number]
: string = TSchema['Roles'] extends string[]
? TSchema['Roles'][number]
: string
>(
params: OrExpression<CreateRoleParams<TRoleName>>
) => {
return new Expression({
create_role: wrap(params),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/credentials
*/
Credentials = (database?: Expression) => {
if (database) {
return new Expression({
credentials: database,
});
}
return new Expression({
credentials: null,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/currentidentity
*/
CurrentIdentity = () => {
return new Expression({
current_identity: null,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/currenttoken
*/
CurrentToken = () => {
return new Expression({
current_token: null,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/database
*/
Database = <
TDatabaseName extends TSchema['Databases'] extends string[]
? TSchema['Databases'][number]
: string = TSchema['Databases'] extends string[]
? TSchema['Databases'][number]
: string
>(
name: OrExpression<TDatabaseName>,
database?: Expression
) => {
if (database) {
return new Expression({ database: name, scope: database });
}
return new Expression({ database: name });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/databases
*/
Databases = (database?: Expression) => {
if (database) {
return new Expression({
databases: database,
});
}
return new Expression({
databases: null,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/date
*/
Date = (str: OrExpression<string>) => {
return new Expression({
date: str,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/dayofmonth
*/
DayOfMonth = (timestamp: Expression) => {
return new Expression({
day_of_month: timestamp,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/dayofweek
*/
DayOfWeek = (timestamp: Expression) => {
return new Expression({
day_of_week: timestamp,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/dayofyear
*/
DayOfYear = (timestamp: Expression) => {
return new Expression({
day_of_year: timestamp,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/degrees
*/
Degrees = (value: OrExpression<number>) => {
return new Expression({
degrees: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/delete
*/
Delete = (ref: Expression) => {
return new Expression({
delete: ref,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/difference
*/
Difference = (source: unknown[] | Expression, ...diff: unknown[]) => {
return new Expression({
difference: wrap([source, ...diff]),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/distinct
*/
Distinct = (source: unknown[] | Expression) => {
return new Expression({
distinct: wrap(source),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/divide
*/
Divide = (...values: OrExpression<number>[]) => {
return new Expression({
divide: values,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/do
*/
Do = (...expressions: Expression[]) => {
return new Expression({
do: wrap(expressions),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/documents
*/
Documents = (collection: Expression) => {
return new Expression({
documents: collection,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/drop
*/
Drop = (num: OrExpression<number>, array: OrExpression<unknown[]>) => {
return new Expression({
drop: num,
collection: wrap(array),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/endswith
*/
EndsWith = (value: OrExpression<string>, search: OrExpression<string>) => {
return new Expression({
endswith: value,
search,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/epoch
*/
Epoch = (num: OrExpression<number>, unit: OrExpression<EpochUnit>) => {
return new Expression({
epoch: num,
unit,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/equals
*/
Equals = (value1: unknown, value2: unknown, ...values: unknown[]) => {
return new Expression({
equals: wrap([value1, value2, ...values]),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/events
*/
Events = (input: Expression) => {
return new Expression({
events: input,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/exists
*/
Exists = (ref: Expression, ts?: OrExpression<number>) => {
if (ts !== undefined) {
return new Expression({
exists: ref,
ts,
});
}
return new Expression({
exists: ref,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/exp
*/
Exp = (value: OrExpression<number>) => {
return new Expression({
exp: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/filter
*/
Filter = (arrayOrSet: OrExpression<unknown[]>, lambda: Expression) => {
return new Expression({
collection: wrap(arrayOrSet),
filter: lambda,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/findstr
*/
FindStr = (
value: OrExpression<string>,
find: OrExpression<string>,
start?: OrExpression<number>
) => {
if (start !== undefined) {
return new Expression({
findstr: value,
find,
start,
});
}
return new Expression({
findstr: value,
find,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/findstrregex
*/
FindStrRegex = (
value: OrExpression<string>,
find: OrExpression<string>,
start?: OrExpression<number>,
numResults?: OrExpression<number>
) => {
if (start !== undefined && numResults !== undefined) {
return new Expression({
findstrregex: value,
find,
start,
num_results: numResults,
});
}
if (start !== undefined) {
return new Expression({
findstrregex: value,
find,
start,
});
}
if (numResults !== undefined) {
return new Expression({
findstrregex: value,
find,
num_results: numResults,
});
}
return new Expression({
findstrregex: value,
find,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/floor
*/
Floor = (value: OrExpression<number>) => {
return new Expression({
floor: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/foreach
*/
Foreach = (arrayOrPage: OrExpression<unknown[]>, lambda: Expression) => {
return new Expression({
collection: wrap(arrayOrPage),
foreach: lambda,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/format
*/
Format = (format: OrExpression<string>, ...args: unknown[]) => {
if (args.length === 1) {
return new Expression({
format,
values: wrap(args[0]),
});
}
return new Expression({
format,
values: wrap(args),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/function
*/
Function = <
TFunctionName extends keyof TSchema['Functions'] = keyof TSchema['Functions']
>(
name: OrExpression<TFunctionName>,
database?: Expression
) => {
if (database) {
return new Expression({ function: name, scope: database });
}
return new Expression({ function: name });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/functions
*/
Functions = (database?: Expression) => {
if (database) {
return new Expression({
functions: database,
});
}
return new Expression({
functions: null,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/gt
*/
GT = (...values: OrExpression<number>[]) => {
if (values.length === 1) {
return new Expression({
gt: values[0],
});
}
return new Expression({
gt: values,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/gte
*/
GTE = (...values: OrExpression<number>[]) => {
if (values.length === 1) {
return new Expression({
gte: values[0],
});
}
return new Expression({
gte: values,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/get
*/
Get = (ref: Expression, ts?: OrExpression<number>) => {
if (ts !== undefined) {
return new Expression({
get: ref,
ts,
});
}
return new Expression({
get: ref,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/hascurrentidentity
*/
HasCurrentIdentity = () => {
return new Expression({
has_current_identity: null,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/hascurrenttoken
*/
HasCurrentToken = () => {
return new Expression({
has_current_token: null,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/hour
*/
Hour = (timestamp: Expression) => {
return new Expression({
hour: timestamp,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/hypot
*/
Hypot = (a: OrExpression<number>, b?: OrExpression<number>) => {
if (b !== undefined) {
return new Expression({
hypot: a,
b,
});
}
return new Expression({
hypot: a,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/identify
*/
Identify = (identity: Expression, password: OrExpression<string>) => {
return new Expression({
identify: identity,
password,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/if
*/
If = (
condition: OrExpression<boolean>,
thenExpression: unknown,
elseExpression: unknown
) => {
return new Expression({
if: condition,
then: wrap(thenExpression),
else: wrap(elseExpression),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/index
*/
Index = <
TIndexName extends TSchema['Indexes'] extends string[]
? TSchema['Indexes'][number]
: string = TSchema['Indexes'] extends string[]
? TSchema['Indexes'][number]
: string
>(
name: OrExpression<TIndexName>,
database?: Expression
) => {
if (database) {
return new Expression({
index: name,
scope: database,
});
}
return new Expression({
index: name,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/indexes
*/
Indexes = (database?: Expression) => {
if (database) {
return new Expression({
indexes: database,
});
}
return new Expression({
indexes: null,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/insert
*/
Insert = (
ref: Expression,
ts: OrExpression<number>,
action: OrExpression<'create' | 'delete' | 'update'>,
params: OrExpression<O.AtLeast<InsertParams>>
) => {
return new Expression({
insert: ref,
ts,
action,
params: wrap(params),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/intersection
*/
Intersection = (...group: OrExpression<unknown[]>[]) => {
return new Expression({
intersection: wrap([...group]),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isarray
*/
IsArray = (value: unknown) => {
return new Expression({
is_array: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isboolean
*/
IsBoolean = (value: unknown) => {
return new Expression({
is_boolean: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isbytes
*/
IsBytes = (value: unknown) => {
return new Expression({
is_bytes: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/iscollection
*/
IsCollection = (value: unknown) => {
return new Expression({
is_collection: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/iscredentials
*/
IsCredentials = (value: unknown) => {
return new Expression({
is_credentials: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isdatabase
*/
IsDatabase = (value: unknown) => {
return new Expression({
is_database: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isdate
*/
IsDate = (value: unknown) => {
return new Expression({
is_date: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isdoc
*/
IsDoc = (value: unknown) => {
return new Expression({
is_doc: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isdouble
*/
IsDouble = (value: unknown) => {
return new Expression({
is_double: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isempty
*/
IsEmpty = (arrayOrSet: OrExpression<unknown[]>) => {
return new Expression({
is_empty: wrap(arrayOrSet),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isfunction
*/
IsFunction = (value: unknown) => {
return new Expression({
is_function: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isindex
*/
IsIndex = (value: unknown) => {
return new Expression({
is_index: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isinteger
*/
IsInteger = (value: unknown) => {
return new Expression({
is_integer: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/iskey
*/
IsKey = (value: unknown) => {
return new Expression({
is_key: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/islambda
*/
IsLambda = (value: unknown) => {
return new Expression({
is_lambda: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isnonempty
*/
IsNonEmpty = (arrayOrSet: OrExpression<unknown[]>) => {
return new Expression({
is_nonempty: wrap(arrayOrSet),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isnull
*/
IsNull = (value: unknown) => {
return new Expression({
is_null: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isnumber
*/
IsNumber = (value: unknown) => {
return new Expression({
is_number: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isobject
*/
IsObject = (value: unknown) => {
return new Expression({
is_object: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isref
*/
IsRef = (value: unknown) => {
return new Expression({
is_ref: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isrole
*/
IsRole = (value: unknown) => {
return new Expression({
is_role: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isset
*/
IsSet = (value: unknown) => {
return new Expression({
is_set: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/isstring
*/
IsString = (value: unknown) => {
return new Expression({
is_string: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/istimestamp
*/
IsTimestamp = (value: unknown) => {
return new Expression({
is_timestamp: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/istoken
*/
IsToken = (value: unknown) => {
return new Expression({
is_token: wrap(value),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/join
*/
Join = (source: unknown, target: Expression) => {
return new Expression({
join: wrap(source),
with: target,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/keyfromsecret
*/
KeyFromSecret = (secret: OrExpression<string>) => {
return new Expression({
key_from_secret: secret,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/keys
*/
Keys = (database?: Expression) => {
if (database) {
return new Expression({
keys: database,
});
}
return new Expression({
keys: null,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/lt
*/
LT = (...values: OrExpression<number>[]) => {
if (values.length === 1) {
return new Expression({
lt: values[0],
});
}
return new Expression({
lt: values,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/lte
*/
LTE = (...values: OrExpression<number>[]) => {
if (values.length === 1) {
return new Expression({
lte: values[0],
});
}
return new Expression({
lte: values,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/ltrim
*/
LTrim = (value: OrExpression<string>) => {
return new Expression({
ltrim: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/lambda
*/
Lambda = (params: string | string[], expression: unknown) => {
return new Expression({
lambda: params,
expr: wrap(expression),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/length
*/
Length = (value: OrExpression<string>) => {
return new Expression({
length: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/let
*/
Let = (variables: Record<string, unknown>, expression: unknown) => {
const variablesExpression = Object.keys(variables).map((variable) => ({
[variable]: wrap(variables[variable]),
}));
return new Expression({
let: variablesExpression,
in: wrap(expression),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/ln
*/
Ln = (value: OrExpression<number>) => {
return new Expression({
ln: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/log
*/
Log = (value: OrExpression<number>) => {
return new Expression({
log: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/login
*/
Login = (identity: Expression, params: LoginParams) => {
return new Expression({
login: identity,
params: wrap(params),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/logout
*/
Logout = (allTokens: OrExpression<boolean>) => {
return new Expression({
logout: allTokens,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/lowercase
*/
LowerCase = (value: OrExpression<string>) => {
return new Expression({
lowercase: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/map
*/
Map = (array: OrExpression<unknown[]>, lambda: Expression) => {
return new Expression({
map: lambda,
collection: wrap(array),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/match
*/
Match = <
TIndexName extends TSchema['Indexes'] extends string[]
? TSchema['Indexes'][number]
: string = TSchema['Indexes'] extends string[]
? TSchema['Indexes'][number]
: string
>(
index: OrExpression<TIndexName>,
searchTerms: unknown = []
) => {
return new Expression({
match: index,
terms: wrap(searchTerms),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/max
*/
Max = (...values: OrExpression<number>[]) => {
if (values.length === 1) {
return new Expression({
max: values[0],
});
}
return new Expression({
max: values,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/mean
*/
Mean = (arrayOrSet: OrExpression<unknown[]>) => {
return new Expression({
mean: wrap(arrayOrSet),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/merge
*/
Merge = (
object1: OrExpression<Record<string, unknown>>,
object2:
| OrExpression<Record<string, unknown>>
| OrExpression<Record<string, unknown>>[],
customResolver?: Expression
) => {
if (customResolver) {
return new Expression({
merge: wrap(object1),
with: wrap(object2),
lambda: customResolver,
});
}
return new Expression({
merge: wrap(object1),
with: wrap(object2),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/min
*/
Min = (...values: OrExpression<number>[]) => {
if (values.length === 1) {
return new Expression({
min: values[0],
});
}
return new Expression({
min: values,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/minute
*/
Minute = (timestamp: Expression) => {
return new Expression({
minute: timestamp,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/modulo
*/
Modulo = (...values: OrExpression<number>[]) => {
if (values.length === 1) {
return new Expression({
modulo: values[0],
});
}
return new Expression({
modulo: values,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/month
*/
Month = (timestamp: Expression) => {
return new Expression({
month: timestamp,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/movedatabase
*/
MoveDatabase = (from: Expression, to: Expression) => {
return new Expression({
move_database: from,
to,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/multiply
*/
Multiply = (...values: OrExpression<number>[]) => {
if (values.length === 1) {
return new Expression({
multiply: values[0],
});
}
return new Expression({
multiply: values,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/newid
*/
NewId = () => {
return new Expression({ new_id: null });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/not
*/
Not = (value: OrExpression<boolean>) => {
return new Expression({ not: value });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/now
*/
Now = () => {
return new Expression({ now: null });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/or
*/
Or = (...values: OrExpression<boolean>[]) => {
if (values.length === 1) {
return new Expression({
or: values[0],
});
}
return new Expression({
or: values,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/paginate
*/
Paginate = (input: Expression, params?: OrExpression<PaginateParams>) => {
if (params) {
if (params instanceof Expression) {
return new Expression({
paginate: input,
// @ts-expect-error because `toJSON` is a private field and we're accesing it
// from outside the class.
raw: wrap(params.toJSON()),
});
}
return new Expression({
paginate: input,
...wrapValues(params),
});
}
return new Expression({ paginate: input });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/pow
*/
Pow = (base: OrExpression<number>, exponent: OrExpression<number>) => {
return new Expression({
pow: base,
exp: exponent,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/prepend
*/
Prepend = (base: OrExpression<unknown[]>, elems: OrExpression<unknown[]>) => {
return new Expression({
prepend: wrap(base),
collection: wrap(elems),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/query
*/
Query = (lambda: Expression) => {
return new Expression({ query: lambda });
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/rtrim
*/
RTrim = (value: OrExpression<string>) => {
return new Expression({
rtrim: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/radians
*/
Radians = (value: OrExpression<number>) => {
return new Expression({
radians: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/range
*/
Range = (
set: Expression,
start: OrExpression<unknown | unknown[]>,
end: OrExpression<unknown | unknown[]>
) => {
return new Expression({
range: set,
from: wrap(start),
to: wrap(end),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/reduce
*/
Reduce = (
reducer: Expression,
initial: unknown,
arrayOrSet: OrExpression<unknown[]>
) => {
return new Expression({
reduce: reducer,
initial,
arrayOrSet: wrap(arrayOrSet),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/ref
*/
Ref = (schemaRef: Expression, documentId: OrExpression<string>) => {
return new Expression({
id: documentId,
ref: schemaRef,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/regexescape
*/
RegexEscape = (value: OrExpression<string>) => {
return new Expression({
regexescape: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/remove
*/
Remove = (
ref: Expression,
ts: OrExpression<number>,
action: OrExpression<'create' | 'delete' | 'update'>
) => {
return new Expression({
remove: ref,
ts,
action,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/repeat
*/
Repeat = (value: OrExpression<string>, number?: OrExpression<number>) => {
if (number !== undefined) {
return new Expression({
repeat: value,
number,
});
}
return new Expression({
repeat: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/replace
*/
Replace = (ref: Expression, params: ReplaceParams) => {
return new Expression({
replace: ref,
params: wrap(params),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/replacestr
*/
ReplaceStr = (
value: OrExpression<string>,
find: OrExpression<string>,
replace: OrExpression<string>
) => {
return new Expression({
replacestr: value,
find,
replace,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/replacestrregex
*/
ReplaceStrRegex = (
value: OrExpression<string>,
pattern: OrExpression<string>,
replace: OrExpression<string>,
firstOnly?: OrExpression<boolean>
) => {
if (firstOnly !== undefined) {
return new Expression({
replacestrregex: value,
pattern,
replace,
first: firstOnly,
});
}
return new Expression({
replacestrregex: value,
pattern,
replace,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/reverse
*/
Reverse = (source: OrExpression<unknown[]>) => {
return new Expression({
reverse: wrap(source),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/role
*/
Role = <
TRoleName extends TSchema['Roles'] extends string[]
? TSchema['Roles'][number]
: string = TSchema['Roles'] extends string[]
? TSchema['Roles'][number]
: string
>(
name: OrExpression<TRoleName>,
database?: Expression
) => {
if (database) {
return new Expression({
role: name,
scope: database,
});
}
return new Expression({
role: name,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/roles
*/
Roles = (database?: Expression) => {
if (database) {
return new Expression({
roles: database,
});
}
return new Expression({
roles: null,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/round
*/
Round = (value: OrExpression<number>, precision?: OrExpression<number>) => {
if (precision !== undefined) {
return new Expression({
round: value,
precision,
});
}
return new Expression({
round: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/second
*/
Second = (timestamp: Expression) => {
return new Expression({
second: timestamp,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/select
*/
Select = <
TFromArray extends unknown = unknown,
TFrom extends Expression | Record<string, unknown> | TFromArray[] = any
>(
path: TFrom extends Expression
? string | number | (string | number)[]
: O.Paths<TFrom> | O.Paths<TFrom>[number],
from: TFrom,
defaultValue?: unknown
) => {
if (defaultValue) {
return new Expression({
from: wrap(from),
select: path,
default: wrap(defaultValue),
});
}
return new Expression({
from: wrap(from),
select: path,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/sign
*/
Sign = (value: OrExpression<number>) => {
return new Expression({
sign: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/sin
*/
Sin = (value: OrExpression<number>) => {
return new Expression({
sin: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/singleton
*/
Singleton = (ref: Expression) => {
return new Expression({
singleton: ref,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/sinh
*/
Sinh = (value: OrExpression<number>) => {
return new Expression({
sinh: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/space
*/
Space = (count: OrExpression<number>) => {
return new Expression({
space: count,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/sqrt
*/
Sqrt = (value: OrExpression<number>) => {
return new Expression({
sqrt: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/startswith
*/
StartsWith = (value: OrExpression<string>, search: OrExpression<string>) => {
return new Expression({
startswith: value,
search,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/substring
*/
SubString = (
value: OrExpression<string>,
start: OrExpression<number>,
length?: OrExpression<number>
) => {
if (length !== undefined) {
return new Expression({
substring: value,
start,
length,
});
}
return new Expression({
substring: value,
start,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/subtract
*/
Subtract = (...values: OrExpression<number>[]) => {
if (values.length === 1) {
return new Expression({
subtract: values[0],
});
}
return new Expression({
subtract: values,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/sum
*/
Sum = (arrayOrSet: OrExpression<unknown[]>) => {
return new Expression({
sum: arrayOrSet,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/take
*/
Take = (num: OrExpression<number>, array: OrExpression<unknown[]>) => {
return new Expression({
take: num,
collection: wrap(array),
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/tan
*/
Tan = (value: OrExpression<number>) => {
return new Expression({
tan: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functions/tanh
*/
Tanh = (value: OrExpression<number>) => {
return new Expression({
tanh: value,
});
};
/**
* @see https://docs.fauna.com/fauna/current/api/fql/functio