SlintORM
Docsnpm

@mask — Output Masking

Masks field values on read using built-in presets or custom directives. The raw value is always stored — masking only affects query results.

Syntax

src/interfaces.ts
// @mask:<preset>
ssn?: string;          // @mask:ssn
creditCard?: string;   // @mask:creditcard
maskedEmail?: string;  // @mask:email
phoneNumber?: string;  // @mask:phone
showFirst4?: string;   // @mask:showFirst:4
showLast4?: string;    // @mask:showLast:4
starMasked?: string;   // @mask:char:*
patternMasked?: string;// @mask:pattern:###-##-####

Presets

PresetInputOutput
ssn987-65-4321***-**-4321
creditcard4111-1111-1111-1111****-****-****-1111
emailjohn.doe@example.comj*****@example.com
phone555-123-4567***-***-4567

Custom Directives

DirectiveInputOutput
showFirst:NABCDEFGHIJABCD******
showLast:NABCDEFGHIJ******GHIJ
char:Xsecret-value********alue
pattern:... 123-45-6789###-##-####

Bypassing Masking

src/admin.ts
// .withoutMasking() returns raw values for privileged callers
const unmasked = await User.query()
  .withoutMasking()
  .where("name", "=", "Alice")
  .get();
console.log(unmasked[0].ssn);
// "987-65-4321" (raw value)

Errors

IssueCauseFix
Unknown presetTypo in preset nameUse one of: ssn, creditcard, email, phone
Non-string value masked@mask only works on string fieldsEnsure the field type is string

Conventions