Skip to content

Instantly share code, notes, and snippets.

@victornpb
Last active February 20, 2020 18:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save victornpb/401a96209538d6546473c44dc2ec0ce4 to your computer and use it in GitHub Desktop.
Save victornpb/401a96209538d6546473c44dc2ec0ce4 to your computer and use it in GitHub Desktop.
Import/Export Beanstalk Enviroment Variables
(function() {
var html = `<div style="position: fixed; top: 50px; left: 50px; z-index: 99999999; background-color:black; color: white; padding: 5px;">
<div style="display: flex;">
READ:
<button class="readAsJsonBtn">as JSON</button>
<button class="readAsEnvBtn">as ENV</button>
WRITE:
<button class="writeFromJsonBtn">from JSON</button>
<button class="writeFromEnvBtn">from ENV</button>
<span style="flex-grow: 1;"></span>
<button class="closeBtn">X</button>
</div>
<br>
<textarea placeholder="Use the READ buttons, or paste something and click WRITE" style="font-family:monospace; width: 500px; height: 300px; white-space: nowrap;"></textarea>
</div>`;
var d = document.createElement("div");
d.innerHTML = html;
var textarea = d.querySelector("textarea");
document.body.appendChild(d);
textarea.focus();
d.querySelector(".closeBtn").onclick = () => document.body.removeChild(d);
d.querySelector(".readAsJsonBtn").onclick = readAsJson;
d.querySelector(".readAsEnvBtn").onclick = readAsEnv;
d.querySelector(".writeFromJsonBtn").onclick = writeFromJson;
d.querySelector(".writeFromEnvBtn").onclick = writeFromEnv;
function readAsJson() {
var v = JSON.stringify(read(), null, 4);
textarea.value = v;
textarea.select();
}
function writeFromJson() {
var obj;
try {
obj = JSON.parse(textarea.value);
} catch (err) {
alert("This is not a valid JSON!\n" + err);
console.error(err);
}
if(obj) write(obj);
}
function readAsEnv(obj) {
var obj = read();
textarea.value = Object.keys(obj)
.map(key => `${key}="${obj[key]}"`)
.join("\n");
textarea.select();
}
function writeFromEnv() {
var str = textarea.value;
var obj;
try {
obj = parseEnv(str);
console.log(obj);
}
catch (err) {
alert("Invalid ENV file\n" + err);
console.error(err);
}
if (obj) write(obj);
}
function read() {
const tableBeanstalk = document.querySelector(".properties-table");
const tableLambda = document.querySelector("awsui-attribute-editor");
if (tableBeanstalk) {
return Object.fromEntries(
Array.from(tableBeanstalk.querySelectorAll("tr:not(.table-input-error)"))
.map(tr => Array.from(tr.querySelectorAll("input")).map(x => x.value))
.filter(l => l[0])
);
}
if (tableLambda) {
return Object.fromEntries(
Array.from(tableLambda.querySelectorAll(".awsui-row awsui-column-layout"))
.map(row => Array.from(row.querySelectorAll("input.awsui-input")).map(x => x.value))
.filter(l => l[0])
);
}
else {
throw "Error";
}
}
async function write(keyValObj) {
function type(el, value) {
el.value = value;
var e = new Event("input");
e.key = "Enter";
e.keyCode = 13;
e.which = e.keyCode;
e.altKey = false;
e.ctrlKey = true;
e.shiftKey = false;
e.metaKey = false;
e.bubbles = true;
el.dispatchEvent(e);
}
var delay = ms => new Promise((resolve, reject) => setTimeout(resolve, ms));
let tableBeanstalk = document.querySelector(".properties-table");
let tableLambda = document.querySelector("awsui-attribute-editor");
if (tableBeanstalk) {
try {
var keys = Object.keys(keyValObj);
for (let i = 0; i < keys.length; i++) {
let lines = tableBeanstalk.querySelectorAll("tr.ng-scope:not(.table-input-error)");
lines = Array.from(lines);
let myLine = lines[i];
let inputs = myLine.querySelectorAll("input");
type(inputs[0], keys[i]);
type(inputs[1], keyValObj[keys[i]]);
await delay(1);
}
alert("Done!\nPlease make sure everything is correct\nDon't forget to click Apply.");
} catch (err) {
alert("Something went wrong! Please refresh to discard changes!\n" + err);
console.error(err);
}
}
else if (tableLambda) {
try {
Array.from(document.querySelectorAll('awsui-button button')).filter(b=>b.innerText=='Remove').reverse().forEach(b=>b.click());
var keys = Object.keys(keyValObj);
for (let i = 0; i < keys.length; i++) {
let lines = tableLambda.querySelectorAll(".awsui-row awsui-column-layout");
lines = Array.from(lines);
let myLine = lines[i];
let inputs = myLine.querySelectorAll("input.awsui-input");
type(inputs[0], keys[i]);
type(inputs[1], keyValObj[keys[i]]);
Array.from(document.querySelectorAll('awsui-button button')).filter(b => b.innerText === 'Add environment variable')[0].click();
await delay(1);
}
alert("Done!\nPlease make sure everything is correct\nDon't forget to click Apply.");
} catch (err) {
alert("Something went wrong! Please refresh to discard changes!\n" + err);
console.error(err);
}
}
else {
alert('Table not found');
}
}
function parseEnv(str) {
const NEWLINE = "\n";
const RE_INI_KEY_VAL = /^\s*([\w.-]+)\s*=\s*(.*)?\s*$/;
const RE_NEWLINES = /\\n/g;
const NEWLINES_MATCH = /\n|\r|\r\n/;
const obj = {};
String(str).split(NEWLINES_MATCH).forEach((line, idx) => {
const keyValueArr = line.match(RE_INI_KEY_VAL);
if (line.trim() === '') return;
else if (keyValueArr != null) {
const key = keyValueArr[1];
let val = (keyValueArr[2] || '');
const end = val.length - 1;
const isDoubleQuoted = val[0] === '"' && val[end] === '"';
const isSingleQuoted = val[0] === "'" && val[end] === "'";
if (isSingleQuoted || isDoubleQuoted) {
val = val.substring(1, end);
if (isDoubleQuoted) {
val = val.replace(RE_NEWLINES, NEWLINE);
}
} else {
val = val.trim();
}
obj[key] = val;
}
else if (line.trim()[0]==='#' ){
console.log('commment: ', line)
}
else {
throw new SyntaxError(`Unexpected content in ENV at line: ${idx+1}.\nContent: ${line}`);
}
});
return obj;
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment