Dieses Dokument wurde von KI übersetzt. Für genaue Informationen lesen Sie bitte die englische Version.
RunJS-Plugin-Erweiterungspunkte (ctx-Dokumentation / Snippets / Szenen-Mapping)
Wenn ein Plugin RunJS-Funktionen hinzufügt oder erweitert, wird empfohlen, das „Kontext-Mapping / die ctx-Dokumentation / den Beispielcode“ über die offiziellen Erweiterungspunkte zu registrieren. Dies stellt sicher, dass:
- Der CodeEditor automatische Vervollständigungen für
ctx.xxx.yyybereitstellen kann. - KI-Coding strukturierte
ctx-API-Referenzen + Beispiele erhält.
Dieses Kapitel stellt zwei Erweiterungspunkte vor:
registerRunJSContextContribution(...)registerRunJSSnippet(...)
1. registerRunJSContextContribution
Wird verwendet, um RunJS-„Beiträge“ (Contributions) zu registrieren. Typische Verwendungszwecke sind:
- Hinzufügen/Überschreiben von
RunJSContextRegistry-Mappings (modelClass->RunJSContext, einschließlichscenes). - Erweitern von
RunJSDocMeta(Beschreibungen/Beispiele/Vervollständigungsvorlagen für diectx-API) fürFlowRunJSContextoder benutzerdefinierteRunJSContext.
Verhaltensbeschreibung
- Beiträge werden in der Phase
setupRunJSContexts()gesammelt ausgeführt. - Wenn
setupRunJSContexts()bereits abgeschlossen ist, wird eine verspätete Registrierung sofort ausgeführt (ein erneuter Setup-Durchlauf ist nicht erforderlich). - Jeder Beitrag wird für jede
RunJSVersionhöchstens einmal ausgeführt.
Beispiel: Hinzufügen eines JS-beschreibbaren Modell-Kontexts
2. registerRunJSSnippet
Wird verwendet, um Beispiel-Code-Snippets für RunJS zu registrieren, die für folgende Zwecke genutzt werden:
- Snippet-Vervollständigung im CodeEditor.
- Als Beispiele/Referenzmaterial für KI-Coding (filterbar nach Szene/Version/Sprache).
Empfohlene ref-Benennung
Es wird empfohlen, folgendes Format zu verwenden: plugin/<pluginName>/<topic>, zum Beispiel:
plugin/plugin-my/fooplugin/plugin-my/api-request-example
Vermeiden Sie Konflikte mit den Namespaces global/* oder scene/* des Kernsystems.
Konfliktstrategie
- Standardmäßig werden bestehende
ref-Einträge nicht überschrieben (gibtfalsezurück, ohne einen Fehler auszulösen). - Um explizit zu überschreiben, übergeben Sie
{ override: true }.
Beispiel: Registrieren eines Snippets
3. Best Practices
- Schichtweise Wartung von Dokumentation + Snippets:
RunJSDocMeta: Beschreibungen/Vervollständigungsvorlagen (kurz, strukturiert).- Snippets: Lange Beispiele (wiederverwendbar, filterbar nach Szene/Version).
- Vermeiden Sie zu lange Prompts: Beispiele sollten prägnant sein; bevorzugen Sie „minimal lauffähige Vorlagen“.
- Szenen-Priorität: Wenn Ihr JS-Code primär in Szenarien wie Formularen oder Tabellen läuft, stellen Sie sicher, dass das Feld
sceneskorrekt ausgefüllt ist, um die Relevanz von Vervollständigungen und Beispielen zu erhöhen.
4. Ausblenden von Vervollständigungen basierend auf dem tatsächlichen ctx: hidden(ctx)
Bestimmte ctx-APIs sind stark szenenabhängig (z. B. ist ctx.popup nur verfügbar, wenn ein Popup oder eine Schublade geöffnet ist). Wenn Sie diese nicht verfügbaren APIs bei der Vervollständigung ausblenden möchten, können Sie hidden(ctx) für den entsprechenden Eintrag in RunJSDocMeta definieren:
- Rückgabe von
true: Blendet den aktuellen Knoten und seinen Unterbaum aus. - Rückgabe von
string[]: Blendet bestimmte Unterpfade unter dem aktuellen Knoten aus (unterstützt die Rückgabe mehrerer Pfade; Pfade sind relativ; Unterbäume werden basierend auf Präfix-Übereinstimmung ausgeblendet).
hidden(ctx) unterstützt async: Sie können await ctx.getVar('ctx.xxx') verwenden, um die Sichtbarkeit zu bestimmen (nach eigenem Ermessen). Es wird empfohlen, diese Logik schnell und nebenwirkungsfrei zu halten (vermeiden Sie z. B. Netzwerkanfragen).
Beispiel: Zeige ctx.popup.* Vervollständigungen nur an, wenn popup.uid existiert.
Beispiel: Popup ist verfügbar, aber einige Unterpfade sind ausgeblendet (nur relative Pfade; z. B. Ausblenden von record und parent.record).
Hinweis: Der CodeEditor aktiviert immer die Filterung der Vervollständigung basierend auf dem tatsächlichen ctx (Fail-Open, löst keine Fehler aus).
5. Laufzeit-info/meta und Kontext-Informations-API (für Vervollständigungen und LLMs)
Zusätzlich zur statischen Wartung der ctx-Dokumentation über FlowRunJSContext.define() können Sie zur Laufzeit über FlowContext.defineProperty/defineMethod info/meta injizieren. Sie können dann über die folgenden APIs serialisierbare Kontextinformationen für den CodeEditor oder LLMs ausgeben:
await ctx.getApiInfos(options?): Statische API-Informationen.await ctx.getVarInfos(options?): Informationen zur Variablenstruktur (bezogen ausmeta, unterstützt Pfad-/maxDepth-Erweiterung).await ctx.getEnvInfos(): Snapshot der Laufzeitumgebung.
5.1 defineMethod(name, fn, info?)
info unterstützt (alle optional):
description/detail/examplesref: string | { url: string; title?: string }params/returns(JSDoc-ähnlich)
Hinweis:
getApiInfos()gibt statische API-Dokumentationen aus und enthält keine Felder wiedeprecated,disabledoderdisabledReason.
Beispiel: Bereitstellung von Dokumentationslinks für ctx.refreshTargets().
5.2 defineProperty(key, { meta?, info? })
meta: Wird für die Benutzeroberfläche der Variablen-Auswahl verwendet (getPropertyMetaTree/FlowContextSelector). Es bestimmt die Sichtbarkeit, Baumstruktur, Deaktivierung usw. (unterstützt Funktionen/async).- Häufige Felder:
title/type/properties/sort/hidden/disabled/disabledReason/buildVariablesParams
- Häufige Felder:
info: Wird für die statische API-Dokumentation (getApiInfos) und Beschreibungen für LLMs verwendet. Es beeinflusst nicht die Benutzeroberfläche der Variablen-Auswahl (unterstützt Funktionen/async).- Häufige Felder:
title/type/interface/description/examples/ref/params/returns
- Häufige Felder:
Wenn nur meta bereitgestellt wird (ohne info):
getApiInfos()gibt diesen Schlüssel nicht zurück (da statische API-Dokumente nicht ausmetaabgeleitet werden).getVarInfos()baut die Variablenstruktur basierend aufmetaauf (verwendet für Variablen-Auswähler/dynamische Variablenbäume).
5.3 Kontext-Informations-API
Wird verwendet, um „verfügbare Kontext-Fähigkeitsinformationen“ auszugeben.
Häufige Parameter:
getApiInfos({ version }): Version der RunJS-Dokumentation (Standard istv1).getVarInfos({ path, maxDepth }): Kürzung und maximale Erweiterungstiefe (Standard ist 3).
Hinweis: Die von den obigen APIs zurückgegebenen Ergebnisse enthalten keine Funktionen und eignen sich zur direkten Serialisierung für LLMs.
5.4 await ctx.getVar(path)
Wenn Sie nur einen „Variablenpfad-String“ haben (z. B. aus einer Konfiguration oder Benutzereingabe) und den Laufzeitwert dieser Variable direkt abrufen möchten, verwenden Sie getVar:
- Beispiel:
const v = await ctx.getVar('ctx.record.roles.id') pathist ein Ausdruckspfad, der mitctx.beginnt (z. B.ctx.record.id/ctx.record.roles[0].id).
Zusätzlich: Methoden oder Eigenschaften, die mit einem Unterstrich _ beginnen, werden als private Mitglieder behandelt und erscheinen nicht in der Ausgabe von getApiInfos() oder getVarInfos().

