npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

grunt-pug-usemin

v1.0.0

Published

Grunt plugin for running usemin on Pug files

Downloads

21

Readme

grunt-pug-usemin

Grunt plugin for processing pug files and building production js & css files

NPM Version NPM Downloads Build Status Built with Grunt

Getting Started

This plugin requires Grunt.

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 --save-dev grunt-pug-usemin

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

grunt.loadNpmTasks('grunt-pug-usemin');

The "pugUsemin" task

This project is based on the grunt-usemin Project. grunt-pug-usemin is meant to be an assisting tool in preparing projects for build.

The steps of this plugin are as follows:

  1. Scan src pug files.
  2. Locate build blocks defined by <!-- build:type(alternate path) target -->.
  3. Gather css and js files in build blocks and run them through defined tasks for each filetype.
  4. Optionally output an optimized pug with with only targets to replace the build block.

Currently only 2 types of build blocks are supported: css and js.

pugUsemin also:

  • Writes optimized pug files
  • You choose which tasks to run for each filetype.

For example use grunt-filerev to add cache-busting to scripts/css.

Usage

For more usage examples head on to the examples section.

Basic Example

To simply use the task, define your build blocks like so:

//-<!-- build:js public/js/scripts.min.js -->
script(src='./src/js/script1.js')
script(src='./src/js/script2.js')
//-<!-- endbuild -->

//-<!-- build:css test/compiled/style.min.css -->
link(rel='stylesheet', href='/test/fixtures/style1.css')
link(rel='stylesheet', href='/test/fixtures/style2.css')
//-<!-- endbuild -->

Then you need to define grunt-pug-usemin as a task in your grunt config. You can use the following setup to process the above pattern:

//...
pugUsemin: {
    scripts: {
        options: {
            tasks: {
                js: ['concat', 'uglify'],
                css: ['concat', 'cssmin']
            }
        },
        files: [{
            dest: './src/partials/index.pug',
            src: './public/partials/index.pug'
        }]
    }
}
//...

Running grunt pugUsemin:scripts will now concat and uglify script1.js and script2.js and output them as public/js/scripts.min.js. This will also output an optimized pug file that will remove the build block and contain:

script(src='public/js/scripts.min.js')

Optimized Pug Files

Writing target pug files is optional. pugUsemin is smart enough that if you don't specify a target for your src pug files, it won't output a pug file. This is useful if you are working on server side pug files that build blocks still need to be optimized.

In your grunt configuration you need to configure a destination file (see: grunt files).

Then if your src pug file is:

//-<!-- build:css test/compiled/style.min.css -->
link(rel='stylesheet', href='/test/fixtures/style1.css')
link(rel='stylesheet', href='/test/fixtures/style2.css')
//-<!-- endbuild -->

Your target pug file will turn into:

link(rel='stylesheet', href='test/compiled/style.min.css')

Note: in order to create the optimized target, grunt-pug-usemin takes the first src in the relevant build block found and uses that as a template

API

Build blocks

Build blocks have a strict design, so that they may be correctly caught by the regex.

<!-- build:type(alternate path) target -->
<!-- endbuild -->
  • Build blocks must be all of the same type (or filetype).
  • You can have as many different build blocks in the same file.
  • Currently only supported blocks are of js or css types.
  • If writing an optimized pug file, it uses the pattern of the first item to insert optimized script.
  • alternate path is optional (along with the parenthesis). If used this task will also try to find the script/css src files in the alternate path.

Grunt Task

Tasks are configurable and run in the order you specify. This gives you great flexibility in choosing which and how to run tasks on your build blocks.

The main task you need to define is called pugUsemin.

Besides specifying the files object, you can use the following options:

Tasks

This is an array of objects, where key=filetype and value is an array of tasks to be run in order.

Default value is:

tasks: {
    js: ['concat', 'uglify'],
    css: ['concat', 'cssmin']
}

In order to allow you to configure your tasks, pugUsemin looks in the following places, which are ordered by precedence:

  1. task.pugUsemin.options. For example: uglify.pugUsemin.options.
  2. task.options. For example: uglify.options.
  3. Predefined default options for task if they exists.

This will allow you to control the options with which your tasks are being run on the build blocks.

Please note that the first task in each filetype runs against the original src files, and writes the destination target file. All the rest of the tasks in the context of the filetype run on the destination file.

So basically saying - it makes the most sense to run concat first on the build blocks.

Specifying no destination for directory tasks (such as filerev)

grunt-pug-usemin will look in options for noDest and will just specify a src for the file

So a possible way to configure grunt-filerev to rewrite the original files with the rev files would be:

//in your grunt config
filerev: {
    pugUsemin: {
        options: {
            noDest: true
        }
    }
},
Example usage with grunt-autoprefixer
tasks: {
    js: ['concat', 'uglify'],
    css: ['concat', 'autoprefixer', 'cssmin']
}

dirTasks

Type: string[]|string Default: []

If you have tasks that require a directory as destination (i.e grunt-filerev) than you can use the dirTasks option to specify those in an array or string.

Example:

dirTasks: ['filerev']
// or dirTasks: 'filerev'

This will parse the destination target as a directory, and not a file.

important note - If you use this option for any task, please make sure it is the last task that runs for a file type, as it will output a file with different name as the original target.

Prefix

String Default: ''

This adds some flexibility to where you keep your public folder. It allows you to add a prefix to the path.

failOnMissingSource

Boolean Default: false

Should task fail if there are missing source files in the pug. If false there will only be a warning.

targetPrefix

String Default: ''

Same as the prefix but used for target location. If you specify a string here it will be prefixed to the output of the target file.

replacePath

Object Default: {}

This option allows you to specify interpolation patterns for the source and build paths of your js/css. Each key value you specify here will be interpolated in the src paths that the plugin finds. For example if you add: '#{env}': 'dist' then all occurrences of #{env} in src paths will be replaced with dist. This gives you the power to change the paths according to different working environments.

Gruntfile.js full example

In your project's Gruntfile, add a section named pugUsemin to the data object passed into grunt.initConfig().

grunt.initConfig({
  pugUsemin: {
    main: {
      options: {
        tasks: { //optional if you want to use defaults
            js: ['concat', 'uglify', 'filerev'],
            css: ['concat', 'autoprefixer', 'cssmin']
        },
        dirTasks: 'filerev',       //optional
        failOnMissingSource: false // optional
        prefix: '',                //optional
        targetPrefix: '',          //optional
        replacePath: {             //optional
            '#{env}': 'dist'
        }
      },
      files: [{
        src: ['src/index.pug', 'src/index2.pug']
      },{
        src: ['src/index.pug'],
        dest: 'dist/index.pug'
     }]
    }
  },
})

Contributing

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.

Contributors

License

MIT @Gilad Peleg