@ayanaware/bento
Version:
Modular runtime framework designed to solve complex tasks
162 lines • 4.98 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.VariableLoader = void 0;
const errors_1 = require("@ayanaware/errors");
/**
* A Simple Bento Variable Loader. Automatically looks to the enviorment for values.
* If you `VariableLoader.addVariable('HELLO_WORLD')` this Plugin will automatically
* search `process.env.HELLO_WORLD`
*/
class VariableLoader {
constructor() {
this.name = 'VariableLoader';
/**
* Variables that this Loader is handling
*/
this.variables = new Set();
/**
* Variable defaults if exist
*/
this.defaults = new Map();
/**
* A cache of pending Variable Keys and Values
* The only purpose is a place to put values if we don't have Bento API access yet
*/
this.pending = new Map();
}
async onLoad() {
this.handlePending();
}
async onUnload() {
// remove variables we loaded
for (const key of this.variables.keys())
this.api.bento.deleteVariable(key);
}
handlePending() {
if (this.pending.size === 0)
return;
for (const [pendingKey, pendingValue] of this.pending.entries()) {
this.api.bento.setVariable(pendingKey, pendingValue);
this.pending.delete(pendingKey);
}
}
/**
* Add multiple Variables
* @param kv String Array or Key/Value Object
*/
addVariables(kv) {
if (typeof kv !== 'object')
throw new errors_1.IllegalArgumentError('kv must be an Object or Array');
// Handle Array
if (Array.isArray(kv)) {
for (const key of kv)
this.addVariable(key);
return;
}
// Must be Object
for (const [key, value] of Object.entries(kv))
this.addVariable(key, value);
}
/**
* Add Variable
* @param key Key
* @param value Value
*/
addVariable(key, value) {
if (!this.variables.has(key))
this.variables.add(key);
this.processVariable(key, value);
}
/**
* Add multiple default values
* @param kv Key/Default Object
*/
addDefaults(kv) {
if (typeof kv !== 'object')
throw new errors_1.IllegalArgumentError('Must be an Object');
for (const [key, def] of Object.entries(kv))
this.addDefault(key, def);
}
/**
* Add Default Value for Variable
* @param key Key
* @param def Default
*/
addDefault(key, def) {
if (!this.variables.has(key))
this.variables.add(key);
this.defaults.set(key, def);
this.processVariable(key);
}
/**
* Remove Variable
* @param key Key
*/
removeVariable(key) {
if (this.variables.has(key))
this.variables.delete(key);
if (this.defaults.has(key))
this.defaults.delete(key);
this.unloadVariable(key);
}
/**
* Get variable value, from underlying eniroment
*
* Note: This function will look on `process.env` and `window`
* @param key Key
*/
getVariableValue(key) {
if (!this.variables.has(key))
return null;
let value;
// check process.env
if (typeof process === 'object' && process.env[key]) {
value = process.env[key];
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
}
else if (typeof window !== 'undefined' && window[key]) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment
value = window[key];
}
return value;
}
/**
* Process Variable Key
* @param key Variable Key
*/
processVariable(key, override) {
let value = this.getVariableValue(key);
if (value === undefined && this.defaults.has(key))
value = this.defaults.get(key).toString();
if (override !== undefined)
value = override;
return this.loadVariable(key, value);
}
/**
* Load Variable into Bento
* @param key Key
* @param value Value
*/
loadVariable(key, value) {
// PluginAPI is not yet available. Handle this gracefully
if (!this.api) {
this.pending.set(key, value);
return;
}
// PluginAPI is available and we have pending variables. Load them now
this.handlePending();
this.api.bento.setVariable(key, value);
}
/**
* Unload Variable from Bento
* @param key Key
*/
unloadVariable(key) {
// PluginAPI is unavilable. Unlikely that variable was loaded in the first place
if (!this.api)
return;
this.api.bento.deleteVariable(key);
}
}
exports.VariableLoader = VariableLoader;
//# sourceMappingURL=VariableLoader.js.map