view default/node_modules/shoestring/Gruntfile.js @ 0:1d038bc9b3d2 default tip

Up:default
author Liny <dev@neowd.com>
date Sat, 31 May 2025 09:21:51 +0800
parents
children
line wrap: on
line source

/* global module:false */
module.exports = function(grunt) {

	var fs, files, opts, spawn, builds = {};

	opts = {
		baseUrl: "src",
		name: "../build/REPLACE",
		out: "dist/REPLACE.js",
		mainConfigFile: "build/config/production.js"
	};

	fs = require( 'fs' );
	files = fs.readdirSync( "build/custom/" );

	files.forEach(function( file ) {
		if( /\.js$/.test(file) ){
			var name = file.replace(/\.js$/, ""),
				o = Object.create(opts);

			builds[name] = {
				options: o
			};

			builds[name].options.name = o.name.replace("REPLACE", "custom/" + name );
			builds[name].options.out = o.out.replace("REPLACE", name );
		}
	});

	builds.production = {
		options: {
			baseUrl: "src",
			name: "../build/production",
			out: "dist/production.js",
			mainConfigFile: "build/config/production.js"
		}
	};

	// NOTE config includes development
	builds.development = {
		options: {
			baseUrl: "src",
			// NOTE uses the same meta-module as production
			name: "../build/development",
			out: "dist/development.js",
			mainConfigFile: "build/config/development.js"
		}
	};

	// Project configuration.
	grunt.initConfig({
		pkg: grunt.file.readJSON( 'package.json' ),

		meta: {
			banner: '/*! Shoestring - v<%= pkg.version %> - ' +
				'<%= grunt.template.today("yyyy-mm-dd") %>\n' +
				'* http://github.com/filamentgroup/shoestring/\n' +
				'* Copyright (c) <%= grunt.template.today("yyyy") %> ' +
				'Scott Jehl, Filament Group, Inc; Licensed MIT & GPLv2 */ \n'
		},

		qunit: {
			files: ['test/unit/*.html']
		},

		requirejs: builds,

		// NOTE purely for the banner
		concat: {
			options: {
				banner: '<%= meta.banner %>',
				stripBanners: true
			},

			production: {
				src: ['dist/production.js'],
				dest: 'dist/shoestring.js'
			},

			development: {
				src: ['dist/development.js'],
				dest: 'dist/shoestring-dev.js'
			}
		},

		uglify: {
			all: {
				options: {
					banner: '<%= meta.banner %>',
					report: 'gzip'
				},

				files: {
					'dist/shoestring.min.js': ['dist/shoestring.js'],
					'dist/shoestring-dev.min.js': ['dist/shoestring-dev.js']
				}
			}
		},

		jshint: {
			all: {
				options: {
					jshintrc: ".jshintrc",
				},

				src: ['Gruntfile.js', 'src/**/*.js']
			}
		},
		watch: {
			js: {
				files: [
					'src/**'
				],
				tasks: 'default'
			}
		}
	});

	spawn = require('child_process').spawn;

	grunt.registerTask('docs', function() {
		var doxx, srcs, args = [], done = this.async();

		for(var i in arguments){
			args.push(arguments[i]);
		}

		srcs = args.length ? srcs = args.join(":") : "src";

		doxx = spawn( 'node', ['node_modules/.bin/doxx', '--source', srcs, '--target', 'dist/docs']);

		doxx.on( 'close', function( code ) {
			console.log( "doxx completed with exit code: "	+ code );
			done();
		});
	});

	// These plugins provide necessary tasks.
	grunt.loadNpmTasks('grunt-contrib-concat');
	grunt.loadNpmTasks('grunt-contrib-uglify');
	grunt.loadNpmTasks('grunt-contrib-qunit');
	grunt.loadNpmTasks('grunt-contrib-jshint');
	grunt.loadNpmTasks('grunt-contrib-requirejs');
	grunt.loadNpmTasks('grunt-contrib-watch');

	// Default task.
	grunt.registerTask('build', 'requirejs concat uglify'.split(' ') );
	grunt.registerTask('test', 'jshint qunit'.split(' ') );
	grunt.registerTask('default', 'build test'.split(' ') );
};