xPulse
🇩🇪 DE

@xpulse/config – Component Spec

Status: CONCEPT · Aktualisiert März 2026 Übergeordnet: GLOBAL_concept-ecosystem.md


Übersicht

Liest und validiert xpulse.json, löst ${ENV_VAR} Referenzen auf und stellt die Konfiguration via config.get() bereit.

Eine Aufgabe: xpulse.json kennen und zugänglich machen – nicht mehr.


Dependencies

@xpulse/config
├── @xpulse/dotenv ← .env laden vor ${VAR} Auflösung
└── @xpulse/eventconfig:loaded feuern

API

Laden

import config from '@xpulse/config';
// Lädt xpulse.json aus dem aktuellen Arbeitsverzeichnis
await config.load();
// Expliziter Pfad
await config.load({ path: '/app/xpulse.json' });

Merge-Reihenfolge

config.load() baut die Konfiguration in drei Schichten auf:

1. Hardcoded DEFAULTS ← niedrigste Priorität
2. node_modules/@xpulse/*/xpulse.json ← alphabetisch gemergt
3. App-eigene xpulse.json ← höchste Priorität, überschreibt alles

Alle installierten @xpulse/* Packages können so Default-Konfiguration mitliefern, die automatisch aktiv wird – ohne dass die App etwas konfigurieren muss. Die App-eigene xpulse.json hat immer Vorrang.

Beispiel: @xpulse/doc liefert alle Docs-Sources als Default mit. Wer eine Source deaktivieren will, setzt in der App-xpulse.json:

{ "docs": { "sources": { "event": { "docs": false } } } }

Standard-Keys direkt

config.name // 'xpulse-web'
config.type // 'tool'

Alle Keys via get()

config.get('name') // 'xpulse-web'
config.get('type') // 'tool'
config.get('http.port') // '3000'
config.get('theme.default') // 'dark'
config.get('i18n.locales') // ['de', 'en']
config.get('sources.chat.url') // 'https://chat.xpulse.one'
config.get('release.current') // '1.3.0' (custom key)
// Mit Fallback
config.get('http.port', '3000') // Fallback wenn nicht gesetzt
config.get('missing.key', null) // null

Vollständiges Objekt

config.all();
// → vollständiges Objekt mit Fallbacks und aufgelösten ${VAR} Werten

${ENV_VAR} Auflösung

xpulse.json kann auf .env Werte referenzieren:

{
"name": "xpulse-web",
"type": "page",
"http": {
"port": "${PORT}"
},
"sources": {
"chat": {
"url": "${CHAT_URL}",
"health": "${CHAT_HEALTH_URL}"
}
}
}

config.load() löst alle ${VAR} Referenzen auf – nach @xpulse/dotenv Laden:

await config.load();
config.get('http.port') // '3000' (aus .env: PORT=3000)
config.get('sources.chat.url') // 'https://chat.xpulse.one'

Nicht aufgelöste Variablen (nicht in .env und nicht in process.env) bleiben als ${VAR} stehen und erzeugen eine Warnung.


Fallback-Werte (Konvention)

Key Fallback
type 'tool'
theme.default 'dark'
i18n.default 'de'
i18n.locales ['de']
paths.templates 'src/templates/'
paths.locales 'src/locales/'
paths.public 'src/public/'
http.port process.env.PORT || '3000'
sources.*.docs false
sources.*.type 'tool'

Validierung

config.load() validiert bekannte Standard-Keys:

Fehler Verhalten
xpulse.json nicht gefunden wirft Error
Ungültiges JSON wirft Error
name fehlt wirft Error
Unbekannte Keys ignoriert, keine Warnung
${VAR} nicht auflösbar Warnung, Wert bleibt ${VAR}

Gefeuerte Events

Event Payload Wann
config:loaded { name, type, env, files, packages } nach erfolgreichem config.load()
import event from '@xpulse/event';
event.on('config:loaded', ({ name, type, env, files, packages }) => {
// name – App-Name aus xpulse.json
// type – 'tool' | 'component' | ...
// env – NODE_ENV
// files – geladene Dateien [xpulse.json, .env, ...]
// packages – gemergete Package-Configs ['@xpulse/doc', '@xpulse/theme', ...]
});

Debug Integration

Wenn @xpulse/debug als devDependency installiert ist, stellt @xpulse/config automatisch einen DataCollector bereit. @xpulse/debug discovert ihn via node_modules/@xpulse/config/src/datacollectors/ – keine Konfiguration nötig.

"optionalDependencies": {
"@xpulse/debug": "^1.0.0"
}

Der ConfigCollector (name: 'config', icon: '🔧') zeigt im Web Profiler:

Objekt-Werte in der Summary (z.B. der debug-Block) werden als JSON serialisiert. Kein Toolbar-Badge.


Paket-Struktur

@xpulse/config/
src/
index.js ← default export: config-Objekt
defaults.js ← Fallback-Werte (intern)
resolver.js ← ${VAR} Auflösung (intern)
validator.js ← Standard-Keys validieren (intern)
test/
config.test.js
resolver.test.js
validator.test.js
docs/
index.md
api.md
_meta.json
Dockerfile
Makefile
README.md
package.json
xpulse.json
de/spec.md 2026-03-27