VAMPIRE JS – Dokumentation

Dokumentation


VAMPIRE JS – Dokumentation

VAMPIRE JS ist VAMPIRE in JavaScript. Es nutzt dieselben Regelpakete wie VAMPIRE PHP und liefert für dieselbe Rechnung denselben Prüfbericht. Es läuft in Node, im Browser und in Office-Add-ins, und im Browser wird die Rechnung geprüft, ohne dass sie hochgeladen wird.



Worauf es ankommt

Nach unserer Kenntnis ist VAMPIRE PHP das einzige Werkzeug, das die offiziellen Prüfregeln für E-Rechnungen vollständig in reinem PHP ausführt. VAMPIRE JS bringt dieselben Regelpakete in reines JavaScript. Beide kommen ohne Java und ohne zusätzlichen Prozess aus, und die Rechnung verlässt Ihr System nicht.

Beleg: 220 von 220 Rechnungen, bei denen VAMPIRE und der offizielle KoSIT-Validator zum selben Ergebnis kamen, gemessen am 09.10.2026.


42 ms


durchschnittliche Prüfdauer je Rechnung mit VAMPIRE JS in Node, ermittelt an 253 Rechnungen

gemessen am 09.10.2026

1 163–1 193 ms


Prüfdauer von VAMPIRE JS in Chrome für eine große XRechnung in UBL mit 200 Rechnungspositionen

gemessen am 09.10.2026

3 459 von 3 459


Dateien, bei denen die Schemaprüfung von VAMPIRE JS zum selben Ergebnis kam wie die XML-Bibliothek libxml2

gemessen am 09.10.2026

29 942 Byte


Download-Größe von VAMPIRE JS für den Browser, also der Datei vampire.js mit gzip komprimiert, ohne Regelpakete

gemessen am 09.10.2026


So kommen Sie an VAMPIRE JS

VAMPIRE JS ist ein Kaufprodukt, das Sie im Shop von invoicePress.de erwerben. Sie erhalten das Paket als .tgz-Datei, und npm installiert es direkt aus dieser Datei; die einzelnen Schritte stehen in der npm-Anleitung. Das Paket braucht nur einen einzigen Baustein von außen, nämlich den XML-Parser für Node, und diesen Baustein bringt es selbst mit. Sie müssen also nichts weiter zusammensuchen.

Node
ab Version 18, auch auf der Kommandozeile
Browser
auch in einer HTML-Datei ohne Webserver
Office-Add-ins
Prüfung direkt im Add-in
VAMPIRE JS läuft in Node, im Browser und in Office-Add-ins, überall mit denselben Regelpaketen.

Ihre erste Prüfung in fünf Zeilen, in Node

Die folgende Datei prüft eine Rechnung. Sie gibt das Ergebnis aus, also angenommen oder abgelehnt, und dazu die Zahl der Befunde. Die Datei läuft so, wie sie hier steht. Rufen Sie sie im Ordner Ihrer package.json mit node check.mjs rechnung.xml auf.

// SPDX-License-Identifier: MIT
// Checks one e-invoice with VAMPIRE JS:  node check.mjs invoice.xml   ( run it in the folder of your package.json )
import { readFileSync } from 'node:fs';
import { Validator } from '@specialpress/einvoice-validator-js';
import { fromVampireFolder, DOMParser } from '@specialpress/einvoice-validator-js/node';

const rules = fromVampireFolder( 'node_modules/@specialpress/einvoice-validator-js/vampire' );
const validator = new Validator( { scenarios: rules.scenarios, loadRuleset: rules.loadRuleset, loadSchema: rules.loadSchema } );
const xml = readFileSync( process.argv[ 2 ], 'utf8' ).replace( /^/, '' );
const report = await validator.validate( new DOMParser().parseFromString( xml, 'text/xml' ), { name: process.argv[ 2 ] } );
console.log( process.argv[ 2 ] + ': ' + { true: 'accepted', false: 'rejected', null: 'no result' }[ report.accepted ], report.counts );

⚠️ Entfernen Sie das Byte-Order-Mark, bevor Sie den Parser aufrufen. Manche XML-Dateien beginnen mit dieser unsichtbaren Markierung. Ohne .replace( /^/, '' ) bricht der Parser bei einer solchen Datei mit einer Ausnahme ab und liefert keinen Bericht.


Befunde, positiver Prüfbericht und KoSIT-Format

// SPDX-License-Identifier: MIT
// Checks one e-invoice with VAMPIRE JS, prints the findings and writes the reports:  node report.mjs invoice.xml
//   report.json        the report, with the positive validation report ( every rule with its result )
//   report-kosit.xml   the report in the format of the KoSIT validator
import { readFileSync, writeFileSync } from 'node:fs';
import { Validator, kositXmlReport } from '@specialpress/einvoice-validator-js';
import { fromVampireFolder, DOMParser } from '@specialpress/einvoice-validator-js/node';

