@ojolowoblue/lamba 1.0.4 → 1.0.6

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.
@@ -29,34 +29,33 @@ var import_react = require("react");
29
29
  var STORAGE_PRESETS_KEY = "__lamba_presets__";
30
30
  var STORAGE_ACTIVE_PRESET_KEY = "__lamba_active_preset__";
31
31
  var PresetManager = class {
32
- constructor() {
32
+ constructor(storage) {
33
33
  this.presets = [];
34
34
  this.activePresetId = null;
35
+ this.storage = storage;
35
36
  this.loadFromStorage();
36
37
  }
37
38
  loadFromStorage() {
38
- if (typeof localStorage === "undefined") return;
39
39
  try {
40
- const rawPresets = localStorage.getItem(STORAGE_PRESETS_KEY);
40
+ const rawPresets = this.storage.getItem(STORAGE_PRESETS_KEY);
41
41
  if (rawPresets) {
42
42
  this.presets = JSON.parse(rawPresets);
43
43
  }
44
- this.activePresetId = localStorage.getItem(STORAGE_ACTIVE_PRESET_KEY);
44
+ this.activePresetId = this.storage.getItem(STORAGE_ACTIVE_PRESET_KEY);
45
45
  } catch (e) {
46
- console.warn("[lamba] Failed to parse presets from localStorage", e);
46
+ console.warn("[lamba] Failed to parse presets from storage", e);
47
47
  }
48
48
  }
49
49
  saveToStorage() {
50
- if (typeof localStorage === "undefined") return;
51
50
  try {
52
- localStorage.setItem(STORAGE_PRESETS_KEY, JSON.stringify(this.presets));
51
+ this.storage.setItem(STORAGE_PRESETS_KEY, JSON.stringify(this.presets));
53
52
  if (this.activePresetId) {
54
- localStorage.setItem(STORAGE_ACTIVE_PRESET_KEY, this.activePresetId);
53
+ this.storage.setItem(STORAGE_ACTIVE_PRESET_KEY, this.activePresetId);
55
54
  } else {
56
- localStorage.removeItem(STORAGE_ACTIVE_PRESET_KEY);
55
+ this.storage.removeItem(STORAGE_ACTIVE_PRESET_KEY);
57
56
  }
58
57
  } catch (e) {
59
- console.warn("[lamba] Failed to save presets to localStorage", e);
58
+ console.warn("[lamba] Failed to save presets to storage", e);
60
59
  }
61
60
  }
62
61
  getPresets() {
@@ -208,6 +207,99 @@ async function tryFetchRootEnvFile() {
208
207
  return {};
209
208
  }
210
209
 
210
+ // src/core/storage.ts
211
+ var LocalStorageAdapter = class {
212
+ getItem(key) {
213
+ try {
214
+ return typeof localStorage !== "undefined" ? localStorage.getItem(key) : null;
215
+ } catch {
216
+ return null;
217
+ }
218
+ }
219
+ setItem(key, value) {
220
+ try {
221
+ if (typeof localStorage !== "undefined") localStorage.setItem(key, value);
222
+ } catch {
223
+ }
224
+ }
225
+ removeItem(key) {
226
+ try {
227
+ if (typeof localStorage !== "undefined") localStorage.removeItem(key);
228
+ } catch {
229
+ }
230
+ }
231
+ clear() {
232
+ try {
233
+ if (typeof localStorage !== "undefined") {
234
+ localStorage.removeItem("__lamba_overrides__");
235
+ localStorage.removeItem("__lamba_presets__");
236
+ localStorage.removeItem("__lamba_active_preset__");
237
+ }
238
+ } catch {
239
+ }
240
+ }
241
+ };
242
+ var SessionStorageAdapter = class {
243
+ getItem(key) {
244
+ try {
245
+ return typeof sessionStorage !== "undefined" ? sessionStorage.getItem(key) : null;
246
+ } catch {
247
+ return null;
248
+ }
249
+ }
250
+ setItem(key, value) {
251
+ try {
252
+ if (typeof sessionStorage !== "undefined") sessionStorage.setItem(key, value);
253
+ } catch {
254
+ }
255
+ }
256
+ removeItem(key) {
257
+ try {
258
+ if (typeof sessionStorage !== "undefined") sessionStorage.removeItem(key);
259
+ } catch {
260
+ }
261
+ }
262
+ clear() {
263
+ try {
264
+ if (typeof sessionStorage !== "undefined") {
265
+ sessionStorage.removeItem("__lamba_overrides__");
266
+ sessionStorage.removeItem("__lamba_presets__");
267
+ sessionStorage.removeItem("__lamba_active_preset__");
268
+ }
269
+ } catch {
270
+ }
271
+ }
272
+ };
273
+ var MemoryStorageAdapter = class {
274
+ constructor() {
275
+ this.store = /* @__PURE__ */ new Map();
276
+ }
277
+ getItem(key) {
278
+ return this.store.get(key) ?? null;
279
+ }
280
+ setItem(key, value) {
281
+ this.store.set(key, value);
282
+ }
283
+ removeItem(key) {
284
+ this.store.delete(key);
285
+ }
286
+ clear() {
287
+ this.store.clear();
288
+ }
289
+ };
290
+ function createStorageAdapter(strategy = "local", custom) {
291
+ if (custom) return custom;
292
+ switch (strategy) {
293
+ case "session":
294
+ return new SessionStorageAdapter();
295
+ case "memory":
296
+ return new MemoryStorageAdapter();
297
+ case "local":
298
+ default:
299
+ return new LocalStorageAdapter();
300
+ }
301
+ }
302
+
211
303
  // src/core/store.ts
212
304
  var STORAGE_OVERRIDES_KEY = "__lamba_overrides__";
213
305
  var DEFAULT_SECRET_PATTERN = /(KEY|SECRET|TOKEN|PASSWORD|AUTH|PRIVATE|CREDENTIAL|SIGNATURE)/i;
@@ -219,7 +311,8 @@ var EnvStore = class {
219
311
  this.storeChangeListeners = /* @__PURE__ */ new Set();
220
312
  this.secretPattern = options.secretKeysPattern || DEFAULT_SECRET_PATTERN;
221
313
  this.allowedPrefixes = options.allowedPrefixes;
222
- this.presetManager = new PresetManager();
314
+ this.storage = createStorageAdapter(options.storageStrategy ?? "local", options.storage);
315
+ this.presetManager = new PresetManager(this.storage);
223
316
  this.loadOverridesFromStorage();
224
317
  if (options.env) {
225
318
  this.mergeDefaults(options.env);
@@ -236,22 +329,20 @@ var EnvStore = class {
236
329
  this.patchProcessEnv();
237
330
  }
238
331
  loadOverridesFromStorage() {
239
- if (typeof localStorage === "undefined") return;
240
332
  try {
241
- const stored = localStorage.getItem(STORAGE_OVERRIDES_KEY);
333
+ const stored = this.storage.getItem(STORAGE_OVERRIDES_KEY);
242
334
  if (stored) {
243
335
  this.overrides = JSON.parse(stored);
244
336
  }
245
337
  } catch (e) {
246
- console.warn("[lamba] Failed to parse overrides from localStorage", e);
338
+ console.warn("[lamba] Failed to parse overrides from storage", e);
247
339
  }
248
340
  }
249
341
  saveOverridesToStorage() {
250
- if (typeof localStorage === "undefined") return;
251
342
  try {
252
- localStorage.setItem(STORAGE_OVERRIDES_KEY, JSON.stringify(this.overrides));
343
+ this.storage.setItem(STORAGE_OVERRIDES_KEY, JSON.stringify(this.overrides));
253
344
  } catch (e) {
254
- console.warn("[lamba] Failed to save overrides to localStorage", e);
345
+ console.warn("[lamba] Failed to save overrides to storage", e);
255
346
  }
256
347
  }
257
348
  /**
@@ -304,9 +395,9 @@ var EnvStore = class {
304
395
  let changed = false;
305
396
  for (const [key, rawDefault] of Object.entries(env)) {
306
397
  if (!this.isAllowedKey(key)) continue;
307
- const defaultValue = rawDefault !== null && rawDefault !== void 0 ? String(rawDefault) : "";
398
+ const defaultValue = rawDefault;
308
399
  const isOverridden = key in this.overrides;
309
- const currentValue = isOverridden ? String(this.overrides[key] ?? "") : defaultValue;
400
+ const currentValue = isOverridden ? this.overrides[key] : defaultValue;
310
401
  const isSecret = this.secretPattern.test(key);
311
402
  const existing = this.variables.get(key);
312
403
  if (!existing) {
@@ -1360,7 +1451,15 @@ var ModalUI = class {
1360
1451
  `;
1361
1452
  const inputEl = card.querySelector(".var-input");
1362
1453
  inputEl.addEventListener("change", () => {
1363
- this.store.setOverride(varItem.key, inputEl.value);
1454
+ let val = inputEl.value;
1455
+ if (typeof varItem.defaultValue === "boolean") {
1456
+ if (val === "true") val = true;
1457
+ else if (val === "false") val = false;
1458
+ } else if (typeof varItem.defaultValue === "number") {
1459
+ const num = Number(val);
1460
+ if (!isNaN(num) && val.trim() !== "") val = num;
1461
+ }
1462
+ this.store.setOverride(varItem.key, val);
1364
1463
  });
1365
1464
  card.querySelector(".toggle-secret-btn")?.addEventListener("click", () => {
1366
1465
  this.secretVisibilityMap.set(varItem.key, !isVisible);
@@ -1373,7 +1472,8 @@ var ModalUI = class {
1373
1472
  }
1374
1473
  escapeHtml(str) {
1375
1474
  if (str === null || str === void 0) return "";
1376
- return String(str).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
1475
+ const text = typeof str === "object" ? JSON.stringify(str) : String(str);
1476
+ return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
1377
1477
  }
1378
1478
  };
1379
1479
 
@@ -1396,7 +1496,7 @@ var LambaManager = class {
1396
1496
  },
1397
1497
  set(_target, prop, value) {
1398
1498
  if (typeof prop === "string") {
1399
- self.set(prop, String(value));
1499
+ self.set(prop, value);
1400
1500
  return true;
1401
1501
  }
1402
1502
  return false;
@@ -1415,9 +1515,7 @@ var LambaManager = class {
1415
1515
  try {
1416
1516
  const defaultObj = {};
1417
1517
  for (const [k, v] of Object.entries(targetEnv)) {
1418
- if (typeof v === "string" || typeof v === "number" || typeof v === "boolean") {
1419
- defaultObj[k] = String(v);
1420
- }
1518
+ defaultObj[k] = v;
1421
1519
  }
1422
1520
  if (Object.keys(defaultObj).length > 0) {
1423
1521
  this.store.mergeDefaults(defaultObj);
@@ -1431,10 +1529,24 @@ var LambaManager = class {
1431
1529
  if (typeof prop === "string") {
1432
1530
  const overrideVal = self.get(prop);
1433
1531
  if (overrideVal !== void 0 && overrideVal !== "") {
1532
+ const targetVal = Reflect.get(target, prop);
1533
+ if (typeof targetVal === "boolean") {
1534
+ if (overrideVal === "true" || overrideVal === true) return true;
1535
+ if (overrideVal === "false" || overrideVal === false) return false;
1536
+ } else if (typeof targetVal === "number" && typeof overrideVal === "string") {
1537
+ const num = Number(overrideVal);
1538
+ if (!isNaN(num)) return num;
1539
+ }
1434
1540
  return overrideVal;
1435
1541
  }
1436
1542
  }
1437
1543
  return Reflect.get(target, prop);
1544
+ },
1545
+ set(target, prop, value) {
1546
+ if (typeof prop === "string") {
1547
+ self.set(prop, value);
1548
+ }
1549
+ return Reflect.set(target, prop, value);
1438
1550
  }
1439
1551
  });
1440
1552
  }
@@ -1487,7 +1599,7 @@ var LambaManager = class {
1487
1599
  if (!this.store) {
1488
1600
  this.init();
1489
1601
  }
1490
- return this.store?.get(key, fallback) ?? fallback ?? "";
1602
+ return this.store?.get(key, fallback) ?? fallback;
1491
1603
  }
1492
1604
  /**
1493
1605
  * Overrides an environment variable live at runtime.
@@ -1545,7 +1657,7 @@ if (typeof window !== "undefined") {
1545
1657
  }
1546
1658
 
1547
1659
  // src/integrations/react.ts
1548
- function useLambaEnv(key, defaultValue = "") {
1660
+ function useLambaEnv(key, defaultValue) {
1549
1661
  const [value, setValue] = (0, import_react.useState)(
1550
1662
  () => lamba.get(key, defaultValue)
1551
1663
  );