Compare commits

...

25 Commits

Author SHA1 Message Date
javi
10f13508aa allow to set template compiler 2017-09-04 10:50:07 +02:00
XhmikosR
719a961fb5 Normalize line endings. 2016-04-15 10:46:40 +03:00
XhmikosR
285f3ec285 Trying to fix Windows tests; one is left broken. 2016-04-14 09:52:41 +03:00
XhmikosR
806ddbe0c0 Minor lint tweaks. 2016-04-14 09:46:33 +03:00
XhmikosR
adb8c048de Add AppVeyor support. 2016-04-14 09:32:54 +03:00
Kyle Robinson Young
c8bf51f6e5 Update grunt-contrib-internal 2016-04-05 20:35:13 -07:00
Vlad Filippov
8491220004 v1.0.0 2016-03-04 17:18:27 -05:00
Kyle Robinson Young
10a06938b9 Point main to task 2016-01-29 19:21:39 -08:00
Kyle Robinson Young
400eba0fa1 Remove peerDeps. Ref gruntjs/grunt#1116 2016-01-29 19:21:10 -08:00
Kyle Robinson Young
a71859bdf3 Update copyright to 2016 2016-01-04 17:15:22 -08:00
XhmikosR
dba65df851 Update jst-options.md
[ci skip]
2015-10-14 17:11:06 +03:00
Kyle Robinson Young
0b22db3937 Fix deprecated package.json licenses 2015-05-28 15:01:36 -07:00
Sindre Sorhus
d06dc07fd3 bump deps 2015-02-24 20:52:20 +07:00
Sindre Sorhus
a860ce1eb9 minor tweaks 2015-02-08 20:21:12 +07:00
Kyle Robinson Young
514e7782a6 Update copyright to 2015 2015-01-01 11:30:53 -08:00
vladikoff
53cfd8107e Dependency and doc updates. 2014-07-11 10:17:51 -07:00
Sindre Sorhus
f50f1a76cc Update .travis.yml 2014-03-01 03:48:00 +01:00
Sindre Sorhus
671b3d069c bump readme 2014-03-01 03:30:07 +01:00
Sindre Sorhus
eea4f84f69 0.6.0 2014-03-01 03:29:03 +01:00
Sindre Sorhus
5de2bd1e4d add some color 2014-03-01 03:22:40 +01:00
Sindre Sorhus
3aedc01de3 better regex 2014-03-01 03:17:38 +01:00
Sindre Sorhus
8a8cdd6b04 bump deps 2014-03-01 03:03:54 +01:00
Kyle Robinson Young
3576c6f107 Update copyright to 2014 2014-02-28 16:55:57 -08:00
Vlad Filippov
1b68927794 Merge pull request #40 from jogjayr/patch-2
Make processName example clearer
2014-01-24 13:31:34 -08:00
Jayraj Jog
ba4ba32360 Make processName example clearer
The description for processName says the function is passed the filepath but the example uses an argument named `filename`. This change makes it clearer that the filepath is being passed to the function
2014-01-24 12:16:10 -08:00
15 changed files with 492 additions and 417 deletions

3
.gitattributes vendored
View File

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

View File

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

View File

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

View File

