UNPKG

@financial-times/n-gage

Version:
105 lines (90 loc) 2.75 kB
const jsonfile = require('jsonfile') const packageJsonFilepath = `${process.cwd()}/package.json`; const getPackageJson = () => { const packageJson = jsonfile.readFileSync(packageJsonFilepath); return packageJson; } const writePackageJsonFile = json => { try { jsonfile.writeFileSync(packageJsonFilepath, json(), {spaces: 2}) } catch (err) { console.error(err) } }; const addScript = (json, config) => { const name = config.name; const value = config.value; const newJson = JSON.parse(JSON.stringify(json)); if (!newJson.husky) { newJson.husky = {}; } if (!newJson.husky.hooks) { newJson.husky.hooks = {}; } if (!newJson.husky.hooks[name]) { newJson.husky.hooks[name] = value; } else if (newJson.husky.hooks[name].indexOf(value) === -1) { newJson.husky.hooks[name] = `${newJson.husky.hooks[name]} && ${value}`; } return newJson; } const addScripts = () => { const json = getPackageJson(); const newJson = [ { name: 'pre-commit', value: 'secret-squirrel' }, { name: 'pre-push', value: 'make verify -j3' } ].reduce((returnObject, row) => addScript(returnObject, row), json); return newJson; } const removePreGitHooks = () => { const json = getPackageJson(); delete json.config['pre-git']; delete json.commit; delete json.devDependencies['pre-git']; return json; }; const find = test => { try { return test(); } catch (err) { return false; }; }; const huskyConfigNeedsUpgrade = () => { const { scripts } = getPackageJson(); return find(() => scripts.precommit || scripts.commitmsg || scripts.prepush); }; const secretSquirrelPreCommitScriptExists = () => { const json = getPackageJson(); return find(() => json.husky.hooks['pre-commit'].indexOf('secret-squirrel') !== -1); }; const preGitHookExists = () => { const json = getPackageJson(); return find(() => !!json.config['pre-git'] || json.devDependencies['pre-git']); }; const run = () => { var response = ''; // Only run locally (not in CI) if (process.env.CIRCLECI) { return response; } if (huskyConfigNeedsUpgrade()) { require(`${process.cwd()}/node_modules/.bin/husky-upgrade`); response += 'It upgraded the Husky config format - see https://github.com/Financial-Times/n-gage/issues/220. '; } if (!secretSquirrelPreCommitScriptExists()) { writePackageJsonFile(addScripts); response += 'It added some githook scripts. '; }; if (preGitHookExists()) { writePackageJsonFile(removePreGitHooks); response += 'It deleted some config > pre-git hooks. IMPORTANT: Delete the old local hooks with: "rm -rf .git/hooks/*" '; }; if (response !== '') { response = `✗ Note: n-gage just edited package.json. ${response} Please review and commit`; } return response; } const response = run(); console.log(response);