1/** 2 * Dev-Wächter für den Frontend-Export der Companion-Optionen. 3 * 4 * head.tpl (Block 'layout-head-niu-settings') exportiert nach window.niu.settings nur noch eine 5 * Whitelist der Optionen, die das Frontend-JS wirklich liest. Wer eine Option liest, die dort 6 * nicht steht, bekommt still `undefined` â der Fehler fällt dann erst im Verhalten auf, oft weit 7 * entfernt von der Ursache. 8 * 9 * Dieser Wächter legt einen Proxy über das Objekt und meldet jeden Zugriff auf einen nicht 10 * exportierten Schlüssel einmalig per console.warn. Er ändert kein Verhalten: der Proxy liefert 11 * exakt das, was das Objekt selbst geliefert hätte. 12 * 13 * Feuert er im Normalbetrieb, ist NICHT der Wächter falsch, sondern die Whitelist unvollständig. 14 * 15 * Der Wächter muss vor allen Lesern laufen. Deshalb wird er als Seiteneffekt-Import eingebunden: 16 * - Bundle-Modus: erster Import in niu.app.js 17 * - Einzelmodul-Modus: erster Import in niu.controller.js, dem ersten Modul beider Footer 18 * niu.slider.js ist davon unberührt (klassisches Skript im Head), liest seine Werte aber erst 19 * nach DOMContentLoaded â also nach diesem Modul. 20 * 21 * Importiert wird über den Bare-Specifier 'niu-settings' (Importmap in head.tpl, Alias in 22 * webpack.config.js). Ein relativer Import bekäme keinen Cache-Buster: ES-Module-Imports erben 23 * das ?v= der importierenden URL nicht. 24 */ 25 26/* Schlüssel, die JS-Laufzeit und Werkzeuge probieren, ohne dass jemand eine Option meint. */ 27const IGNORED_KEYS = new Set(['then', 'toJSON', 'nodeType', 'inspect', 'splice']); 28 29const warned = new Set(); 30 31function warnMissing(key) { 32 if (warned.has(key)) { 33 return; 34 } 35 warned.add(key); 36 console.warn( 37 `[NIU] Setting '${key}' fehlt im Frontend-Export â Whitelist in head.tpl ` + 38 `(Block 'layout-head-niu-settings') ergänzen.` 39 ); 40} 41 42export default function installSettingsGuard() { 43 const niu = window.niu; 44 45 /* Kein Export vorhanden (z. B. Bot-Auslieferung: der ganze Block steht unter {if !$isBot}). 46 Dann gibt es nichts zu bewachen â und es wird auch nichts angelegt, damit sich das 47 Verhalten gegenüber vorher nicht ändert. */ 48 if (!niu || niu.settingsGuardInstalled) { 49 return; 50 } 51 if (!niu.settings || typeof niu.settings !== 'object') { 52 return; 53 } 54 55 niu.settings = new Proxy(niu.settings, { 56 get(target, prop, receiver) { 57 if (typeof prop === 'string' && !(prop in target) && !IGNORED_KEYS.has(prop)) { 58 warnMissing(prop); 59 } 60 return Reflect.get(target, prop, receiver); 61 } 62 }); 63 niu.settingsGuardInstalled = true; 64} 65 66installSettingsGuard();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.