{"_id":"grunt-task-helper","_rev":"27-b67ca2bb0d3565b7c203e0e29d84c344","name":"grunt-task-helper","description":"Help with handling the files (e.g. check changed files) before other tasks, or adding something (e.g. replace text).","dist-tags":{"latest":"0.3.10"},"versions":{"0.1.0":{"name":"grunt-task-helper","description":"Help with handling the files (e.g. check changed files) before other tasks, or adding something (e.g. replace text).","version":"0.1.0","homepage":"https://github.com/anseki/grunt-task-helper","author":{"name":"anseki"},"repository":{"type":"git","url":"git://github.com/anseki/grunt-task-helper.git"},"bugs":{"url":"https://github.com/anseki/grunt-task-helper/issues"},"licenses":[{"type":"MIT","url":"https://github.com/anseki/grunt-task-helper/blob/master/LICENSE-MIT"}],"main":"Gruntfile.js","engines":{"node":">= 0.8.0"},"scripts":{"test":"grunt test"},"devDependencies":{"grunt-contrib-jshint":"~0.1.1","grunt-contrib-clean":"~0.4.0","grunt-contrib-nodeunit":"~0.1.2","grunt":"~0.4.1"},"peerDependencies":{"grunt":"~0.4.1"},"keywords":["gruntplugin"],"_id":"grunt-task-helper@0.1.0","dist":{"shasum":"067b11454e7d8e837ae2d7588b301bf00279a34f","tarball":"https://registry.npmjs.org/grunt-task-helper/-/grunt-task-helper-0.1.0.tgz","integrity":"sha512-Xcf9agT1FcpkHA7x7St/3iqZa6gqJgPBdQCqy9iuwG/BfKhRDSHu6pM+9K11nzES27tsysbnARIO8r8xCh3tjA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC81bf/oWna1psrVkxJ31EjI4v2VR3tGe+MyUEhUiKMOAIhALF98fReikb4TVsEOuHbU9sOXQcpFA1D648jfOihFc8L"}]},"_from":".","_npmVersion":"1.2.30","_npmUser":{"name":"anseki","email":"AnSeki.aff@gmail.com"},"maintainers":[{"name":"anseki","email":"AnSeki.aff@gmail.com"}],"directories":{}},"0.1.1":{"name":"grunt-task-helper","description":"Help with handling the files (e.g. check changed files) before other tasks, or adding something (e.g. replace text).","version":"0.1.1","homepage":"https://github.com/anseki/grunt-task-helper","author":{"name":"anseki"},"repository":{"type":"git","url":"git://github.com/anseki/grunt-task-helper.git"},"bugs":{"url":"https://github.com/anseki/grunt-task-helper/issues"},"licenses":[{"type":"MIT","url":"https://github.com/anseki/grunt-task-helper/blob/master/LICENSE-MIT"}],"main":"Gruntfile.js","engines":{"node":">= 0.8.0"},"scripts":{"test":"grunt test"},"devDependencies":{"grunt-contrib-jshint":"~0.1.1","grunt-contrib-clean":"~0.4.0","grunt-contrib-nodeunit":"~0.1.2","grunt":"~0.4.1"},"peerDependencies":{"grunt":"~0.4.1"},"keywords":["gruntplugin","filter","exclude","mtime","file modification time","changed file","updated file","file size","replace text"],"_id":"grunt-task-helper@0.1.1","dist":{"shasum":"23cc1d48adc48ff4bf877b0672dbd6cb19a06ec9","tarball":"https://registry.npmjs.org/grunt-task-helper/-/grunt-task-helper-0.1.1.tgz","integrity":"sha512-BJ/QI3hV4KeSJPeCCIp+8rvQRFRXFSfj3y9NyijsQ6pmzYI3BuVpxUxPw/oFape6Mn5UjtKzS1v653JaPeKwjA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDCv/ODipqMOpCRdd9x3WZ9KQsaUjOKVtMr99mN02ZJpAiEAr2hw6FhievShZ3/FUC8QnTWBtAXcE9s3rpgkyJ7jgnI="}]},"_from":".","_npmVersion":"1.2.30","_npmUser":{"name":"anseki","email":"AnSeki.aff@gmail.com"},"maintainers":[{"name":"anseki","email":"AnSeki.aff@gmail.com"}],"directories":{}},"0.2.0":{"name":"grunt-task-helper","description":"Help with handling the files (e.g. check changed files) before other tasks, or adding something (e.g. replace text).","version":"0.2.0","homepage":"https://github.com/anseki/grunt-task-helper","author":{"name":"anseki"},"repository":{"type":"git","url":"git://github.com/anseki/grunt-task-helper.git"},"bugs":{"url":"https://github.com/anseki/grunt-task-helper/issues"},"licenses":[{"type":"MIT","url":"https://github.com/anseki/grunt-task-helper/blob/master/LICENSE-MIT"}],"main":"Gruntfile.js","engines":{"node":">= 0.8.0"},"scripts":{"test":"grunt test"},"devDependencies":{"grunt-contrib-jshint":"~0.1.1","grunt-contrib-clean":"~0.4.0","grunt-contrib-nodeunit":"~0.1.2","grunt":"~0.4.1"},"peerDependencies":{"grunt":"~0.4.1"},"keywords":["gruntplugin","filter","exclude","mtime","file modification time","changed file","updated file","file size","replace text"],"_id":"grunt-task-helper@0.2.0","dist":{"shasum":"8cc38b43cec6e67c15e6c42188b86b14fc335ab7","tarball":"https://registry.npmjs.org/grunt-task-helper/-/grunt-task-helper-0.2.0.tgz","integrity":"sha512-s6YD2YAFnFyPNWiqNw/nkEFGP/QcUC46GmNj3N+nVUDPk48eppEENUEJqyzb3OZ+hutKYk/ABF/ihoNvdxiZDg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHkSmdmBjMfOpxrEv5YYQMYQvPTo7+5HCBm2TYM+gxSfAiEAzRg2oeFNhUi8qUJqrdQgrFrjtbVtj4JM9JmNnHQf56g="}]},"_from":".","_npmVersion":"1.2.30","_npmUser":{"name":"anseki","email":"AnSeki.aff@gmail.com"},"maintainers":[{"name":"anseki","email":"AnSeki.aff@gmail.com"}],"directories":{}},"0.3.0":{"name":"grunt-task-helper","description":"Help with handling the files (e.g. check changed files) before other tasks, or adding something (e.g. replace text).","version":"0.3.0","homepage":"https://github.com/anseki/grunt-task-helper","author":{"name":"anseki"},"repository":{"type":"git","url":"git://github.com/anseki/grunt-task-helper.git"},"bugs":{"url":"https://github.com/anseki/grunt-task-helper/issues"},"licenses":[{"type":"MIT","url":"https://github.com/anseki/grunt-task-helper/blob/master/LICENSE-MIT"}],"main":"Gruntfile.js","engines":{"node":">= 0.8.0"},"scripts":{"test":"grunt test"},"devDependencies":{"grunt-contrib-jshint":"~0.1.1","grunt-contrib-clean":"~0.4.0","grunt-contrib-nodeunit":"~0.1.2","grunt":"~0.4.1"},"peerDependencies":{"grunt":"~0.4.1"},"keywords":["gruntplugin","filter","exclude","mtime","file modification time","changed file","updated file","file size","replace text"],"_id":"grunt-task-helper@0.3.0","dist":{"shasum":"d4f537ddb7247572a07009c223c310aff2ba3c74","tarball":"https://registry.npmjs.org/grunt-task-helper/-/grunt-task-helper-0.3.0.tgz","integrity":"sha512-6wRtL1xPrQeDMhC1pnuoTzbU4xs1/xW4SvgZQNp31MNUMyBpJ/712x5S9Rqpak1qYsb9D1IY5dPgYbkMQe3VsA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCdiCLM2f44dGDmz4CIthcP6NPQx00WzFNG9F+DW2X4RQIgF5Gnz58ByHzN+nEVp49mCAaxBd714n3CyoU1plCvVwM="}]},"_from":".","_npmVersion":"1.2.30","_npmUser":{"name":"anseki","email":"AnSeki.aff@gmail.com"},"maintainers":[{"name":"anseki","email":"AnSeki.aff@gmail.com"}],"directories":{}},"0.3.1":{"name":"grunt-task-helper","description":"Help with handling the files (e.g. check changed files) before other tasks, or adding something (e.g. replace text).","version":"0.3.1","homepage":"https://github.com/anseki/grunt-task-helper","author":{"name":"anseki"},"repository":{"type":"git","url":"git://github.com/anseki/grunt-task-helper.git"},"bugs":{"url":"https://github.com/anseki/grunt-task-helper/issues"},"licenses":[{"type":"MIT","url":"https://github.com/anseki/grunt-task-helper/blob/master/LICENSE-MIT"}],"main":"Gruntfile.js","engines":{"node":">= 0.8.0"},"scripts":{"test":"grunt test"},"devDependencies":{"grunt-contrib-jshint":"~0.1.1","grunt-contrib-clean":"~0.4.0","grunt-contrib-nodeunit":"~0.1.2","grunt":"~0.4.1"},"peerDependencies":{"grunt":"~0.4.1"},"keywords":["gruntplugin","filter","exclude","mtime","file modification time","changed file","updated file","file size","replace text"],"_id":"grunt-task-helper@0.3.1","dist":{"shasum":"f68b7dc5ec52c83869af204dfafc60db1c631866","tarball":"https://registry.npmjs.org/grunt-task-helper/-/grunt-task-helper-0.3.1.tgz","integrity":"sha512-//Tx5w0vc7axyYwYzbKFYADCY8+VmSRSCHjezXAnoFXHTQ4zxcOlnnzu2vN/STc6NEESRGnjxnx4oZseGTqJrQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDqNuA97KRul6yIlVjjXDu5qsPMSsQJq9IfRsU9fRV+FgIgdiRbAy6aAC9agZoHE5UpeB/VbFWqn0Sxu5PcSmhMnkM="}]},"_from":".","_npmVersion":"1.2.30","_npmUser":{"name":"anseki","email":"AnSeki.aff@gmail.com"},"maintainers":[{"name":"anseki","email":"AnSeki.aff@gmail.com"}],"directories":{}},"0.3.2":{"name":"grunt-task-helper","description":"Help with handling the files (e.g. check changed files) before other tasks, or adding something (e.g. replace text).","version":"0.3.2","homepage":"https://github.com/anseki/grunt-task-helper","author":{"name":"anseki"},"repository":{"type":"git","url":"git://github.com/anseki/grunt-task-helper.git"},"bugs":{"url":"https://github.com/anseki/grunt-task-helper/issues"},"licenses":[{"type":"MIT","url":"https://github.com/anseki/grunt-task-helper/blob/master/LICENSE-MIT"}],"main":"Gruntfile.js","engines":{"node":">= 0.8.0"},"scripts":{"test":"grunt test"},"devDependencies":{"grunt-contrib-jshint":"~0.1.1","grunt-contrib-clean":"~0.4.0","grunt-contrib-nodeunit":"~0.1.2","grunt":"~0.4.1"},"peerDependencies":{"grunt":"~0.4.1"},"keywords":["gruntplugin","filter","exclude","mtime","file modification time","changed file","updated file","file size","replace text"],"_id":"grunt-task-helper@0.3.2","dist":{"shasum":"3174fafc04ce8d95853c6e9745ad23d7946bd688","tarball":"https://registry.npmjs.org/grunt-task-helper/-/grunt-task-helper-0.3.2.tgz","integrity":"sha512-iTuJ0fwqrL+7oskcT4Yy1VxeWP+fbH3oedwMVMv9uQhd8oUUCd06WgbfrGVWNn0bW3/VMwiKEp9xs5IMLLu84g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE+gmBUwEOB3vGr5oCXikszEs+j2FV1oepc8YVV8YVBmAiAFdV0xSQIvPrL59AEqLyeu94/DUv2fuT7Tv48fREx6Rw=="}]},"_from":".","_npmVersion":"1.2.30","_npmUser":{"name":"anseki","email":"AnSeki.aff@gmail.com"},"maintainers":[{"name":"anseki","email":"AnSeki.aff@gmail.com"}],"directories":{}},"0.3.3":{"name":"grunt-task-helper","description":"Help with handling the files (e.g. check changed files) before other tasks, or adding something (e.g. replace text).","version":"0.3.3","homepage":"https://github.com/anseki/grunt-task-helper","author":{"name":"anseki"},"repository":{"type":"git","url":"git://github.com/anseki/grunt-task-helper.git"},"bugs":{"url":"https://github.com/anseki/grunt-task-helper/issues"},"licenses":[{"type":"MIT","url":"https://github.com/anseki/grunt-task-helper/blob/master/LICENSE-MIT"}],"main":"Gruntfile.js","engines":{"node":">= 0.8.0"},"scripts":{"test":"grunt test"},"devDependencies":{"grunt-contrib-jshint":"~0.1.1","grunt-contrib-clean":"~0.4.0","grunt-contrib-nodeunit":"~0.1.2","grunt":"~0.4.1"},"peerDependencies":{"grunt":"~0.4.1"},"keywords":["gruntplugin","filter","exclude","mtime","file modification time","changed file","updated file","file size","replace text"],"_id":"grunt-task-helper@0.3.3","dist":{"shasum":"51fb54e9b97baca1f586596bd3d951f79ed2a00f","tarball":"https://registry.npmjs.org/grunt-task-helper/-/grunt-task-helper-0.3.3.tgz","integrity":"sha512-WA9zOj2iDHKhGPi+Y/ufJW9u0O9YNGcBEOqMDUgSDPX8AZSAW/XJ0vtz4kPsknwsItFvgaUft8DOg6PuyRE/Rw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDn6Cpy8063p4yCYK32C6KQMN5GSjgeNrCMGkSeVqSzqQIhAL6pCpajZeWHnVLaq1yEDBBLSR3B8vp8bcjF/TcKQL9I"}]},"_from":".","_npmVersion":"1.2.30","_npmUser":{"name":"anseki","email":"AnSeki.aff@gmail.com"},"maintainers":[{"name":"anseki","email":"AnSeki.aff@gmail.com"}],"directories":{}},"0.3.4":{"name":"grunt-task-helper","description":"Help with handling the files (e.g. check changed files) before other tasks, or adding something (e.g. replace text).","version":"0.3.4","homepage":"https://github.com/anseki/grunt-task-helper","author":{"name":"anseki"},"repository":{"type":"git","url":"git://github.com/anseki/grunt-task-helper.git"},"bugs":{"url":"https://github.com/anseki/grunt-task-helper/issues"},"licenses":[{"type":"MIT","url":"https://github.com/anseki/grunt-task-helper/blob/master/LICENSE-MIT"}],"main":"Gruntfile.js","engines":{"node":">= 0.8.0"},"scripts":{"test":"grunt test"},"devDependencies":{"grunt-contrib-jshint":"~0.1.1","grunt-contrib-clean":"~0.4.0","grunt-contrib-nodeunit":"~0.1.2","grunt":"~0.4.1"},"peerDependencies":{"grunt":"~0.4.1"},"keywords":["gruntplugin","filter","exclude","mtime","file modification time","changed file","updated file","file size","replace text"],"_id":"grunt-task-helper@0.3.4","dist":{"shasum":"2093eaf565b6108b20b0070dafb7d6e7ddb0c806","tarball":"https://registry.npmjs.org/grunt-task-helper/-/grunt-task-helper-0.3.4.tgz","integrity":"sha512-vagaxTHLANEZD541K2bnoNVjovxNcYZCnZGYYlX7mA4FY6orka/xWkZM1ou1KvFMpvpPyGbm5bTs2+m6NWy8iA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHxpbqksAy48kaY8V6+6DIzDOapuQzM0Dc2T/2K+ojAtAiAhf7X7IgxQrxvzAfY4u+tgb7JjcclaeJx/UIXiYT2y+w=="}]},"_from":".","_npmVersion":"1.2.30","_npmUser":{"name":"anseki","email":"AnSeki.aff@gmail.com"},"maintainers":[{"name":"anseki","email":"AnSeki.aff@gmail.com"}],"directories":{}},"0.3.5":{"name":"grunt-task-helper","description":"Help with handling the files (e.g. check changed files) before other tasks, or adding something (e.g. replace text).","version":"0.3.5","homepage":"https://github.com/anseki/grunt-task-helper","author":{"name":"anseki"},"repository":{"type":"git","url":"git://github.com/anseki/grunt-task-helper.git"},"bugs":{"url":"https://github.com/anseki/grunt-task-helper/issues"},"licenses":[{"type":"MIT","url":"https://github.com/anseki/grunt-task-helper/blob/master/LICENSE-MIT"}],"engines":{"node":">= 0.8.0"},"peerDependencies":{"grunt":"~0.4.1"},"keywords":["gruntplugin","filter","exclude","mtime","file modification time","changed file","updated file","file size","replace text"],"_id":"grunt-task-helper@0.3.5","dist":{"shasum":"70afe4ac65ff72d35af4bb2fe4d424cc7cd48030","tarball":"https://registry.npmjs.org/grunt-task-helper/-/grunt-task-helper-0.3.5.tgz","integrity":"sha512-lrMjVjv5bubBWjv1ymT6r9SWP7Ggt27jKg+tbjOeQrdp2gNdKfhb+ABskdWvi1vxi+micqgNV2fbXc+Zaelu4g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHHZ3k+025FoJTIMSiJxX6W2dPUlWfBIxkL2GArxmd31AiEAiMmiTXAhXHOenejqNA/XZ8UFQxm/C9RvUNKzyD/aHQI="}]},"_resolved":"c:\\DOCUME~1\\Admin\\LOCALS~1\\Temp\\npm-836-0L_QZ0-G\\1388487282750-0.36787210777401924\\tmp.tgz","_from":".","_npmVersion":"1.3.15","_npmUser":{"name":"anseki","email":"AnSeki.aff@gmail.com"},"maintainers":[{"name":"anseki","email":"AnSeki.aff@gmail.com"}],"directories":{}},"0.3.6":{"name":"grunt-task-helper","version":"0.3.6","title":"grunt-task-helper","description":"Help with handling the files (e.g. check changed files) before other tasks, or adding something (e.g. replace text).","keywords":["gruntplugin","filter","exclude","mtime","file modification time","changed file","updated file","file size","replace text"],"engines":{"node":">= 0.8.0"},"peerDependencies":{"grunt":"~0.4.1"},"homepage":"https://github.com/anseki/grunt-task-helper","repository":{"type":"git","url":"git://github.com/anseki/grunt-task-helper.git"},"bugs":{"url":"https://github.com/anseki/grunt-task-helper/issues"},"licenses":"MIT","author":{"name":"anseki","url":"https://github.com/anseki"},"gitHead":"355100c07109ec809708d7b71f38e33d3980f419","_id":"grunt-task-helper@0.3.6","scripts":{},"_shasum":"9e3a1745f3e191232de4c55e0e11b7052707a106","_from":".","_npmVersion":"1.4.28","_npmUser":{"name":"anseki","email":"AnSeki.aff@gmail.com"},"maintainers":[{"name":"anseki","email":"AnSeki.aff@gmail.com"}],"dist":{"shasum":"9e3a1745f3e191232de4c55e0e11b7052707a106","tarball":"https://registry.npmjs.org/grunt-task-helper/-/grunt-task-helper-0.3.6.tgz","integrity":"sha512-gLaJJJoocWS/gWtXjAc8To8QUg8TdKwU7W8rIg6+uNRFi+uSSU5HdhVNai+fBEXMEOiTNQhTGBIGDfhfqfXFog==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDeJDQFUyd+uRuLiz27zDb3A7A+5Bzf/v1XEpdZqUjR5AiEAp9AssLCYseXVjbkyejartLP7jz+4tMG/qgSv9dWwyL8="}]},"directories":{}},"0.3.7":{"name":"grunt-task-helper","version":"0.3.7","title":"grunt-task-helper","description":"Help with handling the files (e.g. check changed files) before other tasks, or adding something (e.g. replace text).","keywords":["gruntplugin","filter","exclude","mtime","file modification time","changed file","updated file","file size","replace text"],"engines":{"node":">= 0.8.0"},"peerDependencies":{"grunt":"~0.4.1"},"homepage":"https://github.com/anseki/grunt-task-helper","repository":{"type":"git","url":"git://github.com/anseki/grunt-task-helper.git"},"bugs":{"url":"https://github.com/anseki/grunt-task-helper/issues"},"license":"MIT","author":{"name":"anseki","url":"https://github.com/anseki"},"gitHead":"27b29a12df6eb22f575d05f3be2ff1964d8049a1","_id":"grunt-task-helper@0.3.7","scripts":{},"_shasum":"994aa975841eacb4bf55b8e740991872ba2533a9","_from":".","_npmVersion":"1.4.28","_npmUser":{"name":"anseki","email":"AnSeki.aff@gmail.com"},"maintainers":[{"name":"anseki","email":"AnSeki.aff@gmail.com"}],"dist":{"shasum":"994aa975841eacb4bf55b8e740991872ba2533a9","tarball":"https://registry.npmjs.org/grunt-task-helper/-/grunt-task-helper-0.3.7.tgz","integrity":"sha512-jenxjhHjHvyAeqpbH+iAqomvvPoFesMlhZ8SB4BK856jcTD4VPaE+nK4RoJzlPGV+FmXNod7NxZ8ILSGDquHTg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCXluZgvYXkdWTz0F39XboskZFshbXeYFeCQVWsZ3ucDQIhAPC4q71ew00IEgcA877cu2mLuV7dsdhz3kTbhbfrEJSH"}]},"directories":{}},"0.3.8":{"name":"grunt-task-helper","version":"0.3.8","title":"grunt-task-helper","description":"Help with handling the files (e.g. check changed files) before other tasks, or adding something (e.g. replace text).","keywords":["gruntplugin","filter","exclude","mtime","file modification time","changed file","updated file","file size","replace text"],"engines":{"node":">= 0.8.0"},"peerDependencies":{"grunt":">=0.4.0"},"homepage":"https://github.com/anseki/grunt-task-helper","repository":{"type":"git","url":"git://github.com/anseki/grunt-task-helper.git"},"bugs":{"url":"https://github.com/anseki/grunt-task-helper/issues"},"license":"MIT","author":{"name":"anseki","url":"https://github.com/anseki"},"gitHead":"7455923811657e17cf1dc25914d380b6cb454130","_id":"grunt-task-helper@0.3.8","scripts":{},"_shasum":"205ff636c11b4c8fa7ebea00890c1078d16865b4","_from":".","_npmVersion":"2.14.12","_nodeVersion":"4.2.6","_npmUser":{"name":"anseki","email":"AnSeki.aff@gmail.com"},"maintainers":[{"name":"anseki","email":"AnSeki.aff@gmail.com"}],"dist":{"shasum":"205ff636c11b4c8fa7ebea00890c1078d16865b4","tarball":"https://registry.npmjs.org/grunt-task-helper/-/grunt-task-helper-0.3.8.tgz","integrity":"sha512-Gb5nBIE/RwIYP6DONTI/viE+kBtjFeciBj6n/7oPeHkSI+SBe1+nMSxnPgwluKAnF3MrOu5zA5vjyHBdsea6Uw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDBkHORTvE/tQt/N7KruzD8skgjjv1kju7JaiE/NrTSOQIhALYAEBordYQVcXYmMC+ZRz5j1RIdgaIyszlJTg4oXCG9"}]},"_npmOperationalInternal":{"host":"packages-5-east.internal.npmjs.com","tmp":"tmp/grunt-task-helper-0.3.8.tgz_1456028538993_0.27413346339017153"},"directories":{}},"0.3.9":{"name":"grunt-task-helper","version":"0.3.9","title":"grunt-task-helper","description":"Help with handling the files (e.g. check changed files) before other tasks, or adding something (e.g. replace text).","keywords":["gruntplugin","filter","exclude","mtime","file modification time","changed file","updated file","file size","replace text"],"engines":{"node":">= 0.8.0"},"peerDependencies":{"grunt":">=0.4.0"},"homepage":"https://github.com/anseki/grunt-task-helper","repository":{"type":"git","url":"git://github.com/anseki/grunt-task-helper.git"},"bugs":{"url":"https://github.com/anseki/grunt-task-helper/issues"},"license":"MIT","author":{"name":"anseki","url":"https://github.com/anseki"},"gitHead":"6ff29452b62d7781fcd4bd0b1bb37e06f2991f9c","_id":"grunt-task-helper@0.3.9","scripts":{},"_shasum":"fb0ba85a3d00523530c0f197d2539219f38c282f","_from":".","_npmVersion":"3.10.9","_nodeVersion":"6.9.2","_npmUser":{"name":"anseki","email":"AnSeki.aff@gmail.com"},"maintainers":[{"name":"anseki","email":"AnSeki.aff@gmail.com"}],"dist":{"shasum":"fb0ba85a3d00523530c0f197d2539219f38c282f","tarball":"https://registry.npmjs.org/grunt-task-helper/-/grunt-task-helper-0.3.9.tgz","integrity":"sha512-vRvamX75J9dTvkndYUbxiNZyJRYBLUcUPQf5S9cqcx/dI8DeEY00JX/1sp/JobJXtkclqKjW/KcJEybA84dN3A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCG+kdMQsLVDZxfGm8jIhiDYjuJf3DsFBMF4PCVgSAMJgIhAKnw5lpvWZe7/HnoR4oE5l1uYt1tz9ILQJ+P52qSfQfO"}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/grunt-task-helper-0.3.9.tgz_1485960788858_0.3926883991807699"},"directories":{}},"0.3.10":{"name":"grunt-task-helper","version":"0.3.10","title":"grunt-task-helper","description":"Help with handling the files (e.g. check changed files) before other tasks, or adding something (e.g. replace text).","keywords":["gruntplugin","filter","exclude","mtime","file modification time","changed file","updated file","file size","replace text"],"files":["tasks/*.js","LICENSE-MIT"],"engines":{"node":">= 0.8.0"},"peerDependencies":{"grunt":">=0.4.0"},"homepage":"https://github.com/anseki/grunt-task-helper","repository":{"type":"git","url":"git://github.com/anseki/grunt-task-helper.git"},"bugs":{"url":"https://github.com/anseki/grunt-task-helper/issues"},"license":"MIT","author":{"name":"anseki","url":"https://github.com/anseki"},"gitHead":"bbf70ab4a693b930457e263e2c0372226c699730","_id":"grunt-task-helper@0.3.10","scripts":{},"_shasum":"dedb659d51a94e0f64b8377af473856cc170e491","_from":".","_npmVersion":"3.10.9","_nodeVersion":"6.9.2","_npmUser":{"name":"anseki","email":"AnSeki.aff@gmail.com"},"maintainers":[{"name":"anseki","email":"AnSeki.aff@gmail.com"}],"dist":{"shasum":"dedb659d51a94e0f64b8377af473856cc170e491","tarball":"https://registry.npmjs.org/grunt-task-helper/-/grunt-task-helper-0.3.10.tgz","fileCount":4,"unpackedSize":40939,"integrity":"sha512-4+MAwUerSDrm/cujil+HIbDyFIq+xPOlLG2bs/Ve2n25M9XynUC4Rms2Uw5SGi8ysBH3smIS+cmMEuuLHoIvWg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAZHus+RtjBtt+9Pvb6n7RI7e61jOJ88NsiAiyQzvEK/AiBYkRdymU2ZRL8ocJzRmiYO1pYWrCQtxdJCD2mGT9Ex7Q=="}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grunt-task-helper_0.3.10_1518949308086_0.2506542053448857"},"_hasShrinkwrap":false}},"readme":"# grunt-task-helper\n\n[![npm](https://img.shields.io/npm/v/grunt-task-helper.svg)](https://www.npmjs.com/package/grunt-task-helper) [![GitHub issues](https://img.shields.io/github/issues/anseki/grunt-task-helper.svg)](https://github.com/anseki/grunt-task-helper/issues) [![dependencies](https://img.shields.io/badge/dependencies-No%20dependency-brightgreen.svg)](package.json) [![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE-MIT)\n\ntaskHelper helps selecting files for other tasks.  \nFor example, you want to minify only changed JS files. Then taskHelper selects files which are newer than `dest` from `src` (or newer than the time when this ran last time), and these files are passed to [grunt-contrib-uglify](https://github.com/gruntjs/grunt-contrib-uglify) task.\n\nAnd, taskHelper helps you do something small to files (or file's contents).  \nFor example, rename file, replace text, etc...  \nYou can create your custom task to do something easily via `grunt.registerTask()`. Or, writing new plugin is easy too. Using taskHelper is more easy.\n\n## Getting Started\nThis plugin requires Grunt `~0.4.1`\n\nIf you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:\n\n```shell\nnpm install grunt-task-helper --save-dev\n```\n\nOnce the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:\n\n```js\ngrunt.loadNpmTasks('grunt-task-helper');\n```\n\n## The \"taskHelper\" task\ntaskHelper accepts standard Grunt `files` components (see [Files](http://gruntjs.com/configuring-tasks#files)) and [*handlers*](#handlers).  \nThe handler is a *JavaScript Function* which you wrote, or a name of [builtin handler](#builtin-handlers). These handlers are called in some timings to select files or do something to files or file's contents. If you want, taskHelper creates standard Grunt `files` components which are new for other tasks.\n\n### Overview\nIn your project's Gruntfile, add a section named `taskHelper` to the data object passed into `grunt.initConfig()` (see [Configuring tasks](http://gruntjs.com/configuring-tasks)).  \nYou specify the `files` and some [*handlers*](#handlers) (e.g. `options.handlerByFile`). taskHelper accepts these all files, and some files are selected or done something via handler, and only selected files (filtered files) are passed to other tasks via `options.filesArray`.\n\n**Example:** Copy only CSS files which are needed. This handler works like expanded [Custom Filter Function](http://gruntjs.com/configuring-tasks#custom-filter-function).\n\n`Gruntfile.js`\n\n```js\ngrunt.initConfig({\n  taskHelper: {\n    deploy: {\n      options: {\n        handlerByFileSrc: function(src, dest, options) {\n          var pathElms = src.match(/^(.+)\\.css$/), filepath;\n          if (pathElms) {\n\n            // CSS file from SCSS file is not needed.\n            if (grunt.file.exists(pathElms[1] + '.scss'))\n              { return false; }\n\n            // Give priority to souces directory.\n            filepath = src.replace(/^develop/, 'souces');\n            if (grunt.file.exists(filepath)) { return filepath; }\n          }\n        },\n        filesArray: []\n      },\n      src: 'develop/**/*.{css,scss}',\n      dest: 'backup/'\n    }\n  },\n  copy: {\n    deploy: {\n      // Copy files which are selected via taskHelper.\n      files: '<%= taskHelper.deploy.options.filesArray %>'\n    }\n  }\n});\n```\n\n**Example:** Minify only changed JS files. (see [Builtin handler \"newFile\"](#builtin-handlers-newfile).)\n\n`Gruntfile.js`\n\n```js\ngrunt.initConfig({\n  taskHelper: {\n    deploy: {\n      options: {\n        // Select files which are newer than `dest`.\n        handlerByFile: 'newFile',\n        filesArray: []\n      },\n      expand: true,\n      cwd: 'develop/',\n      src: '**/*.js',\n      dest: 'public_html/'\n    }\n  },\n  uglify: {\n    deploy: {\n      // Minify files which are selected via taskHelper.\n      files: '<%= taskHelper.deploy.options.filesArray %>'\n    }\n  }\n});\n```\n\n**Example:** Insert menu navigation into HTML files.\n\n`Gruntfile.js`\n\n```js\nvar htmlMenu = grunt.file.read('../menu.html');\ngrunt.initConfig({\n  taskHelper: {\n    deploy: {\n      options: {\n        handlerByContent: function(contentSrc, options) {\n          // Insert HTML content to placeholder.\n          return contentSrc.replace(/<%MENU%>/, htmlMenu);\n        }\n      },\n      expand: true,\n      cwd: 'develop/',\n      src: '**/*.html',\n      dest: 'public_html/'\n    }\n  }\n});\n```\n\n**Example:** Edit HTML files to refer to minified JS files (e.g. `file.js` to `file.min.js`).\n\n`Gruntfile.js`\n\n```js\nvar jsFiles = [];\ngrunt.initConfig({\n  taskHelper: {\n    // Get source JS files and minified JS files via globbing pattern.\n    getJs: {\n      options: {\n        filesArray: jsFiles\n      },\n      expand: true,\n      cwd: 'develop/',\n      src: '**/*.js',\n      dest: 'public_html/',\n      ext: '.min.js'\n    },\n    // Edit HTML files. <script src=\"file.js\"> to <script src=\"file.min.js\">\n    editHtml: {\n      options: {\n        handlerByContent: function(contentSrc, options) {\n          jsFiles.forEach(function(f) {\n            // Ignore directory path, but not doing it is better.\n            var src = f.src[0].replace(/^.*\\//, ''),\n              dest = f.dest.replace(/^.*\\//, ''),\n              reSrc = new RegExp('(<script\\\\b[^>]+\\\\bsrc=\"[^\"]*)' +\n                src.replace(/(\\W)/g, '\\\\$1') + '(\")', 'ig');\n              // Make these in every calling this function,\n              // but keeping these is better.\n            contentSrc = contentSrc.replace(reSrc, '$1' + dest + '$2');\n          });\n          return contentSrc;\n        }\n      },\n      expand: true,\n      cwd: 'develop/',\n      src: '**/*.html',\n      dest: 'public_html/'\n    }\n  },\n  uglify: {\n    minifyJs: {\n      // Minify files which are selected via taskHelper:getJs.\n      files: jsFiles\n    }\n  }\n});\n\n// taskHelper:getJs must be first.\ngrunt.registerTask('default',\n  ['taskHelper:getJs', 'uglify:minifyJs', 'taskHelper:editHtml']);\n```\n\n### <a name =\"handlers\">Handlers</a>\ntaskHelper parses `files` components, and calls handlers at some timings. The flow may be changed by return value of handlers.  \nYou can specify *JavaScript Function* which you wrote, or a name of [builtin handler](#builtin-handlers). If you want, you can specify multiple handlers into a timing by specifying array of these.\n\nBelow are timings which call handlers, and how to specify each handlers.\n\n#### handlerByTask\nThe handlers which were specified via `options.handlerByTask` are called per a task(target) before `files` components are parsed. This may be a handler, or an array which includes multiple handlers. (see [Cycle of handlers](#cycle-handlers).)  \nIf *JavaScript Function* is specified, following arguments are assigned, and return value is the following meaning.\n\n```js\nhandlerByTask(options)\n```\n\n+ <strong>`options` Type: Object</strong>  \nCopy of `options` which is passed to `grunt.initConfig()`.\n\n+ <strong>Return value</strong>  \nIf the handler returns `false`, exit current task immediately, and the remaining handlers are not called.  \n*NOTE:* Any value except `false` (e.g. `undefined` or returns with *no value*) is ignored. i.e. it means the same as `return true`.\n\n**Example:**\n\n`Gruntfile.js`\n\n```js\ngrunt.initConfig({\n  // Configuring httpd.\n  concat: {\n    setup: {\n      src: ['/lib/httpd/common.conf', 'httpd/project.conf'],\n      dest: '/etc/httpd/conf/httpd.conf'\n    }\n  },\n  taskHelper: {\n    setup: {\n      options: {\n        handlerByTask: function(options) {\n          // Restart httpd.\n          var exec = require('child_process').exec;\n          exec('service node-httpd restart',\n            function (error, stdout, stderr) {\n              console.log('stdout: ' + stdout);\n              console.log('stderr: ' + stderr);\n              if (error !== null)\n                { console.log('exec error: ' + error); }\n            }\n          );\n        }\n      }\n    }\n  }\n});\n```\n\n#### handlerByFileSrc\nThe handlers which were specified via `options.handlerByFileSrc` are called per a `src` file in specified `files` components (and parsed by Grunt). This may be a handler, or an array which includes multiple handlers. (see [Cycle of handlers](#cycle-handlers).)  \nIf *JavaScript Function* is specified, following arguments are assigned, and return value is the following meaning.\n\n```js\nhandlerByFileSrc(src, dest, options)\n```\n\n+ <strong>`src` Type: String</strong>  \nThe file path of a `src` file in specified `files` components. This was parsed by Grunt, therefore [Globbing patterns](http://gruntjs.com/configuring-tasks#globbing-patterns) (e.g. `foo/*.js`) which was specified to `src` became real path that was found (e.g. `foo/file-1.js`).  \nIf `src` includes multiple files (e.g. array of files, or files `file-1.js` and `file-2.js` which was found via globbing pattern `*.js`), all handlers in `handlerByFileSrc` are called with an assigned first file in `src`, and these handlers are called with an assigned second file, and continue next. (see [Cycle of handlers](#cycle-handlers).) Note that this flow may be changed by handler. (see Return value below.)\n\n+ <strong>`dest` Type: String</strong>  \nThe file path of a `dest` file in specified `files` components.\n\n+ <strong>`options` Type: Object</strong>  \nCopy of `options` which is passed to `grunt.initConfig()`.\n\n+ <strong>Return value</strong>  \nIf the handler returns `false`, remove current file path from `src`, and the remaining handlers in `handlerByFileSrc` are not called. This is like a `filter` (see [Custom Filter Function](http://gruntjs.com/configuring-tasks#custom-filter-function)). If other tasks will take these selected files (filtered files), an Array must be specified to `options.filesArray`. taskHelper adds `files` components to this array, and you let other task refer to this array.  \n*NOTE:* Any value except `false` (e.g. `undefined` or returns with *no value*) is ignored. i.e. it means the same as `return true`.  \nIf the handler returns String, the current `src` file path is replaced with this String. Note that other task may ignore the `src` file which doesn't exist.\n\n**Example:**\n\n`Gruntfile.js`\n\n```js\nvar cssFiles = [ {\n    src: 'theme-base/css/base.css',\n    dest: 'public_html/css/base.css'\n  } ],\n  path = require('path');\ngrunt.initConfig({\n  taskHelper: {\n    deploy: {\n      options: {\n        handlerByFileSrc: function(src, dest, options) {\n          var pathElms = path.basename(src).match(/^(.+?)\\.test(\\.css)$/), newSrc;\n          if (pathElms) {\n            newSrc = 'theme-dark/css/' + pathElms[1] + pathElms[2];\n            return grunt.file.exists(newSrc) ?\n              newSrc :  // Change theme to dark.\n              false;    // Exclude this.\n          }\n        },\n        filesArray: cssFiles\n      },\n      expand: true,\n      cwd: 'develop/',\n      src: '**/*.css',\n      dest: 'public_html/'\n    }\n  },\n  cssmin: {\n    deploy: {\n      files: cssFiles\n    }\n  }\n});\n```\n\n#### handlerByFile\nThe handlers which were specified via `options.handlerByFile` are called per an element in specified `files` components (and parsed by Grunt, and might have changed by `handlerByFileSrc`). This may be a handler, or an array which includes multiple handlers. (see [Cycle of handlers](#cycle-handlers).)  \nIf *JavaScript Function* is specified, following arguments are assigned, and return value is the following meaning.\n\n```js\nhandlerByFile(srcArray, dest, options)\n```\n\n+ <strong>`srcArray` Type: Array</strong>  \nThe array which includes the file path of `src` files in specified `files` components. This was parsed by Grunt, therefore [Globbing patterns](http://gruntjs.com/configuring-tasks#globbing-patterns) (e.g. `foo/*.js`) which was specified to `src` became real path that was found (e.g. `foo/file-1.js`). And, these might have changed by handlers in `handlerByFileSrc`. (see above.)  \nIf `src` is a file path (e.g. String `'foo/file.js'`), this array includes an element (e.g. Array `['foo/file.js']`). If `src` files were all not found, array is empty.\n\n+ <strong>`dest` Type: String</strong>  \nThe file path of a `dest` file in specified `files` components.\n\n+ <strong>`options` Type: Object</strong>  \nCopy of `options` which is passed to `grunt.initConfig()`.\n\n+ <strong>Return value</strong>  \nIf the handler returns `false`, remove current element from `files` components, and the remaining handlers in `handlerByFile` are not called. If other tasks will take these selected files (filtered files), an Array must be specified to `options.filesArray`. taskHelper adds `files` components to this array, and you let other task refer to this array.  \n*NOTE:* Any value except `false` (e.g. `undefined` or returns with *no value*) is ignored. i.e. it means the same as `return true`.  \nIf the handler returns String, the current `dest` file path is replaced with this String.\n\n**Example:**\n\n`Gruntfile.js`\n\n```js\nvar path = require('path');\ngrunt.initConfig({\n  taskHelper: {\n    deploy: {\n      options: {\n        handlerByFile: function(srcArray, dest, options) {\n          if (!srcArray.length) {\n            // Exclude this.\n            return false;\n          } else if (srcArray.length > 1) {\n            // Multiple photos in a page.\n            return path.dirname(dest) + '/thumbnails.html';\n          }\n        },\n        filesArray: []\n      },\n      files: [\n        {\n          src: 'public_html/jon/photos/*.jpg',\n          dest: 'public_html/jon/photos/photo.html'\n        },\n        {\n          src: 'public_html/kim/photos/*.jpg',\n          dest: 'public_html/kim/photos/photo.html'\n        }\n      ]\n    }\n  },\n  makeGallery: {\n    deploy: {\n      files: '<%= taskHelper.deploy.options.filesArray %>'\n    }\n  }\n});\n```\n\n#### handlerByContent\nThe handlers which were specified via `options.handlerByContent` are called per a `dest` file in specified `files` components (and parsed by Grunt, and might have changed by `handlerByFileSrc`). This may be a handler, or an array which includes multiple handlers. (see [Cycle of handlers](#cycle-handlers).)  \nThese are handlers to edit (or check) the content that should be written to `dest` file.  \nIf *JavaScript Function* is specified, following arguments are assigned, and return value is the following meaning.\n\n```js\nhandlerByContent(contentSrc, options)\n```\n\n+ <strong>`contentSrc` Type: String</strong>  \nThe current `src` file's contents to first handler. To remaining handlers, the text which returned by previous handler.  \nAll current `src` files (which were parsed by Grunt, and might have changed by `handlerByFileSrc`) are loaded, and these concatenated contents is passed to first handler. The text which was returned via the end handler is written to `dest` file.\n\n+ <strong>`options` Type: Object</strong>  \nCopy of `options` which is passed to `grunt.initConfig()`.\n\n+ <strong>Return value</strong>  \nThis value is passed to next handler. The end handler returns value to write to `dest` file.  \nIf the handler returns `false`, the remaining handlers in `handlerByContent` are not called, and `dest` file is done nothing.  \n*NOTE:* Any value except `false` (e.g. `undefined` or returns with *no value*) is content. i.e. if nothing was returned, empty text is written to `dest` file.\n\n##### options.separator\nAll contents of current `src` files are concatenated with `options.separator`. For example, *line-break-character* `\\n` can be specified.  \nIf this option was not specified, taskHelper uses *line-break-character* which was found first in current `src` file's contents. If that was not found, `grunt.util.linefeed` is used.\n\nPriority Order:\n\n1. `options.separator`\n2. line-break-character in `src` file's contents (found first)\n3. `grunt.util.linefeed`\n\n*NOTE:* `grunt.util.linefeed` is chosen via operating system which executes this task. Not operating system which uses the generated files. If this task is executed on Windows, `\\n` for others will be specified to `options.separator` or `src` files may include this.\n\n**Example:**\n\n`Gruntfile.js`\n\n```js\nvar htmlMenu = grunt.file.read('../menu.html');\ngrunt.initConfig({\n  taskHelper: {\n    deploy: {\n      options: {\n        handlerByContent: [\n          // 1st handler\n          function(contentSrc, options) {\n            // Insert HTML content to placeholder.\n            return contentSrc.replace(/<%MENU%>/, htmlMenu);\n          },\n          // End handler\n          function(contentSrc, options) {\n            var pathElms = contentSrc.match(/<h2\\b.*?>(.+?)<\\/h2>/), pageTitle;\n            if (pathElms) {\n              // Content title\n              pageTitle = pathElms[1];\n              // Style menu item of current page.\n              // (a part of HTML inserted by 1st handler)\n              return contentSrc.replace(\n                new RegExp('<li class=\"menu-item\">(?=' + pageTitle + ')'),\n                '<li class=\"menu-item current\">');\n            } else return contentSrc;\n          }\n        ]\n      },\n      expand: true,\n      cwd: 'develop/',\n      src: '**/*.html',\n      dest: 'public_html/'\n    }\n  }\n});\n```\n\n#### handlerByAllFiles\nThe handlers which were specified via `options.handlerByAllFiles` are called per a task(target) after `files` components are parsed (and might have changed by `handlerByFileSrc` and `handlerByFile`). This may be a handler, or an array which includes multiple handlers. (see [Cycle of handlers](#cycle-handlers).)  \nIf *JavaScript Function* is specified, following arguments are assigned, and return value is the following meaning.\n\n```js\nhandlerByAllFiles(files, options)\n```\n\n+ <strong>`files` Type: Array</strong>  \nThis is specified `files` components. This was parsed by Grunt, therefore [Globbing patterns](http://gruntjs.com/configuring-tasks#globbing-patterns) (e.g. `foo/*.js`) which was specified to `src` became real path that was found (e.g. `foo/file-1.js`). And, these might have changed by handlers in `handlerByFileSrc` and `handlerByFile`. (see above.)  \nIf the files were all not found or these were all removed by `handlerByFileSrc` and `handlerByFile`, array is empty.  \nThis array may be different from `options.filesArray`. This array includes only files which were selected in current task(target), but the `options.filesArray` may include files which were added by other tasks(targets) too.\n\n+ <strong>`options` Type: Object</strong>  \nCopy of `options` which is passed to `grunt.initConfig()`.\n\n+ <strong>Return value</strong>  \nIf the handler returns `false`, exit current task immediately, and the remaining handlers are not called.  \n*NOTE:* Any value except `false` (e.g. `undefined` or returns with *no value*) is ignored. i.e. it means the same as `return true`.\n\n**Example:**\n\n`Gruntfile.js`\n\n```js\nvar path = require('path');\ngrunt.initConfig({\n  taskHelper: {\n    pack: {\n      options: {\n        // Concatenate all CSS into all.css, and all JS into all.js\n        handlerByContent: function(content) { return content; },\n        // Pack concatenated files into assets.zip\n        handlerByAllFiles: function(files, options){\n          var exec = require('child_process').exec;\n          exec('zip assets.zip ' +\n            files.map(function(f) { return f.dest; }).join(' '),\n            function (error) {\n              if (error !== null)\n                { console.log('exec error: ' + error); }\n            }\n          );\n        },\n      },\n      files: [\n        {\n          src: 'css/*.css',\n          dest: 'assets/all.css'\n        },\n        {\n          src: 'js/*.js',\n          dest: 'assets/all.js'\n        }\n      ]\n    }\n  }\n});\n```\n\n### <a name =\"cycle-handlers\">Cycle of handlers</a>\nThe handlers are called at some timings as follows unless it is aborted by returning false.\n\n```\n---------------------------------- <Task 1>\n|  CALL handlerByTask 1\n|  CALL handlerByTask 2\n|    :\n|\n|  ------------------------------- <Element 1 of files>\n|  |\n|  |  ---------------------------- <src file 1>\n|  |  |  CALL handlerByFileSrc 1\n|  |  |  CALL handlerByFileSrc 2\n|  |  |    :\n|  |  ----------------------------\n|  |\n|  |  ---------------------------- <src file 2>\n|  |  |  CALL handlerByFileSrc 1\n|  |  |  CALL handlerByFileSrc 2\n|  |  |    :\n|  |  ----------------------------\n|  |    :\n|  |\n|  |  CALL handlerByFile 1\n|  |  CALL handlerByFile 2\n|  |    :\n|  |\n|  |  CALL handlerByContent 1\n|  |  CALL handlerByContent 2\n|  |    :\n|  -------------------------------\n|\n|  ------------------------------- <Element 2 of files>\n|  |  (Same as <Element 1 of files>)\n|  -------------------------------\n|    :\n|\n|  CALL handlerByAllFiles 1\n|  CALL handlerByAllFiles 2\n|    :\n----------------------------------\n\n---------------------------------- <Task 2>\n|  (Same as <Task 1>)\n----------------------------------\n  :\n```\n\n### <a name =\"builtin-handlers\">Builtin handlers</a>\nYou can specify name of builtin handler instead of JavaScript Function.  \nNow, taskHelper has following builtin handlers.\n\n#### <a name =\"builtin-handlers-newfile\">newFile</a>\nThis is a handler for `handlerByFile` to select files which are newer than `dest` from `src` (or newer than the time when this ran last time).\n\n+ In the basic case, `srcArray` includes a file path and a `dest` file path was specified. The modification times of both files are compared, and if `src` file is newer than `dest` file, return true.  \n**One src file : One dest file**\n\n**Example:** Minify only changed JS files.\n\n`Gruntfile.js`\n\n```js\ngrunt.initConfig({\n  taskHelper: {\n    deploy: {\n      options: {\n        handlerByFile: 'newFile',\n        filesArray: []\n      },\n      files: [\n        {\n          src: 'develop/js/a.js',\n          dest: 'public_html/js/a.min.js'\n        },\n        {\n          src: 'develop/js/b.js',\n          dest: 'public_html/js/b.min.js'\n        }\n      ]\n    }\n  },\n  uglify: {\n    deploy: {\n      files: '<%= taskHelper.deploy.options.filesArray %>'\n    }\n  }\n});\n```\n\n+ When the `srcArray` includes multiple files path and a `dest` file path was specified, if there is any `src` file in which is newer than `dest` file, return true.  \n**Some src files : One dest file**\n\n**Example:** Concatenate files if one or more source files were updated. (More better way in [Tips](#tips))\n\n`Gruntfile.js`\n\n```js\ngrunt.initConfig({\n  taskHelper: {\n    deploy: {\n      options: {\n        handlerByFile: 'newFile',\n        filesArray: []\n      },\n      src: 'develop/css/*.css',\n      dest: 'public_html/css/all.css'\n    }\n  },\n  concat: {\n    deploy: {\n      files: '<%= taskHelper.deploy.options.filesArray %>'\n    }\n  }\n});\n```\n\n+ When the file to compare was not specified (e.g. `dest` was not specified, or `dest` is same file as `src`), if `src` file is newer than the time when this ran last time, return true.  \ntaskHelper saves log file `.grunt/grunt-task-helper/fileUpdates.json` for compare.  \n**One or more src files : No dest file**\n\n**Example:** You don't need to keep PNG files that is source of minifying, because you have PSD files which is editable always and outputable to PNG.\n\n`Gruntfile.js`\n\n```js\ngrunt.initConfig({\n  taskHelper: {\n    deploy: {\n      options: {\n        handlerByFile: 'newFile',\n        filesArray: []\n      },\n      expand: true,\n      src: 'public_html/img/*.png'\n    }\n  },\n  imagemin: {\n    deploy: {\n      files: '<%= taskHelper.deploy.options.filesArray %>'\n    }\n  }\n});\n```\n\n*NOTE:* Logging the modification time of the file after task is best way, but current Grunt can't do it. Therefore the time is got via using `options.mtimeOffset`. (see source code.)\n\n#### <a name =\"builtin-handlers-size\">size</a>\nThis is a handler for `handlerByFileSrc` to select files which match specified size.  \nYou can specify minimum file size to `options.minSize`, and maximum file size to `options.maxSize`. One or both of these must be specified.\n\n**Example:** Compress only big files.\n\n`Gruntfile.js`\n\n```js\ngrunt.initConfig({\n  taskHelper: {\n    deploy: {\n      options: {\n        handlerByFileSrc: 'size',\n        minSize: 1024 * 64,\n        filesArray: []\n      },\n      expand: true,\n      src: 'public_html/download/*.csv',\n    }\n  },\n  compress: {\n    options: {\n      mode: 'gzip'\n    },\n    deploy: {\n      files: '<%= taskHelper.deploy.options.filesArray %>'\n    }\n  }\n});\n```\n\n## <a name =\"tips\">Tips</a>\n\n### Task efficiency\nSome grunt plugins are wrapper of something which provide a method. And the method accepts `src` file's contents and returns contents to write to `dest` file.  \nIf you want to give selected files by taskHelper to the plugin, specifying the method into `handlerByContent` instead of the using the plugin is better. Because grunt parses `files` components in every tasks(targets). `handlerByContent` can be included to one task with other handlers.\n\n**Example:** Minify CSS files if one or more source files were updated.  \n[clean-css](https://github.com/GoalSmashers/clean-css) is wrapped by [grunt-contrib-cssmin](https://github.com/gruntjs/grunt-contrib-cssmin) plugin.\n\n`Gruntfile.js`\n\n```js\ngrunt.initConfig({\n  taskHelper: {\n    cssmin: {\n      options: {\n        handlerByFile: 'newFile',\n        handlerByContent: (new require('clean-css')({relativeTo: 'public_html/css'})).minify,\n      },\n      src: 'develop/css/*.css',\n      dest: 'public_html/css/all.css'\n    }\n  }\n});\n```\n\n**Example:** Minify only changed HTML files.  \n[htmlclean](https://github.com/anseki/htmlclean) is wrapped by [grunt-htmlclean](https://github.com/anseki/grunt-htmlclean) plugin.\n\n`Gruntfile.js`\n\n```js\ngrunt.initConfig({\n  taskHelper: {\n    deploy: {\n      options: {\n        handlerByFile: 'newFile',\n        handlerByContent: require('htmlclean')\n      },\n      expand: true,\n      cwd: 'develop/',\n      src: '**/*.html',\n      dest: 'public_html/'\n    }\n  }\n});\n```\n\n**Example:** Concatenate files if one or more source files were updated.  \n`handlerByContent` works like [grunt-contrib-concat](https://github.com/gruntjs/grunt-contrib-concat) plugin. (Another plugin or module is unneeded.)\n\n`Gruntfile.js`\n\n```js\ngrunt.initConfig({\n  taskHelper: {\n    deploy: {\n      options: {\n        handlerByFile: 'newFile',\n        handlerByContent: function(content) { return content; }, // Do nothing.\n        separator: ';'\n      },\n      src: 'develop/js/*.js',\n      dest: 'public_html/js/all.js'\n    }\n  }\n});\n```\n\n### Log messages\nGrunt outputs log to STDOUT. Handlers can output messages.  \n\n**Example:** When there are a lot of targets, handlers output messages outstanding more than message `Running \"...\" task` by Grunt.\n\n`Gruntfile.js`\n\n```js\nvar head = '==================================== ';\ngrunt.initConfig({\n  taskHelper: {\n    options: {\n      handlerByTask: function()\n        { grunt.log.writeln((head + grunt.task.current.target.bold).cyan); }\n    },\n    // Even if there is not work, a {} is necessary.\n    html: { /* Do something if needed */ },\n    css:  { /* Do something if needed */ },\n    js:   { /* Do something if needed */ },\n    img:  { /* Do something if needed */ }\n  },\n  fooTask: {\n    html: { /* Do something */ },\n    css:  { /* Do something */ },\n    js:   { /* Do something */ },\n    img:  { /* Do something */ }\n  },\n  barTask: {\n    html: { /* Do something */ },\n    css:  { /* Do something */ },\n    //js:   { /* Do something */ },\n    img:  { /* Do something */ }\n  }\n});\ngrunt.registerTask('default', [\n  'taskHelper:html', 'fooTask:html', 'barTask:html',\n  'taskHelper:css', 'fooTask:css', 'barTask:css',\n  'taskHelper:js', 'fooTask:js',\n  'taskHelper:img', 'fooTask:img', 'barTask:img'\n]);\n```\n\n### \"Continue?\", \"Overwrite?\" - Wizard style\nThe handlers work via user's response for interactively running.\n\n**Example:**  Interactively running via [readlineSync](https://github.com/anseki/readline-sync).  \nInstall readlineSync.\n\n```shell\nnpm install readline-sync\n```\n\n`Gruntfile.js`\n\n```js\nvar readlineSync = require('readline-sync');\ngrunt.initConfig({\n  taskHelper: {\n    confirm: {\n      options: {\n        handlerByTask: function() {\n          // Abort the task if user don't want.\n          return readlineSync.question('The HTML files are copied. Continue? :')\n            .toLowerCase() === 'y';\n          // Or process.exit()\n        },\n        handlerByFile: function(srcArray, dest) {\n          if (grunt.file.exists(dest)) {\n            // Exclude this file if user want to keep it.\n            return readlineSync.question('This file already exists.\\n' + dest + '\\n' +\n              'Overwrite this file? :').toLowerCase() === 'y';\n          }\n        },\n        filesArray: []\n      },\n      expand: true,\n      cwd: 'develop/',\n      src: '**/*.html',\n      dest: 'public_html/'\n    }\n  },\n  copy: {\n    confirm: {\n      files: '<%= taskHelper.confirm.options.filesArray %>'\n    }\n  }\n});\n```\n","maintainers":[{"name":"anseki","email":"AnSeki.aff@gmail.com"}],"time":{"modified":"2022-06-18T16:06:46.393Z","created":"2013-08-01T17:27:58.309Z","0.1.0":"2013-08-01T17:28:03.241Z","0.1.1":"2013-08-02T19:06:17.891Z","0.2.0":"2013-08-18T08:50:05.302Z","0.3.0":"2013-08-23T20:34:56.661Z","0.3.1":"2013-08-24T08:27:41.201Z","0.3.2":"2013-08-28T12:34:09.648Z","0.3.3":"2013-08-29T12:07:31.488Z","0.3.4":"2013-08-29T17:33:35.312Z","0.3.5":"2013-12-31T10:54:26.976Z","0.3.6":"2014-10-23T20:31:54.909Z","0.3.7":"2015-05-28T06:03:28.812Z","0.3.8":"2016-02-21T04:22:23.230Z","0.3.9":"2017-02-01T14:53:09.121Z","0.3.10":"2018-02-18T10:21:48.611Z"},"author":{"name":"anseki","url":"https://github.com/anseki"},"repository":{"type":"git","url":"git://github.com/anseki/grunt-task-helper.git"},"homepage":"https://github.com/anseki/grunt-task-helper","keywords":["gruntplugin","filter","exclude","mtime","file modification time","changed file","updated file","file size","replace text"],"bugs":{"url":"https://github.com/anseki/grunt-task-helper/issues"},"readmeFilename":"README.md","license":"MIT"}