When you want to evaluate a JavaScript null inside Polar, you use nil instead of null. This is mentioned in the docs here.
Suppose you had a User class and Item class in JavaScript as follows:
class User {}
class Item {
locked: boolean | null;
constructor(props: { locked: boolean | null }) {
this.locked = props.locked;
}
}
It's pretty unrealistic to allow null for the locked property but this is for demonstration. From here, if you'd like to allow a read action when the locked property is null, you can write the polar policy as follows:
actor User {}
allow(actor, action, resource) if
has_permission(actor, action, resource);
resource Item {
permissions = ["read"];
}
has_permission(_actor: User, "read", item: Item) if
item.locked = nil; # use `nil` to check `null`
See how nil is used to check if item.locked is null in the JavaScript side.
You can verify that this works as expected with the code bellow.
// Arrange
const user = new User();
const item = new Item({ lock