Skip to content

Scalars

Scalars are simple types that don’t have any fields. Examples of these include string, int32, boolean, and so on.

You can declare a scalar by using the scalar keyword. Its name must be an identifier.

scalar ternary;

You can create a new scalar that extends an existing one by using the extends keyword.

scalar Password extends string;

Scalars can also support template parameters. These template parameters are primarily used for decorators.

@doc(Type)
scalar Unreal<Type extends valueof string>;

Scalars can be declared with a constructor for creating specific scalar values based on other values. For example:

scalar ipv4 extends string {
init fromInt(value: uint32);
}
const homeIp = ipv4.fromInt(2130706433);

Constructors do not have any runtime code associated with them. Instead, they merely record the scalar constructor invoked along with the arguments passed so that emitters can construct the proper value when needed.

The built-in date and time scalars provide constructors for common use cases:

const date = plainDate.fromISO("2024-05-06");
const time = plainTime.fromISO("12:34");
const timestamp = utcDateTime.fromISO("2024-05-06T12:20:00Z");
const offsetTime = offsetDateTime.fromISO("2024-05-06T12:20:00-07:00");
const period = duration.fromISO("P1Y1D");

The now() constructor indicates that the current date or time should be used. Emitters interpret this as the appropriate runtime value (e.g., database CURRENT_TIMESTAMP, JavaScript Date.now(), etc.).

model Record {
createdAt: utcDateTime = utcDateTime.now();
updatedAt: utcDateTime = utcDateTime.now();
}
model Event {
date: plainDate = plainDate.now();
time: plainTime = plainTime.now();
}