Last active
February 20, 2020 18:46
-
-
Save victornpb/401a96209538d6546473c44dc2ec0ce4 to your computer and use it in GitHub Desktop.
Import/Export Beanstalk Enviroment Variables
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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