├── .gitignore ├── .npmignore ├── README.md ├── cli.js ├── demo ├── .gitignore ├── package.json ├── rollup.config.js └── src │ ├── App.jsx │ ├── index.js │ └── message.js ├── index.js ├── package-lock.json ├── package.json └── test ├── dist └── bundle.js ├── package-lock.json ├── package.json ├── rollup.config.js ├── src ├── App.jsx ├── index.js └── message.js ├── test.js └── untouched_src ├── App.jsx ├── index.js └── message.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | 3 | *.sw? 4 | *.DS_Store 5 | 6 | *.log 7 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | 3 | *.sw? 4 | *.DS_Store 5 | 6 | *.log 7 | 8 | demo 9 | test 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # wrollup - Simple watcher for rollup 2 | 3 | ![](https://fat.gfycat.com/FelineAffectionateCockerspaniel.gif) 4 | 5 | [![npm](https://img.shields.io/npm/v/wrollup.svg?maxAge=3600)](https://www.npmjs.com/package/wrollup) 6 | [![npm](https://img.shields.io/npm/dm/wrollup.svg?maxAge=3600)](https://www.npmjs.com/package/wrollup) 7 | [![npm](https://img.shields.io/npm/l/wrollup.svg?maxAge=3600)](https://www.npmjs.com/package/wrollup) 8 | 9 | ## Simple to use 10 | ```bash 11 | npm install -g wrollup 12 | wrollup -c rollup.config.js 13 | ``` 14 | 15 | # About 16 | A simple watcher for building rollup bundles inspired by the https://github.com/stylus/stylus watcher 17 | 18 | # Why 19 | The plugin 'rollup-watch' is pretty OK, but has a few issues like not being able to recover, hanging forever when not connected to the internet -- all in all a bit of a pain to deal with. wrollup is intended to make the watching and bundle process as smooth as possible. 20 | 21 | # How 22 | Using a similar init process we use rollup internally to parse the rollup.config.js file and star the watcher with a set of streamlined logging procedure (similar to stylus-lang) and pretty error parsing. 23 | 24 | # Arguments 25 | ```bash 26 | $ wrollup --help 27 | 28 | Usage: wrollup [options] 29 | 30 | Examples: 31 | 32 | wrollup -c rollup.config.js 33 | wrollup --verbose --error-glob "scripts/**/*.(ts|tsx|js)" 34 | wrollup --help 35 | 36 | Options: 37 | 38 | -c, --config Specify path to rollup.config.js 39 | --error-glob, --files Specify glob of files to watch on rollup error/crash 40 | for auto-recovery (defaults to \'**/*.js*\') 41 | --verbose Wrollup will console.log some extra info of 42 | what is going on 43 | --disable-cache, --nocache Disable bundle caching 44 | --cache-before-disk Generate cache before bundle written to disk 45 | -h, --help Display help information 46 | ``` 47 | 48 | # Installation 49 | ```bash 50 | npm install --save-dev wrollup # locally (for use with npm scripts) 51 | ``` 52 | or 53 | ```bash 54 | npm install -g wrollup # globally (not recommended) 55 | ``` 56 | 57 | # Requirements 58 | Rollup 59 | ```bash 60 | npm install --save-dev rollup # locally (for use with npm scripts) 61 | ``` 62 | or 63 | ```bash 64 | npm install -g rollup # globally (not recommended) 65 | ``` 66 | 67 | A rollup config file (looks for rollup.config.js by default). A basic one can be for example: 68 | ```js 69 | import buble from 'rollup-plugin-buble' 70 | import nodeResolve from 'rollup-plugin-node-resolve' 71 | import commonjs from 'rollup-plugin-commonjs' 72 | 73 | export default { 74 | entry: 'src/index.js', // required 75 | dest: 'dist/bundle.js', // required 76 | format: 'iife', // required 77 | plugins: [ 78 | buble(), 79 | nodeResolve(), 80 | commonjs({ 81 | include: 'node_modules/**' 82 | }) 83 | ] 84 | } 85 | ``` 86 | -------------------------------------------------------------------------------- /cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | require('./index.js') 3 | -------------------------------------------------------------------------------- /demo/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | -------------------------------------------------------------------------------- /demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "start": "../cli.js -c rollup.config.js", 4 | "startwooster": "../cli.js -c rollup.config.js 2>&1 | /Users/mollie/code/wooster/cli.js", 5 | "startcli": "../cli.js --input src/index.js --output dist/bundle.js -f iife -c node:buble -c node:nodeResolve node:commonjs" 6 | }, 7 | "devDependencies": { 8 | "rollup": "^0.41.6", 9 | "rollup-plugin-buble": "^0.13.0", 10 | "rollup-plugin-commonjs": "^3.3.1", 11 | "rollup-plugin-node-resolve": "^2.1.1" 12 | }, 13 | "dependencies": { 14 | "react": "^15.5.4" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /demo/rollup.config.js: -------------------------------------------------------------------------------- 1 | import buble from 'rollup-plugin-buble' 2 | import nodeResolve from 'rollup-plugin-node-resolve' 3 | import commonjs from 'rollup-plugin-commonjs' 4 | 5 | export default { 6 | entry: 'src/index.js', 7 | dest: 'dist/bundle.js', 8 | format: 'iife', 9 | plugins: [ 10 | buble(), 11 | nodeResolve(), 12 | commonjs({ 13 | include: 'node_modules/**' 14 | }) 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /demo/src/App.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const Component = React.createClass({ 4 | render: function () { 5 | return ( 6 |
Component { (new Date()).toLocaleString() }
7 | ) 8 | } 9 | }) 10 | 11 | export default Component 12 | -------------------------------------------------------------------------------- /demo/src/index.js: -------------------------------------------------------------------------------- 1 | import message from './message' 2 | 3 | import React from 'react' 4 | 5 | console.log('Hello world, message: ' + message) 6 | 7 | import App from './App.jsx' 8 | 9 | // fake react 10 | // var React = { 11 | // createElement: function (el, props) { 12 | // return String(el) 13 | // } 14 | // } 15 | 16 | console.log(
) 17 | console.log() 18 | -------------------------------------------------------------------------------- /demo/src/message.js: -------------------------------------------------------------------------------- 1 | export default 'yippeee, yaahhoooo, waaahhoooooo' 2 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | try { 4 | var rollupFound = require.resolve('rollup') 5 | } catch (err) { 6 | var rollupRequiredErrorMessage = [ 7 | '' 8 | , ' `rollup` was not found (error)' 9 | , '' 10 | , ' `wrollup` needs `rollup` to work, you should be building with rollup directly' 11 | , ' and use wrollup for development' 12 | , '' 13 | , '' 14 | , ' npm scripts example:' 15 | , '' 16 | , ' "scripts": {' 17 | , ' "build-js": "rollup -c rollup.config.js"' 18 | , ' "watch-js": "wrollup -c rollup.config.js"' 19 | , ' }' 20 | , '' 21 | , '' 22 | , ' Please install rollup alongside wrollup:' 23 | , '' 24 | , ' npm install --save-dev rollup wrollup # locally for use with npm scripts' 25 | , ' npm install -g rollup wrollup # globally (not recommended)' 26 | , '' 27 | ].join('\n') 28 | 29 | console.error(rollupRequiredErrorMessage) 30 | process.exit(err.code) 31 | } 32 | 33 | var rollup = require('rollup') 34 | // var chokidar = require('chokidar') 35 | var chalk = require('chalk') 36 | var fs = require('fs') 37 | var minimist = require('minimist') 38 | 39 | var os = require('os') 40 | 41 | // var pw = require('../poll-watch/index.js') 42 | var pw = require('poll-watch') 43 | 44 | var realpathSync = fs.realpathSync 45 | 46 | var options = {} 47 | 48 | var command = minimist( process.argv.slice( 2 ), { 49 | alias: { 50 | // Aliases 51 | strict: 'useStrict', 52 | 53 | // Short options 54 | c: 'config', 55 | d: 'indent', 56 | e: 'external', 57 | f: 'format', 58 | g: 'globals', 59 | h: 'help', 60 | i: 'input', 61 | l: 'legacy', 62 | m: 'sourcemap', 63 | n: 'name', 64 | o: 'output', 65 | u: 'id', 66 | v: 'version', 67 | w: 'watch' 68 | } 69 | }) 70 | 71 | var argv = command // alias 72 | 73 | var usage = [ 74 | '' 75 | , ' Usage: wrollup [options]' 76 | , '' 77 | , ' Requirements: rollup' 78 | , '' 79 | , ' npm install -g rollup Install globally (not recommended)' 80 | , ' npm install --save-dev rollup Install locally (recommended)' 81 | , '' 82 | , ' Examples:' 83 | , '' 84 | , ' wrollup -c rollup.config.js' 85 | , ' wrollup --verbose --error-glob "scripts/**/*.(ts|tsx|js)"' 86 | , ' wrollup --help' 87 | , '' 88 | , ' Options:' 89 | , '' 90 | , ' -c, --config Specify path to rollup.config.js' 91 | , ' --error-glob, --files Specify glob of files to watch on rollup error/crash' 92 | , ' for auto-recovery (defaults to \'**/*.js*\')' 93 | , ' --verbose Wrollup will console.log some extra info of' 94 | , ' what is going on' 95 | , ' --disable-cache, --nocache Disable bundle caching' 96 | , ' --cache-before-disk Generate cache before bundle written to disk' 97 | , ' -v, --version Display wrollup and rollup versions' 98 | , ' -h, --help Display help information' 99 | , '' 100 | ].join('\n') 101 | 102 | if ( command.help || ( process.argv.length <= 2 && process.stdin.isTTY ) ) { 103 | console.error(usage) 104 | process.exit() // exit success 105 | } 106 | 107 | if ( command.version ) { 108 | var packageJson = require('./package.json') 109 | var versions = [ 110 | '' 111 | , 'wrollup version: ' + (packageJson['VERSION'] || packageJson['version']) 112 | , 'rollup version: ' + (rollup['VERSION'] || rollup['version']) 113 | , '' 114 | ].join('\n') 115 | console.error(versions) 116 | process.exit() // exit success 117 | } 118 | 119 | var verbose = !!command.verbose // for debugging 120 | var nolazy = !!(command['nolazy'] || command['cache-before-disk']) 121 | 122 | // var relative = require('require-relative') 123 | // var nodeResolve = require('rollup-plugin-node-resolve') 124 | // var commonjs = require('rollup-plugin-commonjs') 125 | 126 | var requireFromString = require('require-from-string') 127 | 128 | var __last_error = null 129 | 130 | var __error_timeout = null 131 | var __warning_timeout = null 132 | 133 | function cc (text, code) { 134 | // return ('\033[' + code + text + '\033[0m') 135 | return ('\u001b[' + code + text + '\u001b[0m') 136 | 137 | } 138 | 139 | var c = { 140 | 'cyan': '36m', 141 | 'magenta': '35m', 142 | 'blue': '34m', 143 | 'yellow': '33m', 144 | 'green': '32m', 145 | 'red': '31m', 146 | 'gray': '90m', 147 | } 148 | 149 | var path = require('path') 150 | var __path = path 151 | 152 | // var _eval = require('eval') 153 | 154 | var ENABLE_CACHE = !(!!argv['nocache'] || !!argv['disable-cache']) 155 | var cache = undefined 156 | var lazyCachedBundle = undefined // workarond for: https://github.com/rollup/rollup/issues/1010 157 | var watchers = {} 158 | 159 | // chalk colours 160 | var colors = ['green', 'yellow', 'blue', 'cyan', 'magenta', 'white'] 161 | 162 | var allProjectFilesGlob = argv['files'] || argv['error-glob'] || '**/*.js*' 163 | 164 | var configPath = undefined 165 | 166 | // return console.log('configPath: ' + configPath) 167 | 168 | // process.chdir(path.dirname(configPath)) 169 | 170 | // TODO build rollup options object based on the command line arguments 171 | // ref: https://github.com/rollup/rollup/blob/master/bin/src/runRollup.js 172 | function parseRollupArgs () { 173 | if ( command._.length > 1) { 174 | console.error('wrollup can only bundle one file at a time') 175 | process.exit(1) 176 | } 177 | 178 | if ( command._.length === 1 ) { 179 | if ( command.input ) { 180 | console.error('use --input, or pass input as path as argument') 181 | process.exit(1) 182 | } 183 | 184 | command.input = command._[0] 185 | } 186 | 187 | if ( command.environment ) { 188 | command.environment.split( ',' ).forEach( function ( pair ) { 189 | const index = pair.indexOf( ':' ) 190 | if ( ~index ) { 191 | process.env[ pair.slice( 0, index ) ] = pair.slice( index + 1 ) 192 | } else { 193 | process.env[ pair ] = true 194 | } 195 | }) 196 | } 197 | 198 | var config = command.config === true ? 'rollup.config.js' : command.config 199 | configPath = config 200 | if ( config && config.slice( 0, 5 ) !== 'node:' ) { 201 | try { 202 | fs.readFileSync(configPath) 203 | 204 | // parse the rollup.config.js file with rollup 205 | rollup.rollup({ 206 | entry: configPath, 207 | onwarn: function (message) { 208 | if ( /Treating .+ as external dependency/.test( message ) ) return 209 | printError( message ) 210 | //setupGlobalWatcher() 211 | } 212 | // plugins: [ nodeResolve(), commonjs() ] 213 | }).then(function (bundle) { 214 | var result = bundle.generate({ format: 'cjs' }) 215 | var opts = requireFromString(result.code) 216 | // console.log(opts) 217 | init(opts) 218 | }).then(function () { 219 | verbose && console.log(chalk.yellow('initliaized')) 220 | }, function (err) { 221 | throw err 222 | }) 223 | 224 | } catch (err) { 225 | console.error('no rollup.config.js found at [$1]'.replace('$1', configPath)) 226 | throw err 227 | } 228 | } else { 229 | var equivalents = { 230 | useStrict: 'useStrict', 231 | banner: 'banner', 232 | footer: 'footer', 233 | format: 'format', 234 | globals: 'globals', 235 | id: 'moduleId', 236 | indent: 'indent', 237 | input: 'entry', 238 | intro: 'intro', 239 | legacy: 'legacy', 240 | name: 'moduleName', 241 | output: 'dest', 242 | outro: 'outro', 243 | sourcemap: 'sourceMap', 244 | treeshake: 'treeshake' 245 | } 246 | 247 | var opts = {} 248 | Object.keys( equivalents ).forEach(function ( cliOption ) { 249 | if ( command.hasOwnProperty( cliOption ) ) { 250 | opts[ equivalents[ cliOption ] ] = command[ cliOption ] 251 | } 252 | }) 253 | 254 | init(opts) 255 | } 256 | } 257 | 258 | parseRollupArgs() 259 | 260 | // try { 261 | // var config = fs.readFileSync(configPath) 262 | // } catch (err) { 263 | // console.error('no rollup.config.js found at [$1]'.replace('$1', configPath)) 264 | // throw err 265 | // } 266 | 267 | const stderr = console.error.bind( console ) 268 | var mtimes = {} 269 | 270 | // used to listen for change on all source files when an error occurs 271 | // in order to re-initliaize source watching/bundling 272 | var globalWatcher = undefined 273 | var buildWatcher = pw.create() 274 | 275 | var _globalWatcherTimeout = null 276 | function setupGlobalWatcher () { 277 | if (globalWatcher === undefined) { 278 | buildWatcher.close() // stop watching build resources 279 | 280 | verbose && console.log(cc('starting build error watcher ' + allProjectFilesGlob, c['yellow'])) 281 | 282 | var glob = require('glob') 283 | glob(allProjectFilesGlob, function (err, files) { 284 | if (err) throw err 285 | 286 | globalWatcher = pw.create() 287 | // pw.clear() 288 | files.forEach(function (file) { 289 | // console.log('watching file: ' + file) 290 | var w = globalWatcher.watch(file) 291 | w.on(function (data) { 292 | // console.log('modification from: ' + file) 293 | triggerRebuild(file) 294 | }) 295 | }) 296 | }) 297 | } else { 298 | verbose && console.log(cc('build error watcher still ready [' + allProjectFilesGlob + ']', c['yellow'])) 299 | } 300 | } 301 | 302 | function init (opts) { 303 | options = Object.assign({}, opts) 304 | // console.log(options) 305 | build(true) 306 | } 307 | 308 | function log (text) { 309 | // console.log(chalk.gray(text)) 310 | } 311 | 312 | // source: https://github.com/facebookincubator/create-react-app/b/m/s/start.js#L69-L73 313 | function clearConsole () { 314 | // This seems to work best on Windows and other systems. 315 | // The intention is to clear the output so you can focus on most recent build. 316 | process.stdout.write('\x1bc') 317 | } 318 | 319 | function sliceOfFile (file, pos) { 320 | // console.log('slice file: ' + file) 321 | // console.log('slice pos: ' + pos) 322 | var errorLineNumber = pos.line - 1 323 | var column = pos.column 324 | var contents = fs.readFileSync(file, 'utf8') 325 | var lines = contents.split('\n') 326 | 327 | var line, index, i 328 | // find last non-empty line 329 | for (i = 0; i < lines.length; i++) { 330 | index = errorLineNumber - i 331 | line = lines[index] 332 | if (line.trim()) { 333 | // non-empty line found 334 | errorLineNumber = index 335 | break 336 | } 337 | 338 | // console.log('line was empty') 339 | // column data is corrupted, is probably last charater of previous line 340 | column = -1 341 | } 342 | 343 | // grab last 8 lines 344 | var linesBelow = 3 345 | var linesAbove = 5 346 | var results = [] 347 | var errorLineIndex = 0 348 | for (i = 0; i <= (linesBelow + linesAbove); i++) { 349 | index = errorLineNumber + i - linesAbove 350 | if (index === errorLineNumber) errorLineIndex = (results.length + 1) 351 | if (index >= 0 && index < lines.length) { 352 | var l = lines[index] 353 | // parse away distracting character escapes 354 | l = l.split('\'').join('"') 355 | // var prefix = (' ' + (index + 1) + '| ') 356 | results.push({ 357 | line: l, 358 | lineNumber: index + 1 359 | }) 360 | } 361 | } 362 | 363 | // calculate minimum start indentation we can slice off 364 | // without affecting relative indentation 365 | var minLeftPadding = 999 366 | results.forEach(function (item) { 367 | var counter = 0 368 | for (var i = 0; i < item.line.length; i++) { 369 | if (item.line[i].trim().length === 0) continue 370 | minLeftPadding = Math.min(minLeftPadding, i) 371 | break 372 | } 373 | }) 374 | 375 | // cut off the extra start indentation 376 | results = results.map(function (item) { 377 | item.line = item.line.slice(minLeftPadding) 378 | return item 379 | }) 380 | 381 | // add line numbers to lines, pad by biggest line number 382 | var lineLeftPadding = String(results[results.length - 1].lineNumber).length + 1 383 | // console.log('lineLeftPadding: ' + lineLeftPadding) 384 | var resultLines = results.map(function (item) { 385 | var length = String(item.lineNumber).length 386 | var delta = (lineLeftPadding - length) 387 | var prefix = ' ' 388 | while (--delta > 0) prefix += ' ' 389 | prefix += String(item.lineNumber) 390 | prefix += '| ' 391 | return (prefix + item.line) 392 | }) 393 | 394 | results = resultLines 395 | 396 | // lastly push in small arrow indicator after the error line 397 | // var lastLine = results[results.length - 1] 398 | var indicator = [] 399 | for (i = 0; i < (column + lineLeftPadding + 2 - minLeftPadding); i++) indicator.push('-') 400 | if (column < 0) { 401 | indicator.push('^') 402 | } else { 403 | indicator[(column + lineLeftPadding + 2 - minLeftPadding)] = '^' 404 | } 405 | 406 | var arrowLine = indicator.join('') 407 | results = results.slice(0, errorLineIndex) 408 | .concat([arrowLine]) 409 | .concat(results.slice(errorLineIndex)) 410 | results.push('') 411 | 412 | return results 413 | } 414 | 415 | var buildTimeout = null 416 | var _timeout = null 417 | function triggerRebuild (path) { 418 | if (options && path.indexOf(options.dest) !== -1) { 419 | verbose && console.log(chalk.yellow('ignoring trigger from destination bundle')) 420 | return undefined 421 | } 422 | 423 | var target = path 424 | 425 | // console.log(chalk.yellow('trigger from target [' + chalk.magenta(target) + ']')) // TODO 426 | var relativePath = './' + __path.relative(process.cwd(), __path.resolve(path)) 427 | console.log(cc('modification from', c['cyan']) + ' %s', relativePath); 428 | // console.log(cc('modification from', c['cyan']) + ' %s', path); 429 | 430 | verbose && console.log(chalk.yellow('trigger from target [' + chalk.magenta(target) + ']')) 431 | fs.stat(target, function (err, stats) { 432 | if (err) throw err 433 | 434 | if (mtimes[target] === undefined || stats.mtime > mtimes[target]) { 435 | mtimes[target] = stats.mtime 436 | clearTimeout(buildTimeout) 437 | buildTimeout = setTimeout(function () { 438 | build() 439 | }, 33) 440 | } else { 441 | // ignore, nothing modified 442 | verbose && console.log('-- nothing modified --') 443 | } 444 | }) 445 | } 446 | 447 | function honeydripError (err) { 448 | // console.log('honeydripping') 449 | try { 450 | // console.log('---- KEYS ----') 451 | // console.log(Object.keys(err)) 452 | // console.log('-------------') 453 | // console.log(err.id) 454 | // console.log('-------------') 455 | 456 | var honey = Object.assign({}, err) 457 | var type = err.stack.substring(0, err.stack.indexOf(':')) 458 | var info = err.stack.substring(0, err.stack.indexOf('/')) 459 | var file = honey.file || honey.id 460 | info += '[' + file.substring(file.lastIndexOf('/') + 1) + ']' 461 | honey.type = type 462 | honey.info = info 463 | 464 | var e = { 465 | type: honey.code || info.substring(0, info.indexOf(':')), 466 | msg: info.substring(info.indexOf(':') + 1, info.indexOf('[')), 467 | file: file, 468 | stub: file.substring(file.lastIndexOf('/') + 1), 469 | path: file.substring(0, file.lastIndexOf('/') + 1) 470 | } 471 | honey.info = e 472 | 473 | honey.slice = sliceOfFile(file, honey.loc) 474 | return [e.type, honey.loc, honey.info, honey.slice] 475 | } catch (e) { 476 | //console.error(e) 477 | // return e // return honey error for debugging purposes 478 | return err // return original error (probably a warning) 479 | } 480 | } 481 | 482 | function generateLazyCache () { 483 | if (nolazy) return 484 | // has to do with workaround for: https://github.com/rollup/rollup/issues/1010 485 | setTimeout(function () { 486 | lazyCachedBundle = JSON.parse(JSON.stringify(cache)) 487 | verbose && console.log(chalk.yellow('lazyCachedBundle pre-generated for the next bundle')) 488 | verbose && console.log(chalk.yellow('')) 489 | }, 0) 490 | } 491 | 492 | function build (precache) { 493 | // clearConsole() 494 | verbose && console.log(chalk.gray('bundling... [' + chalk.blue((new Date().toLocaleString())) + ']')) 495 | 496 | var opts = Object.assign({}, options) 497 | 498 | // use cache if available 499 | if (ENABLE_CACHE && cache && opts) { 500 | if (verbose && !nolazy) { 501 | if (lazyCachedBundle) { 502 | console.log(chalk.yellow('using lazyCachedBundle')) 503 | } else { 504 | // console.log(chalk.yellow('no lazyCachedBundle, generating cache...')) 505 | } 506 | } 507 | 508 | // this work-around is needed for rollup v0.35.0-> currently 509 | // rollup version 0.34.13 is the latest that works fine 510 | // the issue seems to lie in rollup implemetning a deepClone fn 511 | // in this commit: https://github.com/rollup/rollup/commit/83ccb9725374e0fde9d07043959c397b15d26c67#diff-5c98da346b849e07de8c1173579789b0L320 512 | // 513 | // for more info see the issue on github: https://github.com/rollup/rollup/issues/1010 514 | if (!nolazy) { 515 | verbose && console.log(chalk.yellow('no lazyCachedBundle, generating cache...')) 516 | opts.cache = lazyCachedBundle || JSON.parse(JSON.stringify(cache)) 517 | // try and do the workaround cache after the build is complete 518 | // so that the build times aren't noticably affected 519 | lazyCachedBundle = undefined 520 | // generateLazyCache() function is called after bundle has compiled 521 | // to pre-generate the lazyCachedBundle for the next bundle generation 522 | } else { 523 | // use rollups internal caching without the workaround fix 524 | // the workaround is needed for v0.35.0 -> onwards [6th Oct 2016] 525 | opts.cache = cache 526 | verbose && console.log(chalk.yellow('--nolazy set')) 527 | } 528 | } else { 529 | if (verbose) { 530 | if (!ENABLE_CACHE) { 531 | console.log(chalk.yellow('--nocache set, not using cache')) 532 | } else { 533 | console.log(chalk.yellow('no cache found, probably initial build')) 534 | } 535 | } 536 | } 537 | 538 | var buildStart = Date.now() 539 | 540 | function throwWarning () { 541 | } 542 | 543 | opts.onwarn = function (warning) { 544 | throwWarning(warning) 545 | } 546 | 547 | rollup.rollup(opts).then(function (bundle) { 548 | cache = bundle 549 | 550 | // close globalWatcher if it was on 551 | if (globalWatcher !== undefined) { 552 | verbose && console.log(cc('removing global error watcher (successful build)', c['yellow'])) 553 | globalWatcher.close() 554 | globalWatcher = undefined 555 | watchers = {} 556 | buildWatcher.clear() 557 | } 558 | 559 | for (let i = 0; i < bundle.modules.length; i++) { 560 | let module = bundle.modules[i] 561 | let id = module.id 562 | // log('[' + module.id + '] for loop, index: ' + i) 563 | 564 | // skip plugin helper modules 565 | if (/\0/.test(id)) { 566 | log(chalk.yellow('skipping helper module')) 567 | continue 568 | } 569 | 570 | // resolve symlinks to avoid duplicate watchers 571 | // https://github.com/rollup/rollup-watch/commit/b5aac3ae997955a1aa30aeeb3fe708f468b7e368 572 | try { 573 | id = fs.realpathSync( id ) 574 | } catch ( err ) { 575 | return undefined 576 | } 577 | 578 | if (watchers[id] === undefined) { 579 | var cwd = process.cwd() 580 | var base = cwd.substring( cwd.lastIndexOf('/') ) 581 | var filePath = base + id.substring( cwd.length ) 582 | 583 | // ignore node_modules 584 | if (filePath.toLowerCase().indexOf('node_modules') === -1) { 585 | var w = buildWatcher.watch(id) 586 | w.on(function () { 587 | triggerRebuild(id) 588 | }) 589 | watchers[id] = w 590 | console.log(' \u001b[90mwatching\u001b[0m %s', filePath); 591 | } else { 592 | // dont watch node_modules 593 | } 594 | } 595 | } 596 | 597 | if (precache) { 598 | setTimeout(function () { 599 | // console.log(' -- first -- ') 600 | build() 601 | // console.log(' -- --- -- ') 602 | }, 1) 603 | return { then: function () { /* console.log(' -- precache -- ') */ } } 604 | } else { 605 | return bundle.write(opts) 606 | } 607 | }).then(function () { 608 | generateLazyCache() 609 | 610 | // console.log('XXXXXXXXXXXXXXXXXX') 611 | // console.log('XXXXXXXXXXXXXXXXXX') 612 | // console.log(a) 613 | // console.log(b) 614 | // console.log(c) 615 | // console.log('XXXXXXXXXXXXXXXXXX') 616 | // console.log('XXXXXXXXXXXXXXXXXX') 617 | 618 | var delta = Date.now() - buildStart 619 | log('bundling took: ' + chalk.cyan(delta) + ' milliseconds') 620 | log(chalk['green']('Success.')) 621 | 622 | // var str = (chalk.gray('compiled ') + options.dest) 623 | // process.stdout.write(str) 624 | 625 | var filePath = options.dest || 'successfully' 626 | //console.log(' \033[90mcompiled\033[0m %s', filePath); 627 | console.log(cc('compiled', c['gray']) + ' %s', filePath); 628 | 629 | // create dots after success message to more easily 630 | // distinguish between old and new rebuilds 631 | // for (var i = 0; i < 22; i++) { 632 | // setTimeout(function () { 633 | // process.stdout.write(chalk['green']('.')) 634 | // }, i * 15) 635 | // } 636 | }, function (err) { 637 | // console.log('log: in error') 638 | // console.error('err: in error') 639 | // console.log('error') 640 | // console.log(err) 641 | var honey = honeydripError(err) 642 | 643 | try { 644 | var error = [] 645 | // error.push('') 646 | // error.push('\n') 647 | // error.push(cc('-------------------', c['gray'])) 648 | // error.push('\n') 649 | 650 | // error.push(chalk.gray('``` \033[31m' + honey[0] + '\033[0m')) 651 | var errLocationString = '' 652 | if (honey && honey[1] && honey[1].line && honey[1].column) { 653 | errLocationString = ' (' + cc(honey[1].line, c['red']) + ':' + cc(honey[1].column, c['red']) + ')' 654 | } 655 | error.push(cc('``` ', c['gray']) + cc(honey[0], c['red']) + errLocationString) 656 | 657 | honey[3].forEach(function (line) { error.push(line) }) 658 | // console.log('```') 659 | // console.log(honey[2]) 660 | var e = honey[2] 661 | error.push(cc(e.type, c['magenta']) + ':' + e.msg + '[' + cc(e.stub, c['magenta']) + ']') 662 | error.push(cc('url: ' + e.path, c['gray']) + cc(e.stub, c['magenta'])) 663 | 664 | // console.error(error.join('\n')) 665 | 666 | // console.error(error.join('\n')) 667 | printError(error.join('\n')) 668 | } catch (e) { 669 | // just print the raw error on failure 670 | // console.error(honey) 671 | printError(honey) 672 | } 673 | 674 | // temporary watcher to listen for all changes to rebuild to 675 | //setupGlobalWatcher() 676 | }) 677 | 678 | // console.log('after') 679 | } 680 | 681 | function printError (err) { 682 | if (__last_error != err) { // dont repeat errors/warnings 683 | console.error(err) 684 | __last_error = err 685 | setupGlobalWatcher() // recover watch process after build errors 686 | } 687 | 688 | clearTimeout(__error_timeout) 689 | __error_timeout = setTimeout(function () { 690 | __last_error = null 691 | }, 3000) 692 | } 693 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wrollup", 3 | "version": "0.3.2", 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "acorn": { 7 | "version": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", 8 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" 9 | }, 10 | "ansi-regex": { 11 | "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 12 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 13 | }, 14 | "ansi-styles": { 15 | "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 16 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 17 | }, 18 | "balanced-match": { 19 | "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", 20 | "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" 21 | }, 22 | "brace-expansion": { 23 | "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", 24 | "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=" 25 | }, 26 | "browser-resolve": { 27 | "version": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", 28 | "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", 29 | "dependencies": { 30 | "resolve": { 31 | "version": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 32 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" 33 | } 34 | } 35 | }, 36 | "builtin-modules": { 37 | "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 38 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" 39 | }, 40 | "chalk": { 41 | "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 42 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=" 43 | }, 44 | "concat-map": { 45 | "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 46 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 47 | }, 48 | "core-util-is": { 49 | "version": "1.0.2", 50 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 51 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 52 | "dev": true 53 | }, 54 | "deep-equal": { 55 | "version": "1.0.1", 56 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 57 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", 58 | "dev": true 59 | }, 60 | "define-properties": { 61 | "version": "1.1.2", 62 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", 63 | "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", 64 | "dev": true 65 | }, 66 | "defined": { 67 | "version": "1.0.0", 68 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 69 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 70 | "dev": true 71 | }, 72 | "duplexer": { 73 | "version": "0.1.1", 74 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", 75 | "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", 76 | "dev": true 77 | }, 78 | "es-abstract": { 79 | "version": "1.7.0", 80 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.7.0.tgz", 81 | "integrity": "sha1-363ndOAb/Nl/lhgCmMRJyGI/uUw=", 82 | "dev": true 83 | }, 84 | "es-to-primitive": { 85 | "version": "1.1.1", 86 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", 87 | "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", 88 | "dev": true 89 | }, 90 | "escape-string-regexp": { 91 | "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 92 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 93 | }, 94 | "estree-walker": { 95 | "version": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.2.1.tgz", 96 | "integrity": "sha1-va/oCVOD2EFNXcLs9MkXO225QS4=" 97 | }, 98 | "figures": { 99 | "version": "1.7.0", 100 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 101 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 102 | "dev": true 103 | }, 104 | "for-each": { 105 | "version": "0.3.2", 106 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", 107 | "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=", 108 | "dev": true 109 | }, 110 | "foreach": { 111 | "version": "2.0.5", 112 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", 113 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", 114 | "dev": true 115 | }, 116 | "fs.realpath": { 117 | "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 118 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 119 | "dev": true 120 | }, 121 | "function-bind": { 122 | "version": "1.1.0", 123 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", 124 | "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", 125 | "dev": true 126 | }, 127 | "glob": { 128 | "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 129 | "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", 130 | "dev": true 131 | }, 132 | "has": { 133 | "version": "1.0.1", 134 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", 135 | "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", 136 | "dev": true 137 | }, 138 | "has-ansi": { 139 | "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 140 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=" 141 | }, 142 | "inflight": { 143 | "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 144 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 145 | "dev": true 146 | }, 147 | "inherits": { 148 | "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 149 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 150 | "dev": true 151 | }, 152 | "is-callable": { 153 | "version": "1.1.3", 154 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", 155 | "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", 156 | "dev": true 157 | }, 158 | "is-date-object": { 159 | "version": "1.0.1", 160 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 161 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 162 | "dev": true 163 | }, 164 | "is-finite": { 165 | "version": "1.0.2", 166 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 167 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 168 | "dev": true 169 | }, 170 | "is-function": { 171 | "version": "1.0.1", 172 | "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", 173 | "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=", 174 | "dev": true 175 | }, 176 | "is-regex": { 177 | "version": "1.0.4", 178 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 179 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 180 | "dev": true 181 | }, 182 | "is-symbol": { 183 | "version": "1.0.1", 184 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", 185 | "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", 186 | "dev": true 187 | }, 188 | "isarray": { 189 | "version": "1.0.0", 190 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 191 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 192 | "dev": true 193 | }, 194 | "lodash": { 195 | "version": "3.10.1", 196 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", 197 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", 198 | "dev": true 199 | }, 200 | "magic-string": { 201 | "version": "https://registry.npmjs.org/magic-string/-/magic-string-0.15.2.tgz", 202 | "integrity": "sha1-BoHXOIdBu8Ot2qZQYJkmJMbAnpw=" 203 | }, 204 | "minimatch": { 205 | "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 206 | "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=" 207 | }, 208 | "minimist": { 209 | "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 210 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 211 | }, 212 | "number-is-nan": { 213 | "version": "1.0.1", 214 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 215 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 216 | "dev": true 217 | }, 218 | "object-assign": { 219 | "version": "4.1.1", 220 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 221 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 222 | "dev": true 223 | }, 224 | "object-inspect": { 225 | "version": "1.2.2", 226 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.2.2.tgz", 227 | "integrity": "sha1-yCEV5PzIiK6hTWTCLk8X9qcNXlo=", 228 | "dev": true 229 | }, 230 | "object-keys": { 231 | "version": "1.0.11", 232 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", 233 | "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", 234 | "dev": true 235 | }, 236 | "once": { 237 | "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 238 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 239 | "dev": true 240 | }, 241 | "parse-ms": { 242 | "version": "1.0.1", 243 | "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", 244 | "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", 245 | "dev": true 246 | }, 247 | "path-is-absolute": { 248 | "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 249 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 250 | "dev": true 251 | }, 252 | "path-parse": { 253 | "version": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 254 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" 255 | }, 256 | "plur": { 257 | "version": "1.0.0", 258 | "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", 259 | "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", 260 | "dev": true 261 | }, 262 | "poll-watch": { 263 | "version": "https://registry.npmjs.org/poll-watch/-/poll-watch-0.0.1.tgz", 264 | "integrity": "sha1-vPL3j6rm/48cq8XLJ66xu6NovSg=" 265 | }, 266 | "pretty-ms": { 267 | "version": "2.1.0", 268 | "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", 269 | "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", 270 | "dev": true 271 | }, 272 | "process-nextick-args": { 273 | "version": "1.0.7", 274 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 275 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 276 | "dev": true 277 | }, 278 | "re-emitter": { 279 | "version": "1.1.3", 280 | "resolved": "https://registry.npmjs.org/re-emitter/-/re-emitter-1.1.3.tgz", 281 | "integrity": "sha1-+p4xn/3u6zWycpbvDz03TawvUqc=", 282 | "dev": true 283 | }, 284 | "readable-stream": { 285 | "version": "2.2.10", 286 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.10.tgz", 287 | "integrity": "sha512-HQEnnoV404e0EtwB9yNiuk2tJ+egeVC8Y9QBAxzDg8DBJt4BzRp+yQuIb/t3FIWkSTmIi+sgx7yVv/ZM0GNoqw==", 288 | "dev": true 289 | }, 290 | "repeat-string": { 291 | "version": "1.6.1", 292 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 293 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 294 | "dev": true 295 | }, 296 | "require-from-string": { 297 | "version": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", 298 | "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=" 299 | }, 300 | "resolve": { 301 | "version": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", 302 | "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=" 303 | }, 304 | "resumer": { 305 | "version": "0.0.0", 306 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 307 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 308 | "dev": true 309 | }, 310 | "rollup": { 311 | "version": "0.34.10", 312 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.34.10.tgz", 313 | "integrity": "sha1-jrTe8ZSU3azLYUbbmvwO3XV6tAc=", 314 | "dev": true 315 | }, 316 | "rollup-plugin-commonjs": { 317 | "version": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-3.3.1.tgz", 318 | "integrity": "sha1-2oJOk2FcDFYVfR90OEncAHT6u/s=" 319 | }, 320 | "rollup-plugin-node-resolve": { 321 | "version": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-2.1.1.tgz", 322 | "integrity": "sha1-y7eDsNFbAnlNWJFTULLw2QK43cg=" 323 | }, 324 | "rollup-pluginutils": { 325 | "version": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", 326 | "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=" 327 | }, 328 | "safe-buffer": { 329 | "version": "5.1.0", 330 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz", 331 | "integrity": "sha512-aSLEDudu6OoRr/2rU609gRmnYboRLxgDG1z9o2Q0os7236FwvcqIOO8r8U5JUEwivZOhDaKlFO4SbPTJYyBEyQ==", 332 | "dev": true 333 | }, 334 | "source-map": { 335 | "version": "0.5.6", 336 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", 337 | "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", 338 | "dev": true 339 | }, 340 | "source-map-support": { 341 | "version": "0.4.15", 342 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", 343 | "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", 344 | "dev": true 345 | }, 346 | "split": { 347 | "version": "1.0.0", 348 | "resolved": "https://registry.npmjs.org/split/-/split-1.0.0.tgz", 349 | "integrity": "sha1-xDlc5oOrzSVLwo/h2rtuXCfc/64=", 350 | "dev": true 351 | }, 352 | "string_decoder": { 353 | "version": "1.0.1", 354 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", 355 | "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", 356 | "dev": true 357 | }, 358 | "string.prototype.trim": { 359 | "version": "1.1.2", 360 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", 361 | "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", 362 | "dev": true 363 | }, 364 | "strip-ansi": { 365 | "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 366 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" 367 | }, 368 | "supports-color": { 369 | "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 370 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 371 | }, 372 | "tap-out": { 373 | "version": "1.4.2", 374 | "resolved": "https://registry.npmjs.org/tap-out/-/tap-out-1.4.2.tgz", 375 | "integrity": "sha1-yQfsG/lAURHQiCY+kvVgi4jLs3o=", 376 | "dev": true 377 | }, 378 | "tap-spec": { 379 | "version": "4.1.1", 380 | "resolved": "https://registry.npmjs.org/tap-spec/-/tap-spec-4.1.1.tgz", 381 | "integrity": "sha1-4unyb1IIIysfViKIyXYk1YqI8Fo=", 382 | "dev": true 383 | }, 384 | "tape": { 385 | "version": "4.6.3", 386 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.6.3.tgz", 387 | "integrity": "sha1-Y353WB6ass4XV36b1M5PV1gG2LY=", 388 | "dev": true, 389 | "dependencies": { 390 | "resolve": { 391 | "version": "1.1.7", 392 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 393 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 394 | "dev": true 395 | } 396 | } 397 | }, 398 | "through": { 399 | "version": "2.3.8", 400 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 401 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 402 | "dev": true 403 | }, 404 | "through2": { 405 | "version": "2.0.3", 406 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", 407 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", 408 | "dev": true 409 | }, 410 | "trim": { 411 | "version": "0.0.1", 412 | "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", 413 | "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", 414 | "dev": true 415 | }, 416 | "util-deprecate": { 417 | "version": "1.0.2", 418 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 419 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 420 | "dev": true 421 | }, 422 | "vlq": { 423 | "version": "https://registry.npmjs.org/vlq/-/vlq-0.2.2.tgz", 424 | "integrity": "sha1-4xbVJXtAuGu0PLjV/qXX9U1rDKE=" 425 | }, 426 | "wrappy": { 427 | "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 428 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 429 | "dev": true 430 | }, 431 | "xtend": { 432 | "version": "4.0.1", 433 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 434 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 435 | "dev": true 436 | } 437 | } 438 | } 439 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wrollup", 3 | "version": "0.3.2", 4 | "description": "watcher for rollup", 5 | "main": "index.js", 6 | "bin": { 7 | "wrollup": "./cli.js" 8 | }, 9 | "scripts": { 10 | "test": "cd test && node test.js | tap-spec" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "https://github.com/talmobi/wrollup" 15 | }, 16 | "keywords": [ 17 | "watch", 18 | "watcher", 19 | "rollup" 20 | ], 21 | "author": "talmobi ", 22 | "license": "MIT", 23 | "bugs": { 24 | "url": "https://github.com/talmobi/wrollup/issues" 25 | }, 26 | "devDependencies": { 27 | "rollup": "^0.34.10", 28 | "tap-spec": "^4.1.1", 29 | "tape": "^4.6.3" 30 | }, 31 | "dependencies": { 32 | "chalk": "^1.1.3", 33 | "minimist": "^1.2.0", 34 | "poll-watch": "0.0.1", 35 | "require-from-string": "^1.2.0", 36 | "rollup-plugin-commonjs": "^3.3.1", 37 | "rollup-plugin-node-resolve": "^2.0.0" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /test/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "lockfileVersion": 1, 3 | "dependencies": { 4 | "acorn": { 5 | "version": "3.3.0", 6 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", 7 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", 8 | "dev": true 9 | }, 10 | "acorn-jsx": { 11 | "version": "3.0.1", 12 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", 13 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", 14 | "dev": true 15 | }, 16 | "acorn-object-spread": { 17 | "version": "1.0.0", 18 | "resolved": "https://registry.npmjs.org/acorn-object-spread/-/acorn-object-spread-1.0.0.tgz", 19 | "integrity": "sha1-SOrQ9KjrFplaF6Dbn/xqyq2kumg=", 20 | "dev": true 21 | }, 22 | "ansi-regex": { 23 | "version": "2.1.1", 24 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 25 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 26 | "dev": true 27 | }, 28 | "ansi-styles": { 29 | "version": "2.2.1", 30 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 31 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 32 | "dev": true 33 | }, 34 | "asap": { 35 | "version": "2.0.5", 36 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.5.tgz", 37 | "integrity": "sha1-UidltQw1EEkOUtfc/ghe+bqWlY8=" 38 | }, 39 | "balanced-match": { 40 | "version": "0.4.2", 41 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", 42 | "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", 43 | "dev": true 44 | }, 45 | "brace-expansion": { 46 | "version": "1.1.7", 47 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", 48 | "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", 49 | "dev": true 50 | }, 51 | "browser-resolve": { 52 | "version": "1.11.2", 53 | "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", 54 | "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", 55 | "dev": true, 56 | "dependencies": { 57 | "resolve": { 58 | "version": "1.1.7", 59 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 60 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 61 | "dev": true 62 | } 63 | } 64 | }, 65 | "buble": { 66 | "version": "0.13.2", 67 | "resolved": "https://registry.npmjs.org/buble/-/buble-0.13.2.tgz", 68 | "integrity": "sha1-XEVycoOE6nBPHcnnpdoWbA1+4uQ=", 69 | "dev": true 70 | }, 71 | "builtin-modules": { 72 | "version": "1.1.1", 73 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 74 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 75 | "dev": true 76 | }, 77 | "chalk": { 78 | "version": "1.1.3", 79 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 80 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 81 | "dev": true 82 | }, 83 | "concat-map": { 84 | "version": "0.0.1", 85 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 86 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 87 | "dev": true 88 | }, 89 | "core-js": { 90 | "version": "1.2.7", 91 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", 92 | "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" 93 | }, 94 | "encoding": { 95 | "version": "0.1.12", 96 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", 97 | "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=" 98 | }, 99 | "escape-string-regexp": { 100 | "version": "1.0.5", 101 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 102 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 103 | "dev": true 104 | }, 105 | "estree-walker": { 106 | "version": "0.2.1", 107 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.2.1.tgz", 108 | "integrity": "sha1-va/oCVOD2EFNXcLs9MkXO225QS4=", 109 | "dev": true 110 | }, 111 | "fbjs": { 112 | "version": "0.8.12", 113 | "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", 114 | "integrity": "sha1-ELXZL3bUVXX9Y6IX1OoCvqL47QQ=" 115 | }, 116 | "fs.realpath": { 117 | "version": "1.0.0", 118 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 119 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 120 | "dev": true 121 | }, 122 | "glob": { 123 | "version": "7.1.2", 124 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 125 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 126 | "dev": true 127 | }, 128 | "has-ansi": { 129 | "version": "2.0.0", 130 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 131 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 132 | "dev": true 133 | }, 134 | "iconv-lite": { 135 | "version": "0.4.17", 136 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.17.tgz", 137 | "integrity": "sha1-T9qjs4rLwsAxsEXQ7c3+HsqxjI0=" 138 | }, 139 | "inflight": { 140 | "version": "1.0.6", 141 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 142 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 143 | "dev": true 144 | }, 145 | "inherits": { 146 | "version": "2.0.3", 147 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 148 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 149 | "dev": true 150 | }, 151 | "is-stream": { 152 | "version": "1.1.0", 153 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 154 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 155 | }, 156 | "isomorphic-fetch": { 157 | "version": "2.2.1", 158 | "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", 159 | "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=" 160 | }, 161 | "js-tokens": { 162 | "version": "3.0.1", 163 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", 164 | "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=" 165 | }, 166 | "loose-envify": { 167 | "version": "1.3.1", 168 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", 169 | "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=" 170 | }, 171 | "magic-string": { 172 | "version": "0.14.0", 173 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.14.0.tgz", 174 | "integrity": "sha1-VyJK7xcByu7Sc7F6OalW5ysXJGI=", 175 | "dev": true 176 | }, 177 | "minimatch": { 178 | "version": "3.0.4", 179 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 180 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 181 | "dev": true 182 | }, 183 | "minimist": { 184 | "version": "1.2.0", 185 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 186 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 187 | "dev": true 188 | }, 189 | "node-fetch": { 190 | "version": "1.7.1", 191 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz", 192 | "integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==" 193 | }, 194 | "object-assign": { 195 | "version": "4.1.1", 196 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 197 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 198 | }, 199 | "once": { 200 | "version": "1.4.0", 201 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 202 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 203 | "dev": true 204 | }, 205 | "os-homedir": { 206 | "version": "1.0.2", 207 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 208 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 209 | "dev": true 210 | }, 211 | "path-is-absolute": { 212 | "version": "1.0.1", 213 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 214 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 215 | "dev": true 216 | }, 217 | "path-parse": { 218 | "version": "1.0.5", 219 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 220 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 221 | "dev": true 222 | }, 223 | "poll-watch": { 224 | "version": "0.0.1", 225 | "resolved": "https://registry.npmjs.org/poll-watch/-/poll-watch-0.0.1.tgz", 226 | "integrity": "sha1-vPL3j6rm/48cq8XLJ66xu6NovSg=", 227 | "dev": true 228 | }, 229 | "promise": { 230 | "version": "7.1.1", 231 | "resolved": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz", 232 | "integrity": "sha1-SJZUxpJha4qlWwck+oCbt9tJxb8=" 233 | }, 234 | "prop-types": { 235 | "version": "15.5.10", 236 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", 237 | "integrity": "sha1-J5ffwxJhguOpXj37suiT3ddFYVQ=" 238 | }, 239 | "react": { 240 | "version": "15.5.4", 241 | "resolved": "https://registry.npmjs.org/react/-/react-15.5.4.tgz", 242 | "integrity": "sha1-+oPrAVBqsjfNwcjDsc6o3gEr8Ec=" 243 | }, 244 | "require-from-string": { 245 | "version": "1.2.1", 246 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", 247 | "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", 248 | "dev": true 249 | }, 250 | "resolve": { 251 | "version": "1.3.3", 252 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", 253 | "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", 254 | "dev": true 255 | }, 256 | "rollup": { 257 | "version": "0.41.6", 258 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.41.6.tgz", 259 | "integrity": "sha1-4NBUl4d6OYwQTYFtJzOnGKepTio=", 260 | "dev": true 261 | }, 262 | "rollup-plugin-buble": { 263 | "version": "0.13.0", 264 | "resolved": "https://registry.npmjs.org/rollup-plugin-buble/-/rollup-plugin-buble-0.13.0.tgz", 265 | "integrity": "sha1-KLquz4qXERLQbLYIuLW1V3tzHtk=", 266 | "dev": true 267 | }, 268 | "rollup-plugin-commonjs": { 269 | "version": "3.3.1", 270 | "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-3.3.1.tgz", 271 | "integrity": "sha1-2oJOk2FcDFYVfR90OEncAHT6u/s=", 272 | "dev": true, 273 | "dependencies": { 274 | "magic-string": { 275 | "version": "0.15.2", 276 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.15.2.tgz", 277 | "integrity": "sha1-BoHXOIdBu8Ot2qZQYJkmJMbAnpw=", 278 | "dev": true 279 | } 280 | } 281 | }, 282 | "rollup-plugin-node-resolve": { 283 | "version": "2.1.1", 284 | "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-2.1.1.tgz", 285 | "integrity": "sha1-y7eDsNFbAnlNWJFTULLw2QK43cg=", 286 | "dev": true 287 | }, 288 | "rollup-pluginutils": { 289 | "version": "1.5.2", 290 | "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", 291 | "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=", 292 | "dev": true 293 | }, 294 | "setimmediate": { 295 | "version": "1.0.5", 296 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 297 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 298 | }, 299 | "source-map": { 300 | "version": "0.5.6", 301 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", 302 | "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", 303 | "dev": true 304 | }, 305 | "source-map-support": { 306 | "version": "0.4.15", 307 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", 308 | "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", 309 | "dev": true 310 | }, 311 | "strip-ansi": { 312 | "version": "3.0.1", 313 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 314 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 315 | "dev": true 316 | }, 317 | "supports-color": { 318 | "version": "2.0.0", 319 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 320 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 321 | "dev": true 322 | }, 323 | "ua-parser-js": { 324 | "version": "0.7.12", 325 | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.12.tgz", 326 | "integrity": "sha1-BMgamb3V3FImPqKdJMa/jUgYpLs=" 327 | }, 328 | "vlq": { 329 | "version": "0.2.2", 330 | "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.2.tgz", 331 | "integrity": "sha1-4xbVJXtAuGu0PLjV/qXX9U1rDKE=", 332 | "dev": true 333 | }, 334 | "whatwg-fetch": { 335 | "version": "2.0.3", 336 | "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", 337 | "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" 338 | }, 339 | "wrappy": { 340 | "version": "1.0.2", 341 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 342 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 343 | "dev": true 344 | }, 345 | "wrollup": { 346 | "version": "0.3.1", 347 | "resolved": "https://registry.npmjs.org/wrollup/-/wrollup-0.3.1.tgz", 348 | "integrity": "sha1-qp1HL0t7N9UMYZQ/APDdHUSFuBo=", 349 | "dev": true 350 | } 351 | } 352 | } 353 | -------------------------------------------------------------------------------- /test/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "start": "../cli.js -c rollup.config.js", 4 | "startwooster": "../cli.js -c rollup.config.js 2>&1 | /Users/mollie/code/wooster/cli.js", 5 | "startcli": "../cli.js --input src/index.js --output dist/bundle.js -f iife -c node:buble -c node:nodeResolve node:commonjs" 6 | }, 7 | "devDependencies": { 8 | "rollup": "^0.41.6", 9 | "rollup-plugin-buble": "^0.13.0", 10 | "rollup-plugin-commonjs": "^3.3.1", 11 | "rollup-plugin-node-resolve": "^2.1.1", 12 | "wrollup": "^0.3.1" 13 | }, 14 | "dependencies": { 15 | "react": "^15.5.4" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /test/rollup.config.js: -------------------------------------------------------------------------------- 1 | import buble from 'rollup-plugin-buble' 2 | import nodeResolve from 'rollup-plugin-node-resolve' 3 | import commonjs from 'rollup-plugin-commonjs' 4 | 5 | export default { 6 | entry: 'src/index.js', 7 | dest: 'dist/bundle.js', 8 | format: 'iife', 9 | plugins: [ 10 | buble(), 11 | nodeResolve(), 12 | commonjs({ 13 | include: 'node_modules/**' 14 | }) 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /test/src/App.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const Component = React.createClass({ 4 | render: function () { 5 | return ( 6 |
Component { (new Date()).toLocaleString() }
7 | ) 8 | } 9 | }) 10 | 11 | export default Component 12 | -------------------------------------------------------------------------------- /test/src/index.js: -------------------------------------------------------------------------------- 1 | import message from './message' 2 | 3 | import React from 'react' 4 | 5 | console.log('Hello world, message: ' + message) 6 | 7 | import App from './App.jsx' 8 | 9 | // fake react 10 | // var React = { 11 | // createElement: function (el, props) { 12 | // return String(el) 13 | // } 14 | // } 15 | 16 | console.log(
) 17 | console.log() 18 | -------------------------------------------------------------------------------- /test/src/message.js: -------------------------------------------------------------------------------- 1 | export default 'yippeee, yaahhoooo, waaahhoooooo' 2 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var childProcess = require('child_process') 3 | var fs = require('fs') 4 | 5 | var test = require('tape') 6 | 7 | var _spawns = [] 8 | 9 | process.on('exit', function () { 10 | _spawns.forEach(function (spawn) { 11 | try { 12 | spawn.kill() 13 | } catch (err) {} 14 | }) 15 | }) 16 | 17 | function exec (cmd, args) { 18 | var spawn = childProcess.spawn(cmd, args) 19 | _spawns.push(spawn) 20 | 21 | var _buffer 22 | var _listeners = {} 23 | 24 | function handler (chunk) { 25 | _buffer += chunk.toString('utf8') 26 | _listeners['data'] && _listeners['data'].forEach(function (cb) { 27 | cb(chunk) 28 | }) 29 | } 30 | 31 | spawn.stdout.on('data', handler) 32 | spawn.stderr.on('data', handler) 33 | 34 | var api = {} 35 | api.kill = function () { 36 | spawn.kill() 37 | } 38 | api.getBuffer = function () { 39 | return _buffer 40 | } 41 | api.on = function (evt, cb) { 42 | _listeners[evt] = _listeners[evt] || [] 43 | _listeners[evt].push(cb) 44 | return function () { 45 | var i = _listeners[evt].indexOf(cb) 46 | return _listeners.splice(i, 1) 47 | } 48 | } 49 | 50 | return api 51 | } 52 | 53 | function stripAnsi (str) { 54 | // https://github.com/chalk/ansi-regex 55 | var ansiRegex = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PRZcf-nqry=><]/g 56 | return str.replace(ansiRegex, '') 57 | } 58 | 59 | function normalize (str) { 60 | var s = stripAnsi(str) 61 | s = s.replace(/\s+/g, '') 62 | s = s.toLowerCase() 63 | return s 64 | } 65 | 66 | test('start watching on successful initial build', function (t) { 67 | t.plan(1) 68 | 69 | // clean project files 70 | var a, b, data 71 | a = path.resolve('untouched_src/App.jsx') 72 | b = path.resolve('src/App.jsx') 73 | data = fs.readFileSync(a) 74 | fs.writeFileSync(b, data) 75 | a = path.resolve('untouched_src/index.js') 76 | b = path.resolve('src/index.js') 77 | data = fs.readFileSync(a) 78 | fs.writeFileSync(b, data) 79 | a = path.resolve('untouched_src/message.js') 80 | b = path.resolve('src/message.js') 81 | data = fs.readFileSync(a) 82 | fs.writeFileSync(b, data) 83 | 84 | // exec('../cli.js', ['-c', 'rollup.config.js'], function (buffer) { 85 | console.log('cwd: ' + process.cwd()) 86 | var api = exec('npm', ['start']) 87 | 88 | var finish = function () { 89 | console.log('finishing tests...') 90 | setTimeout(function () { 91 | var buffer = api.getBuffer() 92 | api.kill() 93 | buffer = stripAnsi(buffer) 94 | var lines = buffer.split('\n') 95 | 96 | var expectedLines = [ 97 | ' watching /test/src/message.js', 98 | ' watching /test/src/App.jsx', 99 | ' watching /test/src/index.js', 100 | 'compiled dist/bundle.js', 101 | 'modification from ./src/App.jsx', 102 | 'compiled dist/bundle.js', 103 | 'modification from ./src/index.js', 104 | 'compiled dist/bundle.js', 105 | 'modification from ./src/message.js', 106 | 'compiled dist/bundle.js', 107 | 'modification from ./src/App.jsx', 108 | '``` SyntaxError (3:37)', 109 | ' 1| import React from "react"', 110 | ' 2| ', 111 | ' 3| const Component = React.createClass({:', 112 | '-----------------------------------------^', 113 | ' 4| render: function () {', 114 | ' 5| return (', 115 | ' 6|
Component { (new Date()).toLocaleString() }
', 116 | '', 117 | 'SyntaxError: Error transforming [App.jsx]', 118 | 'url: ' + path.resolve('src/App.jsx'), 119 | 'modification from ./src/message.js', 120 | '``` SyntaxError (1:49)', 121 | ' 1| export default "yippeee, yaahhoooo, waaahhoooooo":', 122 | '-----------------------------------------------------^', 123 | ' 2| ', 124 | '', 125 | 'SyntaxError: Error transforming [message.js]', 126 | 'url: ' + path.resolve('src/message.js'), 127 | 'modification from ./src/message.js', 128 | '``` SyntaxError (3:37)', 129 | ' 1| import React from "react"', 130 | ' 2| ', 131 | ' 3| const Component = React.createClass({:', 132 | '-----------------------------------------^', 133 | ' 4| render: function () {', 134 | ' 5| return (', 135 | ' 6|
Component { (new Date()).toLocaleString() }
', 136 | '', 137 | 'SyntaxError: Error transforming [App.jsx]', 138 | 'url: ' + path.resolve('src/App.jsx'), 139 | 'modification from ./src/App.jsx', 140 | ' watching /test/src/message.js', 141 | ' watching /test/src/App.jsx', 142 | ' watching /test/src/index.js', 143 | 'compiled dist/bundle.js', 144 | '' 145 | ] 146 | 147 | var diffLines = lines.slice(4).filter(function (line, index, arr) { 148 | var isDifferent = (line !== expectedLines[index]) 149 | if (isDifferent) { 150 | console.log('index: ' + index) 151 | console.log('[' + line + ']') 152 | console.log('[' + expectedLines[index] + ']') 153 | } 154 | return isDifferent 155 | }) 156 | 157 | console.log(' === diffs === ') 158 | console.log(diffLines) 159 | 160 | t.ok( 161 | diffLines.length === 0, 162 | 'should be nothing different in the output and expected output' 163 | ) 164 | }, 500) 165 | } 166 | 167 | var actions = [ 168 | function () { // trigger change event 169 | var a = path.resolve('untouched_src/App.jsx') 170 | var b = path.resolve('src/App.jsx') 171 | var data = fs.readFileSync(a) 172 | fs.writeFileSync(b, data) 173 | }, 174 | function () { // trigger change event 175 | var a = path.resolve('untouched_src/index.js') 176 | var b = path.resolve('src/index.js') 177 | var data = fs.readFileSync(a) 178 | fs.writeFileSync(b, data) 179 | }, 180 | function () { // trigger change event 181 | var a = path.resolve('untouched_src/message.js') 182 | var b = path.resolve('src/message.js') 183 | var data = fs.readFileSync(a) 184 | fs.writeFileSync(b, data) 185 | }, 186 | function () { // add syntax error 187 | var a = path.resolve('untouched_src/App.jsx') 188 | var b = path.resolve('src/App.jsx') 189 | var data = fs.readFileSync(a) 190 | 191 | var lines = data.toString('utf8').split('\n') 192 | lines[2] += ':' // add syntax error 193 | 194 | fs.writeFileSync(b, lines.join('\n')) 195 | }, 196 | function () { // add syntax error 197 | var a = path.resolve('untouched_src/message.js') 198 | var b = path.resolve('src/message.js') 199 | var data = fs.readFileSync(a) 200 | 201 | var lines = data.toString('utf8').split('\n') 202 | lines[0] += ':' // add syntax error 203 | 204 | fs.writeFileSync(b, lines.join('\n')) 205 | }, 206 | function () { // fix message.js 207 | var a = path.resolve('untouched_src/message.js') 208 | var b = path.resolve('src/message.js') 209 | var data = fs.readFileSync(a) 210 | fs.writeFileSync(b, data) 211 | }, 212 | function () { // fix App.jsx 213 | var a = path.resolve('untouched_src/App.jsx') 214 | var b = path.resolve('src/App.jsx') 215 | var data = fs.readFileSync(a) 216 | fs.writeFileSync(b, data) 217 | } 218 | ] 219 | 220 | setTimeout(function () { 221 | var i = 0; 222 | var next = function () { 223 | console.log('--> next action') 224 | var a = actions[i] 225 | a() 226 | if (actions[++i]) { 227 | setTimeout(next, 1000) 228 | } else { 229 | finish() 230 | } 231 | } 232 | next() 233 | }, 2000) 234 | }) 235 | -------------------------------------------------------------------------------- /test/untouched_src/App.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const Component = React.createClass({ 4 | render: function () { 5 | return ( 6 |
Component { (new Date()).toLocaleString() }
7 | ) 8 | } 9 | }) 10 | 11 | export default Component 12 | -------------------------------------------------------------------------------- /test/untouched_src/index.js: -------------------------------------------------------------------------------- 1 | import message from './message' 2 | 3 | import React from 'react' 4 | 5 | console.log('Hello world, message: ' + message) 6 | 7 | import App from './App.jsx' 8 | 9 | // fake react 10 | // var React = { 11 | // createElement: function (el, props) { 12 | // return String(el) 13 | // } 14 | // } 15 | 16 | console.log(
) 17 | console.log() 18 | -------------------------------------------------------------------------------- /test/untouched_src/message.js: -------------------------------------------------------------------------------- 1 | export default 'yippeee, yaahhoooo, waaahhoooooo' 2 | --------------------------------------------------------------------------------