grunt-ng-constant

Plugin for dynamic generation of angular constant modules.

grunt-ng-constant

Plugin for dynamic generation of angular constant and value modules.

This plugin requires Grunt ~0.4.1

If you haven't used Grunt before, be sure to check out the Getting Started guide, as it explains how to create a Gruntfile as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:

npm install grunt-ng-constant --save-dev

When the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:

grunt.loadNpmTasks('grunt-ng-constant');

The following shows a simple configuration for generating a config module with one constant and one value that contain your package information and debug config.

grunt.initConfig({
  ngconstant: {
    options: {
      name: 'config',
      dest: 'config.js',
      constants: {
        package: grunt.file.readJSON('package.json')
      },
      values: {
        debug: true
      }
    },
    build: {
    }
  },
})

For the target build the resulting file config.js looks like this:

angular.module('config', [])
 
.constant('package', {
  "version": "0.0.1",
  ...
})
 
.value("debug", true)
 
;

Type: String Required

The name of the constant module used in your angular project.

Type: String Required

The path where the generated constant module should be saved.

Type: Array or Boolean Default value: [] Optional

An array that specifies the default dependencies a module should have. When your module should not have any modules, so you can append the constants to an already existing one, you can set deps to false.

Type: Object, String, Function Default value: {} Optional

If it is an object it gets automatically merged in all target constants definitions. This option should be used when you need a global constants definition for all your targets.

Type: Object, String, Function Default value: {} Optional

If it is an object it gets automatically merged in all target values definitions. This option should be used when you need a global values definition for all your targets.

Type: String or Boolean Default value: false Optional

A boolean to activate or deactivate the automatic wrapping. A string which will wrap the result of file, use the {%= __ngModule %} variable to indicate where to put the generated module content. See the "Custom Wrap Option" section for further informations.

Type: String|Function Default value: jju Optional

Available options:

  • jju (Default) Uses the jju stringify method.
  • json Uses JSON.stringify for serialization.
  • tosource Use the node-tosource module.

If you want to define your own serializer use function(obj, serializerOptions, options) { return /* your serialized string */ }. this will be set to the plugin context.

Type: Object Default value: {indent: '', no_trailing_comma: true} Optional

Use this option for setting specific options for the given serializer. The default config configures the jju stringify method. See the documentation for more information of possible options.

Type: String Default value: grunt.file.read('constant.tpl.ejs') Optional

Custom template for creating the output constants file. Defaults to the default constants template file if none provided.

Type: String Default value: ngconstant which sets the template delimiters to {% and %}. Make sure that you do not use the same delimiters as your grunt configuration or get unwanted behaviour. Optional

In this example I convert the package.json information to an angular module. So I am able to display such things as the current version of the application in the app.

grunt.initConfig({
  ngconstant: {
    dist: {
      options: {
        dest: 'dist/constants.js',
        name: 'constants',
      },
      constants: {
        package: grunt.file.readJSON('package.json')
      },
      values: {
        debug: true
      }
    }
  },
})

Note: In most cases for all following examples the applied functionality on constants can also be achieved with the values parameter.

In this example we set custom configurations for the space and deps parameters. So we create a module that has dep1 and dep2 as dependencies and defines two different constants constants1 and constants2 with custom values. The space parameter is set to a .

grunt.initConfig({
  ngconstant: {
    options: {
      space: ' ',
      deps: ['dep1', 'dep2'],
      dest: 'dist/module.js',
      name: 'someModule'
    },
    dist: {
      constants: {
        'constant1': {
          'key1': 'value1',
          'key2': 42
        },
        'constant2': 'value2'
      }
    }
  },
})

The resulting module looks like the following:

angular.module("someModule", ["dep1", "dep2"])
 
.constant("constant1", {
  "key1": "value1",
  "key2": 42
})
 
.constant("constant2", "value2")
 
;

You can also load the constants definition directly from a file:

grunt.initConfig({
  ngconstant: {
    options: {
      dest: 'dist/module.js',
      name: 'someModule'
    },
    dist: {
      constants: 'constants.json'
    }
  },
})

Or if you want to calculate the constants value at runtime you can create a lazy evaluated method which should be used if you generate your json file during the build process.

grunt.initConfig({
  ngconstant: {
    options: {
      dest: 'dist/module.js',
      name: 'someModule'
    },
    dist: {
      constantsfunction () {
        return {
          lazyConfig: grunt.file.readJSON('build/lazy-config.json')
        };
      }
    }
  },
})

The wrap option allows you to encapsulate the module in a closure. Simply set wrap to true.

grunt.initConfig({
  ngconstant: {
    options: {
      dest: 'tmp/wrap_options.js',
      name: 'module2',
      wrap: true
    },
    dist: {
      constants: {
        'constant1': {
          key1: 123,
          key2: 'value2',
          foobar: false
        }
      }
      
    },
    nowrap: { 
      options: {
        wrap: false // Disable wrapping for the 'nowrap' target 
      },
      constants: {
        ...
      }
    }
  },
})

The resulting module looks like:

(function(angular) {
   angular.module("module2", ["test"])
 
.constant("constant1", {
  "key1": 123,
  "key2": "value2",
  "foobar": false
})
 
; 
})(angular);

If you want to use another wrapping you can use a string as wrap option, which is interpolated by the plugin. Use the __ngModule variable as placeholder for the generated module.

Here a RequireJS example:

grunt.initConfig({
  ngconstant: {
    options: {
      dest: 'tmp/wrap_options.js',
      name: 'module2',
      wrap: 'define(["angular", "ngResource", "ngCookies"], function() { \n return {%= __ngModule %} \n\n});',
    },
    dist: {
      constants: {
        'constant1': {
          key1: 123,
          key2: 'value2',
          foobar: false
        }
      }
    }
  },
})

The resulting module looks like the following:

define(["angular", "ngResource", "ngCookies"], function() { 
 return angular.module("module2", ["test"])
 
.constant("constant1", {
  "key1": 123,
  "key2": "value2",
  "foobar": false
})
 
; 
 
});

Note: For longer wrapping templates it is recommended to use grunt.file.read('customer-wrap.tpl.ejs').

If you need the same configuration for all your targets you can use the constants option to automatically merge your per target configuration into the global one. If you don't want to merge, you can use the per target constants option to override everything.

grunt.initConfig({
  ngconstant: {
    options: {
      name: 'config',
      dest: 'config.js',
      constants: {
        title: 'grunt-ng-constant',
        debug: true
      }
    },
    dev: {
      constants: {
        title: 'grunt-ng-constant-beta'
      }
    },
    prod: {
      constants: {
        debug: false
      }
    },
    override_global: {
      options: {
        constants: { // This does not merge it overrides 
          ...
        }
      }
    }
  }
});

Which results in the following constants objects.

For the target dev:

angular.module('config', [])
 
.constant('title', 'grunt-ng-constant-beta')
 
.constant('debug', true)
 
;

For the target prod:

angular.module('config', [])
 
.constant('title', 'grunt-ng-constant')
 
.constant('debug', false)
 
;

If the code looks to ugly for you. You can use grunt-jsbeautifyer.

Create a custom target for each module and set the dest, name, constants and values parameter for each one.

Till v1.0.0 this was supported natively by the plugin. Now you have to use the grunt-js2coffee plugin.

Report bugs, propose new features or simply star the project that shows me that are people are interessted in this project.

In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using Grunt.