Skip to content

Instantly share code, notes, and snippets.

@cowboy
Created September 17, 2012 17:47
Show Gist options
  • Save cowboy/3738726 to your computer and use it in GitHub Desktop.
Save cowboy/3738726 to your computer and use it in GitHub Desktop.
grunt config idea: insanity?
var grunt = {};
// http://twitter.com/cowboy/status/247745191287611392
var isObject = function(val) {
return val === function() { return this; }.call(val);
};
var config = function(prop, val) {
var method = arguments.length === 2 ? 'set' : 'get';
return config.__proto__[method].apply(null, arguments);
};
config.__proto__ = {
toString: function() {
var obj = {};
for (var prop in config) { obj[prop] = config[prop]; }
return JSON.stringify(obj);
},
get: function(prop) {
var obj = config;
var parts = Array.isArray(prop) ? prop : String(prop).split('.');
for (var i = 0; obj && i < parts.length; i++) {
obj = obj[parts[i]];
}
return obj;
},
set: function(prop, val) {
var obj = config;
var parts = Array.isArray(prop) ? prop : String(prop).split('.');
for (var i = 0; i < parts.length - 1; i++) {
if (!(parts[i] in obj)) { obj[parts[i]] = {}; }
obj = obj[parts[i]];
if (!isObject(obj)) { return false; }
}
obj[parts[i]] = val;
return true;
},
};
Object.defineProperty(grunt, 'config', {
set: function(obj) {
var prop;
for (prop in config) { delete config[prop]; }
for (prop in obj) { config[prop] = obj[prop]; }
},
get: function() {
return config;
}
});
// Define the config.
grunt.config = {
prop: 'value',
prop2: {
a: [1, 2, 3]
},
};
// Amend the config.
grunt.config.prop3 = 678;
// Whole config, stringified
console.log('grunt.config', grunt.config);
// Get and set properties via "normal" dot syntax
console.log('grunt.config.prop', grunt.config.prop);
console.log('grunt.config.prop2', grunt.config.prop2);
console.log('grunt.config.prop2.a', grunt.config.prop2.a);
console.log('grunt.config.prop2.a.b', grunt.config.prop2.a.b);
grunt.config.prop2.a.b = 123;
console.log('grunt.config.prop2.a.b', grunt.config.prop2.a.b);
// Get properties via namespace string, implicitly
console.log('grunt.config("prop")', grunt.config('prop'));
console.log('grunt.config("prop2")', grunt.config('prop2'));
// Using explicit .get method
console.log('grunt.config.get("prop2.a")', grunt.config.get('prop2.a'));
console.log('grunt.config.get("prop2.a.b")', grunt.config.get('prop2.a.b'));
// Set properties via namespace string, implicitly
console.log('grunt.config("prop", 10)', grunt.config('prop', 10));
console.log('grunt.config("prop.x", 11)', grunt.config('prop.x', 11));
console.log('grunt.config("x.y.z", 12)', grunt.config('x.y.z', 12));
console.log('grunt.config("prop2.a.x", 13)', grunt.config('prop2.b.x', 13));
// Using explicit .set method
console.log('grunt.config.set("prop2.a.b.x", 14)', grunt.config.set('prop2.b.c.x', 14));
console.log('grunt.config.set("x.y.z.foo", 15)', grunt.config.set('x.y.z.foo', 15));
console.log('grunt.config.set("x.y.z.foo.bar", 16)', grunt.config.set('x.y.z.foo.bar', 16));
// Whole config, stringified
console.log('grunt.config', grunt.config);
@tkellen
Copy link

tkellen commented Sep 17, 2012

module.exports = {

  pkg: '<json:package.json>',
  requirejs: {
    compile: {
      options: {
        baseUrl: "./lib",
        name: "../vendor/almond",
        optimize: "none",
        include: ['links'],
        paths: {
          jquery: "../vendor/jquery"
        },
        exclude: ["jquery"],
        wrap: {
          start: "(function (root, factory) {\n"+
                 "  if (typeof exports === 'object') {\n"+
                 "    module.exports = factory(); // node\n"+
                 "  } else if (typeof define === 'function' && define.amd) {\n"+
                 "    define(['jquery'], factory); // amd\n"+
                 "  } else {\n"+
                 "    root.Links = factory(root.$); // browser\n"+
                 "  }\n"+
                 "}(this, function ($) {\n",
          end: "  define('jquery', function () { return $; }); // register jquery for almond\n"+
               "  return require('links');\n"+
               "}));"
        },
        out: "./dist/links.js"
      }
    }
  },
  lint: {
    all: ['lib/**/*.js']
  },
  // minify the optimized library file
  min: {
    "dist/links.min.js": "dist/links.js"
  },
  compress: {
    links: {
      options: { mode: 'gzip' },
      files: {
        "dist/links.min.gz": "dist/links.min.js"
      }
    }
  },
  // kick off jasmine, showing results at the cli
  jasmine: {
    all: ['test/runner.html']
  },
  // run jasmine tests any time watched files change
  watch: {
    files: ['lib/**/*','test/spec/**/*'],
    tasks: ['jasmine']
  },
  yuidoc: {
    compile: {
      "name": "<%= pkg.name %>",
      "description": "<%= pkg.description %>",
      "version": "<%= pkg.version %>",
      "url": "<%= pkg.url %>",
      options: {
        paths: "lib/",
        outdir: "docs/"
      }
    }
  },

  loadNpmTasks: [
    'grunt-contrib-yuidoc',
    'grunt-contrib-compress',
    'grunt-contrib-requirejs',
    'grunt-jasmine-task'
  ],
  loadTaskFile: [
    'task/whatever'
  ]
  shortcuts: {
    main: 'jasmine requirejs min compress yuidoc',
    test: 'jasmine'
  }
};

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment