Make angular dependency annotation minification proof
The version 2.x uses babel 6.x plugin API, for babel 5.x versions use the babel-plugin-angular-annotate 1.x
npm install babel-plugin-angular-annotate.babelrc
{ "plugins": [ ["angular-annotate", [configurations...]] ] }$ babel --plugins angular-annotate script.jsrequire("babel-core").transform("code", { plugins: [ ["angular-annotate", [configurations...]] ] });- Some injections wont work properly when using this plugin in conjuction with
babel-preset-es2015. To get it working you need to use"passPerPreset": truein your.babelrc.
angular-annotate accepts a json like injection configuration starting with an array containing two items in this format: [method call, args].
method call is expressed as a string with the service name and method call. For instance "$injector.invoke". You can also nest calls. For instance: "$httpProvider.interceptors.push".
args is where you map each param with the corresponding injection strategy. The two possible are: "$injectFunction" and "$injectObject". Any other value will be ignored.
$injectFunction will transform:
function (a, b, c) { }to
['a', 'b', 'c', function (a, b, c) { }]For instance to create a rule for $injector.invoke you can apply the following configuration: ["$injector.invoke", ["$injectFunction"]].
So the following will be transformed:
Before:
$injector.invoke(function($state) { $state.go('somewhere'); });After:
$injector.invoke(['$state', function($state) { $state.go('somewhere'); }]);$injectObject will apply $injectFunction for each object value. This is mainly used in the resolve property from some services. For example:
The $routeProvider.when configuration can be expressed with the following:
["$routeProvider.when", ["_", { "controller": "$injectFunction", "resolve": "$injectObject" }]];Before:
$routeProvider.when('/foo', { controller: function($scope) { $scope.message = 'foo'; }, templateUrl: 'foo.html', resolve: { store: function (foo) { } } });After:
$routeProvider.when('/foo', { controller: ['$scope', function($scope) { $scope.message = 'foo'; }], templateUrl: 'foo.html', resolve: { store: ['foo', function (foo) { }] } });Note that since we don't want to do anything in the routeName we use a "_" to ignore it.
Since configuring each service injection can be tedius, this libray includes some presets like: "angular", "ngMaterial", "ngRoute" and "ui.router". So you can simple include the following in .babelrc:
{ "plugins": [ ["angular-annotate", ["angular", "ngMaterial", "ui.router"]] ] }Check the main file to see what injections are currently handled.
npm test
- Fork it
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create new Pull Request