const rules = fromVampireFolder( 'node_modules/@specialpress/einvoice-validator-js/vampire' );
const validator = new Validator( { scenarios: rules.scenarios, loadRuleset: rules.loadRuleset, loadSchema: rules.loadSchema, ruleReport: true } );

// The bytes for the checksum of the positive report, the text without byte order mark for the parser.
const bytes = readFileSync( process.argv[ 2 ] );
const text = bytes.toString( 'utf8' ).replace( /^/, '' );
const doc = new DOMParser().parseFromString( text, 'text/xml' );
const report = await validator.validate( doc, { name: process.argv[ 2 ], source: bytes } );

for ( const f of report.findings ) console.log( f.severity.padEnd( 12 ), ( f.rule ?? '-' ).padEnd( 14 ), f.text.trim() );

console.log( report.ruleReport.counts );
writeFileSync( 'report.json', JSON.stringify( report, null, 2 ) );
writeFileSync( 'report-kosit.xml', kositXmlReport( report, { document: doc, source: text } ) );
process.exit( report.accepted === true ? 0 : 1 );

report.accepted ist true, false oder null. null bedeutet, dass es kein Ergebnis gibt. Das passiert, wenn ein Regelwerk fehlt, das die Rechnung braucht. Ein Regelwerk enthält die Prüfregeln eines Formats in einer Fassung, zum Beispiel die Regeln der XRechnung 3.0.2. report.ruleReport ist der positive Prüfbericht: Darin steht jede geprüfte Regel mit ihrem Ergebnis in einer eigenen Zeile. Er erscheint nur, wenn Sie ruleReport: true setzen.


So prüfen Sie im Browser

Für den Browser liegt VAMPIRE JS im Ordner vampire/. Darin stehen das Prüfprogramm vampire.js und die Regelpakete. Ihre Seite bindet vampire/vampire.js ein, und das Skript meldet sich dann unter dem Namen einvoiceVampire. Die Regelpakete lädt es beim ersten Gebrauch aus demselben Ordner nach. Die Rechnung wird im Browser gelesen und geprüft und nie hochgeladen. Die Seite funktioniert sogar als HTML-Datei, die Sie auf Ihrem Rechner per Doppelklick öffnen, ganz ohne Webserver.

