@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/README.md +74 -20
- package/dist/index.d.mts +73 -10
- package/dist/index.d.ts +73 -10
- package/dist/index.js +144 -26
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +141 -26
- 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 +139 -27
- package/dist/integrations/react.js.map +1 -1
- package/dist/integrations/react.mjs +139 -27
- 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 +139 -27
- package/dist/integrations/vue.js.map +1 -1
- package/dist/integrations/vue.mjs +139 -27
- package/dist/integrations/vue.mjs.map +1 -1
- package/dist/lamba.min.js +10 -10
- package/package.json +1 -1
|
@@ -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 =
|
|
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 =
|
|
44
|
+
this.activePresetId = this.storage.getItem(STORAGE_ACTIVE_PRESET_KEY);
|
|
45
45
|
} catch (e) {
|
|
46
|
-
console.warn("[lamba] Failed to parse presets from
|
|
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
|
-
|
|
51
|
+
this.storage.setItem(STORAGE_PRESETS_KEY, JSON.stringify(this.presets));
|
|
53
52
|
if (this.activePresetId) {
|
|
54
|
-
|
|
53
|
+
this.storage.setItem(STORAGE_ACTIVE_PRESET_KEY, this.activePresetId);
|
|
55
54
|
} else {
|
|
56
|
-
|
|
55
|
+
this.storage.removeItem(STORAGE_ACTIVE_PRESET_KEY);
|
|
57
56
|
}
|
|
58
57
|
} catch (e) {
|
|
59
|
-
console.warn("[lamba] Failed to save presets to
|
|
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.
|
|
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 =
|
|
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
|
|
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
|
-
|
|
343
|
+
this.storage.setItem(STORAGE_OVERRIDES_KEY, JSON.stringify(this.overrides));
|
|
253
344
|
} catch (e) {
|
|
254
|
-
console.warn("[lamba] Failed to save overrides to
|
|
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
|
|
398
|
+
const defaultValue = rawDefault;
|
|
308
399
|
const isOverridden = key in this.overrides;
|
|
309
|
-
const currentValue = isOverridden ?
|
|
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
|
-
|
|
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
|
-
|
|
1475
|
+
const text = typeof str === "object" ? JSON.stringify(str) : String(str);
|
|
1476
|
+
return text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
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,
|
|
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
|
-
|
|
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
|
);
|