| // Tab completion sometimes uses a separate REPL instance under the hood. |
| // That REPL instance has its own domain. Make sure domain errors trickle back |
| // up to the main REPL. |
| // |
| // Ref: https://github.com/nodejs/node/issues/21586 |
| |
| 'use strict'; |
| |
| const { Stream } = require('stream'); |
| function noop() {} |
| |
| // A stream to push an array into a REPL |
| function ArrayStream() { |
| this.run = function(data) { |
| data.forEach((line) => { |
| this.emit('data', `${line}\n`); |
| }); |
| }; |
| } |
| |
| Object.setPrototypeOf(ArrayStream.prototype, Stream.prototype); |
| Object.setPrototypeOf(ArrayStream, Stream); |
| ArrayStream.prototype.readable = true; |
| ArrayStream.prototype.writable = true; |
| ArrayStream.prototype.pause = noop; |
| ArrayStream.prototype.resume = noop; |
| ArrayStream.prototype.write = noop; |
| |
| const repl = require('repl'); |
| |
| const putIn = new ArrayStream(); |
| const testMe = repl.start('', putIn); |
| |
| // Some errors are passed to the domain, but do not callback |
| testMe._domain.on('error', function(err) { |
| throw err; |
| }); |
| |
| // Nesting of structures causes REPL to use a nested REPL for completion. |
| putIn.run([ |
| 'var top = function() {', |
| 'r = function test (', |
| ' one, two) {', |
| 'var inner = {', |
| ' one:1', |
| '};' |
| ]); |
| |
| // In Node.js 10.11.0, this next line will terminate the repl silently... |
| testMe.complete('inner.o', () => { throw new Error('fhqwhgads'); }); |