Created
December 4, 2017 22:25
-
-
Save jadeallencook/d9f9e301bb2bcb0165c34d9806ccb579 to your computer and use it in GitHub Desktop.
Package installer that can handle dependencies.
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
/* | |
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