CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-grunt

The JavaScript Task Runner that automates repetitive development tasks like minification, compilation, unit testing, linting, and more

Pending
Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

SecuritybySnyk

Pending

The risk profile of this skill

Overview
Eval results
Files

configuration.mddocs/

Configuration Management

Centralized configuration system with template processing, deep property access, and data validation. Supports complex nested configurations, runtime data manipulation, and template-based value resolution.

Capabilities

Configuration Initialization

Initialize and manage the main configuration object used by tasks.

/**
 * Initialize configuration data (alias for grunt.config.init)
 * @param {object} config - Configuration object
 */
grunt.initConfig = function(config) {};

/**
 * Initialize configuration data
 * @param {object} config - Configuration object
 */
grunt.config.init = function(config) {};

/**
 * Deep merge object into existing configuration
 * @param {object} obj - Object to merge
 */
grunt.config.merge = function(obj) {};

Usage Examples:

// Initialize configuration
grunt.initConfig({
  concat: {
    options: {
      separator: '\n',
      banner: '/*! Project v1.0.0 */\n'
    },
    dev: {
      files: {
        'dist/app.js': ['src/*.js'],
        'dist/vendor.js': ['vendor/*.js']
      }
    },
    prod: {
      files: {
        'dist/app.min.js': ['src/*.js']
      }
    }
  },
  uglify: {
    prod: {
      files: {
        'dist/app.min.js': ['dist/app.js']
      }
    }
  },
  meta: {
    version: '1.0.0',
    banner: '/*! Project v<%= meta.version %> */'
  }
});

// Merge additional configuration
grunt.config.merge({
  watch: {
    files: ['src/*.js'],
    tasks: ['concat:dev']
  }
});

Configuration Access

Get and set configuration properties with support for deep property paths.

/**
 * Get or set configuration property
 * @param {string} [prop] - Property path (dot notation)
 * @param {*} [value] - Value to set (if provided)
 * @returns {*} Property value or entire config if no prop specified
 */
grunt.config = function(prop, value) {};

/**
 * Get configuration property with template processing
 * @param {string} [prop] - Property path (dot notation)
 * @returns {*} Processed property value or entire config
 */
grunt.config.get = function(prop) {};

/**
 * Get raw configuration property without template processing
 * @param {string} [prop] - Property path (dot notation)
 * @returns {*} Raw property value or entire config
 */
grunt.config.getRaw = function(prop) {};

/**
 * Set configuration property
 * @param {string} prop - Property path (dot notation)
 * @param {*} value - Value to set
 */
grunt.config.set = function(prop, value) {};

Usage Examples:

// Set configuration values
grunt.config.set('concat.dev.options.separator', '\n\n');
grunt.config.set('meta.version', '2.0.0');

// Get configuration values
const version = grunt.config.get('meta.version');
const concatFiles = grunt.config.get('concat.dev.files');
const entireConfig = grunt.config.get();

// Get raw values (without template processing)
const rawBanner = grunt.config.getRaw('concat.options.banner');

// Using shorthand syntax
grunt.config('uglify.prod.options.mangle', true);
const mangleOption = grunt.config('uglify.prod.options.mangle');

Template Processing

Process templates within configuration values using Lodash template syntax.

/**
 * Process templates in a value recursively
 * @param {*} value - Value to process (can be string, object, array)
 * @returns {*} Value with templates processed
 */
grunt.config.process = function(value) {};

/**
 * Escape dots in property names for safe property access
 * @param {string} str - String to escape
 * @returns {string} Escaped string
 */
grunt.config.escape = function(str) {};

/**
 * Convert property path to string format
 * @param {string|Array} prop - Property path
 * @returns {string} String representation of property path
 */
grunt.config.getPropString = function(prop) {};

Usage Examples:

