UNPKG

@ayanaware/bento

Version:

Modular runtime framework designed to solve complex tasks

162 lines 4.98 kB
"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