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