title: Getting a strange error with grunt: Object Gruntfile.js has no method 'flatten'
body: <p>I am getting this strange error trying to run grunt: <strong><code>TypeError: Object Gruntfile.js has no method 'flatten'</code></strong></p>
  
  <p>I am new to node.js, npm, grunt, etc. I thought I did a decent install of node, npm, grunt but may be I missed something. Is there a way to verify the install??</p>
  
  <pre><code>$ cat xx
  $ grunt
  
  /home/cl/node_modules/grunt/node_modules/findup-sync/lib/findup-sync.js:33
      }).flatten().uniq().value();
         ^
  TypeError: Object Gruntfile.js has no method 'flatten'
      at Object.module.exports [as findup] (/home/cl/node_modules/grunt/node_modules/findup-sync/lib/findup-sync.js:33:8)
      at Task.task.init (/home/cl/node_modules/grunt/lib/grunt/task.js:414:16)
      at Object.grunt.tasks (/home/cl/node_modules/grunt/lib/grunt.js:113:8)
      at Object.module.exports [as cli] (/home/cl/node_modules/grunt/lib/grunt/cli.js:38:9)
      at Object.&lt;anonymous&gt; (/usr/lib/node_modules/grunt-cli/bin/grunt:41:20)
      at Module._compile (module.js:456:26)
      at Object.Module._extensions..js (module.js:474:10)
      at Module.load (module.js:356:32)
      at Function.Module._load (module.js:312:12)
      at Function.Module.runMain (module.js:497:10)
  </code></pre>
  
  <p>The offending line/file:</p>
  
  <pre><code>/*
   * findup-sync
   * https://github.com/cowboy/node-findup-sync
   *
   * Copyright (c) 2013 "Cowboy" Ben Alman
   * Licensed under the MIT license.
   */
  
  'use strict';
  
  // Nodejs libs.
  var path = require('path');
  
  // External libs.
  var glob = require('glob');
  var _ = require('lodash');
  
  // Search for a filename in the given directory or all parent directories.
  module.exports = function(patterns, options) {
    // Normalize patterns to an array.
    if (!Array.isArray(patterns)) { patterns = [patterns]; }
    // Create globOptions so that it can be modified without mutating the
    // original object.
    var globOptions = Object.create(options || {});
    globOptions.maxDepth = 1;
    globOptions.cwd = path.resolve(globOptions.cwd || '.');
  
    var files, lastpath;
    do {
      // Search for files matching patterns.
      files = _(patterns).map(function(pattern) {
        return glob.sync(pattern, globOptions);
      }).flatten().uniq().value(); // &lt;--------- OFFENDING LINE
      // Return file if found.
      if (files.length &gt; 0) {
        return path.resolve(path.join(globOptions.cwd, files[0]));
      }
      // Go up a directory.
      lastpath = globOptions.cwd;
      globOptions.cwd = path.resolve(globOptions.cwd, '..');
    // If parentpath is the same as basedir, we can't go any higher.
    } while (globOptions.cwd !== lastpath);
  
    // No files were found!
    return null;
  };
  </code></pre>
  
  <p>Output of <code>ls -l node_modules/</code>:</p>
  
  <pre><code>$ ls -l node_modules/
  total 20
  drwxrwxr-x. 6 a a 4096 Oct  2 00:42 grunt
  drwxrwxr-x. 4 a a 4096 Oct  2 00:42 grunt-contrib-compass
  drwxrwxr-x. 6 a a 4096 Oct  2 00:42 grunt-contrib-jshint
  drwxrwxr-x. 6 a a 4096 Oct  2 00:42 grunt-contrib-watch
  drwxrwxr-x. 4 a a 4096 Oct  2 00:42 grunt-dustjs
  </code></pre>
  
  <p>Output of <code>npm list</code>:</p>
  
  <pre><code>$ npm list
  prepscholar@0.0.0 /home/a/prep/main/web/client
  ├─┬ grunt@0.4.1
  │ ├── async@0.1.22
  │ ├── coffee-script@1.3.3
  │ ├── colors@0.6.2
  │ ├── dateformat@1.0.2-1.2.3
  │ ├── eventemitter2@0.4.13
  │ ├─┬ findup-sync@0.1.2
  │ │ └── lodash@1.0.1
  │ ├─┬ glob@3.1.21
  │ │ ├── graceful-fs@1.2.3
  │ │ └── inherits@1.0.0
  │ ├── hooker@0.2.3
  │ ├── iconv-lite@0.2.11
  │ ├─┬ js-yaml@2.0.5
  │ │ ├─┬ argparse@0.1.15
  │ │ │ ├── underscore@1.4.4
  │ │ │ └── underscore.string@2.3.3
  │ │ └── esprima@1.0.4
  │ ├── lodash@0.9.2
  │ ├─┬ minimatch@0.2.12
  │ │ ├── lru-cache@2.3.1
  │ │ └── sigmund@1.0.0
  │ ├─┬ nopt@1.0.10
  │ │ └── abbrev@1.0.4
  │ ├─┬ rimraf@2.0.3
  │ │ └── graceful-fs@1.1.14
  │ ├── underscore.string@2.2.1
  │ └── which@1.0.5
  ├─┬ grunt-contrib-compass@0.5.0
  │ ├── async@0.2.9
  │ ├── dargs@0.1.0
  │ └── tmp@0.0.21
  ├─┬ grunt-contrib-jshint@0.6.4
  │ └─┬ jshint@2.1.10
  │   ├─┬ cli@0.4.5
  │   │ └─┬ glob@3.2.6
  │   │   └── inherits@2.0.1
  │   ├── console-browserify@0.1.6
  │   ├─┬ minimatch@0.2.12
  │   │ ├── lru-cache@2.3.1
  │   │ └── sigmund@1.0.0
  │   ├── shelljs@0.1.4
  │   └── underscore@1.4.4
  ├─┬ grunt-contrib-watch@0.5.3
  │ ├─┬ gaze@0.4.2
  │ │ └─┬ globule@0.1.0
  │ │   ├─┬ glob@3.1.21
  │ │   │ ├── graceful-fs@1.2.3
  │ │   │ └── inherits@1.0.0
  │ │   ├── lodash@1.0.1
  │ │   └─┬ minimatch@0.2.12
  │ │     ├── lru-cache@2.3.1
  │ │     └── sigmund@1.0.0
  │ └─┬ tiny-lr@0.0.4
  │   ├── debug@0.7.2
  │   ├── faye-websocket@0.4.4
  │   ├─┬ noptify@0.0.3
  │   │ └─┬ nopt@2.0.0
  │   │   └── abbrev@1.0.4
  │   └── qs@0.5.6
  └─┬ grunt-dustjs@1.1.1
    └── dustjs-linkedin@2.0.3
  </code></pre>
  
  <p>Output of <code>cat package.json</code>:</p>
  
  <pre><code>$ cat package.json 
  {
    "name": "prepscholar",
    "version": "0.0.0",
    "devDependencies": {
      "grunt": "~0.4.1",
      "grunt-contrib-jshint": "~0.6.4",
      "grunt-dustjs": "~1.1.1",
      "grunt-contrib-watch": "~0.5.3",
      "grunt-contrib-compass": "~0.5.0"
    }
  }
  </code></pre>
  
  <p>Output of <code>cat Gruntfile.js</code>:</p>
  
  <pre><code>$ cat Gruntfile.js 
  
  module.exports = function(grunt) {
  
    grunt.initConfig({
      pkg: grunt.file.readJSON('package.json'),
      jshint: {
        files: ['Gruntfile.js', 'app/js/**/*.js', '!app/js/lib/**/*.js']
      },
      dustjs: {
        compile: {
          src: ['app/templates/**/*.html'],
          dest: 'app/js/templates.js'
        }
      },
      compass: {
        dev: {
          options: {
            sassDir: 'app/sass',
            cssDir: 'app/css',
            imagesDir: 'app/img',
            fontsDir: 'app/fonts',
            javascriptsDir: 'app/js/app',
            outputStyle: 'compressed'
          }
        }
      },
      watch: {
        gruntfile: {
          files: 'Gruntfile.js',
          tasks: ['compile']
        },
        css: {
          files: 'app/sass/**/*.scss',
          tasks: ['compass:dev']
        },
        livereload: {
          options: { livereload: true },
          files: ['app/css/**/*']
        },
        dust: {
          files: 'app/templates/**/*.html',
          tasks: ['dustjs']
        }
      }
    });
  
    grunt.loadNpmTasks('grunt-contrib-jshint');
    grunt.loadNpmTasks('grunt-contrib-compass');
    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-dustjs');
    grunt.loadNpmTasks('underscore');
  
    grunt.registerTask('default', ['compile', 'watch']);
    grunt.registerTask('compile', ['dust', 'compass']);
    grunt.registerTask('dust', ['dustjs']);
    grunt.registerTask('lint', ['jshint']);
  };
  </code></pre>