Compare commits

..

1 Commits

Author SHA1 Message Date
javi
7a1bf369ce allow to set template compiler 2014-01-17 13:05:52 +01:00
15 changed files with 419 additions and 493 deletions

3
.gitattributes vendored
View File

@ -1 +1,2 @@
* text=auto
# Automatically normalize line endings for all text-based files
* text=crlf

View File

@ -1,14 +1,13 @@
{
"boss": true,
"curly": true,
"eqeqeq": true,
"eqnull": true,
"immed": true,
"latedef": true,
"newcap": true,
"noarg": true,
"node": true,
"sub": true,
"undef": true,
"unused": true
"boss": true,
"eqnull": true,
"node": true
}

View File

@ -1,17 +1,6 @@
sudo: false
language: node_js
node_js:
- "0.8"
- "0.10"
- "0.12"
- "4"
- "5"
- "iojs"
matrix:
fast_finish: true
cache:
directories:
- node_modules
before_script:
- npm install -g grunt-cli

View File

@ -1,13 +1,3 @@
v1.0.0:
date: 2016-03-04
changes:
- Bug fixes and dependency updates.
- Remove peerDeps and other fixes.
v0.6.0:
date: 2014-02-28
changes:
- Bug fixes and dependency updates.
- Adds color log.
v0.5.1:
date: 2013-07-14
changes:

View File

@ -2,7 +2,7 @@
* grunt-contrib-jst
* http://gruntjs.com/
*
* Copyright (c) 2016 Tim Branyen, contributors
* Copyright (c) 2013 Tim Branyen, contributors
* Licensed under the MIT license.
*/
@ -37,7 +37,7 @@ module.exports = function(grunt) {
}
},
files: {
'tmp/jst.js': ['test/fixtures/template.html']
"tmp/jst.js": ["test/fixtures/template.html"]
}
},
pretty_amd: {
@ -49,7 +49,7 @@ module.exports = function(grunt) {
amd: true
},
files: {
'tmp/pretty_amd.js': ['test/fixtures/template.html']
"tmp/pretty_amd.js": ["test/fixtures/template.html"]
}
},
prettify: {
@ -60,7 +60,7 @@ module.exports = function(grunt) {
prettify: true
},
files: {
'tmp/pretty.js': ['test/fixtures/template.html']
"tmp/pretty.js": ["test/fixtures/template.html"]
}
},
amd_wrapper: {
@ -71,7 +71,7 @@ module.exports = function(grunt) {
amd:true
},
files: {
'tmp/amd_wrapper.js': ['test/fixtures/template.html']
"tmp/amd_wrapper.js": ["test/fixtures/template.html"]
}
},
amd_wrapper_no_ns: {
@ -83,17 +83,17 @@ module.exports = function(grunt) {
namespace:false
},
files: {
'tmp/amd_wrapper_no_ns.js': ['test/fixtures/template.html']
"tmp/amd_wrapper_no_ns.js": ["test/fixtures/template.html"]
}
},
uglyfile: {
options: {
templateSettings: {
variable: 'obj'
}
},
},
files: {
'tmp/uglyfile.js': ['test/fixtures/*bad-filename*']
"tmp/uglyfile.js": ["test/fixtures/*bad-filename*"]
}
},
ns_nested: {
@ -101,10 +101,10 @@ module.exports = function(grunt) {
templateSettings: {
variable: 'obj'
},
namespace: 'MyApp.JST.Main'
namespace: "MyApp.JST.Main"
},
files: {
'tmp/ns_nested.js': ['test/fixtures/template.html']
"tmp/ns_nested.js": ["test/fixtures/template.html"]
}
},
ns_nested_this: {
@ -112,10 +112,10 @@ module.exports = function(grunt) {
templateSettings: {
variable: 'obj'
},
namespace: 'this.MyApp.JST.Main'
namespace: "this.MyApp.JST.Main"
},
files: {
'tmp/ns_nested_this.js': ['test/fixtures/template.html']
"tmp/ns_nested_this.js": ["test/fixtures/template.html"]
}
},
process_content: {
@ -128,12 +128,12 @@ module.exports = function(grunt) {
}
},
files: {
'tmp/process_content.js': ['test/fixtures/indent_template.html']
"tmp/process_content.js": ["test/fixtures/indent_template.html"]
}
},
local_scope: {
files: {
'tmp/local_scope.js': ['test/fixtures/template_local_scope.html']
"tmp/local_scope.js": ["test/fixtures/template_local_scope.html"]
}
}
},

View File

@ -1,4 +1,4 @@
Copyright (c) 2016 Tim Branyen, contributors
Copyright (c) 2013 Tim Branyen, contributors
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation

View File

@ -1,10 +1,11 @@
# grunt-contrib-jst v1.0.0 [![Build Status: Linux](https://travis-ci.org/gruntjs/grunt-contrib-jst.svg?branch=master)](https://travis-ci.org/gruntjs/grunt-contrib-jst) [![Build Status: Windows](https://ci.appveyor.com/api/projects/status/mxt7687c8r7bn7ab/branch/master?svg=true)](https://ci.appveyor.com/project/gruntjs/grunt-contrib-jst/branch/master)
# grunt-contrib-jst v0.5.1 [![Build Status](https://travis-ci.org/gruntjs/grunt-contrib-jst.png?branch=master)](https://travis-ci.org/gruntjs/grunt-contrib-jst)
> Precompile Underscore templates to JST file
> Precompile Underscore templates to JST file.
## Getting Started
This plugin requires Grunt `~0.4.0`
If you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:
@ -38,27 +39,27 @@ Concatenated files will be joined on this string.
#### namespace
Type: `String`
Default: `'JST'`
Default: 'JST'
The namespace in which the precompiled templates will be assigned. Use dot notation (e.g. App.Templates) for nested namespaces or false for no namespace wrapping. When false with amd option set true, templates will be returned directly from the AMD wrapper.
#### processName
Type: `function`
Default: `null`
Default: null
This option accepts a function which takes one argument (the template filepath) and returns a string which will be used as the key for the precompiled template object. The example below stores all templates on the default JST namespace in capital letters.
```js
options: {
processName: function(filepath) {
return filepath.toUpperCase();
processName: function(filename) {
return filename.toUpperCase();
}
}
```
#### templateSettings
Type: `Object`
Default: `null`
Default: null
The settings passed to underscore when compiling templates.
@ -71,7 +72,7 @@ jst: {
}
},
files: {
'path/to/compiled/templates.js': ['path/to/source/**/*.html']
"path/to/compiled/templates.js": ["path/to/source/**/*.html"]
}
}
}
@ -79,7 +80,7 @@ jst: {
#### prettify
Type: `boolean`
Default: `false`
Default: false
When doing a quick once-over of your compiled template file, it's nice to see
an easy-to-read format that has one line per template. This will accomplish
@ -93,7 +94,7 @@ options: {
#### amd
Type: `boolean`
Default: `false`
Default: false
Wraps the output file with an AMD define function and returns the compiled template namespace unless namespace has been explicitly set to false in which case the template function will be returned directly.
@ -138,7 +139,7 @@ jst: {
}
},
files: {
'path/to/compiled/templates.js': ['path/to/source/**/*.html']
"path/to/compiled/templates.js": ["path/to/source/**/*.html"]
}
}
}
@ -148,8 +149,6 @@ Note that the `interpolate: /\{\{(.+?)\}\}/g` setting above is simply an example
## Release History
* 2016-03-04v1.0.0Bug fixes and dependency updates. Remove peerDeps and other fixes.
* 2014-02-28v0.6.0Bug fixes and dependency updates. Adds color log.
* 2013-07-14v0.5.1Display filepath when fails to compile.
* 2013-03-06v0.5.0When `namespace` is false and `amd` is true, return templates directly from AMD wrapper. Rename `amdwrapper` option to `amd` to match grunt-contrib-handlebars.
* 2013-02-15v0.4.1First official release for Grunt 0.4.0.
@ -166,4 +165,4 @@ Note that the `interpolate: /\{\{(.+?)\}\}/g` setting above is simply an example
Task submitted by [Tim Branyen](http://tbranyen.com)
*This file was generated on Thu Apr 14 2016 09:40:42.*
*This file was generated on Sat Oct 19 2013 14:22:27.*

View File

@ -1,37 +0,0 @@
clone_depth: 10
version: "{build}"
# What combinations to test
environment:
matrix:
- nodejs_version: "0.10"
platform: x86
- nodejs_version: "0.12"
platform: x86
- nodejs_version: "4"
platform: x64
- nodejs_version: "4"
platform: x86
- nodejs_version: "5"
platform: x86
install:
- ps: Install-Product node $env:nodejs_version $env:platform
- npm install
test_script:
# Output useful info for debugging
- node --version && npm --version
# We test multiple Windows shells because of prior stdout buffering issues
# filed against Grunt. https://github.com/joyent/node/issues/3584
- ps: "npm test # PowerShell" # Pass comment to PS for easier debugging
- cmd: npm test
build: off
matrix:
fast_finish: true
cache:
- node_modules -> package.json

View File

@ -9,7 +9,7 @@ jst: {
}
},
files: {
'path/to/compiled/templates.js': ['path/to/source/**/*.html']
"path/to/compiled/templates.js": ["path/to/source/**/*.html"]
}
}
}

