ObjectOS
Referenz

CEL-Ausdrücke

Die Ausdruckssprache, die für Formeln, Prädikate, Zeitpläne und vorlagenbasierte Zeichenketten verwendet wird — bereitgestellt über fünf getaggte Templates.

CEL-Ausdrücke

ObjectOS verwendet CEL (Common Expression Language) überall dort, wo Sie einen kleinen, sicheren, sandboxed Ausdruck benötigen: Formelfelder, Validierungsregeln, Sichtbarkeitsprädikate, Freigabebedingungen, Flow-Guards, Zeitpläne und vorlagenbasierte Zeichenketten.

Das Erstellen erfolgt über fünf getaggte Templates, die aus @objectstack/spec importiert werden. Sie alle erzeugen ein kleines JSON-Objekt, das die Laufzeit parst:

{ dialect: 'cel' | 'template' | 'cron', source: string }

Schema-Quelle: packages/spec/src/shared/expression.zod.ts.

Die fünf getaggten Templates

TemplateDialektVerwendung fürBeispiel
F`...`celFormelfelder — abgeleitete Werte, die zusammen mit dem Datensatz gespeichert werdenF`record.amount * 0.1`
P`...`celPrädikate — Booleans für Validierung / Freigabe / Sichtbarkeit / BedingungenP`record.status == "open"`
cel`...`celAllgemeines CEL — wenn weder F noch P passt (z. B. ein Parameterwert)cel`now() + duration("P30D")`
tmpl`...`templateZeichenketten-Templates mit {{var}}-Interpolationtmpl`Order from {{record.customer.name}}`
cron`...`cronZeitpläne — standardmäßige Cron-Syntax mit 5 Felderncron`0 9 * * 1-5`

Zur Auswertungszeit gibt es keinen funktionalen Unterschied zwischen F, P und cel — sie alle führen CEL aus. Die Aufteilung existiert, damit Schemas (und KI-Agenten) wissen, welche Rolle der Ausdruck spielt, und damit der Editor eine Typprüfung durchführen kann (Formeln müssen einen Wert zurückgeben, Prädikate müssen einen Boolean zurückgeben).

Import

import { F, P, cel, tmpl, cron } from '@objectstack/spec'

Wo jedes verwendet wird

Feld einer SpecTagBeispielort
Field.expression (Formeltyp)F*.object.ts Formelfelder
Field.conditionalRequiredPObjektfelder
Validation.predicatePObjektvalidierungen
SharingRule.conditionPFreigaberegeln
View.conditionalFormatting[].conditionPAnsichten
Flow.step.when / Flow.transition.whenPFlows
Action.guardPAktionen
Benachrichtigungsbetreffe / NachrichtentextetmplBenachrichtigungen
Schedule.croncrongeplante Flows / Berichte
Beliebiger WertparametercelFlow-Schritt-Eingaben

Variablen-Geltungsbereich

CEL-Ausdrücke werden in einem Kontext mit diesen Top-Level-Variablen ausgewertet:

VariableVerfügbar wennInhalt
recordfast immerDer aktuell ausgewertete Datensatz
previousbei Update-Hooks / ÄnderungserkennungDer Zustand des Datensatzes vor der Änderung (oder null)
inputAktionen, Flow-SchritteDie vom Benutzer bereitgestellte Eingabe-Payload
os.userimmer{ id, roles: string[], permissions: string[] }
os.orgimmerOrganisations- / Mandantenkontext
os.envimmerFür Ausdrücke verfügbar gemachte Umgebungsvariablen

Die veralteten Variablen OLD / NEW wurden in M9.5 entfernt. Verwenden Sie previous und record.

Standardbibliothek

Registriert in packages/formula/src/stdlib.ts. Die am häufigsten verwendeten Built-ins:

Zeit

FunktionGibt zurückHinweise
now()TimestampAn den Auswertungskontext gebunden — innerhalb einer Abfrage stabil
today()TimestampBeginn des UTC-Tages
daysFromNow(int)TimestampZukünftiges Datum
daysAgo(int)TimestampVergangenes Datum

CEL enthält außerdem die nativen timestamp(...), duration(...), date.getDayOfWeek() usw. — siehe die CEL-Spezifikation.

Hilfsfunktionen

FunktionZweck
isBlank(x)true wenn null, undefined, "" oder leere Liste
coalesce(a, b)Erster Nicht-Null-Wert
trim(s)Whitespace entfernen
joinNonEmpty(list, sep)Nicht-leere Einträge verketten

Native CEL-String-Helfer (.contains(...), .startsWith(...), .matches(...), .size()) sind immer verfügbar.

Beispiele

Formelfeld — Positionssumme:

{ name: 'subtotal', type: 'formula', expression: F`record.quantity * record.unit_price` }

Validierung — Abschlussdatum muss nach heute liegen:

{ message: 'Close date must be in the future', predicate: P`record.close_date > today()` }

Sichtbarkeit — Feld nur für Manager anzeigen:

{ visibleIf: P`'manager' in os.user.roles` }

Flow-Guard — Schritt überspringen, wenn der Betrag klein ist:

{ when: P`record.amount >= 1000` }

Zeitplan — wochentags 9 Uhr:

{ schedule: cron`0 9 * * 1-5` }

Template — Benachrichtigungsbetreff:

{ subject: tmpl`[{{record.priority}}] {{record.subject}}` }

Fehler

Ausdrücke werden zur Ladezeit kompiliert. Fehler erscheinen als VALIDATION_ERROR mit der Quellposition:

{ "code": "VALIDATION_ERROR", "message": "CEL: unknown field 'amout' on Record", "details": { "field": "subtotal", "expression": "record.amout * 0.1" } }

Ungültige Ausdrücke scheitern nicht stillschweigend. Ein fehlerhafter Ausdruck oder einer mit unbekanntem Feld lässt os compile mit der oben gezeigten lokalisierten Meldung fehlschlagen (einschließlich eines „Meinten Sie"-Hinweises bei einem falsch geschriebenen Feld). Zur Laufzeit wirft ein fehlerhafter Ausdruck einen zugeordneten Fehler, anstatt stillschweigend zu null oder false ausgewertet zu werden, sodass der Fehler in den Logs und im Audit-Trail sichtbar ist, statt einen Formelwert oder eine Guard-Entscheidung unbemerkt zu beschädigen.

Siehe auch

On this page