├── .editorconfig ├── .gitignore ├── .jshintrc ├── .travis.yml ├── README.md ├── gulpfile.js ├── index.js ├── makefile ├── package-lock.json ├── package.json ├── src └── stringify.js └── test ├── file_fixture.txt ├── getMinifyOptions.spec.js ├── getRequireExtensions.spec.js ├── getTransformOptions.spec.js ├── main.spec.js ├── minify.expected.html ├── minify.given.html ├── minify.spec.js ├── module.spec.js ├── nodeRequire.spec.js └── stringify.spec.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | lib-cov 2 | *.seed 3 | *.log 4 | *.csv 5 | *.dat 6 | *.out 7 | *.pid 8 | *.gz 9 | 10 | pids 11 | 12 | node_modules 13 | npm-debug.log 14 | 15 | .idea 16 | *.iml 17 | .settings 18 | .project 19 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "browser": false, 3 | "node": true, 4 | "esnext": true, 5 | "bitwise": true, 6 | "camelcase": false, 7 | "curly": true, 8 | "eqeqeq": true, 9 | "immed": true, 10 | "indent": 2, 11 | "latedef": true, 12 | "newcap": true, 13 | "noarg": true, 14 | "quotmark": "single", 15 | "undef": true, 16 | "unused": true, 17 | "strict": true, 18 | "trailing": true, 19 | "smarttabs": true, 20 | "white": true, 21 | "freeze": true, 22 | "noempty": true, 23 | "nonew": true, 24 | "maxdepth": 4, 25 | "maxlen": 120, 26 | "globals": {} 27 | } 28 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "5" 4 | - "5.1" 5 | - "4" 6 | - "4.2" 7 | - "4.1" 8 | - "4.0" 9 | before_script: 10 | - npm install -g gulp 11 | script: gulp 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Stringify # 2 | 3 | _**NOTE:** I no longer actively maintain this package. I'd love to get PRs to keep it going though!_ 4 | 5 | [![NPM](https://nodei.co/npm/stringify.png?downloads&downloadRank)](https://nodei.co/npm/stringify/) 6 | [![Build Status][travis-image]][travis-url] 7 | 8 | Browserify plugin to require() text files (such as HTML templates) inside of 9 | your client-side JavaScript files. 10 | 11 | *NOTE:* Has not been tested on Node below version 4.0.0, and has been tested up 12 | to Node 8.1.3. Please report (or put a Pull Request up for) any bugs you may 13 | find. 14 | 15 | ## Installation ## 16 | 17 | ```bash 18 | npm install stringify 19 | ``` 20 | 21 | ## Usage ## 22 | 23 | ### Browserify ### 24 | 25 | #### Browserify Command Line #### 26 | 27 | ```bash 28 | browserify -t [ stringify --extensions [.html .hbs] ] myfile.js 29 | ``` 30 | 31 | #### Browserify Middleware #### 32 | 33 | ```javascript 34 | var browserify = require('browserify'), 35 | stringify = require('stringify'); 36 | 37 | var bundle = browserify() 38 | .transform(stringify, { 39 | appliesTo: { includeExtensions: ['.hjs', '.html', '.whatever'] } 40 | }) 41 | .add('my_app_main.js'); 42 | 43 | app.use(bundle); 44 | ``` 45 | 46 | __NOTE__: You MUST call this as I have above. The Browserify .transform() method 47 | HAS to plug this middleware in to Browserify BEFORE you add the entry point 48 | (your main client-side file) for Browserify. 49 | 50 | Now, in your clientside files you can use require() as you would for JSON and 51 | JavaScript files, but include text files that have just been parsed into a 52 | JavaScript string: 53 | 54 | ```javascript 55 | var my_text = require('../path/to/my/text/file.txt'); 56 | 57 | console.log(my_text); 58 | ``` 59 | 60 | 61 | #### Gulp and Browserify #### 62 | 63 | To incorporate stringify into a `gulp` build process using `browserify`, 64 | register `stringify` as a transform as follows: 65 | 66 | ```javascript 67 | var browserify = require('browserify'), 68 | source = require('vinyl-source-stream'), 69 | stringify = require('stringify'); 70 | 71 | gulp.task('js', function() { 72 | return browserify({ 'entries': ['src/main.js'], 'debug' : env !== 'dev' }) 73 | .transform(stringify, { 74 | appliesTo: { includeExtensions: ['.html'] }, 75 | minify: true 76 | }) 77 | .bundle() 78 | .pipe(source('main.js')) // gives streaming vinyl file object 79 | .pipe(gulp.dest(paths.build)); 80 | }); 81 | ``` 82 | 83 | ### NodeJS ### 84 | 85 | Allows you to "stringify" your non-JS files using the NodeJS module system. 86 | Please only use Stringify this way in NodeJS (Read: Not the browser/Browserify!) 87 | 88 | ```javascript 89 | var stringify = require('stringify'); 90 | 91 | stringify.registerWithRequire({ 92 | appliesTo: { includeExtensions: ['.txt', '.html'] }, 93 | minify: true, 94 | minifyAppliesTo: { 95 | includeExtensions: ['.html'] 96 | }, 97 | minifyOptions: { 98 | // html-minifier options 99 | } 100 | }); 101 | 102 | var myTextFile = require('./path/to/my/text/file.txt'); 103 | 104 | console.log(myTextFile); // prints the contents of file. 105 | ``` 106 | 107 | For NodeJS, the __appliesTo__ configuration option only supports the 108 | __includeExtensions__ option - see _Including / Excluding Files_ section for 109 | further details. 110 | 111 | ## Configuration ## 112 | 113 | ### Loading Configuration from package.json ### 114 | 115 | When package.json is found, configuration is loaded by finding a key in the package.json with the name __"stringify"__ as your transform. 116 | 117 | ```javascript 118 | { 119 | "name": "myProject", 120 | "version": "1.0.0", 121 | ... 122 | "stringify": { 123 | "appliesTo": { "includeExtensions": [".html"] }, 124 | "minify": true 125 | } 126 | } 127 | ``` 128 | 129 | Or alternatively you can set the __"stringify"__ key to be a .js or 130 | .json file: 131 | 132 | ```javascript 133 | { 134 | "name": "myProject", 135 | "version": "1.0.0", 136 | ... 137 | "stringify": "stringifyConfig.js" 138 | } 139 | ``` 140 | 141 | And then configuration will be loaded from that file: 142 | 143 | ```javascript 144 | module.exports = { 145 | "appliesTo": { "includeExtensions": [".html"] }, 146 | "minify": true 147 | }; 148 | ``` 149 | 150 | For more details about package.json configuration, see the Browserify Transform 151 | Tools 152 | [configuration documentation](https://github.com/benbria/browserify-transform-tools/wiki/Transform-Configuration#loading-configuration-from-packagejson). 153 | 154 | 155 | ### Including / Excluding Files ### 156 | 157 | The configuration option __appliesTo__ is used to configure which files should 158 | be included or excluded. The default included extensions are: 159 | 160 | ```javascript 161 | ['.html', '.htm', '.tmpl', '.tpl', '.hbs', '.text', '.txt'] 162 | ``` 163 | 164 | The __appliesTo__ should include exactly one of the following: 165 | 166 | | Option | Description | 167 | | ----------------------------- | ----------------------------- | 168 | | .includeExtensions | If this option is specified, then any file with an extension not in this list will skipped. | 169 | | .excludeExtensions | A list of extensions which will be skipped. | 170 | | .files | A list of paths, relative to the configuration file, of files which should be transformed. Only these files will be transformed. | 171 | | .regex | A regex or a list of regexes. If any regex matches the full path of the file, then the file will be processed, otherwise not. | 172 | 173 | For more details about the __appliesTo__ configuration property, see the 174 | Browserify Transform Tools 175 | [configuration documentation](https://github.com/benbria/browserify-transform-tools/wiki/Transform-Configuration#common-configuration). 176 | 177 | 178 | ### Minification ### 179 | 180 | By default, files will not get minified - setting __minify__ configuration 181 | option to true will enable this. 182 | 183 | The __minifyAppliesTo__ configuration option allows files to be included or 184 | excluded from the minifier in a similar way to __appliesTo__ (see _Including 185 | / Excluding Files_ section for more details). 186 | 187 | The default included file extensions are: 188 | 189 | ```javascript 190 | ['.html', '.htm', '.tmpl', '.tpl', '.hbs'] 191 | ``` 192 | The options set in the __minifyOptions__ configuration option are passed 193 | through to html-minifier (for more informations or to override those options, 194 | please go to [html-minifier github](https://github.com/kangax/html-minifier)). 195 | 196 | The default value of __minifyOptions__ is: 197 | 198 | ```javascript 199 | { 200 | removeComments: true, 201 | removeCommentsFromCDATA: true, 202 | removeCDATASectionsFromCDATA: true, 203 | collapseWhitespace: true, 204 | conservativeCollapse: false, 205 | preserveLineBreaks: false, 206 | collapseBooleanAttributes: false, 207 | removeAttributeQuotes: true, 208 | removeRedundantAttributes: false, 209 | useShortDoctype: false, 210 | removeEmptyAttributes: false, 211 | removeScriptTypeAttributes: false, 212 | removeStyleLinkTypeAttributes: false, 213 | removeOptionalTags: false, 214 | removeIgnored: false, 215 | removeEmptyElements: false, 216 | lint: false, 217 | keepClosingSlash: false, 218 | caseSensitive: false, 219 | minifyJS: false, 220 | minifyCSS: false, 221 | minifyURLs: false 222 | } 223 | ``` 224 | If you require an HTML file and you want to minify the requested string, you can 225 | configure Stringify to do it: 226 | 227 | ```javascript 228 | stringify({ 229 | appliesTo: { includeExtensions: ['.txt', '.html'] }, 230 | minify: true, 231 | minifyAppliesTo: { 232 | includeExtensions: ['.html'] 233 | }, 234 | minifyOptions: { 235 | // html-minifier options 236 | } 237 | }) 238 | ``` 239 | 240 | ## Realistic Example/Use-Case ## 241 | 242 | The reason I created this was to get string versions of my Handlebars templates 243 | required in to my client-side JavaScript. You can theoretically use this for any 244 | templating parser though. 245 | 246 | Here is how that is done: 247 | 248 | application.js: 249 | ```javascript 250 | var browserify = require('browserify'), 251 | stringify = require('stringify'); 252 | 253 | var bundle = browserify() 254 | .transform(stringify, { 255 | appliesTo: { includeExtensions: ['.hbs', '.handlebars'] } 256 | }) 257 | .addEntry('my_app_main.js'); 258 | 259 | app.use(bundle); 260 | ``` 261 | 262 | my_app_main.js: 263 | ```javascript 264 | var Handlebars = require('handlebars'), 265 | template = require('my/template/path.hbs'), 266 | data = { 267 | "json_data": "This is my string!" 268 | }; 269 | 270 | var hbs_template = Handlebars.compile(template); 271 | 272 | // Now I can use hbs_template like I would anywhere else, passing it data and getting constructed HTML back. 273 | var constructed_template = hbs_template(data); 274 | 275 | /* 276 | Now 'constructed_template' is ready to be appended to the DOM in the page! 277 | The result of it should be: 278 | 279 |

This is my string!

280 | */ 281 | ``` 282 | 283 | my/template/path.hbs: 284 | ```html 285 |

{{ json_data }}

