Skip to content

Instantly share code, notes, and snippets.

@jadeallencook
Created December 4, 2017 22:25
Show Gist options
  • Save jadeallencook/d9f9e301bb2bcb0165c34d9806ccb579 to your computer and use it in GitHub Desktop.
Save jadeallencook/d9f9e301bb2bcb0165c34d9806ccb579 to your computer and use it in GitHub Desktop.
Package installer that can handle dependencies.
/*
Coded by Jade Allen Cook 2017
Example Packages -
[
"KittenService: ",
"Leetmeme: Cyberportal",
"Cyberportal: Ice",
"CamelCaser: KittenService",
"Fraudstream: Leetmeme",
"Ice: "
]
*/
// cache dom elements
const packageInputElem = document.getElementById('package-input'),
validatePackagesBtn = document.getElementById('validate-packages-btn'),
outputElem = document.getElementById('output-data-text');
// validate user packages input
function validatePackages(userPackageArray) {
// {} to cache packages
let packages = {};
// extract package details
for (let x = 0, max = userPackageArray.length; x < max; x++) {
// slice/split string to get values
const packageName = userPackageArray[x].slice(0, userPackageArray[x].indexOf(':')),
packageDependency = userPackageArray[x].split(':').pop().substr(1);
// test for duplicate package
if (packageName in packages) {
return '<b>Error: </b><br /><br /> ' + packageName + ' was instantiated more than once.';
}
// if everything is okay, add to packages {}
packages[packageName] = packageDependency;
}
// test all packages for infinate loops
const packageNamesArray = Object.keys(packages);
for (let x = 0, max = packageNamesArray.length; x < max; x++) {
// cache project details
const package = packageNamesArray[x];
let packageDependency = packages[packageNamesArray[x]];
// only run if there is a dependency
if (packageDependency) {
// test for missing dependency
if (packages[packageDependency] === undefined) {
return '<b>Error: </b><br /><br /> You forgot to include ' + packageDependency;
}
// test if dependencies loop back to package
let nextPackageDependency = packages[packageDependency];
do {
if (package === nextPackageDependency) {
return '<b>Error: </b><br /><br /> Rejected because of infinate loop';
}
nextPackageDependency = packages[nextPackageDependency];
} while (nextPackageDependency);
}
}
// expected output if everything is okay
let validPackagesHTML = '<b>Your Packages: </b><br /><br /><ul>';
for (let x = 0, max = packageNamesArray.length; x < max; x++) {
validPackagesHTML += '<li>' + packageNamesArray[x] + '</li>';
}
validPackagesHTML += '</ul><br /><b>Everything looks good!</b>';
return validPackagesHTML;
}
// event listeners
validatePackagesBtn.addEventListener('click', () => {
outputElem.innerHTML = validatePackages(JSON.parse(packageInputElem.value));
});
// init package validation
outputElem.innerHTML = validatePackages(JSON.parse(packageInputElem.value));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment