diff options
| author | Kasra Bigdeli <[email protected]> | 2020-08-16 08:58:13 -0400 |
|---|---|---|
| committer | Kasra Bigdeli <[email protected]> | 2020-08-16 08:58:13 -0400 |
| commit | 7bab4b4afcc60edf01c96817de5c5c208a2904c6 (patch) | |
| tree | b8ffad8be07339fc7f5331f94bbbeeb9d6040edb /scripts/validate_apps.js | |
| parent | b643e1709a296c137832408d459abe36bbb8ca20 (diff) | |
| download | caprover-one-click-apps-7bab4b4afcc60edf01c96817de5c5c208a2904c6.tar.gz caprover-one-click-apps-7bab4b4afcc60edf01c96817de5c5c208a2904c6.zip | |
Validating v4
Diffstat (limited to 'scripts/validate_apps.js')
| -rw-r--r-- | scripts/validate_apps.js | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/scripts/validate_apps.js b/scripts/validate_apps.js new file mode 100644 index 0000000..5923fac --- /dev/null +++ b/scripts/validate_apps.js @@ -0,0 +1,138 @@ + /*jshint esversion: 6 */ + const path = require('path'); + const yaml = require('yaml'); + const fs = require('fs-extra'); + + const PUBLIC = `public`; + const pathOfPublic = path.join(__dirname, '..', PUBLIC); + + + // validating version 4 + function validateV4() { + + const version = '4'; + const pathOfVersion = path.join(pathOfPublic, 'v' + version); + const pathOfApps = path.join(pathOfVersion, 'apps'); + + return fs.readdir(pathOfApps) + .then(function (items) { + + const apps = items.filter(v => v.includes('.yml')); + + if (items.length !== apps.length) { + throw new Error('All files in v4 must end with .yml'); + } + + for (var i = 0; i < apps.length; i++) { + const contentString = fs.readFileSync(path.join(pathOfApps, apps[i]), 'utf-8'); + const content = yaml.parse(contentString); + const captainVersion = (content.captainVersion + ''); + const versionString = (version + ''); + if (versionString !== captainVersion) + throw new Error(`unmatched versions ${versionString} ${captainVersion} for ${apps[i]}`); + + apps[i] = apps[i].replace('.yml', ''); + + if (!content.caproverOneClickApp) { + throw new Error(`Cannot find caproverOneClickApp for ${apps[i]}`); + } + + if (!content.caproverOneClickApp.description) { + throw new Error(`Cannot find description for ${apps[i]}`); + } + + if (!content.caproverOneClickApp.instructions || + !content.caproverOneClickApp.instructions.start || + !content.caproverOneClickApp.instructions.end) { + throw new Error(`Cannot find instructions.start or instructions.end for ${apps[i]}`); + } + + if (!content.services) { + throw new Error(`Cannot find services for ${apps[i]}`); + } + + Object.keys(content.services).forEach( + (serviceName) => { // jshint ignore:line + const s = content.services[serviceName]; + if (s.image && s.image.endsWith(':latest')) { + throw new Error(`"latest" tag is not allowed as it can change and break the setup, see ${apps[i]}`); + } + }); + + const logoFileName = apps[i] + '.png'; + + const logoFullPath = path.join(pathOfVersion, 'logos', logoFileName); + + if (!fs.existsSync(logoFullPath) || + !fs.statSync(logoFullPath).isFile()) { + let printablePath = logoFullPath; + printablePath = printablePath.substr(printablePath.indexOf(`/${PUBLIC}`)); + throw new Error(`Cannot find logo for ${apps[i]} ${printablePath}`); + } + + console.log(`Validated ${apps[i]}`); + + } + + }); + } + + // validating version 2 + function validateV2() { + + const version = '2'; + const pathOfVersion = path.join(pathOfPublic, 'v' + version); + const pathOfApps = path.join(pathOfVersion, 'apps'); + + return fs.readdir(pathOfApps) + .then(function (items) { + + const apps = items.filter(v => v.includes('.json')); + + if (items.length !== apps.length) { + throw new Error('All files in v2 must end with .json'); + } + + for (var i = 0; i < apps.length; i++) { + const contentString = fs.readFileSync(path.join(pathOfApps, apps[i])); + const content = JSON.parse(contentString); + const captainVersion = (content.captainVersion + ''); + const versionString = (version + ''); + if (versionString !== captainVersion) + throw new Error(`unmatched versions ${versionString} ${captainVersion} for ${apps[i]}`); + + apps[i] = apps[i].replace('.json', ''); + + if (!content.description) { + throw new Error(`Cannot find description for ${apps[i]}`); + } + + const logoFileName = apps[i] + '.png'; + + const logoFullPath = path.join(pathOfVersion, 'logos', logoFileName); + + if (!fs.existsSync(logoFullPath) || + !fs.statSync(logoFullPath).isFile()) { + let printablePath = logoFullPath; + printablePath = printablePath.substr(printablePath.indexOf(`/${PUBLIC}`)); + throw new Error(`Cannot find logo for ${apps[i]} ${printablePath}`); + } + + console.log(`Validated ${apps[i]}`); + + } + + }); + } + + Promise.resolve() + .then(function () { + return validateV2(); + }) + .then(function () { + return validateV4(); + }) + .catch(function (err) { + console.error(err); + process.exit(127); + });
\ No newline at end of file |
