ObjectOS
Référence

Types de champ

Chaque type de champ que vous pouvez déclarer sur un objet — ce qu'il stocke, les options qu'il accepte, comment il apparaît dans REST, la Console et l'AI Builder.

Types de champ

48 types de champ intégrés, regroupés par famille. Le schéma Zod complet se trouve dans packages/spec/src/data/field.zod.ts — cette page en est un résumé pratique.

Propriétés fondamentales (chaque champ)

PropriétéTypeValeur par défautObjectif
namestring (snake_case)Identifiant machine — segment de chemin REST, colonne SQL
labelstringLibellé d'affichage dans la Console
typeFieldTypeVoir les tableaux de types ci-dessous
requiredbooleanfalseContrainte NOT NULL
uniquebooleanfalseIndex unique
searchablebooleanfalseIndexé pour /api/v1/search
multiplebooleanfalseStocke un tableau de valeurs
defaultValueunknownValeur initiale (littéral ou CEL)
columnNamestring= nameRemplace la colonne physique en base de données
hiddenbooleanfalseMasquer dans les vues Console par défaut
readonlybooleanfalseDésactiver dans les formulaires
systembooleanfalseInjecté automatiquement (id, created_at, …)
indexbooleanfalseCréer un index en base de données
externalIdbooleanfalseÉligible à l'upsert via clé externe
inlineHelpTextstringInfobulle / texte d'aide
conditionalRequiredprédicat PRequis lorsque le CEL est vrai
trackHistorybooleanfalseAffiche les changements de valeur sous forme d'entrées lisibles sur la timeline d'activité de l'enregistrement (ADR-0052)

Famille texte

TypeÀ utiliser pourOptions clés
textchaînes courtesmaxLength, minLength
textareamulti-lignemaxLength
emaile-mailformat validé ; mis en minuscules
urlURLformat validé
phonetéléphoneE.164
passwordsecrets à sens uniquehaché par le sous-système d'authentification ; jamais renvoyé par GET
secretsecrets réversibles (clés d'API, jetons, mots de passe de base de données)chiffré au repos via le fournisseur de cryptographie, stocké comme référence opaque, masqué à la lecture. Fail-closed — sans fournisseur configuré, les écritures lèvent une erreur plutôt que de persister du texte en clair
markdowncorps en markdownrendu dans l'aperçu de la Console
htmlHTML assainiDOMPurify à l'écriture
richtextWYSIWYGéditeur Console + JSON sérialisé

Nombres

TypeÀ utiliser pourOptions clés
numbernombres à virgule flottantemin, max, precision, scale
currencymontantscurrencyConfig: { precision, currencyMode: 'fixed' | 'dynamic', defaultCurrency }
percent0–100 %min, max, scale

integer et decimal ne sont pas des types distincts — utilisez number avec scale: 0 pour un entier, precision+scale pour un décimal fixe.

Date / heure

TypeStockeRemarques
datedate calendairesans fuseau horaire
datetimeinstantUTC
timeheure d'horlogesans date

Logique

TypeRemarques
booleanCase à cocher
toggleIdentique à boolean, interface à interrupteur

Sélection

TypeRemarques
selectChoix unique — options déclarées en ligne ou référencées depuis une picklist
multiselectPlusieurs choix, stockés sous forme de tableau
radioAlias d'interface pour select avec rendu en boutons radio
checkboxesAlias d'interface pour multiselect avec rendu en cases à cocher

Forme des options :

options: [
  { value: 'low',    label: 'Low' },
  { value: 'high',   label: 'High',   color: '#e02' },
  { value: 'urgent', label: 'Urgent', color: '#c00' }
]

Relations

TypeCardinalitéSémantique
lookupplusieurs-à-unRéférence souple ; supprimer le parent ne supprime pas l'enfant par défaut
master_detailplusieurs-à-un, en cascadeL'enfant ne peut exister sans parent ; les permissions héritent du parent
treeauto-référenceHiérarchique (parent_id sur le même objet)

Options courantes :

{
  type: 'lookup',
  reference: 'account',                       // target object name
  referenceFilters: ['status:active'],        // narrow the lookup picker
  deleteBehavior: 'set_null'                  // 'set_null' | 'cascade' | 'restrict'
}

Calculé

TypeCe qu'il faitOption clé
formulaValeur dérivée, évaluée à la lecture ou au recalculexpression: F\record.qty * record.unit_price`` — voir CEL
summaryAgrégation sur une relation enfantsummaryOperations: { object, field, function } (count | sum | avg | min | max)
autonumberNuméro d'affichage auto-incrémentéformat (par ex. TKT-{0000}), startAt

Exemple de formule :

{
  name: 'profit_margin',
  type: 'formula',
  expression: F`(record.revenue - record.cost) / record.revenue * 100`
}

Média

TypeÀ utiliser pourOption clé
imagepièces jointes imagefileAttachmentConfig (voir ci-dessous)
filetout fichieridentique
avatarphotos de profilrecadrage carré, valeurs par défaut sensées
videotéléversements vidéodurée + capture de miniature
audioaudioaperçu en forme d'onde
fileAttachmentConfig: {
  maxSize: 10_000_000,                        // bytes
  allowedTypes: ['image/png','image/jpeg'],
  virusScan: true,
  storageProvider: 's3',                       // see Configure → Storage
  imageValidation: { minWidth: 200, maxWidth: 4096, generateThumbnails: ['sm','md','lg'] }
}

Structuré

TypeStockeRemarques
jsonJSON arbitraireStocké en JSONB sur Postgres
compositesous-enregistrement avec champs nommésStructure en ligne, pas une table séparée
repeatertableau de valeurs compositesUn-à-plusieurs sans objet enfant

Interface enrichie

TypeRemarques
locationlat/long + précision
addressrue / ville / région / code postal / pays
codechamp de code source — language, theme, lineNumbers
colorcolorFormat: 'hex' | 'rgb' | 'rgba' | 'hsl', presetColors[]
rating1–N étoiles — max, icon
slidernombre borné avec interface à curseur
signaturesignature dessinée, stockée sous forme d'image
qrcodeaffiche la valeur sous forme de QR ou code-barres (EAN / UPC / Code128)
progresspourcentage dérivé affiché sous forme de barre
tagstableau de tags libres avec autocomplétion
vectorcolonne d'embedding — vectorConfig: { dimensions, distanceMetric: 'cosine' | 'euclidean', indexed, indexType: 'hnsw' | 'ivfflat' }

Champs système (injectés automatiquement sur chaque objet)

ChampTypeRemarques
idtext (ULID)clé primaire
created_atdatetimeheure d'insertion UTC
updated_atdatetimeheure de dernière écriture UTC
created_bylookup → userqui a inséré
updated_bylookup → userqui a écrit en dernier
versionintegerjeton de concurrence optimiste

Vous ne déclarez pas ces champs — désactivez-les par objet avec ObjectSpec.systemFields: false (rarement une bonne idée).

Comment les champs circulent à travers la pile

*.object.ts (field spec)

   ├─► Postgres / MySQL / SQLite column + index + constraint
   ├─► REST: validated on POST/PATCH, exposed on GET
   ├─► Console: form widget + list column
   ├─► AI Builder: tool argument schema (so the AI knows what to ask)
   └─► Audit: change-tracked if `trackHistory: true`

Voir aussi

On this page