Plugin support: Plugin-Daten im Projekt speichern (pluginData mit Undo) #120

Open
opened 2026-09-17 20:30:08 +02:00 by meleki · 0 comments
Owner

Folge von #117, Punkt 4. Dort entschieden: Plugin-Daten liegen nur im Projekt. Eine serverweite Datei data/plugins/<id>.json gibt es nicht — auch die Einstellungen eines Plugins liegen im Projekt und gelten nur dort.

Befund

deserializeProject (src/core/store/serialize.ts) wirft beim Laden alles weg, was das Schema nicht kennt. Eigene Keys in asset.props sind nach dem Neuladen also weg. Ohne einen deklarierten Platz kann kein Plugin etwas speichern.

Zu bauen

  • pluginData?: { [pluginId: string]: JsonValue } am Asset und am Projekt selbst.
  • Beim Laden unangetastet durchreichen, auch wenn das Plugin gerade aus ist. Sonst löscht Abschalten plus Speichern die Daten.
  • Geschrieben wird nur über ein Kommando mit Undo: api.project.setData(assetId | null, value). Direkten Zugriff aufs Modell gibt es weiterhin nicht.
  • Gelesen wird als Kopie: api.project.data(assetId | null), wie bei assets().
  • Ein Plugin sieht nur seine eigenen Daten, der Schlüssel ist meta.id. Fremde Schlüssel bleiben unsichtbar und unangetastet.
  • Wird ein Asset gelöscht, gehen seine Plugin-Daten mit; Undo bringt beides zurück.
  • Fehlt pluginData, ist es leer — kein formatVersion-Bump.
  • Tests: Unit-Tests für das Überleben eines Speicher- und Ladezyklus bei abgeschaltetem Plugin, Undo, Abschottung zwischen zwei Plugins.

Offen (mit Vorschlag)

  • Eigenes Ereignis für Datenänderungen? Vorschlag: ja, api.project.on('data'), damit ein Tab oder eine Inspector-Section gezielt auffrischt, statt an change zu hängen.
  • Größengrenze pro Plugin? Vorschlag: keine harte Grenze, aber eine Warnung in der Console ab etwa 256 KB je Plugin.
  • Daten eines Plugins, das gar nicht mehr in data/plugins/ liegt? Vorschlag: bleiben stehen, nichts räumt sie weg.
Folge von #117, Punkt 4. Dort entschieden: Plugin-Daten liegen **nur im Projekt**. Eine serverweite Datei `data/plugins/<id>.json` gibt es nicht — auch die Einstellungen eines Plugins liegen im Projekt und gelten nur dort. ## Befund `deserializeProject` (`src/core/store/serialize.ts`) wirft beim Laden alles weg, was das Schema nicht kennt. Eigene Keys in `asset.props` sind nach dem Neuladen also weg. Ohne einen deklarierten Platz kann kein Plugin etwas speichern. ## Zu bauen - `pluginData?: { [pluginId: string]: JsonValue }` am **Asset** und am **Projekt** selbst. - Beim Laden **unangetastet** durchreichen, auch wenn das Plugin gerade aus ist. Sonst löscht Abschalten plus Speichern die Daten. - Geschrieben wird nur über ein Kommando mit Undo: `api.project.setData(assetId | null, value)`. Direkten Zugriff aufs Modell gibt es weiterhin nicht. - Gelesen wird als Kopie: `api.project.data(assetId | null)`, wie bei `assets()`. - Ein Plugin sieht nur seine eigenen Daten, der Schlüssel ist `meta.id`. Fremde Schlüssel bleiben unsichtbar und unangetastet. - Wird ein Asset gelöscht, gehen seine Plugin-Daten mit; Undo bringt beides zurück. - Fehlt `pluginData`, ist es leer — kein `formatVersion`-Bump. - Tests: Unit-Tests für das Überleben eines Speicher- und Ladezyklus bei abgeschaltetem Plugin, Undo, Abschottung zwischen zwei Plugins. ## Offen (mit Vorschlag) - Eigenes Ereignis für Datenänderungen? Vorschlag: ja, `api.project.on('data')`, damit ein Tab oder eine Inspector-Section gezielt auffrischt, statt an `change` zu hängen. - Größengrenze pro Plugin? Vorschlag: keine harte Grenze, aber eine Warnung in der Console ab etwa 256 KB je Plugin. - Daten eines Plugins, das gar nicht mehr in `data/plugins/` liegt? Vorschlag: bleiben stehen, nichts räumt sie weg.
admin added this to the Development project 2026-09-17 20:32:57 +02:00
admin added the question label 2026-09-20 13:39:03 +02:00
admin added the low-priority label 2026-09-21 08:09:06 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#120