├── .gitignore ├── .npmignore ├── .travis.yml ├── LICENSE ├── README.md ├── demo ├── gulpfile.js ├── package.json └── src │ ├── config.js │ ├── index.html │ ├── main.js │ └── message.js ├── index.js ├── package.json └── test ├── index.js └── stream-assert.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | jspm_packages/ 3 | demo/build/ 4 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /demo 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "4.1" 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | CC0 1.0 Universal 2 | 3 | Statement of Purpose 4 | 5 | The laws of most jurisdictions throughout the world automatically confer 6 | exclusive Copyright and Related Rights (defined below) upon the creator and 7 | subsequent owner(s) (each and all, an "owner") of an original work of 8 | authorship and/or a database (each, a "Work"). 9 | 10 | Certain owners wish to permanently relinquish those rights to a Work for the 11 | purpose of contributing to a commons of creative, cultural and scientific 12 | works ("Commons") that the public can reliably and without fear of later 13 | claims of infringement build upon, modify, incorporate in other works, reuse 14 | and redistribute as freely as possible in any form whatsoever and for any 15 | purposes, including without limitation commercial purposes. These owners may 16 | contribute to the Commons to promote the ideal of a free culture and the 17 | further production of creative, cultural and scientific works, or to gain 18 | reputation or greater distribution for their Work in part through the use and 19 | efforts of others. 20 | 21 | For these and/or other purposes and motivations, and without any expectation 22 | of additional consideration or compensation, the person associating CC0 with a 23 | Work (the "Affirmer"), to the extent that he or she is an owner of Copyright 24 | and Related Rights in the Work, voluntarily elects to apply CC0 to the Work 25 | and publicly distribute the Work under its terms, with knowledge of his or her 26 | Copyright and Related Rights in the Work and the meaning and intended legal 27 | effect of CC0 on those rights. 28 | 29 | 1. Copyright and Related Rights. A Work made available under CC0 may be 30 | protected by copyright and related or neighboring rights ("Copyright and 31 | Related Rights"). Copyright and Related Rights include, but are not limited 32 | to, the following: 33 | 34 | i. the right to reproduce, adapt, distribute, perform, display, communicate, 35 | and translate a Work; 36 | 37 | ii. moral rights retained by the original author(s) and/or performer(s); 38 | 39 | iii. publicity and privacy rights pertaining to a person's image or likeness 40 | depicted in a Work; 41 | 42 | iv. rights protecting against unfair competition in regards to a Work, 43 | subject to the limitations in paragraph 4(a), below; 44 | 45 | v. rights protecting the extraction, dissemination, use and reuse of data in 46 | a Work; 47 | 48 | vi. database rights (such as those arising under Directive 96/9/EC of the 49 | European Parliament and of the Council of 11 March 1996 on the legal 50 | protection of databases, and under any national implementation thereof, 51 | including any amended or successor version of such directive); and 52 | 53 | vii. other similar, equivalent or corresponding rights throughout the world 54 | based on applicable law or treaty, and any national implementations thereof. 55 | 56 | 2. Waiver. To the greatest extent permitted by, but not in contravention of, 57 | applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and 58 | unconditionally waives, abandons, and surrenders all of Affirmer's Copyright 59 | and Related Rights and associated claims and causes of action, whether now 60 | known or unknown (including existing as well as future claims and causes of 61 | action), in the Work (i) in all territories worldwide, (ii) for the maximum 62 | duration provided by applicable law or treaty (including future time 63 | extensions), (iii) in any current or future medium and for any number of 64 | copies, and (iv) for any purpose whatsoever, including without limitation 65 | commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes 66 | the Waiver for the benefit of each member of the public at large and to the 67 | detriment of Affirmer's heirs and successors, fully intending that such Waiver 68 | shall not be subject to revocation, rescission, cancellation, termination, or 69 | any other legal or equitable action to disrupt the quiet enjoyment of the Work 70 | by the public as contemplated by Affirmer's express Statement of Purpose. 71 | 72 | 3. Public License Fallback. Should any part of the Waiver for any reason be 73 | judged legally invalid or ineffective under applicable law, then the Waiver 74 | shall be preserved to the maximum extent permitted taking into account 75 | Affirmer's express Statement of Purpose. In addition, to the extent the Waiver 76 | is so judged Affirmer hereby grants to each affected person a royalty-free, 77 | non transferable, non sublicensable, non exclusive, irrevocable and 78 | unconditional license to exercise Affirmer's Copyright and Related Rights in 79 | the Work (i) in all territories worldwide, (ii) for the maximum duration 80 | provided by applicable law or treaty (including future time extensions), (iii) 81 | in any current or future medium and for any number of copies, and (iv) for any 82 | purpose whatsoever, including without limitation commercial, advertising or 83 | promotional purposes (the "License"). The License shall be deemed effective as 84 | of the date CC0 was applied by Affirmer to the Work. Should any part of the 85 | License for any reason be judged legally invalid or ineffective under 86 | applicable law, such partial invalidity or ineffectiveness shall not 87 | invalidate the remainder of the License, and in such case Affirmer hereby 88 | affirms that he or she will not (i) exercise any of his or her remaining 89 | Copyright and Related Rights in the Work or (ii) assert any associated claims 90 | and causes of action with respect to the Work, in either case contrary to 91 | Affirmer's express Statement of Purpose. 92 | 93 | 4. Limitations and Disclaimers. 94 | 95 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 96 | surrendered, licensed or otherwise affected by this document. 97 | 98 | b. Affirmer offers the Work as-is and makes no representations or warranties 99 | of any kind concerning the Work, express, implied, statutory or otherwise, 100 | including without limitation warranties of title, merchantability, fitness 101 | for a particular purpose, non infringement, or the absence of latent or 102 | other defects, accuracy, or the present or absence of errors, whether or not 103 | discoverable, all to the greatest extent permissible under applicable law. 104 | 105 | c. Affirmer disclaims responsibility for clearing rights of other persons 106 | that may apply to the Work or any use thereof, including without limitation 107 | any person's Copyright and Related Rights in the Work. Further, Affirmer 108 | disclaims responsibility for obtaining any necessary consents, permissions 109 | or other rights required for any use of the Work. 110 | 111 | d. Affirmer understands and acknowledges that Creative Commons is not a 112 | party to this document and has no duty or obligation with respect to this 113 | CC0 or use of the Work. 114 | 115 | For more information, please see 116 | 117 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | - 2 | 3 | # Currently unmaintained, see [issue #45 - Looking for a maintainer / fork](https://github.com/brillout/gulp-jspm/issues/45) 4 | 5 |
6 |
7 | 8 | `gulp-jspm` wraps the `jspm bundle moduleName` command line. 9 | 10 | ### Usage 11 | 12 | ```js 13 | var gulp = require('gulp'); 14 | var gulp_jspm = require('gulp-jspm'); // npm install gulp-jspm 15 | 16 | gulp.task('default', function(){ 17 | return gulp.src('src/main.js') 18 | .pipe(gulp_jspm()) 19 | .pipe(gulp.dest('build/')); 20 | }); 21 | ``` 22 | 23 | This will generate the `demo/build/jspm-bundle.js` file. 24 | This file corresponds to the file generated by the command `jspm bundle main`. 25 | 26 | Many code snippets shown in this Readme are implemented at [demo/gulpfile.js](demo/gulpfile.js). 27 | 28 | 29 | 30 | ###### Before Opening an Issue 31 | 32 | When opening an issue, copy the debug logs in the ticket. 33 | The debug logs are printed when running `gulp-jspm` with the verbose option `gulp_jspm({verbose: true})`. 34 | 35 | 36 | 37 | ###### Source Map 38 | 39 | ```js 40 | var sourcemaps = require('gulp-sourcemaps'); 41 | 42 | gulp.src('src/main.js') 43 | .pipe(sourcemaps.init()) 44 | .pipe(gulp_jspm()) 45 | .pipe(sourcemaps.write('.')) 46 | .pipe(gulp.dest('build/')); 47 | ``` 48 | 49 | 50 | ###### Options 51 | 52 | ```js 53 | // exclude message.js from bundle 54 | gulp.src('src/main.js') 55 | .pipe(gulp_jspm({arithmetic: '- message'})) 56 | .pipe(gulp.dest('build/')); 57 | 58 | // `jspm bundle-sfx main` 59 | gulp.src('src/main.js') 60 | .pipe(gulp_jspm({selfExecutingBundle: true})) 61 | .pipe(gulp.dest('build/')); 62 | 63 | // `jspm bundle main.jsx!` 64 | gulp.src('src/main.jsx') 65 | .pipe(gulp_jspm({plugin: true})) 66 | .pipe(gulp.dest('build/')); 67 | 68 | // `jspm bundle main.jsx!jsx` 69 | gulp.src('src/main.jsx') 70 | .pipe(gulp_jspm({plugin: 'jsx'})) 71 | .pipe(gulp.dest('build/')); 72 | 73 | // print information logs about the internal progress of `gulp-jspm` 74 | gulp.src('src/main.js') 75 | .pipe(gulp_jspm({verbose: true})) 76 | .pipe(gulp.dest('build/')); 77 | 78 | // rename the bundled file 79 | gulp.src('src/main.js') 80 | .pipe(gulp_jspm({fileName: 'other-name'})) // do not include file extension 81 | .pipe(gulp.dest('build/')); 82 | 83 | // All other options given to gulp-jspm are passed on to jspm. 84 | // All jspm options can therefore be passed to `gulp-jspm` 85 | // (`minify`, `mangle`, `lowResSourceMaps`, etc.). 86 | // For example: 87 | gulp.src('src/main.js') 88 | .pipe(gulp_jspm({inject: true})) // `jspm bundle main --inject` 89 | .pipe(gulp.dest('build/')); 90 | ``` 91 | 92 | 93 | ###### Original Entry Point 94 | 95 | ```js 96 | gulp.src('src/main.js') 97 | .pipe(gulp_jspm()) 98 | .pipe(pass(function(vinyl_file){ 99 | assert( vinyl_file.relative === 'main.bundle.js' ); 100 | assert( vinyl_file.originalEntryPoint.relative === 'main.js' ); 101 | })); 102 | ``` 103 | 104 | 105 | ### Run Gulpfile Demo 106 | 107 | To run the code snippets above execute following commands. 108 | 109 | ```js 110 | git clone git@github.com:brillout/gulp-jspm 111 | cd gulp-jspm/ 112 | npm install 113 | cd demo/ 114 | npm install 115 | npm install -g jspm 116 | npm install -g gulp 117 | jspm install 118 | gulp 119 | gulp sourcemap 120 | gulp test 121 | ``` 122 | 123 | -------------------------------------------------------------------------------- /demo/gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'); 2 | var gulp_jspm = require('../index.js'); 3 | 4 | 5 | gulp.task('default', function(){ 6 | return gulp.src('src/main.js') 7 | .pipe(gulp_jspm()) 8 | .pipe(gulp.dest('build/')); 9 | }); 10 | 11 | 12 | gulp.task('sourcemap', function(){ 13 | var sourcemaps = require('gulp-sourcemaps'); 14 | 15 | return gulp.src('src/main.js') 16 | .pipe(sourcemaps.init()) 17 | .pipe(gulp_jspm()) 18 | .pipe(sourcemaps.write('.')) 19 | .pipe(gulp.dest('build/')); 20 | }); 21 | 22 | 23 | gulp.task('test', function(){ 24 | var assert = require('better-assert'); 25 | 26 | return gulp.src('src/main.js') 27 | .pipe(gulp_jspm()) 28 | .pipe(pass(function(vinyl_file){ 29 | assert( vinyl_file.relative === 'main.bundle.js' ); 30 | assert( vinyl_file.originalEntryPoint.relative === 'main.js' ); 31 | })); 32 | 33 | function pass(fct) { 34 | return require('through2').obj(function(file, enc, cb){ 35 | fct(file); 36 | this.push(file); 37 | cb(); 38 | }); 39 | } 40 | }); 41 | 42 | 43 | gulp.task('arithmetic', function(){ 44 | return gulp.src('src/main.js') 45 | .pipe(gulp_jspm({arithmetic:'- message'})) // excludes message.js from bundle 46 | .pipe(gulp.dest('build/')); 47 | }); 48 | -------------------------------------------------------------------------------- /demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "jspm": { 3 | "directories": { 4 | "baseURL": "src" 5 | }, 6 | "dependencies": {}, 7 | "devDependencies": { 8 | "babel": "npm:babel-core@^5.8.24", 9 | "babel-runtime": "npm:babel-runtime@^5.8.24", 10 | "core-js": "npm:core-js@^1.1.4", 11 | "traceur": "github:jmcriffey/bower-traceur@0.0.91", 12 | "traceur-runtime": "github:jmcriffey/bower-traceur-runtime@0.0.91" 13 | } 14 | }, 15 | "dependencies": { 16 | "better-assert": "^1.0.2", 17 | "gulp": "^3.9.1", 18 | "gulp-sourcemaps": "^2.0.0-alpha", 19 | "jspm": "^0.16.34", 20 | "through2": "^2.0.1" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /demo/src/config.js: -------------------------------------------------------------------------------- 1 | System.config({ 2 | defaultJSExtensions: true, 3 | transpiler: "traceur", 4 | paths: { 5 | "github:*": "jspm_packages/github/*", 6 | "npm:*": "jspm_packages/npm/*" 7 | }, 8 | 9 | map: { 10 | "babel": "npm:babel-core@5.8.25", 11 | "babel-runtime": "npm:babel-runtime@5.8.25", 12 | "core-js": "npm:core-js@1.1.4", 13 | "traceur": "github:jmcriffey/bower-traceur@0.0.91", 14 | "traceur-runtime": "github:jmcriffey/bower-traceur-runtime@0.0.91", 15 | "github:jspm/nodelibs-process@0.1.1": { 16 | "process": "npm:process@0.10.1" 17 | }, 18 | "npm:babel-runtime@5.8.25": { 19 | "process": "github:jspm/nodelibs-process@0.1.1" 20 | }, 21 | "npm:core-js@1.1.4": { 22 | "fs": "github:jspm/nodelibs-fs@0.1.2", 23 | "process": "github:jspm/nodelibs-process@0.1.1", 24 | "systemjs-json": "github:systemjs/plugin-json@0.1.0" 25 | } 26 | } 27 | }); 28 | -------------------------------------------------------------------------------- /demo/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /demo/src/main.js: -------------------------------------------------------------------------------- 1 | import msg from './message' 2 | 3 | document.body.innerHTML += msg; 4 | -------------------------------------------------------------------------------- /demo/src/message.js: -------------------------------------------------------------------------------- 1 | var [a,b] = [2016,1]; 2 | var msg = `Hello from ES${a-b}`; 3 | 4 | export default msg; 5 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var gutil = require('gulp-util'); 2 | var jspm = require('jspm'); 3 | var Liftoff = require('liftoff'); 4 | var through = require('through2'); 5 | var Promise = require('bluebird'); 6 | Promise.longStackTraces(); 7 | var temp = require('temp').track(); 8 | var File = require('vinyl'); 9 | var fs = Promise.promisifyAll(require("fs")); 10 | var path = require('path'); 11 | var projectName = require('./package.json').name; 12 | 13 | 14 | jspm.on('log', function(type, msg) { 15 | var logTypes = ['err', 'warn', 'ok', 'info', 'debug']; 16 | if( logTypes.slice(0,2).indexOf(type) !== -1 ) { 17 | console.error(projectName+':', msg); 18 | return; 19 | } 20 | info_log(msg); 21 | }); 22 | 23 | module.exports = function(opts){ 24 | 25 | return through.obj(function(file, enc, cb){ 26 | 27 | if( file.isNull() ){ 28 | cb(); 29 | return; 30 | } 31 | 32 | if( file.isStream() ){ 33 | this.emit('error', new gutil.PluginError(projectName, 'Streams are not supported.')); 34 | cb(); 35 | return; 36 | } 37 | 38 | var self = this; 39 | var push = this.push.bind(this); 40 | opts = opts || {}; 41 | do_bundle(file, opts) 42 | .then(function(infos){ 43 | // 0ms Timeout in order to stop Promise to catch errors 44 | setTimeout(function(){ 45 | push(infos.bundle.vinyl_file); 46 | cb(); 47 | },0); 48 | }) 49 | .catch(function(error) { 50 | setTimeout(function() { 51 | self.emit('error', new gutil.PluginError(projectName, error)); 52 | cb(); 53 | }, 0); 54 | }); 55 | 56 | }); 57 | 58 | }; 59 | 60 | 61 | function do_bundle(file, opts){ 62 | 63 | info_log.enable = !!opts.verbose; 64 | 65 | return Promise.resolve( 66 | { 67 | jspm: { 68 | baseURL: null, 69 | package_path: null 70 | }, 71 | bundle: { 72 | path: null, 73 | contents: null, 74 | sourceMap: null, 75 | vinyl_file: null 76 | } 77 | } 78 | ) 79 | .then(function(infos){ 80 | info_log('start', infos); 81 | 82 | return ( 83 | get_paths(file.base) 84 | ).then(function(paths){ 85 | jspm.setPackagePath(paths.package_path); 86 | 87 | infos.jspm.package_path = paths.package_path; 88 | infos.jspm.baseURL = paths.baseURL; 89 | 90 | info_log('relevant paths retrieved', infos); 91 | 92 | return infos; 93 | }); 94 | }) 95 | .then(function(infos){ 96 | return ( 97 | Promise.promisify(temp.open)('gulp-jspm__build.js') 98 | ) 99 | .then(function(temp_file){ 100 | infos.bundle.path = temp_file.path; 101 | 102 | info_log('temporary file created', infos); 103 | 104 | return infos; 105 | }); 106 | }) 107 | .then(function(infos){ 108 | var jspm_input = (function(){ 109 | var jspm_input = path.relative(infos.jspm.baseURL, file.path); 110 | if( opts.plugin ) { 111 | jspm_input += '!'; 112 | if( opts.plugin.constructor === String ) { 113 | jspm_input += opts.plugin; 114 | } 115 | } 116 | if( opts.arithmetic ) { 117 | jspm_input += ' ' + opts.arithmetic.trim(); 118 | } 119 | if ( path.sep === '\\' ) { 120 | jspm_input = jspm_input.replace(/\\/g, '/'); 121 | } 122 | return jspm_input; 123 | })(); 124 | 125 | var jspm_output = infos.bundle.path; 126 | 127 | var jspm_opts = (function(){ 128 | var jspm_opts = {}; 129 | for(var i in opts) jspm_opts[i] = opts[i]; 130 | jspm_opts.sourceMaps = jspm_opts.sourceMaps || file.sourceMap; 131 | delete jspm_opts.plugin; 132 | delete jspm_opts.arithmetic; 133 | delete jspm_opts.selfExecutingBundle; 134 | delete jspm_opts.verbose; 135 | return jspm_opts; 136 | })(); 137 | 138 | var method = opts.selfExecutingBundle?'bundleSFX':'bundle'; 139 | 140 | info_log('calling `jspm.'+method+"('"+jspm_input+"','"+jspm_output+"',"+JSON.stringify(jspm_opts)+');`', infos); 141 | 142 | return Promise.resolve( 143 | jspm[method](jspm_input, jspm_output, jspm_opts) 144 | ) 145 | .then(function(){ 146 | info_log('jspm.'+method+'() called', infos); 147 | 148 | return infos; 149 | }); 150 | }) 151 | .then(function(infos){ 152 | return Promise.all( 153 | [ 154 | fs.readFileAsync(infos.bundle.path) 155 | .then(function(file_content){ 156 | if( file.sourceMap ) { 157 | var reSourceMapComment = /\n\/\/# sourceMappingURL=.+?$/; 158 | infos.bundle.contents = new Buffer(file_content.toString().replace(reSourceMapComment,'')); 159 | } 160 | else { 161 | infos.bundle.contents = file_content; 162 | } 163 | }) 164 | ].concat( 165 | ! file.sourceMap ? [] : ( 166 | fs.readFileAsync(infos.bundle.path+'.map') 167 | .then(function(file_content){ 168 | infos.bundle.sourceMap = JSON.parse(file_content.toString()); 169 | }) 170 | ) 171 | ) 172 | ) 173 | .then(function(){ 174 | temp.cleanup(); 175 | 176 | info_log('bundle content and potentially sourceMap content read from temporary file(s)', infos); 177 | 178 | return infos; 179 | }); 180 | }) 181 | .then(function(infos){ 182 | var bundle_file = infos.bundle.vinyl_file = 183 | new File({ 184 | base: file.base , 185 | path: (function nameFile(){ 186 | var basename; 187 | if (opts.fileName && typeof opts.fileName === 'string') { 188 | basename = opts.fileName + '.js'; 189 | } else { 190 | basename = path.basename(file.path); 191 | basename = basename.split('.'); 192 | basename.splice(1, 0, 'bundle'); 193 | basename = basename.join('.'); 194 | } 195 | return path.join(path.dirname(file.path), basename); 196 | })() , 197 | contents: infos.bundle.contents 198 | }); 199 | 200 | bundle_file.originalEntryPoint = file; 201 | 202 | if( file.sourceMap ) { 203 | bundle_file.sourceMap = infos.bundle.sourceMap; 204 | bundle_file.sourceMap.file = bundle_file.relative; 205 | bundle_file.sourceMap.sources = 206 | bundle_file.sourceMap.sources.map(function(relative_to_temp){ 207 | return ( 208 | path.relative( 209 | file.base, 210 | path.resolve( 211 | path.dirname(infos.bundle.path), 212 | relative_to_temp)) 213 | ); 214 | }); 215 | } 216 | 217 | info_log('vinyl_file for stream created', infos); 218 | 219 | return infos; 220 | }); 221 | } 222 | 223 | function get_paths(directory){ 224 | return new Promise(function(resolve){ 225 | new Liftoff({ 226 | name: 'jspm', 227 | configName: 'package', 228 | extensions: { 229 | '.json': null 230 | } 231 | }) 232 | .launch({ 233 | cwd: directory 234 | }, function(env) { 235 | 236 | resolve({ 237 | baseURL: (function(){ 238 | if( env.configBase ) { 239 | var package_info = require(env.configPath); 240 | if( 241 | package_info && 242 | package_info.jspm && 243 | package_info.jspm.directories && 244 | package_info.jspm.directories.baseURL ) { 245 | var baseURL = package_info.jspm.directories.baseURL; 246 | return path.join(env.configBase, baseURL); 247 | } 248 | } 249 | return env.configBase; 250 | })(), 251 | package_path: env.configBase 252 | }); 253 | 254 | }); 255 | }); 256 | } 257 | 258 | function info_log(message, infos) { 259 | if( ! info_log.enable ) { 260 | return; 261 | } 262 | console.log(projectName+':', message); 263 | if( infos ) { 264 | console.log('[[ collected information at this point;\n', infos, ']]'); 265 | } 266 | } 267 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gulp-jspm", 3 | "version": "0.5.13", 4 | "description": "gulp plugin to build assets loaded with jspm/SystemJS", 5 | "main": "index.js", 6 | "dependencies": { 7 | "bluebird": "^3.3.5", 8 | "gulp-util": "^3.0.7", 9 | "jspm": "^0.16.34", 10 | "liftoff": "^2.2.1", 11 | "mini-assert": "^1.0.7", 12 | "temp": "^0.8.3", 13 | "through2": "^2.0.1", 14 | "vinyl": "^1.1.1" 15 | }, 16 | "devDependencies": { 17 | "better-assert": "^1.0.2", 18 | "gulp": "^3.9.1", 19 | "istanbul": "^0.4.3", 20 | "mocha": "^2.4.5" 21 | }, 22 | "scripts": { 23 | "test": "./node_modules/mocha/bin/mocha" 24 | }, 25 | "keywords": [ 26 | "gulpplugin", 27 | "jspm", 28 | "systemjs" 29 | ], 30 | "repository": "github:brillout/gulp-jspm" 31 | } 32 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | var assert = require("better-assert"); 2 | var stream_assert = require("./stream-assert.js"); 3 | var gulp = require('gulp'); 4 | var gulp_jspm = require('../index.js'); 5 | var through2 = require('through2'); 6 | var path = require('path'); 7 | var fs = require('fs'); 8 | require('mocha'); 9 | 10 | 11 | var script_path = path.resolve(__dirname,'../demo/src/main.js'); 12 | 13 | describe('test setup', function() { 14 | var content; 15 | 16 | it('should have the ES2015 test script', function() { 17 | content = fs.readFileSync(script_path).toString(); 18 | }); 19 | 20 | it('test script should import message.js', function() { 21 | assert( /import.*message/.test(content) ); 22 | }); 23 | 24 | }); 25 | 26 | describe('gulp_jspm()', function() { 27 | 28 | var stream = gulp.src(script_path); 29 | 30 | it('should not throw any errors', function(done) { 31 | this.timeout(4000); 32 | stream = 33 | stream 34 | .pipe(through2.obj(function(file, enc, cb){ 35 | file.sourceMap = true; 36 | this.push(file); 37 | cb(); 38 | })) 39 | .pipe(gulp_jspm()) 40 | .pipe(stream_assert.done(done)); 41 | }); 42 | 43 | it('should return one file', function(done) { 44 | stream = 45 | stream 46 | .pipe(stream_assert.length(1)) 47 | .pipe(stream_assert.done(done)); 48 | }); 49 | 50 | it("should return the bundle's content", function(done){ 51 | stream = 52 | stream 53 | .pipe(stream_assert.test(function(bundle_file) { 54 | assert( bundle_file.contents ); 55 | assert( /System\.register\("main.js".*message/.test( bundle_file.contents ) ); 56 | assert( /System\.register\("message.js"/.test( bundle_file.contents.toString() ) ); 57 | })) 58 | .pipe(stream_assert.done(done)); 59 | }); 60 | 61 | it("should return the bundle's source map", function(done){ 62 | stream = 63 | stream 64 | .pipe(stream_assert.test(function(bundle_file) { 65 | assert( bundle_file.sourceMap ); 66 | assert( bundle_file.sourceMap.sources ); 67 | assert( bundle_file.sourceMap.sources.indexOf( 'main.js' ) !== -1 ); 68 | assert( bundle_file.sourceMap.sources.indexOf( 'message.js' ) !== -1 ); 69 | })) 70 | .pipe(stream_assert.done(done)); 71 | }); 72 | 73 | it("should prepend `.bundle` to filename extension", function(done){ 74 | stream = 75 | stream 76 | .pipe(stream_assert.test(function(bundle_file) { 77 | assert( bundle_file.relative === 'main.bundle.js' ); 78 | })) 79 | .pipe(stream_assert.done(done)); 80 | }); 81 | 82 | it("should support arithmetics", function(done){ 83 | gulp.src(script_path) 84 | .pipe(gulp_jspm({arithmetic:' - message '})) 85 | .pipe(stream_assert.test(function(bundle_file) { 86 | assert( bundle_file.contents ); 87 | assert( /System\.register\("main.js".*message/.test( bundle_file.contents ) ); 88 | assert( ! /System\.register\("message.js"/.test( bundle_file.contents.toString() ) ); 89 | })) 90 | .pipe(stream_assert.done(done)); 91 | }); 92 | 93 | }); 94 | -------------------------------------------------------------------------------- /test/stream-assert.js: -------------------------------------------------------------------------------- 1 | // for our tests this is better than require('stream-assert'); 2 | var through2 = require('through2'); 3 | 4 | 5 | module.exports = { 6 | test: test, 7 | done: done, 8 | length: length 9 | }; 10 | 11 | function test(test_fct){ 12 | return through2.obj( 13 | function(file, enc, cb){ 14 | test_fct(file); 15 | this.push(file); 16 | cb(); 17 | } 18 | ); 19 | } 20 | 21 | function done(done){ 22 | return through2.obj( 23 | function(file, enc, cb){ 24 | this.push(file); 25 | cb(); 26 | } , 27 | function(cb){ 28 | done(); 29 | cb(); 30 | } 31 | ); 32 | } 33 | 34 | function length(length){ 35 | var count = 0; 36 | return through2.obj( 37 | function(file, enc, cb){ 38 | count++; 39 | this.push(file); 40 | cb(); 41 | } , 42 | function(cb){ 43 | if( count !== length ) 44 | throw new Error('Stream should pipe '+length+' element but is piping '+count+' element instead'); 45 | cb(); 46 | } 47 | ); 48 | } 49 | 50 | --------------------------------------------------------------------------------