// Configuration with templates
grunt.initConfig({
  meta: {
    name: 'MyProject',
    version: '1.2.0'
  },
  concat: {
    options: {
      banner: '/*! <%= meta.name %> v<%= meta.version %> */\n'
    }
  },
  paths: {
    src: 'src',
    dist: 'dist/<%= meta.version %>'
  }
});

// Process templates manually
const banner = grunt.config.process('<%= concat.options.banner %>');
const distPath = grunt.config.process('<%= paths.dist %>');

// Templates are processed automatically when accessing via grunt.config.get()
const processedBanner = grunt.config.get('concat.options.banner');
// Result: "/*! MyProject v1.2.0 */\n"

// Complex template processing
const templateString = 'Build <%= meta.name %> v<%= meta.version %> to <%= paths.dist %>';
const processed = grunt.config.process(templateString);
// Result: "Build MyProject v1.2.0 to dist/1.2.0"

Configuration Validation

Validate that required configuration properties exist.

/**
 * Require that specified configuration properties exist
 * @param {string} props - Space-separated property paths
 * @throws {Error} If any required property is missing
 */
grunt.config.requires = function(props) {};

Usage Examples:

// Inside a task, ensure required config exists
grunt.registerTask('build', function() {
  // Require specific properties
  grunt.config.requires('concat.dev.files');
  grunt.config.requires('uglify.prod.files');
  
  // Require multiple properties
  grunt.config.requires('meta.version meta.name paths.src paths.dist');
  
  // Continue with task logic...
});

// Multi-task context usage
grunt.registerMultiTask('compile', function() {
  // Require configuration for current target
  this.requiresConfig('compile.' + this.target + '.files');
  
  // Require global options
  this.requiresConfig('compile.options.compiler');
});

Configuration Data Access

Direct access to the configuration data object.

/**
 * The actual configuration data object
 * @type {object}
 */
grunt.config.data = {};

Usage Examples:

// Direct access to config data (not recommended for normal use)
const configData = grunt.config.data;

// Iterate over all configuration
Object.keys(grunt.config.data).forEach(function(taskName) {
  console.log('Task:', taskName);
  console.log('Config:', grunt.config.data[taskName]);
});

// Check if configuration exists
if ('concat' in grunt.config.data) {
  console.log('Concat task is configured');
}

Advanced Configuration Patterns

Complex configuration scenarios and best practices.

Dynamic Configuration:

// Build configuration dynamically
const buildConfig = {};

// Add tasks based on environment
if (process.env.NODE_ENV === 'production') {
  buildConfig.uglify = {
    prod: {
      files: {
        'dist/app.min.js': ['src/*.js']
      }
    }
  };
}

// Add file patterns dynamically
const srcFiles = grunt.file.expand('src/**/*.js');
buildConfig.jshint = {
  all: srcFiles
};

grunt.initConfig(buildConfig);

Shared Configuration:

// Shared configuration patterns
const sharedConfig = {
  meta: {
    banner: '/*! Project <%= pkg.version %> */',
    pkg: grunt.file.readJSON('package.json')
  },
  
  paths: {
    src: 'src',
    dist: 'dist',
    tmp: '.tmp'
  }
};

grunt.initConfig({
  // Spread shared config
  ...sharedConfig,
  
  // Task-specific config
  concat: {
    options: {
      banner: '<%= meta.banner %>'
    },
    dist: {
      src: ['<%= paths.src %>/*.js'],
      dest: '<%= paths.dist %>/app.js'
    }
  }
});

Configuration Inheritance:

// Base configuration
const baseConfig = {
  options: {
    encoding: 'utf8',
    strip: true
  }
};

grunt.initConfig({
  process: {
    // Inherit base options
    dev: {
      options: {
        ...baseConfig.options,
        debug: true
      },
      files: {...}
    },
    
    prod: {
      options: {
        ...baseConfig.options,
        minify: true
      },
      files: {...}
    }
  }
});

docs

cli.md

configuration.md

event-system.md

file-operations.md

index.md

task-system.md

templating.md

tile.json