Quelltext des aktuellen Standes
<?php
declare(strict_types=1);
/**
* Build-Helfer: erzeugt die Store-/Distributionsfassung der Vault-Browser-
* Erweiterung aus der einzigen Quelle der Wahrheit – den Heredocs in
* `src/Controllers/VaultApiController.php` (`extensionFiles()`).
*
* Die Dateien sind byte-identisch mit dem, was der Backend-Download unter
* `/admin/vault/extension/download` ausliefert. Das Ergebnis ist für den
* Chrome Web Store bzw. das eigenständige Repo `friloo/opennit-vault-extension`
* gedacht.
*
* Nutzung:
* php bin/build-extension-store.php [ZIELVERZEICHNIS]
*
* ZIELVERZEICHNIS Ordner, in den manifest.json, *.js, *.html und die Icons
* geschrieben werden. Default: ./build/opennit-vault-extension
*
* Es wird KEINE Web-Session, kein laufender Server und keine Datenbank benötigt:
* die Extension-Dateien sind statisch aus dem Quellcode ableitbar.
*/
require __DIR__ . '/../vendor/autoload.php';
use OpenNIT\Controllers\VaultApiController;
$target = $argv[1] ?? (__DIR__ . '/../build/opennit-vault-extension');
$target = rtrim($target, '/');
if (!is_dir($target) && !mkdir($target, 0775, true) && !is_dir($target)) {
fwrite(STDERR, "Zielverzeichnis konnte nicht angelegt werden: {$target}\n");
exit(1);
}
// extensionFiles() nutzt keinen Objektzustand (nur weitere private Heredoc-
// Methoden + das gebrandete Icon aus public/), daher genügt eine Instanz ohne
// Konstruktor. Für einen generischen Store-Build bleibt die Server-URL leer.
$ref = new ReflectionClass(VaultApiController::class);
$inst = $ref->newInstanceWithoutConstructor();
$method = $ref->getMethod('extensionFiles');
$method->setAccessible(true);
/** @var array<string,string> $files */
$files = $method->invoke($inst, '', 'OpenNIT Vault', '');
foreach ($files as $name => $content) {
file_put_contents($target . '/' . $name, $content);
printf(" %-16s %7d Bytes\n", $name, strlen($content));
}
printf("Fertig: %d Dateien nach %s geschrieben.\n", count($files), $target);