@ojolowoblue/lamba 1.0.6 → 1.0.7
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.
- package/dist/index.d.mts +9 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +16 -1
- package/dist/index.mjs.map +1 -1
- package/dist/integrations/react.js +16 -1
- package/dist/integrations/react.js.map +1 -1
- package/dist/integrations/react.mjs +16 -1
- package/dist/integrations/react.mjs.map +1 -1
- package/dist/integrations/vue.js +16 -1
- package/dist/integrations/vue.js.map +1 -1
- package/dist/integrations/vue.mjs +16 -1
- package/dist/integrations/vue.mjs.map +1 -1
- package/dist/lamba.min.js +6 -6
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -160,6 +160,15 @@ declare class LambaManager {
|
|
|
160
160
|
* Resets all environment variable overrides.
|
|
161
161
|
*/
|
|
162
162
|
reset(): void;
|
|
163
|
+
/**
|
|
164
|
+
* Removes ALL lamba data from storage (overrides, presets, active preset).
|
|
165
|
+
* Safe to call even when lamba has not been initialized.
|
|
166
|
+
* Useful when disabling lamba to ensure no stale data remains in the browser.
|
|
167
|
+
*
|
|
168
|
+
* @param options - Optionally pass storage options to target the correct adapter.
|
|
169
|
+
* Defaults to 'local' (localStorage) to cover the common case.
|
|
170
|
+
*/
|
|
171
|
+
purge(options?: Pick<LambaOptions, 'storageStrategy' | 'storage'>): void;
|
|
163
172
|
/**
|
|
164
173
|
* Subscribes to environment variable changes.
|
|
165
174
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -160,6 +160,15 @@ declare class LambaManager {
|
|
|
160
160
|
* Resets all environment variable overrides.
|
|
161
161
|
*/
|
|
162
162
|
reset(): void;
|
|
163
|
+
/**
|
|
164
|
+
* Removes ALL lamba data from storage (overrides, presets, active preset).
|
|
165
|
+
* Safe to call even when lamba has not been initialized.
|
|
166
|
+
* Useful when disabling lamba to ensure no stale data remains in the browser.
|
|
167
|
+
*
|
|
168
|
+
* @param options - Optionally pass storage options to target the correct adapter.
|
|
169
|
+
* Defaults to 'local' (localStorage) to cover the common case.
|
|
170
|
+
*/
|
|
171
|
+
purge(options?: Pick<LambaOptions, 'storageStrategy' | 'storage'>): void;
|
|
163
172
|
/**
|
|
164
173
|
* Subscribes to environment variable changes.
|
|
165
174
|
*/
|
package/dist/index.js
CHANGED
|
@@ -1569,7 +1569,10 @@ var LambaManager = class {
|
|
|
1569
1569
|
interceptNetworkRequests: true,
|
|
1570
1570
|
...options
|
|
1571
1571
|
};
|
|
1572
|
-
if (this.options.enabled === false)
|
|
1572
|
+
if (this.options.enabled === false) {
|
|
1573
|
+
this.purge(options);
|
|
1574
|
+
return this;
|
|
1575
|
+
}
|
|
1573
1576
|
this.store = new EnvStore(this.options);
|
|
1574
1577
|
if (this.options.interceptNetworkRequests !== false) {
|
|
1575
1578
|
this.networkInterceptor = new NetworkInterceptor(this.store);
|
|
@@ -1626,6 +1629,18 @@ var LambaManager = class {
|
|
|
1626
1629
|
reset() {
|
|
1627
1630
|
this.store?.resetAllOverrides();
|
|
1628
1631
|
}
|
|
1632
|
+
/**
|
|
1633
|
+
* Removes ALL lamba data from storage (overrides, presets, active preset).
|
|
1634
|
+
* Safe to call even when lamba has not been initialized.
|
|
1635
|
+
* Useful when disabling lamba to ensure no stale data remains in the browser.
|
|
1636
|
+
*
|
|
1637
|
+
* @param options - Optionally pass storage options to target the correct adapter.
|
|
1638
|
+
* Defaults to 'local' (localStorage) to cover the common case.
|
|
1639
|
+
*/
|
|
1640
|
+
purge(options) {
|
|
1641
|
+
const adapter = this.store?.storage ?? createStorageAdapter(options?.storageStrategy ?? "local", options?.storage);
|
|
1642
|
+
adapter.clear();
|
|
1643
|
+
}
|
|
1629
1644
|
/**
|
|
1630
1645
|
* Subscribes to environment variable changes.
|
|
1631
1646
|
*/
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/preset-manager.ts","../src/core/env-parser.ts","../src/core/storage.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"],"sourcesContent":["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, any>;\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: any) {\n if (typeof prop === 'string') {\n self.set(prop, 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, any> = {};\n for (const [k, v] of Object.entries(targetEnv)) {\n defaultObj[k] = v;\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 const targetVal = Reflect.get(target, prop);\n if (typeof targetVal === 'boolean') {\n if (overrideVal === 'true' || overrideVal === true) return true;\n if (overrideVal === 'false' || overrideVal === false) return false;\n } else if (typeof targetVal === 'number' && typeof overrideVal === 'string') {\n const num = Number(overrideVal);\n if (!isNaN(num)) return num;\n }\n return overrideVal;\n }\n }\n return Reflect.get(target, prop);\n },\n set(target, prop: string | symbol, value: any) {\n if (typeof prop === 'string') {\n self.set(prop, value);\n }\n return Reflect.set(target, prop, value);\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<T = any>(key: string, fallback?: T): T {\n if (!this.store) {\n // Lazy init store if called before explicit init\n this.init();\n }\n return (this.store?.get<T>(key, fallback) ?? fallback) as T;\n }\n\n /**\n * Overrides an environment variable live at runtime.\n */\n public set(key: string, value: any): 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';\nexport {\n type LambaStorageAdapter,\n LocalStorageAdapter,\n SessionStorageAdapter,\n MemoryStorageAdapter,\n} from './core/storage';\n","import { PresetProfile } from './types';\nimport { LambaStorageAdapter } from './storage';\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 private storage: LambaStorageAdapter;\n\n constructor(storage: LambaStorageAdapter) {\n this.storage = storage;\n this.loadFromStorage();\n }\n\n private loadFromStorage(): void {\n try {\n const rawPresets = this.storage.getItem(STORAGE_PRESETS_KEY);\n if (rawPresets) {\n this.presets = JSON.parse(rawPresets);\n }\n this.activePresetId = this.storage.getItem(STORAGE_ACTIVE_PRESET_KEY);\n } catch (e) {\n console.warn('[lamba] Failed to parse presets from storage', e);\n }\n }\n\n private saveToStorage(): void {\n try {\n this.storage.setItem(STORAGE_PRESETS_KEY, JSON.stringify(this.presets));\n if (this.activePresetId) {\n this.storage.setItem(STORAGE_ACTIVE_PRESET_KEY, this.activePresetId);\n } else {\n this.storage.removeItem(STORAGE_ACTIVE_PRESET_KEY);\n }\n } catch (e) {\n console.warn('[lamba] Failed to save presets to storage', 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, any>): 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","/**\n * Abstract interface for pluggable storage backends used by lamba to persist\n * overrides and presets. All methods are synchronous for simplicity (async\n * adapters can wrap with Promises if needed in custom implementations).\n */\nexport interface LambaStorageAdapter {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n clear(): void;\n}\n\n/**\n * LocalStorage-backed adapter (default).\n * Overrides persist indefinitely across tabs and page reloads.\n * Visible in DevTools → Application → Local Storage.\n */\nexport class LocalStorageAdapter implements LambaStorageAdapter {\n getItem(key: string): string | null {\n try {\n return typeof localStorage !== 'undefined' ? localStorage.getItem(key) : null;\n } catch {\n return null;\n }\n }\n\n setItem(key: string, value: string): void {\n try {\n if (typeof localStorage !== 'undefined') localStorage.setItem(key, value);\n } catch {}\n }\n\n removeItem(key: string): void {\n try {\n if (typeof localStorage !== 'undefined') localStorage.removeItem(key);\n } catch {}\n }\n\n clear(): void {\n try {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem('__lamba_overrides__');\n localStorage.removeItem('__lamba_presets__');\n localStorage.removeItem('__lamba_active_preset__');\n }\n } catch {}\n }\n}\n\n/**\n * SessionStorage-backed adapter.\n * Overrides survive page reloads within the same tab, but are automatically\n * destroyed when the tab is closed. Still visible in DevTools Storage panel.\n */\nexport class SessionStorageAdapter implements LambaStorageAdapter {\n getItem(key: string): string | null {\n try {\n return typeof sessionStorage !== 'undefined' ? sessionStorage.getItem(key) : null;\n } catch {\n return null;\n }\n }\n\n setItem(key: string, value: string): void {\n try {\n if (typeof sessionStorage !== 'undefined') sessionStorage.setItem(key, value);\n } catch {}\n }\n\n removeItem(key: string): void {\n try {\n if (typeof sessionStorage !== 'undefined') sessionStorage.removeItem(key);\n } catch {}\n }\n\n clear(): void {\n try {\n if (typeof sessionStorage !== 'undefined') {\n sessionStorage.removeItem('__lamba_overrides__');\n sessionStorage.removeItem('__lamba_presets__');\n sessionStorage.removeItem('__lamba_active_preset__');\n }\n } catch {}\n }\n}\n\n/**\n * In-memory adapter.\n * The most secure option: zero bytes written to any browser storage mechanism.\n * Overrides exist only in JavaScript heap memory and are destroyed when the\n * tab/page is closed or navigated away. Nothing appears in DevTools Storage.\n */\nexport class MemoryStorageAdapter implements LambaStorageAdapter {\n private store: Map<string, string> = new Map();\n\n getItem(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n setItem(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n removeItem(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n}\n\n/**\n * Factory function that creates the appropriate storage adapter from a\n * `storageStrategy` string or a user-supplied custom adapter.\n */\nexport function createStorageAdapter(\n strategy: 'local' | 'session' | 'memory' = 'local',\n custom?: LambaStorageAdapter,\n): LambaStorageAdapter {\n if (custom) return custom;\n\n switch (strategy) {\n case 'session':\n return new SessionStorageAdapter();\n case 'memory':\n return new MemoryStorageAdapter();\n case 'local':\n default:\n return new LocalStorageAdapter();\n }\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';\nimport { LambaStorageAdapter, createStorageAdapter } from './storage';\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, any> = {};\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 private storage: LambaStorageAdapter;\n public presetManager: PresetManager;\n\n constructor(options: LambaOptions = {}) {\n this.secretPattern = options.secretKeysPattern || DEFAULT_SECRET_PATTERN;\n this.allowedPrefixes = options.allowedPrefixes;\n this.storage = createStorageAdapter(options.storageStrategy ?? 'local', options.storage);\n this.presetManager = new PresetManager(this.storage);\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 try {\n const stored = this.storage.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 storage', e);\n }\n }\n\n private saveOverridesToStorage(): void {\n try {\n this.storage.setItem(STORAGE_OVERRIDES_KEY, JSON.stringify(this.overrides));\n } catch (e) {\n console.warn('[lamba] Failed to save overrides to storage', 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;\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<T = any>(key: string, fallback?: T): T | undefined {\n if (key in this.overrides) {\n return this.overrides[key] as T;\n }\n const item = this.variables.get(key);\n if (item) return item.value as T;\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, any> {\n return { ...this.overrides };\n }\n\n public setOverride(key: string, value: any): 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 let val: any = inputEl.value;\n if (typeof varItem.defaultValue === 'boolean') {\n if (val === 'true') val = true;\n else if (val === 'false') val = false;\n } else if (typeof varItem.defaultValue === 'number') {\n const num = Number(val);\n if (!isNaN(num) && val.trim() !== '') val = num;\n }\n this.store.setOverride(varItem.key, val);\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 const text = typeof str === 'object' ? JSON.stringify(str) : String(str);\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGA,IAAM,sBAAsB;AAC5B,IAAM,4BAA4B;AAE3B,IAAM,gBAAN,MAAoB;AAAA,EAKzB,YAAY,SAA8B;AAJ1C,SAAQ,UAA2B,CAAC;AACpC,SAAQ,iBAAgC;AAItC,SAAK,UAAU;AACf,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEQ,kBAAwB;AAC9B,QAAI;AACF,YAAM,aAAa,KAAK,QAAQ,QAAQ,mBAAmB;AAC3D,UAAI,YAAY;AACd,aAAK,UAAU,KAAK,MAAM,UAAU;AAAA,MACtC;AACA,WAAK,iBAAiB,KAAK,QAAQ,QAAQ,yBAAyB;AAAA,IACtE,SAAS,GAAG;AACV,cAAQ,KAAK,gDAAgD,CAAC;AAAA,IAChE;AAAA,EACF;AAAA,EAEQ,gBAAsB;AAC5B,QAAI;AACF,WAAK,QAAQ,QAAQ,qBAAqB,KAAK,UAAU,KAAK,OAAO,CAAC;AACtE,UAAI,KAAK,gBAAgB;AACvB,aAAK,QAAQ,QAAQ,2BAA2B,KAAK,cAAc;AAAA,MACrE,OAAO;AACL,aAAK,QAAQ,WAAW,yBAAyB;AAAA,MACnD;AAAA,IACF,SAAS,GAAG;AACV,cAAQ,KAAK,6CAA6C,CAAC;AAAA,IAC7D;AAAA,EACF;AAAA,EAEO,aAA8B;AACnC,WAAO,CAAC,GAAG,KAAK,OAAO;AAAA,EACzB;AAAA,EAEO,oBAAmC;AACxC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,aAAa,MAAc,WAA+C;AAC/E,UAAM,YAA2B;AAAA,MAC/B,IAAI,YAAY,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AAAA,MACzD,MAAM,KAAK,KAAK,KAAK;AAAA,MACrB,WAAW,EAAE,GAAG,UAAU;AAAA,MAC1B,WAAW,KAAK,IAAI;AAAA,IACtB;AAEA,SAAK,QAAQ,KAAK,SAAS;AAC3B,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AAAA,EAEO,aAAa,IAAkB;AACpC,SAAK,UAAU,KAAK,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AACrD,QAAI,KAAK,mBAAmB,IAAI;AAC9B,WAAK,iBAAiB;AAAA,IACxB;AACA,SAAK,cAAc;AAAA,EACrB;AAAA,EAEO,gBAAgB,IAAyC;AAC9D,QAAI,CAAC,IAAI;AACP,WAAK,iBAAiB;AACtB,WAAK,cAAc;AACnB,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACnD,QAAI,QAAQ;AACV,WAAK,iBAAiB;AACtB,WAAK,cAAc;AACnB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;;;AClFO,SAAS,eAAe,SAAyC;AACtE,QAAM,SAAiC,CAAC;AACxC,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAEhC,WAAS,QAAQ,OAAO;AACtB,WAAO,KAAK,KAAK;AACjB,QAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,EAAG;AAEnC,QAAI,KAAK,WAAW,SAAS,GAAG;AAC9B,aAAO,KAAK,MAAM,CAAC,EAAE,KAAK;AAAA,IAC5B;AAEA,UAAM,YAAY,KAAK,QAAQ,GAAG;AAClC,QAAI,cAAc,GAAI;AAEtB,UAAM,MAAM,KAAK,MAAM,GAAG,SAAS,EAAE,KAAK;AAC1C,QAAI,MAAM,KAAK,MAAM,YAAY,CAAC,EAAE,KAAK;AAGzC,QACG,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,KACvC,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,GACxC;AACA,YAAM,IAAI,MAAM,GAAG,EAAE;AAAA,IACvB;AAGA,UAAM,IAAI,QAAQ,QAAQ,IAAI;AAE9B,QAAI,KAAK;AACP,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,aAAa,KAAqC;AAChE,SAAO,OAAO,QAAQ,GAAG,EACtB,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM;AACnB,UAAM,cAAc,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,IAAI,KAAK,IAAI,SAAS,GAAG;AAC/E,UAAM,eAAe,cAAc,IAAI,IAAI,QAAQ,MAAM,KAAK,CAAC,MAAM;AACrE,WAAO,GAAG,GAAG,IAAI,YAAY;AAAA,EAC/B,CAAC,EACA,KAAK,IAAI;AACd;AAKO,SAAS,yBAAiD;AAC/D,QAAM,aAAqC,CAAC;AAE5C,MAAI,OAAO,WAAW,YAAa,QAAO;AAE1C,QAAM,wBAAwB,CAAC,QAAa;AAC1C,QAAI,CAAC,OAAO,OAAO,QAAQ,SAAU;AACrC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AACxC,UAAI,OAAO,MAAM,YAAY,OAAO,MAAM,YAAY,OAAO,MAAM,WAAW;AAC5E,mBAAW,CAAC,IAAI,OAAO,CAAC;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACF,UAAM,aAAc,OAAe;AACnC,QAAI,cAAc,WAAW,OAAO,OAAO,WAAW,QAAQ,UAAU;AACtE,4BAAsB,WAAW,GAAG;AAAA,IACtC;AAAA,EACF,SAAS,GAAG;AAAA,EAAC;AAGb,MAAI;AACF,UAAM,WAAY,OAAe;AACjC,QAAI,UAAU;AACZ,UAAI,SAAS,IAAK,uBAAsB,SAAS,GAAG;AACpD,UAAI,SAAS,eAAe,OAAQ,uBAAsB,SAAS,cAAc,MAAM;AAAA,IACzF;AAAA,EACF,SAAS,GAAG;AAAA,EAAC;AAGb,MAAI;AACF,UAAM,WAAY,OAAe;AACjC,QAAI,UAAU,QAAQ,QAAQ;AAC5B,4BAAsB,SAAS,OAAO,MAAM;AAAA,IAC9C;AAAA,EACF,SAAS,GAAG;AAAA,EAAC;AAGb,MAAI;AACF,UAAM,MAAM;AACZ,UAAM,YAAY,IAAI,WAAW,IAAI,OAAO,IAAI,cAAc,IAAI;AAClE,QAAI,WAAW;AACb,4BAAsB,SAAS;AAAA,IACjC;AAAA,EACF,SAAS,GAAG;AAAA,EAAC;AAGb,MAAI;AACF,UAAM,WAAW,SAAS,iBAAiB,MAAM;AACjD,aAAS,QAAQ,CAAC,SAAS;AACzB,YAAM,OAAO,KAAK,aAAa,MAAM;AACrC,YAAM,UAAU,KAAK,aAAa,SAAS;AAC3C,UAAI,CAAC,QAAQ,YAAY,KAAM;AAE/B,UAAI,KAAK,WAAW,MAAM,GAAG;AAC3B,cAAM,MAAM,KAAK,MAAM,CAAC;AACxB,mBAAW,GAAG,IAAI;AAAA,MACpB,WAAW,SAAS,aAAa;AAC/B,cAAM,SAAS,IAAI,gBAAgB,OAAO;AAC1C,eAAO,QAAQ,CAAC,KAAK,QAAQ;AAC3B,qBAAW,GAAG,IAAI;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,SAAS,GAAG;AAAA,EAAC;AAEb,SAAO;AACT;AAKA,eAAsB,sBAAuD;AAC3E,QAAM,QAAQ,CAAC,SAAS,eAAe,eAAe;AACtD,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,MAAM,EAAE,SAAS,EAAE,QAAQ,aAAa,EAAE,CAAC;AACnE,UAAI,IAAI,IAAI;AACV,cAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAI,QAAQ,KAAK,SAAS,GAAG,GAAG;AAC9B,iBAAO,eAAe,IAAI;AAAA,QAC5B;AAAA,MACF;AAAA,IACF,SAAS,GAAG;AAAA,IAEZ;AAAA,EACF;AACA,SAAO,CAAC;AACV;;;ACjIO,IAAM,sBAAN,MAAyD;AAAA,EAC9D,QAAQ,KAA4B;AAClC,QAAI;AACF,aAAO,OAAO,iBAAiB,cAAc,aAAa,QAAQ,GAAG,IAAI;AAAA,IAC3E,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,QAAQ,KAAa,OAAqB;AACxC,QAAI;AACF,UAAI,OAAO,iBAAiB,YAAa,cAAa,QAAQ,KAAK,KAAK;AAAA,IAC1E,QAAQ;AAAA,IAAC;AAAA,EACX;AAAA,EAEA,WAAW,KAAmB;AAC5B,QAAI;AACF,UAAI,OAAO,iBAAiB,YAAa,cAAa,WAAW,GAAG;AAAA,IACtE,QAAQ;AAAA,IAAC;AAAA,EACX;AAAA,EAEA,QAAc;AACZ,QAAI;AACF,UAAI,OAAO,iBAAiB,aAAa;AACvC,qBAAa,WAAW,qBAAqB;AAC7C,qBAAa,WAAW,mBAAmB;AAC3C,qBAAa,WAAW,yBAAyB;AAAA,MACnD;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX;AACF;AAOO,IAAM,wBAAN,MAA2D;AAAA,EAChE,QAAQ,KAA4B;AAClC,QAAI;AACF,aAAO,OAAO,mBAAmB,cAAc,eAAe,QAAQ,GAAG,IAAI;AAAA,IAC/E,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,QAAQ,KAAa,OAAqB;AACxC,QAAI;AACF,UAAI,OAAO,mBAAmB,YAAa,gBAAe,QAAQ,KAAK,KAAK;AAAA,IAC9E,QAAQ;AAAA,IAAC;AAAA,EACX;AAAA,EAEA,WAAW,KAAmB;AAC5B,QAAI;AACF,UAAI,OAAO,mBAAmB,YAAa,gBAAe,WAAW,GAAG;AAAA,IAC1E,QAAQ;AAAA,IAAC;AAAA,EACX;AAAA,EAEA,QAAc;AACZ,QAAI;AACF,UAAI,OAAO,mBAAmB,aAAa;AACzC,uBAAe,WAAW,qBAAqB;AAC/C,uBAAe,WAAW,mBAAmB;AAC7C,uBAAe,WAAW,yBAAyB;AAAA,MACrD;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX;AACF;AAQO,IAAM,uBAAN,MAA0D;AAAA,EAA1D;AACL,SAAQ,QAA6B,oBAAI,IAAI;AAAA;AAAA,EAE7C,QAAQ,KAA4B;AAClC,WAAO,KAAK,MAAM,IAAI,GAAG,KAAK;AAAA,EAChC;AAAA,EAEA,QAAQ,KAAa,OAAqB;AACxC,SAAK,MAAM,IAAI,KAAK,KAAK;AAAA,EAC3B;AAAA,EAEA,WAAW,KAAmB;AAC5B,SAAK,MAAM,OAAO,GAAG;AAAA,EACvB;AAAA,EAEA,QAAc;AACZ,SAAK,MAAM,MAAM;AAAA,EACnB;AACF;AAMO,SAAS,qBACd,WAA2C,SAC3C,QACqB;AACrB,MAAI,OAAQ,QAAO;AAEnB,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,IAAI,sBAAsB;AAAA,IACnC,KAAK;AACH,aAAO,IAAI,qBAAqB;AAAA,IAClC,KAAK;AAAA,IACL;AACE,aAAO,IAAI,oBAAoB;AAAA,EACnC;AACF;;;ACxHA,IAAM,wBAAwB;AAC9B,IAAM,yBAAyB;AAExB,IAAM,WAAN,MAAe;AAAA,EAUpB,YAAY,UAAwB,CAAC,GAAG;AATxC,SAAQ,YAAsC,oBAAI,IAAI;AACtD,SAAQ,YAAiC,CAAC;AAG1C,SAAQ,qBAA6C,oBAAI,IAAI;AAC7D,SAAQ,uBAAiD,oBAAI,IAAI;AAK/D,SAAK,gBAAgB,QAAQ,qBAAqB;AAClD,SAAK,kBAAkB,QAAQ;AAC/B,SAAK,UAAU,qBAAqB,QAAQ,mBAAmB,SAAS,QAAQ,OAAO;AACvF,SAAK,gBAAgB,IAAI,cAAc,KAAK,OAAO;AAGnD,SAAK,yBAAyB;AAG9B,QAAI,QAAQ,KAAK;AACf,WAAK,cAAc,QAAQ,GAAG;AAAA,IAChC;AAGA,UAAM,iBAAiB,uBAAuB;AAC9C,SAAK,cAAc,cAAc;AAGjC,QAAI,QAAQ,qBAAqB,QAAQ,OAAO,WAAW,aAAa;AACtE,0BAAoB,EAAE,KAAK,CAAC,YAAY;AACtC,YAAI,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG;AACnC,eAAK,cAAc,OAAO;AAAA,QAC5B;AAAA,MACF,CAAC;AAAA,IACH;AAIA,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEQ,2BAAiC;AACvC,QAAI;AACF,YAAM,SAAS,KAAK,QAAQ,QAAQ,qBAAqB;AACzD,UAAI,QAAQ;AACV,aAAK,YAAY,KAAK,MAAM,MAAM;AAAA,MACpC;AAAA,IACF,SAAS,GAAG;AACV,cAAQ,KAAK,kDAAkD,CAAC;AAAA,IAClE;AAAA,EACF;AAAA,EAEQ,yBAA+B;AACrC,QAAI;AACF,WAAK,QAAQ,QAAQ,uBAAuB,KAAK,UAAU,KAAK,SAAS,CAAC;AAAA,IAC5E,SAAS,GAAG;AACV,cAAQ,KAAK,+CAA+C,CAAC;AAAA,IAC/D;AAAA,EACF;AAAA;AAAA;AAAA,EAIQ,kBAAwB;AAC9B,QAAI,OAAO,WAAW,YAAa;AAEnC,UAAM,MAAM;AACZ,QAAI,CAAC,IAAI,SAAS;AAChB,UAAI,UAAU,EAAE,KAAK,CAAC,EAAE;AAAA,IAC1B,WAAW,CAAC,IAAI,QAAQ,KAAK;AAC3B,UAAI,QAAQ,MAAM,CAAC;AAAA,IACrB;AAEA,UAAM,OAAO;AACb,UAAM,YAAY,IAAI,QAAQ;AAG9B,QAAI;AACF,UAAI,QAAQ,MAAM,IAAI,MAAM,WAAW;AAAA,QACrC,IAAI,QAAQ,MAAc;AACxB,cAAI,OAAO,SAAS,UAAU;AAC5B,kBAAM,MAAM,KAAK,IAAI,IAAI;AACzB,gBAAI,QAAQ,OAAW,QAAO;AAAA,UAChC;AACA,iBAAO,OAAO,IAAI;AAAA,QACpB;AAAA,QACA,IAAI,QAAQ,MAAc,OAAY;AACpC,iBAAO,IAAI,IAAI;AACf,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH,SAAS,GAAG;AAAA,IAEZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,aAAa,KAAsB;AACxC,QAAI,CAAC,KAAK,gBAAiB,QAAO;AAElC,QAAI,OAAO,KAAK,oBAAoB,UAAU;AAC5C,aAAO,IAAI,WAAW,KAAK,eAAe;AAAA,IAC5C;AAEA,QAAI,MAAM,QAAQ,KAAK,eAAe,GAAG;AACvC,UAAI,KAAK,gBAAgB,WAAW,EAAG,QAAO;AAC9C,aAAO,KAAK,gBAAgB,KAAK,CAAC,MAAM,IAAI,WAAW,CAAC,CAAC;AAAA,IAC3D;AAEA,QAAI,KAAK,2BAA2B,QAAQ;AAC1C,aAAO,KAAK,gBAAgB,KAAK,GAAG;AAAA,IACtC;AAEA,WAAO;AAAA,EACT;AAAA,EAEO,cAAc,KAAgC;AACnD,QAAI,UAAU;AACd,eAAW,CAAC,KAAK,UAAU,KAAK,OAAO,QAAQ,GAAG,GAAG;AACnD,UAAI,CAAC,KAAK,aAAa,GAAG,EAAG;AAE7B,YAAM,eAAe;AACrB,YAAM,eAAe,OAAO,KAAK;AACjC,YAAM,eAAe,eAAe,KAAK,UAAU,GAAG,IAAI;AAC1D,YAAM,WAAW,KAAK,cAAc,KAAK,GAAG;AAE5C,YAAM,WAAW,KAAK,UAAU,IAAI,GAAG;AACvC,UAAI,CAAC,UAAU;AACb,aAAK,UAAU,IAAI,KAAK;AAAA,UACtB;AAAA,UACA,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,kBAAU;AAAA,MACZ,OAAO;AAEL,YAAI,SAAS,iBAAiB,cAAc;AAC1C,mBAAS,eAAe;AACxB,cAAI,CAAC,SAAS,cAAc;AAC1B,qBAAS,QAAQ;AAAA,UACnB;AACA,oBAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS;AACX,WAAK,mBAAmB;AAAA,IAC1B;AAAA,EACF;AAAA,EAEO,IAAa,KAAa,UAA6B;AAC5D,QAAI,OAAO,KAAK,WAAW;AACzB,aAAO,KAAK,UAAU,GAAG;AAAA,IAC3B;AACA,UAAM,OAAO,KAAK,UAAU,IAAI,GAAG;AACnC,QAAI,KAAM,QAAO,KAAK;AACtB,WAAO;AAAA,EACT;AAAA,EAEO,SAAsC;AAC3C,UAAM,SAAsC,CAAC;AAC7C,SAAK,UAAU,QAAQ,CAAC,QAAQ,QAAQ;AACtC,aAAO,GAAG,IAAI,EAAE,GAAG,OAAO;AAAA,IAC5B,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEO,eAAoC;AACzC,WAAO,EAAE,GAAG,KAAK,UAAU;AAAA,EAC7B;AAAA,EAEO,YAAY,KAAa,OAAkB;AAChD,UAAM,aAAa,IAAI,KAAK;AAC5B,QAAI,CAAC,WAAY;AAEjB,SAAK,UAAU,UAAU,IAAI;AAC7B,SAAK,uBAAuB;AAE5B,QAAI,OAAO,KAAK,UAAU,IAAI,UAAU;AACxC,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,QACL,KAAK;AAAA,QACL;AAAA,QACA,cAAc;AAAA,QACd,cAAc;AAAA,QACd,UAAU,KAAK,cAAc,KAAK,UAAU;AAAA,MAC9C;AACA,WAAK,UAAU,IAAI,YAAY,IAAI;AAAA,IACrC,OAAO;AACL,WAAK,QAAQ;AACb,WAAK,eAAe;AAAA,IACtB;AAEA,SAAK,cAAc,YAAY,OAAO,IAAI;AAC1C,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEO,eAAe,KAAmB;AACvC,QAAI,OAAO,KAAK,WAAW;AACzB,aAAO,KAAK,UAAU,GAAG;AACzB,WAAK,uBAAuB;AAE5B,YAAM,OAAO,KAAK,UAAU,IAAI,GAAG;AACnC,UAAI,MAAM;AACR,aAAK,QAAQ,KAAK;AAClB,aAAK,eAAe;AACpB,aAAK,cAAc,KAAK,KAAK,OAAO,KAAK;AAAA,MAC3C;AAEA,WAAK,mBAAmB;AAAA,IAC1B;AAAA,EACF;AAAA,EAEO,oBAA0B;AAC/B,UAAM,OAAO,OAAO,KAAK,KAAK,SAAS;AACvC,SAAK,YAAY,CAAC;AAClB,SAAK,uBAAuB;AAC5B,SAAK,cAAc,gBAAgB,IAAI;AAEvC,SAAK,QAAQ,CAAC,QAAQ;AACpB,YAAM,OAAO,KAAK,UAAU,IAAI,GAAG;AACnC,UAAI,MAAM;AACR,aAAK,QAAQ,KAAK;AAClB,aAAK,eAAe;AACpB,aAAK,cAAc,KAAK,KAAK,OAAO,KAAK;AAAA,MAC3C;AAAA,IACF,CAAC;AAED,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEO,YAAY,UAA+B;AAChD,UAAM,SAAS,KAAK,cAAc,gBAAgB,QAAQ;AAC1D,SAAK,YAAY,SAAS,EAAE,GAAG,OAAO,UAAU,IAAI,CAAC;AACrD,SAAK,uBAAuB;AAG5B,SAAK,UAAU,QAAQ,CAAC,MAAM,QAAQ;AACpC,UAAI,OAAO,KAAK,WAAW;AACzB,aAAK,QAAQ,KAAK,UAAU,GAAG;AAC/B,aAAK,eAAe;AAAA,MACtB,OAAO;AACL,aAAK,QAAQ,KAAK;AAClB,aAAK,eAAe;AAAA,MACtB;AACA,WAAK,cAAc,KAAK,KAAK,OAAO,KAAK,YAAY;AAAA,IACvD,CAAC;AAGD,QAAI,QAAQ;AACV,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,SAAS,GAAG;AAC3D,YAAI,CAAC,KAAK,UAAU,IAAI,GAAG,GAAG;AAC5B,eAAK,UAAU,IAAI,KAAK;AAAA,YACtB;AAAA,YACA;AAAA,YACA,cAAc;AAAA,YACd,cAAc;AAAA,YACd,UAAU,KAAK,cAAc,KAAK,GAAG;AAAA,UACvC,CAAC;AACD,eAAK,cAAc,KAAK,OAAO,IAAI;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAEA,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEO,mBAAmB,UAAyC;AACjE,SAAK,mBAAmB,IAAI,QAAQ;AACpC,WAAO,MAAM,KAAK,mBAAmB,OAAO,QAAQ;AAAA,EACtD;AAAA,EAEO,qBAAqB,UAA2C;AACrE,SAAK,qBAAqB,IAAI,QAAQ;AACtC,WAAO,MAAM,KAAK,qBAAqB,OAAO,QAAQ;AAAA,EACxD;AAAA,EAEQ,cAAc,KAAa,OAAe,cAA6B;AAC7E,SAAK,mBAAmB,QAAQ,CAAC,OAAO,GAAG,KAAK,OAAO,YAAY,CAAC;AAEpE,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO;AAAA,QACL,IAAI,YAAY,oBAAoB;AAAA,UAClC,QAAQ,EAAE,KAAK,OAAO,aAAa;AAAA,QACrC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBAA2B;AACjC,UAAM,UAAU,KAAK,OAAO;AAC5B,UAAM,UAAU,KAAK,cAAc,WAAW;AAC9C,UAAM,iBAAiB,KAAK,cAAc,kBAAkB;AAC5D,SAAK,qBAAqB,QAAQ,CAAC,OAAO,GAAG,SAAS,SAAS,cAAc,CAAC;AAAA,EAChF;AACF;;;ACxTO,IAAM,qBAAN,MAAyB;AAAA,EAM9B,YAAY,OAAiB;AAJ7B,SAAQ,gBAA4C;AACpD,SAAQ,kBAA+D;AACvE,SAAQ,iBAA0B;AAGhC,SAAK,QAAQ;AAAA,EACf;AAAA,EAEO,SAAe;AACpB,QAAI,OAAO,WAAW,eAAe,KAAK,eAAgB;AAE1D,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEO,UAAgB;AACrB,QAAI,OAAO,WAAW,eAAe,CAAC,KAAK,eAAgB;AAE3D,QAAI,KAAK,eAAe;AACtB,aAAO,QAAQ,KAAK;AACpB,WAAK,gBAAgB;AAAA,IACvB;AACA,QAAI,KAAK,iBAAiB;AACxB,qBAAe,UAAU,OAAO,KAAK;AACrC,WAAK,kBAAkB;AAAA,IACzB;AACA,SAAK,iBAAiB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,WAAW,KAAqD;AACrE,QAAI,OAAO,QAAQ,SAAU,QAAO;AAEpC,UAAM,UAAU,KAAK,MAAM,OAAO;AAClC,QAAI,YAAY;AAEhB,eAAW,UAAU,OAAO,OAAO,OAAO,GAAG;AAC3C,UAAI,OAAO,gBAAgB,OAAO,iBAAiB,UAAa,OAAO,UAAU,QAAW;AAC1F,cAAM,aAAa,OAAO,OAAO,gBAAgB,EAAE;AACnD,cAAM,cAAc,OAAO,OAAO,SAAS,EAAE;AAC7C,YAAI,CAAC,cAAc,CAAC,YAAa;AAGjC,cAAM,cAAc,WAAW,QAAQ,QAAQ,EAAE;AACjD,cAAM,eAAe,YAAY,QAAQ,QAAQ,EAAE;AAEnD,YAAI,eAAe,UAAU,SAAS,WAAW,GAAG;AAClD,sBAAY,UAAU,QAAQ,aAAa,YAAY;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,aAAmB;AACzB,QAAI,CAAC,OAAO,MAAO;AAEnB,SAAK,gBAAgB,OAAO;AAC5B,UAAM,OAAO;AAEb,WAAO,QAAQ,SAAU,OAA0B,MAAuC;AACxF,UAAI,aAAa;AAEjB,UAAI,OAAO,UAAU,UAAU;AAC7B,qBAAa,KAAK,WAAW,KAAK;AAAA,MACpC,WAAW,iBAAiB,KAAK;AAC/B,cAAM,YAAY,KAAK,WAAW,MAAM,SAAS,CAAC;AAClD,qBAAa,IAAI,IAAI,SAAS;AAAA,MAChC,WAAW,iBAAiB,SAAS;AACnC,cAAM,eAAe,KAAK,WAAW,MAAM,GAAG;AAC9C,YAAI,iBAAiB,MAAM,KAAK;AAC9B,uBAAa,IAAI,QAAQ,cAAc,KAAK;AAAA,QAC9C;AAAA,MACF;AAEA,aAAO,KAAK,cAAe,KAAK,MAAM,YAAY,IAAI;AAAA,IACxD;AAAA,EACF;AAAA,EAEQ,WAAiB;AACvB,QAAI,CAAC,OAAO,eAAgB;AAE5B,SAAK,kBAAkB,eAAe,UAAU;AAChD,UAAM,OAAO;AAEb,mBAAe,UAAU,OAAO,SAC9B,QACA,KACA,QAAiB,MACjB,UACA,UACM;AACN,YAAM,YAAY,OAAO,QAAQ,WAAW,MAAM,IAAI,SAAS;AAC/D,YAAM,eAAe,KAAK,WAAW,SAAS;AAE9C,aAAO,KAAK,gBAAiB;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;;;AClHO,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/preset-manager.ts","../src/core/env-parser.ts","../src/core/storage.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"],"sourcesContent":["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';\nimport { createStorageAdapter } from './core/storage';\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, any>;\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: any) {\n if (typeof prop === 'string') {\n self.set(prop, 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, any> = {};\n for (const [k, v] of Object.entries(targetEnv)) {\n defaultObj[k] = v;\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 const targetVal = Reflect.get(target, prop);\n if (typeof targetVal === 'boolean') {\n if (overrideVal === 'true' || overrideVal === true) return true;\n if (overrideVal === 'false' || overrideVal === false) return false;\n } else if (typeof targetVal === 'number' && typeof overrideVal === 'string') {\n const num = Number(overrideVal);\n if (!isNaN(num)) return num;\n }\n return overrideVal;\n }\n }\n return Reflect.get(target, prop);\n },\n set(target, prop: string | symbol, value: any) {\n if (typeof prop === 'string') {\n self.set(prop, value);\n }\n return Reflect.set(target, prop, value);\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) {\n // Purge any stale lamba data left in storage so nothing lingers\n this.purge(options);\n return this;\n }\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<T = any>(key: string, fallback?: T): T {\n if (!this.store) {\n // Lazy init store if called before explicit init\n this.init();\n }\n return (this.store?.get<T>(key, fallback) ?? fallback) as T;\n }\n\n /**\n * Overrides an environment variable live at runtime.\n */\n public set(key: string, value: any): 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 * Removes ALL lamba data from storage (overrides, presets, active preset).\n * Safe to call even when lamba has not been initialized.\n * Useful when disabling lamba to ensure no stale data remains in the browser.\n *\n * @param options - Optionally pass storage options to target the correct adapter.\n * Defaults to 'local' (localStorage) to cover the common case.\n */\n public purge(options?: Pick<LambaOptions, 'storageStrategy' | 'storage'>): void {\n const adapter = this.store?.storage\n ?? createStorageAdapter(options?.storageStrategy ?? 'local', options?.storage);\n adapter.clear();\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';\nexport {\n type LambaStorageAdapter,\n LocalStorageAdapter,\n SessionStorageAdapter,\n MemoryStorageAdapter,\n} from './core/storage';\n","import { PresetProfile } from './types';\nimport { LambaStorageAdapter } from './storage';\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 private storage: LambaStorageAdapter;\n\n constructor(storage: LambaStorageAdapter) {\n this.storage = storage;\n this.loadFromStorage();\n }\n\n private loadFromStorage(): void {\n try {\n const rawPresets = this.storage.getItem(STORAGE_PRESETS_KEY);\n if (rawPresets) {\n this.presets = JSON.parse(rawPresets);\n }\n this.activePresetId = this.storage.getItem(STORAGE_ACTIVE_PRESET_KEY);\n } catch (e) {\n console.warn('[lamba] Failed to parse presets from storage', e);\n }\n }\n\n private saveToStorage(): void {\n try {\n this.storage.setItem(STORAGE_PRESETS_KEY, JSON.stringify(this.presets));\n if (this.activePresetId) {\n this.storage.setItem(STORAGE_ACTIVE_PRESET_KEY, this.activePresetId);\n } else {\n this.storage.removeItem(STORAGE_ACTIVE_PRESET_KEY);\n }\n } catch (e) {\n console.warn('[lamba] Failed to save presets to storage', 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, any>): 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","/**\n * Abstract interface for pluggable storage backends used by lamba to persist\n * overrides and presets. All methods are synchronous for simplicity (async\n * adapters can wrap with Promises if needed in custom implementations).\n */\nexport interface LambaStorageAdapter {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n clear(): void;\n}\n\n/**\n * LocalStorage-backed adapter (default).\n * Overrides persist indefinitely across tabs and page reloads.\n * Visible in DevTools → Application → Local Storage.\n */\nexport class LocalStorageAdapter implements LambaStorageAdapter {\n getItem(key: string): string | null {\n try {\n return typeof localStorage !== 'undefined' ? localStorage.getItem(key) : null;\n } catch {\n return null;\n }\n }\n\n setItem(key: string, value: string): void {\n try {\n if (typeof localStorage !== 'undefined') localStorage.setItem(key, value);\n } catch {}\n }\n\n removeItem(key: string): void {\n try {\n if (typeof localStorage !== 'undefined') localStorage.removeItem(key);\n } catch {}\n }\n\n clear(): void {\n try {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem('__lamba_overrides__');\n localStorage.removeItem('__lamba_presets__');\n localStorage.removeItem('__lamba_active_preset__');\n }\n } catch {}\n }\n}\n\n/**\n * SessionStorage-backed adapter.\n * Overrides survive page reloads within the same tab, but are automatically\n * destroyed when the tab is closed. Still visible in DevTools Storage panel.\n */\nexport class SessionStorageAdapter implements LambaStorageAdapter {\n getItem(key: string): string | null {\n try {\n return typeof sessionStorage !== 'undefined' ? sessionStorage.getItem(key) : null;\n } catch {\n return null;\n }\n }\n\n setItem(key: string, value: string): void {\n try {\n if (typeof sessionStorage !== 'undefined') sessionStorage.setItem(key, value);\n } catch {}\n }\n\n removeItem(key: string): void {\n try {\n if (typeof sessionStorage !== 'undefined') sessionStorage.removeItem(key);\n } catch {}\n }\n\n clear(): void {\n try {\n if (typeof sessionStorage !== 'undefined') {\n sessionStorage.removeItem('__lamba_overrides__');\n sessionStorage.removeItem('__lamba_presets__');\n sessionStorage.removeItem('__lamba_active_preset__');\n }\n } catch {}\n }\n}\n\n/**\n * In-memory adapter.\n * The most secure option: zero bytes written to any browser storage mechanism.\n * Overrides exist only in JavaScript heap memory and are destroyed when the\n * tab/page is closed or navigated away. Nothing appears in DevTools Storage.\n */\nexport class MemoryStorageAdapter implements LambaStorageAdapter {\n private store: Map<string, string> = new Map();\n\n getItem(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n setItem(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n removeItem(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n}\n\n/**\n * Factory function that creates the appropriate storage adapter from a\n * `storageStrategy` string or a user-supplied custom adapter.\n */\nexport function createStorageAdapter(\n strategy: 'local' | 'session' | 'memory' = 'local',\n custom?: LambaStorageAdapter,\n): LambaStorageAdapter {\n if (custom) return custom;\n\n switch (strategy) {\n case 'session':\n return new SessionStorageAdapter();\n case 'memory':\n return new MemoryStorageAdapter();\n case 'local':\n default:\n return new LocalStorageAdapter();\n }\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';\nimport { LambaStorageAdapter, createStorageAdapter } from './storage';\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, any> = {};\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 storage: LambaStorageAdapter;\n public presetManager: PresetManager;\n\n constructor(options: LambaOptions = {}) {\n this.secretPattern = options.secretKeysPattern || DEFAULT_SECRET_PATTERN;\n this.allowedPrefixes = options.allowedPrefixes;\n this.storage = createStorageAdapter(options.storageStrategy ?? 'local', options.storage);\n this.presetManager = new PresetManager(this.storage);\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 try {\n const stored = this.storage.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 storage', e);\n }\n }\n\n private saveOverridesToStorage(): void {\n try {\n this.storage.setItem(STORAGE_OVERRIDES_KEY, JSON.stringify(this.overrides));\n } catch (e) {\n console.warn('[lamba] Failed to save overrides to storage', 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;\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<T = any>(key: string, fallback?: T): T | undefined {\n if (key in this.overrides) {\n return this.overrides[key] as T;\n }\n const item = this.variables.get(key);\n if (item) return item.value as T;\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, any> {\n return { ...this.overrides };\n }\n\n public setOverride(key: string, value: any): 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 let val: any = inputEl.value;\n if (typeof varItem.defaultValue === 'boolean') {\n if (val === 'true') val = true;\n else if (val === 'false') val = false;\n } else if (typeof varItem.defaultValue === 'number') {\n const num = Number(val);\n if (!isNaN(num) && val.trim() !== '') val = num;\n }\n this.store.setOverride(varItem.key, val);\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 const text = typeof str === 'object' ? JSON.stringify(str) : String(str);\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n}\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/index.mjs
CHANGED
|
@@ -1536,7 +1536,10 @@ var LambaManager = class {
|
|
|
1536
1536
|
interceptNetworkRequests: true,
|
|
1537
1537
|
...options
|
|
1538
1538
|
};
|
|
1539
|
-
if (this.options.enabled === false)
|
|
1539
|
+
if (this.options.enabled === false) {
|
|
1540
|
+
this.purge(options);
|
|
1541
|
+
return this;
|
|
1542
|
+
}
|
|
1540
1543
|
this.store = new EnvStore(this.options);
|
|
1541
1544
|
if (this.options.interceptNetworkRequests !== false) {
|
|
1542
1545
|
this.networkInterceptor = new NetworkInterceptor(this.store);
|
|
@@ -1593,6 +1596,18 @@ var LambaManager = class {
|
|
|
1593
1596
|
reset() {
|
|
1594
1597
|
this.store?.resetAllOverrides();
|
|
1595
1598
|
}
|
|
1599
|
+
/**
|
|
1600
|
+
* Removes ALL lamba data from storage (overrides, presets, active preset).
|
|
1601
|
+
* Safe to call even when lamba has not been initialized.
|
|
1602
|
+
* Useful when disabling lamba to ensure no stale data remains in the browser.
|
|
1603
|
+
*
|
|
1604
|
+
* @param options - Optionally pass storage options to target the correct adapter.
|
|
1605
|
+
* Defaults to 'local' (localStorage) to cover the common case.
|
|
1606
|
+
*/
|
|
1607
|
+
purge(options) {
|
|
1608
|
+
const adapter = this.store?.storage ?? createStorageAdapter(options?.storageStrategy ?? "local", options?.storage);
|
|
1609
|
+
adapter.clear();
|
|
1610
|
+
}
|
|
1596
1611
|
/**
|
|
1597
1612
|
* Subscribes to environment variable changes.
|
|
1598
1613
|
*/
|