@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
|
@@ -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 =
|
|
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 =
|
|
20
|
+
this.activePresetId = this.storage.getItem(STORAGE_ACTIVE_PRESET_KEY);
|
|
21
21
|
} catch (e) {
|
|
22
|
-
console.warn("[lamba] Failed to parse presets from
|
|
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
|
-
|
|
27
|
+
this.storage.setItem(STORAGE_PRESETS_KEY, JSON.stringify(this.presets));
|
|
29
28
|
if (this.activePresetId) {
|
|
30
|
-
|
|
29
|
+
this.storage.setItem(STORAGE_ACTIVE_PRESET_KEY, this.activePresetId);
|
|
31
30
|
} else {
|
|
32
|
-
|
|
31
|
+
this.storage.removeItem(STORAGE_ACTIVE_PRESET_KEY);
|
|
33
32
|
}
|
|
34
33
|
} catch (e) {
|
|
35
|
-
console.warn("[lamba] Failed to save presets to
|
|
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.
|
|
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 =
|
|
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
|
|
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
|
-
|
|
319
|
+
this.storage.setItem(STORAGE_OVERRIDES_KEY, JSON.stringify(this.overrides));
|
|
229
320
|
} catch (e) {
|
|
230
|
-
console.warn("[lamba] Failed to save overrides to
|
|
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
|
|
374
|
+
const defaultValue = rawDefault;
|
|
284
375
|
const isOverridden = key in this.overrides;
|
|
285
|
-
const currentValue = isOverridden ?
|
|
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
|
-
|
|
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
|
-
|
|
1451
|
+
const text = typeof str === "object" ? JSON.stringify(str) : String(str);
|
|
1452
|
+
return text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
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,
|
|
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
|
-
|
|
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
|
);
|