<!doctype html>
<!-- SPDX-License-Identifier: MIT -->
<!--
	An e-invoice check in a plain web page with VAMPIRE JS. Put this file next to the folder vampire/ of your VAMPIRE JS
	copy. The invoice is read and checked in the browser; nothing is uploaded. The page also works when opened by
	double click ( file:// ), because vampire.js loads its rule packages as scripts, not with fetch.
-->
<html lang="en">
<meta charset="utf-8">
<title>E-invoice check</title>
<input type="file" id="file" accept=".xml">
<pre id="out"></pre>
<script src="vampire/vampire.js"></script>
<script>
document.getElementById( 'file' ).addEventListener( 'change', async ( event ) => {
	const file = event.target.files[ 0 ];
	const report = await einvoiceVampire.validate( await file.text(), { name: file.name, lang: 'en', ruleReport: true } );
	document.getElementById( 'out' ).textContent = report.text + '\n\n' + JSON.stringify( report.ruleReport.counts );
} );
</script>
</html>

So prüfen Sie mehrere Fassungen auf einmal

einvoiceVampire.cascade( xml ) prüft eine ZUGFeRD- oder Factur-X-Rechnung zuerst nach den Regeln der neuesten Fassung und, falls sie dort abgelehnt wird, nach den Regeln der nächstälteren. Die Prüfung hält bei der ersten Fassung an, nach deren Regeln die Rechnung angenommen wird. Nimmt keine Fassung die Rechnung an, liefert die Funktion den Bericht der neuesten Fassung, denn die Rechnung ist dann in jeder Fassung fehlerhaft, und die neueste ist die maßgebliche. Mit { full: true } prüft die Funktion jede Fassung und liefert eine Tabelle mit einer Zeile je Fassung; so sehen Sie das Ergebnis jeder einzelnen Fassung. Dafür muss der Ordner vampire/ die Regelpakete jeder Fassung enthalten. Im Spielfeld wird genau diese Funktion laufen.


So prüfen Sie auf der Kommandozeile

npx einvoice-validate-js validate rechnung.xml
npx einvoice-validate-js validate rechnung.xml --format=xml
npx einvoice-validate-js validate rechnung.xml --format=json --rule-report
npx einvoice-validate-js selftest

Textausgabe, JSON-Ausgabe und Rückgabewerte sind dieselben wie bei VAMPIRE PHP; wer beide Ausführungen nutzt, muss nichts umstellen. Der Rückgabewert ist 0 bei einer angenommenen Rechnung. Er ist 1 bei einer abgelehnten Rechnung oder bei einer Rechnung ohne Ergebnis, und bei einem falschen Aufruf ist er 2. Die Option --format=xml gibt den Bericht im Format des KoSIT-Validators aus.

Gleiches Ergebnis wie der KoSIT-Validator220 von 220
Schemaprüfung mit gleichem Ergebnis wie libxml23 459 von 3 459
Messungen vom 9. Oktober 2026: Ergebnis im Vergleich mit dem offiziellen KoSIT-Validator und Schemaprüfung im Vergleich mit der XML-Bibliothek libxml2.

Wie wir gemessen haben, steht im Abschnitt „Wie gemessen wurde“ am Ende dieser Seite. Wenn VAMPIRE JS zu Ihrem Projekt passt, erwerben Sie es im Shop von invoicePress.de.


Wie gemessen wurde

  • 220 von 220 Rechnungen, bei denen VAMPIRE und der offizielle KoSIT-Validator zum selben Ergebnis kamen (gemessen am 09.10.2026): Wir haben 253 Testrechnungen mit VAMPIRE und mit dem offiziellen KoSIT-Validator geprüft. 220 davon konnten beide einem Regelwerk zuordnen, und bei allen 220 kamen beide zum selben Ergebnis, also angenommen oder abgelehnt. Bei 215 dieser 220 Rechnungen lösten sogar genau dieselben Regeln aus; bei den übrigen fünf liegt der Unterschied an der Fassung der EN-16931-Regeln für CII, denn der KoSIT-Validator bringt die Fassung 1.3.15 mit und VAMPIRE die Fassung 1.3.16. Die restlichen 33 Rechnungen konnte keines der beiden Prüfprogramme einem Regelwerk zuordnen. Stand der Messung: 9. Oktober 2026.
  • 42 ms durchschnittliche Prüfdauer je Rechnung mit VAMPIRE JS in Node, ermittelt an 253 Rechnungen (gemessen am 09.10.2026): Wir haben die Prüfdauer über dieselben 253 Rechnungen auf einem Entwicklungsrechner gemessen. VAMPIRE JS in Node brauchte im Durchschnitt 42 ms je Rechnung; darin ist die Schemaprüfung enthalten, das Lesen und Parsen der Datei nicht. VAMPIRE PHP brauchte im selben Vergleich 261 ms je Rechnung, dort einschließlich Lesen und Parsen.
  • 1 163–1 193 ms Prüfdauer von VAMPIRE JS in Chrome für eine große XRechnung in UBL mit 200 Rechnungspositionen (gemessen am 09.10.2026): Wir haben die Prüfdauer im Browser mit drei Rechnungen gemessen. Chrome brauchte für eine XRechnung in UBL mit 200 Positionen 1 163 bis 1 193 ms, für dieselbe Rechnung in CII 743 bis 999 ms und für eine Factur-X-Rechnung im Profil EXTENDED 146 ms beim ersten und 52 ms beim zweiten Lauf. Für die UBL-Rechnung brauchte Edge 1 022 bis 1 202 ms und Firefox 1 218 bis 2 120 ms, wobei der erste Lauf der langsamste war. Alle drei Browser kamen zu denselben Ergebnissen.
  • 3 459 von 3 459 Dateien, bei denen die Schemaprüfung von VAMPIRE JS zum selben Ergebnis kam wie die XML-Bibliothek libxml2 (gemessen am 09.10.2026): VAMPIRE JS prüft den Aufbau einer Rechnung mit einem Modell, das aus den XSD-Schemadateien übersetzt ist. Wir haben dieses Modell mit der XML-Bibliothek libxml2 verglichen, und zwar am Prüfkorpus und an daraus erzeugten fehlerhaften Kopien, zusammen 3 459 Dateien, von denen libxml2 2 528 ablehnt. Das Ergebnis stimmte in allen 3 459 Fällen überein. Die Schemaprüfung ist dennoch keine vollständige XSD-Prüfung, und das steht auch in jedem Bericht.
  • 29 942 Byte Download-Größe von VAMPIRE JS für den Browser, also der Datei vampire.js mit gzip komprimiert, ohne Regelpakete (gemessen am 09.10.2026): Wir haben die Größe der Datei vampire.js gemessen, die den Browser-Teil von VAMPIRE JS enthält. Sie ist 88 071 Byte groß und wird, mit gzip komprimiert, mit 29 942 Byte übertragen. Die Regelpakete sind darin nicht enthalten; der Browser lädt sie beim ersten Gebrauch aus demselben Ordner nach.

VAMPIRE PHP frei, VAMPIRE JS im Shop.

VAMPIRE PHP und alle Regelpakete sind frei und liegen auf GitHub und Packagist. VAMPIRE JS erwerben Sie im Shop von invoicePress.de.