'use strict';

var

  _URL__BANNER_FILE = './config/banner.mustache',
  _URL__GRUNT_CONFIG_FILE = './config/grunt.json',
  _URL__NPM_MANIFEST_FILE = './package.json',

  _gruntRegisterTasks = require('grunt-register-tasks'),
  _loadGruntTasks = require('load-grunt-tasks'),
  _timeGrunt = require('time-grunt');

module.exports = function ( $grunt ) {

    var

      _$grunt__file = $grunt.file,
      _$grunt__file__readJSON = _$grunt__file.readJSON,

      _plugins = [
          'grunt-bump',
          'grunt-contrib-*',
          'grunt-exec',
          'grunt-jsonlint',
          'grunt-modify-json',
          'grunt-ts*'
        ],

      _config = {
          'bump': {
              'options': {
                  'commit': true,
                  'commitFiles': [
                      '<%= cfg.PATH__ROOT %>/<%= cfg.GLOB__MANIFESTS %>'
                    ],
                  'commitMessage': 'bump(version): %VERSION%',
                  'createTag': false,
                  'files': '<%= cfg.PATH__ROOT %>/<%= cfg.GLOB__MANIFESTS %>',
                  'push': true,
                  'pushTo': 'origin',
                  'updateConfigs': [
                      null,
                      'pkg'
                    ]
                }
            },
          'cfg': _$grunt__file__readJSON( _URL__GRUNT_CONFIG_FILE ),
          'clean': {
              'dist': '<%= cfg.PATH__DIST %>',
              'root': [
                  '<%= cfg.PATH__ROOT %>/<%= cfg.FILE__DS_STORE %>',
                  '<%= cfg.PATH__ROOT %>/<%= cfg.FILE__INDEX_JS %>',
                  '<%= cfg.PATH__ROOT %>/<%= cfg.FILE__NPM_DEBUT_LOG %>',
                  '<%= cfg.PATH__ROOT %>/<%= cfg.GLOB__ANY_BASEDIR %>',
                  '<%= cfg.PATH__TSCACHE %>'
                ]
            },
          'concat': {
              'options': {
                  'banner': _$grunt__file.read( _URL__BANNER_FILE ) + '\n',
                },
              'src': {
                  'cwd': '<%= cfg.PATH__SRC__MUSTACHE %>',
                  'dest': '<%= cfg.PATH__DIST %>',
                  'expand': true,
                  'src': '<%= cfg.FILE__TEMPLATE_MUSTACHE %>'
                }
            },
          'exec': {
              'commit': 'git commit -m "release(v<%= pkg.version %>): distribute"',
              'tag': 'git tag -a v<%= pkg.version %> -m "<%= grunt.option(\'message\') %>"'
            },
          'jsonlint': {
              'config': [
                  '<%= cfg.PATH__CONFIG %>/<%= cfg.GLOB__JSON__RECURSIVE %>',
                  '<%= cfg.PATH__ROOT %>/<%= cfg.FILE__BOWERRC %>'
                ],
              'manifests': '<%= cfg.PATH__ROOT %>/<%= cfg.GLOB__MANIFESTS %>'
            },
          'modify_json': {
              'manifests': {
                  'files': {
                      '<%= cfg.PATH__ROOT %>': '<%= cfg.PATH__ROOT %>/<%= cfg.GLOB__MANIFESTS %>'
                    },
                  'options': {
                      'add': true,
                      'fields': {
                          'private': false
                        },
                      'indent': 2
                    }
                }
            },
          'pkg': _$grunt__file__readJSON( _URL__NPM_MANIFEST_FILE ),
          'ts': {
              'options': {
                  'fast': 'never'
                },
              'src': {
                  'outDir': '<%= cfg.PATH__ROOT %>',
                  'src': '<%= cfg.PATH__SRC__TS %>/<%= cfg.FILE__INDEX_TS %>',
                  'tsconfig': '<%= cfg.PATH__CONFIG %>/<%= cfg.FILE__TSCONFIG_JSON %>'
                }
            },
          'tslint': {
              'options': {
                  'configuration': '<%= cfg.PATH__CONFIG %>/<%= cfg.FILE__TSLINT_JSON %>'
                },
              'src': '<%= cfg.PATH__SRC__TS %>/<%= cfg.FILE__INDEX_TS %>'
            }
        },

      _tasks = {
          'build': [
              'default',
              'clean',
              'concat',
              'ts'
            ],
          'default': [
              'jsonlint',
              'tslint'
            ]
        };

    _timeGrunt( $grunt ),

    $grunt.initConfig( _config ),

    _loadGruntTasks(
      $grunt,
      {
        'pattern': _plugins,
        'scope': 'devDependencies'
      }
    ),

    _gruntRegisterTasks(
      $grunt,
      _tasks
    );

  };

@@ -1208,16 +1208,44 @@
    'pkg'
+,%0A                      null
 %0A       
@@ -2980,43 +2980,8 @@
 : %7B%0A
-                      'add': true,%0A
     
@@ -3316,16 +3316,73 @@
  'never'
+,%0A                  'rootDir': '%3C%25= cfg.PATH__SRC__TS %25%3E'
 %0A       

update tasks