You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
439 lines
12 KiB
439 lines
12 KiB
/* |
|
@license |
|
Rollup.js v2.56.3 |
|
Mon, 23 Aug 2021 05:06:39 GMT - commit c41d17ceedfa6c1d7430da70c6c80d86a91e9434 |
|
|
|
|
|
https://github.com/rollup/rollup |
|
|
|
Released under the MIT License. |
|
*/ |
|
'use strict'; |
|
|
|
var fs = require('fs'); |
|
var index = require('./index.js'); |
|
var loadConfigFile_js = require('./loadConfigFile.js'); |
|
var cli = require('../bin/rollup'); |
|
var require$$0 = require('assert'); |
|
var require$$0$1 = require('events'); |
|
var rollup = require('./rollup.js'); |
|
require('path'); |
|
require('util'); |
|
require('stream'); |
|
require('os'); |
|
require('url'); |
|
require('./mergeOptions.js'); |
|
require('module'); |
|
require('crypto'); |
|
|
|
function timeZone(date = new Date()) { |
|
const offset = date.getTimezoneOffset(); |
|
const absOffset = Math.abs(offset); |
|
const hours = Math.floor(absOffset / 60); |
|
const minutes = absOffset % 60; |
|
const minutesOut = minutes > 0 ? ':' + ('0' + minutes).slice(-2) : ''; |
|
return (offset < 0 ? '+' : '-') + hours + minutesOut; |
|
} |
|
|
|
function dateTime(options = {}) { |
|
let { |
|
date = new Date(), |
|
local = true, |
|
showTimeZone = false, |
|
showMilliseconds = false |
|
} = options; |
|
|
|
if (local) { |
|
// Offset the date so it will return the correct value when getting the ISO string. |
|
date = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)); |
|
} |
|
|
|
let end = ''; |
|
|
|
if (showTimeZone) { |
|
end = ' UTC' + (local ? timeZone(date) : ''); |
|
} |
|
|
|
if (showMilliseconds && date.getUTCMilliseconds() > 0) { |
|
end = ` ${date.getUTCMilliseconds()}ms${end}`; |
|
} |
|
|
|
return date |
|
.toISOString() |
|
.replace(/T/, ' ') |
|
.replace(/\..+/, end); |
|
} |
|
|
|
var signalExit = {exports: {}}; |
|
|
|
var signals$1 = {exports: {}}; |
|
|
|
(function (module) { |
|
// This is not the set of all possible signals. |
|
// |
|
// It IS, however, the set of all signals that trigger |
|
// an exit on either Linux or BSD systems. Linux is a |
|
// superset of the signal names supported on BSD, and |
|
// the unknown signals just fail to register, so we can |
|
// catch that easily enough. |
|
// |
|
// Don't bother with SIGKILL. It's uncatchable, which |
|
// means that we can't fire any callbacks anyway. |
|
// |
|
// If a user does happen to register a handler on a non- |
|
// fatal signal like SIGWINCH or something, and then |
|
// exit, it'll end up firing `process.emit('exit')`, so |
|
// the handler will be fired anyway. |
|
// |
|
// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised |
|
// artificially, inherently leave the process in a |
|
// state from which it is not safe to try and enter JS |
|
// listeners. |
|
module.exports = [ |
|
'SIGABRT', |
|
'SIGALRM', |
|
'SIGHUP', |
|
'SIGINT', |
|
'SIGTERM' |
|
]; |
|
|
|
if (process.platform !== 'win32') { |
|
module.exports.push( |
|
'SIGVTALRM', |
|
'SIGXCPU', |
|
'SIGXFSZ', |
|
'SIGUSR2', |
|
'SIGTRAP', |
|
'SIGSYS', |
|
'SIGQUIT', |
|
'SIGIOT' |
|
// should detect profiler and enable/disable accordingly. |
|
// see #21 |
|
// 'SIGPROF' |
|
); |
|
} |
|
|
|
if (process.platform === 'linux') { |
|
module.exports.push( |
|
'SIGIO', |
|
'SIGPOLL', |
|
'SIGPWR', |
|
'SIGSTKFLT', |
|
'SIGUNUSED' |
|
); |
|
} |
|
}(signals$1)); |
|
|
|
// Note: since nyc uses this module to output coverage, any lines |
|
// that are in the direct sync flow of nyc's outputCoverage are |
|
// ignored, since we can never get coverage for them. |
|
var assert = require$$0; |
|
var signals = signals$1.exports; |
|
var isWin = /^win/i.test(process.platform); |
|
|
|
var EE = require$$0$1; |
|
/* istanbul ignore if */ |
|
if (typeof EE !== 'function') { |
|
EE = EE.EventEmitter; |
|
} |
|
|
|
var emitter; |
|
if (process.__signal_exit_emitter__) { |
|
emitter = process.__signal_exit_emitter__; |
|
} else { |
|
emitter = process.__signal_exit_emitter__ = new EE(); |
|
emitter.count = 0; |
|
emitter.emitted = {}; |
|
} |
|
|
|
// Because this emitter is a global, we have to check to see if a |
|
// previous version of this library failed to enable infinite listeners. |
|
// I know what you're about to say. But literally everything about |
|
// signal-exit is a compromise with evil. Get used to it. |
|
if (!emitter.infinite) { |
|
emitter.setMaxListeners(Infinity); |
|
emitter.infinite = true; |
|
} |
|
|
|
signalExit.exports = function (cb, opts) { |
|
assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler'); |
|
|
|
if (loaded === false) { |
|
load(); |
|
} |
|
|
|
var ev = 'exit'; |
|
if (opts && opts.alwaysLast) { |
|
ev = 'afterexit'; |
|
} |
|
|
|
var remove = function () { |
|
emitter.removeListener(ev, cb); |
|
if (emitter.listeners('exit').length === 0 && |
|
emitter.listeners('afterexit').length === 0) { |
|
unload(); |
|
} |
|
}; |
|
emitter.on(ev, cb); |
|
|
|
return remove |
|
}; |
|
|
|
signalExit.exports.unload = unload; |
|
function unload () { |
|
if (!loaded) { |
|
return |
|
} |
|
loaded = false; |
|
|
|
signals.forEach(function (sig) { |
|
try { |
|
process.removeListener(sig, sigListeners[sig]); |
|
} catch (er) {} |
|
}); |
|
process.emit = originalProcessEmit; |
|
process.reallyExit = originalProcessReallyExit; |
|
emitter.count -= 1; |
|
} |
|
|
|
function emit (event, code, signal) { |
|
if (emitter.emitted[event]) { |
|
return |
|
} |
|
emitter.emitted[event] = true; |
|
emitter.emit(event, code, signal); |
|
} |
|
|
|
// { <signal>: <listener fn>, ... } |
|
var sigListeners = {}; |
|
signals.forEach(function (sig) { |
|
sigListeners[sig] = function listener () { |
|
// If there are no other listeners, an exit is coming! |
|
// Simplest way: remove us and then re-send the signal. |
|
// We know that this will kill the process, so we can |
|
// safely emit now. |
|
var listeners = process.listeners(sig); |
|
if (listeners.length === emitter.count) { |
|
unload(); |
|
emit('exit', null, sig); |
|
/* istanbul ignore next */ |
|
emit('afterexit', null, sig); |
|
/* istanbul ignore next */ |
|
if (isWin && sig === 'SIGHUP') { |
|
// "SIGHUP" throws an `ENOSYS` error on Windows, |
|
// so use a supported signal instead |
|
sig = 'SIGINT'; |
|
} |
|
process.kill(process.pid, sig); |
|
} |
|
}; |
|
}); |
|
|
|
signalExit.exports.signals = function () { |
|
return signals |
|
}; |
|
|
|
signalExit.exports.load = load; |
|
|
|
var loaded = false; |
|
|
|
function load () { |
|
if (loaded) { |
|
return |
|
} |
|
loaded = true; |
|
|
|
// This is the number of onSignalExit's that are in play. |
|
// It's important so that we can count the correct number of |
|
// listeners on signals, and don't wait for the other one to |
|
// handle it instead of us. |
|
emitter.count += 1; |
|
|
|
signals = signals.filter(function (sig) { |
|
try { |
|
process.on(sig, sigListeners[sig]); |
|
return true |
|
} catch (er) { |
|
return false |
|
} |
|
}); |
|
|
|
process.emit = processEmit; |
|
process.reallyExit = processReallyExit; |
|
} |
|
|
|
var originalProcessReallyExit = process.reallyExit; |
|
function processReallyExit (code) { |
|
process.exitCode = code || 0; |
|
emit('exit', process.exitCode, null); |
|
/* istanbul ignore next */ |
|
emit('afterexit', process.exitCode, null); |
|
/* istanbul ignore next */ |
|
originalProcessReallyExit.call(process, process.exitCode); |
|
} |
|
|
|
var originalProcessEmit = process.emit; |
|
function processEmit (ev, arg) { |
|
if (ev === 'exit') { |
|
if (arg !== undefined) { |
|
process.exitCode = arg; |
|
} |
|
var ret = originalProcessEmit.apply(this, arguments); |
|
emit('exit', process.exitCode, null); |
|
/* istanbul ignore next */ |
|
emit('afterexit', process.exitCode, null); |
|
return ret |
|
} else { |
|
return originalProcessEmit.apply(this, arguments) |
|
} |
|
} |
|
|
|
var onExit = signalExit.exports; |
|
|
|
const CLEAR_SCREEN = '\u001Bc'; |
|
function getResetScreen(configs, allowClearScreen) { |
|
let clearScreen = allowClearScreen; |
|
for (const config of configs) { |
|
if (config.watch && config.watch.clearScreen === false) { |
|
clearScreen = false; |
|
} |
|
} |
|
if (clearScreen) { |
|
return (heading) => loadConfigFile_js.stderr(CLEAR_SCREEN + heading); |
|
} |
|
let firstRun = true; |
|
return (heading) => { |
|
if (firstRun) { |
|
loadConfigFile_js.stderr(heading); |
|
firstRun = false; |
|
} |
|
}; |
|
} |
|
|
|
async function watch(command) { |
|
process.env.ROLLUP_WATCH = 'true'; |
|
const isTTY = process.stderr.isTTY; |
|
const silent = command.silent; |
|
let configs; |
|
let warnings; |
|
let watcher; |
|
let configWatcher; |
|
const configFile = command.config ? cli.getConfigPath(command.config) : null; |
|
onExit(close); |
|
process.on('uncaughtException', close); |
|
if (!process.stdin.isTTY) { |
|
process.stdin.on('end', close); |
|
process.stdin.resume(); |
|
} |
|
async function loadConfigFromFileAndTrack(configFile) { |
|
let reloadingConfig = false; |
|
let aborted = false; |
|
let configFileData = null; |
|
configWatcher = index.chokidar.watch(configFile).on('change', () => reloadConfigFile()); |
|
await reloadConfigFile(); |
|
async function reloadConfigFile() { |
|
try { |
|
const newConfigFileData = fs.readFileSync(configFile, 'utf-8'); |
|
if (newConfigFileData === configFileData) { |
|
return; |
|
} |
|
if (reloadingConfig) { |
|
aborted = true; |
|
return; |
|
} |
|
if (configFileData) { |
|
loadConfigFile_js.stderr(`\nReloading updated config...`); |
|
} |
|
configFileData = newConfigFileData; |
|
reloadingConfig = true; |
|
({ options: configs, warnings } = await loadConfigFile_js.loadAndParseConfigFile(configFile, command)); |
|
reloadingConfig = false; |
|
if (aborted) { |
|
aborted = false; |
|
reloadConfigFile(); |
|
} |
|
else { |
|
if (watcher) { |
|
watcher.close(); |
|
} |
|
start(configs); |
|
} |
|
} |
|
catch (err) { |
|
configs = []; |
|
reloadingConfig = false; |
|
loadConfigFile_js.handleError(err, true); |
|
} |
|
} |
|
} |
|
if (configFile) { |
|
await loadConfigFromFileAndTrack(configFile); |
|
} |
|
else { |
|
({ options: configs, warnings } = await cli.loadConfigFromCommand(command)); |
|
start(configs); |
|
} |
|
const resetScreen = getResetScreen(configs, isTTY); |
|
function start(configs) { |
|
try { |
|
watcher = rollup.watch(configs); |
|
} |
|
catch (err) { |
|
return loadConfigFile_js.handleError(err); |
|
} |
|
watcher.on('event', event => { |
|
switch (event.code) { |
|
case 'ERROR': |
|
warnings.flush(); |
|
loadConfigFile_js.handleError(event.error, true); |
|
break; |
|
case 'START': |
|
if (!silent) { |
|
resetScreen(loadConfigFile_js.underline(`rollup v${rollup.version}`)); |
|
} |
|
break; |
|
case 'BUNDLE_START': |
|
if (!silent) { |
|
let input = event.input; |
|
if (typeof input !== 'string') { |
|
input = Array.isArray(input) |
|
? input.join(', ') |
|
: Object.values(input).join(', '); |
|
} |
|
loadConfigFile_js.stderr(loadConfigFile_js.cyan(`bundles ${loadConfigFile_js.bold(input)} → ${loadConfigFile_js.bold(event.output.map(rollup.relativeId).join(', '))}...`)); |
|
} |
|
break; |
|
case 'BUNDLE_END': |
|
warnings.flush(); |
|
if (!silent) |
|
loadConfigFile_js.stderr(loadConfigFile_js.green(`created ${loadConfigFile_js.bold(event.output.map(rollup.relativeId).join(', '))} in ${loadConfigFile_js.bold(cli.ms(event.duration))}`)); |
|
if (event.result && event.result.getTimings) { |
|
cli.printTimings(event.result.getTimings()); |
|
} |
|
break; |
|
case 'END': |
|
if (!silent && isTTY) { |
|
loadConfigFile_js.stderr(`\n[${dateTime()}] waiting for changes...`); |
|
} |
|
} |
|
if ('result' in event && event.result) { |
|
event.result.close().catch(error => loadConfigFile_js.handleError(error, true)); |
|
} |
|
}); |
|
} |
|
function close(code) { |
|
process.removeListener('uncaughtException', close); |
|
// removing a non-existent listener is a no-op |
|
process.stdin.removeListener('end', close); |
|
if (watcher) |
|
watcher.close(); |
|
if (configWatcher) |
|
configWatcher.close(); |
|
if (code) { |
|
process.exit(code); |
|
} |
|
} |
|
} |
|
|
|
exports.watch = watch; |
|
//# sourceMappingURL=watch-cli.js.map
|
|
|