@ojolowoblue/lamba 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/integrations/vue.ts","../../src/core/preset-manager.ts","../../src/core/env-parser.ts","../../src/core/store.ts","../../src/core/network-interceptor.ts","../../src/ui/styles.ts","../../src/ui/shadow-dom.ts","../../src/ui/launcher.ts","../../src/ui/modal.ts","../../src/index.ts"],"sourcesContent":["import { ref, onUnmounted, getCurrentInstance, Ref } from \"vue\";\nimport { lamba } from \"../index\";\n\n/**\n * Vue Composable for consuming reactive environment variables updated by lamba.\n *\n * @param key The environment variable key name (e.g. 'VITE_API_URL')\n * @param defaultValue Fallback value if the variable is not set\n * @returns Vue Ref string\n */\nexport function useLambaEnv(\n key: string,\n defaultValue: string = \"\",\n): Ref<string> {\n const envValue = ref<string>(lamba.get(key, defaultValue)) as Ref<string>;\n\n const unsubscribe = lamba.onChange((changedKey: string) => {\n if (changedKey === key) {\n envValue.value = lamba.get(key, defaultValue);\n }\n });\n\n if (getCurrentInstance()) {\n onUnmounted(() => {\n unsubscribe();\n });\n }\n\n return envValue;\n}\n","import { PresetProfile } from './types';\n\nconst STORAGE_PRESETS_KEY = '__lamba_presets__';\nconst STORAGE_ACTIVE_PRESET_KEY = '__lamba_active_preset__';\n\nexport class PresetManager {\n private presets: PresetProfile[] = [];\n private activePresetId: string | null = null;\n\n constructor() {\n this.loadFromStorage();\n }\n\n private loadFromStorage(): void {\n if (typeof localStorage === 'undefined') return;\n\n try {\n const rawPresets = localStorage.getItem(STORAGE_PRESETS_KEY);\n if (rawPresets) {\n this.presets = JSON.parse(rawPresets);\n }\n this.activePresetId = localStorage.getItem(STORAGE_ACTIVE_PRESET_KEY);\n } catch (e) {\n console.warn('[lamba] Failed to parse presets from localStorage', e);\n }\n }\n\n private saveToStorage(): void {\n if (typeof localStorage === 'undefined') return;\n\n try {\n localStorage.setItem(STORAGE_PRESETS_KEY, JSON.stringify(this.presets));\n if (this.activePresetId) {\n localStorage.setItem(STORAGE_ACTIVE_PRESET_KEY, this.activePresetId);\n } else {\n localStorage.removeItem(STORAGE_ACTIVE_PRESET_KEY);\n }\n } catch (e) {\n console.warn('[lamba] Failed to save presets to localStorage', e);\n }\n }\n\n public getPresets(): PresetProfile[] {\n return [...this.presets];\n }\n\n public getActivePresetId(): string | null {\n return this.activePresetId;\n }\n\n public createPreset(name: string, overrides: Record<string, string>): PresetProfile {\n const newPreset: PresetProfile = {\n id: 'preset_' + Math.random().toString(36).substring(2, 9),\n name: name.trim() || 'Untitled Preset',\n overrides: { ...overrides },\n createdAt: Date.now(),\n };\n\n this.presets.push(newPreset);\n this.saveToStorage();\n return newPreset;\n }\n\n public deletePreset(id: string): void {\n this.presets = this.presets.filter((p) => p.id !== id);\n if (this.activePresetId === id) {\n this.activePresetId = null;\n }\n this.saveToStorage();\n }\n\n public setActivePreset(id: string | null): PresetProfile | null {\n if (!id) {\n this.activePresetId = null;\n this.saveToStorage();\n return null;\n }\n\n const preset = this.presets.find((p) => p.id === id);\n if (preset) {\n this.activePresetId = id;\n this.saveToStorage();\n return preset;\n }\n return null;\n }\n}\n","/**\n * Parses raw .env string into a key-value Record.\n */\nexport function parseEnvString(rawText: string): Record<string, string> {\n const result: Record<string, string> = {};\n const lines = rawText.split('\\n');\n\n for (let line of lines) {\n line = line.trim();\n if (!line || line.startsWith('#')) continue;\n\n if (line.startsWith('export ')) {\n line = line.slice(7).trim();\n }\n\n const equalsIdx = line.indexOf('=');\n if (equalsIdx === -1) continue;\n\n const key = line.slice(0, equalsIdx).trim();\n let val = line.slice(equalsIdx + 1).trim();\n\n // Remove quotes if wrapped in single or double quotes\n if (\n (val.startsWith('\"') && val.endsWith('\"')) ||\n (val.startsWith(\"'\") && val.endsWith(\"'\"))\n ) {\n val = val.slice(1, -1);\n }\n\n // Replace escaped newlines\n val = val.replace(/\\\\n/g, '\\n');\n\n if (key) {\n result[key] = val;\n }\n }\n\n return result;\n}\n\n/**\n * Stringifies a Record<string, string> into standard .env format.\n */\nexport function stringifyEnv(env: Record<string, string>): string {\n return Object.entries(env)\n .map(([key, val]) => {\n const needsQuotes = val.includes(' ') || val.includes('\\n') || val.includes('#');\n const formattedVal = needsQuotes ? `\"${val.replace(/\"/g, '\\\\\"')}\"` : val;\n return `${key}=${formattedVal}`;\n })\n .join('\\n');\n}\n\n/**\n * Auto-discovers environment variables available in the current browser runtime.\n */\nexport function autoDiscoverBrowserEnv(): Record<string, string> {\n const discovered: Record<string, string> = {};\n\n if (typeof window === 'undefined') return discovered;\n\n // 1. Inspect window.process.env\n try {\n const winProcess = (window as any).process;\n if (winProcess && winProcess.env && typeof winProcess.env === 'object') {\n for (const [k, v] of Object.entries(winProcess.env)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n discovered[k] = String(v);\n }\n }\n }\n } catch (e) {}\n\n // 2. Inspect window.__ENV__ or window.ENV\n try {\n const customEnv = (window as any).__ENV__ || (window as any).ENV;\n if (customEnv && typeof customEnv === 'object') {\n for (const [k, v] of Object.entries(customEnv)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n discovered[k] = String(v);\n }\n }\n }\n } catch (e) {}\n\n // 3. Inspect HTML meta tags (e.g. <meta name=\"env:API_KEY\" content=\"xyz\"> or <meta name=\"lamba-env\" content=\"API_KEY=xyz&MODE=dev\">)\n try {\n const metaTags = document.querySelectorAll('meta');\n metaTags.forEach((meta) => {\n const name = meta.getAttribute('name');\n const content = meta.getAttribute('content');\n if (!name || content === null) return;\n\n if (name.startsWith('env:')) {\n const key = name.slice(4);\n discovered[key] = content;\n } else if (name === 'lamba-env') {\n const parsed = new URLSearchParams(content);\n parsed.forEach((val, key) => {\n discovered[key] = val;\n });\n }\n });\n } catch (e) {}\n\n return discovered;\n}\n\n/**\n * Attempts to fetch /.env or /.env.example from root URL if hosted in dev mode.\n */\nexport async function tryFetchRootEnvFile(): Promise<Record<string, string>> {\n const paths = ['/.env', '/.env.local', '/.env.example'];\n for (const path of paths) {\n try {\n const res = await fetch(path, { headers: { Accept: 'text/plain' } });\n if (res.ok) {\n const text = await res.text();\n if (text && text.includes('=')) {\n return parseEnvString(text);\n }\n }\n } catch (e) {\n // Ignore network errors in production or non-accessible env files\n }\n }\n return {};\n}\n","import {\n EnvVariable,\n EnvChangeListener,\n StoreChangeListener,\n LambaOptions,\n PresetProfile,\n} from './types';\nimport { PresetManager } from './preset-manager';\nimport { autoDiscoverBrowserEnv, tryFetchRootEnvFile } from './env-parser';\n\nconst STORAGE_OVERRIDES_KEY = '__lamba_overrides__';\nconst DEFAULT_SECRET_PATTERN = /(KEY|SECRET|TOKEN|PASSWORD|AUTH|PRIVATE|CREDENTIAL|SIGNATURE)/i;\n\nexport class EnvStore {\n private variables: Map<string, EnvVariable> = new Map();\n private overrides: Record<string, string> = {};\n private secretPattern: RegExp;\n private envChangeListeners: Set<EnvChangeListener> = new Set();\n private storeChangeListeners: Set<StoreChangeListener> = new Set();\n public presetManager: PresetManager;\n\n constructor(options: LambaOptions = {}) {\n this.secretPattern = options.secretKeysPattern || DEFAULT_SECRET_PATTERN;\n this.presetManager = new PresetManager();\n\n // 1. Load initial overrides from localStorage\n this.loadOverridesFromStorage();\n\n // 2. Register initial options.env if provided\n if (options.env) {\n this.mergeDefaults(options.env);\n }\n\n // 3. Auto-discover from browser runtime\n const autoDiscovered = autoDiscoverBrowserEnv();\n this.mergeDefaults(autoDiscovered);\n\n // 4. Try fetching root /.env file if explicitly enabled\n if (options.autoFetchEnvFile === true && typeof window !== 'undefined') {\n tryFetchRootEnvFile().then((fileEnv) => {\n if (Object.keys(fileEnv).length > 0) {\n this.mergeDefaults(fileEnv);\n }\n });\n }\n\n\n // 5. Patch window.process.env\n this.patchProcessEnv();\n }\n\n private loadOverridesFromStorage(): void {\n if (typeof localStorage === 'undefined') return;\n try {\n const stored = localStorage.getItem(STORAGE_OVERRIDES_KEY);\n if (stored) {\n this.overrides = JSON.parse(stored);\n }\n } catch (e) {\n console.warn('[lamba] Failed to parse overrides from localStorage', e);\n }\n }\n\n private saveOverridesToStorage(): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.setItem(STORAGE_OVERRIDES_KEY, JSON.stringify(this.overrides));\n } catch (e) {\n console.warn('[lamba] Failed to save overrides to localStorage', e);\n }\n }\n\n /**\n * Monkey-patches window.process.env to reactively return overridden values.\n */\n private patchProcessEnv(): void {\n if (typeof window === 'undefined') return;\n\n const win = window as any;\n if (!win.process) {\n win.process = { env: {} };\n } else if (!win.process.env) {\n win.process.env = {};\n }\n\n const self = this;\n const targetEnv = win.process.env;\n\n // Use Proxy if supported\n try {\n win.process.env = new Proxy(targetEnv, {\n get(target, prop: string) {\n if (typeof prop === 'string') {\n const val = self.get(prop);\n if (val !== undefined) return val;\n }\n return target[prop];\n },\n set(target, prop: string, value: any) {\n target[prop] = value;\n return true;\n },\n });\n } catch (e) {\n // Fallback for environment where Proxy is restricted\n }\n }\n\n public mergeDefaults(env: Record<string, string>): void {\n let changed = false;\n for (const [key, defaultValue] of Object.entries(env)) {\n const isOverridden = key in this.overrides;\n const currentValue = isOverridden ? this.overrides[key] : defaultValue;\n const isSecret = this.secretPattern.test(key);\n\n const existing = this.variables.get(key);\n if (!existing) {\n this.variables.set(key, {\n key,\n value: currentValue,\n defaultValue,\n isOverridden,\n isSecret,\n });\n changed = true;\n } else {\n // Update default value if changed\n if (existing.defaultValue !== defaultValue) {\n existing.defaultValue = defaultValue;\n if (!existing.isOverridden) {\n existing.value = defaultValue;\n }\n changed = true;\n }\n }\n }\n\n if (changed) {\n this.notifyStoreChanged();\n }\n }\n\n public get(key: string, fallback?: string): string | undefined {\n if (key in this.overrides) {\n return this.overrides[key];\n }\n const item = this.variables.get(key);\n if (item) return item.value;\n return fallback;\n }\n\n public getAll(): Record<string, EnvVariable> {\n const result: Record<string, EnvVariable> = {};\n this.variables.forEach((varObj, key) => {\n result[key] = { ...varObj };\n });\n return result;\n }\n\n public getOverrides(): Record<string, string> {\n return { ...this.overrides };\n }\n\n public setOverride(key: string, value: string): void {\n const trimmedKey = key.trim();\n if (!trimmedKey) return;\n\n this.overrides[trimmedKey] = value;\n this.saveOverridesToStorage();\n\n let item = this.variables.get(trimmedKey);\n if (!item) {\n item = {\n key: trimmedKey,\n value,\n defaultValue: '',\n isOverridden: true,\n isSecret: this.secretPattern.test(trimmedKey),\n };\n this.variables.set(trimmedKey, item);\n } else {\n item.value = value;\n item.isOverridden = true;\n }\n\n this.emitEnvChange(trimmedKey, value, true);\n this.notifyStoreChanged();\n }\n\n public removeOverride(key: string): void {\n if (key in this.overrides) {\n delete this.overrides[key];\n this.saveOverridesToStorage();\n\n const item = this.variables.get(key);\n if (item) {\n item.value = item.defaultValue;\n item.isOverridden = false;\n this.emitEnvChange(key, item.value, false);\n }\n\n this.notifyStoreChanged();\n }\n }\n\n public resetAllOverrides(): void {\n const keys = Object.keys(this.overrides);\n this.overrides = {};\n this.saveOverridesToStorage();\n this.presetManager.setActivePreset(null);\n\n keys.forEach((key) => {\n const item = this.variables.get(key);\n if (item) {\n item.value = item.defaultValue;\n item.isOverridden = false;\n this.emitEnvChange(key, item.value, false);\n }\n });\n\n this.notifyStoreChanged();\n }\n\n public applyPreset(presetId: string | null): void {\n const preset = this.presetManager.setActivePreset(presetId);\n this.overrides = preset ? { ...preset.overrides } : {};\n this.saveOverridesToStorage();\n\n // Re-evaluate all variables\n this.variables.forEach((item, key) => {\n if (key in this.overrides) {\n item.value = this.overrides[key];\n item.isOverridden = true;\n } else {\n item.value = item.defaultValue;\n item.isOverridden = false;\n }\n this.emitEnvChange(key, item.value, item.isOverridden);\n });\n\n // Also include extra override keys from preset that weren't in variables\n if (preset) {\n for (const [key, value] of Object.entries(preset.overrides)) {\n if (!this.variables.has(key)) {\n this.variables.set(key, {\n key,\n value,\n defaultValue: '',\n isOverridden: true,\n isSecret: this.secretPattern.test(key),\n });\n this.emitEnvChange(key, value, true);\n }\n }\n }\n\n this.notifyStoreChanged();\n }\n\n public subscribeEnvChange(listener: EnvChangeListener): () => void {\n this.envChangeListeners.add(listener);\n return () => this.envChangeListeners.delete(listener);\n }\n\n public subscribeStoreChange(listener: StoreChangeListener): () => void {\n this.storeChangeListeners.add(listener);\n return () => this.storeChangeListeners.delete(listener);\n }\n\n private emitEnvChange(key: string, value: string, isOverridden: boolean): void {\n this.envChangeListeners.forEach((fn) => fn(key, value, isOverridden));\n\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('lamba:env-change', {\n detail: { key, value, isOverridden },\n })\n );\n }\n }\n\n private notifyStoreChanged(): void {\n const varsObj = this.getAll();\n const presets = this.presetManager.getPresets();\n const activePresetId = this.presetManager.getActivePresetId();\n this.storeChangeListeners.forEach((fn) => fn(varsObj, presets, activePresetId));\n }\n}\n","import { EnvStore } from './store';\n\nexport class NetworkInterceptor {\n private store: EnvStore;\n private originalFetch: typeof window.fetch | null = null;\n private originalXHRPost: typeof XMLHttpRequest.prototype.open | null = null;\n private isIntercepting: boolean = false;\n\n constructor(store: EnvStore) {\n this.store = store;\n }\n\n public enable(): void {\n if (typeof window === 'undefined' || this.isIntercepting) return;\n\n this.patchFetch();\n this.patchXHR();\n this.isIntercepting = true;\n }\n\n public disable(): void {\n if (typeof window === 'undefined' || !this.isIntercepting) return;\n\n if (this.originalFetch) {\n window.fetch = this.originalFetch;\n this.originalFetch = null;\n }\n if (this.originalXHRPost) {\n XMLHttpRequest.prototype.open = this.originalXHRPost;\n this.originalXHRPost = null;\n }\n this.isIntercepting = false;\n }\n\n /**\n * Rewrite a given URL by checking if any default env variable URL value matches\n * and replacing it with the active overridden value.\n */\n public rewriteUrl(url: string | URL | Request): string | URL | Request {\n if (typeof url !== 'string') return url;\n\n const allVars = this.store.getAll();\n let resultUrl = url;\n\n for (const varObj of Object.values(allVars)) {\n if (varObj.isOverridden && varObj.defaultValue && varObj.value) {\n // Trim trailing slashes for accurate matching\n const defaultBase = varObj.defaultValue.replace(/\\/+$/, '');\n const overrideBase = varObj.value.replace(/\\/+$/, '');\n\n if (defaultBase && resultUrl.includes(defaultBase)) {\n resultUrl = resultUrl.replace(defaultBase, overrideBase);\n }\n }\n }\n\n return resultUrl;\n }\n\n private patchFetch(): void {\n if (!window.fetch) return;\n\n this.originalFetch = window.fetch;\n const self = this;\n\n window.fetch = function (input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n let finalInput = input;\n\n if (typeof input === 'string') {\n finalInput = self.rewriteUrl(input) as string;\n } else if (input instanceof URL) {\n const rewritten = self.rewriteUrl(input.toString()) as string;\n finalInput = new URL(rewritten);\n } else if (input instanceof Request) {\n const rewrittenUrl = self.rewriteUrl(input.url) as string;\n if (rewrittenUrl !== input.url) {\n finalInput = new Request(rewrittenUrl, input);\n }\n }\n\n return self.originalFetch!.call(this, finalInput, init);\n };\n }\n\n private patchXHR(): void {\n if (!window.XMLHttpRequest) return;\n\n this.originalXHRPost = XMLHttpRequest.prototype.open;\n const self = this;\n\n XMLHttpRequest.prototype.open = function (\n method: string,\n url: string | URL,\n async: boolean = true,\n username?: string | null,\n password?: string | null\n ): void {\n const stringUrl = typeof url === 'string' ? url : url.toString();\n const rewrittenUrl = self.rewriteUrl(stringUrl) as string;\n\n return self.originalXHRPost!.call(\n this,\n method,\n rewrittenUrl,\n async,\n username ?? null,\n password ?? null\n );\n };\n }\n}\n","export const LAMBA_STYLES = `\n:host {\n --lamba-bg-main: #0f172a;\n --lamba-bg-card: #1e293b;\n --lamba-bg-hover: #334155;\n --lamba-border: rgba(255, 255, 255, 0.1);\n --lamba-text-primary: #f8fafc;\n --lamba-text-secondary: #94a3b8;\n --lamba-primary: #6366f1;\n --lamba-primary-hover: #4f46e5;\n --lamba-accent: #06b6d4;\n --lamba-success: #10b981;\n --lamba-danger: #ef4444;\n --lamba-warning: #f59e0b;\n --lamba-font: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n --lamba-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.5), 0 8px 10px -6px rgba(0, 0, 0, 0.4);\n\n font-family: var(--lamba-font);\n font-size: 14px;\n line-height: 1.5;\n color: var(--lamba-text-primary);\n box-sizing: border-box;\n z-index: 999999;\n}\n\n*, *:before, *:after {\n box-sizing: border-box;\n}\n\n/* Floating Launcher Button */\n.lamba-launcher {\n position: fixed;\n z-index: 999999;\n width: 52px;\n height: 52px;\n border-radius: 50%;\n background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);\n color: #ffffff;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: 0 10px 15px -3px rgba(99, 102, 241, 0.4), 0 4px 6px -4px rgba(99, 102, 241, 0.2);\n border: 1px solid rgba(255, 255, 255, 0.2);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n user-select: none;\n}\n\n.lamba-launcher:hover {\n transform: scale(1.08);\n box-shadow: 0 14px 20px -3px rgba(99, 102, 241, 0.6), 0 6px 8px -4px rgba(99, 102, 241, 0.3);\n}\n\n.lamba-launcher:active {\n transform: scale(0.95);\n}\n\n.lamba-launcher-bottom-right { bottom: 24px; right: 24px; }\n.lamba-launcher-bottom-left { bottom: 24px; left: 24px; }\n.lamba-launcher-top-right { top: 24px; right: 24px; }\n.lamba-launcher-top-left { top: 24px; left: 24px; }\n\n.lamba-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n background: var(--lamba-accent);\n color: #000;\n font-size: 11px;\n font-weight: 700;\n min-width: 20px;\n height: 20px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 5px;\n border: 2px solid var(--lamba-bg-main);\n box-shadow: 0 2px 4px rgba(0,0,0,0.2);\n animation: pulse-scale 2s infinite;\n}\n\n@keyframes pulse-scale {\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.15); }\n}\n\n/* Modal Overlay */\n.lamba-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(15, 23, 42, 0.7);\n backdrop-filter: blur(8px);\n z-index: 999998;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.25s ease, visibility 0.25s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n}\n\n.lamba-overlay.active {\n opacity: 1;\n visibility: visible;\n}\n\n/* Main Modal Panel */\n.lamba-modal {\n width: 100%;\n max-width: 820px;\n max-height: 85vh;\n background: var(--lamba-bg-main);\n border: 1px solid var(--lamba-border);\n border-radius: 16px;\n box-shadow: var(--lamba-shadow);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transform: translateY(20px) scale(0.96);\n transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.lamba-overlay.active .lamba-modal {\n transform: translateY(0) scale(1);\n}\n\n/* Header */\n.lamba-header {\n padding: 20px 24px;\n border-bottom: 1px solid var(--lamba-border);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: rgba(30, 41, 59, 0.4);\n}\n\n.lamba-brand {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.lamba-logo {\n font-size: 18px;\n font-weight: 800;\n letter-spacing: -0.5px;\n background: linear-gradient(135deg, #a5b4fc 0%, #6366f1 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.lamba-tag {\n background: rgba(99, 102, 241, 0.15);\n color: #a5b4fc;\n font-size: 11px;\n padding: 2px 8px;\n border-radius: 6px;\n font-weight: 600;\n border: 1px solid rgba(99, 102, 241, 0.3);\n}\n\n.lamba-close-btn {\n background: transparent;\n border: none;\n color: var(--lamba-text-secondary);\n cursor: pointer;\n padding: 6px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.lamba-close-btn:hover {\n background: var(--lamba-bg-hover);\n color: var(--lamba-text-primary);\n}\n\n/* Controls Bar (Search & Filters) */\n.lamba-controls {\n padding: 16px 24px;\n border-bottom: 1px solid var(--lamba-border);\n display: flex;\n gap: 12px;\n align-items: center;\n flex-wrap: wrap;\n background: var(--lamba-bg-main);\n}\n\n.lamba-search-box {\n flex: 1;\n min-width: 220px;\n position: relative;\n}\n\n.lamba-search-input {\n width: 100%;\n padding: 10px 14px 10px 38px;\n background: var(--lamba-bg-card);\n border: 1px solid var(--lamba-border);\n border-radius: 8px;\n color: var(--lamba-text-primary);\n font-size: 13px;\n outline: none;\n transition: border-color 0.15s ease;\n}\n\n.lamba-search-input:focus {\n border-color: var(--lamba-primary);\n}\n\n.lamba-search-icon {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--lamba-text-secondary);\n pointer-events: none;\n}\n\n.lamba-tabs {\n display: flex;\n gap: 4px;\n background: var(--lamba-bg-card);\n padding: 4px;\n border-radius: 8px;\n border: 1px solid var(--lamba-border);\n}\n\n.lamba-tab {\n background: transparent;\n border: none;\n color: var(--lamba-text-secondary);\n padding: 6px 12px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.lamba-tab.active {\n background: var(--lamba-primary);\n color: #ffffff;\n}\n\n/* Preset Bar */\n.lamba-presets-bar {\n padding: 12px 24px;\n background: rgba(30, 41, 59, 0.3);\n border-bottom: 1px solid var(--lamba-border);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n\n.lamba-preset-selector {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n}\n\n.lamba-select {\n background: var(--lamba-bg-card);\n color: var(--lamba-text-primary);\n border: 1px solid var(--lamba-border);\n padding: 6px 12px;\n border-radius: 6px;\n outline: none;\n font-size: 13px;\n cursor: pointer;\n}\n\n/* List Content */\n.lamba-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.lamba-content::-webkit-scrollbar {\n width: 6px;\n}\n\n.lamba-content::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.lamba-content::-webkit-scrollbar-thumb {\n background: var(--lamba-bg-hover);\n border-radius: 3px;\n}\n\n/* Variable Row Card */\n.lamba-var-card {\n background: var(--lamba-bg-card);\n border: 1px solid var(--lamba-border);\n border-radius: 10px;\n padding: 14px 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n transition: border-color 0.15s ease;\n}\n\n.lamba-var-card.is-overridden {\n border-color: rgba(99, 102, 241, 0.5);\n background: linear-gradient(180deg, var(--lamba-bg-card) 0%, rgba(99, 102, 241, 0.05) 100%);\n}\n\n.lamba-var-meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.lamba-var-key {\n font-weight: 700;\n font-family: monospace;\n color: #a5b4fc;\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.lamba-modified-pill {\n font-size: 10px;\n font-weight: 700;\n background: rgba(16, 185, 129, 0.2);\n color: #34d399;\n padding: 2px 6px;\n border-radius: 4px;\n border: 1px solid rgba(16, 185, 129, 0.4);\n}\n\n.lamba-var-actions {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.lamba-icon-btn {\n background: transparent;\n border: none;\n color: var(--lamba-text-secondary);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.lamba-icon-btn:hover {\n background: var(--lamba-bg-hover);\n color: var(--lamba-text-primary);\n}\n\n.lamba-var-input-group {\n display: flex;\n gap: 8px;\n}\n\n.lamba-input {\n flex: 1;\n background: var(--lamba-bg-main);\n border: 1px solid var(--lamba-border);\n color: var(--lamba-text-primary);\n padding: 8px 12px;\n border-radius: 6px;\n font-family: monospace;\n font-size: 13px;\n outline: none;\n}\n\n.lamba-input:focus {\n border-color: var(--lamba-primary);\n}\n\n.lamba-diff {\n font-size: 11px;\n color: var(--lamba-text-secondary);\n font-family: monospace;\n padding-left: 2px;\n}\n\n.lamba-diff-val {\n color: var(--lamba-warning);\n}\n\n/* Empty State */\n.lamba-empty {\n padding: 40px 20px;\n text-align: center;\n color: var(--lamba-text-secondary);\n}\n\n/* Footer Actions Bar */\n.lamba-footer {\n padding: 16px 24px;\n border-top: 1px solid var(--lamba-border);\n background: rgba(30, 41, 59, 0.4);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.lamba-btn {\n background: var(--lamba-bg-card);\n color: var(--lamba-text-primary);\n border: 1px solid var(--lamba-border);\n padding: 8px 14px;\n border-radius: 8px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.15s ease;\n}\n\n.lamba-btn:hover {\n background: var(--lamba-bg-hover);\n}\n\n.lamba-btn-primary {\n background: var(--lamba-primary);\n border-color: var(--lamba-primary);\n color: #ffffff;\n}\n\n.lamba-btn-primary:hover {\n background: var(--lamba-primary-hover);\n}\n\n.lamba-btn-danger {\n background: rgba(239, 68, 68, 0.15);\n color: #fca5a5;\n border-color: rgba(239, 68, 68, 0.3);\n}\n\n.lamba-btn-danger:hover {\n background: rgba(239, 68, 68, 0.3);\n}\n`;\n","import { LAMBA_STYLES } from './styles';\n\nexport function createShadowHost(): { host: HTMLElement; shadowRoot: ShadowRoot } {\n if (typeof document === 'undefined') {\n throw new Error('[lamba] Document object not available.');\n }\n\n let host = document.getElementById('lamba-root') as HTMLElement;\n if (!host) {\n host = document.createElement('lamba-widget');\n host.id = 'lamba-root';\n document.body.appendChild(host);\n }\n\n let shadowRoot = host.shadowRoot;\n if (!shadowRoot) {\n shadowRoot = host.attachShadow({ mode: 'open' });\n\n // Inject styles\n const styleEl = document.createElement('style');\n styleEl.textContent = LAMBA_STYLES;\n shadowRoot.appendChild(styleEl);\n }\n\n return { host, shadowRoot };\n}\n","export class LauncherUI {\n private element: HTMLElement;\n private badgeElement: HTMLElement;\n private onClickCallback: () => void;\n\n constructor(\n container: ShadowRoot,\n position: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left' = 'bottom-right',\n onClick: () => void\n ) {\n this.onClickCallback = onClick;\n\n this.element = document.createElement('div');\n this.element.className = `lamba-launcher lamba-launcher-${position}`;\n this.element.title = 'Open lamba Environment Controls';\n\n // SVG Settings Icon\n this.element.innerHTML = `\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\"/>\n <circle cx=\"12\" cy=\"12\" r=\"3\"/>\n </svg>\n `;\n\n // Counter Badge\n this.badgeElement = document.createElement('div');\n this.badgeElement.className = 'lamba-badge';\n this.badgeElement.style.display = 'none';\n this.element.appendChild(this.badgeElement);\n\n this.element.addEventListener('click', () => this.onClickCallback());\n container.appendChild(this.element);\n }\n\n public updateBadgeCount(count: number): void {\n if (count > 0) {\n this.badgeElement.textContent = String(count);\n this.badgeElement.style.display = 'flex';\n } else {\n this.badgeElement.style.display = 'none';\n }\n }\n\n public setVisible(visible: boolean): void {\n this.element.style.display = visible ? 'flex' : 'none';\n }\n}\n","import { EnvStore } from '../core/store';\nimport { EnvVariable, PresetProfile } from '../core/types';\nimport { parseEnvString, stringifyEnv } from '../core/env-parser';\n\nexport class ModalUI {\n private overlay: HTMLElement;\n private modal: HTMLElement;\n private contentList: HTMLElement;\n private searchInput: HTMLInputElement;\n private tabAllBtn: HTMLElement;\n private tabOverriddenBtn: HTMLElement;\n private tabSecretsBtn: HTMLElement;\n private presetSelect: HTMLSelectElement;\n private savePresetBtn: HTMLElement;\n private activeTab: 'all' | 'overridden' | 'secrets' = 'all';\n private searchQuery: string = '';\n private store: EnvStore;\n private secretVisibilityMap: Map<string, boolean> = new Map();\n private isOpen: boolean = false;\n\n constructor(container: ShadowRoot, store: EnvStore, onClose: () => void) {\n this.store = store;\n\n // Build DOM layout\n this.overlay = document.createElement('div');\n this.overlay.className = 'lamba-overlay';\n\n this.modal = document.createElement('div');\n this.modal.className = 'lamba-modal';\n\n // Header\n const header = document.createElement('div');\n header.className = 'lamba-header';\n header.innerHTML = `\n <div class=\"lamba-brand\">\n <div class=\"lamba-logo\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5\"/>\n </svg>\n lamba\n </div>\n <span class=\"lamba-tag\">Dev Environment Override</span>\n </div>\n <button class=\"lamba-close-btn\" title=\"Close modal\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n `;\n header.querySelector('.lamba-close-btn')?.addEventListener('click', () => {\n this.close();\n onClose();\n });\n\n // Controls Bar (Search & Filter Tabs)\n const controls = document.createElement('div');\n controls.className = 'lamba-controls';\n\n const searchBox = document.createElement('div');\n searchBox.className = 'lamba-search-box';\n searchBox.innerHTML = `\n <svg class=\"lamba-search-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n <input type=\"text\" class=\"lamba-search-input\" placeholder=\"Search environment keys or values...\" />\n `;\n this.searchInput = searchBox.querySelector('.lamba-search-input') as HTMLInputElement;\n this.searchInput.addEventListener('input', (e) => {\n this.searchQuery = (e.target as HTMLInputElement).value.toLowerCase();\n this.render();\n });\n\n const tabs = document.createElement('div');\n tabs.className = 'lamba-tabs';\n tabs.innerHTML = `\n <button class=\"lamba-tab active\" data-tab=\"all\">All</button>\n <button class=\"lamba-tab\" data-tab=\"overridden\">Modified</button>\n <button class=\"lamba-tab\" data-tab=\"secrets\">Secrets</button>\n `;\n\n this.tabAllBtn = tabs.querySelector('[data-tab=\"all\"]') as HTMLElement;\n this.tabOverriddenBtn = tabs.querySelector('[data-tab=\"overridden\"]') as HTMLElement;\n this.tabSecretsBtn = tabs.querySelector('[data-tab=\"secrets\"]') as HTMLElement;\n\n tabs.querySelectorAll('.lamba-tab').forEach((btn) => {\n btn.addEventListener('click', (e) => {\n tabs.querySelectorAll('.lamba-tab').forEach((t) => t.classList.remove('active'));\n const target = e.currentTarget as HTMLElement;\n target.classList.add('active');\n this.activeTab = target.getAttribute('data-tab') as any;\n this.render();\n });\n });\n\n controls.appendChild(searchBox);\n controls.appendChild(tabs);\n\n // Presets Bar\n const presetsBar = document.createElement('div');\n presetsBar.className = 'lamba-presets-bar';\n presetsBar.innerHTML = `\n <div class=\"lamba-preset-selector\">\n <span style=\"color: var(--lamba-text-secondary); font-weight: 600;\">Preset Profile:</span>\n <select class=\"lamba-select lamba-preset-dropdown\">\n <option value=\"\">Default (Current Overrides)</option>\n </select>\n </div>\n <button class=\"lamba-btn lamba-save-preset-btn\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\"></path>\n <polyline points=\"17 21 17 13 7 13 7 21\"></polyline>\n <polyline points=\"7 3 7 8 15 8\"></polyline>\n </svg>\n Save as Preset\n </button>\n `;\n\n this.presetSelect = presetsBar.querySelector('.lamba-preset-dropdown') as HTMLSelectElement;\n this.presetSelect.addEventListener('change', () => {\n const selectedId = this.presetSelect.value || null;\n this.store.applyPreset(selectedId);\n });\n\n this.savePresetBtn = presetsBar.querySelector('.lamba-save-preset-btn') as HTMLElement;\n this.savePresetBtn.addEventListener('click', () => {\n const name = prompt('Enter a name for this Environment Preset Profile:', 'Staging Environment');\n if (name) {\n const overrides = this.store.getOverrides();\n this.store.presetManager.createPreset(name, overrides);\n this.updatePresetDropdown();\n }\n });\n\n // Content List Container\n this.contentList = document.createElement('div');\n this.contentList.className = 'lamba-content';\n\n // Footer Bar\n const footer = document.createElement('div');\n footer.className = 'lamba-footer';\n footer.innerHTML = `\n <div style=\"display: flex; gap: 8px;\">\n <button class=\"lamba-btn lamba-add-var-btn\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\n </svg>\n Add Variable\n </button>\n <button class=\"lamba-btn lamba-import-btn\">Import .env</button>\n <button class=\"lamba-btn lamba-export-btn\">Export .env</button>\n </div>\n <div style=\"display: flex; gap: 8px;\">\n <button class=\"lamba-btn lamba-btn-danger lamba-reset-all-btn\">Reset All</button>\n <button class=\"lamba-btn lamba-btn-primary lamba-reload-btn\">Reload Page</button>\n </div>\n `;\n\n footer.querySelector('.lamba-add-var-btn')?.addEventListener('click', () => {\n const key = prompt('Enter new environment variable key name (e.g. VITE_API_URL):');\n if (key) {\n const value = prompt(`Enter value for ${key}:`) || '';\n this.store.setOverride(key, value);\n }\n });\n\n footer.querySelector('.lamba-import-btn')?.addEventListener('click', () => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.env,.txt';\n input.onchange = (e: any) => {\n const file = e.target.files[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (event) => {\n const content = event.target?.result as string;\n if (content) {\n const parsed = parseEnvString(content);\n for (const [k, v] of Object.entries(parsed)) {\n this.store.setOverride(k, v);\n }\n }\n };\n reader.readAsText(file);\n }\n };\n input.click();\n });\n\n footer.querySelector('.lamba-export-btn')?.addEventListener('click', () => {\n const allVars = this.store.getAll();\n const exportObj: Record<string, string> = {};\n for (const [k, v] of Object.entries(allVars)) {\n exportObj[k] = v.value;\n }\n const envText = stringifyEnv(exportObj);\n const blob = new Blob([envText], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = '.env';\n a.click();\n URL.revokeObjectURL(url);\n });\n\n footer.querySelector('.lamba-reset-all-btn')?.addEventListener('click', () => {\n if (confirm('Are you sure you want to reset all overridden environment variables?')) {\n this.store.resetAllOverrides();\n }\n });\n\n footer.querySelector('.lamba-reload-btn')?.addEventListener('click', () => {\n window.location.reload();\n });\n\n // Assemble modal structure\n this.modal.appendChild(header);\n this.modal.appendChild(controls);\n this.modal.appendChild(presetsBar);\n this.modal.appendChild(this.contentList);\n this.modal.appendChild(footer);\n this.overlay.appendChild(this.modal);\n\n // Close on overlay background click\n this.overlay.addEventListener('click', (e) => {\n if (e.target === this.overlay) {\n this.close();\n onClose();\n }\n });\n\n container.appendChild(this.overlay);\n\n // Subscribe to store updates\n this.store.subscribeStoreChange(() => {\n if (this.isOpen) {\n this.updatePresetDropdown();\n this.render();\n }\n });\n }\n\n public open(): void {\n this.isOpen = true;\n this.updatePresetDropdown();\n this.render();\n this.overlay.classList.add('active');\n }\n\n public close(): void {\n this.isOpen = false;\n this.overlay.classList.remove('active');\n }\n\n public toggle(): void {\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n }\n\n private updatePresetDropdown(): void {\n const presets = this.store.presetManager.getPresets();\n const activeId = this.store.presetManager.getActivePresetId();\n\n this.presetSelect.innerHTML = `<option value=\"\">Default (Custom Overrides)</option>`;\n presets.forEach((p) => {\n const opt = document.createElement('option');\n opt.value = p.id;\n opt.textContent = p.name;\n if (p.id === activeId) opt.selected = true;\n this.presetSelect.appendChild(opt);\n });\n }\n\n public render(): void {\n const allVarsMap = this.store.getAll();\n let varList = Object.values(allVarsMap);\n\n // Filter by Tab\n if (this.activeTab === 'overridden') {\n varList = varList.filter((v) => v.isOverridden);\n } else if (this.activeTab === 'secrets') {\n varList = varList.filter((v) => v.isSecret);\n }\n\n // Filter by Search Query\n if (this.searchQuery) {\n varList = varList.filter(\n (v) =>\n v.key.toLowerCase().includes(this.searchQuery) ||\n v.value.toLowerCase().includes(this.searchQuery)\n );\n }\n\n // Sort by overridden first, then alphabetically\n varList.sort((a, b) => {\n if (a.isOverridden !== b.isOverridden) {\n return a.isOverridden ? -1 : 1;\n }\n return a.key.localeCompare(b.key);\n });\n\n this.contentList.innerHTML = '';\n\n if (varList.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'lamba-empty';\n empty.textContent =\n this.searchQuery || this.activeTab !== 'all'\n ? 'No environment variables match your current filter.'\n : 'No environment variables found or registered. Click \"+ Add Variable\" or \"Import .env\" to get started.';\n this.contentList.appendChild(empty);\n return;\n }\n\n varList.forEach((varItem) => {\n const card = this.createVarCard(varItem);\n this.contentList.appendChild(card);\n });\n }\n\n private createVarCard(varItem: EnvVariable): HTMLElement {\n const card = document.createElement('div');\n card.className = `lamba-var-card ${varItem.isOverridden ? 'is-overridden' : ''}`;\n\n const isVisible = this.secretVisibilityMap.get(varItem.key) ?? !varItem.isSecret;\n\n card.innerHTML = `\n <div class=\"lamba-var-meta\">\n <div class=\"lamba-var-key\">\n ${varItem.key}\n ${varItem.isOverridden ? '<span class=\"lamba-modified-pill\">MODIFIED</span>' : ''}\n ${varItem.isSecret ? '<span style=\"font-size:10px; color:var(--lamba-warning); font-weight:600;\">SECRET</span>' : ''}\n </div>\n <div class=\"lamba-var-actions\">\n ${\n varItem.isSecret\n ? `<button class=\"lamba-icon-btn toggle-secret-btn\" title=\"${isVisible ? 'Hide secret' : 'Show secret'}\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n ${\n isVisible\n ? '<path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>'\n : '<path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"/><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"/>'\n }\n </svg>\n </button>`\n : ''\n }\n ${\n varItem.isOverridden\n ? `<button class=\"lamba-icon-btn reset-var-btn\" title=\"Reset to default\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"/>\n <path d=\"M3 3v5h5\"/>\n </svg>\n </button>`\n : ''\n }\n </div>\n </div>\n <div class=\"lamba-var-input-group\">\n <input \n type=\"${isVisible ? 'text' : 'password'}\" \n class=\"lamba-input var-input\" \n value=\"${this.escapeHtml(varItem.value)}\" \n placeholder=\"Value...\"\n />\n </div>\n ${\n varItem.isOverridden && varItem.defaultValue\n ? `<div class=\"lamba-diff\">Original default: <span class=\"lamba-diff-val\">${this.escapeHtml(\n varItem.defaultValue\n )}</span></div>`\n : ''\n }\n `;\n\n const inputEl = card.querySelector('.var-input') as HTMLInputElement;\n inputEl.addEventListener('change', () => {\n this.store.setOverride(varItem.key, inputEl.value);\n });\n\n card.querySelector('.toggle-secret-btn')?.addEventListener('click', () => {\n this.secretVisibilityMap.set(varItem.key, !isVisible);\n this.render();\n });\n\n card.querySelector('.reset-var-btn')?.addEventListener('click', () => {\n this.store.removeOverride(varItem.key);\n });\n\n return card;\n }\n\n private escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n }\n}\n","import { LambaOptions, EnvChangeListener } from './core/types';\nimport { EnvStore } from './core/store';\nimport { NetworkInterceptor } from './core/network-interceptor';\nimport { createShadowHost } from './ui/shadow-dom';\nimport { LauncherUI } from './ui/launcher';\nimport { ModalUI } from './ui/modal';\n\nexport class LambaManager {\n private store: EnvStore | null = null;\n private launcher: LauncherUI | null = null;\n private modal: ModalUI | null = null;\n private networkInterceptor: NetworkInterceptor | null = null;\n private options: LambaOptions = {};\n private isInitialized: boolean = false;\n\n /**\n * Implicit ES Proxy object where properties like `lamba.env.VITE_API_BASE_URL`\n * return the live active overridden value automatically.\n */\n public env: Record<string, string>;\n\n constructor() {\n const self = this;\n\n // Create implicit Proxy for lamba.env\n this.env = new Proxy({}, {\n get(_target, prop: string) {\n if (typeof prop === 'string') {\n return self.get(prop);\n }\n return undefined;\n },\n set(_target, prop: string, value: string) {\n if (typeof prop === 'string') {\n self.set(prop, String(value));\n return true;\n }\n return false;\n }\n });\n }\n\n /**\n * Wraps any environment object (such as `import.meta.env` or `process.env`)\n * in a dynamic proxy that implicitly resolves live overrides from lamba.\n */\n public wrap<T extends object>(targetEnv: T): T {\n const self = this;\n return new Proxy(targetEnv, {\n get(target, prop: string | symbol) {\n if (typeof prop === 'string') {\n const overrideVal = self.get(prop);\n if (overrideVal !== undefined && overrideVal !== '') {\n return overrideVal;\n }\n }\n return Reflect.get(target, prop);\n }\n });\n }\n\n /**\n * Initializes lamba with custom options and mounts the floating UI.\n */\n public init(options: LambaOptions = {}): this {\n if (typeof window === 'undefined') return this;\n if (this.isInitialized) return this;\n\n this.options = {\n enabled: true,\n position: 'bottom-right',\n autoFetchEnvFile: false,\n interceptNetworkRequests: true,\n ...options,\n };\n\n\n if (this.options.enabled === false) return this;\n\n // 1. Initialize Store\n this.store = new EnvStore(this.options);\n\n // 2. Initialize Network Interceptor if enabled\n if (this.options.interceptNetworkRequests !== false) {\n this.networkInterceptor = new NetworkInterceptor(this.store);\n this.networkInterceptor.enable();\n }\n\n // 3. Mount UI in Shadow DOM\n const mountUI = () => {\n if (this.launcher || !this.store) return;\n\n const { shadowRoot } = createShadowHost();\n\n this.modal = new ModalUI(shadowRoot, this.store, () => {\n // Modal closed callback\n });\n\n this.launcher = new LauncherUI(shadowRoot, this.options.position, () => {\n this.modal?.toggle();\n });\n\n // Sync badge count with initial store overrides count\n const initialOverridesCount = Object.keys(this.store.getOverrides()).length;\n this.launcher.updateBadgeCount(initialOverridesCount);\n\n // Subscribe launcher badge to store changes\n this.store.subscribeStoreChange(() => {\n const count = Object.keys(this.store!.getOverrides()).length;\n this.launcher?.updateBadgeCount(count);\n });\n };\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', mountUI);\n } else {\n mountUI();\n }\n\n this.isInitialized = true;\n return this;\n }\n\n /**\n * Gets the active value of an environment variable (returns overridden value if active, otherwise default).\n */\n public get(key: string, fallback?: string): string {\n if (!this.store) {\n // Lazy init store if called before explicit init\n this.init();\n }\n return this.store?.get(key, fallback) ?? fallback ?? '';\n }\n\n /**\n * Overrides an environment variable live at runtime.\n */\n public set(key: string, value: string): void {\n if (!this.store) this.init();\n this.store?.setOverride(key, value);\n }\n\n /**\n * Removes an override for a specific environment variable key.\n */\n public remove(key: string): void {\n this.store?.removeOverride(key);\n }\n\n /**\n * Resets all environment variable overrides.\n */\n public reset(): void {\n this.store?.resetAllOverrides();\n }\n\n /**\n * Subscribes to environment variable changes.\n */\n public onChange(listener: EnvChangeListener): () => void {\n if (!this.store) this.init();\n return this.store?.subscribeEnvChange(listener) ?? (() => {});\n }\n\n /**\n * Programmatically opens the lamba floating modal.\n */\n public open(): void {\n this.modal?.open();\n }\n\n /**\n * Programmatically closes the lamba floating modal.\n */\n public close(): void {\n this.modal?.close();\n }\n\n /**\n * Programmatically toggles the lamba floating modal.\n */\n public toggle(): void {\n this.modal?.toggle();\n }\n}\n\n// Global Singleton Instance\nexport const lamba = new LambaManager();\n\n// Auto-initialize when included as a CDN script tag in browser\nif (typeof window !== 'undefined') {\n (window as any).lamba = lamba;\n\n // Auto init if script loaded directly via CDN script tag\n const isCdnScript = document.currentScript !== null || !!document.querySelector('script[src*=\"lamba\"]');\n if (isCdnScript) {\n lamba.init();\n }\n}\n\nexport default lamba;\nexport * from './core/types';\nexport { parseEnvString, stringifyEnv } from './core/env-parser';\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":[]}
1
+ {"version":3,"sources":["../../src/integrations/vue.ts","../../src/core/preset-manager.ts","../../src/core/env-parser.ts","../../src/core/store.ts","../../src/core/network-interceptor.ts","../../src/ui/styles.ts","../../src/ui/shadow-dom.ts","../../src/ui/launcher.ts","../../src/ui/modal.ts","../../src/index.ts"],"sourcesContent":["import { ref, onUnmounted, getCurrentInstance, Ref } from \"vue\";\nimport { lamba } from \"../index\";\n\n/**\n * Vue Composable for consuming reactive environment variables updated by lamba.\n *\n * @param key The environment variable key name (e.g. 'API_URL', 'NEXT_PUBLIC_API_URL', 'VITE_API_URL')\n * @param defaultValue Fallback value if the variable is not set\n * @returns Vue Ref string\n */\nexport function useLambaEnv(\n key: string,\n defaultValue: string = \"\",\n): Ref<string> {\n const envValue = ref<string>(lamba.get(key, defaultValue)) as Ref<string>;\n\n const unsubscribe = lamba.onChange((changedKey: string) => {\n if (changedKey === key) {\n envValue.value = lamba.get(key, defaultValue);\n }\n });\n\n if (getCurrentInstance()) {\n onUnmounted(() => {\n unsubscribe();\n });\n }\n\n return envValue;\n}\n","import { PresetProfile } from './types';\n\nconst STORAGE_PRESETS_KEY = '__lamba_presets__';\nconst STORAGE_ACTIVE_PRESET_KEY = '__lamba_active_preset__';\n\nexport class PresetManager {\n private presets: PresetProfile[] = [];\n private activePresetId: string | null = null;\n\n constructor() {\n this.loadFromStorage();\n }\n\n private loadFromStorage(): void {\n if (typeof localStorage === 'undefined') return;\n\n try {\n const rawPresets = localStorage.getItem(STORAGE_PRESETS_KEY);\n if (rawPresets) {\n this.presets = JSON.parse(rawPresets);\n }\n this.activePresetId = localStorage.getItem(STORAGE_ACTIVE_PRESET_KEY);\n } catch (e) {\n console.warn('[lamba] Failed to parse presets from localStorage', e);\n }\n }\n\n private saveToStorage(): void {\n if (typeof localStorage === 'undefined') return;\n\n try {\n localStorage.setItem(STORAGE_PRESETS_KEY, JSON.stringify(this.presets));\n if (this.activePresetId) {\n localStorage.setItem(STORAGE_ACTIVE_PRESET_KEY, this.activePresetId);\n } else {\n localStorage.removeItem(STORAGE_ACTIVE_PRESET_KEY);\n }\n } catch (e) {\n console.warn('[lamba] Failed to save presets to localStorage', e);\n }\n }\n\n public getPresets(): PresetProfile[] {\n return [...this.presets];\n }\n\n public getActivePresetId(): string | null {\n return this.activePresetId;\n }\n\n public createPreset(name: string, overrides: Record<string, string>): PresetProfile {\n const newPreset: PresetProfile = {\n id: 'preset_' + Math.random().toString(36).substring(2, 9),\n name: name.trim() || 'Untitled Preset',\n overrides: { ...overrides },\n createdAt: Date.now(),\n };\n\n this.presets.push(newPreset);\n this.saveToStorage();\n return newPreset;\n }\n\n public deletePreset(id: string): void {\n this.presets = this.presets.filter((p) => p.id !== id);\n if (this.activePresetId === id) {\n this.activePresetId = null;\n }\n this.saveToStorage();\n }\n\n public setActivePreset(id: string | null): PresetProfile | null {\n if (!id) {\n this.activePresetId = null;\n this.saveToStorage();\n return null;\n }\n\n const preset = this.presets.find((p) => p.id === id);\n if (preset) {\n this.activePresetId = id;\n this.saveToStorage();\n return preset;\n }\n return null;\n }\n}\n","/**\n * Parses raw .env string into a key-value Record.\n */\nexport function parseEnvString(rawText: string): Record<string, string> {\n const result: Record<string, string> = {};\n const lines = rawText.split('\\n');\n\n for (let line of lines) {\n line = line.trim();\n if (!line || line.startsWith('#')) continue;\n\n if (line.startsWith('export ')) {\n line = line.slice(7).trim();\n }\n\n const equalsIdx = line.indexOf('=');\n if (equalsIdx === -1) continue;\n\n const key = line.slice(0, equalsIdx).trim();\n let val = line.slice(equalsIdx + 1).trim();\n\n // Remove quotes if wrapped in single or double quotes\n if (\n (val.startsWith('\"') && val.endsWith('\"')) ||\n (val.startsWith(\"'\") && val.endsWith(\"'\"))\n ) {\n val = val.slice(1, -1);\n }\n\n // Replace escaped newlines\n val = val.replace(/\\\\n/g, '\\n');\n\n if (key) {\n result[key] = val;\n }\n }\n\n return result;\n}\n\n/**\n * Stringifies a Record<string, string> into standard .env format.\n */\nexport function stringifyEnv(env: Record<string, string>): string {\n return Object.entries(env)\n .map(([key, val]) => {\n const needsQuotes = val.includes(' ') || val.includes('\\n') || val.includes('#');\n const formattedVal = needsQuotes ? `\"${val.replace(/\"/g, '\\\\\"')}\"` : val;\n return `${key}=${formattedVal}`;\n })\n .join('\\n');\n}\n\n/**\n * Auto-discovers environment variables available in the current browser runtime.\n */\nexport function autoDiscoverBrowserEnv(): Record<string, string> {\n const discovered: Record<string, string> = {};\n\n if (typeof window === 'undefined') return discovered;\n\n const extractPrimitiveProps = (obj: any) => {\n if (!obj || typeof obj !== 'object') return;\n for (const [k, v] of Object.entries(obj)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n discovered[k] = String(v);\n }\n }\n };\n\n // 1. Inspect window.process.env\n try {\n const winProcess = (window as any).process;\n if (winProcess && winProcess.env && typeof winProcess.env === 'object') {\n extractPrimitiveProps(winProcess.env);\n }\n } catch (e) {}\n\n // 2. Inspect Next.js __NEXT_DATA__ env & runtimeConfig\n try {\n const nextData = (window as any).__NEXT_DATA__;\n if (nextData) {\n if (nextData.env) extractPrimitiveProps(nextData.env);\n if (nextData.runtimeConfig?.public) extractPrimitiveProps(nextData.runtimeConfig.public);\n }\n } catch (e) {}\n\n // 3. Inspect Nuxt __NUXT__ public runtime config\n try {\n const nuxtData = (window as any).__NUXT__;\n if (nuxtData?.config?.public) {\n extractPrimitiveProps(nuxtData.config.public);\n }\n } catch (e) {}\n\n // 4. Inspect window.__ENV__ or window.ENV or window.PUBLIC_ENV\n try {\n const win = window as any;\n const customEnv = win.__ENV__ || win.ENV || win.PUBLIC_ENV || win.__LAMBA_ENV__;\n if (customEnv) {\n extractPrimitiveProps(customEnv);\n }\n } catch (e) {}\n\n // 5. Inspect HTML meta tags (e.g. <meta name=\"env:API_KEY\" content=\"xyz\"> or <meta name=\"lamba-env\" content=\"API_KEY=xyz&MODE=dev\">)\n try {\n const metaTags = document.querySelectorAll('meta');\n metaTags.forEach((meta) => {\n const name = meta.getAttribute('name');\n const content = meta.getAttribute('content');\n if (!name || content === null) return;\n\n if (name.startsWith('env:')) {\n const key = name.slice(4);\n discovered[key] = content;\n } else if (name === 'lamba-env') {\n const parsed = new URLSearchParams(content);\n parsed.forEach((val, key) => {\n discovered[key] = val;\n });\n }\n });\n } catch (e) {}\n\n return discovered;\n}\n\n/**\n * Attempts to fetch /.env or /.env.example from root URL if hosted in dev mode.\n */\nexport async function tryFetchRootEnvFile(): Promise<Record<string, string>> {\n const paths = ['/.env', '/.env.local', '/.env.example'];\n for (const path of paths) {\n try {\n const res = await fetch(path, { headers: { Accept: 'text/plain' } });\n if (res.ok) {\n const text = await res.text();\n if (text && text.includes('=')) {\n return parseEnvString(text);\n }\n }\n } catch (e) {\n // Ignore network errors in production or non-accessible env files\n }\n }\n return {};\n}\n","import {\n EnvVariable,\n EnvChangeListener,\n StoreChangeListener,\n LambaOptions,\n PresetProfile,\n} from './types';\nimport { PresetManager } from './preset-manager';\nimport { autoDiscoverBrowserEnv, tryFetchRootEnvFile } from './env-parser';\n\nconst STORAGE_OVERRIDES_KEY = '__lamba_overrides__';\nconst DEFAULT_SECRET_PATTERN = /(KEY|SECRET|TOKEN|PASSWORD|AUTH|PRIVATE|CREDENTIAL|SIGNATURE)/i;\n\nexport class EnvStore {\n private variables: Map<string, EnvVariable> = new Map();\n private overrides: Record<string, string> = {};\n private secretPattern: RegExp;\n private allowedPrefixes?: string | string[] | RegExp | null;\n private envChangeListeners: Set<EnvChangeListener> = new Set();\n private storeChangeListeners: Set<StoreChangeListener> = new Set();\n public presetManager: PresetManager;\n\n constructor(options: LambaOptions = {}) {\n this.secretPattern = options.secretKeysPattern || DEFAULT_SECRET_PATTERN;\n this.allowedPrefixes = options.allowedPrefixes;\n this.presetManager = new PresetManager();\n\n // 1. Load initial overrides from localStorage\n this.loadOverridesFromStorage();\n\n // 2. Register initial options.env if provided\n if (options.env) {\n this.mergeDefaults(options.env);\n }\n\n // 3. Auto-discover from browser runtime\n const autoDiscovered = autoDiscoverBrowserEnv();\n this.mergeDefaults(autoDiscovered);\n\n // 4. Try fetching root /.env file if explicitly enabled\n if (options.autoFetchEnvFile === true && typeof window !== 'undefined') {\n tryFetchRootEnvFile().then((fileEnv) => {\n if (Object.keys(fileEnv).length > 0) {\n this.mergeDefaults(fileEnv);\n }\n });\n }\n\n\n // 5. Patch window.process.env\n this.patchProcessEnv();\n }\n\n private loadOverridesFromStorage(): void {\n if (typeof localStorage === 'undefined') return;\n try {\n const stored = localStorage.getItem(STORAGE_OVERRIDES_KEY);\n if (stored) {\n this.overrides = JSON.parse(stored);\n }\n } catch (e) {\n console.warn('[lamba] Failed to parse overrides from localStorage', e);\n }\n }\n\n private saveOverridesToStorage(): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.setItem(STORAGE_OVERRIDES_KEY, JSON.stringify(this.overrides));\n } catch (e) {\n console.warn('[lamba] Failed to save overrides to localStorage', e);\n }\n }\n\n /**\n */\n private patchProcessEnv(): void {\n if (typeof window === 'undefined') return;\n\n const win = window as any;\n if (!win.process) {\n win.process = { env: {} };\n } else if (!win.process.env) {\n win.process.env = {};\n }\n\n const self = this;\n const targetEnv = win.process.env;\n\n // Use Proxy if supported\n try {\n win.process.env = new Proxy(targetEnv, {\n get(target, prop: string) {\n if (typeof prop === 'string') {\n const val = self.get(prop);\n if (val !== undefined) return val;\n }\n return target[prop];\n },\n set(target, prop: string, value: any) {\n target[prop] = value;\n return true;\n },\n });\n } catch (e) {\n // Fallback for environment where Proxy is restricted\n }\n }\n\n /**\n * Checks if an environment variable key satisfies the allowedPrefixes option.\n */\n public isAllowedKey(key: string): boolean {\n if (!this.allowedPrefixes) return true;\n\n if (typeof this.allowedPrefixes === 'string') {\n return key.startsWith(this.allowedPrefixes);\n }\n\n if (Array.isArray(this.allowedPrefixes)) {\n if (this.allowedPrefixes.length === 0) return true;\n return this.allowedPrefixes.some((p) => key.startsWith(p));\n }\n\n if (this.allowedPrefixes instanceof RegExp) {\n return this.allowedPrefixes.test(key);\n }\n\n return true;\n }\n\n public mergeDefaults(env: Record<string, any>): void {\n let changed = false;\n for (const [key, rawDefault] of Object.entries(env)) {\n if (!this.isAllowedKey(key)) continue;\n\n const defaultValue = rawDefault !== null && rawDefault !== undefined ? String(rawDefault) : '';\n const isOverridden = key in this.overrides;\n const currentValue = isOverridden ? String(this.overrides[key] ?? '') : defaultValue;\n const isSecret = this.secretPattern.test(key);\n\n const existing = this.variables.get(key);\n if (!existing) {\n this.variables.set(key, {\n key,\n value: currentValue,\n defaultValue,\n isOverridden,\n isSecret,\n });\n changed = true;\n } else {\n // Update default value if changed\n if (existing.defaultValue !== defaultValue) {\n existing.defaultValue = defaultValue;\n if (!existing.isOverridden) {\n existing.value = defaultValue;\n }\n changed = true;\n }\n }\n }\n\n if (changed) {\n this.notifyStoreChanged();\n }\n }\n\n public get(key: string, fallback?: string): string | undefined {\n if (key in this.overrides) {\n return this.overrides[key];\n }\n const item = this.variables.get(key);\n if (item) return item.value;\n return fallback;\n }\n\n public getAll(): Record<string, EnvVariable> {\n const result: Record<string, EnvVariable> = {};\n this.variables.forEach((varObj, key) => {\n result[key] = { ...varObj };\n });\n return result;\n }\n\n public getOverrides(): Record<string, string> {\n return { ...this.overrides };\n }\n\n public setOverride(key: string, value: string): void {\n const trimmedKey = key.trim();\n if (!trimmedKey) return;\n\n this.overrides[trimmedKey] = value;\n this.saveOverridesToStorage();\n\n let item = this.variables.get(trimmedKey);\n if (!item) {\n item = {\n key: trimmedKey,\n value,\n defaultValue: '',\n isOverridden: true,\n isSecret: this.secretPattern.test(trimmedKey),\n };\n this.variables.set(trimmedKey, item);\n } else {\n item.value = value;\n item.isOverridden = true;\n }\n\n this.emitEnvChange(trimmedKey, value, true);\n this.notifyStoreChanged();\n }\n\n public removeOverride(key: string): void {\n if (key in this.overrides) {\n delete this.overrides[key];\n this.saveOverridesToStorage();\n\n const item = this.variables.get(key);\n if (item) {\n item.value = item.defaultValue;\n item.isOverridden = false;\n this.emitEnvChange(key, item.value, false);\n }\n\n this.notifyStoreChanged();\n }\n }\n\n public resetAllOverrides(): void {\n const keys = Object.keys(this.overrides);\n this.overrides = {};\n this.saveOverridesToStorage();\n this.presetManager.setActivePreset(null);\n\n keys.forEach((key) => {\n const item = this.variables.get(key);\n if (item) {\n item.value = item.defaultValue;\n item.isOverridden = false;\n this.emitEnvChange(key, item.value, false);\n }\n });\n\n this.notifyStoreChanged();\n }\n\n public applyPreset(presetId: string | null): void {\n const preset = this.presetManager.setActivePreset(presetId);\n this.overrides = preset ? { ...preset.overrides } : {};\n this.saveOverridesToStorage();\n\n // Re-evaluate all variables\n this.variables.forEach((item, key) => {\n if (key in this.overrides) {\n item.value = this.overrides[key];\n item.isOverridden = true;\n } else {\n item.value = item.defaultValue;\n item.isOverridden = false;\n }\n this.emitEnvChange(key, item.value, item.isOverridden);\n });\n\n // Also include extra override keys from preset that weren't in variables\n if (preset) {\n for (const [key, value] of Object.entries(preset.overrides)) {\n if (!this.variables.has(key)) {\n this.variables.set(key, {\n key,\n value,\n defaultValue: '',\n isOverridden: true,\n isSecret: this.secretPattern.test(key),\n });\n this.emitEnvChange(key, value, true);\n }\n }\n }\n\n this.notifyStoreChanged();\n }\n\n public subscribeEnvChange(listener: EnvChangeListener): () => void {\n this.envChangeListeners.add(listener);\n return () => this.envChangeListeners.delete(listener);\n }\n\n public subscribeStoreChange(listener: StoreChangeListener): () => void {\n this.storeChangeListeners.add(listener);\n return () => this.storeChangeListeners.delete(listener);\n }\n\n private emitEnvChange(key: string, value: string, isOverridden: boolean): void {\n this.envChangeListeners.forEach((fn) => fn(key, value, isOverridden));\n\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('lamba:env-change', {\n detail: { key, value, isOverridden },\n })\n );\n }\n }\n\n private notifyStoreChanged(): void {\n const varsObj = this.getAll();\n const presets = this.presetManager.getPresets();\n const activePresetId = this.presetManager.getActivePresetId();\n this.storeChangeListeners.forEach((fn) => fn(varsObj, presets, activePresetId));\n }\n}\n","import { EnvStore } from './store';\n\nexport class NetworkInterceptor {\n private store: EnvStore;\n private originalFetch: typeof window.fetch | null = null;\n private originalXHRPost: typeof XMLHttpRequest.prototype.open | null = null;\n private isIntercepting: boolean = false;\n\n constructor(store: EnvStore) {\n this.store = store;\n }\n\n public enable(): void {\n if (typeof window === 'undefined' || this.isIntercepting) return;\n\n this.patchFetch();\n this.patchXHR();\n this.isIntercepting = true;\n }\n\n public disable(): void {\n if (typeof window === 'undefined' || !this.isIntercepting) return;\n\n if (this.originalFetch) {\n window.fetch = this.originalFetch;\n this.originalFetch = null;\n }\n if (this.originalXHRPost) {\n XMLHttpRequest.prototype.open = this.originalXHRPost;\n this.originalXHRPost = null;\n }\n this.isIntercepting = false;\n }\n\n /**\n * Rewrite a given URL by checking if any default env variable URL value matches\n * and replacing it with the active overridden value.\n */\n public rewriteUrl(url: string | URL | Request): string | URL | Request {\n if (typeof url !== 'string') return url;\n\n const allVars = this.store.getAll();\n let resultUrl = url;\n\n for (const varObj of Object.values(allVars)) {\n if (varObj.isOverridden && varObj.defaultValue !== undefined && varObj.value !== undefined) {\n const rawDefault = String(varObj.defaultValue ?? '');\n const rawOverride = String(varObj.value ?? '');\n if (!rawDefault || !rawOverride) continue;\n\n // Trim trailing slashes for accurate matching\n const defaultBase = rawDefault.replace(/\\/+$/, '');\n const overrideBase = rawOverride.replace(/\\/+$/, '');\n\n if (defaultBase && resultUrl.includes(defaultBase)) {\n resultUrl = resultUrl.replace(defaultBase, overrideBase);\n }\n }\n }\n\n return resultUrl;\n }\n\n private patchFetch(): void {\n if (!window.fetch) return;\n\n this.originalFetch = window.fetch;\n const self = this;\n\n window.fetch = function (input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n let finalInput = input;\n\n if (typeof input === 'string') {\n finalInput = self.rewriteUrl(input) as string;\n } else if (input instanceof URL) {\n const rewritten = self.rewriteUrl(input.toString()) as string;\n finalInput = new URL(rewritten);\n } else if (input instanceof Request) {\n const rewrittenUrl = self.rewriteUrl(input.url) as string;\n if (rewrittenUrl !== input.url) {\n finalInput = new Request(rewrittenUrl, input);\n }\n }\n\n return self.originalFetch!.call(this, finalInput, init);\n };\n }\n\n private patchXHR(): void {\n if (!window.XMLHttpRequest) return;\n\n this.originalXHRPost = XMLHttpRequest.prototype.open;\n const self = this;\n\n XMLHttpRequest.prototype.open = function (\n method: string,\n url: string | URL,\n async: boolean = true,\n username?: string | null,\n password?: string | null\n ): void {\n const stringUrl = typeof url === 'string' ? url : url.toString();\n const rewrittenUrl = self.rewriteUrl(stringUrl) as string;\n\n return self.originalXHRPost!.call(\n this,\n method,\n rewrittenUrl,\n async,\n username ?? null,\n password ?? null\n );\n };\n }\n}\n","export const LAMBA_STYLES = `\n:host {\n --lamba-bg-main: #0f172a;\n --lamba-bg-card: #1e293b;\n --lamba-bg-hover: #334155;\n --lamba-border: rgba(255, 255, 255, 0.1);\n --lamba-text-primary: #f8fafc;\n --lamba-text-secondary: #94a3b8;\n --lamba-primary: #6366f1;\n --lamba-primary-hover: #4f46e5;\n --lamba-accent: #06b6d4;\n --lamba-success: #10b981;\n --lamba-danger: #ef4444;\n --lamba-warning: #f59e0b;\n --lamba-font: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n --lamba-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.5), 0 8px 10px -6px rgba(0, 0, 0, 0.4);\n\n font-family: var(--lamba-font);\n font-size: 14px;\n line-height: 1.5;\n color: var(--lamba-text-primary);\n box-sizing: border-box;\n z-index: 999999;\n}\n\n*, *:before, *:after {\n box-sizing: border-box;\n}\n\n/* Floating Launcher Button */\n.lamba-launcher {\n position: fixed;\n z-index: 999999;\n width: 52px;\n height: 52px;\n border-radius: 50%;\n background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);\n color: #ffffff;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: 0 10px 15px -3px rgba(99, 102, 241, 0.4), 0 4px 6px -4px rgba(99, 102, 241, 0.2);\n border: 1px solid rgba(255, 255, 255, 0.2);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n user-select: none;\n}\n\n.lamba-launcher:hover {\n transform: scale(1.08);\n box-shadow: 0 14px 20px -3px rgba(99, 102, 241, 0.6), 0 6px 8px -4px rgba(99, 102, 241, 0.3);\n}\n\n.lamba-launcher:active {\n transform: scale(0.95);\n}\n\n.lamba-launcher-bottom-right { bottom: 24px; right: 24px; }\n.lamba-launcher-bottom-left { bottom: 24px; left: 24px; }\n.lamba-launcher-top-right { top: 24px; right: 24px; }\n.lamba-launcher-top-left { top: 24px; left: 24px; }\n\n.lamba-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n background: var(--lamba-accent);\n color: #000;\n font-size: 11px;\n font-weight: 700;\n min-width: 20px;\n height: 20px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 5px;\n border: 2px solid var(--lamba-bg-main);\n box-shadow: 0 2px 4px rgba(0,0,0,0.2);\n animation: pulse-scale 2s infinite;\n}\n\n@keyframes pulse-scale {\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.15); }\n}\n\n/* Modal Overlay */\n.lamba-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(15, 23, 42, 0.7);\n backdrop-filter: blur(8px);\n z-index: 999998;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.25s ease, visibility 0.25s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n}\n\n.lamba-overlay.active {\n opacity: 1;\n visibility: visible;\n}\n\n/* Main Modal Panel */\n.lamba-modal {\n width: 100%;\n max-width: 820px;\n max-height: 85vh;\n background: var(--lamba-bg-main);\n border: 1px solid var(--lamba-border);\n border-radius: 16px;\n box-shadow: var(--lamba-shadow);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transform: translateY(20px) scale(0.96);\n transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.lamba-overlay.active .lamba-modal {\n transform: translateY(0) scale(1);\n}\n\n/* Header */\n.lamba-header {\n padding: 20px 24px;\n border-bottom: 1px solid var(--lamba-border);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: rgba(30, 41, 59, 0.4);\n}\n\n.lamba-brand {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.lamba-logo {\n font-size: 18px;\n font-weight: 800;\n letter-spacing: -0.5px;\n background: linear-gradient(135deg, #a5b4fc 0%, #6366f1 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.lamba-tag {\n background: rgba(99, 102, 241, 0.15);\n color: #a5b4fc;\n font-size: 11px;\n padding: 2px 8px;\n border-radius: 6px;\n font-weight: 600;\n border: 1px solid rgba(99, 102, 241, 0.3);\n}\n\n.lamba-close-btn {\n background: transparent;\n border: none;\n color: var(--lamba-text-secondary);\n cursor: pointer;\n padding: 6px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.lamba-close-btn:hover {\n background: var(--lamba-bg-hover);\n color: var(--lamba-text-primary);\n}\n\n/* Controls Bar (Search & Filters) */\n.lamba-controls {\n padding: 16px 24px;\n border-bottom: 1px solid var(--lamba-border);\n display: flex;\n gap: 12px;\n align-items: center;\n flex-wrap: wrap;\n background: var(--lamba-bg-main);\n}\n\n.lamba-search-box {\n flex: 1;\n min-width: 220px;\n position: relative;\n}\n\n.lamba-search-input {\n width: 100%;\n padding: 10px 14px 10px 38px;\n background: var(--lamba-bg-card);\n border: 1px solid var(--lamba-border);\n border-radius: 8px;\n color: var(--lamba-text-primary);\n font-size: 13px;\n outline: none;\n transition: border-color 0.15s ease;\n}\n\n.lamba-search-input:focus {\n border-color: var(--lamba-primary);\n}\n\n.lamba-search-icon {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--lamba-text-secondary);\n pointer-events: none;\n}\n\n.lamba-tabs {\n display: flex;\n gap: 4px;\n background: var(--lamba-bg-card);\n padding: 4px;\n border-radius: 8px;\n border: 1px solid var(--lamba-border);\n}\n\n.lamba-tab {\n background: transparent;\n border: none;\n color: var(--lamba-text-secondary);\n padding: 6px 12px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.lamba-tab.active {\n background: var(--lamba-primary);\n color: #ffffff;\n}\n\n/* Preset Bar */\n.lamba-presets-bar {\n padding: 12px 24px;\n background: rgba(30, 41, 59, 0.3);\n border-bottom: 1px solid var(--lamba-border);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n\n.lamba-preset-selector {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n}\n\n.lamba-select {\n background: var(--lamba-bg-card);\n color: var(--lamba-text-primary);\n border: 1px solid var(--lamba-border);\n padding: 6px 12px;\n border-radius: 6px;\n outline: none;\n font-size: 13px;\n cursor: pointer;\n}\n\n/* List Content */\n.lamba-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.lamba-content::-webkit-scrollbar {\n width: 6px;\n}\n\n.lamba-content::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.lamba-content::-webkit-scrollbar-thumb {\n background: var(--lamba-bg-hover);\n border-radius: 3px;\n}\n\n/* Variable Row Card */\n.lamba-var-card {\n background: var(--lamba-bg-card);\n border: 1px solid var(--lamba-border);\n border-radius: 10px;\n padding: 14px 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n transition: border-color 0.15s ease;\n}\n\n.lamba-var-card.is-overridden {\n border-color: rgba(99, 102, 241, 0.5);\n background: linear-gradient(180deg, var(--lamba-bg-card) 0%, rgba(99, 102, 241, 0.05) 100%);\n}\n\n.lamba-var-meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.lamba-var-key {\n font-weight: 700;\n font-family: monospace;\n color: #a5b4fc;\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.lamba-modified-pill {\n font-size: 10px;\n font-weight: 700;\n background: rgba(16, 185, 129, 0.2);\n color: #34d399;\n padding: 2px 6px;\n border-radius: 4px;\n border: 1px solid rgba(16, 185, 129, 0.4);\n}\n\n.lamba-var-actions {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.lamba-icon-btn {\n background: transparent;\n border: none;\n color: var(--lamba-text-secondary);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.lamba-icon-btn:hover {\n background: var(--lamba-bg-hover);\n color: var(--lamba-text-primary);\n}\n\n.lamba-var-input-group {\n display: flex;\n gap: 8px;\n}\n\n.lamba-input {\n flex: 1;\n background: var(--lamba-bg-main);\n border: 1px solid var(--lamba-border);\n color: var(--lamba-text-primary);\n padding: 8px 12px;\n border-radius: 6px;\n font-family: monospace;\n font-size: 13px;\n outline: none;\n}\n\n.lamba-input:focus {\n border-color: var(--lamba-primary);\n}\n\n.lamba-diff {\n font-size: 11px;\n color: var(--lamba-text-secondary);\n font-family: monospace;\n padding-left: 2px;\n}\n\n.lamba-diff-val {\n color: var(--lamba-warning);\n}\n\n/* Empty State */\n.lamba-empty {\n padding: 40px 20px;\n text-align: center;\n color: var(--lamba-text-secondary);\n}\n\n/* Footer Actions Bar */\n.lamba-footer {\n padding: 16px 24px;\n border-top: 1px solid var(--lamba-border);\n background: rgba(30, 41, 59, 0.4);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.lamba-btn {\n background: var(--lamba-bg-card);\n color: var(--lamba-text-primary);\n border: 1px solid var(--lamba-border);\n padding: 8px 14px;\n border-radius: 8px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.15s ease;\n}\n\n.lamba-btn:hover {\n background: var(--lamba-bg-hover);\n}\n\n.lamba-btn-primary {\n background: var(--lamba-primary);\n border-color: var(--lamba-primary);\n color: #ffffff;\n}\n\n.lamba-btn-primary:hover {\n background: var(--lamba-primary-hover);\n}\n\n.lamba-btn-danger {\n background: rgba(239, 68, 68, 0.15);\n color: #fca5a5;\n border-color: rgba(239, 68, 68, 0.3);\n}\n\n.lamba-btn-danger:hover {\n background: rgba(239, 68, 68, 0.3);\n}\n`;\n","import { LAMBA_STYLES } from './styles';\n\nexport function createShadowHost(): { host: HTMLElement; shadowRoot: ShadowRoot } {\n if (typeof document === 'undefined') {\n throw new Error('[lamba] Document object not available.');\n }\n\n let host = document.getElementById('lamba-root') as HTMLElement;\n if (!host) {\n host = document.createElement('lamba-widget');\n host.id = 'lamba-root';\n document.body.appendChild(host);\n }\n\n let shadowRoot = host.shadowRoot;\n if (!shadowRoot) {\n shadowRoot = host.attachShadow({ mode: 'open' });\n\n // Inject styles\n const styleEl = document.createElement('style');\n styleEl.textContent = LAMBA_STYLES;\n shadowRoot.appendChild(styleEl);\n }\n\n return { host, shadowRoot };\n}\n","export class LauncherUI {\n private element: HTMLElement;\n private badgeElement: HTMLElement;\n private onClickCallback: () => void;\n\n constructor(\n container: ShadowRoot,\n position: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left' = 'bottom-right',\n onClick: () => void\n ) {\n this.onClickCallback = onClick;\n\n this.element = document.createElement('div');\n this.element.className = `lamba-launcher lamba-launcher-${position}`;\n this.element.title = 'Open lamba Environment Controls';\n\n // SVG Settings Icon\n this.element.innerHTML = `\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\"/>\n <circle cx=\"12\" cy=\"12\" r=\"3\"/>\n </svg>\n `;\n\n // Counter Badge\n this.badgeElement = document.createElement('div');\n this.badgeElement.className = 'lamba-badge';\n this.badgeElement.style.display = 'none';\n this.element.appendChild(this.badgeElement);\n\n this.element.addEventListener('click', () => this.onClickCallback());\n container.appendChild(this.element);\n }\n\n public updateBadgeCount(count: number): void {\n if (count > 0) {\n this.badgeElement.textContent = String(count);\n this.badgeElement.style.display = 'flex';\n } else {\n this.badgeElement.style.display = 'none';\n }\n }\n\n public setVisible(visible: boolean): void {\n this.element.style.display = visible ? 'flex' : 'none';\n }\n}\n","import { EnvStore } from '../core/store';\nimport { EnvVariable, PresetProfile } from '../core/types';\nimport { parseEnvString, stringifyEnv } from '../core/env-parser';\n\nexport class ModalUI {\n private overlay: HTMLElement;\n private modal: HTMLElement;\n private contentList: HTMLElement;\n private searchInput: HTMLInputElement;\n private tabAllBtn: HTMLElement;\n private tabOverriddenBtn: HTMLElement;\n private tabSecretsBtn: HTMLElement;\n private presetSelect: HTMLSelectElement;\n private savePresetBtn: HTMLElement;\n private activeTab: 'all' | 'overridden' | 'secrets' = 'all';\n private searchQuery: string = '';\n private store: EnvStore;\n private secretVisibilityMap: Map<string, boolean> = new Map();\n private isOpen: boolean = false;\n\n constructor(container: ShadowRoot, store: EnvStore, onClose: () => void) {\n this.store = store;\n\n // Build DOM layout\n this.overlay = document.createElement('div');\n this.overlay.className = 'lamba-overlay';\n\n this.modal = document.createElement('div');\n this.modal.className = 'lamba-modal';\n\n // Header\n const header = document.createElement('div');\n header.className = 'lamba-header';\n header.innerHTML = `\n <div class=\"lamba-brand\">\n <div class=\"lamba-logo\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5\"/>\n </svg>\n lamba\n </div>\n <span class=\"lamba-tag\">Dev Environment Override</span>\n </div>\n <button class=\"lamba-close-btn\" title=\"Close modal\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n `;\n header.querySelector('.lamba-close-btn')?.addEventListener('click', () => {\n this.close();\n onClose();\n });\n\n // Controls Bar (Search & Filter Tabs)\n const controls = document.createElement('div');\n controls.className = 'lamba-controls';\n\n const searchBox = document.createElement('div');\n searchBox.className = 'lamba-search-box';\n searchBox.innerHTML = `\n <svg class=\"lamba-search-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n <input type=\"text\" class=\"lamba-search-input\" placeholder=\"Search environment keys or values...\" />\n `;\n this.searchInput = searchBox.querySelector('.lamba-search-input') as HTMLInputElement;\n this.searchInput.addEventListener('input', (e) => {\n this.searchQuery = (e.target as HTMLInputElement).value.toLowerCase();\n this.render();\n });\n\n const tabs = document.createElement('div');\n tabs.className = 'lamba-tabs';\n tabs.innerHTML = `\n <button class=\"lamba-tab active\" data-tab=\"all\">All</button>\n <button class=\"lamba-tab\" data-tab=\"overridden\">Modified</button>\n <button class=\"lamba-tab\" data-tab=\"secrets\">Secrets</button>\n `;\n\n this.tabAllBtn = tabs.querySelector('[data-tab=\"all\"]') as HTMLElement;\n this.tabOverriddenBtn = tabs.querySelector('[data-tab=\"overridden\"]') as HTMLElement;\n this.tabSecretsBtn = tabs.querySelector('[data-tab=\"secrets\"]') as HTMLElement;\n\n tabs.querySelectorAll('.lamba-tab').forEach((btn) => {\n btn.addEventListener('click', (e) => {\n tabs.querySelectorAll('.lamba-tab').forEach((t) => t.classList.remove('active'));\n const target = e.currentTarget as HTMLElement;\n target.classList.add('active');\n this.activeTab = target.getAttribute('data-tab') as any;\n this.render();\n });\n });\n\n controls.appendChild(searchBox);\n controls.appendChild(tabs);\n\n // Presets Bar\n const presetsBar = document.createElement('div');\n presetsBar.className = 'lamba-presets-bar';\n presetsBar.innerHTML = `\n <div class=\"lamba-preset-selector\">\n <span style=\"color: var(--lamba-text-secondary); font-weight: 600;\">Preset Profile:</span>\n <select class=\"lamba-select lamba-preset-dropdown\">\n <option value=\"\">Default (Current Overrides)</option>\n </select>\n </div>\n <button class=\"lamba-btn lamba-save-preset-btn\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\"></path>\n <polyline points=\"17 21 17 13 7 13 7 21\"></polyline>\n <polyline points=\"7 3 7 8 15 8\"></polyline>\n </svg>\n Save as Preset\n </button>\n `;\n\n this.presetSelect = presetsBar.querySelector('.lamba-preset-dropdown') as HTMLSelectElement;\n this.presetSelect.addEventListener('change', () => {\n const selectedId = this.presetSelect.value || null;\n this.store.applyPreset(selectedId);\n });\n\n this.savePresetBtn = presetsBar.querySelector('.lamba-save-preset-btn') as HTMLElement;\n this.savePresetBtn.addEventListener('click', () => {\n const name = prompt('Enter a name for this Environment Preset Profile:', 'Staging Environment');\n if (name) {\n const overrides = this.store.getOverrides();\n this.store.presetManager.createPreset(name, overrides);\n this.updatePresetDropdown();\n }\n });\n\n // Content List Container\n this.contentList = document.createElement('div');\n this.contentList.className = 'lamba-content';\n\n // Footer Bar\n const footer = document.createElement('div');\n footer.className = 'lamba-footer';\n footer.innerHTML = `\n <div style=\"display: flex; gap: 8px;\">\n <button class=\"lamba-btn lamba-add-var-btn\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\n </svg>\n Add Variable\n </button>\n <button class=\"lamba-btn lamba-import-btn\">Import .env</button>\n <button class=\"lamba-btn lamba-export-btn\">Export .env</button>\n </div>\n <div style=\"display: flex; gap: 8px;\">\n <button class=\"lamba-btn lamba-btn-danger lamba-reset-all-btn\">Reset All</button>\n <button class=\"lamba-btn lamba-btn-primary lamba-reload-btn\">Reload Page</button>\n </div>\n `;\n\n footer.querySelector('.lamba-add-var-btn')?.addEventListener('click', () => {\n const key = prompt('Enter new environment variable key name (e.g. API_URL, NEXT_PUBLIC_API_URL, REACT_APP_API_URL, VITE_API_URL):');\n if (key) {\n const value = prompt(`Enter value for ${key}:`) || '';\n this.store.setOverride(key, value);\n }\n });\n\n footer.querySelector('.lamba-import-btn')?.addEventListener('click', () => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.env,.txt';\n input.onchange = (e: any) => {\n const file = e.target.files[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (event) => {\n const content = event.target?.result as string;\n if (content) {\n const parsed = parseEnvString(content);\n for (const [k, v] of Object.entries(parsed)) {\n this.store.setOverride(k, v);\n }\n }\n };\n reader.readAsText(file);\n }\n };\n input.click();\n });\n\n footer.querySelector('.lamba-export-btn')?.addEventListener('click', () => {\n const allVars = this.store.getAll();\n const exportObj: Record<string, string> = {};\n for (const [k, v] of Object.entries(allVars)) {\n exportObj[k] = v.value;\n }\n const envText = stringifyEnv(exportObj);\n const blob = new Blob([envText], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = '.env';\n a.click();\n URL.revokeObjectURL(url);\n });\n\n footer.querySelector('.lamba-reset-all-btn')?.addEventListener('click', () => {\n if (confirm('Are you sure you want to reset all overridden environment variables?')) {\n this.store.resetAllOverrides();\n }\n });\n\n footer.querySelector('.lamba-reload-btn')?.addEventListener('click', () => {\n window.location.reload();\n });\n\n // Assemble modal structure\n this.modal.appendChild(header);\n this.modal.appendChild(controls);\n this.modal.appendChild(presetsBar);\n this.modal.appendChild(this.contentList);\n this.modal.appendChild(footer);\n this.overlay.appendChild(this.modal);\n\n // Close on overlay background click\n this.overlay.addEventListener('click', (e) => {\n if (e.target === this.overlay) {\n this.close();\n onClose();\n }\n });\n\n container.appendChild(this.overlay);\n\n // Subscribe to store updates\n this.store.subscribeStoreChange(() => {\n if (this.isOpen) {\n this.updatePresetDropdown();\n this.render();\n }\n });\n }\n\n public open(): void {\n this.isOpen = true;\n this.updatePresetDropdown();\n this.render();\n this.overlay.classList.add('active');\n }\n\n public close(): void {\n this.isOpen = false;\n this.overlay.classList.remove('active');\n }\n\n public toggle(): void {\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n }\n\n private updatePresetDropdown(): void {\n const presets = this.store.presetManager.getPresets();\n const activeId = this.store.presetManager.getActivePresetId();\n\n this.presetSelect.innerHTML = `<option value=\"\">Default (Custom Overrides)</option>`;\n presets.forEach((p) => {\n const opt = document.createElement('option');\n opt.value = p.id;\n opt.textContent = p.name;\n if (p.id === activeId) opt.selected = true;\n this.presetSelect.appendChild(opt);\n });\n }\n\n public render(): void {\n const allVarsMap = this.store.getAll();\n let varList = Object.values(allVarsMap);\n\n // Filter by Tab\n if (this.activeTab === 'overridden') {\n varList = varList.filter((v) => v.isOverridden);\n } else if (this.activeTab === 'secrets') {\n varList = varList.filter((v) => v.isSecret);\n }\n\n // Filter by Search Query\n if (this.searchQuery) {\n varList = varList.filter(\n (v) =>\n v.key.toLowerCase().includes(this.searchQuery) ||\n v.value.toLowerCase().includes(this.searchQuery)\n );\n }\n\n // Sort by overridden first, then alphabetically\n varList.sort((a, b) => {\n if (a.isOverridden !== b.isOverridden) {\n return a.isOverridden ? -1 : 1;\n }\n return a.key.localeCompare(b.key);\n });\n\n this.contentList.innerHTML = '';\n\n if (varList.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'lamba-empty';\n empty.textContent =\n this.searchQuery || this.activeTab !== 'all'\n ? 'No environment variables match your current filter.'\n : 'No environment variables found or registered. Click \"+ Add Variable\" or \"Import .env\" to get started.';\n this.contentList.appendChild(empty);\n return;\n }\n\n varList.forEach((varItem) => {\n const card = this.createVarCard(varItem);\n this.contentList.appendChild(card);\n });\n }\n\n private createVarCard(varItem: EnvVariable): HTMLElement {\n const card = document.createElement('div');\n card.className = `lamba-var-card ${varItem.isOverridden ? 'is-overridden' : ''}`;\n\n const isVisible = this.secretVisibilityMap.get(varItem.key) ?? !varItem.isSecret;\n\n card.innerHTML = `\n <div class=\"lamba-var-meta\">\n <div class=\"lamba-var-key\">\n ${varItem.key}\n ${varItem.isOverridden ? '<span class=\"lamba-modified-pill\">MODIFIED</span>' : ''}\n ${varItem.isSecret ? '<span style=\"font-size:10px; color:var(--lamba-warning); font-weight:600;\">SECRET</span>' : ''}\n </div>\n <div class=\"lamba-var-actions\">\n ${\n varItem.isSecret\n ? `<button class=\"lamba-icon-btn toggle-secret-btn\" title=\"${isVisible ? 'Hide secret' : 'Show secret'}\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n ${\n isVisible\n ? '<path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>'\n : '<path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"/><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"/>'\n }\n </svg>\n </button>`\n : ''\n }\n ${\n varItem.isOverridden\n ? `<button class=\"lamba-icon-btn reset-var-btn\" title=\"Reset to default\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"/>\n <path d=\"M3 3v5h5\"/>\n </svg>\n </button>`\n : ''\n }\n </div>\n </div>\n <div class=\"lamba-var-input-group\">\n <input \n type=\"${isVisible ? 'text' : 'password'}\" \n class=\"lamba-input var-input\" \n value=\"${this.escapeHtml(varItem.value)}\" \n placeholder=\"Value...\"\n />\n </div>\n ${\n varItem.isOverridden && varItem.defaultValue\n ? `<div class=\"lamba-diff\">Original default: <span class=\"lamba-diff-val\">${this.escapeHtml(\n varItem.defaultValue\n )}</span></div>`\n : ''\n }\n `;\n\n const inputEl = card.querySelector('.var-input') as HTMLInputElement;\n inputEl.addEventListener('change', () => {\n this.store.setOverride(varItem.key, inputEl.value);\n });\n\n card.querySelector('.toggle-secret-btn')?.addEventListener('click', () => {\n this.secretVisibilityMap.set(varItem.key, !isVisible);\n this.render();\n });\n\n card.querySelector('.reset-var-btn')?.addEventListener('click', () => {\n this.store.removeOverride(varItem.key);\n });\n\n return card;\n }\n\n private escapeHtml(str: any): string {\n if (str === null || str === undefined) return '';\n return String(str)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n }\n}\n","import { LambaOptions, EnvChangeListener } from './core/types';\nimport { EnvStore } from './core/store';\nimport { NetworkInterceptor } from './core/network-interceptor';\nimport { createShadowHost } from './ui/shadow-dom';\nimport { LauncherUI } from './ui/launcher';\nimport { ModalUI } from './ui/modal';\n\nexport class LambaManager {\n private store: EnvStore | null = null;\n private launcher: LauncherUI | null = null;\n private modal: ModalUI | null = null;\n private networkInterceptor: NetworkInterceptor | null = null;\n private options: LambaOptions = {};\n private isInitialized: boolean = false;\n\n /**\n * Implicit ES Proxy object where properties like `lamba.env.VITE_API_BASE_URL`\n * return the live active overridden value automatically.\n */\n public env: Record<string, string>;\n\n constructor() {\n const self = this;\n\n // Create implicit Proxy for lamba.env\n this.env = new Proxy({}, {\n get(_target, prop: string) {\n if (typeof prop === 'string') {\n return self.get(prop);\n }\n return undefined;\n },\n set(_target, prop: string, value: string) {\n if (typeof prop === 'string') {\n self.set(prop, String(value));\n return true;\n }\n return false;\n }\n });\n }\n\n /**\n * Wraps any environment object (such as `import.meta.env` or `process.env`)\n * in a dynamic proxy that implicitly resolves live overrides from lamba.\n */\n public wrap<T extends object>(targetEnv: T): T {\n if (!this.store) {\n this.init();\n }\n\n if (targetEnv && typeof targetEnv === 'object' && this.store) {\n try {\n const defaultObj: Record<string, string> = {};\n for (const [k, v] of Object.entries(targetEnv)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n defaultObj[k] = String(v);\n }\n }\n if (Object.keys(defaultObj).length > 0) {\n this.store.mergeDefaults(defaultObj);\n }\n } catch (e) {\n // Ignore un-enumerable or restricted environment targets\n }\n }\n\n const self = this;\n return new Proxy(targetEnv, {\n get(target, prop: string | symbol) {\n if (typeof prop === 'string') {\n const overrideVal = self.get(prop);\n if (overrideVal !== undefined && overrideVal !== '') {\n return overrideVal;\n }\n }\n return Reflect.get(target, prop);\n }\n });\n }\n\n /**\n * Initializes lamba with custom options and mounts the floating UI.\n */\n public init(options: LambaOptions = {}): this {\n if (typeof window === 'undefined') return this;\n if (this.isInitialized) return this;\n\n this.options = {\n enabled: true,\n position: 'bottom-right',\n autoFetchEnvFile: false,\n interceptNetworkRequests: true,\n ...options,\n };\n\n\n if (this.options.enabled === false) return this;\n\n // 1. Initialize Store\n this.store = new EnvStore(this.options);\n\n // 2. Initialize Network Interceptor if enabled\n if (this.options.interceptNetworkRequests !== false) {\n this.networkInterceptor = new NetworkInterceptor(this.store);\n this.networkInterceptor.enable();\n }\n\n // 3. Mount UI in Shadow DOM\n const mountUI = () => {\n if (this.launcher || !this.store) return;\n\n const { shadowRoot } = createShadowHost();\n\n this.modal = new ModalUI(shadowRoot, this.store, () => {\n // Modal closed callback\n });\n\n this.launcher = new LauncherUI(shadowRoot, this.options.position, () => {\n this.modal?.toggle();\n });\n\n // Sync badge count with initial store overrides count\n const initialOverridesCount = Object.keys(this.store.getOverrides()).length;\n this.launcher.updateBadgeCount(initialOverridesCount);\n\n // Subscribe launcher badge to store changes\n this.store.subscribeStoreChange(() => {\n const count = Object.keys(this.store!.getOverrides()).length;\n this.launcher?.updateBadgeCount(count);\n });\n };\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', mountUI);\n } else {\n mountUI();\n }\n\n this.isInitialized = true;\n return this;\n }\n\n /**\n * Gets the active value of an environment variable (returns overridden value if active, otherwise default).\n */\n public get(key: string, fallback?: string): string {\n if (!this.store) {\n // Lazy init store if called before explicit init\n this.init();\n }\n return this.store?.get(key, fallback) ?? fallback ?? '';\n }\n\n /**\n * Overrides an environment variable live at runtime.\n */\n public set(key: string, value: string): void {\n if (!this.store) this.init();\n this.store?.setOverride(key, value);\n }\n\n /**\n * Removes an override for a specific environment variable key.\n */\n public remove(key: string): void {\n this.store?.removeOverride(key);\n }\n\n /**\n * Resets all environment variable overrides.\n */\n public reset(): void {\n this.store?.resetAllOverrides();\n }\n\n /**\n * Subscribes to environment variable changes.\n */\n public onChange(listener: EnvChangeListener): () => void {\n if (!this.store) this.init();\n return this.store?.subscribeEnvChange(listener) ?? (() => {});\n }\n\n /**\n * Programmatically opens the lamba floating modal.\n */\n public open(): void {\n this.modal?.open();\n }\n\n /**\n * Programmatically closes the lamba floating modal.\n */\n public close(): void {\n this.modal?.close();\n }\n\n /**\n * Programmatically toggles the lamba floating modal.\n */\n public toggle(): void {\n this.modal?.toggle();\n }\n}\n\n// Global Singleton Instance\nexport const lamba = new LambaManager();\n\n// Auto-initialize when included as a CDN script tag with explicit data attribute\nif (typeof window !== 'undefined') {\n (window as any).lamba = lamba;\n\n const currentScript = document.currentScript as HTMLScriptElement | null;\n if (currentScript && (currentScript.hasAttribute('data-lamba-auto') || currentScript.hasAttribute('data-auto-init'))) {\n lamba.init();\n }\n}\n\nexport default lamba;\nexport * from './core/types';\nexport { parseEnvString, stringifyEnv } from './core/env-parser';\n"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","names":[]}
package/dist/lamba.min.js CHANGED
@@ -1,8 +1,8 @@
1
- "use strict";var lamba=(()=>{var O=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var q=Object.prototype.hasOwnProperty;var j=(s,e)=>{for(var r in e)O(s,r,{get:e[r],enumerable:!0})},F=(s,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of B(e))!q.call(s,a)&&a!==r&&O(s,a,{get:()=>e[a],enumerable:!(t=_(e,a))||t.enumerable});return s};var U=s=>F(O({},"__esModule",{value:!0}),s);var D={};j(D,{LambaManager:()=>S,default:()=>z,lamba:()=>L,parseEnvString:()=>u,stringifyEnv:()=>f});var R="__lamba_presets__",P="__lamba_active_preset__",g=class{constructor(){this.presets=[];this.activePresetId=null;this.loadFromStorage()}loadFromStorage(){if(!(typeof localStorage>"u"))try{let e=localStorage.getItem(R);e&&(this.presets=JSON.parse(e)),this.activePresetId=localStorage.getItem(P)}catch(e){console.warn("[lamba] Failed to parse presets from localStorage",e)}}saveToStorage(){if(!(typeof localStorage>"u"))try{localStorage.setItem(R,JSON.stringify(this.presets)),this.activePresetId?localStorage.setItem(P,this.activePresetId):localStorage.removeItem(P)}catch(e){console.warn("[lamba] Failed to save presets to localStorage",e)}}getPresets(){return[...this.presets]}getActivePresetId(){return this.activePresetId}createPreset(e,r){let t={id:"preset_"+Math.random().toString(36).substring(2,9),name:e.trim()||"Untitled Preset",overrides:{...r},createdAt:Date.now()};return this.presets.push(t),this.saveToStorage(),t}deletePreset(e){this.presets=this.presets.filter(r=>r.id!==e),this.activePresetId===e&&(this.activePresetId=null),this.saveToStorage()}setActivePreset(e){if(!e)return this.activePresetId=null,this.saveToStorage(),null;let r=this.presets.find(t=>t.id===e);return r?(this.activePresetId=e,this.saveToStorage(),r):null}};function u(s){let e={},r=s.split(`
2
- `);for(let t of r){if(t=t.trim(),!t||t.startsWith("#"))continue;t.startsWith("export ")&&(t=t.slice(7).trim());let a=t.indexOf("=");if(a===-1)continue;let i=t.slice(0,a).trim(),n=t.slice(a+1).trim();(n.startsWith('"')&&n.endsWith('"')||n.startsWith("'")&&n.endsWith("'"))&&(n=n.slice(1,-1)),n=n.replace(/\\n/g,`
3
- `),i&&(e[i]=n)}return e}function f(s){return Object.entries(s).map(([e,r])=>{let a=r.includes(" ")||r.includes(`
4
- `)||r.includes("#")?`"${r.replace(/"/g,'\\"')}"`:r;return`${e}=${a}`}).join(`
5
- `)}function M(){let s={};if(typeof window>"u")return s;try{let e=window.process;if(e&&e.env&&typeof e.env=="object")for(let[r,t]of Object.entries(e.env))(typeof t=="string"||typeof t=="number"||typeof t=="boolean")&&(s[r]=String(t))}catch{}try{let e=window.__ENV__||window.ENV;if(e&&typeof e=="object")for(let[r,t]of Object.entries(e))(typeof t=="string"||typeof t=="number"||typeof t=="boolean")&&(s[r]=String(t))}catch{}try{document.querySelectorAll("meta").forEach(r=>{let t=r.getAttribute("name"),a=r.getAttribute("content");if(!(!t||a===null))if(t.startsWith("env:")){let i=t.slice(4);s[i]=a}else t==="lamba-env"&&new URLSearchParams(a).forEach((n,l)=>{s[l]=n})})}catch{}return s}async function T(){let s=["/.env","/.env.local","/.env.example"];for(let e of s)try{let r=await fetch(e,{headers:{Accept:"text/plain"}});if(r.ok){let t=await r.text();if(t&&t.includes("="))return u(t)}}catch{}return{}}var H="__lamba_overrides__",N=/(KEY|SECRET|TOKEN|PASSWORD|AUTH|PRIVATE|CREDENTIAL|SIGNATURE)/i,x=class{constructor(e={}){this.variables=new Map;this.overrides={};this.envChangeListeners=new Set;this.storeChangeListeners=new Set;this.secretPattern=e.secretKeysPattern||N,this.presetManager=new g,this.loadOverridesFromStorage(),e.env&&this.mergeDefaults(e.env);let r=M();this.mergeDefaults(r),e.autoFetchEnvFile===!0&&typeof window<"u"&&T().then(t=>{Object.keys(t).length>0&&this.mergeDefaults(t)}),this.patchProcessEnv()}loadOverridesFromStorage(){if(!(typeof localStorage>"u"))try{let e=localStorage.getItem(H);e&&(this.overrides=JSON.parse(e))}catch(e){console.warn("[lamba] Failed to parse overrides from localStorage",e)}}saveOverridesToStorage(){if(!(typeof localStorage>"u"))try{localStorage.setItem(H,JSON.stringify(this.overrides))}catch(e){console.warn("[lamba] Failed to save overrides to localStorage",e)}}patchProcessEnv(){if(typeof window>"u")return;let e=window;e.process?e.process.env||(e.process.env={}):e.process={env:{}};let r=this,t=e.process.env;try{e.process.env=new Proxy(t,{get(a,i){if(typeof i=="string"){let n=r.get(i);if(n!==void 0)return n}return a[i]},set(a,i,n){return a[i]=n,!0}})}catch{}}mergeDefaults(e){let r=!1;for(let[t,a]of Object.entries(e)){let i=t in this.overrides,n=i?this.overrides[t]:a,l=this.secretPattern.test(t),c=this.variables.get(t);c?c.defaultValue!==a&&(c.defaultValue=a,c.isOverridden||(c.value=a),r=!0):(this.variables.set(t,{key:t,value:n,defaultValue:a,isOverridden:i,isSecret:l}),r=!0)}r&&this.notifyStoreChanged()}get(e,r){if(e in this.overrides)return this.overrides[e];let t=this.variables.get(e);return t?t.value:r}getAll(){let e={};return this.variables.forEach((r,t)=>{e[t]={...r}}),e}getOverrides(){return{...this.overrides}}setOverride(e,r){let t=e.trim();if(!t)return;this.overrides[t]=r,this.saveOverridesToStorage();let a=this.variables.get(t);a?(a.value=r,a.isOverridden=!0):(a={key:t,value:r,defaultValue:"",isOverridden:!0,isSecret:this.secretPattern.test(t)},this.variables.set(t,a)),this.emitEnvChange(t,r,!0),this.notifyStoreChanged()}removeOverride(e){if(e in this.overrides){delete this.overrides[e],this.saveOverridesToStorage();let r=this.variables.get(e);r&&(r.value=r.defaultValue,r.isOverridden=!1,this.emitEnvChange(e,r.value,!1)),this.notifyStoreChanged()}}resetAllOverrides(){let e=Object.keys(this.overrides);this.overrides={},this.saveOverridesToStorage(),this.presetManager.setActivePreset(null),e.forEach(r=>{let t=this.variables.get(r);t&&(t.value=t.defaultValue,t.isOverridden=!1,this.emitEnvChange(r,t.value,!1))}),this.notifyStoreChanged()}applyPreset(e){let r=this.presetManager.setActivePreset(e);if(this.overrides=r?{...r.overrides}:{},this.saveOverridesToStorage(),this.variables.forEach((t,a)=>{a in this.overrides?(t.value=this.overrides[a],t.isOverridden=!0):(t.value=t.defaultValue,t.isOverridden=!1),this.emitEnvChange(a,t.value,t.isOverridden)}),r)for(let[t,a]of Object.entries(r.overrides))this.variables.has(t)||(this.variables.set(t,{key:t,value:a,defaultValue:"",isOverridden:!0,isSecret:this.secretPattern.test(t)}),this.emitEnvChange(t,a,!0));this.notifyStoreChanged()}subscribeEnvChange(e){return this.envChangeListeners.add(e),()=>this.envChangeListeners.delete(e)}subscribeStoreChange(e){return this.storeChangeListeners.add(e),()=>this.storeChangeListeners.delete(e)}emitEnvChange(e,r,t){this.envChangeListeners.forEach(a=>a(e,r,t)),typeof window<"u"&&window.dispatchEvent(new CustomEvent("lamba:env-change",{detail:{key:e,value:r,isOverridden:t}}))}notifyStoreChanged(){let e=this.getAll(),r=this.presetManager.getPresets(),t=this.presetManager.getActivePresetId();this.storeChangeListeners.forEach(a=>a(e,r,t))}};var y=class{constructor(e){this.originalFetch=null;this.originalXHRPost=null;this.isIntercepting=!1;this.store=e}enable(){typeof window>"u"||this.isIntercepting||(this.patchFetch(),this.patchXHR(),this.isIntercepting=!0)}disable(){typeof window>"u"||!this.isIntercepting||(this.originalFetch&&(window.fetch=this.originalFetch,this.originalFetch=null),this.originalXHRPost&&(XMLHttpRequest.prototype.open=this.originalXHRPost,this.originalXHRPost=null),this.isIntercepting=!1)}rewriteUrl(e){if(typeof e!="string")return e;let r=this.store.getAll(),t=e;for(let a of Object.values(r))if(a.isOverridden&&a.defaultValue&&a.value){let i=a.defaultValue.replace(/\/+$/,""),n=a.value.replace(/\/+$/,"");i&&t.includes(i)&&(t=t.replace(i,n))}return t}patchFetch(){if(!window.fetch)return;this.originalFetch=window.fetch;let e=this;window.fetch=function(r,t){let a=r;if(typeof r=="string")a=e.rewriteUrl(r);else if(r instanceof URL){let i=e.rewriteUrl(r.toString());a=new URL(i)}else if(r instanceof Request){let i=e.rewriteUrl(r.url);i!==r.url&&(a=new Request(i,r))}return e.originalFetch.call(this,a,t)}}patchXHR(){if(!window.XMLHttpRequest)return;this.originalXHRPost=XMLHttpRequest.prototype.open;let e=this;XMLHttpRequest.prototype.open=function(r,t,a=!0,i,n){let l=typeof t=="string"?t:t.toString(),c=e.rewriteUrl(l);return e.originalXHRPost.call(this,r,c,a,i??null,n??null)}}};var A=`
1
+ "use strict";var lamba=(()=>{var C=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var U=Object.prototype.hasOwnProperty;var j=(s,e)=>{for(var t in e)C(s,t,{get:e[t],enumerable:!0})},q=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of B(e))!U.call(s,a)&&a!==t&&C(s,a,{get:()=>e[a],enumerable:!(r=V(e,a))||r.enumerable});return s};var N=s=>q(C({},"__esModule",{value:!0}),s);var z={};j(z,{LambaManager:()=>S,default:()=>D,lamba:()=>L,parseEnvString:()=>v,stringifyEnv:()=>f});var R="__lamba_presets__",O="__lamba_active_preset__",g=class{constructor(){this.presets=[];this.activePresetId=null;this.loadFromStorage()}loadFromStorage(){if(!(typeof localStorage>"u"))try{let e=localStorage.getItem(R);e&&(this.presets=JSON.parse(e)),this.activePresetId=localStorage.getItem(O)}catch(e){console.warn("[lamba] Failed to parse presets from localStorage",e)}}saveToStorage(){if(!(typeof localStorage>"u"))try{localStorage.setItem(R,JSON.stringify(this.presets)),this.activePresetId?localStorage.setItem(O,this.activePresetId):localStorage.removeItem(O)}catch(e){console.warn("[lamba] Failed to save presets to localStorage",e)}}getPresets(){return[...this.presets]}getActivePresetId(){return this.activePresetId}createPreset(e,t){let r={id:"preset_"+Math.random().toString(36).substring(2,9),name:e.trim()||"Untitled Preset",overrides:{...t},createdAt:Date.now()};return this.presets.push(r),this.saveToStorage(),r}deletePreset(e){this.presets=this.presets.filter(t=>t.id!==e),this.activePresetId===e&&(this.activePresetId=null),this.saveToStorage()}setActivePreset(e){if(!e)return this.activePresetId=null,this.saveToStorage(),null;let t=this.presets.find(r=>r.id===e);return t?(this.activePresetId=e,this.saveToStorage(),t):null}};function v(s){let e={},t=s.split(`
2
+ `);for(let r of t){if(r=r.trim(),!r||r.startsWith("#"))continue;r.startsWith("export ")&&(r=r.slice(7).trim());let a=r.indexOf("=");if(a===-1)continue;let i=r.slice(0,a).trim(),n=r.slice(a+1).trim();(n.startsWith('"')&&n.endsWith('"')||n.startsWith("'")&&n.endsWith("'"))&&(n=n.slice(1,-1)),n=n.replace(/\\n/g,`
3
+ `),i&&(e[i]=n)}return e}function f(s){return Object.entries(s).map(([e,t])=>{let a=t.includes(" ")||t.includes(`
4
+ `)||t.includes("#")?`"${t.replace(/"/g,'\\"')}"`:t;return`${e}=${a}`}).join(`
5
+ `)}function T(){let s={};if(typeof window>"u")return s;let e=t=>{if(!(!t||typeof t!="object"))for(let[r,a]of Object.entries(t))(typeof a=="string"||typeof a=="number"||typeof a=="boolean")&&(s[r]=String(a))};try{let t=window.process;t&&t.env&&typeof t.env=="object"&&e(t.env)}catch{}try{let t=window.__NEXT_DATA__;t&&(t.env&&e(t.env),t.runtimeConfig?.public&&e(t.runtimeConfig.public))}catch{}try{let t=window.__NUXT__;t?.config?.public&&e(t.config.public)}catch{}try{let t=window,r=t.__ENV__||t.ENV||t.PUBLIC_ENV||t.__LAMBA_ENV__;r&&e(r)}catch{}try{document.querySelectorAll("meta").forEach(r=>{let a=r.getAttribute("name"),i=r.getAttribute("content");if(!(!a||i===null))if(a.startsWith("env:")){let n=a.slice(4);s[n]=i}else a==="lamba-env"&&new URLSearchParams(i).forEach((l,d)=>{s[d]=l})})}catch{}return s}async function M(){let s=["/.env","/.env.local","/.env.example"];for(let e of s)try{let t=await fetch(e,{headers:{Accept:"text/plain"}});if(t.ok){let r=await t.text();if(r&&r.includes("="))return v(r)}}catch{}return{}}var A="__lamba_overrides__",F=/(KEY|SECRET|TOKEN|PASSWORD|AUTH|PRIVATE|CREDENTIAL|SIGNATURE)/i,x=class{constructor(e={}){this.variables=new Map;this.overrides={};this.envChangeListeners=new Set;this.storeChangeListeners=new Set;this.secretPattern=e.secretKeysPattern||F,this.allowedPrefixes=e.allowedPrefixes,this.presetManager=new g,this.loadOverridesFromStorage(),e.env&&this.mergeDefaults(e.env);let t=T();this.mergeDefaults(t),e.autoFetchEnvFile===!0&&typeof window<"u"&&M().then(r=>{Object.keys(r).length>0&&this.mergeDefaults(r)}),this.patchProcessEnv()}loadOverridesFromStorage(){if(!(typeof localStorage>"u"))try{let e=localStorage.getItem(A);e&&(this.overrides=JSON.parse(e))}catch(e){console.warn("[lamba] Failed to parse overrides from localStorage",e)}}saveOverridesToStorage(){if(!(typeof localStorage>"u"))try{localStorage.setItem(A,JSON.stringify(this.overrides))}catch(e){console.warn("[lamba] Failed to save overrides to localStorage",e)}}patchProcessEnv(){if(typeof window>"u")return;let e=window;e.process?e.process.env||(e.process.env={}):e.process={env:{}};let t=this,r=e.process.env;try{e.process.env=new Proxy(r,{get(a,i){if(typeof i=="string"){let n=t.get(i);if(n!==void 0)return n}return a[i]},set(a,i,n){return a[i]=n,!0}})}catch{}}isAllowedKey(e){return this.allowedPrefixes?typeof this.allowedPrefixes=="string"?e.startsWith(this.allowedPrefixes):Array.isArray(this.allowedPrefixes)?this.allowedPrefixes.length===0?!0:this.allowedPrefixes.some(t=>e.startsWith(t)):this.allowedPrefixes instanceof RegExp?this.allowedPrefixes.test(e):!0:!0}mergeDefaults(e){let t=!1;for(let[r,a]of Object.entries(e)){if(!this.isAllowedKey(r))continue;let i=a!=null?String(a):"",n=r in this.overrides,l=n?String(this.overrides[r]??""):i,d=this.secretPattern.test(r),c=this.variables.get(r);c?c.defaultValue!==i&&(c.defaultValue=i,c.isOverridden||(c.value=i),t=!0):(this.variables.set(r,{key:r,value:l,defaultValue:i,isOverridden:n,isSecret:d}),t=!0)}t&&this.notifyStoreChanged()}get(e,t){if(e in this.overrides)return this.overrides[e];let r=this.variables.get(e);return r?r.value:t}getAll(){let e={};return this.variables.forEach((t,r)=>{e[r]={...t}}),e}getOverrides(){return{...this.overrides}}setOverride(e,t){let r=e.trim();if(!r)return;this.overrides[r]=t,this.saveOverridesToStorage();let a=this.variables.get(r);a?(a.value=t,a.isOverridden=!0):(a={key:r,value:t,defaultValue:"",isOverridden:!0,isSecret:this.secretPattern.test(r)},this.variables.set(r,a)),this.emitEnvChange(r,t,!0),this.notifyStoreChanged()}removeOverride(e){if(e in this.overrides){delete this.overrides[e],this.saveOverridesToStorage();let t=this.variables.get(e);t&&(t.value=t.defaultValue,t.isOverridden=!1,this.emitEnvChange(e,t.value,!1)),this.notifyStoreChanged()}}resetAllOverrides(){let e=Object.keys(this.overrides);this.overrides={},this.saveOverridesToStorage(),this.presetManager.setActivePreset(null),e.forEach(t=>{let r=this.variables.get(t);r&&(r.value=r.defaultValue,r.isOverridden=!1,this.emitEnvChange(t,r.value,!1))}),this.notifyStoreChanged()}applyPreset(e){let t=this.presetManager.setActivePreset(e);if(this.overrides=t?{...t.overrides}:{},this.saveOverridesToStorage(),this.variables.forEach((r,a)=>{a in this.overrides?(r.value=this.overrides[a],r.isOverridden=!0):(r.value=r.defaultValue,r.isOverridden=!1),this.emitEnvChange(a,r.value,r.isOverridden)}),t)for(let[r,a]of Object.entries(t.overrides))this.variables.has(r)||(this.variables.set(r,{key:r,value:a,defaultValue:"",isOverridden:!0,isSecret:this.secretPattern.test(r)}),this.emitEnvChange(r,a,!0));this.notifyStoreChanged()}subscribeEnvChange(e){return this.envChangeListeners.add(e),()=>this.envChangeListeners.delete(e)}subscribeStoreChange(e){return this.storeChangeListeners.add(e),()=>this.storeChangeListeners.delete(e)}emitEnvChange(e,t,r){this.envChangeListeners.forEach(a=>a(e,t,r)),typeof window<"u"&&window.dispatchEvent(new CustomEvent("lamba:env-change",{detail:{key:e,value:t,isOverridden:r}}))}notifyStoreChanged(){let e=this.getAll(),t=this.presetManager.getPresets(),r=this.presetManager.getActivePresetId();this.storeChangeListeners.forEach(a=>a(e,t,r))}};var y=class{constructor(e){this.originalFetch=null;this.originalXHRPost=null;this.isIntercepting=!1;this.store=e}enable(){typeof window>"u"||this.isIntercepting||(this.patchFetch(),this.patchXHR(),this.isIntercepting=!0)}disable(){typeof window>"u"||!this.isIntercepting||(this.originalFetch&&(window.fetch=this.originalFetch,this.originalFetch=null),this.originalXHRPost&&(XMLHttpRequest.prototype.open=this.originalXHRPost,this.originalXHRPost=null),this.isIntercepting=!1)}rewriteUrl(e){if(typeof e!="string")return e;let t=this.store.getAll(),r=e;for(let a of Object.values(t))if(a.isOverridden&&a.defaultValue!==void 0&&a.value!==void 0){let i=String(a.defaultValue??""),n=String(a.value??"");if(!i||!n)continue;let l=i.replace(/\/+$/,""),d=n.replace(/\/+$/,"");l&&r.includes(l)&&(r=r.replace(l,d))}return r}patchFetch(){if(!window.fetch)return;this.originalFetch=window.fetch;let e=this;window.fetch=function(t,r){let a=t;if(typeof t=="string")a=e.rewriteUrl(t);else if(t instanceof URL){let i=e.rewriteUrl(t.toString());a=new URL(i)}else if(t instanceof Request){let i=e.rewriteUrl(t.url);i!==t.url&&(a=new Request(i,t))}return e.originalFetch.call(this,a,r)}}patchXHR(){if(!window.XMLHttpRequest)return;this.originalXHRPost=XMLHttpRequest.prototype.open;let e=this;XMLHttpRequest.prototype.open=function(t,r,a=!0,i,n){let l=typeof r=="string"?r:r.toString(),d=e.rewriteUrl(l);return e.originalXHRPost.call(this,t,d,a,i??null,n??null)}}};var _=`
6
6
  :host {
7
7
  --lamba-bg-main: #0f172a;
8
8
  --lamba-bg-card: #1e293b;
@@ -465,12 +465,12 @@
465
465
  .lamba-btn-danger:hover {
466
466
  background: rgba(239, 68, 68, 0.3);
467
467
  }
468
- `;function I(){if(typeof document>"u")throw new Error("[lamba] Document object not available.");let s=document.getElementById("lamba-root");s||(s=document.createElement("lamba-widget"),s.id="lamba-root",document.body.appendChild(s));let e=s.shadowRoot;if(!e){e=s.attachShadow({mode:"open"});let r=document.createElement("style");r.textContent=A,e.appendChild(r)}return{host:s,shadowRoot:e}}var w=class{constructor(e,r="bottom-right",t){this.onClickCallback=t,this.element=document.createElement("div"),this.element.className=`lamba-launcher lamba-launcher-${r}`,this.element.title="Open lamba Environment Controls",this.element.innerHTML=`
468
+ `;function H(){if(typeof document>"u")throw new Error("[lamba] Document object not available.");let s=document.getElementById("lamba-root");s||(s=document.createElement("lamba-widget"),s.id="lamba-root",document.body.appendChild(s));let e=s.shadowRoot;if(!e){e=s.attachShadow({mode:"open"});let t=document.createElement("style");t.textContent=_,e.appendChild(t)}return{host:s,shadowRoot:e}}var w=class{constructor(e,t="bottom-right",r){this.onClickCallback=r,this.element=document.createElement("div"),this.element.className=`lamba-launcher lamba-launcher-${t}`,this.element.title="Open lamba Environment Controls",this.element.innerHTML=`
469
469
  <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
470
470
  <path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"/>
471
471
  <circle cx="12" cy="12" r="3"/>
472
472
  </svg>
473
- `,this.badgeElement=document.createElement("div"),this.badgeElement.className="lamba-badge",this.badgeElement.style.display="none",this.element.appendChild(this.badgeElement),this.element.addEventListener("click",()=>this.onClickCallback()),e.appendChild(this.element)}updateBadgeCount(e){e>0?(this.badgeElement.textContent=String(e),this.badgeElement.style.display="flex"):this.badgeElement.style.display="none"}setVisible(e){this.element.style.display=e?"flex":"none"}};var E=class{constructor(e,r,t){this.activeTab="all";this.searchQuery="";this.secretVisibilityMap=new Map;this.isOpen=!1;this.store=r,this.overlay=document.createElement("div"),this.overlay.className="lamba-overlay",this.modal=document.createElement("div"),this.modal.className="lamba-modal";let a=document.createElement("div");a.className="lamba-header",a.innerHTML=`
473
+ `,this.badgeElement=document.createElement("div"),this.badgeElement.className="lamba-badge",this.badgeElement.style.display="none",this.element.appendChild(this.badgeElement),this.element.addEventListener("click",()=>this.onClickCallback()),e.appendChild(this.element)}updateBadgeCount(e){e>0?(this.badgeElement.textContent=String(e),this.badgeElement.style.display="flex"):this.badgeElement.style.display="none"}setVisible(e){this.element.style.display=e?"flex":"none"}};var E=class{constructor(e,t,r){this.activeTab="all";this.searchQuery="";this.secretVisibilityMap=new Map;this.isOpen=!1;this.store=t,this.overlay=document.createElement("div"),this.overlay.className="lamba-overlay",this.modal=document.createElement("div"),this.modal.className="lamba-modal";let a=document.createElement("div");a.className="lamba-header",a.innerHTML=`
474
474
  <div class="lamba-brand">
475
475
  <div class="lamba-logo">
476
476
  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5">
@@ -486,7 +486,7 @@
486
486
  <line x1="6" y1="6" x2="18" y2="18"></line>
487
487
  </svg>
488
488
  </button>
489
- `,a.querySelector(".lamba-close-btn")?.addEventListener("click",()=>{this.close(),t()});let i=document.createElement("div");i.className="lamba-controls";let n=document.createElement("div");n.className="lamba-search-box",n.innerHTML=`
489
+ `,a.querySelector(".lamba-close-btn")?.addEventListener("click",()=>{this.close(),r()});let i=document.createElement("div");i.className="lamba-controls";let n=document.createElement("div");n.className="lamba-search-box",n.innerHTML=`
490
490
  <svg class="lamba-search-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
491
491
  <circle cx="11" cy="11" r="8"></circle>
492
492
  <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
@@ -496,7 +496,7 @@
496
496
  <button class="lamba-tab active" data-tab="all">All</button>
497
497
  <button class="lamba-tab" data-tab="overridden">Modified</button>
498
498
  <button class="lamba-tab" data-tab="secrets">Secrets</button>
499
- `,this.tabAllBtn=l.querySelector('[data-tab="all"]'),this.tabOverriddenBtn=l.querySelector('[data-tab="overridden"]'),this.tabSecretsBtn=l.querySelector('[data-tab="secrets"]'),l.querySelectorAll(".lamba-tab").forEach(o=>{o.addEventListener("click",d=>{l.querySelectorAll(".lamba-tab").forEach(h=>h.classList.remove("active"));let b=d.currentTarget;b.classList.add("active"),this.activeTab=b.getAttribute("data-tab"),this.render()})}),i.appendChild(n),i.appendChild(l);let c=document.createElement("div");c.className="lamba-presets-bar",c.innerHTML=`
499
+ `,this.tabAllBtn=l.querySelector('[data-tab="all"]'),this.tabOverriddenBtn=l.querySelector('[data-tab="overridden"]'),this.tabSecretsBtn=l.querySelector('[data-tab="secrets"]'),l.querySelectorAll(".lamba-tab").forEach(o=>{o.addEventListener("click",p=>{l.querySelectorAll(".lamba-tab").forEach(h=>h.classList.remove("active"));let b=p.currentTarget;b.classList.add("active"),this.activeTab=b.getAttribute("data-tab"),this.render()})}),i.appendChild(n),i.appendChild(l);let d=document.createElement("div");d.className="lamba-presets-bar",d.innerHTML=`
500
500
  <div class="lamba-preset-selector">
501
501
  <span style="color: var(--lamba-text-secondary); font-weight: 600;">Preset Profile:</span>
502
502
  <select class="lamba-select lamba-preset-dropdown">
@@ -511,7 +511,7 @@
511
511
  </svg>
512
512
  Save as Preset
513
513
  </button>
514
- `,this.presetSelect=c.querySelector(".lamba-preset-dropdown"),this.presetSelect.addEventListener("change",()=>{let o=this.presetSelect.value||null;this.store.applyPreset(o)}),this.savePresetBtn=c.querySelector(".lamba-save-preset-btn"),this.savePresetBtn.addEventListener("click",()=>{let o=prompt("Enter a name for this Environment Preset Profile:","Staging Environment");if(o){let d=this.store.getOverrides();this.store.presetManager.createPreset(o,d),this.updatePresetDropdown()}}),this.contentList=document.createElement("div"),this.contentList.className="lamba-content";let p=document.createElement("div");p.className="lamba-footer",p.innerHTML=`
514
+ `,this.presetSelect=d.querySelector(".lamba-preset-dropdown"),this.presetSelect.addEventListener("change",()=>{let o=this.presetSelect.value||null;this.store.applyPreset(o)}),this.savePresetBtn=d.querySelector(".lamba-save-preset-btn"),this.savePresetBtn.addEventListener("click",()=>{let o=prompt("Enter a name for this Environment Preset Profile:","Staging Environment");if(o){let p=this.store.getOverrides();this.store.presetManager.createPreset(o,p),this.updatePresetDropdown()}}),this.contentList=document.createElement("div"),this.contentList.className="lamba-content";let c=document.createElement("div");c.className="lamba-footer",c.innerHTML=`
515
515
  <div style="display: flex; gap: 8px;">
516
516
  <button class="lamba-btn lamba-add-var-btn">
517
517
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
@@ -527,7 +527,7 @@
527
527
  <button class="lamba-btn lamba-btn-danger lamba-reset-all-btn">Reset All</button>
528
528
  <button class="lamba-btn lamba-btn-primary lamba-reload-btn">Reload Page</button>
529
529
  </div>
530
- `,p.querySelector(".lamba-add-var-btn")?.addEventListener("click",()=>{let o=prompt("Enter new environment variable key name (e.g. VITE_API_URL):");if(o){let d=prompt(`Enter value for ${o}:`)||"";this.store.setOverride(o,d)}}),p.querySelector(".lamba-import-btn")?.addEventListener("click",()=>{let o=document.createElement("input");o.type="file",o.accept=".env,.txt",o.onchange=d=>{let b=d.target.files[0];if(b){let h=new FileReader;h.onload=m=>{let v=m.target?.result;if(v){let k=u(v);for(let[C,V]of Object.entries(k))this.store.setOverride(C,V)}},h.readAsText(b)}},o.click()}),p.querySelector(".lamba-export-btn")?.addEventListener("click",()=>{let o=this.store.getAll(),d={};for(let[k,C]of Object.entries(o))d[k]=C.value;let b=f(d),h=new Blob([b],{type:"text/plain"}),m=URL.createObjectURL(h),v=document.createElement("a");v.href=m,v.download=".env",v.click(),URL.revokeObjectURL(m)}),p.querySelector(".lamba-reset-all-btn")?.addEventListener("click",()=>{confirm("Are you sure you want to reset all overridden environment variables?")&&this.store.resetAllOverrides()}),p.querySelector(".lamba-reload-btn")?.addEventListener("click",()=>{window.location.reload()}),this.modal.appendChild(a),this.modal.appendChild(i),this.modal.appendChild(c),this.modal.appendChild(this.contentList),this.modal.appendChild(p),this.overlay.appendChild(this.modal),this.overlay.addEventListener("click",o=>{o.target===this.overlay&&(this.close(),t())}),e.appendChild(this.overlay),this.store.subscribeStoreChange(()=>{this.isOpen&&(this.updatePresetDropdown(),this.render())})}open(){this.isOpen=!0,this.updatePresetDropdown(),this.render(),this.overlay.classList.add("active")}close(){this.isOpen=!1,this.overlay.classList.remove("active")}toggle(){this.isOpen?this.close():this.open()}updatePresetDropdown(){let e=this.store.presetManager.getPresets(),r=this.store.presetManager.getActivePresetId();this.presetSelect.innerHTML='<option value="">Default (Custom Overrides)</option>',e.forEach(t=>{let a=document.createElement("option");a.value=t.id,a.textContent=t.name,t.id===r&&(a.selected=!0),this.presetSelect.appendChild(a)})}render(){let e=this.store.getAll(),r=Object.values(e);if(this.activeTab==="overridden"?r=r.filter(t=>t.isOverridden):this.activeTab==="secrets"&&(r=r.filter(t=>t.isSecret)),this.searchQuery&&(r=r.filter(t=>t.key.toLowerCase().includes(this.searchQuery)||t.value.toLowerCase().includes(this.searchQuery))),r.sort((t,a)=>t.isOverridden!==a.isOverridden?t.isOverridden?-1:1:t.key.localeCompare(a.key)),this.contentList.innerHTML="",r.length===0){let t=document.createElement("div");t.className="lamba-empty",t.textContent=this.searchQuery||this.activeTab!=="all"?"No environment variables match your current filter.":'No environment variables found or registered. Click "+ Add Variable" or "Import .env" to get started.',this.contentList.appendChild(t);return}r.forEach(t=>{let a=this.createVarCard(t);this.contentList.appendChild(a)})}createVarCard(e){let r=document.createElement("div");r.className=`lamba-var-card ${e.isOverridden?"is-overridden":""}`;let t=this.secretVisibilityMap.get(e.key)??!e.isSecret;r.innerHTML=`
530
+ `,c.querySelector(".lamba-add-var-btn")?.addEventListener("click",()=>{let o=prompt("Enter new environment variable key name (e.g. API_URL, NEXT_PUBLIC_API_URL, REACT_APP_API_URL, VITE_API_URL):");if(o){let p=prompt(`Enter value for ${o}:`)||"";this.store.setOverride(o,p)}}),c.querySelector(".lamba-import-btn")?.addEventListener("click",()=>{let o=document.createElement("input");o.type="file",o.accept=".env,.txt",o.onchange=p=>{let b=p.target.files[0];if(b){let h=new FileReader;h.onload=m=>{let u=m.target?.result;if(u){let k=v(u);for(let[P,I]of Object.entries(k))this.store.setOverride(P,I)}},h.readAsText(b)}},o.click()}),c.querySelector(".lamba-export-btn")?.addEventListener("click",()=>{let o=this.store.getAll(),p={};for(let[k,P]of Object.entries(o))p[k]=P.value;let b=f(p),h=new Blob([b],{type:"text/plain"}),m=URL.createObjectURL(h),u=document.createElement("a");u.href=m,u.download=".env",u.click(),URL.revokeObjectURL(m)}),c.querySelector(".lamba-reset-all-btn")?.addEventListener("click",()=>{confirm("Are you sure you want to reset all overridden environment variables?")&&this.store.resetAllOverrides()}),c.querySelector(".lamba-reload-btn")?.addEventListener("click",()=>{window.location.reload()}),this.modal.appendChild(a),this.modal.appendChild(i),this.modal.appendChild(d),this.modal.appendChild(this.contentList),this.modal.appendChild(c),this.overlay.appendChild(this.modal),this.overlay.addEventListener("click",o=>{o.target===this.overlay&&(this.close(),r())}),e.appendChild(this.overlay),this.store.subscribeStoreChange(()=>{this.isOpen&&(this.updatePresetDropdown(),this.render())})}open(){this.isOpen=!0,this.updatePresetDropdown(),this.render(),this.overlay.classList.add("active")}close(){this.isOpen=!1,this.overlay.classList.remove("active")}toggle(){this.isOpen?this.close():this.open()}updatePresetDropdown(){let e=this.store.presetManager.getPresets(),t=this.store.presetManager.getActivePresetId();this.presetSelect.innerHTML='<option value="">Default (Custom Overrides)</option>',e.forEach(r=>{let a=document.createElement("option");a.value=r.id,a.textContent=r.name,r.id===t&&(a.selected=!0),this.presetSelect.appendChild(a)})}render(){let e=this.store.getAll(),t=Object.values(e);if(this.activeTab==="overridden"?t=t.filter(r=>r.isOverridden):this.activeTab==="secrets"&&(t=t.filter(r=>r.isSecret)),this.searchQuery&&(t=t.filter(r=>r.key.toLowerCase().includes(this.searchQuery)||r.value.toLowerCase().includes(this.searchQuery))),t.sort((r,a)=>r.isOverridden!==a.isOverridden?r.isOverridden?-1:1:r.key.localeCompare(a.key)),this.contentList.innerHTML="",t.length===0){let r=document.createElement("div");r.className="lamba-empty",r.textContent=this.searchQuery||this.activeTab!=="all"?"No environment variables match your current filter.":'No environment variables found or registered. Click "+ Add Variable" or "Import .env" to get started.',this.contentList.appendChild(r);return}t.forEach(r=>{let a=this.createVarCard(r);this.contentList.appendChild(a)})}createVarCard(e){let t=document.createElement("div");t.className=`lamba-var-card ${e.isOverridden?"is-overridden":""}`;let r=this.secretVisibilityMap.get(e.key)??!e.isSecret;t.innerHTML=`
531
531
  <div class="lamba-var-meta">
532
532
  <div class="lamba-var-key">
533
533
  ${e.key}
@@ -535,9 +535,9 @@
535
535
  ${e.isSecret?'<span style="font-size:10px; color:var(--lamba-warning); font-weight:600;">SECRET</span>':""}
536
536
  </div>
537
537
  <div class="lamba-var-actions">
538
- ${e.isSecret?`<button class="lamba-icon-btn toggle-secret-btn" title="${t?"Hide secret":"Show secret"}">
538
+ ${e.isSecret?`<button class="lamba-icon-btn toggle-secret-btn" title="${r?"Hide secret":"Show secret"}">
539
539
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
540
- ${t?'<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/>':'<path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"/><line x1="1" y1="1" x2="23" y2="23"/>'}
540
+ ${r?'<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/>':'<path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"/><line x1="1" y1="1" x2="23" y2="23"/>'}
541
541
  </svg>
542
542
  </button>`:""}
543
543
  ${e.isOverridden?`<button class="lamba-icon-btn reset-var-btn" title="Reset to default">
@@ -550,11 +550,11 @@
550
550
  </div>
551
551
  <div class="lamba-var-input-group">
552
552
  <input
553
- type="${t?"text":"password"}"
553
+ type="${r?"text":"password"}"
554
554
  class="lamba-input var-input"
555
555
  value="${this.escapeHtml(e.value)}"
556
556
  placeholder="Value..."
557
557
  />
558
558
  </div>
559
559
  ${e.isOverridden&&e.defaultValue?`<div class="lamba-diff">Original default: <span class="lamba-diff-val">${this.escapeHtml(e.defaultValue)}</span></div>`:""}
560
- `;let a=r.querySelector(".var-input");return a.addEventListener("change",()=>{this.store.setOverride(e.key,a.value)}),r.querySelector(".toggle-secret-btn")?.addEventListener("click",()=>{this.secretVisibilityMap.set(e.key,!t),this.render()}),r.querySelector(".reset-var-btn")?.addEventListener("click",()=>{this.store.removeOverride(e.key)}),r}escapeHtml(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}};var S=class{constructor(){this.store=null;this.launcher=null;this.modal=null;this.networkInterceptor=null;this.options={};this.isInitialized=!1;let e=this;this.env=new Proxy({},{get(r,t){if(typeof t=="string")return e.get(t)},set(r,t,a){return typeof t=="string"?(e.set(t,String(a)),!0):!1}})}wrap(e){let r=this;return new Proxy(e,{get(t,a){if(typeof a=="string"){let i=r.get(a);if(i!==void 0&&i!=="")return i}return Reflect.get(t,a)}})}init(e={}){if(typeof window>"u")return this;if(this.isInitialized)return this;if(this.options={enabled:!0,position:"bottom-right",autoFetchEnvFile:!1,interceptNetworkRequests:!0,...e},this.options.enabled===!1)return this;this.store=new x(this.options),this.options.interceptNetworkRequests!==!1&&(this.networkInterceptor=new y(this.store),this.networkInterceptor.enable());let r=()=>{if(this.launcher||!this.store)return;let{shadowRoot:t}=I();this.modal=new E(t,this.store,()=>{}),this.launcher=new w(t,this.options.position,()=>{this.modal?.toggle()});let a=Object.keys(this.store.getOverrides()).length;this.launcher.updateBadgeCount(a),this.store.subscribeStoreChange(()=>{let i=Object.keys(this.store.getOverrides()).length;this.launcher?.updateBadgeCount(i)})};return document.readyState==="loading"?document.addEventListener("DOMContentLoaded",r):r(),this.isInitialized=!0,this}get(e,r){return this.store||this.init(),this.store?.get(e,r)??r??""}set(e,r){this.store||this.init(),this.store?.setOverride(e,r)}remove(e){this.store?.removeOverride(e)}reset(){this.store?.resetAllOverrides()}onChange(e){return this.store||this.init(),this.store?.subscribeEnvChange(e)??(()=>{})}open(){this.modal?.open()}close(){this.modal?.close()}toggle(){this.modal?.toggle()}},L=new S;typeof window<"u"&&(window.lamba=L,(document.currentScript!==null||document.querySelector('script[src*="lamba"]'))&&L.init());var z=L;return U(D);})();
560
+ `;let a=t.querySelector(".var-input");return a.addEventListener("change",()=>{this.store.setOverride(e.key,a.value)}),t.querySelector(".toggle-secret-btn")?.addEventListener("click",()=>{this.secretVisibilityMap.set(e.key,!r),this.render()}),t.querySelector(".reset-var-btn")?.addEventListener("click",()=>{this.store.removeOverride(e.key)}),t}escapeHtml(e){return e==null?"":String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}};var S=class{constructor(){this.store=null;this.launcher=null;this.modal=null;this.networkInterceptor=null;this.options={};this.isInitialized=!1;let e=this;this.env=new Proxy({},{get(t,r){if(typeof r=="string")return e.get(r)},set(t,r,a){return typeof r=="string"?(e.set(r,String(a)),!0):!1}})}wrap(e){if(this.store||this.init(),e&&typeof e=="object"&&this.store)try{let r={};for(let[a,i]of Object.entries(e))(typeof i=="string"||typeof i=="number"||typeof i=="boolean")&&(r[a]=String(i));Object.keys(r).length>0&&this.store.mergeDefaults(r)}catch{}let t=this;return new Proxy(e,{get(r,a){if(typeof a=="string"){let i=t.get(a);if(i!==void 0&&i!=="")return i}return Reflect.get(r,a)}})}init(e={}){if(typeof window>"u")return this;if(this.isInitialized)return this;if(this.options={enabled:!0,position:"bottom-right",autoFetchEnvFile:!1,interceptNetworkRequests:!0,...e},this.options.enabled===!1)return this;this.store=new x(this.options),this.options.interceptNetworkRequests!==!1&&(this.networkInterceptor=new y(this.store),this.networkInterceptor.enable());let t=()=>{if(this.launcher||!this.store)return;let{shadowRoot:r}=H();this.modal=new E(r,this.store,()=>{}),this.launcher=new w(r,this.options.position,()=>{this.modal?.toggle()});let a=Object.keys(this.store.getOverrides()).length;this.launcher.updateBadgeCount(a),this.store.subscribeStoreChange(()=>{let i=Object.keys(this.store.getOverrides()).length;this.launcher?.updateBadgeCount(i)})};return document.readyState==="loading"?document.addEventListener("DOMContentLoaded",t):t(),this.isInitialized=!0,this}get(e,t){return this.store||this.init(),this.store?.get(e,t)??t??""}set(e,t){this.store||this.init(),this.store?.setOverride(e,t)}remove(e){this.store?.removeOverride(e)}reset(){this.store?.resetAllOverrides()}onChange(e){return this.store||this.init(),this.store?.subscribeEnvChange(e)??(()=>{})}open(){this.modal?.open()}close(){this.modal?.close()}toggle(){this.modal?.toggle()}},L=new S;if(typeof window<"u"){window.lamba=L;let s=document.currentScript;s&&(s.hasAttribute("data-lamba-auto")||s.hasAttribute("data-auto-init"))&&L.init()}var D=L;return N(z);})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ojolowoblue/lamba",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "A universal dev tool for viewing, overriding, and swapping environment variables live in web applications.",
5
5
  "repository": {
6
6
  "type": "git",