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-modular-project

v0.5.0

Published

Builds a module/package/feature-based input source-tree into a website

Downloads

56

Readme

grunt-modular-project

npm version devDependency Status

Grunt Modular Project is a set of customisable workflow tasks designed for building JS + HTML + CSS modules into a website. It has AngularJS/single-page-apps primarily in-mind. The project transforms a source code folder (src by default) into a web-application that can run in development or production mode.

Change log

Getting Started

This plugin requires Grunt ~0.4.5. The default Karma plugin requires NodeJS 0.12.

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:

  1. Install the plugin
npm install grunt-modular-project --save-dev
  1. Load the plugin inside your GruntFile.js, and decide which workflow tasks you want.
grunt.loadNpmTasks('grunt-modular-project');
// Use all of the default tasks
grunt.loadTasks('node_modules/grunt-modular-project/tasks/build');
//grunt.loadTasks('node_modules/grunt-modular-project/tasks/buildLibrary'); // This task is only useful if your project is a component/library project.
grunt.loadTasks('node_modules/grunt-modular-project/tasks/install');
grunt.loadTasks('node_modules/grunt-modular-project/tasks/optimise');
grunt.loadTasks('node_modules/grunt-modular-project/tasks/release');
grunt.loadTasks('node_modules/grunt-modular-project/tasks/serve');
grunt.loadTasks('node_modules/grunt-modular-project/tasks/unitTest');
grunt.loadTasks('node_modules/grunt-modular-project/tasks/verify');
  1. In your Gruntfile.js, add a section named moduleProject to the data object passed into grunt.initConfig(), and specify any overrides to the default values.
grunt.initConfig({
  modularProject: {
  },
});
  1. Modify your package.json file to include the NPM plugin's that your workflow tasks require (refer to node_modules/grunt-modular-project/package.json).
// package.json
...
"devDependencies": {
    "colors": "^1.0.3",
    "compression": "^1.4.1",
    "conventional-changelog": "0.0.11",
    "grunt": "^0.4.5",
    ...
}

Example project that uses this plugin

angular-form-library

Workflow Tasks

