You're Invited:Meet the Socket Team at RSAC and BSidesSF 2026, March 23–26.RSVP
Socket
Book a DemoSign in
Socket

node-hooks

Package Overview
Dependencies
Maintainers
1
Versions
15
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

node-hooks - npm Package Compare versions

Comparing version
0.0.10
to
0.0.11
+9
commands/config.js
var main = function(args){
}
module.exports = main;
+143
-159
var fs = require("fs");
var exec = require("child_process").exec;
var colors = require("colors");

@@ -10,63 +9,57 @@ var install = require("../lib/install-module");

var hooksJsonPath = process.cwd()+"/hooks.json";
var hooksJsonPath = process.cwd() + "/hooks.json";
/** ================================================================================ **/
var main = function(args){
var main = function(args) {
var opts = setupOptions(args);
if(opts.valid){
if(hasHooksJson() && !opts.global){
install(opts.hook_module, function(success, node_module, module_version){
if(success){
var data = require("../lib/hook-module-package")(node_module);
opts.name = node_module;
opts.version = module_version;
var localFile = process.cwd()+"/"+opts.hook_module;
if(fs.existsSync(localFile)){
opts.version = opts.hook_module;
}
if(!opts.force){
isValidHookModule(data.json, function(err, success){
if(err){
console.log(err.red);
console.log(("`"+opts.hook_module+"`").red+" could not be added as it does not match the hook-module specification. If you want to override this be use the `-f` option.");
}
else if(opts.hook=="default"){
var valids = [];
var opts = setupOptions(args);
if (opts.valid) {
if (hasHooksJson() && !opts.global) {
install(opts.hook_module, function(success, node_module, module_version) {
if (success) {
var data = require("../lib/hook-module-package")(node_module);
opts.name = node_module;
opts.version = module_version;
var localFile = process.cwd() + "/" + opts.hook_module;
if (fs.existsSync(localFile)) {
opts.version = opts.hook_module;
}
if (!opts.force) {
isValidHookModule(data.json, function(err, success) {
if (err) {
console.log(err.red);
console.log(("`" + opts.hook_module + "`").red + " could not be added as it does not match the hook-module specification. If you want to override this be use the `-f` option.");
} else if (opts.hook == "default") {
var valids = [];
if(typeof data.json["hook-module"]["valid-for"]=="string"){
valids.push(data.json["hook-module"]["valid-for"]);
}
else{
valids = data.json["hook-module"]["valid-for"];
}
for(var i=0; i<valids.length; i++){
opts.hook = valids[i];
addToFiles(opts);
}
}
else{
addToFiles(opts);
}
});
}
else{
addToFiles(opts);
}
}
});
}
else if(opts.global){
console.log("This needs to be thought out better".yellow+" Look for it in a future release");
//addToFiles(opts);
}
else{
console.log("No `hooks.json` file was found!".red);
console.log("\tRun `hooks install` to add hooks to this folder".yellow);
}
}
if (typeof data.json["hook-module"]["valid-for"] == "string") {
valids.push(data.json["hook-module"]["valid-for"]);
} else {
valids = data.json["hook-module"]["valid-for"];
}
for (var i = 0; i < valids.length; i++) {
opts.hook = valids[i];
addToFiles(opts);
}
} else {
addToFiles(opts);
}
});
} else {
addToFiles(opts);
}
}
});
} else if (opts.global) {
console.log("This needs to be thought out better".yellow + " Look for it in a future release");
//addToFiles(opts);
} else {
console.log("No `hooks.json` file was found!".red);
console.log("\tRun `hooks install` to add hooks to this folder".yellow);
}
}
}

@@ -76,121 +69,112 @@

var hasHooksJson = function(){
return fs.existsSync(hooksJsonPath);
var hasHooksJson = function() {
return fs.existsSync(hooksJsonPath);
}
var setupOptions = function(args){
var opts = {
name: undefined,
version: undefined,
force: false,
global: false,
hook: "default",
depend: true,
hook_module: args[args.length-1],
valid: true
}
var setupOptions = function(args) {
var opts = {
name: undefined,
version: undefined,
force: false,
global: false,
hook: "default",
depend: true,
hook_module: args[args.length - 1],
valid: true
}
for(var i=0; i<args.length-1; i++){
var arg = args[i];
if(arg=="--default" || arg=="-d" || arg=="--global" || arg=="-g"){
opts.global = true;
}
else if(arg=="--hook"){
opts.hook = args[i+1];
i++;
}
else if(arg == "-f" || arg == "--force"){
opts.force = true;
}
else if(arg=="--soft"){
opts.depend = false;
}
else{
console.log(arg.red+ " is not a valid argument on `hooks add`".yellow);
opts.valid = false;
}
}
for (var i = 0; i < args.length - 1; i++) {
var arg = args[i];
if(opts.hook == "default" && opts.force){
console.log("-f, -force requires -hook".red);
opts.valid = false;
}
if (arg == "--default" || arg == "-d" || arg == "--global" || arg == "-g") {
opts.global = true;
} else if (arg == "--hook") {
opts.hook = args[i + 1];
i++;
} else if (arg == "-f" || arg == "--force") {
opts.force = true;
} else if (arg == "--soft") {
opts.depend = false;
} else {
console.log(arg.red + " is not a valid argument on `hooks add`".yellow);
opts.valid = false;
}
}
if(opts.hook == undefined){
console.log("--hook must be followed by <HOOK_NAME>".red);
opts.valid = false;
}
else if(opts.hook != "default"){
var possible_hooks = require("../lib/possible-hooks");
if(possible_hooks.indexOf(opts.hook)==-1){
console.log(opts.hook.red+" is not a valid hook".yellow);
opts.valid = false;
}
}
else if(opts.global && opts.depend){
console.log("--default and --depend cannot be used together".red);
opts.valid = false;
}
if (opts.hook == "default" && opts.force) {
console.log("-f, -force requires -hook".red);
opts.valid = false;
}
return opts;
if (opts.hook == undefined) {
console.log("--hook must be followed by <HOOK_NAME>".red);
opts.valid = false;
} else if (opts.hook != "default") {
var possible_hooks = require("../lib/possible-hooks");
if (possible_hooks.indexOf(opts.hook) == -1) {
console.log(opts.hook.red + " is not a valid hook".yellow);
opts.valid = false;
}
} else if (opts.global && opts.depend) {
console.log("--default and --depend cannot be used together".red);
opts.valid = false;
}
return opts;
}
var addToFiles = function(opts){
var addToFiles = function(opts) {
if(opts.version==undefined || opts.version.match(/\d\.\d\.\d/)==null){
opts.version = opts.hook_module.split("@")[1];
}
if (opts.version == undefined || opts.version.match(/\d\.\d\.\d/) == null) {
opts.version = opts.hook_module.split("@")[1];
}
if(opts.version==undefined){
//fall back is url
opts.version = opts.hook_module;
}
if (opts.version == undefined) {
//fall back is url
opts.version = opts.hook_module;
}
if(opts.global){
// var defaults = require("../lib/default-modules");
// defaults.json.hooks[opts.hook][opts.name] = opts.version;
// defaults.save(function(err){
// if(err){
// console.log("hooks add failed".yellow);
// }
// });
}
else{
if (opts.global) {
// var defaults = require("../lib/default-modules");
// defaults.json.hooks[opts.hook][opts.name] = opts.version;
// defaults.save(function(err){
// if(err){
// console.log("hooks add failed".yellow);
// }
// });
} else {
if(opts.depend){
var packageJsonFile = process.cwd()+"/package.json";
var packageJson = require(packageJsonFile);
packageJson.devDependencies = packageJson.devDependencies == undefined ? {} : packageJson.devDependencies;
packageJson.devDependencies[opts.name] = opts.version;
saveJson(packageJsonFile, packageJson, false);
}
if (opts.depend) {
var packageJsonFile = process.cwd() + "/package.json";
var packageJson = require(packageJsonFile);
packageJson.devDependencies = packageJson.devDependencies == undefined ? {} : packageJson.devDependencies;
packageJson.devDependencies[opts.name] = opts.version;
saveJson(packageJsonFile, packageJson, false);
}
var hooksJsonFile = process.cwd()+"/hooks.json";
var hooksJson = require(hooksJsonFile);
if(hooksJson[opts.hook]==undefined){
hooksJson[opts.hook] = {};
}
hooksJson[opts.hook][opts.name] = opts.version;
saveJson(hooksJsonFile, hooksJson, false);
}
var hooksJsonFile = process.cwd() + "/hooks.json";
var hooksJson = require(hooksJsonFile);
if (hooksJson[opts.hook] == undefined) {
hooksJson[opts.hook] = {};
}
hooksJson[opts.hook][opts.name] = opts.version;
saveJson(hooksJsonFile, hooksJson, false);
}
}
var saveJson = function(file, json, global){
var content = JSON.stringify(json, null, 2) + '\n';
try{
fs.writeFileSync(file, content);
}
catch(err){
if(err && err.code=="EACCES"){
console.log("FILE PERMISSION ERROR".red+" The current user does not have access to write to "+file);
if(global){
console.log("Default hook setup often requires admin access".yellow);
}
}
else if(err){
console.log("ERROR: ".red+"saveing "+file);
}
}
var saveJson = function(file, json, global) {
var content = JSON.stringify(json, null, 2) + '\n';
try {
fs.writeFileSync(file, content);
} catch (err) {
if (err && err.code == "EACCES") {
console.log("FILE PERMISSION ERROR".red + " The current user does not have access to write to " + file);
if (global) {
console.log("Default hook setup often requires admin access".yellow);
}
} else if (err) {
console.log("ERROR: ".red + "saveing " + file);
}
}
}

@@ -197,0 +181,0 @@

@@ -8,47 +8,42 @@ var fs = require("fs");

var packageJsonPath = process.cwd()+"/package.json";
var hooksJsonPath = process.cwd()+"/hooks.json";
var packageJsonPath = process.cwd() + "/package.json";
var hooksJsonPath = process.cwd() + "/hooks.json";
/** ================================================================================ **/
var main = function(args) {
var main = function(args){
//TODO: Add defaults to hooks.json
var options = {};
options.soft = args.indexOf("--soft") == -1 ? false : true;
options.bare = args.indexOf("--bare") == -1 ? false : true;
options.hasHooksJson = hasHooksJson();
options.hasPackageJson = hasPackageJson();
//TODO: Add defaults to hooks.json
var git = hasGit(options.bare);
if (git) {
create(options);
var options = {};
//options.addDefaults = args.indexOf("--add-defaults") == -1 ? false : true;
options.soft = args.indexOf("--soft") == -1 ? false : true;
options.bare = args.indexOf("--bare") == -1 ? false : true;
options.hasHooksJson = hasHooksJson();
options.hasPackageJson = hasPackageJson();
if (!options.soft && process.env.npm_package_name != "node-hooks") {
exec("NODE_HOOKS=DO_NOT_INSTALL npm install node-hooks --save-dev", function(err, stdout, stderr) {
if (stdout) {
console.log(stdout);
}
var git = hasGit(options.bare);
if (stderr) {
console.error(stderr);
}
if(git){
create(options);
if(!options.soft && process.env.npm_package_name != "node-hooks"){
exec("NODE_HOOKS=DO_NOT_INSTALL npm install node-hooks --save-dev", function(err, stdout, stderr){
if(stdout){
console.log(stdout);
}
if(stderr){
console.error(stderr);
}
if(err){
process.exit(err.code);
}
});
}
}
else{
console.log("ERROR:".red+" hooks depends on "+ "git".yellow);
var bare = options.bare ? " --bare" : "";
console.log(" Please run "+("`git init"+bare+"`").yellow+" before "+"`hooks install`".yellow);
process.exit(1);
}
if (err) {
process.exit(err.code);
}
});
}
} else {
console.log("ERROR:".red + " hooks depends on " + "git".yellow);
var bare = options.bare ? " --bare" : "";
console.log(" Please run " + ("`git init" + bare + "`").yellow + " before " + "`hooks install`".yellow);
process.exit(1);
}
}

@@ -58,92 +53,96 @@

var create = function(options){
if(!options.hasPackageJson){
createPackageJson(options);
}
else if(!options.hasHooksJson){
createHooksJson(options);
}
else{
createHooks(options);
installHooks(options);
}
var create = function(options) {
if (!options.hasPackageJson) {
createPackageJson(options);
} else if (!options.hasHooksJson) {
createHooksJson(options);
} else {
createHooks(options);
installHooks(options);
}
}
var createPackageJson = function(options){
var packageJson = {name:"default"};
var jsonString = JSON.stringify(packageJson, null, 2) + '\n';
createFile(packageJsonPath, jsonString, false, function(){
options.hasPackageJson = true;
create(options);
});
var createPackageJson = function(options) {
var packageJson = {
name: "default"
};
var jsonString = JSON.stringify(packageJson, null, 2) + '\n';
createFile(packageJsonPath, jsonString, false, function() {
options.hasPackageJson = true;
create(options);
});
}
var createHooksJson = function(options){
var defaultHooksJson = {};
var jsonString = JSON.stringify(defaultHooksJson, null, 2) + '\n';
createFile(hooksJsonPath, jsonString, false, function(){
options.hasHooksJson = true;
create(options);
});
var createHooksJson = function(options) {
var defaultHooksJson = {};
var jsonString = JSON.stringify(defaultHooksJson, null, 2) + '\n';
createFile(hooksJsonPath, jsonString, false, function() {
options.hasHooksJson = true;
create(options);
});
}
var createHooks = function(options){
var createHooks = function(options) {
var baseContent = fs.readFileSync(__dirname+"/../lib/hook-runner.sh", {encoding: "utf8"});
var hooks = require("../lib/possible-hooks");
var numHooks = hooks.length;
var baseContent = fs.readFileSync(__dirname + "/../lib/hook-runner.sh", {
encoding: "utf8"
});
var hooks = require("../lib/possible-hooks");
var numHooks = hooks.length;
var baseFileName = options.bare == true ? "./hooks/" : "./.git/hooks/";
var baseFileName = options.bare == true ? "./hooks/" : "./.git/hooks/";
while(numHooks--){
var hook = hooks[numHooks];
while (numHooks--) {
var hook = hooks[numHooks];
var fileName = baseFileName+hook;
var fileName = baseFileName + hook;
if(fs.existsSync(fileName)){
fs.renameSync(fileName, fileName+".old");
}
if (fs.existsSync(fileName)) {
fs.renameSync(fileName, fileName + ".old");
}
var content = baseContent.replace("{hook-to-run}", hook);
var content = baseContent.replace("{hook-to-run}", hook);
createFile(fileName, content, true);
}
createFile(fileName, content, true);
}
}
var installHooks = function(options){
var hooksJson = require(hooksJsonPath);
var installHooks = function(options) {
var hooksJson = require(hooksJsonPath);
var hooks = [];
var hooks = [];
var hookTypes = require("../lib/possible-hooks");
var hookTypes = require("../lib/possible-hooks");
for(var i=0; i<hookTypes.length; i++){
if(hooksJson[hookTypes[i]]!=undefined){
var hookNames = Object.keys(hooksJson[hookTypes[i]]);
for(var j=0; j<hookNames.length; j++){
hooks.push({name:hookNames[j], version:hooksJson[hookTypes[i]][hookNames[j]]});
}
}
}
var installHook = function(i, hooks, callback){
if(i<hooks.length){
var hook = hooks[i].name+"@"+hooks[i].version;
install(hook, function(success, node_module){
installHook(i+1, hooks, callback);
});
}
else{
callback();
}
}
for (var i = 0; i < hookTypes.length; i++) {
if (hooksJson[hookTypes[i]] != undefined) {
var hookNames = Object.keys(hooksJson[hookTypes[i]]);
for (var j = 0; j < hookNames.length; j++) {
hooks.push({
name: hookNames[j],
version: hooksJson[hookTypes[i]][hookNames[j]]
});
}
}
}
var whenFinsihed = function(){
console.log("hooks".blue+" has been added to this project");
}
var installHook = function(i, hooks, callback) {
if (i < hooks.length) {
var hook = hooks[i].name + "@" + hooks[i].version;
install(hook, function(success, node_module) {
installHook(i + 1, hooks, callback);
});
} else {
callback();
}
}
installHook(0, hooks, whenFinsihed);
var whenFinsihed = function() {
console.log("hooks".blue + " has been added to this project");
}
installHook(0, hooks, whenFinsihed);
}

@@ -154,26 +153,24 @@

var hasGit = function(bare){
if(!bare){
return fs.existsSync(".git") && hasHooksFolder(bare);
}
else{
return hasHooksFolder(bare);
}
var hasGit = function(bare) {
if (!bare) {
return fs.existsSync(".git") && hasHooksFolder(bare);
} else {
return hasHooksFolder(bare);
}
}
var hasHooksFolder = function(bare){
if(bare){
return fs.existsSync("hooks");
}
else{
return fs.existsSync(".git/hooks");
}
var hasHooksFolder = function(bare) {
if (bare) {
return fs.existsSync("hooks");
} else {
return fs.existsSync(".git/hooks");
}
}
var hasHooksJson = function(){
return fs.existsSync(hooksJsonPath);
var hasHooksJson = function() {
return fs.existsSync(hooksJsonPath);
}
var hasPackageJson = function(){
return fs.existsSync(packageJsonPath);
var hasPackageJson = function() {
return fs.existsSync(packageJsonPath);
}

@@ -184,27 +181,24 @@

var createFile = function(fileName, content, chmodX, callback){
var fileMade = function(err){
if(err){
console.error("`"+fileName+"` could not be created", err);
process.exit(1);
}
else if(chmodX===true){
exec("chmod a+x "+fileName, chmodDone);
}
else{
callback();
}
}
var createFile = function(fileName, content, chmodX, callback) {
var fileMade = function(err) {
if (err) {
console.error("`" + fileName + "` could not be created", err);
process.exit(1);
} else if (chmodX === true) {
exec("chmod a+x " + fileName, chmodDone);
} else {
callback();
}
}
var chmodDone = function(err, stdout, stderr){
if(err){
console.error("`"+fileName+"` could not be created", err, stderr);
process.exit(1);
}
else if(callback!=undefined){
callback();
}
}
var chmodDone = function(err, stdout, stderr) {
if (err) {
console.error("`" + fileName + "` could not be created", err, stderr);
process.exit(1);
} else if (callback != undefined) {
callback();
}
}
fs.writeFile(fileName, content, fileMade);
fs.writeFile(fileName, content, fileMade);
}

@@ -219,58 +213,57 @@

var forTheGlobalFile = function(){
var version = "0.0.0";
var forTheGlobalFile = function() {
var version = "0.0.0";
var start = function(){
var defaults = require("./lib/default-modules");
if(defaults.json==undefined){
defaults.json = {};
}
var start = function() {
var defaults = require("./lib/default-modules");
if(defaults.json.version!=version){
var old_version = defaults.json.version;
upgrade(defaults.json, function(data){
defaults.json = data;
defaults.save(function(){
if(old_version){
console.log("UPGRADE SUCCESSFULL");
}
else{
console.log("INSTALLATION SUCCESSFULL");
}
});
});
}
}
if (defaults.json == undefined) {
defaults.json = {};
}
if (defaults.json.version != version) {
var old_version = defaults.json.version;
upgrade(defaults.json, function(data) {
defaults.json = data;
defaults.save(function() {
if (old_version) {
console.log("UPGRADE SUCCESSFULL");
} else {
console.log("INSTALLATION SUCCESSFULL");
}
});
});
}
}
var upgrade = function(data, callback){
switch(data.version){
case undefined:
data.version = "0.0.0";
data.hooks = {
"applypatch-msg": {},
"pre-applypatch": {},
"post-applypatch": {},
"pre-commit": {},
"prepare-commit-msg": {},
"commit-msg": {},
"post-commit": {},
"pre-rebase": {},
"post-checkout": {},
"post-merge": {},
"pre-receive": {},
"update": {},
"post-receive": {},
"post-update": {},
"pre-auto-gc": {},
"post-rewrite": {}
}
}
var upgrade = function(data, callback) {
callback(data);
}
switch (data.version) {
case undefined:
data.version = "0.0.0";
data.hooks = {
"applypatch-msg": {},
"pre-applypatch": {},
"post-applypatch": {},
"pre-commit": {},
"prepare-commit-msg": {},
"commit-msg": {},
"post-commit": {},
"pre-rebase": {},
"post-checkout": {},
"post-merge": {},
"pre-receive": {},
"update": {},
"post-receive": {},
"post-update": {},
"pre-auto-gc": {},
"post-rewrite": {}
}
}
start();
callback(data);
}
start();
}
var fs = require("fs");
var exec = require("child_process").exec;
var colors = require("colors");

@@ -7,145 +6,141 @@

var hooksJsonPath = process.cwd()+"/hooks.json";
var hooksJsonPath = process.cwd() + "/hooks.json";
/** ================================================================================ **/
var main = function(args){
var main = function(args) {
var opts = {
hard: false,
global: false,
module: args[args.length-1],
hook: "default",
valid: true
}
var opts = {
hard: false,
global: false,
module: args[args.length - 1],
hook: "default",
valid: true
}
for(var i=0; i<args.length-1; i++){
if(args[i]=="--hard"){
opts.hard = true;
}
else if(args[i]=="--hook"){
if(opts.hook!="default"){ opts.valid = false; console.log("You cannot use --hook after --all-hooks".red)};
opts.hook = args[i+1];
i++;
}
else if(args[i]=="--all-hooks"){
if(opts.hook!="default"){ opts.valid = false; console.log("You cannot use --all-hooks after --hook".red)};
opts.hook = "all";
}
else{
console.log(args[i].red+ " is not a valid argument on `hooks remove`".yellow);
opts.valid = false;
}
}
for (var i = 0; i < args.length - 1; i++) {
if (args[i] == "--hard") {
opts.hard = true;
} else if (args[i] == "--hook") {
if (opts.hook != "default") {
opts.valid = false;
console.log("You cannot use --hook after --all-hooks".red)
};
opts.hook = args[i + 1];
i++;
} else if (args[i] == "--all-hooks") {
if (opts.hook != "default") {
opts.valid = false;
console.log("You cannot use --all-hooks after --hook".red)
};
opts.hook = "all";
} else {
console.log(args[i].red + " is not a valid argument on `hooks remove`".yellow);
opts.valid = false;
}
}
if(opts.hard && opts.global){
console.log("Error".red+" --hard and --default cannot be combined");
opts.valid = false;
}
if (opts.hard && opts.global) {
console.log("Error".red + " --hard and --default cannot be combined");
opts.valid = false;
}
if(opts.module == undefined){
opts.valid = false;
console.log("You must supply a module to be removed".red);
}
if (opts.module == undefined) {
opts.valid = false;
console.log("You must supply a module to be removed".red);
}
if(opts.valid){
if (opts.valid) {
removeFromHooks(opts);
removeFromHooks(opts);
if(opts.hard){
removeFromPackage(opts);
}
}
if (opts.hard) {
removeFromPackage(opts);
}
}
}
var removeFromHooks = function(opts){
var hooksJsonFile = process.cwd()+"/hooks.json";
var hooksJson = require(hooksJsonFile);
var removeFromHooks = function(opts) {
var hooksJsonFile = process.cwd() + "/hooks.json";
var hooksJson = require(hooksJsonFile);
var needsSave = false;
var needsSave = false;
var processRemove = function(hook, strict){
opts.hook = hook;
if(opts.hook!="default" && hooksJson[opts.hook] != undefined && hooksJson[opts.hook][opts.module] != undefined){
delete hooksJson[opts.hook][opts.module];
needsSave = true;
removeMessage(opts.module, opts.hook, " hooks.json");
}
else if(strict){
console.log("Unable to remove ".red+("`"+opts.module+"`").cyan+" from ".red+("`"+opts.hook+"`").yellow);
}
}
var processRemove = function(hook, strict) {
opts.hook = hook;
if (opts.hook != "default" && hooksJson[opts.hook] != undefined && hooksJson[opts.hook][opts.module] != undefined) {
delete hooksJson[opts.hook][opts.module];
needsSave = true;
removeMessage(opts.module, opts.hook, " hooks.json");
} else if (strict) {
console.log("Unable to remove ".red + ("`" + opts.module + "`").cyan + " from ".red + ("`" + opts.hook + "`").yellow);
}
}
if(opts.hook=="all"){
var allHooks = Object.keys(hooksJson);
for(var i=0; i<allHooks.length; i++){
processRemove(allHooks[i], false);
}
}
else{
if (opts.hook == "all") {
var allHooks = Object.keys(hooksJson);
for (var i = 0; i < allHooks.length; i++) {
processRemove(allHooks[i], false);
}
} else {
if(opts.hook=="default"){
var moduleJson = require("../lib/hook-module-package")(opts.module);
if(moduleJson["valid-for"]==undefined || moduleJson["valid-for"].length==0){
console.log(("`"+opts.module+"` does not have a default hook. Use --hook to specify one").red);
}
else{
for(var i=0; i<moduleJson["valid-for"].length; i++){
var hook = moduleJson["valid-for"][i]
if(hooksJson[hook] && hooksJson[hook][opts.module]){
processRemove(moduleJson["valid-for"][i], true);
}
}
if (opts.hook == "default") {
var moduleJson = require("../lib/hook-module-package")(opts.module);
if (moduleJson["valid-for"] == undefined || moduleJson["valid-for"].length == 0) {
console.log(("`" + opts.module + "` does not have a default hook. Use --hook to specify one").red);
} else {
for (var i = 0; i < moduleJson["valid-for"].length; i++) {
var hook = moduleJson["valid-for"][i]
if (hooksJson[hook] && hooksJson[hook][opts.module]) {
processRemove(moduleJson["valid-for"][i], true);
}
}
if(!needsSave){
console.log(("`"+opts.module+"` has not been installed on its default hook.").red);
}
}
}
else{
processRemove(opts.hook, true);
}
}
if (!needsSave) {
console.log(("`" + opts.module + "` has not been installed on its default hook.").red);
}
}
} else {
processRemove(opts.hook, true);
}
}
if(needsSave){
saveJson(hooksJsonFile, hooksJson, false);
}
if (needsSave) {
saveJson(hooksJsonFile, hooksJson, false);
}
}
var removeFromPackage = function(opts){
var packageJsonFile = process.cwd()+"/package.json";
var packageJson = require(packageJsonFile);
var removeFromPackage = function(opts) {
var packageJsonFile = process.cwd() + "/package.json";
var packageJson = require(packageJsonFile);
if(packageJson.devDependencies!=undefined && packageJson.devDependencies[opts.module] != undefined){
delete packageJson.devDependencies[opts.module];
removeMessage(opts.module, "devDependencies", "package.json");
saveJson(packageJsonFile, packageJson, false);
}
else{
console.log(("Unable to remove `"+opts.module+"` from package.json devDependencies.").red, opts);
}
if (packageJson.devDependencies != undefined && packageJson.devDependencies[opts.module] != undefined) {
delete packageJson.devDependencies[opts.module];
removeMessage(opts.module, "devDependencies", "package.json");
saveJson(packageJsonFile, packageJson, false);
} else {
console.log(("Unable to remove `" + opts.module + "` from package.json devDependencies.").red, opts);
}
}
var removeMessage = function(module, hook, file){
console.log("Removeing "+("`"+module+"`").cyan+" from "+hook.yellow+" in "+file.cyan)
var removeMessage = function(module, hook, file) {
console.log("Removeing " + ("`" + module + "`").cyan + " from " + hook.yellow + " in " + file.cyan)
}
var saveJson = function(file, json, global){
var content = JSON.stringify(json, null, 2) + '\n';
fs.writeFile(file, content, function(err){
if(err && err.code=="EACCES"){
console.log("FILE PERMISSION ERROR".red+" The current user does not have access to write to "+file);
if(global){
console.log("Default hook setup often requires admin access".yellow);
}
}
else if(err){
console.log("ERROR: ".red+"saveing "+file);
}
});
var saveJson = function(file, json, global) {
var content = JSON.stringify(json, null, 2) + '\n';
fs.writeFile(file, content, function(err) {
if (err && err.code == "EACCES") {
console.log("FILE PERMISSION ERROR".red + " The current user does not have access to write to " + file);
if (global) {
console.log("Default hook setup often requires admin access".yellow);
}
} else if (err) {
console.log("ERROR: ".red + "saveing " + file);
}
});
}
module.exports = main;
module.exports = main;
var fs = require("fs");
var exec = require('child_process').exec;
var spawn = require("child_process").spawn;

@@ -22,3 +21,3 @@ var colors = require("colors");

if (err) {
console.error("ERROR READING `hook.json`".red);
console.error("ERROR READING `hooks.json`".red);
console.log(">> " + "Has hooks been merged into this branch?".blue);

@@ -32,3 +31,3 @@ process.exit(0);

} catch (err) {
console.error("ERROR PARSING `hook.json`".red, err);
console.error("ERROR PARSING `hooks.json`".red, err);
process.exit(1);

@@ -35,0 +34,0 @@ }

//stops install/uninstall command if on a global run
if(process.env.npm_config_global!=="true" && process.env.NODE_HOOKS != "DO_NOT_INSTALL"){
if (process.env.npm_config_global !== "true" && process.env.NODE_HOOKS != "DO_NOT_INSTALL") {
var fs = require("fs");
var fs = require("fs");
var colors = require("colors");
var spawn = require("child_process").spawn;
if(fs.existsSync(process.cwd()+"/../.bin/hooks")){
//being installed a project folder
var exec = require("child_process").exec;
var command = "cd ../.. && "+process.cwd()+"/../.bin/hooks "+process.argv[2];
exec(command, function(err, stdout, stderr){
console.log(stdout);
console.log(stderr);
if(err){
process.exit(err.code);
}
});
}
else{
//being installed itself
require(process.cwd()+"/commands/"+process.argv[2])([]);
}
var cwd, file;
if (fs.existsSync(process.cwd() + "/../.bin/hooks")) {
//being installed a project folder
cwd = process.cwd() + "/../..";
file = process.cwd() + "/../.bin/hooks";
} else {
//being installed inside itself
cwd = process.cwd();
file = process.cwd() + "/.bin/hooks";
}
if (fs.existsSync(file)) {
var child = spawn("node", [file, process.argv[2]], {
cwd: cwd
});
child.stderr.on("data", function(data) {
process.stderr.write(data);
});
child.stdout.on("data", function(data) {
process.stdout.write(data);
});
child.on("error", function(err) {
console.error("HOOKS:", err.message);
})
child.on("close", function(code) {
process.exit(code);
});
} else {
console.log("Can't seem to find hook");
console.log("\tCWD: " + cwd.red);
console.log("\tFILE: " + file.red);
process.exit(1);
}
}
{
"pre-commit": {
"beautify.hks": "0.0.1"
"beautify.hks": "0.0.1",
"esprima.hks": "0.0.0"
}
}

@@ -21,3 +21,11 @@ {

"author": "Matthew Chase Whittemore <mcwhittemore@gmail.com>"
},
"esprima.hks": {
"desc": "Validate your javascript with each commit",
"valid-for": ["pre-commit"],
"sources": {
"npm": "esprima.hks"
},
"author": "Matthew Chase Whittemore <mcwhittemore@gmail.com>"
}
}
{
"name": "node-hooks",
"version": "0.0.10",
"preferGlobal": true,
"version": "0.0.11",
"description": "An NPM for git hooks.",

@@ -17,3 +16,4 @@ "main": "./bin/hooks.js",

"should": "1.2.2",
"beautify.hks": "0.0.1"
"beautify.hks": "0.0.1",
"esprima.hks": "0.0.0"
},

@@ -20,0 +20,0 @@ "scripts": {

@@ -29,3 +29,3 @@ # Hooks

## Available Hooks on NPM
## View Available Hooks on NPM

@@ -142,1 +142,6 @@ `hooks list`

* Bug fix concerning multiple hook-modules running from the same hook
### 0.0.11
* Moving all child_process not related to npm away from child_process.exec to child_process.spawn and directing child_process stdout to console.