const fs = require('fs'); const path = require('path'); const crypto = require('crypto'); const esbuild = require('esbuild'); const JS = (...parts) => path.join(__dirname, 'js', ...parts); const DIST = path.join(__dirname, 'dist'); const INDEX_HTML = path.join(__dirname, 'index.html'); // Bundle definitions — files are concatenated in order, then minified const bundles = { 'core.js': [ JS('globals.js'), JS('skeleton-loader.js'), JS('theme.js'), JS('totp-auth.js'), JS('service-credentials.js'), JS('totp-settings.js'), JS('core', 'credentials.js'), JS('core', 'grid.js'), JS('core', 'dns.js'), JS('core', 'logs.js'), JS('core', 'service-modals.js'), JS('core', 'service-infrastructure.js'), JS('core', 'service-crud.js'), JS('core', 'service-create.js'), JS('live-events.js'), ], 'features.js': [ JS('logo-customization.js'), JS('setup-wizard.js'), JS('app-selector.js'), JS('recipes.js'), JS('import-export.js'), JS('error-logs.js'), JS('smart-arr-connect.js'), JS('notification-settings.js'), JS('panel-tabs.js'), JS('backup-restore.js'), JS('resource-monitor.js'), JS('health-check.js'), JS('update-management.js'), JS('docker-resources.js'), JS('compose-import.js'), JS('container-exec.js'), JS('audit-log.js'), JS('weather.js'), JS('clock.js'), JS('card-badges.js'), JS('theme-builder.js'), JS('license.js'), ], 'onboarding.js': [ JS('driver.min.js'), JS('error-handler.js'), JS('progress-tracker.js'), JS('theme-adapter.js'), JS('tooltip-definitions.js'), JS('dns-template-selector.js'), JS('tour-manager.js'), JS('onboarding.js'), ], 'init.js': [ JS('core', 'init.js'), JS('keyboard-shortcuts.js'), ], }; function updateInlineScriptCspHash() { const html = fs.readFileSync(INDEX_HTML, 'utf8'); const scripts = [...html.matchAll(/