286 | ``` 287 | 288 | 289 | ## Contributing ## 290 | 291 | If you would like to contribute code, please do the following: 292 | 293 | 1. Fork this repository and make your changes. 294 | 2. Write tests for any new functionality. If you are fixing a bug that tests did not cover, please make a test that reproduces the bug. 295 | 3. Add your name to the "contributors" section in the `package.json` file. 296 | 4. Squash all of your commits into a single commit via `git rebase -i`. 297 | 5. Run the tests by running `npm install && make test` from the source directory. 298 | 6. Assuming those pass, send the Pull Request off to me for review! 299 | 300 | Please do not iterate the package.json version number – I will do that myself 301 | when I publish it to NPM. 302 | 303 | ### Style-Guide ### 304 | 305 | Please follow this simple style-guide for all code contributions: 306 | 307 | * Indent using spaces. 308 | * camelCase all callables. 309 | * Use semi-colons. 310 | * Place a space after a conditional or function name, and its conditions/arguments. `function (...) {...}` 311 | 312 | [travis-url]: https://travis-ci.org/JohnPostlethwait/stringify 313 | [travis-image]: https://img.shields.io/travis/JohnPostlethwait/stringify.svg 314 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var gulp = require('gulp'), 3 | jshint = require('gulp-jshint'), 4 | mocha = require('gulp-mocha'), 5 | stylish = require('jshint-stylish'); 6 | 7 | gulp.task('lint', function () { 8 | return gulp.src([ 9 | './*.js', 10 | './src/**/*.js', 11 | './test/**/*.js' 12 | ]) 13 | .pipe(jshint()) 14 | .pipe(jshint.reporter(stylish)) 15 | .pipe(jshint.reporter('fail')); 16 | }); 17 | 18 | gulp.task('test', function () { 19 | process.env.NODE_ENV = true; 20 | 21 | return gulp.src('./src/**/*.js') 22 | .on('finish', function () { 23 | return gulp.src('./test/**/*.js', { 24 | read: false 25 | }) 26 | .pipe(mocha({ 27 | reporter: 'spec' 28 | })); 29 | }); 30 | }); 31 | 32 | gulp.task('default', ['lint', 'test']); 33 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | module.exports = require('./src/stringify'); 3 | -------------------------------------------------------------------------------- /makefile: -------------------------------------------------------------------------------- 1 | test: 2 | @NODE_ENV=test ./node_modules/.bin/gulp lint && ./node_modules/.bin/gulp test --coverage --browser 3 | 4 | .PHONY: test 5 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "stringify", 3 | "version": "5.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "acorn": { 8 | "version": "5.1.1", 9 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", 10 | "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==" 11 | }, 12 | "ansi-regex": { 13 | "version": "2.1.1", 14 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 15 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 16 | "dev": true 17 | }, 18 | "ansi-styles": { 19 | "version": "2.2.1", 20 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 21 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 22 | "dev": true 23 | }, 24 | "archy": { 25 | "version": "1.0.0", 26 | "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", 27 | "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", 28 | "dev": true 29 | }, 30 | "arr-diff": { 31 | "version": "2.0.0", 32 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", 33 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", 34 | "dev": true, 35 | "requires": { 36 | "arr-flatten": "1.1.0" 37 | } 38 | }, 39 | "arr-flatten": { 40 | "version": "1.1.0", 41 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 42 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 43 | "dev": true 44 | }, 45 | "array-differ": { 46 | "version": "1.0.0", 47 | "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", 48 | "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", 49 | "dev": true 50 | }, 51 | "array-each": { 52 | "version": "1.0.1", 53 | "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", 54 | "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", 55 | "dev": true 56 | }, 57 | "array-slice": { 58 | "version": "1.0.0", 59 | "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.0.0.tgz", 60 | "integrity": "sha1-5zA08A3MH0CHYAj9IP6ud71LfC8=", 61 | "dev": true 62 | }, 63 | "array-uniq": { 64 | "version": "1.0.3", 65 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 66 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 67 | "dev": true 68 | }, 69 | "array-unique": { 70 | "version": "0.2.1", 71 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", 72 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", 73 | "dev": true 74 | }, 75 | "balanced-match": { 76 | "version": "1.0.0", 77 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 78 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 79 | "dev": true 80 | }, 81 | "beeper": { 82 | "version": "1.1.1", 83 | "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", 84 | "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", 85 | "dev": true 86 | }, 87 | "brace-expansion": { 88 | "version": "1.1.8", 89 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 90 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 91 | "dev": true, 92 | "requires": { 93 | "balanced-match": "1.0.0", 94 | "concat-map": "0.0.1" 95 | } 96 | }, 97 | "braces": { 98 | "version": "1.8.5", 99 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", 100 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", 101 | "dev": true, 102 | "requires": { 103 | "expand-range": "1.8.2", 104 | "preserve": "0.2.0", 105 | "repeat-element": "1.1.2" 106 | } 107 | }, 108 | "browserify-transform-tools": { 109 | "version": "1.7.0", 110 | "resolved": "https://registry.npmjs.org/browserify-transform-tools/-/browserify-transform-tools-1.7.0.tgz", 111 | "integrity": "sha1-g+J3Ih9jJZvtLn6yooOpcKUB9MQ=", 112 | "requires": { 113 | "falafel": "2.1.0", 114 | "through": "2.3.8" 115 | } 116 | }, 117 | "camel-case": { 118 | "version": "3.0.0", 119 | "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", 120 | "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", 121 | "requires": { 122 | "no-case": "2.3.1", 123 | "upper-case": "1.1.3" 124 | } 125 | }, 126 | "chalk": { 127 | "version": "1.1.3", 128 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 129 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 130 | "dev": true, 131 | "requires": { 132 | "ansi-styles": "2.2.1", 133 | "escape-string-regexp": "1.0.5", 134 | "has-ansi": "2.0.0", 135 | "strip-ansi": "3.0.1", 136 | "supports-color": "2.0.0" 137 | } 138 | }, 139 | "clean-css": { 140 | "version": "4.1.7", 141 | "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.7.tgz", 142 | "integrity": "sha1-ua6k+FZ5iJzz6ui0A0nsTr390DI=", 143 | "requires": { 144 | "source-map": "0.5.6" 145 | } 146 | }, 147 | "cli": { 148 | "version": "0.6.6", 149 | "resolved": "https://registry.npmjs.org/cli/-/cli-0.6.6.tgz", 150 | "integrity": "sha1-Aq1Eo4Cr8nraxebwzdewQ9dMU+M=", 151 | "dev": true, 152 | "requires": { 153 | "exit": "0.1.2", 154 | "glob": "3.2.11" 155 | }, 156 | "dependencies": { 157 | "glob": { 158 | "version": "3.2.11", 159 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", 160 | "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", 161 | "dev": true, 162 | "requires": { 163 | "inherits": "2.0.3", 164 | "minimatch": "0.3.0" 165 | } 166 | }, 167 | "minimatch": { 168 | "version": "0.3.0", 169 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", 170 | "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", 171 | "dev": true, 172 | "requires": { 173 | "lru-cache": "2.7.3", 174 | "sigmund": "1.0.1" 175 | } 176 | } 177 | } 178 | }, 179 | "clone": { 180 | "version": "1.0.2", 181 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", 182 | "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", 183 | "dev": true 184 | }, 185 | "clone-stats": { 186 | "version": "0.0.1", 187 | "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", 188 | "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", 189 | "dev": true 190 | }, 191 | "commander": { 192 | "version": "2.9.0", 193 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", 194 | "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", 195 | "requires": { 196 | "graceful-readlink": "1.0.1" 197 | } 198 | }, 199 | "concat-map": { 200 | "version": "0.0.1", 201 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 202 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 203 | "dev": true 204 | }, 205 | "console-browserify": { 206 | "version": "1.1.0", 207 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", 208 | "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", 209 | "dev": true, 210 | "requires": { 211 | "date-now": "0.1.4" 212 | } 213 | }, 214 | "core-util-is": { 215 | "version": "1.0.2", 216 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 217 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 218 | "dev": true 219 | }, 220 | "date-now": { 221 | "version": "0.1.4", 222 | "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", 223 | "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", 224 | "dev": true 225 | }, 226 | "dateformat": { 227 | "version": "2.0.0", 228 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz", 229 | "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=", 230 | "dev": true 231 | }, 232 | "debug": { 233 | "version": "2.2.0", 234 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 235 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 236 | "dev": true, 237 | "requires": { 238 | "ms": "0.7.1" 239 | } 240 | }, 241 | "defaults": { 242 | "version": "1.0.3", 243 | "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", 244 | "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", 245 | "dev": true, 246 | "requires": { 247 | "clone": "1.0.2" 248 | } 249 | }, 250 | "deprecated": { 251 | "version": "0.0.1", 252 | "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", 253 | "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", 254 | "dev": true 255 | }, 256 | "detect-file": { 257 | "version": "0.1.0", 258 | "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", 259 | "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", 260 | "dev": true, 261 | "requires": { 262 | "fs-exists-sync": "0.1.0" 263 | } 264 | }, 265 | "diff": { 266 | "version": "1.4.0", 267 | "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", 268 | "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", 269 | "dev": true 270 | }, 271 | "dom-serializer": { 272 | "version": "0.1.0", 273 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", 274 | "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", 275 | "dev": true, 276 | "requires": { 277 | "domelementtype": "1.1.3", 278 | "entities": "1.1.1" 279 | }, 280 | "dependencies": { 281 | "domelementtype": { 282 | "version": "1.1.3", 283 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", 284 | "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", 285 | "dev": true 286 | }, 287 | "entities": { 288 | "version": "1.1.1", 289 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", 290 | "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", 291 | "dev": true 292 | } 293 | } 294 | }, 295 | "domelementtype": { 296 | "version": "1.3.0", 297 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", 298 | "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", 299 | "dev": true 300 | }, 301 | "domhandler": { 302 | "version": "2.3.0", 303 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", 304 | "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", 305 | "dev": true, 306 | "requires": { 307 | "domelementtype": "1.3.0" 308 | } 309 | }, 310 | "domutils": { 311 | "version": "1.5.1", 312 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", 313 | "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", 314 | "dev": true, 315 | "requires": { 316 | "dom-serializer": "0.1.0", 317 | "domelementtype": "1.3.0" 318 | } 319 | }, 320 | "duplexer2": { 321 | "version": "0.0.2", 322 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", 323 | "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", 324 | "dev": true, 325 | "requires": { 326 | "readable-stream": "1.1.14" 327 | }, 328 | "dependencies": { 329 | "isarray": { 330 | "version": "0.0.1", 331 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 332 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 333 | "dev": true 334 | }, 335 | "readable-stream": { 336 | "version": "1.1.14", 337 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 338 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 339 | "dev": true, 340 | "requires": { 341 | "core-util-is": "1.0.2", 342 | "inherits": "2.0.3", 343 | "isarray": "0.0.1", 344 | "string_decoder": "0.10.31" 345 | } 346 | } 347 | } 348 | }, 349 | "end-of-stream": { 350 | "version": "0.1.5", 351 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", 352 | "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", 353 | "dev": true, 354 | "requires": { 355 | "once": "1.3.3" 356 | } 357 | }, 358 | "entities": { 359 | "version": "1.0.0", 360 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", 361 | "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", 362 | "dev": true 363 | }, 364 | "escape-string-regexp": { 365 | "version": "1.0.5", 366 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 367 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 368 | "dev": true 369 | }, 370 | "exit": { 371 | "version": "0.1.2", 372 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 373 | "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", 374 | "dev": true 375 | }, 376 | "expand-brackets": { 377 | "version": "0.1.5", 378 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", 379 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", 380 | "dev": true, 381 | "requires": { 382 | "is-posix-bracket": "0.1.1" 383 | } 384 | }, 385 | "expand-range": { 386 | "version": "1.8.2", 387 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", 388 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", 389 | "dev": true, 390 | "requires": { 391 | "fill-range": "2.2.3" 392 | } 393 | }, 394 | "expand-tilde": { 395 | "version": "1.2.2", 396 | "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", 397 | "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", 398 | "dev": true, 399 | "requires": { 400 | "os-homedir": "1.0.2" 401 | } 402 | }, 403 | "extend": { 404 | "version": "3.0.1", 405 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 406 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", 407 | "dev": true 408 | }, 409 | "extglob": { 410 | "version": "0.3.2", 411 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", 412 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", 413 | "dev": true, 414 | "requires": { 415 | "is-extglob": "1.0.0" 416 | } 417 | }, 418 | "falafel": { 419 | "version": "2.1.0", 420 | "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", 421 | "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", 422 | "requires": { 423 | "acorn": "5.1.1", 424 | "foreach": "2.0.5", 425 | "isarray": "0.0.1", 426 | "object-keys": "1.0.11" 427 | }, 428 | "dependencies": { 429 | "isarray": { 430 | "version": "0.0.1", 431 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 432 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 433 | } 434 | } 435 | }, 436 | "fancy-log": { 437 | "version": "1.3.0", 438 | "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", 439 | "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", 440 | "dev": true, 441 | "requires": { 442 | "chalk": "1.1.3", 443 | "time-stamp": "1.1.0" 444 | } 445 | }, 446 | "filename-regex": { 447 | "version": "2.0.1", 448 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", 449 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", 450 | "dev": true 451 | }, 452 | "fill-range": { 453 | "version": "2.2.3", 454 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", 455 | "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", 456 | "dev": true, 457 | "requires": { 458 | "is-number": "2.1.0", 459 | "isobject": "2.1.0", 460 | "randomatic": "1.1.7", 461 | "repeat-element": "1.1.2", 462 | "repeat-string": "1.6.1" 463 | } 464 | }, 465 | "find-index": { 466 | "version": "0.1.1", 467 | "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", 468 | "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", 469 | "dev": true 470 | }, 471 | "findup-sync": { 472 | "version": "0.4.3", 473 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", 474 | "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", 475 | "dev": true, 476 | "requires": { 477 | "detect-file": "0.1.0", 478 | "is-glob": "2.0.1", 479 | "micromatch": "2.3.11", 480 | "resolve-dir": "0.1.1" 481 | } 482 | }, 483 | "fined": { 484 | "version": "1.1.0", 485 | "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", 486 | "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", 487 | "dev": true, 488 | "requires": { 489 | "expand-tilde": "2.0.2", 490 | "is-plain-object": "2.0.4", 491 | "object.defaults": "1.1.0", 492 | "object.pick": "1.2.0", 493 | "parse-filepath": "1.0.1" 494 | }, 495 | "dependencies": { 496 | "expand-tilde": { 497 | "version": "2.0.2", 498 | "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", 499 | "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", 500 | "dev": true, 501 | "requires": { 502 | "homedir-polyfill": "1.0.1" 503 | } 504 | } 505 | } 506 | }, 507 | "first-chunk-stream": { 508 | "version": "1.0.0", 509 | "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", 510 | "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", 511 | "dev": true 512 | }, 513 | "flagged-respawn": { 514 | "version": "0.3.2", 515 | "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", 516 | "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=", 517 | "dev": true 518 | }, 519 | "for-in": { 520 | "version": "1.0.2", 521 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 522 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 523 | "dev": true 524 | }, 525 | "for-own": { 526 | "version": "0.1.5", 527 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 528 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", 529 | "dev": true, 530 | "requires": { 531 | "for-in": "1.0.2" 532 | } 533 | }, 534 | "foreach": { 535 | "version": "2.0.5", 536 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", 537 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" 538 | }, 539 | "fs-exists-sync": { 540 | "version": "0.1.0", 541 | "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", 542 | "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", 543 | "dev": true 544 | }, 545 | "gaze": { 546 | "version": "0.5.2", 547 | "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", 548 | "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", 549 | "dev": true, 550 | "requires": { 551 | "globule": "0.1.0" 552 | } 553 | }, 554 | "glob": { 555 | "version": "4.5.3", 556 | "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", 557 | "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", 558 | "dev": true, 559 | "requires": { 560 | "inflight": "1.0.6", 561 | "inherits": "2.0.3", 562 | "minimatch": "2.0.10", 563 | "once": "1.3.3" 564 | } 565 | }, 566 | "glob-base": { 567 | "version": "0.3.0", 568 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", 569 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", 570 | "dev": true, 571 | "requires": { 572 | "glob-parent": "2.0.0", 573 | "is-glob": "2.0.1" 574 | } 575 | }, 576 | "glob-parent": { 577 | "version": "2.0.0", 578 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", 579 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", 580 | "dev": true, 581 | "requires": { 582 | "is-glob": "2.0.1" 583 | } 584 | }, 585 | "glob-stream": { 586 | "version": "3.1.18", 587 | "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", 588 | "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", 589 | "dev": true, 590 | "requires": { 591 | "glob": "4.5.3", 592 | "glob2base": "0.0.12", 593 | "minimatch": "2.0.10", 594 | "ordered-read-streams": "0.1.0", 595 | "through2": "0.6.5", 596 | "unique-stream": "1.0.0" 597 | }, 598 | "dependencies": { 599 | "isarray": { 600 | "version": "0.0.1", 601 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 602 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 603 | "dev": true 604 | }, 605 | "readable-stream": { 606 | "version": "1.0.34", 607 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 608 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 609 | "dev": true, 610 | "requires": { 611 | "core-util-is": "1.0.2", 612 | "inherits": "2.0.3", 613 | "isarray": "0.0.1", 614 | "string_decoder": "0.10.31" 615 | } 616 | }, 617 | "through2": { 618 | "version": "0.6.5", 619 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", 620 | "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", 621 | "dev": true, 622 | "requires": { 623 | "readable-stream": "1.0.34", 624 | "xtend": "4.0.1" 625 | } 626 | } 627 | } 628 | }, 629 | "glob-watcher": { 630 | "version": "0.0.6", 631 | "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", 632 | "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", 633 | "dev": true, 634 | "requires": { 635 | "gaze": "0.5.2" 636 | } 637 | }, 638 | "glob2base": { 639 | "version": "0.0.12", 640 | "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", 641 | "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", 642 | "dev": true, 643 | "requires": { 644 | "find-index": "0.1.1" 645 | } 646 | }, 647 | "global-modules": { 648 | "version": "0.2.3", 649 | "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", 650 | "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", 651 | "dev": true, 652 | "requires": { 653 | "global-prefix": "0.1.5", 654 | "is-windows": "0.2.0" 655 | } 656 | }, 657 | "global-prefix": { 658 | "version": "0.1.5", 659 | "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", 660 | "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", 661 | "dev": true, 662 | "requires": { 663 | "homedir-polyfill": "1.0.1", 664 | "ini": "1.3.4", 665 | "is-windows": "0.2.0", 666 | "which": "1.2.14" 667 | } 668 | }, 669 | "globule": { 670 | "version": "0.1.0", 671 | "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", 672 | "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", 673 | "dev": true, 674 | "requires": { 675 | "glob": "3.1.21", 676 | "lodash": "1.0.2", 677 | "minimatch": "0.2.14" 678 | }, 679 | "dependencies": { 680 | "glob": { 681 | "version": "3.1.21", 682 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", 683 | "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", 684 | "dev": true, 685 | "requires": { 686 | "graceful-fs": "1.2.3", 687 | "inherits": "1.0.2", 688 | "minimatch": "0.2.14" 689 | } 690 | }, 691 | "graceful-fs": { 692 | "version": "1.2.3", 693 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", 694 | "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", 695 | "dev": true 696 | }, 697 | "inherits": { 698 | "version": "1.0.2", 699 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", 700 | "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", 701 | "dev": true 702 | }, 703 | "minimatch": { 704 | "version": "0.2.14", 705 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", 706 | "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", 707 | "dev": true, 708 | "requires": { 709 | "lru-cache": "2.7.3", 710 | "sigmund": "1.0.1" 711 | } 712 | } 713 | } 714 | }, 715 | "glogg": { 716 | "version": "1.0.0", 717 | "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", 718 | "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", 719 | "dev": true, 720 | "requires": { 721 | "sparkles": "1.0.0" 722 | } 723 | }, 724 | "graceful-fs": { 725 | "version": "3.0.11", 726 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", 727 | "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", 728 | "dev": true, 729 | "requires": { 730 | "natives": "1.1.0" 731 | } 732 | }, 733 | "graceful-readlink": { 734 | "version": "1.0.1", 735 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 736 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" 737 | }, 738 | "growl": { 739 | "version": "1.8.1", 740 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.8.1.tgz", 741 | "integrity": "sha1-Sy3sjZB+k9szZiTc7AGDUC+MlCg=", 742 | "dev": true 743 | }, 744 | "gulp": { 745 | "version": "3.9.0", 746 | "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.0.tgz", 747 | "integrity": "sha1-zx+6TLVYu4xq5slhP1g64mINIUo=", 748 | "dev": true, 749 | "requires": { 750 | "archy": "1.0.0", 751 | "chalk": "1.1.3", 752 | "deprecated": "0.0.1", 753 | "gulp-util": "3.0.8", 754 | "interpret": "0.6.6", 755 | "liftoff": "2.3.0", 756 | "minimist": "1.2.0", 757 | "orchestrator": "0.3.8", 758 | "pretty-hrtime": "1.0.3", 759 | "semver": "4.3.6", 760 | "tildify": "1.2.0", 761 | "v8flags": "2.1.1", 762 | "vinyl-fs": "0.3.14" 763 | } 764 | }, 765 | "gulp-jshint": { 766 | "version": "2.0.0", 767 | "resolved": "https://registry.npmjs.org/gulp-jshint/-/gulp-jshint-2.0.0.tgz", 768 | "integrity": "sha1-id21Czgsw+xPEvgXUlfgmUEILeM=", 769 | "dev": true, 770 | "requires": { 771 | "gulp-util": "3.0.8", 772 | "lodash": "3.10.1", 773 | "minimatch": "2.0.10", 774 | "rcloader": "0.1.2", 775 | "through2": "0.6.5" 776 | }, 777 | "dependencies": { 778 | "isarray": { 779 | "version": "0.0.1", 780 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 781 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 782 | "dev": true 783 | }, 784 | "lodash": { 785 | "version": "3.10.1", 786 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", 787 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", 788 | "dev": true 789 | }, 790 | "readable-stream": { 791 | "version": "1.0.34", 792 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 793 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 794 | "dev": true, 795 | "requires": { 796 | "core-util-is": "1.0.2", 797 | "inherits": "2.0.3", 798 | "isarray": "0.0.1", 799 | "string_decoder": "0.10.31" 800 | } 801 | }, 802 | "through2": { 803 | "version": "0.6.5", 804 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", 805 | "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", 806 | "dev": true, 807 | "requires": { 808 | "readable-stream": "1.0.34", 809 | "xtend": "4.0.1" 810 | } 811 | } 812 | } 813 | }, 814 | "gulp-mocha": { 815 | "version": "2.2.0", 816 | "resolved": "https://registry.npmjs.org/gulp-mocha/-/gulp-mocha-2.2.0.tgz", 817 | "integrity": "sha1-HOXrpLlLQMdDav7DxJgsjuqJQZI=", 818 | "dev": true, 819 | "requires": { 820 | "gulp-util": "3.0.8", 821 | "mocha": "2.4.5", 822 | "plur": "2.1.2", 823 | "resolve-from": "1.0.1", 824 | "temp": "0.8.3", 825 | "through": "2.3.8" 826 | } 827 | }, 828 | "gulp-util": { 829 | "version": "3.0.8", 830 | "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", 831 | "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", 832 | "dev": true, 833 | "requires": { 834 | "array-differ": "1.0.0", 835 | "array-uniq": "1.0.3", 836 | "beeper": "1.1.1", 837 | "chalk": "1.1.3", 838 | "dateformat": "2.0.0", 839 | "fancy-log": "1.3.0", 840 | "gulplog": "1.0.0", 841 | "has-gulplog": "0.1.0", 842 | "lodash._reescape": "3.0.0", 843 | "lodash._reevaluate": "3.0.0", 844 | "lodash._reinterpolate": "3.0.0", 845 | "lodash.template": "3.6.2", 846 | "minimist": "1.2.0", 847 | "multipipe": "0.1.2", 848 | "object-assign": "3.0.0", 849 | "replace-ext": "0.0.1", 850 | "through2": "2.0.3", 851 | "vinyl": "0.5.3" 852 | } 853 | }, 854 | "gulplog": { 855 | "version": "1.0.0", 856 | "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", 857 | "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", 858 | "dev": true, 859 | "requires": { 860 | "glogg": "1.0.0" 861 | } 862 | }, 863 | "has-ansi": { 864 | "version": "2.0.0", 865 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 866 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 867 | "dev": true, 868 | "requires": { 869 | "ansi-regex": "2.1.1" 870 | } 871 | }, 872 | "has-gulplog": { 873 | "version": "0.1.0", 874 | "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", 875 | "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", 876 | "dev": true, 877 | "requires": { 878 | "sparkles": "1.0.0" 879 | } 880 | }, 881 | "he": { 882 | "version": "1.1.1", 883 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 884 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" 885 | }, 886 | "homedir-polyfill": { 887 | "version": "1.0.1", 888 | "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", 889 | "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", 890 | "dev": true, 891 | "requires": { 892 | "parse-passwd": "1.0.0" 893 | } 894 | }, 895 | "html-minifier": { 896 | "version": "3.5.2", 897 | "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.2.tgz", 898 | "integrity": "sha1-1zvD/0SJQkCIGM5gm/P7DqfvTrc=", 899 | "requires": { 900 | "camel-case": "3.0.0", 901 | "clean-css": "4.1.7", 902 | "commander": "2.9.0", 903 | "he": "1.1.1", 904 | "ncname": "1.0.0", 905 | "param-case": "2.1.1", 906 | "relateurl": "0.2.7", 907 | "uglify-js": "3.0.25" 908 | } 909 | }, 910 | "htmlparser2": { 911 | "version": "3.8.3", 912 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", 913 | "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", 914 | "dev": true, 915 | "requires": { 916 | "domelementtype": "1.3.0", 917 | "domhandler": "2.3.0", 918 | "domutils": "1.5.1", 919 | "entities": "1.0.0", 920 | "readable-stream": "1.1.14" 921 | }, 922 | "dependencies": { 923 | "isarray": { 924 | "version": "0.0.1", 925 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 926 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 927 | "dev": true 928 | }, 929 | "readable-stream": { 930 | "version": "1.1.14", 931 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 932 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 933 | "dev": true, 934 | "requires": { 935 | "core-util-is": "1.0.2", 936 | "inherits": "2.0.3", 937 | "isarray": "0.0.1", 938 | "string_decoder": "0.10.31" 939 | } 940 | } 941 | } 942 | }, 943 | "inflight": { 944 | "version": "1.0.6", 945 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 946 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 947 | "dev": true, 948 | "requires": { 949 | "once": "1.3.3", 950 | "wrappy": "1.0.2" 951 | } 952 | }, 953 | "inherits": { 954 | "version": "2.0.3", 955 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 956 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 957 | "dev": true 958 | }, 959 | "ini": { 960 | "version": "1.3.4", 961 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", 962 | "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", 963 | "dev": true 964 | }, 965 | "interpret": { 966 | "version": "0.6.6", 967 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", 968 | "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls=", 969 | "dev": true 970 | }, 971 | "irregular-plurals": { 972 | "version": "1.3.0", 973 | "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.3.0.tgz", 974 | "integrity": "sha512-njf5A+Mxb3kojuHd1DzISjjIl+XhyzovXEOyPPSzdQozq/Lf2tN27mOrAAsxEPZxpn6I4MGzs1oo9TxXxPFpaA==", 975 | "dev": true 976 | }, 977 | "is-absolute": { 978 | "version": "0.2.6", 979 | "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", 980 | "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", 981 | "dev": true, 982 | "requires": { 983 | "is-relative": "0.2.1", 984 | "is-windows": "0.2.0" 985 | } 986 | }, 987 | "is-buffer": { 988 | "version": "1.1.5", 989 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", 990 | "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", 991 | "dev": true 992 | }, 993 | "is-dotfile": { 994 | "version": "1.0.3", 995 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", 996 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", 997 | "dev": true 998 | }, 999 | "is-equal-shallow": { 1000 | "version": "0.1.3", 1001 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 1002 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", 1003 | "dev": true, 1004 | "requires": { 1005 | "is-primitive": "2.0.0" 1006 | } 1007 | }, 1008 | "is-extendable": { 1009 | "version": "0.1.1", 1010 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1011 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 1012 | "dev": true 1013 | }, 1014 | "is-extglob": { 1015 | "version": "1.0.0", 1016 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 1017 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 1018 | "dev": true 1019 | }, 1020 | "is-glob": { 1021 | "version": "2.0.1", 1022 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 1023 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 1024 | "dev": true, 1025 | "requires": { 1026 | "is-extglob": "1.0.0" 1027 | } 1028 | }, 1029 | "is-number": { 1030 | "version": "2.1.0", 1031 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 1032 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", 1033 | "dev": true, 1034 | "requires": { 1035 | "kind-of": "3.2.2" 1036 | } 1037 | }, 1038 | "is-plain-object": { 1039 | "version": "2.0.4", 1040 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 1041 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 1042 | "dev": true, 1043 | "requires": { 1044 | "isobject": "3.0.1" 1045 | }, 1046 | "dependencies": { 1047 | "isobject": { 1048 | "version": "3.0.1", 1049 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1050 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", 1051 | "dev": true 1052 | } 1053 | } 1054 | }, 1055 | "is-posix-bracket": { 1056 | "version": "0.1.1", 1057 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", 1058 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", 1059 | "dev": true 1060 | }, 1061 | "is-primitive": { 1062 | "version": "2.0.0", 1063 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 1064 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", 1065 | "dev": true 1066 | }, 1067 | "is-relative": { 1068 | "version": "0.2.1", 1069 | "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", 1070 | "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", 1071 | "dev": true, 1072 | "requires": { 1073 | "is-unc-path": "0.1.2" 1074 | } 1075 | }, 1076 | "is-unc-path": { 1077 | "version": "0.1.2", 1078 | "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", 1079 | "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", 1080 | "dev": true, 1081 | "requires": { 1082 | "unc-path-regex": "0.1.2" 1083 | } 1084 | }, 1085 | "is-utf8": { 1086 | "version": "0.2.1", 1087 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 1088 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", 1089 | "dev": true 1090 | }, 1091 | "is-windows": { 1092 | "version": "0.2.0", 1093 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", 1094 | "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", 1095 | "dev": true 1096 | }, 1097 | "isarray": { 1098 | "version": "1.0.0", 1099 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1100 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1101 | "dev": true 1102 | }, 1103 | "isexe": { 1104 | "version": "2.0.0", 1105 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1106 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1107 | "dev": true 1108 | }, 1109 | "isobject": { 1110 | "version": "2.1.0", 1111 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 1112 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 1113 | "dev": true, 1114 | "requires": { 1115 | "isarray": "1.0.0" 1116 | } 1117 | }, 1118 | "jade": { 1119 | "version": "0.26.3", 1120 | "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", 1121 | "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", 1122 | "dev": true, 1123 | "requires": { 1124 | "commander": "0.6.1", 1125 | "mkdirp": "0.3.0" 1126 | }, 1127 | "dependencies": { 1128 | "commander": { 1129 | "version": "0.6.1", 1130 | "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", 1131 | "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", 1132 | "dev": true 1133 | }, 1134 | "mkdirp": { 1135 | "version": "0.3.0", 1136 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", 1137 | "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", 1138 | "dev": true 1139 | } 1140 | } 1141 | }, 1142 | "jshint": { 1143 | "version": "2.9.1", 1144 | "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.1.tgz", 1145 | "integrity": "sha1-MTa2j4tvo3QjqsuOxeGKGtp6Jjg=", 1146 | "dev": true, 1147 | "requires": { 1148 | "cli": "0.6.6", 1149 | "console-browserify": "1.1.0", 1150 | "exit": "0.1.2", 1151 | "htmlparser2": "3.8.3", 1152 | "lodash": "3.7.0", 1153 | "minimatch": "2.0.10", 1154 | "shelljs": "0.3.0", 1155 | "strip-json-comments": "1.0.4" 1156 | }, 1157 | "dependencies": { 1158 | "lodash": { 1159 | "version": "3.7.0", 1160 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", 1161 | "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=", 1162 | "dev": true 1163 | } 1164 | } 1165 | }, 1166 | "jshint-stylish": { 1167 | "version": "2.1.0", 1168 | "resolved": "https://registry.npmjs.org/jshint-stylish/-/jshint-stylish-2.1.0.tgz", 1169 | "integrity": "sha1-OqLyoUsJr6QJnDruzXD8W7q6emg=", 1170 | "dev": true, 1171 | "requires": { 1172 | "chalk": "1.1.3", 1173 | "log-symbols": "1.0.2", 1174 | "plur": "2.1.2", 1175 | "string-length": "1.0.1", 1176 | "text-table": "0.2.0" 1177 | } 1178 | }, 1179 | "kind-of": { 1180 | "version": "3.2.2", 1181 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1182 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1183 | "dev": true, 1184 | "requires": { 1185 | "is-buffer": "1.1.5" 1186 | } 1187 | }, 1188 | "liftoff": { 1189 | "version": "2.3.0", 1190 | "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz", 1191 | "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", 1192 | "dev": true, 1193 | "requires": { 1194 | "extend": "3.0.1", 1195 | "findup-sync": "0.4.3", 1196 | "fined": "1.1.0", 1197 | "flagged-respawn": "0.3.2", 1198 | "lodash.isplainobject": "4.0.6", 1199 | "lodash.isstring": "4.0.1", 1200 | "lodash.mapvalues": "4.6.0", 1201 | "rechoir": "0.6.2", 1202 | "resolve": "1.3.3" 1203 | } 1204 | }, 1205 | "lodash": { 1206 | "version": "1.0.2", 1207 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", 1208 | "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", 1209 | "dev": true 1210 | }, 1211 | "lodash._basecopy": { 1212 | "version": "3.0.1", 1213 | "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", 1214 | "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", 1215 | "dev": true 1216 | }, 1217 | "lodash._basetostring": { 1218 | "version": "3.0.1", 1219 | "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", 1220 | "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", 1221 | "dev": true 1222 | }, 1223 | "lodash._basevalues": { 1224 | "version": "3.0.0", 1225 | "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", 1226 | "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", 1227 | "dev": true 1228 | }, 1229 | "lodash._getnative": { 1230 | "version": "3.9.1", 1231 | "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", 1232 | "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", 1233 | "dev": true 1234 | }, 1235 | "lodash._isiterateecall": { 1236 | "version": "3.0.9", 1237 | "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", 1238 | "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", 1239 | "dev": true 1240 | }, 1241 | "lodash._reescape": { 1242 | "version": "3.0.0", 1243 | "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", 1244 | "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", 1245 | "dev": true 1246 | }, 1247 | "lodash._reevaluate": { 1248 | "version": "3.0.0", 1249 | "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", 1250 | "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", 1251 | "dev": true 1252 | }, 1253 | "lodash._reinterpolate": { 1254 | "version": "3.0.0", 1255 | "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", 1256 | "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", 1257 | "dev": true 1258 | }, 1259 | "lodash._root": { 1260 | "version": "3.0.1", 1261 | "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", 1262 | "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", 1263 | "dev": true 1264 | }, 1265 | "lodash.clonedeep": { 1266 | "version": "4.5.0", 1267 | "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", 1268 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", 1269 | "dev": true 1270 | }, 1271 | "lodash.escape": { 1272 | "version": "3.2.0", 1273 | "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", 1274 | "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", 1275 | "dev": true, 1276 | "requires": { 1277 | "lodash._root": "3.0.1" 1278 | } 1279 | }, 1280 | "lodash.isarguments": { 1281 | "version": "3.1.0", 1282 | "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", 1283 | "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", 1284 | "dev": true 1285 | }, 1286 | "lodash.isarray": { 1287 | "version": "3.0.4", 1288 | "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", 1289 | "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", 1290 | "dev": true 1291 | }, 1292 | "lodash.isplainobject": { 1293 | "version": "4.0.6", 1294 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1295 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", 1296 | "dev": true 1297 | }, 1298 | "lodash.isstring": { 1299 | "version": "4.0.1", 1300 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 1301 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", 1302 | "dev": true 1303 | }, 1304 | "lodash.keys": { 1305 | "version": "3.1.2", 1306 | "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", 1307 | "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", 1308 | "dev": true, 1309 | "requires": { 1310 | "lodash._getnative": "3.9.1", 1311 | "lodash.isarguments": "3.1.0", 1312 | "lodash.isarray": "3.0.4" 1313 | } 1314 | }, 1315 | "lodash.mapvalues": { 1316 | "version": "4.6.0", 1317 | "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", 1318 | "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", 1319 | "dev": true 1320 | }, 1321 | "lodash.restparam": { 1322 | "version": "3.6.1", 1323 | "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", 1324 | "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", 1325 | "dev": true 1326 | }, 1327 | "lodash.template": { 1328 | "version": "3.6.2", 1329 | "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", 1330 | "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", 1331 | "dev": true, 1332 | "requires": { 1333 | "lodash._basecopy": "3.0.1", 1334 | "lodash._basetostring": "3.0.1", 1335 | "lodash._basevalues": "3.0.0", 1336 | "lodash._isiterateecall": "3.0.9", 1337 | "lodash._reinterpolate": "3.0.0", 1338 | "lodash.escape": "3.2.0", 1339 | "lodash.keys": "3.1.2", 1340 | "lodash.restparam": "3.6.1", 1341 | "lodash.templatesettings": "3.1.1" 1342 | } 1343 | }, 1344 | "lodash.templatesettings": { 1345 | "version": "3.1.1", 1346 | "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", 1347 | "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", 1348 | "dev": true, 1349 | "requires": { 1350 | "lodash._reinterpolate": "3.0.0", 1351 | "lodash.escape": "3.2.0" 1352 | } 1353 | }, 1354 | "log-symbols": { 1355 | "version": "1.0.2", 1356 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", 1357 | "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", 1358 | "dev": true, 1359 | "requires": { 1360 | "chalk": "1.1.3" 1361 | } 1362 | }, 1363 | "lower-case": { 1364 | "version": "1.1.4", 1365 | "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", 1366 | "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" 1367 | }, 1368 | "lru-cache": { 1369 | "version": "2.7.3", 1370 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", 1371 | "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", 1372 | "dev": true 1373 | }, 1374 | "map-cache": { 1375 | "version": "0.2.2", 1376 | "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", 1377 | "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", 1378 | "dev": true 1379 | }, 1380 | "micromatch": { 1381 | "version": "2.3.11", 1382 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", 1383 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", 1384 | "dev": true, 1385 | "requires": { 1386 | "arr-diff": "2.0.0", 1387 | "array-unique": "0.2.1", 1388 | "braces": "1.8.5", 1389 | "expand-brackets": "0.1.5", 1390 | "extglob": "0.3.2", 1391 | "filename-regex": "2.0.1", 1392 | "is-extglob": "1.0.0", 1393 | "is-glob": "2.0.1", 1394 | "kind-of": "3.2.2", 1395 | "normalize-path": "2.1.1", 1396 | "object.omit": "2.0.1", 1397 | "parse-glob": "3.0.4", 1398 | "regex-cache": "0.4.3" 1399 | } 1400 | }, 1401 | "minimatch": { 1402 | "version": "2.0.10", 1403 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", 1404 | "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", 1405 | "dev": true, 1406 | "requires": { 1407 | "brace-expansion": "1.1.8" 1408 | } 1409 | }, 1410 | "minimist": { 1411 | "version": "1.2.0", 1412 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1413 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 1414 | "dev": true 1415 | }, 1416 | "mkdirp": { 1417 | "version": "0.5.1", 1418 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1419 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1420 | "dev": true, 1421 | "requires": { 1422 | "minimist": "0.0.8" 1423 | }, 1424 | "dependencies": { 1425 | "minimist": { 1426 | "version": "0.0.8", 1427 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1428 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1429 | "dev": true 1430 | } 1431 | } 1432 | }, 1433 | "mocha": { 1434 | "version": "2.4.5", 1435 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.4.5.tgz", 1436 | "integrity": "sha1-FRdo3Sh161G8gpXpgAAm6fK7OY8=", 1437 | "dev": true, 1438 | "requires": { 1439 | "commander": "2.3.0", 1440 | "debug": "2.2.0", 1441 | "diff": "1.4.0", 1442 | "escape-string-regexp": "1.0.2", 1443 | "glob": "3.2.3", 1444 | "growl": "1.8.1", 1445 | "jade": "0.26.3", 1446 | "mkdirp": "0.5.1", 1447 | "supports-color": "1.2.0" 1448 | }, 1449 | "dependencies": { 1450 | "commander": { 1451 | "version": "2.3.0", 1452 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", 1453 | "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", 1454 | "dev": true 1455 | }, 1456 | "escape-string-regexp": { 1457 | "version": "1.0.2", 1458 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", 1459 | "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", 1460 | "dev": true 1461 | }, 1462 | "glob": { 1463 | "version": "3.2.3", 1464 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", 1465 | "integrity": "sha1-4xPusknHr/qlxHUoaw4RW1mDlGc=", 1466 | "dev": true, 1467 | "requires": { 1468 | "graceful-fs": "2.0.3", 1469 | "inherits": "2.0.3", 1470 | "minimatch": "0.2.14" 1471 | } 1472 | }, 1473 | "graceful-fs": { 1474 | "version": "2.0.3", 1475 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", 1476 | "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=", 1477 | "dev": true 1478 | }, 1479 | "minimatch": { 1480 | "version": "0.2.14", 1481 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", 1482 | "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", 1483 | "dev": true, 1484 | "requires": { 1485 | "lru-cache": "2.7.3", 1486 | "sigmund": "1.0.1" 1487 | } 1488 | }, 1489 | "supports-color": { 1490 | "version": "1.2.0", 1491 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", 1492 | "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", 1493 | "dev": true 1494 | } 1495 | } 1496 | }, 1497 | "ms": { 1498 | "version": "0.7.1", 1499 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 1500 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", 1501 | "dev": true 1502 | }, 1503 | "multipipe": { 1504 | "version": "0.1.2", 1505 | "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", 1506 | "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", 1507 | "dev": true, 1508 | "requires": { 1509 | "duplexer2": "0.0.2" 1510 | } 1511 | }, 1512 | "natives": { 1513 | "version": "1.1.0", 1514 | "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", 1515 | "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=", 1516 | "dev": true 1517 | }, 1518 | "ncname": { 1519 | "version": "1.0.0", 1520 | "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", 1521 | "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", 1522 | "requires": { 1523 | "xml-char-classes": "1.0.0" 1524 | } 1525 | }, 1526 | "no-case": { 1527 | "version": "2.3.1", 1528 | "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.1.tgz", 1529 | "integrity": "sha1-euuhxzpSGEJlVUt9wDuvcg34AIE=", 1530 | "requires": { 1531 | "lower-case": "1.1.4" 1532 | } 1533 | }, 1534 | "normalize-path": { 1535 | "version": "2.1.1", 1536 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 1537 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 1538 | "dev": true, 1539 | "requires": { 1540 | "remove-trailing-separator": "1.0.2" 1541 | } 1542 | }, 1543 | "object-assign": { 1544 | "version": "3.0.0", 1545 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", 1546 | "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", 1547 | "dev": true 1548 | }, 1549 | "object-keys": { 1550 | "version": "1.0.11", 1551 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", 1552 | "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" 1553 | }, 1554 | "object.defaults": { 1555 | "version": "1.1.0", 1556 | "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", 1557 | "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", 1558 | "dev": true, 1559 | "requires": { 1560 | "array-each": "1.0.1", 1561 | "array-slice": "1.0.0", 1562 | "for-own": "1.0.0", 1563 | "isobject": "3.0.1" 1564 | }, 1565 | "dependencies": { 1566 | "for-own": { 1567 | "version": "1.0.0", 1568 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", 1569 | "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", 1570 | "dev": true, 1571 | "requires": { 1572 | "for-in": "1.0.2" 1573 | } 1574 | }, 1575 | "isobject": { 1576 | "version": "3.0.1", 1577 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1578 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", 1579 | "dev": true 1580 | } 1581 | } 1582 | }, 1583 | "object.omit": { 1584 | "version": "2.0.1", 1585 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", 1586 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", 1587 | "dev": true, 1588 | "requires": { 1589 | "for-own": "0.1.5", 1590 | "is-extendable": "0.1.1" 1591 | } 1592 | }, 1593 | "object.pick": { 1594 | "version": "1.2.0", 1595 | "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.2.0.tgz", 1596 | "integrity": "sha1-tTkr7peC2m2ft9avr1OXefEjTCs=", 1597 | "dev": true, 1598 | "requires": { 1599 | "isobject": "2.1.0" 1600 | } 1601 | }, 1602 | "once": { 1603 | "version": "1.3.3", 1604 | "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", 1605 | "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", 1606 | "dev": true, 1607 | "requires": { 1608 | "wrappy": "1.0.2" 1609 | } 1610 | }, 1611 | "orchestrator": { 1612 | "version": "0.3.8", 1613 | "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", 1614 | "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", 1615 | "dev": true, 1616 | "requires": { 1617 | "end-of-stream": "0.1.5", 1618 | "sequencify": "0.0.7", 1619 | "stream-consume": "0.1.0" 1620 | } 1621 | }, 1622 | "ordered-read-streams": { 1623 | "version": "0.1.0", 1624 | "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", 1625 | "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", 1626 | "dev": true 1627 | }, 1628 | "os-homedir": { 1629 | "version": "1.0.2", 1630 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1631 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 1632 | "dev": true 1633 | }, 1634 | "os-tmpdir": { 1635 | "version": "1.0.2", 1636 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1637 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1638 | "dev": true 1639 | }, 1640 | "param-case": { 1641 | "version": "2.1.1", 1642 | "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", 1643 | "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", 1644 | "requires": { 1645 | "no-case": "2.3.1" 1646 | } 1647 | }, 1648 | "parse-filepath": { 1649 | "version": "1.0.1", 1650 | "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", 1651 | "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", 1652 | "dev": true, 1653 | "requires": { 1654 | "is-absolute": "0.2.6", 1655 | "map-cache": "0.2.2", 1656 | "path-root": "0.1.1" 1657 | } 1658 | }, 1659 | "parse-glob": { 1660 | "version": "3.0.4", 1661 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", 1662 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", 1663 | "dev": true, 1664 | "requires": { 1665 | "glob-base": "0.3.0", 1666 | "is-dotfile": "1.0.3", 1667 | "is-extglob": "1.0.0", 1668 | "is-glob": "2.0.1" 1669 | } 1670 | }, 1671 | "parse-passwd": { 1672 | "version": "1.0.0", 1673 | "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", 1674 | "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", 1675 | "dev": true 1676 | }, 1677 | "path-parse": { 1678 | "version": "1.0.5", 1679 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 1680 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 1681 | "dev": true 1682 | }, 1683 | "path-root": { 1684 | "version": "0.1.1", 1685 | "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", 1686 | "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", 1687 | "dev": true, 1688 | "requires": { 1689 | "path-root-regex": "0.1.2" 1690 | } 1691 | }, 1692 | "path-root-regex": { 1693 | "version": "0.1.2", 1694 | "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", 1695 | "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", 1696 | "dev": true 1697 | }, 1698 | "plur": { 1699 | "version": "2.1.2", 1700 | "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", 1701 | "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", 1702 | "dev": true, 1703 | "requires": { 1704 | "irregular-plurals": "1.3.0" 1705 | } 1706 | }, 1707 | "preserve": { 1708 | "version": "0.2.0", 1709 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", 1710 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", 1711 | "dev": true 1712 | }, 1713 | "pretty-hrtime": { 1714 | "version": "1.0.3", 1715 | "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", 1716 | "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", 1717 | "dev": true 1718 | }, 1719 | "process-nextick-args": { 1720 | "version": "1.0.7", 1721 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1722 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 1723 | "dev": true 1724 | }, 1725 | "randomatic": { 1726 | "version": "1.1.7", 1727 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", 1728 | "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", 1729 | "dev": true, 1730 | "requires": { 1731 | "is-number": "3.0.0", 1732 | "kind-of": "4.0.0" 1733 | }, 1734 | "dependencies": { 1735 | "is-number": { 1736 | "version": "3.0.0", 1737 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 1738 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 1739 | "dev": true, 1740 | "requires": { 1741 | "kind-of": "3.2.2" 1742 | }, 1743 | "dependencies": { 1744 | "kind-of": { 1745 | "version": "3.2.2", 1746 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1747 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1748 | "dev": true, 1749 | "requires": { 1750 | "is-buffer": "1.1.5" 1751 | } 1752 | } 1753 | } 1754 | }, 1755 | "kind-of": { 1756 | "version": "4.0.0", 1757 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", 1758 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 1759 | "dev": true, 1760 | "requires": { 1761 | "is-buffer": "1.1.5" 1762 | } 1763 | } 1764 | } 1765 | }, 1766 | "rcfinder": { 1767 | "version": "0.1.9", 1768 | "resolved": "https://registry.npmjs.org/rcfinder/-/rcfinder-0.1.9.tgz", 1769 | "integrity": "sha1-8+gPOH3fmugK4wpBADKWQuroERU=", 1770 | "dev": true, 1771 | "requires": { 1772 | "lodash.clonedeep": "4.5.0" 1773 | } 1774 | }, 1775 | "rcloader": { 1776 | "version": "0.1.2", 1777 | "resolved": "https://registry.npmjs.org/rcloader/-/rcloader-0.1.2.tgz", 1778 | "integrity": "sha1-oJY6ZDfQnvjLktky0trUl7DRc2w=", 1779 | "dev": true, 1780 | "requires": { 1781 | "lodash": "2.4.2", 1782 | "rcfinder": "0.1.9" 1783 | }, 1784 | "dependencies": { 1785 | "lodash": { 1786 | "version": "2.4.2", 1787 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", 1788 | "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", 1789 | "dev": true 1790 | } 1791 | } 1792 | }, 1793 | "rechoir": { 1794 | "version": "0.6.2", 1795 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 1796 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 1797 | "dev": true, 1798 | "requires": { 1799 | "resolve": "1.3.3" 1800 | } 1801 | }, 1802 | "regex-cache": { 1803 | "version": "0.4.3", 1804 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", 1805 | "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", 1806 | "dev": true, 1807 | "requires": { 1808 | "is-equal-shallow": "0.1.3", 1809 | "is-primitive": "2.0.0" 1810 | } 1811 | }, 1812 | "relateurl": { 1813 | "version": "0.2.7", 1814 | "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", 1815 | "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" 1816 | }, 1817 | "remove-trailing-separator": { 1818 | "version": "1.0.2", 1819 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", 1820 | "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", 1821 | "dev": true 1822 | }, 1823 | "repeat-element": { 1824 | "version": "1.1.2", 1825 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", 1826 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", 1827 | "dev": true 1828 | }, 1829 | "repeat-string": { 1830 | "version": "1.6.1", 1831 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 1832 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 1833 | "dev": true 1834 | }, 1835 | "replace-ext": { 1836 | "version": "0.0.1", 1837 | "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", 1838 | "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", 1839 | "dev": true 1840 | }, 1841 | "resolve": { 1842 | "version": "1.3.3", 1843 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", 1844 | "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", 1845 | "dev": true, 1846 | "requires": { 1847 | "path-parse": "1.0.5" 1848 | } 1849 | }, 1850 | "resolve-dir": { 1851 | "version": "0.1.1", 1852 | "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", 1853 | "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", 1854 | "dev": true, 1855 | "requires": { 1856 | "expand-tilde": "1.2.2", 1857 | "global-modules": "0.2.3" 1858 | } 1859 | }, 1860 | "resolve-from": { 1861 | "version": "1.0.1", 1862 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 1863 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 1864 | "dev": true 1865 | }, 1866 | "rimraf": { 1867 | "version": "2.2.8", 1868 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", 1869 | "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", 1870 | "dev": true 1871 | }, 1872 | "safe-buffer": { 1873 | "version": "5.1.1", 1874 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 1875 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", 1876 | "dev": true 1877 | }, 1878 | "semver": { 1879 | "version": "4.3.6", 1880 | "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", 1881 | "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", 1882 | "dev": true 1883 | }, 1884 | "sequencify": { 1885 | "version": "0.0.7", 1886 | "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", 1887 | "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", 1888 | "dev": true 1889 | }, 1890 | "shelljs": { 1891 | "version": "0.3.0", 1892 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", 1893 | "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", 1894 | "dev": true 1895 | }, 1896 | "should": { 1897 | "version": "8.2.1", 1898 | "resolved": "https://registry.npmjs.org/should/-/should-8.2.1.tgz", 1899 | "integrity": "sha1-aW3q/mMbOSbgc/X2xumHjipVPKE=", 1900 | "dev": true, 1901 | "requires": { 1902 | "should-equal": "0.7.2", 1903 | "should-format": "0.3.2", 1904 | "should-type": "0.2.0" 1905 | } 1906 | }, 1907 | "should-equal": { 1908 | "version": "0.7.2", 1909 | "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-0.7.2.tgz", 1910 | "integrity": "sha1-pqlj2/UBuT7TS3gHrn1/BC/CTKg=", 1911 | "dev": true, 1912 | "requires": { 1913 | "should-type": "0.2.0" 1914 | } 1915 | }, 1916 | "should-format": { 1917 | "version": "0.3.2", 1918 | "resolved": "https://registry.npmjs.org/should-format/-/should-format-0.3.2.tgz", 1919 | "integrity": "sha1-pZgx4Bot3uFJkRvHFIvlyAMZ4f8=", 1920 | "dev": true, 1921 | "requires": { 1922 | "should-type": "0.2.0" 1923 | } 1924 | }, 1925 | "should-type": { 1926 | "version": "0.2.0", 1927 | "resolved": "https://registry.npmjs.org/should-type/-/should-type-0.2.0.tgz", 1928 | "integrity": "sha1-ZwfvlVKdmJ3MCY/gdTqx+RNrt/Y=", 1929 | "dev": true 1930 | }, 1931 | "sigmund": { 1932 | "version": "1.0.1", 1933 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", 1934 | "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", 1935 | "dev": true 1936 | }, 1937 | "source-map": { 1938 | "version": "0.5.6", 1939 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", 1940 | "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" 1941 | }, 1942 | "sparkles": { 1943 | "version": "1.0.0", 1944 | "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", 1945 | "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", 1946 | "dev": true 1947 | }, 1948 | "stream-consume": { 1949 | "version": "0.1.0", 1950 | "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", 1951 | "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=", 1952 | "dev": true 1953 | }, 1954 | "string_decoder": { 1955 | "version": "0.10.31", 1956 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1957 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 1958 | "dev": true 1959 | }, 1960 | "string-length": { 1961 | "version": "1.0.1", 1962 | "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", 1963 | "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", 1964 | "dev": true, 1965 | "requires": { 1966 | "strip-ansi": "3.0.1" 1967 | } 1968 | }, 1969 | "strip-ansi": { 1970 | "version": "3.0.1", 1971 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1972 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1973 | "dev": true, 1974 | "requires": { 1975 | "ansi-regex": "2.1.1" 1976 | } 1977 | }, 1978 | "strip-bom": { 1979 | "version": "1.0.0", 1980 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", 1981 | "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", 1982 | "dev": true, 1983 | "requires": { 1984 | "first-chunk-stream": "1.0.0", 1985 | "is-utf8": "0.2.1" 1986 | } 1987 | }, 1988 | "strip-json-comments": { 1989 | "version": "1.0.4", 1990 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", 1991 | "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", 1992 | "dev": true 1993 | }, 1994 | "supports-color": { 1995 | "version": "2.0.0", 1996 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1997 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1998 | "dev": true 1999 | }, 2000 | "temp": { 2001 | "version": "0.8.3", 2002 | "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", 2003 | "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", 2004 | "dev": true, 2005 | "requires": { 2006 | "os-tmpdir": "1.0.2", 2007 | "rimraf": "2.2.8" 2008 | } 2009 | }, 2010 | "text-table": { 2011 | "version": "0.2.0", 2012 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2013 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2014 | "dev": true 2015 | }, 2016 | "through": { 2017 | "version": "2.3.8", 2018 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2019 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 2020 | }, 2021 | "through2": { 2022 | "version": "2.0.3", 2023 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", 2024 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", 2025 | "dev": true, 2026 | "requires": { 2027 | "readable-stream": "2.3.3", 2028 | "xtend": "4.0.1" 2029 | }, 2030 | "dependencies": { 2031 | "readable-stream": { 2032 | "version": "2.3.3", 2033 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 2034 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 2035 | "dev": true, 2036 | "requires": { 2037 | "core-util-is": "1.0.2", 2038 | "inherits": "2.0.3", 2039 | "isarray": "1.0.0", 2040 | "process-nextick-args": "1.0.7", 2041 | "safe-buffer": "5.1.1", 2042 | "string_decoder": "1.0.3", 2043 | "util-deprecate": "1.0.2" 2044 | } 2045 | }, 2046 | "string_decoder": { 2047 | "version": "1.0.3", 2048 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 2049 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 2050 | "dev": true, 2051 | "requires": { 2052 | "safe-buffer": "5.1.1" 2053 | } 2054 | } 2055 | } 2056 | }, 2057 | "tildify": { 2058 | "version": "1.2.0", 2059 | "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", 2060 | "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", 2061 | "dev": true, 2062 | "requires": { 2063 | "os-homedir": "1.0.2" 2064 | } 2065 | }, 2066 | "time-stamp": { 2067 | "version": "1.1.0", 2068 | "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", 2069 | "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", 2070 | "dev": true 2071 | }, 2072 | "uglify-js": { 2073 | "version": "3.0.25", 2074 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.25.tgz", 2075 | "integrity": "sha512-JO1XE0WZ9m6UpDkN7WCyPNAWI6EN3K0g40ekcoJKejViYmryJ0BaLxXjvra1IsAeIlJfq72scTbhl0jknsT2GA==", 2076 | "requires": { 2077 | "commander": "2.9.0", 2078 | "source-map": "0.5.6" 2079 | } 2080 | }, 2081 | "unc-path-regex": { 2082 | "version": "0.1.2", 2083 | "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", 2084 | "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", 2085 | "dev": true 2086 | }, 2087 | "unique-stream": { 2088 | "version": "1.0.0", 2089 | "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", 2090 | "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", 2091 | "dev": true 2092 | }, 2093 | "upper-case": { 2094 | "version": "1.1.3", 2095 | "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", 2096 | "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" 2097 | }, 2098 | "user-home": { 2099 | "version": "1.1.1", 2100 | "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", 2101 | "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", 2102 | "dev": true 2103 | }, 2104 | "util-deprecate": { 2105 | "version": "1.0.2", 2106 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2107 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2108 | "dev": true 2109 | }, 2110 | "v8flags": { 2111 | "version": "2.1.1", 2112 | "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", 2113 | "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", 2114 | "dev": true, 2115 | "requires": { 2116 | "user-home": "1.1.1" 2117 | } 2118 | }, 2119 | "vinyl": { 2120 | "version": "0.5.3", 2121 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", 2122 | "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", 2123 | "dev": true, 2124 | "requires": { 2125 | "clone": "1.0.2", 2126 | "clone-stats": "0.0.1", 2127 | "replace-ext": "0.0.1" 2128 | } 2129 | }, 2130 | "vinyl-fs": { 2131 | "version": "0.3.14", 2132 | "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", 2133 | "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", 2134 | "dev": true, 2135 | "requires": { 2136 | "defaults": "1.0.3", 2137 | "glob-stream": "3.1.18", 2138 | "glob-watcher": "0.0.6", 2139 | "graceful-fs": "3.0.11", 2140 | "mkdirp": "0.5.1", 2141 | "strip-bom": "1.0.0", 2142 | "through2": "0.6.5", 2143 | "vinyl": "0.4.6" 2144 | }, 2145 | "dependencies": { 2146 | "clone": { 2147 | "version": "0.2.0", 2148 | "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", 2149 | "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", 2150 | "dev": true 2151 | }, 2152 | "isarray": { 2153 | "version": "0.0.1", 2154 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 2155 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 2156 | "dev": true 2157 | }, 2158 | "readable-stream": { 2159 | "version": "1.0.34", 2160 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 2161 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 2162 | "dev": true, 2163 | "requires": { 2164 | "core-util-is": "1.0.2", 2165 | "inherits": "2.0.3", 2166 | "isarray": "0.0.1", 2167 | "string_decoder": "0.10.31" 2168 | } 2169 | }, 2170 | "through2": { 2171 | "version": "0.6.5", 2172 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", 2173 | "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", 2174 | "dev": true, 2175 | "requires": { 2176 | "readable-stream": "1.0.34", 2177 | "xtend": "4.0.1" 2178 | } 2179 | }, 2180 | "vinyl": { 2181 | "version": "0.4.6", 2182 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", 2183 | "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", 2184 | "dev": true, 2185 | "requires": { 2186 | "clone": "0.2.0", 2187 | "clone-stats": "0.0.1" 2188 | } 2189 | } 2190 | } 2191 | }, 2192 | "which": { 2193 | "version": "1.2.14", 2194 | "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", 2195 | "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", 2196 | "dev": true, 2197 | "requires": { 2198 | "isexe": "2.0.0" 2199 | } 2200 | }, 2201 | "wrappy": { 2202 | "version": "1.0.2", 2203 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2204 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2205 | "dev": true 2206 | }, 2207 | "xml-char-classes": { 2208 | "version": "1.0.0", 2209 | "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", 2210 | "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=" 2211 | }, 2212 | "xtend": { 2213 | "version": "4.0.1", 2214 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 2215 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 2216 | "dev": true 2217 | } 2218 | } 2219 | } 2220 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "stringify", 3 | "description": "Browserify middleware to be able to require() text files (including templates) inside of your client-side JavaScript files.", 4 | "version": "5.2.0", 5 | "main": "./index.js", 6 | "author": "John Postlethwait ", 7 | "contributors": [ 8 | "James Newell ", 9 | "Kevin Ingersoll ", 10 | "Livoras ", 11 | "Sébastien David ", 12 | "Kenneth Skovhus ", 13 | "Michaelangelo Jong ", 14 | "Matthew Dunsdon ", 15 | "Ugo Stephant " 16 | ], 17 | "website": "http://johnpostlethwait.github.com/stringify/", 18 | "keywords": [ 19 | "browserify", 20 | "browserify-transform", 21 | "require", 22 | "template", 23 | "text", 24 | "txt", 25 | "client-side" 26 | ], 27 | "repository": { 28 | "type": "git", 29 | "url": "git://github.com/JohnPostlethwait/stringify.git" 30 | }, 31 | "engines": { 32 | "node": ">=4.0.0" 33 | }, 34 | "license": "MIT", 35 | "dependencies": { 36 | "browserify-transform-tools": "^1.5.3", 37 | "html-minifier": "3.5.2" 38 | }, 39 | "devDependencies": { 40 | "gulp": "3.9.0", 41 | "gulp-jshint": "2.0.0", 42 | "gulp-mocha": "2.2.0", 43 | "jshint": "2.9.1", 44 | "jshint-stylish": "2.1.0", 45 | "mocha": "2.4.5", 46 | "should": "8.2.1" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/stringify.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var htmlMinifier = require('html-minifier'), 3 | fs = require('fs'), 4 | path = require('path'), 5 | tools = require('browserify-transform-tools'); 6 | 7 | var MINIFY_TRANSFORM_OPTIONS = { 8 | includeExtensions: [ 9 | '.html', 10 | '.htm', 11 | '.tmpl', 12 | '.tpl', 13 | '.hbs' 14 | ] 15 | }; 16 | 17 | var TRANSFORM_OPTIONS = { 18 | includeExtensions: MINIFY_TRANSFORM_OPTIONS.includeExtensions.concat([ 19 | '.text', 20 | '.txt' 21 | ]) 22 | }; 23 | 24 | var DEFAULT_MINIFY_OPTIONS = { 25 | removeComments: true, 26 | removeCommentsFromCDATA: true, 27 | removeCDATASectionsFromCDATA: true, 28 | collapseWhitespace: true, 29 | conservativeCollapse: false, 30 | preserveLineBreaks: false, 31 | collapseBooleanAttributes: false, 32 | removeAttributeQuotes: true, 33 | removeRedundantAttributes: false, 34 | useShortDoctype: false, 35 | removeEmptyAttributes: false, 36 | removeScriptTypeAttributes: false, 37 | removeStyleLinkTypeAttributes: false, 38 | removeOptionalTags: false, 39 | removeIgnored: false, 40 | removeEmptyElements: false, 41 | lint: false, 42 | keepClosingSlash: false, 43 | caseSensitive: false, 44 | minifyJS: false, 45 | minifyCSS: false, 46 | minifyURLs: false 47 | }; 48 | 49 | var NODE_REQUIRE_OPTIONS = {}; 50 | 51 | /** 52 | * Stringifies the content 53 | * @param {string} content 54 | * @returns {string} 55 | */ 56 | function stringify (content) { 57 | return 'module.exports = ' + JSON.stringify(content) + ';\n'; 58 | } 59 | 60 | /** 61 | * Takes a set of user-supplied options, and ensure file configuration 62 | * settings is in the correct form for 'browserify-transform-tools'. 63 | * @param {object | array} options 64 | * @returns {object} 65 | */ 66 | function getTransformOptions (options) { 67 | if (!options) { 68 | return {}; 69 | } 70 | 71 | if (Object.prototype.toString.call(options) === '[object Array]') { 72 | options = { appliesTo: { includeExtensions: options } }; 73 | } 74 | 75 | if (options.extensions && !options.appliesTo) { 76 | var extensions = options.extensions._ || options.extensions; 77 | options.appliesTo = { includeExtensions: extensions }; 78 | delete options.extensions; 79 | } 80 | 81 | return options; 82 | } 83 | 84 | /** 85 | * Takes a set of user-supplied options, and determines which set of file- 86 | * extensions to run Stringify on. 87 | * @param {object | array} options 88 | * @param {object} options.extensions 89 | * @returns {string[]} 90 | */ 91 | function getRequireExtensions (options) { 92 | var extensions = TRANSFORM_OPTIONS.includeExtensions; 93 | 94 | if (options && options.appliesTo && options.appliesTo.includeExtensions) { 95 | extensions = options.appliesTo.includeExtensions; 96 | } 97 | 98 | // Lowercase all file extensions for case-insensitive matching. 99 | extensions = extensions.map(function (ext) { 100 | return ext.toLowerCase(); 101 | }); 102 | 103 | return extensions; 104 | } 105 | 106 | /** 107 | * Provides user or default options for html-minifier module 108 | * @param {object} options 109 | * @returns {object} 110 | */ 111 | function getMinifyOptions (options) { 112 | if (!options || !options.minify) { 113 | return { requested: false }; 114 | } 115 | 116 | var minifierOpts = options.minifier, 117 | minify = { requested: true, options: DEFAULT_MINIFY_OPTIONS }; 118 | 119 | if (options.minifyAppliesTo) { 120 | minify.config = { appliesTo: options.minifyAppliesTo }; 121 | } else if (minifierOpts && minifierOpts.extensions) { 122 | var extensions = minifierOpts.extensions._ || options.minifier.extensions; 123 | minify.config = { appliesTo: { includeExtensions: extensions } }; 124 | } 125 | 126 | if (options.minifyOptions) { 127 | minify.options = options.minifyOptions; 128 | } else if (minifierOpts && minifierOpts.options) { 129 | minify.options = minifierOpts.options; 130 | } 131 | 132 | return minify; 133 | } 134 | 135 | /** 136 | * Returns minified contents if requested 137 | * @param {string} filename 138 | * @param {string} contents 139 | * @param {object} options 140 | * @return {string} 141 | */ 142 | function minify(filename, contents, options) { 143 | var minifier = getMinifyOptions(options); 144 | 145 | if (minifier.requested) { 146 | if (!tools.skipFile(filename, minifier.config, MINIFY_TRANSFORM_OPTIONS)) { 147 | return htmlMinifier.minify(contents, minifier.options); 148 | } 149 | } 150 | 151 | return contents; 152 | } 153 | 154 | /** 155 | * Reads in a file and stringifies and minifies the contents. 156 | * @param {string} module 157 | * @param {string} filename 158 | * @return {string} 159 | */ 160 | function requireStringify (module, filename) { 161 | var contents; 162 | 163 | try { 164 | contents = fs.readFileSync(path.resolve(filename), 'utf8'); 165 | } catch (error) { 166 | throw new Error('Stringify could not find module \'' + path.resolve(filename) + '\'.'); 167 | } 168 | 169 | module.exports = minify(filename, contents, NODE_REQUIRE_OPTIONS); 170 | } 171 | 172 | /** 173 | * Registers the given extensions with node require. 174 | * @param {object | array} options 175 | * @return {void} 176 | */ 177 | function registerWithRequire (options) { 178 | NODE_REQUIRE_OPTIONS = getTransformOptions(options); 179 | 180 | var exts = getRequireExtensions(NODE_REQUIRE_OPTIONS); 181 | 182 | for (var i = 0; i < exts.length; i++) { 183 | require.extensions[ exts[i] ] = requireStringify; 184 | } 185 | } 186 | 187 | /** 188 | * Function which is called to do the transform. 189 | * 190 | * - `contents` are the contents of the file. 191 | * - `transformOptions.file` is the name of the file (as would be 192 | * passed to a normal browserify transform.) 193 | * - `transformOptions.config` is the configuration data that has been 194 | * automatically loaded. For details, see the transform configuration documentation 195 | * (https://github.com/benbria/browserify-transform-tools/wiki/Transform-Configuration). 196 | * - `transformOptions.config` is a copy of 197 | * - `done(err, transformed)` is a callback which must be called, passing a 198 | * string with the transformed contents of the file. 199 | * 200 | * @param {string} content 201 | * @param {object} transformOptions 202 | * @param {function} done 203 | * @returns {void} 204 | */ 205 | function transformFn (contents, transformOptions, done) { 206 | var file = transformOptions.file, 207 | options = transformOptions.config; 208 | 209 | done(null, stringify(minify(file, contents, options))); 210 | } 211 | 212 | /** 213 | * Exposes the Browserify transform function. 214 | * 215 | * This handles two use cases: 216 | * - Factory: given no arguments or options as first argument it returns 217 | * the transform function 218 | * - Standard: given file (and optionally options) as arguments a stream is 219 | * returned. This follows the standard pattern for browserify transformers. 220 | * 221 | * @param {string} file 222 | * @param {object | array} options 223 | * @returns {stream | function} depending on if first argument is string. 224 | */ 225 | module.exports = function (file, options) { 226 | var transform = tools.makeStringTransform('stringify', TRANSFORM_OPTIONS, transformFn); 227 | 228 | if (typeof file !== 'string') { 229 | // Factory: return a function. 230 | // Set options variable here so it is ready for when browserifyTransform 231 | // is called. Note: first argument is the options. 232 | var capturedOptions = getTransformOptions(file); 233 | return function (file) { return transform(file, capturedOptions); }; 234 | } else { 235 | return transform(file, getTransformOptions(options)); 236 | } 237 | }; 238 | 239 | // exports registerWithRequire so stringify can be registered with node require. 240 | module.exports.registerWithRequire = registerWithRequire; 241 | 242 | // Test-environment specific exports... 243 | if (process.env.NODE_ENV) { 244 | module.exports.NODE_REQUIRE_OPTIONS = NODE_REQUIRE_OPTIONS; 245 | module.exports.requireStringify = requireStringify; 246 | module.exports.stringify = stringify; 247 | module.exports.getRequireExtensions = getRequireExtensions; 248 | module.exports.getTransformOptions = getTransformOptions; 249 | module.exports.TRANSFORM_OPTIONS = TRANSFORM_OPTIONS; 250 | module.exports.minify = minify; 251 | module.exports.getMinifyOptions = getMinifyOptions; 252 | module.exports.MINIFY_TRANSFORM_OPTIONS = MINIFY_TRANSFORM_OPTIONS; 253 | module.exports.DEFAULT_MINIFY_OPTIONS = DEFAULT_MINIFY_OPTIONS; 254 | } 255 | -------------------------------------------------------------------------------- /test/file_fixture.txt: -------------------------------------------------------------------------------- 1 | This is a mock text file for the test fixtures! 2 | -------------------------------------------------------------------------------- /test/getMinifyOptions.spec.js: -------------------------------------------------------------------------------- 1 | /* jshint expr: true */ 2 | /* global describe: false, it: false, before: false */ 3 | 'use strict'; 4 | require('should'); 5 | var Stringify = require('../index'); 6 | 7 | describe('the "getMinifyOptions" function', function () { 8 | 9 | function assertObjectInReturnedOptions () { 10 | it('should have returned an object', function () { 11 | this.returned_options.should.be.an.Object; 12 | }); 13 | } 14 | 15 | function assertCorrectOptionsReturned () { 16 | it('should have returned the correct extensions', function () { 17 | this.returned_options.should.eql(this.correct_test_options); 18 | }); 19 | } 20 | 21 | describe('when passed no options argument', function () { 22 | before(function () { 23 | this.correct_test_options = { requested: false }; 24 | this.returned_options = Stringify.getMinifyOptions(); 25 | }); 26 | 27 | assertObjectInReturnedOptions(); 28 | assertCorrectOptionsReturned(); 29 | }); 30 | 31 | describe('when passed empty options argument', function () { 32 | before(function () { 33 | this.correct_test_options = { requested: false }; 34 | this.returned_options = Stringify.getMinifyOptions({}); 35 | }); 36 | 37 | assertObjectInReturnedOptions(); 38 | assertCorrectOptionsReturned(); 39 | }); 40 | 41 | describe('when passed options argument with minify set to false', function () { 42 | before(function () { 43 | this.correct_test_options = { requested: false }; 44 | this.returned_options = Stringify.getMinifyOptions({ minify: false }); 45 | }); 46 | 47 | assertObjectInReturnedOptions(); 48 | assertCorrectOptionsReturned(); 49 | }); 50 | 51 | describe('when passed options argument with minify set to true', function () { 52 | before(function () { 53 | this.correct_test_options = { 54 | requested: true, 55 | options: Stringify.DEFAULT_MINIFY_OPTIONS 56 | }; 57 | 58 | this.returned_options = Stringify.getMinifyOptions({ minify: true }); 59 | }); 60 | 61 | assertObjectInReturnedOptions(); 62 | assertCorrectOptionsReturned(); 63 | }); 64 | 65 | describe('when passed options argument with minifyOptions set', function () { 66 | before(function () { 67 | var minifyOptions = { grape: 'fruit' }; 68 | 69 | this.correct_test_options = { 70 | requested: true, 71 | options: minifyOptions 72 | }; 73 | 74 | this.returned_options = Stringify.getMinifyOptions({ 75 | minify: true, 76 | minifyOptions: minifyOptions 77 | }); 78 | }); 79 | 80 | assertObjectInReturnedOptions(); 81 | assertCorrectOptionsReturned(); 82 | }); 83 | 84 | describe('when passed options argument with minifier.options set', function () { 85 | before(function () { 86 | var minifierOptions = { sweet: 'tooth' }; 87 | 88 | this.correct_test_options = { 89 | requested: true, 90 | options: minifierOptions 91 | }; 92 | 93 | this.returned_options = Stringify.getMinifyOptions({ 94 | minify: true, 95 | minifier: { options: minifierOptions } 96 | }); 97 | }); 98 | 99 | assertObjectInReturnedOptions(); 100 | assertCorrectOptionsReturned(); 101 | }); 102 | 103 | describe('when passed options argument with minifyAppliesTo set', function () { 104 | before(function () { 105 | var minifyAppliesTo = { includeExtensions: ['.car', '.vs', '.train'] }; 106 | 107 | this.correct_test_options = { 108 | requested: true, 109 | config: { appliesTo: minifyAppliesTo }, 110 | options: Stringify.DEFAULT_MINIFY_OPTIONS 111 | }; 112 | 113 | this.returned_options = Stringify.getMinifyOptions({ 114 | minify: true, 115 | minifyAppliesTo: minifyAppliesTo 116 | }); 117 | }); 118 | 119 | assertObjectInReturnedOptions(); 120 | assertCorrectOptionsReturned(); 121 | }); 122 | 123 | describe('when passed options argument with minifier.extensions set', function () { 124 | before(function () { 125 | var extensions = ['.top', '.hat']; 126 | 127 | this.correct_test_options = { 128 | requested: true, 129 | config: { appliesTo: { includeExtensions: extensions } }, 130 | options: Stringify.DEFAULT_MINIFY_OPTIONS 131 | }; 132 | 133 | this.returned_options = Stringify.getMinifyOptions({ 134 | minify: true, 135 | minifier: { extensions : extensions } 136 | }); 137 | }); 138 | 139 | assertObjectInReturnedOptions(); 140 | assertCorrectOptionsReturned(); 141 | }); 142 | 143 | describe('when passed options argument with minifier.extensions._ set', function () { 144 | before(function () { 145 | var extensions = ['.box', '.glove']; 146 | 147 | this.correct_test_options = { 148 | requested: true, 149 | config: { appliesTo: { includeExtensions: extensions } }, 150 | options: Stringify.DEFAULT_MINIFY_OPTIONS 151 | }; 152 | 153 | this.returned_options = Stringify.getMinifyOptions({ 154 | minify: true, 155 | minifier: { extensions : { _: extensions } } 156 | }); 157 | }); 158 | 159 | assertObjectInReturnedOptions(); 160 | assertCorrectOptionsReturned(); 161 | }); 162 | }); 163 | -------------------------------------------------------------------------------- /test/getRequireExtensions.spec.js: -------------------------------------------------------------------------------- 1 | /* jshint expr: true */ 2 | /* global describe: false, it: false, before: false */ 3 | 'use strict'; 4 | require('should'); 5 | var Stringify = require('../index'); 6 | 7 | describe('the "getRequireExtensions" function', function () { 8 | function assertNonEmptyArrayInReturnedExtensions () { 9 | it('should have returned a non-empty array', function () { 10 | this.returned_extensions.should.be.an.Array; 11 | this.returned_extensions.should.not.be.empty; 12 | }); 13 | } 14 | 15 | function assertCorrectExtensionsReturned () { 16 | it('should have returned the correct extensions', function () { 17 | this.returned_extensions.should.eql(this.correct_test_extensions); 18 | }); 19 | } 20 | 21 | describe('when passed no options argument', function () { 22 | before(function () { 23 | this.correct_test_extensions = Stringify.TRANSFORM_OPTIONS.includeExtensions; 24 | this.returned_extensions = Stringify.getRequireExtensions(); 25 | }); 26 | 27 | assertNonEmptyArrayInReturnedExtensions(); 28 | assertCorrectExtensionsReturned(); 29 | }); 30 | 31 | describe('when passed empty object options argument', function () { 32 | before(function () { 33 | this.correct_test_extensions = Stringify.TRANSFORM_OPTIONS.includeExtensions; 34 | this.returned_extensions = Stringify.getRequireExtensions({}); 35 | }); 36 | 37 | assertNonEmptyArrayInReturnedExtensions(); 38 | assertCorrectExtensionsReturned(); 39 | }); 40 | 41 | describe('when passed an object with an "appliesTo.includeExtensions" property as an options argument', function () { 42 | before(function () { 43 | var extensions = ['.trains', '.are', '.fun'], 44 | test_object = { appliesTo: { includeExtensions: extensions } }; 45 | 46 | this.correct_test_extensions = extensions; 47 | this.returned_extensions = Stringify.getRequireExtensions(test_object); 48 | }); 49 | 50 | assertNonEmptyArrayInReturnedExtensions(); 51 | assertCorrectExtensionsReturned(); 52 | }); 53 | 54 | describe('when passed an object with an "appliesTo.includeExtensions" property with mixed casing', function () { 55 | before(function () { 56 | var extensions = ['.BUS', '.laNE'], 57 | test_object = { appliesTo: { includeExtensions: extensions } }, 58 | lowerCasedExtensions = ['.bus', '.lane']; 59 | 60 | this.correct_test_extensions = lowerCasedExtensions; 61 | this.returned_extensions = Stringify.getRequireExtensions(test_object); 62 | }); 63 | 64 | assertNonEmptyArrayInReturnedExtensions(); 65 | assertCorrectExtensionsReturned(); 66 | }); 67 | }); 68 | -------------------------------------------------------------------------------- /test/getTransformOptions.spec.js: -------------------------------------------------------------------------------- 1 | /* jshint expr: true */ 2 | /* global describe: false, it: false, before: false */ 3 | 'use strict'; 4 | require('should'); 5 | var Stringify = require('../index'); 6 | 7 | describe('the "getTransformOptions" function', function () { 8 | function assertObjectInReturnedExtensions () { 9 | it('should have returned an object', function () { 10 | this.returned_options.should.be.an.Object; 11 | }); 12 | } 13 | 14 | function assertCorrectOptionsReturned () { 15 | it('should have returned the correct extensions', function () { 16 | this.returned_options.should.eql(this.correct_test_options); 17 | }); 18 | } 19 | 20 | describe('when passed no options argument', function () { 21 | before(function () { 22 | this.correct_test_options = {}; 23 | this.returned_options = Stringify.getTransformOptions(); 24 | }); 25 | 26 | assertObjectInReturnedExtensions(); 27 | assertCorrectOptionsReturned(); 28 | }); 29 | 30 | describe('when passed an array of file-extensions as an options argument', function () { 31 | before(function () { 32 | var test_extensions = ['.cookie', '.cupcake', '.halibut']; 33 | 34 | this.correct_test_options = { appliesTo: { includeExtensions: test_extensions } }; 35 | this.returned_options = Stringify.getTransformOptions(test_extensions); 36 | }); 37 | 38 | assertObjectInReturnedExtensions(); 39 | assertCorrectOptionsReturned(); 40 | }); 41 | 42 | describe('when passed an object with an "extensions" array property as an options argument', function () { 43 | before(function () { 44 | var test_extensions = ['.trains', '.are', '.fun']; 45 | 46 | this.correct_test_options = { appliesTo: { includeExtensions: test_extensions }, space: 'ship' }; 47 | 48 | var test_options = { extensions: test_extensions, space: 'ship' }; 49 | 50 | this.returned_options = Stringify.getTransformOptions(test_options); 51 | }); 52 | 53 | assertObjectInReturnedExtensions(); 54 | assertCorrectOptionsReturned(); 55 | }); 56 | 57 | describe('when passed an object with an "extensions" Browserify array property as an options argument', function () { 58 | before(function () { 59 | var test_extensions = ['.trains', '.are', '.fun']; 60 | 61 | this.correct_test_options = { appliesTo: { includeExtensions: test_extensions }, space: 'ship' }; 62 | 63 | var test_options = { extensions: { _: test_extensions }, space: 'ship' }; 64 | 65 | this.returned_options = Stringify.getTransformOptions(test_options); 66 | }); 67 | 68 | assertObjectInReturnedExtensions(); 69 | assertCorrectOptionsReturned(); 70 | }); 71 | 72 | describe('when passed an object with an "appliesTo" object property as an options argument', function () { 73 | before(function () { 74 | this.correct_test_options = { appliesTo: { files: ['.ant', '.frog', '.panda'] }, fruit: 'bowl' }; 75 | 76 | this.returned_options = Stringify.getTransformOptions(this.correct_test_options); 77 | }); 78 | 79 | assertObjectInReturnedExtensions(); 80 | assertCorrectOptionsReturned(); 81 | }); 82 | }); 83 | -------------------------------------------------------------------------------- /test/main.spec.js: -------------------------------------------------------------------------------- 1 | /* jshint expr: true */ 2 | /* global describe: false, it: false, before: false */ 3 | 'use strict'; 4 | var should = require('should'), 5 | stream = require('stream'), 6 | tools = require('browserify-transform-tools'), 7 | stringify = require('../index'); 8 | 9 | describe('the main function called', function () { 10 | var input = '

should be minified

', 11 | outputTransformed = 'module.exports = \"

should be minified

";\n', 12 | outputMinified = 'module.exports = \"

should be minified

";\n'; 13 | 14 | function assertFactoryFunctionReturnsOneArgument () { 15 | it('should return a factory function that expects one argument', function () { 16 | should(this.transformerFactory.length).be.equal(1); 17 | }); 18 | } 19 | 20 | function assertFactoryFunctionReturnsStreamWhenSuppliedValidFile () { 21 | describe('when the returned function is called with a valid file path', function () { 22 | before(function () { 23 | this.transformer = this.transformerFactory('a_file.xxx'); 24 | }); 25 | 26 | it('should return a Stream object', function () { 27 | should(this.transformer).be.instanceOf(stream.Stream); 28 | should(this.transformer.writable).ok; 29 | should(this.transformer.readable).ok; 30 | this.transformer.write.should.be.a.Function; 31 | this.transformer.end.should.be.a.Function; 32 | }); 33 | }); 34 | } 35 | 36 | describe('with no options', function () { 37 | before(function () { 38 | this.transformConfig = { 39 | content: input 40 | }; 41 | this.transformerFactory = stringify(); 42 | }); 43 | 44 | assertFactoryFunctionReturnsOneArgument(); 45 | assertFactoryFunctionReturnsStreamWhenSuppliedValidFile(); 46 | 47 | it('should respond to input with the default options', function (done) { 48 | tools.runTransform(this.transformerFactory, 'a_file.txt', this.transformConfig, function(err, result) { 49 | should(err).be.null; 50 | should(result).be.equal(outputTransformed); 51 | done(); 52 | }); 53 | }); 54 | 55 | it('should respond without transformation when should be file skipped', function (done) { 56 | tools.runTransform(this.transformerFactory, 'a_file.foo', this.transformConfig, function(err, result) { 57 | should(err).be.null; 58 | should(result).be.equal(input); 59 | done(); 60 | }); 61 | }); 62 | }); 63 | 64 | describe('with options as first argument', function () { 65 | before(function () { 66 | this.transformConfig = { 67 | content: input 68 | }; 69 | this.transformerFactory = stringify({ 70 | appliesTo: { includeExtensions: ['.xxx'] }, 71 | minify: true, 72 | minifyAppliesTo: { 73 | includeExtensions: ['.xxx'] 74 | } 75 | }); 76 | }); 77 | 78 | assertFactoryFunctionReturnsOneArgument(); 79 | assertFactoryFunctionReturnsStreamWhenSuppliedValidFile(); 80 | 81 | it('should respond to input with the given options', function (done) { 82 | tools.runTransform(this.transformerFactory, 'a_file.xxx', this.transformConfig, function(err, result) { 83 | should(err).be.null; 84 | should(result).be.equal(outputMinified); 85 | done(); 86 | }); 87 | }); 88 | 89 | it('should respond without transformation when should be file skipped', function (done) { 90 | tools.runTransform(this.transformerFactory, 'a_file.foo', this.transformConfig, function(err, result) { 91 | should(err).be.null; 92 | should(result).be.equal(input); 93 | done(); 94 | }); 95 | }); 96 | }); 97 | 98 | describe('with file as first argument', function () { 99 | before(function () { 100 | this.transformConfig = { 101 | content: input, 102 | config: { 103 | appliesTo: { includeExtensions: ['.xxx'] } 104 | } 105 | }; 106 | }); 107 | 108 | describe('when called with a valid file path and options', function () { 109 | before(function () { 110 | this.transformer = stringify('a_file', this.transformConfig.config); 111 | }); 112 | 113 | it('should return a Stream object', function () { 114 | should(this.transformer).be.instanceOf(stream.Stream); 115 | should(this.transformer.writable).ok; 116 | should(this.transformer.readable).ok; 117 | this.transformer.write.should.be.a.Function; 118 | this.transformer.end.should.be.a.Function; 119 | }); 120 | }); 121 | 122 | it('should respond to input with the given options', function (done) { 123 | tools.runTransform(stringify, 'a_file.xxx', this.transformConfig, function(err, result) { 124 | should(err).be.null; 125 | should(result).be.equal(outputTransformed); 126 | done(); 127 | }); 128 | }); 129 | 130 | it('should respond without transformation when should be file skipped', function (done) { 131 | tools.runTransform(stringify, 'a_file.foo', this.transformConfig, function(err, result) { 132 | should(err).be.null; 133 | should(result).be.equal(input); 134 | done(); 135 | }); 136 | }); 137 | }); 138 | }); 139 | -------------------------------------------------------------------------------- /test/minify.expected.html: -------------------------------------------------------------------------------- 1 |

This content

should be minified

2 | -------------------------------------------------------------------------------- /test/minify.given.html: -------------------------------------------------------------------------------- 1 |
2 |

This content

3 | 4 | 5 | 6 | 7 |

should be minified

8 |
9 | -------------------------------------------------------------------------------- /test/minify.spec.js: -------------------------------------------------------------------------------- 1 | /* jshint expr: true */ 2 | /* global describe: false, it: false, before: false */ 3 | 'use strict'; 4 | require('should'); 5 | var path = require('path'), 6 | fs = require('fs'), 7 | Stringify = require('../index'); 8 | 9 | function requireHtml(filename) { 10 | return fs.readFileSync(path.join(path.dirname('.'), 'test', filename), 'utf8'); 11 | } 12 | 13 | describe('the "minify" function', function () { 14 | before(function () { 15 | this.givenHtml = requireHtml('minify.given.html'); 16 | this.expectedHtml = requireHtml('minify.expected.html').replace(/\r?\n|\r/, ''); 17 | }); 18 | 19 | it('should return a function', function () { 20 | Stringify.minify.should.be.a.Function; 21 | }); 22 | 23 | it('should have default minifier extensions', function () { 24 | var extensions = Stringify.MINIFY_TRANSFORM_OPTIONS; 25 | extensions.should.be.an.Object; 26 | extensions.includeExtensions.should.be.an.Array; 27 | extensions.includeExtensions.length.should.be.exactly(5); 28 | }); 29 | 30 | it('should minify html content', function () { 31 | Stringify.minify('some.html', this.givenHtml, { 32 | minify: true 33 | }).should.be.exactly(this.expectedHtml); 34 | }); 35 | 36 | it('should not minify html content when minification is not requested', function () { 37 | Stringify.minify('some.html', this.givenHtml, { 38 | minify: false 39 | }).should.be.exactly(this.givenHtml); 40 | }); 41 | 42 | it('should not minify html content when extension is excluded', function () { 43 | Stringify.minify('some.html', this.givenHtml, { 44 | minify: true, 45 | minifyAppliesTo: { includeExtensions: ['.foo'] } 46 | }).should.be.exactly(this.givenHtml); 47 | }); 48 | 49 | it('should minify custom content when extension is included', function () { 50 | Stringify.minify('some.ant', this.givenHtml, { 51 | minify: true, 52 | minifyAppliesTo: { includeExtensions: ['.ant'] } 53 | }).should.be.exactly(this.expectedHtml); 54 | }); 55 | 56 | it('should not minify custom content when extension is excluded', function () { 57 | Stringify.minify('some.soap', this.givenHtml, { 58 | minify: true, 59 | minifyAppliesTo: { includeExtensions: ['.xml'] } 60 | }).should.be.exactly(this.givenHtml); 61 | }); 62 | }); 63 | -------------------------------------------------------------------------------- /test/module.spec.js: -------------------------------------------------------------------------------- 1 | /* jshint expr: true */ 2 | /* global describe: false, it: false */ 3 | 'use strict'; 4 | var stringify = require('../index'); 5 | 6 | describe('when the module is required', function () { 7 | it('should return a function', function () { 8 | stringify.should.be.a.Function; 9 | }); 10 | 11 | it('should have a method "registerWithRequire"', function () { 12 | stringify.registerWithRequire.should.be.a.Function; 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /test/nodeRequire.spec.js: -------------------------------------------------------------------------------- 1 | /* jshint expr: true */ 2 | /* global describe: false, it: false, before: false */ 3 | 'use strict'; 4 | require('should'); 5 | var Stringify = require('../index'); 6 | 7 | describe('the "registerWithRequire" function', function () { 8 | before(function () { 9 | Stringify.registerWithRequire(); 10 | }); 11 | 12 | it('should allow me to require "./file_fixture.txt" as strings', function () { 13 | require('./file_fixture.txt').should.be.a.String; 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /test/stringify.spec.js: -------------------------------------------------------------------------------- 1 | /* jshint expr: true */ 2 | /* global describe: false, it: false, before: false */ 3 | 'use strict'; 4 | require('should'); 5 | var Stringify = require('../index'); 6 | 7 | describe('the "stringify" function', function () { 8 | before(function () { 9 | this.test_string = '

' + 10 | 'This is my test string HTML!

'; 11 | 12 | this.stringified_content = Stringify.stringify(this.test_string); 13 | }); 14 | 15 | it('should have returned a string', function () { 16 | this.stringified_content.should.be.a.String; 17 | }); 18 | 19 | it('should begin with module.exports = "', function () { 20 | this.stringified_content.should.startWith('module.exports = "'); 21 | }); 22 | 23 | // TODO: Figure out how to do a capture-repeat Regex for this to actually ensure all 5 newlines were preserved. 24 | it('should have perserved newline characters', function () { 25 | this.stringified_content.should.match(/\n/); 26 | }); 27 | 28 | it('should have escaped the double-quotes', function () { 29 | this.stringified_content.should.match(/\\\"/); 30 | }); 31 | }); 32 | --------------------------------------------------------------------------------