@ojolowoblue/lamba 1.0.3 → 1.0.5
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/README.md +17 -17
- package/dist/index.d.mts +9 -9
- package/dist/index.d.ts +9 -9
- package/dist/index.js +39 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +39 -13
- package/dist/index.mjs.map +1 -1
- package/dist/integrations/react.d.mts +1 -1
- package/dist/integrations/react.d.ts +1 -1
- package/dist/integrations/react.js +40 -14
- package/dist/integrations/react.js.map +1 -1
- package/dist/integrations/react.mjs +40 -14
- package/dist/integrations/react.mjs.map +1 -1
- package/dist/integrations/vue.d.mts +1 -1
- package/dist/integrations/vue.d.ts +1 -1
- package/dist/integrations/vue.js +40 -14
- package/dist/integrations/vue.js.map +1 -1
- package/dist/integrations/vue.mjs +40 -14
- package/dist/integrations/vue.mjs.map +1 -1
- package/dist/lamba.min.js +8 -8
- package/package.json +1 -1
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/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, string>;\n\n constructor() {\n const self = this;\n\n // Create implicit Proxy for lamba.env\n this.env = new Proxy({}, {\n get(_target, prop: string) {\n if (typeof prop === 'string') {\n return self.get(prop);\n }\n return undefined;\n },\n set(_target, prop: string, value: string) {\n if (typeof prop === 'string') {\n self.set(prop, String(value));\n return true;\n }\n return false;\n }\n });\n }\n\n /**\n * Wraps any environment object (such as `import.meta.env` or `process.env`)\n * in a dynamic proxy that implicitly resolves live overrides from lamba.\n */\n public wrap<T extends object>(targetEnv: T): T {\n if (!this.store) {\n this.init();\n }\n\n if (targetEnv && typeof targetEnv === 'object' && this.store) {\n try {\n const defaultObj: Record<string, string> = {};\n for (const [k, v] of Object.entries(targetEnv)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n defaultObj[k] = String(v);\n }\n }\n if (Object.keys(defaultObj).length > 0) {\n this.store.mergeDefaults(defaultObj);\n }\n } catch (e) {\n // Ignore un-enumerable or restricted environment targets\n }\n }\n\n const self = this;\n return new Proxy(targetEnv, {\n get(target, prop: string | symbol) {\n if (typeof prop === 'string') {\n const overrideVal = self.get(prop);\n if (overrideVal !== undefined && overrideVal !== '') {\n return overrideVal;\n }\n }\n return Reflect.get(target, prop);\n }\n });\n }\n\n /**\n * Initializes lamba with custom options and mounts the floating UI.\n */\n public init(options: LambaOptions = {}): this {\n if (typeof window === 'undefined') return this;\n if (this.isInitialized) return this;\n\n this.options = {\n enabled: true,\n position: 'bottom-right',\n autoFetchEnvFile: false,\n interceptNetworkRequests: true,\n ...options,\n };\n\n\n if (this.options.enabled === false) return this;\n\n // 1. Initialize Store\n this.store = new EnvStore(this.options);\n\n // 2. Initialize Network Interceptor if enabled\n if (this.options.interceptNetworkRequests !== false) {\n this.networkInterceptor = new NetworkInterceptor(this.store);\n this.networkInterceptor.enable();\n }\n\n // 3. Mount UI in Shadow DOM\n const mountUI = () => {\n if (this.launcher || !this.store) return;\n\n const { shadowRoot } = createShadowHost();\n\n this.modal = new ModalUI(shadowRoot, this.store, () => {\n // Modal closed callback\n });\n\n this.launcher = new LauncherUI(shadowRoot, this.options.position, () => {\n this.modal?.toggle();\n });\n\n // Sync badge count with initial store overrides count\n const initialOverridesCount = Object.keys(this.store.getOverrides()).length;\n this.launcher.updateBadgeCount(initialOverridesCount);\n\n // Subscribe launcher badge to store changes\n this.store.subscribeStoreChange(() => {\n const count = Object.keys(this.store!.getOverrides()).length;\n this.launcher?.updateBadgeCount(count);\n });\n };\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', mountUI);\n } else {\n mountUI();\n }\n\n this.isInitialized = true;\n return this;\n }\n\n /**\n * Gets the active value of an environment variable (returns overridden value if active, otherwise default).\n */\n public get(key: string, fallback?: string): string {\n if (!this.store) {\n // Lazy init store if called before explicit init\n this.init();\n }\n return this.store?.get(key, fallback) ?? fallback ?? '';\n }\n\n /**\n * Overrides an environment variable live at runtime.\n */\n public set(key: string, value: string): void {\n if (!this.store) this.init();\n this.store?.setOverride(key, value);\n }\n\n /**\n * Removes an override for a specific environment variable key.\n */\n public remove(key: string): void {\n this.store?.removeOverride(key);\n }\n\n /**\n * Resets all environment variable overrides.\n */\n public reset(): void {\n this.store?.resetAllOverrides();\n }\n\n /**\n * Subscribes to environment variable changes.\n */\n public onChange(listener: EnvChangeListener): () => void {\n if (!this.store) this.init();\n return this.store?.subscribeEnvChange(listener) ?? (() => {});\n }\n\n /**\n * Programmatically opens the lamba floating modal.\n */\n public open(): void {\n this.modal?.open();\n }\n\n /**\n * Programmatically closes the lamba floating modal.\n */\n public close(): void {\n this.modal?.close();\n }\n\n /**\n * Programmatically toggles the lamba floating modal.\n */\n public toggle(): void {\n this.modal?.toggle();\n }\n}\n\n// Global Singleton Instance\nexport const lamba = new LambaManager();\n\n// Auto-initialize when included as a CDN script tag in browser\nif (typeof window !== 'undefined') {\n (window as any).lamba = lamba;\n\n // Auto init if script loaded directly via CDN script tag\n const isCdnScript = document.currentScript !== null || !!document.querySelector('script[src*=\"lamba\"]');\n if (isCdnScript) {\n lamba.init();\n }\n}\n\nexport default lamba;\nexport * from './core/types';\nexport { parseEnvString, stringifyEnv } from './core/env-parser';\n","import { PresetProfile } from './types';\n\nconst STORAGE_PRESETS_KEY = '__lamba_presets__';\nconst STORAGE_ACTIVE_PRESET_KEY = '__lamba_active_preset__';\n\nexport class PresetManager {\n private presets: PresetProfile[] = [];\n private activePresetId: string | null = null;\n\n constructor() {\n this.loadFromStorage();\n }\n\n private loadFromStorage(): void {\n if (typeof localStorage === 'undefined') return;\n\n try {\n const rawPresets = localStorage.getItem(STORAGE_PRESETS_KEY);\n if (rawPresets) {\n this.presets = JSON.parse(rawPresets);\n }\n this.activePresetId = localStorage.getItem(STORAGE_ACTIVE_PRESET_KEY);\n } catch (e) {\n console.warn('[lamba] Failed to parse presets from localStorage', e);\n }\n }\n\n private saveToStorage(): void {\n if (typeof localStorage === 'undefined') return;\n\n try {\n localStorage.setItem(STORAGE_PRESETS_KEY, JSON.stringify(this.presets));\n if (this.activePresetId) {\n localStorage.setItem(STORAGE_ACTIVE_PRESET_KEY, this.activePresetId);\n } else {\n localStorage.removeItem(STORAGE_ACTIVE_PRESET_KEY);\n }\n } catch (e) {\n console.warn('[lamba] Failed to save presets to localStorage', e);\n }\n }\n\n public getPresets(): PresetProfile[] {\n return [...this.presets];\n }\n\n public getActivePresetId(): string | null {\n return this.activePresetId;\n }\n\n public createPreset(name: string, overrides: Record<string, string>): PresetProfile {\n const newPreset: PresetProfile = {\n id: 'preset_' + Math.random().toString(36).substring(2, 9),\n name: name.trim() || 'Untitled Preset',\n overrides: { ...overrides },\n createdAt: Date.now(),\n };\n\n this.presets.push(newPreset);\n this.saveToStorage();\n return newPreset;\n }\n\n public deletePreset(id: string): void {\n this.presets = this.presets.filter((p) => p.id !== id);\n if (this.activePresetId === id) {\n this.activePresetId = null;\n }\n this.saveToStorage();\n }\n\n public setActivePreset(id: string | null): PresetProfile | null {\n if (!id) {\n this.activePresetId = null;\n this.saveToStorage();\n return null;\n }\n\n const preset = this.presets.find((p) => p.id === id);\n if (preset) {\n this.activePresetId = id;\n this.saveToStorage();\n return preset;\n }\n return null;\n }\n}\n","/**\n * Parses raw .env string into a key-value Record.\n */\nexport function parseEnvString(rawText: string): Record<string, string> {\n const result: Record<string, string> = {};\n const lines = rawText.split('\\n');\n\n for (let line of lines) {\n line = line.trim();\n if (!line || line.startsWith('#')) continue;\n\n if (line.startsWith('export ')) {\n line = line.slice(7).trim();\n }\n\n const equalsIdx = line.indexOf('=');\n if (equalsIdx === -1) continue;\n\n const key = line.slice(0, equalsIdx).trim();\n let val = line.slice(equalsIdx + 1).trim();\n\n // Remove quotes if wrapped in single or double quotes\n if (\n (val.startsWith('\"') && val.endsWith('\"')) ||\n (val.startsWith(\"'\") && val.endsWith(\"'\"))\n ) {\n val = val.slice(1, -1);\n }\n\n // Replace escaped newlines\n val = val.replace(/\\\\n/g, '\\n');\n\n if (key) {\n result[key] = val;\n }\n }\n\n return result;\n}\n\n/**\n * Stringifies a Record<string, string> into standard .env format.\n */\nexport function stringifyEnv(env: Record<string, string>): string {\n return Object.entries(env)\n .map(([key, val]) => {\n const needsQuotes = val.includes(' ') || val.includes('\\n') || val.includes('#');\n const formattedVal = needsQuotes ? `\"${val.replace(/\"/g, '\\\\\"')}\"` : val;\n return `${key}=${formattedVal}`;\n })\n .join('\\n');\n}\n\n/**\n * Auto-discovers environment variables available in the current browser runtime.\n */\nexport function autoDiscoverBrowserEnv(): Record<string, string> {\n const discovered: Record<string, string> = {};\n\n if (typeof window === 'undefined') return discovered;\n\n const extractPrimitiveProps = (obj: any) => {\n if (!obj || typeof obj !== 'object') return;\n for (const [k, v] of Object.entries(obj)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n discovered[k] = String(v);\n }\n }\n };\n\n // 1. Inspect window.process.env\n try {\n const winProcess = (window as any).process;\n if (winProcess && winProcess.env && typeof winProcess.env === 'object') {\n extractPrimitiveProps(winProcess.env);\n }\n } catch (e) {}\n\n // 2. Inspect Next.js __NEXT_DATA__ env & runtimeConfig\n try {\n const nextData = (window as any).__NEXT_DATA__;\n if (nextData) {\n if (nextData.env) extractPrimitiveProps(nextData.env);\n if (nextData.runtimeConfig?.public) extractPrimitiveProps(nextData.runtimeConfig.public);\n }\n } catch (e) {}\n\n // 3. Inspect Nuxt __NUXT__ public runtime config\n try {\n const nuxtData = (window as any).__NUXT__;\n if (nuxtData?.config?.public) {\n extractPrimitiveProps(nuxtData.config.public);\n }\n } catch (e) {}\n\n // 4. Inspect window.__ENV__ or window.ENV or window.PUBLIC_ENV\n try {\n const win = window as any;\n const customEnv = win.__ENV__ || win.ENV || win.PUBLIC_ENV || win.__LAMBA_ENV__;\n if (customEnv) {\n extractPrimitiveProps(customEnv);\n }\n } catch (e) {}\n\n // 5. Inspect HTML meta tags (e.g. <meta name=\"env:API_KEY\" content=\"xyz\"> or <meta name=\"lamba-env\" content=\"API_KEY=xyz&MODE=dev\">)\n try {\n const metaTags = document.querySelectorAll('meta');\n metaTags.forEach((meta) => {\n const name = meta.getAttribute('name');\n const content = meta.getAttribute('content');\n if (!name || content === null) return;\n\n if (name.startsWith('env:')) {\n const key = name.slice(4);\n discovered[key] = content;\n } else if (name === 'lamba-env') {\n const parsed = new URLSearchParams(content);\n parsed.forEach((val, key) => {\n discovered[key] = val;\n });\n }\n });\n } catch (e) {}\n\n return discovered;\n}\n\n/**\n * Attempts to fetch /.env or /.env.example from root URL if hosted in dev mode.\n */\nexport async function tryFetchRootEnvFile(): Promise<Record<string, string>> {\n const paths = ['/.env', '/.env.local', '/.env.example'];\n for (const path of paths) {\n try {\n const res = await fetch(path, { headers: { Accept: 'text/plain' } });\n if (res.ok) {\n const text = await res.text();\n if (text && text.includes('=')) {\n return parseEnvString(text);\n }\n }\n } catch (e) {\n // Ignore network errors in production or non-accessible env files\n }\n }\n return {};\n}\n","import {\n EnvVariable,\n EnvChangeListener,\n StoreChangeListener,\n LambaOptions,\n PresetProfile,\n} from './types';\nimport { PresetManager } from './preset-manager';\nimport { autoDiscoverBrowserEnv, tryFetchRootEnvFile } from './env-parser';\n\nconst STORAGE_OVERRIDES_KEY = '__lamba_overrides__';\nconst DEFAULT_SECRET_PATTERN = /(KEY|SECRET|TOKEN|PASSWORD|AUTH|PRIVATE|CREDENTIAL|SIGNATURE)/i;\n\nexport class EnvStore {\n private variables: Map<string, EnvVariable> = new Map();\n private overrides: Record<string, string> = {};\n private secretPattern: RegExp;\n private allowedPrefixes?: string | string[] | RegExp | null;\n private envChangeListeners: Set<EnvChangeListener> = new Set();\n private storeChangeListeners: Set<StoreChangeListener> = new Set();\n public presetManager: PresetManager;\n\n constructor(options: LambaOptions = {}) {\n this.secretPattern = options.secretKeysPattern || DEFAULT_SECRET_PATTERN;\n this.allowedPrefixes = options.allowedPrefixes;\n this.presetManager = new PresetManager();\n\n // 1. Load initial overrides from localStorage\n this.loadOverridesFromStorage();\n\n // 2. Register initial options.env if provided\n if (options.env) {\n this.mergeDefaults(options.env);\n }\n\n // 3. Auto-discover from browser runtime\n const autoDiscovered = autoDiscoverBrowserEnv();\n this.mergeDefaults(autoDiscovered);\n\n // 4. Try fetching root /.env file if explicitly enabled\n if (options.autoFetchEnvFile === true && typeof window !== 'undefined') {\n tryFetchRootEnvFile().then((fileEnv) => {\n if (Object.keys(fileEnv).length > 0) {\n this.mergeDefaults(fileEnv);\n }\n });\n }\n\n\n // 5. Patch window.process.env\n this.patchProcessEnv();\n }\n\n private loadOverridesFromStorage(): void {\n if (typeof localStorage === 'undefined') return;\n try {\n const stored = localStorage.getItem(STORAGE_OVERRIDES_KEY);\n if (stored) {\n this.overrides = JSON.parse(stored);\n }\n } catch (e) {\n console.warn('[lamba] Failed to parse overrides from localStorage', e);\n }\n }\n\n private saveOverridesToStorage(): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.setItem(STORAGE_OVERRIDES_KEY, JSON.stringify(this.overrides));\n } catch (e) {\n console.warn('[lamba] Failed to save overrides to localStorage', e);\n }\n }\n\n /**\n */\n private patchProcessEnv(): void {\n if (typeof window === 'undefined') return;\n\n const win = window as any;\n if (!win.process) {\n win.process = { env: {} };\n } else if (!win.process.env) {\n win.process.env = {};\n }\n\n const self = this;\n const targetEnv = win.process.env;\n\n // Use Proxy if supported\n try {\n win.process.env = new Proxy(targetEnv, {\n get(target, prop: string) {\n if (typeof prop === 'string') {\n const val = self.get(prop);\n if (val !== undefined) return val;\n }\n return target[prop];\n },\n set(target, prop: string, value: any) {\n target[prop] = value;\n return true;\n },\n });\n } catch (e) {\n // Fallback for environment where Proxy is restricted\n }\n }\n\n /**\n * Checks if an environment variable key satisfies the allowedPrefixes option.\n */\n public isAllowedKey(key: string): boolean {\n if (!this.allowedPrefixes) return true;\n\n if (typeof this.allowedPrefixes === 'string') {\n return key.startsWith(this.allowedPrefixes);\n }\n\n if (Array.isArray(this.allowedPrefixes)) {\n if (this.allowedPrefixes.length === 0) return true;\n return this.allowedPrefixes.some((p) => key.startsWith(p));\n }\n\n if (this.allowedPrefixes instanceof RegExp) {\n return this.allowedPrefixes.test(key);\n }\n\n return true;\n }\n\n public mergeDefaults(env: Record<string, string>): void {\n let changed = false;\n for (const [key, defaultValue] of Object.entries(env)) {\n if (!this.isAllowedKey(key)) continue;\n\n const isOverridden = key in this.overrides;\n const currentValue = isOverridden ? this.overrides[key] : defaultValue;\n const isSecret = this.secretPattern.test(key);\n\n const existing = this.variables.get(key);\n if (!existing) {\n this.variables.set(key, {\n key,\n value: currentValue,\n defaultValue,\n isOverridden,\n isSecret,\n });\n changed = true;\n } else {\n // Update default value if changed\n if (existing.defaultValue !== defaultValue) {\n existing.defaultValue = defaultValue;\n if (!existing.isOverridden) {\n existing.value = defaultValue;\n }\n changed = true;\n }\n }\n }\n\n if (changed) {\n this.notifyStoreChanged();\n }\n }\n\n public get(key: string, fallback?: string): string | undefined {\n if (key in this.overrides) {\n return this.overrides[key];\n }\n const item = this.variables.get(key);\n if (item) return item.value;\n return fallback;\n }\n\n public getAll(): Record<string, EnvVariable> {\n const result: Record<string, EnvVariable> = {};\n this.variables.forEach((varObj, key) => {\n result[key] = { ...varObj };\n });\n return result;\n }\n\n public getOverrides(): Record<string, string> {\n return { ...this.overrides };\n }\n\n public setOverride(key: string, value: string): void {\n const trimmedKey = key.trim();\n if (!trimmedKey) return;\n\n this.overrides[trimmedKey] = value;\n this.saveOverridesToStorage();\n\n let item = this.variables.get(trimmedKey);\n if (!item) {\n item = {\n key: trimmedKey,\n value,\n defaultValue: '',\n isOverridden: true,\n isSecret: this.secretPattern.test(trimmedKey),\n };\n this.variables.set(trimmedKey, item);\n } else {\n item.value = value;\n item.isOverridden = true;\n }\n\n this.emitEnvChange(trimmedKey, value, true);\n this.notifyStoreChanged();\n }\n\n public removeOverride(key: string): void {\n if (key in this.overrides) {\n delete this.overrides[key];\n this.saveOverridesToStorage();\n\n const item = this.variables.get(key);\n if (item) {\n item.value = item.defaultValue;\n item.isOverridden = false;\n this.emitEnvChange(key, item.value, false);\n }\n\n this.notifyStoreChanged();\n }\n }\n\n public resetAllOverrides(): void {\n const keys = Object.keys(this.overrides);\n this.overrides = {};\n this.saveOverridesToStorage();\n this.presetManager.setActivePreset(null);\n\n keys.forEach((key) => {\n const item = this.variables.get(key);\n if (item) {\n item.value = item.defaultValue;\n item.isOverridden = false;\n this.emitEnvChange(key, item.value, false);\n }\n });\n\n this.notifyStoreChanged();\n }\n\n public applyPreset(presetId: string | null): void {\n const preset = this.presetManager.setActivePreset(presetId);\n this.overrides = preset ? { ...preset.overrides } : {};\n this.saveOverridesToStorage();\n\n // Re-evaluate all variables\n this.variables.forEach((item, key) => {\n if (key in this.overrides) {\n item.value = this.overrides[key];\n item.isOverridden = true;\n } else {\n item.value = item.defaultValue;\n item.isOverridden = false;\n }\n this.emitEnvChange(key, item.value, item.isOverridden);\n });\n\n // Also include extra override keys from preset that weren't in variables\n if (preset) {\n for (const [key, value] of Object.entries(preset.overrides)) {\n if (!this.variables.has(key)) {\n this.variables.set(key, {\n key,\n value,\n defaultValue: '',\n isOverridden: true,\n isSecret: this.secretPattern.test(key),\n });\n this.emitEnvChange(key, value, true);\n }\n }\n }\n\n this.notifyStoreChanged();\n }\n\n public subscribeEnvChange(listener: EnvChangeListener): () => void {\n this.envChangeListeners.add(listener);\n return () => this.envChangeListeners.delete(listener);\n }\n\n public subscribeStoreChange(listener: StoreChangeListener): () => void {\n this.storeChangeListeners.add(listener);\n return () => this.storeChangeListeners.delete(listener);\n }\n\n private emitEnvChange(key: string, value: string, isOverridden: boolean): void {\n this.envChangeListeners.forEach((fn) => fn(key, value, isOverridden));\n\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('lamba:env-change', {\n detail: { key, value, isOverridden },\n })\n );\n }\n }\n\n private notifyStoreChanged(): void {\n const varsObj = this.getAll();\n const presets = this.presetManager.getPresets();\n const activePresetId = this.presetManager.getActivePresetId();\n this.storeChangeListeners.forEach((fn) => fn(varsObj, presets, activePresetId));\n }\n}\n","import { EnvStore } from './store';\n\nexport class NetworkInterceptor {\n private store: EnvStore;\n private originalFetch: typeof window.fetch | null = null;\n private originalXHRPost: typeof XMLHttpRequest.prototype.open | null = null;\n private isIntercepting: boolean = false;\n\n constructor(store: EnvStore) {\n this.store = store;\n }\n\n public enable(): void {\n if (typeof window === 'undefined' || this.isIntercepting) return;\n\n this.patchFetch();\n this.patchXHR();\n this.isIntercepting = true;\n }\n\n public disable(): void {\n if (typeof window === 'undefined' || !this.isIntercepting) return;\n\n if (this.originalFetch) {\n window.fetch = this.originalFetch;\n this.originalFetch = null;\n }\n if (this.originalXHRPost) {\n XMLHttpRequest.prototype.open = this.originalXHRPost;\n this.originalXHRPost = null;\n }\n this.isIntercepting = false;\n }\n\n /**\n * Rewrite a given URL by checking if any default env variable URL value matches\n * and replacing it with the active overridden value.\n */\n public rewriteUrl(url: string | URL | Request): string | URL | Request {\n if (typeof url !== 'string') return url;\n\n const allVars = this.store.getAll();\n let resultUrl = url;\n\n for (const varObj of Object.values(allVars)) {\n if (varObj.isOverridden && varObj.defaultValue && varObj.value) {\n // Trim trailing slashes for accurate matching\n const defaultBase = varObj.defaultValue.replace(/\\/+$/, '');\n const overrideBase = varObj.value.replace(/\\/+$/, '');\n\n if (defaultBase && resultUrl.includes(defaultBase)) {\n resultUrl = resultUrl.replace(defaultBase, overrideBase);\n }\n }\n }\n\n return resultUrl;\n }\n\n private patchFetch(): void {\n if (!window.fetch) return;\n\n this.originalFetch = window.fetch;\n const self = this;\n\n window.fetch = function (input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n let finalInput = input;\n\n if (typeof input === 'string') {\n finalInput = self.rewriteUrl(input) as string;\n } else if (input instanceof URL) {\n const rewritten = self.rewriteUrl(input.toString()) as string;\n finalInput = new URL(rewritten);\n } else if (input instanceof Request) {\n const rewrittenUrl = self.rewriteUrl(input.url) as string;\n if (rewrittenUrl !== input.url) {\n finalInput = new Request(rewrittenUrl, input);\n }\n }\n\n return self.originalFetch!.call(this, finalInput, init);\n };\n }\n\n private patchXHR(): void {\n if (!window.XMLHttpRequest) return;\n\n this.originalXHRPost = XMLHttpRequest.prototype.open;\n const self = this;\n\n XMLHttpRequest.prototype.open = function (\n method: string,\n url: string | URL,\n async: boolean = true,\n username?: string | null,\n password?: string | null\n ): void {\n const stringUrl = typeof url === 'string' ? url : url.toString();\n const rewrittenUrl = self.rewriteUrl(stringUrl) as string;\n\n return self.originalXHRPost!.call(\n this,\n method,\n rewrittenUrl,\n async,\n username ?? null,\n password ?? null\n );\n };\n }\n}\n","export const LAMBA_STYLES = `\n:host {\n --lamba-bg-main: #0f172a;\n --lamba-bg-card: #1e293b;\n --lamba-bg-hover: #334155;\n --lamba-border: rgba(255, 255, 255, 0.1);\n --lamba-text-primary: #f8fafc;\n --lamba-text-secondary: #94a3b8;\n --lamba-primary: #6366f1;\n --lamba-primary-hover: #4f46e5;\n --lamba-accent: #06b6d4;\n --lamba-success: #10b981;\n --lamba-danger: #ef4444;\n --lamba-warning: #f59e0b;\n --lamba-font: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n --lamba-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.5), 0 8px 10px -6px rgba(0, 0, 0, 0.4);\n\n font-family: var(--lamba-font);\n font-size: 14px;\n line-height: 1.5;\n color: var(--lamba-text-primary);\n box-sizing: border-box;\n z-index: 999999;\n}\n\n*, *:before, *:after {\n box-sizing: border-box;\n}\n\n/* Floating Launcher Button */\n.lamba-launcher {\n position: fixed;\n z-index: 999999;\n width: 52px;\n height: 52px;\n border-radius: 50%;\n background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);\n color: #ffffff;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: 0 10px 15px -3px rgba(99, 102, 241, 0.4), 0 4px 6px -4px rgba(99, 102, 241, 0.2);\n border: 1px solid rgba(255, 255, 255, 0.2);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n user-select: none;\n}\n\n.lamba-launcher:hover {\n transform: scale(1.08);\n box-shadow: 0 14px 20px -3px rgba(99, 102, 241, 0.6), 0 6px 8px -4px rgba(99, 102, 241, 0.3);\n}\n\n.lamba-launcher:active {\n transform: scale(0.95);\n}\n\n.lamba-launcher-bottom-right { bottom: 24px; right: 24px; }\n.lamba-launcher-bottom-left { bottom: 24px; left: 24px; }\n.lamba-launcher-top-right { top: 24px; right: 24px; }\n.lamba-launcher-top-left { top: 24px; left: 24px; }\n\n.lamba-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n background: var(--lamba-accent);\n color: #000;\n font-size: 11px;\n font-weight: 700;\n min-width: 20px;\n height: 20px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 5px;\n border: 2px solid var(--lamba-bg-main);\n box-shadow: 0 2px 4px rgba(0,0,0,0.2);\n animation: pulse-scale 2s infinite;\n}\n\n@keyframes pulse-scale {\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.15); }\n}\n\n/* Modal Overlay */\n.lamba-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(15, 23, 42, 0.7);\n backdrop-filter: blur(8px);\n z-index: 999998;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.25s ease, visibility 0.25s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n}\n\n.lamba-overlay.active {\n opacity: 1;\n visibility: visible;\n}\n\n/* Main Modal Panel */\n.lamba-modal {\n width: 100%;\n max-width: 820px;\n max-height: 85vh;\n background: var(--lamba-bg-main);\n border: 1px solid var(--lamba-border);\n border-radius: 16px;\n box-shadow: var(--lamba-shadow);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transform: translateY(20px) scale(0.96);\n transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.lamba-overlay.active .lamba-modal {\n transform: translateY(0) scale(1);\n}\n\n/* Header */\n.lamba-header {\n padding: 20px 24px;\n border-bottom: 1px solid var(--lamba-border);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: rgba(30, 41, 59, 0.4);\n}\n\n.lamba-brand {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.lamba-logo {\n font-size: 18px;\n font-weight: 800;\n letter-spacing: -0.5px;\n background: linear-gradient(135deg, #a5b4fc 0%, #6366f1 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.lamba-tag {\n background: rgba(99, 102, 241, 0.15);\n color: #a5b4fc;\n font-size: 11px;\n padding: 2px 8px;\n border-radius: 6px;\n font-weight: 600;\n border: 1px solid rgba(99, 102, 241, 0.3);\n}\n\n.lamba-close-btn {\n background: transparent;\n border: none;\n color: var(--lamba-text-secondary);\n cursor: pointer;\n padding: 6px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.lamba-close-btn:hover {\n background: var(--lamba-bg-hover);\n color: var(--lamba-text-primary);\n}\n\n/* Controls Bar (Search & Filters) */\n.lamba-controls {\n padding: 16px 24px;\n border-bottom: 1px solid var(--lamba-border);\n display: flex;\n gap: 12px;\n align-items: center;\n flex-wrap: wrap;\n background: var(--lamba-bg-main);\n}\n\n.lamba-search-box {\n flex: 1;\n min-width: 220px;\n position: relative;\n}\n\n.lamba-search-input {\n width: 100%;\n padding: 10px 14px 10px 38px;\n background: var(--lamba-bg-card);\n border: 1px solid var(--lamba-border);\n border-radius: 8px;\n color: var(--lamba-text-primary);\n font-size: 13px;\n outline: none;\n transition: border-color 0.15s ease;\n}\n\n.lamba-search-input:focus {\n border-color: var(--lamba-primary);\n}\n\n.lamba-search-icon {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--lamba-text-secondary);\n pointer-events: none;\n}\n\n.lamba-tabs {\n display: flex;\n gap: 4px;\n background: var(--lamba-bg-card);\n padding: 4px;\n border-radius: 8px;\n border: 1px solid var(--lamba-border);\n}\n\n.lamba-tab {\n background: transparent;\n border: none;\n color: var(--lamba-text-secondary);\n padding: 6px 12px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.lamba-tab.active {\n background: var(--lamba-primary);\n color: #ffffff;\n}\n\n/* Preset Bar */\n.lamba-presets-bar {\n padding: 12px 24px;\n background: rgba(30, 41, 59, 0.3);\n border-bottom: 1px solid var(--lamba-border);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n\n.lamba-preset-selector {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n}\n\n.lamba-select {\n background: var(--lamba-bg-card);\n color: var(--lamba-text-primary);\n border: 1px solid var(--lamba-border);\n padding: 6px 12px;\n border-radius: 6px;\n outline: none;\n font-size: 13px;\n cursor: pointer;\n}\n\n/* List Content */\n.lamba-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.lamba-content::-webkit-scrollbar {\n width: 6px;\n}\n\n.lamba-content::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.lamba-content::-webkit-scrollbar-thumb {\n background: var(--lamba-bg-hover);\n border-radius: 3px;\n}\n\n/* Variable Row Card */\n.lamba-var-card {\n background: var(--lamba-bg-card);\n border: 1px solid var(--lamba-border);\n border-radius: 10px;\n padding: 14px 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n transition: border-color 0.15s ease;\n}\n\n.lamba-var-card.is-overridden {\n border-color: rgba(99, 102, 241, 0.5);\n background: linear-gradient(180deg, var(--lamba-bg-card) 0%, rgba(99, 102, 241, 0.05) 100%);\n}\n\n.lamba-var-meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.lamba-var-key {\n font-weight: 700;\n font-family: monospace;\n color: #a5b4fc;\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.lamba-modified-pill {\n font-size: 10px;\n font-weight: 700;\n background: rgba(16, 185, 129, 0.2);\n color: #34d399;\n padding: 2px 6px;\n border-radius: 4px;\n border: 1px solid rgba(16, 185, 129, 0.4);\n}\n\n.lamba-var-actions {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.lamba-icon-btn {\n background: transparent;\n border: none;\n color: var(--lamba-text-secondary);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.lamba-icon-btn:hover {\n background: var(--lamba-bg-hover);\n color: var(--lamba-text-primary);\n}\n\n.lamba-var-input-group {\n display: flex;\n gap: 8px;\n}\n\n.lamba-input {\n flex: 1;\n background: var(--lamba-bg-main);\n border: 1px solid var(--lamba-border);\n color: var(--lamba-text-primary);\n padding: 8px 12px;\n border-radius: 6px;\n font-family: monospace;\n font-size: 13px;\n outline: none;\n}\n\n.lamba-input:focus {\n border-color: var(--lamba-primary);\n}\n\n.lamba-diff {\n font-size: 11px;\n color: var(--lamba-text-secondary);\n font-family: monospace;\n padding-left: 2px;\n}\n\n.lamba-diff-val {\n color: var(--lamba-warning);\n}\n\n/* Empty State */\n.lamba-empty {\n padding: 40px 20px;\n text-align: center;\n color: var(--lamba-text-secondary);\n}\n\n/* Footer Actions Bar */\n.lamba-footer {\n padding: 16px 24px;\n border-top: 1px solid var(--lamba-border);\n background: rgba(30, 41, 59, 0.4);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.lamba-btn {\n background: var(--lamba-bg-card);\n color: var(--lamba-text-primary);\n border: 1px solid var(--lamba-border);\n padding: 8px 14px;\n border-radius: 8px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.15s ease;\n}\n\n.lamba-btn:hover {\n background: var(--lamba-bg-hover);\n}\n\n.lamba-btn-primary {\n background: var(--lamba-primary);\n border-color: var(--lamba-primary);\n color: #ffffff;\n}\n\n.lamba-btn-primary:hover {\n background: var(--lamba-primary-hover);\n}\n\n.lamba-btn-danger {\n background: rgba(239, 68, 68, 0.15);\n color: #fca5a5;\n border-color: rgba(239, 68, 68, 0.3);\n}\n\n.lamba-btn-danger:hover {\n background: rgba(239, 68, 68, 0.3);\n}\n`;\n","import { LAMBA_STYLES } from './styles';\n\nexport function createShadowHost(): { host: HTMLElement; shadowRoot: ShadowRoot } {\n if (typeof document === 'undefined') {\n throw new Error('[lamba] Document object not available.');\n }\n\n let host = document.getElementById('lamba-root') as HTMLElement;\n if (!host) {\n host = document.createElement('lamba-widget');\n host.id = 'lamba-root';\n document.body.appendChild(host);\n }\n\n let shadowRoot = host.shadowRoot;\n if (!shadowRoot) {\n shadowRoot = host.attachShadow({ mode: 'open' });\n\n // Inject styles\n const styleEl = document.createElement('style');\n styleEl.textContent = LAMBA_STYLES;\n shadowRoot.appendChild(styleEl);\n }\n\n return { host, shadowRoot };\n}\n","export class LauncherUI {\n private element: HTMLElement;\n private badgeElement: HTMLElement;\n private onClickCallback: () => void;\n\n constructor(\n container: ShadowRoot,\n position: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left' = 'bottom-right',\n onClick: () => void\n ) {\n this.onClickCallback = onClick;\n\n this.element = document.createElement('div');\n this.element.className = `lamba-launcher lamba-launcher-${position}`;\n this.element.title = 'Open lamba Environment Controls';\n\n // SVG Settings Icon\n this.element.innerHTML = `\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\"/>\n <circle cx=\"12\" cy=\"12\" r=\"3\"/>\n </svg>\n `;\n\n // Counter Badge\n this.badgeElement = document.createElement('div');\n this.badgeElement.className = 'lamba-badge';\n this.badgeElement.style.display = 'none';\n this.element.appendChild(this.badgeElement);\n\n this.element.addEventListener('click', () => this.onClickCallback());\n container.appendChild(this.element);\n }\n\n public updateBadgeCount(count: number): void {\n if (count > 0) {\n this.badgeElement.textContent = String(count);\n this.badgeElement.style.display = 'flex';\n } else {\n this.badgeElement.style.display = 'none';\n }\n }\n\n public setVisible(visible: boolean): void {\n this.element.style.display = visible ? 'flex' : 'none';\n }\n}\n","import { EnvStore } from '../core/store';\nimport { EnvVariable, PresetProfile } from '../core/types';\nimport { parseEnvString, stringifyEnv } from '../core/env-parser';\n\nexport class ModalUI {\n private overlay: HTMLElement;\n private modal: HTMLElement;\n private contentList: HTMLElement;\n private searchInput: HTMLInputElement;\n private tabAllBtn: HTMLElement;\n private tabOverriddenBtn: HTMLElement;\n private tabSecretsBtn: HTMLElement;\n private presetSelect: HTMLSelectElement;\n private savePresetBtn: HTMLElement;\n private activeTab: 'all' | 'overridden' | 'secrets' = 'all';\n private searchQuery: string = '';\n private store: EnvStore;\n private secretVisibilityMap: Map<string, boolean> = new Map();\n private isOpen: boolean = false;\n\n constructor(container: ShadowRoot, store: EnvStore, onClose: () => void) {\n this.store = store;\n\n // Build DOM layout\n this.overlay = document.createElement('div');\n this.overlay.className = 'lamba-overlay';\n\n this.modal = document.createElement('div');\n this.modal.className = 'lamba-modal';\n\n // Header\n const header = document.createElement('div');\n header.className = 'lamba-header';\n header.innerHTML = `\n <div class=\"lamba-brand\">\n <div class=\"lamba-logo\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5\"/>\n </svg>\n lamba\n </div>\n <span class=\"lamba-tag\">Dev Environment Override</span>\n </div>\n <button class=\"lamba-close-btn\" title=\"Close modal\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n `;\n header.querySelector('.lamba-close-btn')?.addEventListener('click', () => {\n this.close();\n onClose();\n });\n\n // Controls Bar (Search & Filter Tabs)\n const controls = document.createElement('div');\n controls.className = 'lamba-controls';\n\n const searchBox = document.createElement('div');\n searchBox.className = 'lamba-search-box';\n searchBox.innerHTML = `\n <svg class=\"lamba-search-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n <input type=\"text\" class=\"lamba-search-input\" placeholder=\"Search environment keys or values...\" />\n `;\n this.searchInput = searchBox.querySelector('.lamba-search-input') as HTMLInputElement;\n this.searchInput.addEventListener('input', (e) => {\n this.searchQuery = (e.target as HTMLInputElement).value.toLowerCase();\n this.render();\n });\n\n const tabs = document.createElement('div');\n tabs.className = 'lamba-tabs';\n tabs.innerHTML = `\n <button class=\"lamba-tab active\" data-tab=\"all\">All</button>\n <button class=\"lamba-tab\" data-tab=\"overridden\">Modified</button>\n <button class=\"lamba-tab\" data-tab=\"secrets\">Secrets</button>\n `;\n\n this.tabAllBtn = tabs.querySelector('[data-tab=\"all\"]') as HTMLElement;\n this.tabOverriddenBtn = tabs.querySelector('[data-tab=\"overridden\"]') as HTMLElement;\n this.tabSecretsBtn = tabs.querySelector('[data-tab=\"secrets\"]') as HTMLElement;\n\n tabs.querySelectorAll('.lamba-tab').forEach((btn) => {\n btn.addEventListener('click', (e) => {\n tabs.querySelectorAll('.lamba-tab').forEach((t) => t.classList.remove('active'));\n const target = e.currentTarget as HTMLElement;\n target.classList.add('active');\n this.activeTab = target.getAttribute('data-tab') as any;\n this.render();\n });\n });\n\n controls.appendChild(searchBox);\n controls.appendChild(tabs);\n\n // Presets Bar\n const presetsBar = document.createElement('div');\n presetsBar.className = 'lamba-presets-bar';\n presetsBar.innerHTML = `\n <div class=\"lamba-preset-selector\">\n <span style=\"color: var(--lamba-text-secondary); font-weight: 600;\">Preset Profile:</span>\n <select class=\"lamba-select lamba-preset-dropdown\">\n <option value=\"\">Default (Current Overrides)</option>\n </select>\n </div>\n <button class=\"lamba-btn lamba-save-preset-btn\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\"></path>\n <polyline points=\"17 21 17 13 7 13 7 21\"></polyline>\n <polyline points=\"7 3 7 8 15 8\"></polyline>\n </svg>\n Save as Preset\n </button>\n `;\n\n this.presetSelect = presetsBar.querySelector('.lamba-preset-dropdown') as HTMLSelectElement;\n this.presetSelect.addEventListener('change', () => {\n const selectedId = this.presetSelect.value || null;\n this.store.applyPreset(selectedId);\n });\n\n this.savePresetBtn = presetsBar.querySelector('.lamba-save-preset-btn') as HTMLElement;\n this.savePresetBtn.addEventListener('click', () => {\n const name = prompt('Enter a name for this Environment Preset Profile:', 'Staging Environment');\n if (name) {\n const overrides = this.store.getOverrides();\n this.store.presetManager.createPreset(name, overrides);\n this.updatePresetDropdown();\n }\n });\n\n // Content List Container\n this.contentList = document.createElement('div');\n this.contentList.className = 'lamba-content';\n\n // Footer Bar\n const footer = document.createElement('div');\n footer.className = 'lamba-footer';\n footer.innerHTML = `\n <div style=\"display: flex; gap: 8px;\">\n <button class=\"lamba-btn lamba-add-var-btn\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\n </svg>\n Add Variable\n </button>\n <button class=\"lamba-btn lamba-import-btn\">Import .env</button>\n <button class=\"lamba-btn lamba-export-btn\">Export .env</button>\n </div>\n <div style=\"display: flex; gap: 8px;\">\n <button class=\"lamba-btn lamba-btn-danger lamba-reset-all-btn\">Reset All</button>\n <button class=\"lamba-btn lamba-btn-primary lamba-reload-btn\">Reload Page</button>\n </div>\n `;\n\n footer.querySelector('.lamba-add-var-btn')?.addEventListener('click', () => {\n const key = prompt('Enter new environment variable key name (e.g. API_URL, NEXT_PUBLIC_API_URL, REACT_APP_API_URL, VITE_API_URL):');\n if (key) {\n const value = prompt(`Enter value for ${key}:`) || '';\n this.store.setOverride(key, value);\n }\n });\n\n footer.querySelector('.lamba-import-btn')?.addEventListener('click', () => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.env,.txt';\n input.onchange = (e: any) => {\n const file = e.target.files[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (event) => {\n const content = event.target?.result as string;\n if (content) {\n const parsed = parseEnvString(content);\n for (const [k, v] of Object.entries(parsed)) {\n this.store.setOverride(k, v);\n }\n }\n };\n reader.readAsText(file);\n }\n };\n input.click();\n });\n\n footer.querySelector('.lamba-export-btn')?.addEventListener('click', () => {\n const allVars = this.store.getAll();\n const exportObj: Record<string, string> = {};\n for (const [k, v] of Object.entries(allVars)) {\n exportObj[k] = v.value;\n }\n const envText = stringifyEnv(exportObj);\n const blob = new Blob([envText], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = '.env';\n a.click();\n URL.revokeObjectURL(url);\n });\n\n footer.querySelector('.lamba-reset-all-btn')?.addEventListener('click', () => {\n if (confirm('Are you sure you want to reset all overridden environment variables?')) {\n this.store.resetAllOverrides();\n }\n });\n\n footer.querySelector('.lamba-reload-btn')?.addEventListener('click', () => {\n window.location.reload();\n });\n\n // Assemble modal structure\n this.modal.appendChild(header);\n this.modal.appendChild(controls);\n this.modal.appendChild(presetsBar);\n this.modal.appendChild(this.contentList);\n this.modal.appendChild(footer);\n this.overlay.appendChild(this.modal);\n\n // Close on overlay background click\n this.overlay.addEventListener('click', (e) => {\n if (e.target === this.overlay) {\n this.close();\n onClose();\n }\n });\n\n container.appendChild(this.overlay);\n\n // Subscribe to store updates\n this.store.subscribeStoreChange(() => {\n if (this.isOpen) {\n this.updatePresetDropdown();\n this.render();\n }\n });\n }\n\n public open(): void {\n this.isOpen = true;\n this.updatePresetDropdown();\n this.render();\n this.overlay.classList.add('active');\n }\n\n public close(): void {\n this.isOpen = false;\n this.overlay.classList.remove('active');\n }\n\n public toggle(): void {\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n }\n\n private updatePresetDropdown(): void {\n const presets = this.store.presetManager.getPresets();\n const activeId = this.store.presetManager.getActivePresetId();\n\n this.presetSelect.innerHTML = `<option value=\"\">Default (Custom Overrides)</option>`;\n presets.forEach((p) => {\n const opt = document.createElement('option');\n opt.value = p.id;\n opt.textContent = p.name;\n if (p.id === activeId) opt.selected = true;\n this.presetSelect.appendChild(opt);\n });\n }\n\n public render(): void {\n const allVarsMap = this.store.getAll();\n let varList = Object.values(allVarsMap);\n\n // Filter by Tab\n if (this.activeTab === 'overridden') {\n varList = varList.filter((v) => v.isOverridden);\n } else if (this.activeTab === 'secrets') {\n varList = varList.filter((v) => v.isSecret);\n }\n\n // Filter by Search Query\n if (this.searchQuery) {\n varList = varList.filter(\n (v) =>\n v.key.toLowerCase().includes(this.searchQuery) ||\n v.value.toLowerCase().includes(this.searchQuery)\n );\n }\n\n // Sort by overridden first, then alphabetically\n varList.sort((a, b) => {\n if (a.isOverridden !== b.isOverridden) {\n return a.isOverridden ? -1 : 1;\n }\n return a.key.localeCompare(b.key);\n });\n\n this.contentList.innerHTML = '';\n\n if (varList.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'lamba-empty';\n empty.textContent =\n this.searchQuery || this.activeTab !== 'all'\n ? 'No environment variables match your current filter.'\n : 'No environment variables found or registered. Click \"+ Add Variable\" or \"Import .env\" to get started.';\n this.contentList.appendChild(empty);\n return;\n }\n\n varList.forEach((varItem) => {\n const card = this.createVarCard(varItem);\n this.contentList.appendChild(card);\n });\n }\n\n private createVarCard(varItem: EnvVariable): HTMLElement {\n const card = document.createElement('div');\n card.className = `lamba-var-card ${varItem.isOverridden ? 'is-overridden' : ''}`;\n\n const isVisible = this.secretVisibilityMap.get(varItem.key) ?? !varItem.isSecret;\n\n card.innerHTML = `\n <div class=\"lamba-var-meta\">\n <div class=\"lamba-var-key\">\n ${varItem.key}\n ${varItem.isOverridden ? '<span class=\"lamba-modified-pill\">MODIFIED</span>' : ''}\n ${varItem.isSecret ? '<span style=\"font-size:10px; color:var(--lamba-warning); font-weight:600;\">SECRET</span>' : ''}\n </div>\n <div class=\"lamba-var-actions\">\n ${\n varItem.isSecret\n ? `<button class=\"lamba-icon-btn toggle-secret-btn\" title=\"${isVisible ? 'Hide secret' : 'Show secret'}\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n ${\n isVisible\n ? '<path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>'\n : '<path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"/><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"/>'\n }\n </svg>\n </button>`\n : ''\n }\n ${\n varItem.isOverridden\n ? `<button class=\"lamba-icon-btn reset-var-btn\" title=\"Reset to default\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"/>\n <path d=\"M3 3v5h5\"/>\n </svg>\n </button>`\n : ''\n }\n </div>\n </div>\n <div class=\"lamba-var-input-group\">\n <input \n type=\"${isVisible ? 'text' : 'password'}\" \n class=\"lamba-input var-input\" \n value=\"${this.escapeHtml(varItem.value)}\" \n placeholder=\"Value...\"\n />\n </div>\n ${\n varItem.isOverridden && varItem.defaultValue\n ? `<div class=\"lamba-diff\">Original default: <span class=\"lamba-diff-val\">${this.escapeHtml(\n varItem.defaultValue\n )}</span></div>`\n : ''\n }\n `;\n\n const inputEl = card.querySelector('.var-input') as HTMLInputElement;\n inputEl.addEventListener('change', () => {\n this.store.setOverride(varItem.key, inputEl.value);\n });\n\n card.querySelector('.toggle-secret-btn')?.addEventListener('click', () => {\n this.secretVisibilityMap.set(varItem.key, !isVisible);\n this.render();\n });\n\n card.querySelector('.reset-var-btn')?.addEventListener('click', () => {\n this.store.removeOverride(varItem.key);\n });\n\n return card;\n }\n\n private escapeHtml(str: string): string {\n return str\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":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/preset-manager.ts","../src/core/env-parser.ts","../src/core/store.ts","../src/core/network-interceptor.ts","../src/ui/styles.ts","../src/ui/shadow-dom.ts","../src/ui/launcher.ts","../src/ui/modal.ts"],"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';\n","import { PresetProfile } from './types';\n\nconst STORAGE_PRESETS_KEY = '__lamba_presets__';\nconst STORAGE_ACTIVE_PRESET_KEY = '__lamba_active_preset__';\n\nexport class PresetManager {\n private presets: PresetProfile[] = [];\n private activePresetId: string | null = null;\n\n constructor() {\n this.loadFromStorage();\n }\n\n private loadFromStorage(): void {\n if (typeof localStorage === 'undefined') return;\n\n try {\n const rawPresets = localStorage.getItem(STORAGE_PRESETS_KEY);\n if (rawPresets) {\n this.presets = JSON.parse(rawPresets);\n }\n this.activePresetId = localStorage.getItem(STORAGE_ACTIVE_PRESET_KEY);\n } catch (e) {\n console.warn('[lamba] Failed to parse presets from localStorage', e);\n }\n }\n\n private saveToStorage(): void {\n if (typeof localStorage === 'undefined') return;\n\n try {\n localStorage.setItem(STORAGE_PRESETS_KEY, JSON.stringify(this.presets));\n if (this.activePresetId) {\n localStorage.setItem(STORAGE_ACTIVE_PRESET_KEY, this.activePresetId);\n } else {\n localStorage.removeItem(STORAGE_ACTIVE_PRESET_KEY);\n }\n } catch (e) {\n console.warn('[lamba] Failed to save presets to localStorage', e);\n }\n }\n\n public getPresets(): PresetProfile[] {\n return [...this.presets];\n }\n\n public getActivePresetId(): string | null {\n return this.activePresetId;\n }\n\n public createPreset(name: string, overrides: Record<string, 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","import {\n EnvVariable,\n EnvChangeListener,\n StoreChangeListener,\n LambaOptions,\n PresetProfile,\n} from './types';\nimport { PresetManager } from './preset-manager';\nimport { autoDiscoverBrowserEnv, tryFetchRootEnvFile } from './env-parser';\n\nconst STORAGE_OVERRIDES_KEY = '__lamba_overrides__';\nconst DEFAULT_SECRET_PATTERN = /(KEY|SECRET|TOKEN|PASSWORD|AUTH|PRIVATE|CREDENTIAL|SIGNATURE)/i;\n\nexport class EnvStore {\n private variables: Map<string, EnvVariable> = new Map();\n private overrides: Record<string, 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 presetManager: PresetManager;\n\n constructor(options: LambaOptions = {}) {\n this.secretPattern = options.secretKeysPattern || DEFAULT_SECRET_PATTERN;\n this.allowedPrefixes = options.allowedPrefixes;\n this.presetManager = new PresetManager();\n\n // 1. Load initial overrides from localStorage\n this.loadOverridesFromStorage();\n\n // 2. Register initial options.env if provided\n if (options.env) {\n this.mergeDefaults(options.env);\n }\n\n // 3. Auto-discover from browser runtime\n const autoDiscovered = autoDiscoverBrowserEnv();\n this.mergeDefaults(autoDiscovered);\n\n // 4. Try fetching root /.env file if explicitly enabled\n if (options.autoFetchEnvFile === true && typeof window !== 'undefined') {\n tryFetchRootEnvFile().then((fileEnv) => {\n if (Object.keys(fileEnv).length > 0) {\n this.mergeDefaults(fileEnv);\n }\n });\n }\n\n\n // 5. Patch window.process.env\n this.patchProcessEnv();\n }\n\n private loadOverridesFromStorage(): void {\n if (typeof localStorage === 'undefined') return;\n try {\n const stored = localStorage.getItem(STORAGE_OVERRIDES_KEY);\n if (stored) {\n this.overrides = JSON.parse(stored);\n }\n } catch (e) {\n console.warn('[lamba] Failed to parse overrides from localStorage', e);\n }\n }\n\n private saveOverridesToStorage(): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.setItem(STORAGE_OVERRIDES_KEY, JSON.stringify(this.overrides));\n } catch (e) {\n console.warn('[lamba] Failed to save overrides to localStorage', e);\n }\n }\n\n /**\n */\n private patchProcessEnv(): void {\n if (typeof window === 'undefined') return;\n\n const win = window as any;\n if (!win.process) {\n win.process = { env: {} };\n } else if (!win.process.env) {\n win.process.env = {};\n }\n\n const self = this;\n const targetEnv = win.process.env;\n\n // Use Proxy if supported\n try {\n win.process.env = new Proxy(targetEnv, {\n get(target, prop: string) {\n if (typeof prop === 'string') {\n const val = self.get(prop);\n if (val !== undefined) return val;\n }\n return target[prop];\n },\n set(target, prop: string, value: any) {\n target[prop] = value;\n return true;\n },\n });\n } catch (e) {\n // Fallback for environment where Proxy is restricted\n }\n }\n\n /**\n * Checks if an environment variable key satisfies the allowedPrefixes option.\n */\n public isAllowedKey(key: string): boolean {\n if (!this.allowedPrefixes) return true;\n\n if (typeof this.allowedPrefixes === 'string') {\n return key.startsWith(this.allowedPrefixes);\n }\n\n if (Array.isArray(this.allowedPrefixes)) {\n if (this.allowedPrefixes.length === 0) return true;\n return this.allowedPrefixes.some((p) => key.startsWith(p));\n }\n\n if (this.allowedPrefixes instanceof RegExp) {\n return this.allowedPrefixes.test(key);\n }\n\n return true;\n }\n\n public mergeDefaults(env: Record<string, any>): void {\n let changed = false;\n for (const [key, rawDefault] of Object.entries(env)) {\n if (!this.isAllowedKey(key)) continue;\n\n const defaultValue = rawDefault;\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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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -275,8 +275,9 @@ var EnvStore = class {
|
|
|
275
275
|
}
|
|
276
276
|
mergeDefaults(env) {
|
|
277
277
|
let changed = false;
|
|
278
|
-
for (const [key,
|
|
278
|
+
for (const [key, rawDefault] of Object.entries(env)) {
|
|
279
279
|
if (!this.isAllowedKey(key)) continue;
|
|
280
|
+
const defaultValue = rawDefault;
|
|
280
281
|
const isOverridden = key in this.overrides;
|
|
281
282
|
const currentValue = isOverridden ? this.overrides[key] : defaultValue;
|
|
282
283
|
const isSecret = this.secretPattern.test(key);
|
|
@@ -463,9 +464,12 @@ var NetworkInterceptor = class {
|
|
|
463
464
|
const allVars = this.store.getAll();
|
|
464
465
|
let resultUrl = url;
|
|
465
466
|
for (const varObj of Object.values(allVars)) {
|
|
466
|
-
if (varObj.isOverridden && varObj.defaultValue && varObj.value) {
|
|
467
|
-
const
|
|
468
|
-
const
|
|
467
|
+
if (varObj.isOverridden && varObj.defaultValue !== void 0 && varObj.value !== void 0) {
|
|
468
|
+
const rawDefault = String(varObj.defaultValue ?? "");
|
|
469
|
+
const rawOverride = String(varObj.value ?? "");
|
|
470
|
+
if (!rawDefault || !rawOverride) continue;
|
|
471
|
+
const defaultBase = rawDefault.replace(/\/+$/, "");
|
|
472
|
+
const overrideBase = rawOverride.replace(/\/+$/, "");
|
|
469
473
|
if (defaultBase && resultUrl.includes(defaultBase)) {
|
|
470
474
|
resultUrl = resultUrl.replace(defaultBase, overrideBase);
|
|
471
475
|
}
|
|
@@ -1329,7 +1333,15 @@ var ModalUI = class {
|
|
|
1329
1333
|
`;
|
|
1330
1334
|
const inputEl = card.querySelector(".var-input");
|
|
1331
1335
|
inputEl.addEventListener("change", () => {
|
|
1332
|
-
|
|
1336
|
+
let val = inputEl.value;
|
|
1337
|
+
if (typeof varItem.defaultValue === "boolean") {
|
|
1338
|
+
if (val === "true") val = true;
|
|
1339
|
+
else if (val === "false") val = false;
|
|
1340
|
+
} else if (typeof varItem.defaultValue === "number") {
|
|
1341
|
+
const num = Number(val);
|
|
1342
|
+
if (!isNaN(num) && val.trim() !== "") val = num;
|
|
1343
|
+
}
|
|
1344
|
+
this.store.setOverride(varItem.key, val);
|
|
1333
1345
|
});
|
|
1334
1346
|
card.querySelector(".toggle-secret-btn")?.addEventListener("click", () => {
|
|
1335
1347
|
this.secretVisibilityMap.set(varItem.key, !isVisible);
|
|
@@ -1341,7 +1353,9 @@ var ModalUI = class {
|
|
|
1341
1353
|
return card;
|
|
1342
1354
|
}
|
|
1343
1355
|
escapeHtml(str) {
|
|
1344
|
-
|
|
1356
|
+
if (str === null || str === void 0) return "";
|
|
1357
|
+
const text = typeof str === "object" ? JSON.stringify(str) : String(str);
|
|
1358
|
+
return text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
1345
1359
|
}
|
|
1346
1360
|
};
|
|
1347
1361
|
|
|
@@ -1364,7 +1378,7 @@ var LambaManager = class {
|
|
|
1364
1378
|
},
|
|
1365
1379
|
set(_target, prop, value) {
|
|
1366
1380
|
if (typeof prop === "string") {
|
|
1367
|
-
self.set(prop,
|
|
1381
|
+
self.set(prop, value);
|
|
1368
1382
|
return true;
|
|
1369
1383
|
}
|
|
1370
1384
|
return false;
|
|
@@ -1383,9 +1397,7 @@ var LambaManager = class {
|
|
|
1383
1397
|
try {
|
|
1384
1398
|
const defaultObj = {};
|
|
1385
1399
|
for (const [k, v] of Object.entries(targetEnv)) {
|
|
1386
|
-
|
|
1387
|
-
defaultObj[k] = String(v);
|
|
1388
|
-
}
|
|
1400
|
+
defaultObj[k] = v;
|
|
1389
1401
|
}
|
|
1390
1402
|
if (Object.keys(defaultObj).length > 0) {
|
|
1391
1403
|
this.store.mergeDefaults(defaultObj);
|
|
@@ -1399,10 +1411,24 @@ var LambaManager = class {
|
|
|
1399
1411
|
if (typeof prop === "string") {
|
|
1400
1412
|
const overrideVal = self.get(prop);
|
|
1401
1413
|
if (overrideVal !== void 0 && overrideVal !== "") {
|
|
1414
|
+
const targetVal = Reflect.get(target, prop);
|
|
1415
|
+
if (typeof targetVal === "boolean") {
|
|
1416
|
+
if (overrideVal === "true" || overrideVal === true) return true;
|
|
1417
|
+
if (overrideVal === "false" || overrideVal === false) return false;
|
|
1418
|
+
} else if (typeof targetVal === "number" && typeof overrideVal === "string") {
|
|
1419
|
+
const num = Number(overrideVal);
|
|
1420
|
+
if (!isNaN(num)) return num;
|
|
1421
|
+
}
|
|
1402
1422
|
return overrideVal;
|
|
1403
1423
|
}
|
|
1404
1424
|
}
|
|
1405
1425
|
return Reflect.get(target, prop);
|
|
1426
|
+
},
|
|
1427
|
+
set(target, prop, value) {
|
|
1428
|
+
if (typeof prop === "string") {
|
|
1429
|
+
self.set(prop, value);
|
|
1430
|
+
}
|
|
1431
|
+
return Reflect.set(target, prop, value);
|
|
1406
1432
|
}
|
|
1407
1433
|
});
|
|
1408
1434
|
}
|
|
@@ -1455,7 +1481,7 @@ var LambaManager = class {
|
|
|
1455
1481
|
if (!this.store) {
|
|
1456
1482
|
this.init();
|
|
1457
1483
|
}
|
|
1458
|
-
return this.store?.get(key, fallback) ?? fallback
|
|
1484
|
+
return this.store?.get(key, fallback) ?? fallback;
|
|
1459
1485
|
}
|
|
1460
1486
|
/**
|
|
1461
1487
|
* Overrides an environment variable live at runtime.
|
|
@@ -1506,8 +1532,8 @@ var LambaManager = class {
|
|
|
1506
1532
|
var lamba = new LambaManager();
|
|
1507
1533
|
if (typeof window !== "undefined") {
|
|
1508
1534
|
window.lamba = lamba;
|
|
1509
|
-
const
|
|
1510
|
-
if (
|
|
1535
|
+
const currentScript = document.currentScript;
|
|
1536
|
+
if (currentScript && (currentScript.hasAttribute("data-lamba-auto") || currentScript.hasAttribute("data-auto-init"))) {
|
|
1511
1537
|
lamba.init();
|
|
1512
1538
|
}
|
|
1513
1539
|
}
|