benkeen / grunt-search

Grunt plugin that searches a list of files and logs all findings in various formats.
MIT License
15 stars 8 forks source link
grunt grunt-plugins

grunt-search

This is a Grunt plugin that searches a list of files for particular search strings and logs the results in JSON, XML, text or JUnit format - or just output to the console. It also provides an option to fail the build process, should you need it.

Use-case

There are a bunch of search-and-replace Grunt plugins out there, but we needed something simpler for logging purposes only. We wanted to run various tests on our codebase to look for certain things: inline styles, inline event handlers, old, unwanted HTML tags. None of these weren't significant enough to warrant failing the build, but they do give a clue as the health of the codebase.

So basically, we run this function along with jshint in our dev environments to warn us about the accumulation of crap.

Installation

This plugin requires Grunt v0.4.1+.

In your project folder, run the following command:

npm install grunt-search --save-dev

Once the plugin has been installed, you need to add this line of JS to your gruntfile:

grunt.loadNpmTasks('grunt-search');

That will reference this module and allow you to use it.

Usage examples

If you're familiar with Grunt, it's pretty straightforward to use. Here's a few example searches so you can get the idea of how it operates.

grunt.initConfig({
    search: {

        // Example 1: search for inline style tags
        inlineStyles: {
            files: {
                src: ["*.html", "**/*.hbs"]
            },
            options: {
                searchString: /style\s?=\s?["']*/g,
                logFile: "tmp/results.json"
            }
        },

        // Example 2: look for any developers leaving obscenities in the codebase
        obscenities: {
            files: {
                src: ["*"]
            },
            options: {
                searchString: /(poop|fart|Barbara\sStreisand)/g,
                logFile: "tmp/results.xml",
                logFormat: "xml",
                failOnMatch: true,
                onMatch: function(match) {
                    // called when a match is made. The parameter is an object of the
                    // following structure: { file: "", line: X, match: "" }
                },
                onComplete: function(matches) {
                    // called when all files have been parsed for the target. The
                    // matches parameter is an object of the format:
                    // `{ numMatches: N, matches: {} }`. The matches /property is
                    // an object of filename => array of matches
                },
            }
        },

        // Example 3: search a PHP codebase for short-tags and just output the findings to
        // the console (short tags can be disabled, so this helps prevent them sneaking in!)
        short_tags: {
            files: {
                src: ["**/*.php"]
            },
            options: {
                searchString: /(<\?[^p])|(<\?$)/,
                logFormat: "console"
            }
        },

        // Example 4: custom logging function. This example shows how you can access the raw results to
        // do whatever you want with it.
        chicken_sounds: {
            files: {
                src: ["*"],
            },
            options: {
                searchString: /cluck|cluckity|bwaaaaaah!|/,
                logFormat: "custom",
                customLogFormatCallback: function(params) {
                    /*
                    // here, params is an object containing the following
                    {
                        filePaths: [], // an array of file paths
                        results: [], // the results
                        numResults: X // the number of results
                    }
                    */
                }
            }
        }
    }
});

File matching

The files property should be an object with a single src property containing an array of files, or file patterns. This plugin uses Grunt's file globbing patterns, documented here: http://gruntjs.com/configuring-tasks

Options

The options property can contain any of the following:

required setting

optional settings

Note: if either of the required parameters are omitted, the build will fail.

Changelog

Things To Improve

License

MIT, baby.