View File

@ -8,27 +8,27 @@ Concatenated files will be joined on this string.
## namespace
Type: `String`
Default: `'JST'`
Default: 'JST'
The namespace in which the precompiled templates will be assigned. Use dot notation (e.g. App.Templates) for nested namespaces or false for no namespace wrapping. When false with amd option set true, templates will be returned directly from the AMD wrapper.
## processName
Type: `function`
Default: `null`
Default: null
This option accepts a function which takes one argument (the template filepath) and returns a string which will be used as the key for the precompiled template object. The example below stores all templates on the default JST namespace in capital letters.
```js
options: {
processName: function(filepath) {
return filepath.toUpperCase();
processName: function(filename) {
return filename.toUpperCase();
}
}
```
## templateSettings
Type: `Object`
Default: `null`
Default: null
The settings passed to underscore when compiling templates.
@ -41,7 +41,7 @@ jst: {
}
},
files: {
'path/to/compiled/templates.js': ['path/to/source/**/*.html']
"path/to/compiled/templates.js": ["path/to/source/**/*.html"]
}
}
}
@ -49,7 +49,7 @@ jst: {
## prettify
Type: `boolean`
Default: `false`
Default: false
When doing a quick once-over of your compiled template file, it's nice to see
an easy-to-read format that has one line per template. This will accomplish
@ -63,7 +63,7 @@ options: {
## amd
Type: `boolean`
Default: `false`
Default: false
Wraps the output file with an AMD define function and returns the compiled template namespace unless namespace has been explicitly set to false in which case the template function will be returned directly.

View File

@ -1,36 +1,50 @@
{
"name": "grunt-contrib-jst",
"description": "Precompile Underscore templates to JST file",
"version": "1.0.0",
"description": "Precompile Underscore templates to JST file.",
"version": "0.5.1",
"homepage": "https://github.com/gruntjs/grunt-contrib-jst",
"author": {
"name": "Grunt Team",
"url": "http://gruntjs.com/"
},
"repository": "gruntjs/grunt-contrib-jst",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
"repository": {
"type": "git",
"url": "git://github.com/gruntjs/grunt-contrib-jst.git"
},
"bugs": {
"url": "https://github.com/gruntjs/grunt-contrib-jst/issues"
},
"licenses": [
{
"type": "MIT",
"url": "https://github.com/gruntjs/grunt-contrib-jst/blob/master/LICENSE-MIT"
}
],
"engines": {
"node": ">= 0.8.0"
},
"main": "tasks/jst.js",
"scripts": {
"test": "grunt test"
},
"dependencies": {
"chalk": "^1.0.0",
"lodash": "^2.4.1"
"lodash": "~1.0.0",
"grunt-lib-contrib": "~0.5.1"
},
"devDependencies": {
"grunt": "^1.0.0",
"grunt-contrib-clean": "^1.0.0",
"grunt-contrib-internal": "^1.1.0",
"grunt-contrib-jshint": "^1.0.0",
"grunt-contrib-nodeunit": "^1.0.0"
"grunt-contrib-jshint": "~0.6.0",
"grunt-contrib-nodeunit": "~0.2.0",
"grunt-contrib-clean": "~0.4.1",
"grunt-contrib-internal": "~0.4.5",
"grunt": "~0.4.0"
},
"peerDependencies": {
"grunt": "~0.4.0"
},
"keywords": [
"gruntplugin"
],
"files": [
"tasks"
],
"appveyor_id": "mxt7687c8r7bn7ab"
"tasks",
"LICENSE-MIT"
]
}

View File

@ -2,22 +2,22 @@
* grunt-contrib-jst
* http://gruntjs.com/
*
* Copyright (c) 2016 Tim Branyen, contributors
* Copyright (c) 2013 Tim Branyen, contributors
* Licensed under the MIT license.
*/
'use strict';
var _ = require('lodash');
var chalk = require('chalk');
module.exports = function(grunt) {
var _ = require('lodash');
// filename conversion for templates
var defaultProcessName = function(name) { return name; };
grunt.registerMultiTask('jst', 'Compile underscore templates to JST file', function() {
var lf = grunt.util.linefeed;
var lib = require('./lib/jst');
var helpers = require('grunt-lib-contrib').init(grunt);
var options = this.options({
namespace: 'JST',
templateSettings: {},
@ -31,14 +31,14 @@ module.exports = function(grunt) {
var nsInfo;
if (options.namespace !== false) {
nsInfo = lib.getNamespaceDeclaration(options.namespace);
nsInfo = helpers.getNamespaceDeclaration(options.namespace);
}
this.files.forEach(function(f) {
var output = f.src.filter(function(filepath) {
// Warn on and remove invalid source files (if nonull was set).
if (!grunt.file.exists(filepath)) {
grunt.log.warn('Source file ' + chalk.cyan(filepath) + ' not found.');
grunt.log.warn('Source file "' + filepath + '" not found.');
return false;
} else {
return true;
@ -52,11 +52,11 @@ module.exports = function(grunt) {
compiled = options.template(src, false, options.templateSettings).source;
} catch (e) {
grunt.log.error(e);
grunt.fail.warn('JST ' + chalk.cyan(filepath) + ' failed to compile.');
grunt.fail.warn('JST "' + filepath + '" failed to compile.');
}
if (options.prettify) {
compiled = compiled.replace(/\n/g, '');
compiled = compiled.replace(new RegExp('\n', 'g'), '');
}
filename = processName(filepath);
@ -75,19 +75,19 @@ module.exports = function(grunt) {
if (options.amd) {
if (options.prettify) {
output.forEach(function(line, index) {
output[index] = ' ' + line;
output[index] = " " + line;
});
}
output.unshift('define(function(){');
output.unshift("define(function(){");
if (options.namespace !== false) {
// Namespace has not been explicitly set to false; the AMD
// wrapper will return the object containing the template.
output.push(' return ' + nsInfo.namespace + ';');
output.push(" return " + nsInfo.namespace + ";");
}
output.push('});');
output.push("});");
}
grunt.file.write(f.dest, output.join(grunt.util.normalizelf(options.separator)));
grunt.log.writeln('File ' + chalk.cyan(f.dest) + ' created.');
grunt.log.writeln('File "' + f.dest + '" created.');
}
});

View File

@ -1,20 +0,0 @@
'use strict';
exports.getNamespaceDeclaration = function(ns) {
var output = [];
var curPath = 'this';
if (ns !== 'this') {
var nsParts = ns.split('.');
nsParts.forEach(function(curPart) {
if (curPart !== 'this') {
curPath += '[' + JSON.stringify(curPart) + ']';
output.push(curPath + ' = ' + curPath + ' || {};');
}
});
}
return {
namespace: curPath,
declaration: output.join('\n')
};
};

View File

@ -1,61 +1,52 @@
'use strict';
var grunt = require('grunt');
function readFile(file) {
var contents = grunt.file.read(file);
if (process.platform === 'win32') {
contents = contents.replace(/\r\n/g, '\n');
}
return contents;
}
exports.jst = {
exports['jst'] = {
main: function(test) {
'use strict';
var expect, result;
test.expect(10);
expect = readFile('test/expected/jst.js');
result = readFile('tmp/jst.js');
test.equal(expect, result, 'should compile underscore templates into JST');
expect = grunt.file.read("test/expected/jst.js");
result = grunt.file.read("tmp/jst.js");
test.equal(expect, result, "should compile underscore templates into JST");
expect = readFile('test/expected/uglyfile.js');
result = readFile('tmp/uglyfile.js');
test.equal(expect, result, 'should escape single quotes in filenames');
expect = grunt.file.read("test/expected/uglyfile.js");
result = grunt.file.read("tmp/uglyfile.js");
test.equal(expect, result, "should escape single quotes in filenames");
expect = readFile('test/expected/ns_nested.js');
result = readFile('tmp/ns_nested.js');
test.equal(expect, result, 'should define parts of nested namespaces');
expect = grunt.file.read("test/expected/ns_nested.js");
result = grunt.file.read("tmp/ns_nested.js");
test.equal(expect, result, "should define parts of nested namespaces");
expect = readFile('test/expected/ns_nested.js'); // same as previous test
result = readFile('tmp/ns_nested_this.js');
test.equal(expect, result, 'should define parts of nested namespaces, ignoring this.');
expect = grunt.file.read("test/expected/ns_nested.js"); // same as previous test
result = grunt.file.read("tmp/ns_nested_this.js");
test.equal(expect, result, "should define parts of nested namespaces, ignoring this.");
expect = readFile('test/expected/pretty.js');
result = readFile('tmp/pretty.js');
test.equal(expect, result, 'should make the output be 1 line per template, making the output less ugly');
expect = grunt.file.read("test/expected/pretty.js");
result = grunt.file.read("tmp/pretty.js");
test.equal(expect, result, "should make the output be 1 line per template, making the output less ugly");
expect = readFile('test/expected/amd_wrapper.js');
result = readFile('tmp/amd_wrapper.js');
test.equal(expect, result, 'should wrap the template with define for AMD pattern');
expect = grunt.file.read("test/expected/amd_wrapper.js");
result = grunt.file.read("tmp/amd_wrapper.js");
test.equal(expect, result, "should wrap the template with define for AMD pattern");
expect = readFile('test/expected/amd_wrapper_no_ns.js');
result = readFile('tmp/amd_wrapper_no_ns.js');
test.equal(expect, result, 'should wrap the template with define for AMD pattern and return the function itself with no namespace');
expect = grunt.file.read("test/expected/amd_wrapper_no_ns.js");
result = grunt.file.read("tmp/amd_wrapper_no_ns.js");
test.equal(expect, result, "should wrap the template with define for AMD pattern and return the function itself with no namespace");
expect = readFile('test/expected/pretty_amd.js');
result = readFile('tmp/pretty_amd.js');
test.equal(expect, result, 'should make the AMD wrapper output pretty');
expect = grunt.file.read("test/expected/pretty_amd.js");
result = grunt.file.read("tmp/pretty_amd.js");
test.equal(expect, result, "should make the AMD wrapper output pretty");
expect = readFile('test/expected/process_content.js');
result = readFile('tmp/process_content.js');
test.equal(expect, result, 'should convert file content');
expect = grunt.file.read("test/expected/process_content.js");
result = grunt.file.read("tmp/process_content.js");
test.equal(expect, result, "should convert file content");
expect = readFile('test/expected/local_scope.js');
result = readFile('tmp/local_scope.js');
test.equal(expect, result, 'should add `with` block when templateSettings.variable is undefined');
expect = grunt.file.read("test/expected/local_scope.js");
result = grunt.file.read("tmp/local_scope.js");
test.equal(expect, result, "should add `with` block when templateSettings.variable is undefined");
test.done();
}