From the command line, the following commands are available:

  • grunt install: Installs commit message hooks for git to support conventional changelog
  • grunt dev: Continuous development (builds debuggable version into /dev folder, starts server, watches files for changes and reloads)
  • grunt build: Builds the site into /dist, ready for distribution
  • grunt build:serve: Builds the site into /dist, and then serves it up via a connect webserver
  • grunt test: Runs Jasmine unit tests **/unitTest/*.spec.js in PhantomJS via Karma
  • grunt test:browser: Runs unit tests in Chrome (useful for debugging)
  • grunt verify:all/src/test: Checks all/src/test JS code for linting/syntax/style errors
  • grunt release: Builds the project, checks that all source code is committed and if so, bumps version numbers in package.json and bower.json (by default), then commits those changes + updated CHANGELOG.md with a version tag.
  • grunt release:minor: As above, but bumps minor version
  • grunt release:major: As above, but bumps major version

###Key features###

  • Source code can be (should be) structured into modules
  • No need for "global" folders - create a module called global or anythingYouLike instead
  • Each module can contain:
    • HTML files, which are deployed to /views/{module}
    • JS files, which are deployed to /js/{moduleName}.js . Note that JS files beginning with "_" will appear first inside the {moduleName}.js file.
    • /assets, which contains static assets that are deployed to /assets/{module}. Static assets include images, data files which are needed at run-time.
    • /docs, which contains JS and HTML files for component/project documentation. This content is ignored in the production build.
    • /includes, which contains files that should be included into other files at compile-time. This folder does not get deployed.
    • /styles, which contains CSS/SASS/LESS/Stylus files that are deployed to /css. The technology you use is up to you (currently uses Stylus).
    • /unittest, which contains unit tests (currently Jasmine + Karma, but can be easily changed). This folder does not get deployed.
    • /partials, which contains HTML files that are deployed to /views/{module}/partials
    • Sub-modules! Yes, you can create modules-within-modules (like Java packages).
  • Code changes trigger re-compilation (when using grunt dev)
  • Support for live-reloading is built-in
  • File-revving (cache-busting) and image+CSS+HTML+JS optimization for production builds
  • Vendor specific libraries such as jQuery can be downloaded via Bower and used by editing Gruntfile.js to make them available to web-pages via the {{vendorScripts}} template-tag.
  • Ability to define your own task-wiring from the provided tasks (not locked-in to the default approach)
  • Ability to use special template-tags in HTML pages to refer to {{vendorScripts}}, {{externalScripts}}, {{cssFiles}} and {{appScripts}}

Default Options

The default options are located in modularProject.js

The defaults support the following input folder structure:

  • config
    • jscs
      • .jscsrc
    • jshint
      • .jshint
  • src
    • index.html
    • modules
      • myModule1
        • _main.js
        • other.js
        • someHtml.html
        • assets
          • font
          • images
        • include
        • partials
          • *.html
        • style
          • *.styl
        • unitTest
          • *.spec.js
        • template
          • componentTemplate.html
      • myModule2
        • withSubModule
          • assets
          • unitTest
          • ...
        • includes
        • ...

And they produce the following output folder when using grunt dev:

  • dev
    • index.html
    • assets
      • myModule1
        • font
        • images
    • css
      • rootFiles and external CSS files
    • js
      • myModule1.js (contains _main.js THEN all other JS files in the src/modules/module1 folder)
      • myModule2.js
      • withSubModule
        • withSubModule.js
    • vendor
      • any files specified by buildHTML.compilableVendorJSFiles and buildHTML.nonCompilableVendorJSFiles
    • views
      • myModule1
        • *.html
      • myModule2
        • *.html
        • withSubModule
          • *.html

And they produce the following output folder when using grunt build:

  • dist
    • as above except all files are revved & minified & concatenate where applicable, except:
    • js
      • app.js (all JS files in this folder are concentated and minified into app.js)

Options

input.srcDir

Type: String Default value: 'src/'

A relative path from the root directory to the source code root directory.

input.modulesDir

Type: String Default value: 'src/modules/'

A relative path from the root directory to the modules directory. It is expected that underneath this directory are subdirectories representing one-or-more modules, and that these directories can also contain sub-modules.

More to come...

Usage Examples

grunt.initConfig({
  // Configuration to be run (and then tested).
  modularProject: {
    input: {
      // Use the defaults
    },
    output: {
      // Use the defaults
    },
    buildCSS: {
      rootSourceFiles:  ['**/styles/docs.styl', '**/styles/sampleFormStyle.styl'],
      externalCSSFiles: [
        '<%= modularProject.bowerDir %>angular-motion/dist/angular-motion.css',
        '<%= modularProject.bowerDir %>highlightjs/styles/github.css'
      ]
    },
    buildHTML: {
      compiledCSSFiles: [
        'css/angular-motion.css',
        'css/github.css',
        'css/docs.css',
        'css/sampleFormStyle.css'
      ],
      compilableVendorJSFiles: [
        // Order is important - Angular should come first
        '<%= modularProject.bowerDir %>angular/angular.js',
        '<%= modularProject.bowerDir %>angular-animate/angular-animate.js',
        '<%= modularProject.bowerDir %>angular-translate/angular-translate.js',
        '<%= modularProject.bowerDir %>angular-translate-loader-static-files/angular-translate-loader-static-files.js',
        '<%= modularProject.bowerDir %>angular-scroll/angular-scroll.js',
        '<%= modularProject.bowerDir %>angular-strap/dist/angular-strap.js',
        '<%= modularProject.bowerDir %>angular-strap/dist/angular-strap.tpl.js'
      ],
      nonCompilableVendorJSFiles: [
        '<%= modularProject.bowerDir %>highlightjs/highlight.pack.js'
      ]
    },
    // Custom config for building a JS library - used by the mpBuildLibrary task
    buildLibrary: {
      libFileNamePrefix: 'ng-form-lib',
      libSrcFiles: ['**/*.js', '!**/docs.js']
    },
    release: {
      // Modify both the docsConfig.json SRC and the temporary documentation version (in /docs), but only commit the SRC version.
      filesToBump: ['package.json', 'bower.json', 'src/modules/docs/assets/config/docsConfig.json', 'docs/assets/docs/config/docsConfig.json'],
      filesToCommit: ['package.json', 'bower.json', 'CHANGELOG.md', 'src/modules/docs/assets/config/docsConfig.json'],
      tasks: ['releaseDocs']
    },
    optimise: {
      tasks: [
        'mpBuildLibrary',       // New task
        'clean:optimised',
        'concurrent:optimisedImages',
        'copy:optimised',
        'concat:optimised', 'uglify:optimised',
        'mpOptimiseHTMLTags', 'targethtml:optimised',
        'filerev:optimised', 'useminOptimised',
        'htmlmin:optimised', 'usebanner'
        'beep:twobits'          // Beep at the end
      ]
    },
    unitTest: {
      testLibraryFiles: [
        '<%= modularProject.buildHTML.compilableVendorJSFiles %>',
        '<%= modularProject.bowerDir %>angular-mocks/angular-mocks.js'
      ]
    }
  }
});

Contributing

See CONTRIBUTING.md

List of contributors - could be you!