@ -1,5 +1,5 @@
Tim Branyen (http://tbranyen.com)
Tyler Kellen (http://goingslowly.com/)
Chris Talkington (http://christalkington.com/)
Larry Davis (http://lazd.net/)
Tim Branyen (http://tbranyen.com)
Tyler Kellen (http://goingslowly.com/)
Chris Talkington (http://christalkington.com/)
Larry Davis (http://lazd.net/)
Adrien Antoine (http://adriantoine.com/)

View File

@ -1,3 +1,13 @@
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

@ -1,163 +1,163 @@
/*
* grunt-contrib-jst
* http://gruntjs.com/
*
* Copyright (c) 2013 Tim Branyen, contributors
* Licensed under the MIT license.
*/
'use strict';
module.exports = function(grunt) {
// Project configuration.
grunt.initConfig({
jshint: {
all: [
'Gruntfile.js',
'tasks/*.js',
'<%= nodeunit.tests %>'
],
options: {
jshintrc: '.jshintrc'
}
},
// Before generating any new files, remove any previously-created files.
clean: {
test: ['tmp']
},
// Configuration to be run (and then tested).
jst: {
compile: {
options: {
templateSettings: {
variable: 'obj'
}
},
files: {
"tmp/jst.js": ["test/fixtures/template.html"]
}
},
pretty_amd: {
options: {
templateSettings: {
variable: 'obj'
},
prettify: true,
amd: true
},
files: {
"tmp/pretty_amd.js": ["test/fixtures/template.html"]
}
},
prettify: {
options: {
templateSettings: {
variable: 'obj'
},
prettify: true
},
files: {
"tmp/pretty.js": ["test/fixtures/template.html"]
}
},
amd_wrapper: {
options: {
templateSettings: {
variable: 'obj'
},
amd:true
},
files: {
"tmp/amd_wrapper.js": ["test/fixtures/template.html"]
}
},
amd_wrapper_no_ns: {
options: {
templateSettings: {
variable: 'obj'
},
amd:true,
namespace:false
},
files: {
"tmp/amd_wrapper_no_ns.js": ["test/fixtures/template.html"]
}
},
uglyfile: {
options: {
templateSettings: {
variable: 'obj'
},
},
files: {
"tmp/uglyfile.js": ["test/fixtures/*bad-filename*"]
}
},
ns_nested: {
options: {
templateSettings: {
variable: 'obj'
},
namespace: "MyApp.JST.Main"
},
files: {
"tmp/ns_nested.js": ["test/fixtures/template.html"]
}
},
ns_nested_this: {
options: {
templateSettings: {
variable: 'obj'
},
namespace: "this.MyApp.JST.Main"
},
files: {
"tmp/ns_nested_this.js": ["test/fixtures/template.html"]
}
},
process_content: {
options: {
templateSettings: {
variable: 'obj'
},
processContent: function (src) {
return src.replace(/(^\s+|\s+$)/gm, '');
}
},
files: {
"tmp/process_content.js": ["test/fixtures/indent_template.html"]
}
},
local_scope: {
files: {
"tmp/local_scope.js": ["test/fixtures/template_local_scope.html"]
}
}
},
// Unit tests.
nodeunit: {
tests: ['test/*_test.js']
}
});
// Actually load this plugin's task(s).
grunt.loadTasks('tasks');
// These plugins provide necessary tasks.
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-nodeunit');
grunt.loadNpmTasks('grunt-contrib-internal');
grunt.loadNpmTasks('grunt-contrib-clean');
// Whenever the "test" task is run, first clean the "tmp" dir, then run this
// plugin's task(s), then test the result.
grunt.registerTask('test', ['clean', 'jst', 'nodeunit']);
// By default, lint and run all tests.
grunt.registerTask('default', ['jshint', 'test', 'build-contrib']);
};
/*
* grunt-contrib-jst
* http://gruntjs.com/
*
* Copyright (c) 2016 Tim Branyen, contributors
* Licensed under the MIT license.
*/
'use strict';
module.exports = function(grunt) {
// Project configuration.
grunt.initConfig({
jshint: {
all: [
'Gruntfile.js',
'tasks/*.js',
'<%= nodeunit.tests %>'
],
options: {
jshintrc: '.jshintrc'
}
},
// Before generating any new files, remove any previously-created files.
clean: {
test: ['tmp']
},
// Configuration to be run (and then tested).
jst: {
compile: {
options: {
templateSettings: {
variable: 'obj'
}
},
files: {
'tmp/jst.js': ['test/fixtures/template.html']
}
},
pretty_amd: {
options: {
templateSettings: {
variable: 'obj'
},
prettify: true,
amd: true
},
files: {
'tmp/pretty_amd.js': ['test/fixtures/template.html']
}
},
prettify: {
options: {
templateSettings: {
variable: 'obj'
},
prettify: true
},
files: {
'tmp/pretty.js': ['test/fixtures/template.html']
}
},
amd_wrapper: {
options: {
templateSettings: {
variable: 'obj'
},
amd:true
},
files: {
'tmp/amd_wrapper.js': ['test/fixtures/template.html']
}
},
amd_wrapper_no_ns: {
options: {
templateSettings: {
variable: 'obj'
},
amd: true,
namespace: false
},
files: {
'tmp/amd_wrapper_no_ns.js': ['test/fixtures/template.html']
}
},
uglyfile: {
options: {
templateSettings: {
variable: 'obj'
}
},
files: {
'tmp/uglyfile.js': ['test/fixtures/*bad-filename*']
}
},
ns_nested: {
options: {
templateSettings: {
variable: 'obj'
},
namespace: 'MyApp.JST.Main'
},
files: {
'tmp/ns_nested.js': ['test/fixtures/template.html']
}
},
ns_nested_this: {
options: {
templateSettings: {
variable: 'obj'
},
namespace: 'this.MyApp.JST.Main'
},
files: {
'tmp/ns_nested_this.js': ['test/fixtures/template.html']
}
},
process_content: {
options: {
templateSettings: {
variable: 'obj'
},
processContent: function (src) {
return src.replace(/(^\s+|\s+$)/gm, '');
}
},
files: {
'tmp/process_content.js': ['test/fixtures/indent_template.html']
}
},
local_scope: {
files: {
'tmp/local_scope.js': ['test/fixtures/template_local_scope.html']
}
}
},
// Unit tests.
nodeunit: {
tests: ['test/*_test.js']
}
});
// Actually load this plugin's task(s).
grunt.loadTasks('tasks');
// These plugins provide necessary tasks.
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-nodeunit');
grunt.loadNpmTasks('grunt-contrib-internal');
grunt.loadNpmTasks('grunt-contrib-clean');
// Whenever the "test" task is run, first clean the "tmp" dir, then run this
// plugin's task(s), then test the result.
grunt.registerTask('test', ['clean', 'jst', 'nodeunit']);
// By default, lint and run all tests.
grunt.registerTask('default', ['jshint', 'test', 'build-contrib']);
};

View File

@ -1,22 +1,22 @@
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
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
Copyright (c) 2016 Tim Branyen, contributors
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

View File

@ -1,11 +1,10 @@
# 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)
# 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)
> 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:
@ -32,34 +31,34 @@ _This plugin uses [the Lo-Dash library](http://lodash.com/) to generate JavaScri
### Options
#### separator
Type: `String`
Type: `String`
Default: linefeed + linefeed
Concatenated files will be joined on this string.
#### namespace
Type: `String`
Default: 'JST'
Type: `String`
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
Type: `function`
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(filename) {
return filename.toUpperCase();
processName: function(filepath) {
return filepath.toUpperCase();
}
}
```
#### templateSettings
Type: `Object`
Default: null
Type: `Object`
Default: `null`
The settings passed to underscore when compiling templates.
@ -68,19 +67,19 @@ jst: {
compile: {
options: {
templateSettings: {
interpolate : /\{\{(.+?)\}\}/g
interpolate: /\{\{(.+?)\}\}/g
}
},
files: {
"path/to/compiled/templates.js": ["path/to/source/**/*.html"]
'path/to/compiled/templates.js': ['path/to/source/**/*.html']
}
}
}
```
#### prettify
Type: `boolean`
Default: false
Type: `boolean`
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,15 +92,15 @@ options: {
```
#### amd
Type: `boolean`
Default: false
Type: `boolean`
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.
```js
define(function() {
//...//
return this['[template namespace]'];
//...//
return this['[template namespace]'];
});
```
@ -135,11 +134,11 @@ jst: {
compile: {
options: {
templateSettings: {
interpolate : /\{\{(.+?)\}\}/g
interpolate: /\{\{(.+?)\}\}/g
}
},
files: {
"path/to/compiled/templates.js": ["path/to/source/**/*.html"]
'path/to/compiled/templates.js': ['path/to/source/**/*.html']
}
}
}
@ -149,6 +148,8 @@ 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.
@ -165,4 +166,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 Sat Oct 19 2013 14:22:27.*
*This file was generated on Thu Apr 14 2016 09:40:42.*

37
appveyor.yml Normal file
View File

@ -0,0 +1,37 @@
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

@ -5,11 +5,11 @@ jst: {
compile: {
options: {
templateSettings: {
interpolate : /\{\{(.+?)\}\}/g
interpolate: /\{\{(.+?)\}\}/g
}
},
files: {
"path/to/compiled/templates.js": ["path/to/source/**/*.html"]
'path/to/compiled/templates.js': ['path/to/source/**/*.html']
}
}
}

View File

@ -1,34 +1,34 @@
# Options
## separator
Type: `String`
Type: `String`
Default: linefeed + linefeed
Concatenated files will be joined on this string.
## namespace
Type: `String`
Default: 'JST'
Type: `String`
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
Type: `function`
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(filename) {
return filename.toUpperCase();
processName: function(filepath) {
return filepath.toUpperCase();
}
}
```
## templateSettings
Type: `Object`
Default: null
Type: `Object`
Default: `null`
The settings passed to underscore when compiling templates.
@ -37,19 +37,19 @@ jst: {
compile: {
options: {
templateSettings: {
interpolate : /\{\{(.+?)\}\}/g
interpolate: /\{\{(.+?)\}\}/g
}
},
files: {
"path/to/compiled/templates.js": ["path/to/source/**/*.html"]
'path/to/compiled/templates.js': ['path/to/source/**/*.html']
}
}
}
```
## prettify
Type: `boolean`
Default: false
Type: `boolean`
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
@ -62,15 +62,15 @@ options: {
```
## amd
Type: `boolean`
Default: false
Type: `boolean`
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.
```js
define(function() {
//...//
return this['[template namespace]'];
//...//
return this['[template namespace]'];
});
```

View File

@ -1,50 +1,36 @@
{
"name": "grunt-contrib-jst",
"description": "Precompile Underscore templates to JST file.",
"version": "0.5.1",
"homepage": "https://github.com/gruntjs/grunt-contrib-jst",
"description": "Precompile Underscore templates to JST file",
"version": "1.0.0",
"author": {
"name": "Grunt Team",
"url": "http://gruntjs.com/"
},
"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"
}
],
"repository": "gruntjs/grunt-contrib-jst",
"license": "MIT",
"engines": {
"node": ">= 0.8.0"
"node": ">=0.10.0"
},
"main": "tasks/jst.js",
"scripts": {
"test": "grunt test"
},
"dependencies": {
"lodash": "~1.0.0",
"grunt-lib-contrib": "~0.5.1"
"chalk": "^1.0.0",
"lodash": "^2.4.1"
},
"devDependencies": {
"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"
"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"
},
"keywords": [
"gruntplugin"
],
"files": [
"tasks",
"LICENSE-MIT"
]
}
"tasks"
],
"appveyor_id": "mxt7687c8r7bn7ab"
}

View File

@ -1,94 +1,95 @@
/*
* grunt-contrib-jst
* http://gruntjs.com/
*
* Copyright (c) 2013 Tim Branyen, contributors
* Licensed under the MIT license.
*/
'use strict';
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 helpers = require('grunt-lib-contrib').init(grunt);
var options = this.options({
namespace: 'JST',
templateSettings: {},
processContent: function (src) { return src; },
separator: lf + lf
});
// assign filename transformation functions
var processName = options.processName || defaultProcessName;
var nsInfo;
if (options.namespace !== false) {
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 "' + filepath + '" not found.');
return false;
} else {
return true;
}
})
.map(function(filepath) {
var src = options.processContent(grunt.file.read(filepath));
var compiled, filename;
try {
compiled = _.template(src, false, options.templateSettings).source;
} catch (e) {
grunt.log.error(e);
grunt.fail.warn('JST "' + filepath + '" failed to compile.');
}
if (options.prettify) {
compiled = compiled.replace(new RegExp('\n', 'g'), '');
}
filename = processName(filepath);
if (options.amd && options.namespace === false) {
return 'return ' + compiled;
}
return nsInfo.namespace+'['+JSON.stringify(filename)+'] = '+compiled+';';
});
if (output.length < 1) {
grunt.log.warn('Destination not written because compiled files were empty.');
} else {
if (options.namespace !== false) {
output.unshift(nsInfo.declaration);
}
if (options.amd) {
if (options.prettify) {
output.forEach(function(line, index) {
output[index] = " " + line;
});
}
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("});");
}
grunt.file.write(f.dest, output.join(grunt.util.normalizelf(options.separator)));
grunt.log.writeln('File "' + f.dest + '" created.');
}
});
});
};
/*
* grunt-contrib-jst
* http://gruntjs.com/
*
* Copyright (c) 2016 Tim Branyen, contributors
* Licensed under the MIT license.
*/
'use strict';
var _ = require('lodash');
var chalk = require('chalk');
module.exports = function(grunt) {
// 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 options = this.options({
namespace: 'JST',
templateSettings: {},
processContent: function (src) { return src; },
separator: lf + lf,
template: _.template
});
// assign filename transformation functions
var processName = options.processName || defaultProcessName;
var nsInfo;
if (options.namespace !== false) {
nsInfo = lib.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.');
return false;
} else {
return true;
}
})
.map(function(filepath) {
var src = options.processContent(grunt.file.read(filepath));
var compiled, filename;
try {
compiled = options.template(src, false, options.templateSettings).source;
} catch (e) {
grunt.log.error(e);
grunt.fail.warn('JST ' + chalk.cyan(filepath) + ' failed to compile.');
}
if (options.prettify) {
compiled = compiled.replace(/\n/g, '');
}
filename = processName(filepath);
if (options.amd && options.namespace === false) {
return 'return ' + compiled;
}
return nsInfo.namespace+'['+JSON.stringify(filename)+'] = '+compiled+';';
});
if (output.length < 1) {
grunt.log.warn('Destination not written because compiled files were empty.');
} else {
if (options.namespace !== false) {
output.unshift(nsInfo.declaration);
}
if (options.amd) {
if (options.prettify) {
output.forEach(function(line, index) {
output[index] = ' ' + line;
});
}
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('});');
}
grunt.file.write(f.dest, output.join(grunt.util.normalizelf(options.separator)));
grunt.log.writeln('File ' + chalk.cyan(f.dest) + ' created.');
}
});
});
};

20
tasks/lib/jst.js Normal file
View File

@ -0,0 +1,20 @@
'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,53 +1,62 @@
var grunt = require('grunt');
exports['jst'] = {
main: function(test) {
'use strict';
var expect, result;
test.expect(10);
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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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();
}
};
'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 = {
main: function(test) {
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 = readFile('test/expected/uglyfile.js');
result = readFile('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 = 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 = 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 = 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 = 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 = readFile('test/expected/pretty_amd.js');
result = readFile('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 = 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');
test.done();
}
};