@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.
@@ -5,34 +5,33 @@ import { useState, useEffect } from "react";
5
5
  var STORAGE_PRESETS_KEY = "__lamba_presets__";
6
6
  var STORAGE_ACTIVE_PRESET_KEY = "__lamba_active_preset__";
7
7
  var PresetManager = class {
8
- constructor() {
8
+ constructor(storage) {
9
9
  this.presets = [];
10
10
  this.activePresetId = null;
11
+ this.storage = storage;
11
12
  this.loadFromStorage();
12
13
  }
13
14
  loadFromStorage() {
14
- if (typeof localStorage === "undefined") return;
15
15
  try {
16
- const rawPresets = localStorage.getItem(STORAGE_PRESETS_KEY);
16
+ const rawPresets = this.storage.getItem(STORAGE_PRESETS_KEY);
17
17
  if (rawPresets) {
18
18
  this.presets = JSON.parse(rawPresets);
19
19
  }
20
- this.activePresetId = localStorage.getItem(STORAGE_ACTIVE_PRESET_KEY);
20
+ this.activePresetId = this.storage.getItem(STORAGE_ACTIVE_PRESET_KEY);
21
21
  } catch (e) {
22
- console.warn("[lamba] Failed to parse presets from localStorage", e);
22
+ console.warn("[lamba] Failed to parse presets from storage", e);
23
23
  }
24
24
  }
25
25
  saveToStorage() {
26
- if (typeof localStorage === "undefined") return;
27
26
  try {
28
- localStorage.setItem(STORAGE_PRESETS_KEY, JSON.stringify(this.presets));
27
+ this.storage.setItem(STORAGE_PRESETS_KEY, JSON.stringify(this.presets));
29
28
  if (this.activePresetId) {
30
- localStorage.setItem(STORAGE_ACTIVE_PRESET_KEY, this.activePresetId);
29
+ this.storage.setItem(STORAGE_ACTIVE_PRESET_KEY, this.activePresetId);
31
30
  } else {
32
- localStorage.removeItem(STORAGE_ACTIVE_PRESET_KEY);
31
+ this.storage.removeItem(STORAGE_ACTIVE_PRESET_KEY);
33
32
  }
34
33
  } catch (e) {
35
- console.warn("[lamba] Failed to save presets to localStorage", e);
34
+ console.warn("[lamba] Failed to save presets to storage", e);
36
35
  }
37
36
  }
38
37
  getPresets() {
@@ -184,6 +183,99 @@ async function tryFetchRootEnvFile() {
184
183
  return {};
185
184
  }
186
185
 
186
+ // src/core/storage.ts
187
+ var LocalStorageAdapter = class {
188
+ getItem(key) {
189
+ try {
190
+ return typeof localStorage !== "undefined" ? localStorage.getItem(key) : null;
191
+ } catch {
192
+ return null;
193
+ }
194
+ }
195
+ setItem(key, value) {
196
+ try {
197
+ if (typeof localStorage !== "undefined") localStorage.setItem(key, value);
198
+ } catch {
199
+ }
200
+ }
201
+ removeItem(key) {
202
+ try {
203
+ if (typeof localStorage !== "undefined") localStorage.removeItem(key);
204
+ } catch {
205
+ }
206
+ }
207
+ clear() {
208
+ try {
209
+ if (typeof localStorage !== "undefined") {
210
+ localStorage.removeItem("__lamba_overrides__");
211
+ localStorage.removeItem("__lamba_presets__");
212
+ localStorage.removeItem("__lamba_active_preset__");
213
+ }
214
+ } catch {
215
+ }
216
+ }
217
+ };
218
+ var SessionStorageAdapter = class {
219
+ getItem(key) {
220
+ try {
221
+ return typeof sessionStorage !== "undefined" ? sessionStorage.getItem(key) : null;
222
+ } catch {
223
+ return null;
224
+ }
225
+ }
226
+ setItem(key, value) {
227
+ try {
228
+ if (typeof sessionStorage !== "undefined") sessionStorage.setItem(key, value);
229
+ } catch {
230
+ }
231
+ }
232
+ removeItem(key) {
233
+ try {
234
+ if (typeof sessionStorage !== "undefined") sessionStorage.removeItem(key);
235
+ } catch {
236
+ }
237
+ }
238
+ clear() {
239
+ try {
240
+ if (typeof sessionStorage !== "undefined") {
241
+ sessionStorage.removeItem("__lamba_overrides__");
242
+ sessionStorage.removeItem("__lamba_presets__");
243
+ sessionStorage.removeItem("__lamba_active_preset__");
244
+ }
245
+ } catch {
246
+ }
247
+ }
248
+ };
249
+ var MemoryStorageAdapter = class {
250
+ constructor() {
251
+ this.store = /* @__PURE__ */ new Map();
252
+ }
253
+ getItem(key) {
254
+ return this.store.get(key) ?? null;
255
+ }
256
+ setItem(key, value) {
257
+ this.store.set(key, value);
258
+ }
259
+ removeItem(key) {
260
+ this.store.delete(key);
261
+ }
262
+ clear() {
263
+ this.store.clear();
264
+ }
265
+ };
266
+ function createStorageAdapter(strategy = "local", custom) {
267
+ if (custom) return custom;
268
+ switch (strategy) {
269
+ case "session":
270
+ return new SessionStorageAdapter();
271
+ case "memory":
272
+ return new MemoryStorageAdapter();
273
+ case "local":
274
+ default:
275
+ return new LocalStorageAdapter();
276
+ }
277
+ }
278
+
187
279
  // src/core/store.ts
188
280
  var STORAGE_OVERRIDES_KEY = "__lamba_overrides__";
189
281
  var DEFAULT_SECRET_PATTERN = /(KEY|SECRET|TOKEN|PASSWORD|AUTH|PRIVATE|CREDENTIAL|SIGNATURE)/i;
@@ -195,7 +287,8 @@ var EnvStore = class {
195
287
  this.storeChangeListeners = /* @__PURE__ */ new Set();
196
288
  this.secretPattern = options.secretKeysPattern || DEFAULT_SECRET_PATTERN;
197
289
  this.allowedPrefixes = options.allowedPrefixes;
198
- this.presetManager = new PresetManager();
290
+ this.storage = createStorageAdapter(options.storageStrategy ?? "local", options.storage);
291
+ this.presetManager = new PresetManager(this.storage);
199
292
  this.loadOverridesFromStorage();
200
293
  if (options.env) {
201
294
  this.mergeDefaults(options.env);
@@ -212,22 +305,20 @@ var EnvStore = class {
212
305
  this.patchProcessEnv();
213
306
  }
214
307
  loadOverridesFromStorage() {
215
- if (typeof localStorage === "undefined") return;
216
308
  try {
217
- const stored = localStorage.getItem(STORAGE_OVERRIDES_KEY);
309
+ const stored = this.storage.getItem(STORAGE_OVERRIDES_KEY);
218
310
  if (stored) {
219
311
  this.overrides = JSON.parse(stored);
220
312
  }
221
313
  } catch (e) {
222
- console.warn("[lamba] Failed to parse overrides from localStorage", e);
314
+ console.warn("[lamba] Failed to parse overrides from storage", e);
223
315
  }
224
316
  }
225
317
  saveOverridesToStorage() {
226
- if (typeof localStorage === "undefined") return;
227
318
  try {
228
- localStorage.setItem(STORAGE_OVERRIDES_KEY, JSON.stringify(this.overrides));
319
+ this.storage.setItem(STORAGE_OVERRIDES_KEY, JSON.stringify(this.overrides));
229
320
  } catch (e) {
230
- console.warn("[lamba] Failed to save overrides to localStorage", e);
321
+ console.warn("[lamba] Failed to save overrides to storage", e);
231
322
  }
232
323
  }
233
324
  /**
@@ -280,9 +371,9 @@ var EnvStore = class {
280
371
  let changed = false;
281
372
  for (const [key, rawDefault] of Object.entries(env)) {
282
373
  if (!this.isAllowedKey(key)) continue;
283
- const defaultValue = rawDefault !== null && rawDefault !== void 0 ? String(rawDefault) : "";
374
+ const defaultValue = rawDefault;
284
375
  const isOverridden = key in this.overrides;
285
- const currentValue = isOverridden ? String(this.overrides[key] ?? "") : defaultValue;
376
+ const currentValue = isOverridden ? this.overrides[key] : defaultValue;
286
377
  const isSecret = this.secretPattern.test(key);
287
378
  const existing = this.variables.get(key);
288
379
  if (!existing) {
@@ -1336,7 +1427,15 @@ var ModalUI = class {
1336
1427
  `;
1337
1428
  const inputEl = card.querySelector(".var-input");
1338
1429
  inputEl.addEventListener("change", () => {
1339
- this.store.setOverride(varItem.key, inputEl.value);
1430
+ let val = inputEl.value;
1431
+ if (typeof varItem.defaultValue === "boolean") {
1432
+ if (val === "true") val = true;
1433
+ else if (val === "false") val = false;
1434
+ } else if (typeof varItem.defaultValue === "number") {
1435
+ const num = Number(val);
1436
+ if (!isNaN(num) && val.trim() !== "") val = num;
1437
+ }
1438
+ this.store.setOverride(varItem.key, val);
1340
1439
  });
1341
1440
  card.querySelector(".toggle-secret-btn")?.addEventListener("click", () => {
1342
1441
  this.secretVisibilityMap.set(varItem.key, !isVisible);
@@ -1349,7 +1448,8 @@ var ModalUI = class {
1349
1448
  }
1350
1449
  escapeHtml(str) {
1351
1450
  if (str === null || str === void 0) return "";
1352
- return String(str).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
1451
+ const text = typeof str === "object" ? JSON.stringify(str) : String(str);
1452
+ return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
1353
1453
  }
1354
1454
  };
1355
1455
 
@@ -1372,7 +1472,7 @@ var LambaManager = class {
1372
1472
  },
1373
1473
  set(_target, prop, value) {
1374
1474
  if (typeof prop === "string") {
1375
- self.set(prop, String(value));
1475
+ self.set(prop, value);
1376
1476
  return true;
1377
1477
  }
1378
1478
  return false;
@@ -1391,9 +1491,7 @@ var LambaManager = class {
1391
1491
  try {
1392
1492
  const defaultObj = {};
1393
1493
  for (const [k, v] of Object.entries(targetEnv)) {
1394
- if (typeof v === "string" || typeof v === "number" || typeof v === "boolean") {
1395
- defaultObj[k] = String(v);
1396
- }
1494
+ defaultObj[k] = v;
1397
1495
  }
1398
1496
  if (Object.keys(defaultObj).length > 0) {
1399
1497
  this.store.mergeDefaults(defaultObj);
@@ -1407,10 +1505,24 @@ var LambaManager = class {
1407
1505
  if (typeof prop === "string") {
1408
1506
  const overrideVal = self.get(prop);
1409
1507
  if (overrideVal !== void 0 && overrideVal !== "") {
1508
+ const targetVal = Reflect.get(target, prop);
1509
+ if (typeof targetVal === "boolean") {
1510
+ if (overrideVal === "true" || overrideVal === true) return true;
1511
+ if (overrideVal === "false" || overrideVal === false) return false;
1512
+ } else if (typeof targetVal === "number" && typeof overrideVal === "string") {
1513
+ const num = Number(overrideVal);
1514
+ if (!isNaN(num)) return num;
1515
+ }
1410
1516
  return overrideVal;
1411
1517
  }
1412
1518
  }
1413
1519
  return Reflect.get(target, prop);
1520
+ },
1521
+ set(target, prop, value) {
1522
+ if (typeof prop === "string") {
1523
+ self.set(prop, value);
1524
+ }
1525
+ return Reflect.set(target, prop, value);
1414
1526
  }
1415
1527
  });
1416
1528
  }
@@ -1463,7 +1575,7 @@ var LambaManager = class {
1463
1575
  if (!this.store) {
1464
1576
  this.init();
1465
1577
  }
1466
- return this.store?.get(key, fallback) ?? fallback ?? "";
1578
+ return this.store?.get(key, fallback) ?? fallback;
1467
1579
  }
1468
1580
  /**
1469
1581
  * Overrides an environment variable live at runtime.
@@ -1521,7 +1633,7 @@ if (typeof window !== "undefined") {
1521
1633
  }
1522
1634
 
1523
1635
  // src/integrations/react.ts
1524
- function useLambaEnv(key, defaultValue = "") {
1636
+ function useLambaEnv(key, defaultValue) {
1525
1637
  const [value, setValue] = useState(
1526
1638
  () => lamba.get(key, defaultValue)
1527
1639
  );