133 lines
3.5 KiB
JavaScript
133 lines
3.5 KiB
JavaScript
var fs = require('fs')
|
|
var getCompiledPath = require('./get-compiled-path')
|
|
var sep = require('path').sep
|
|
var join = require('path').join
|
|
var execSync = require('child_process').execSync
|
|
var Module = require("module")
|
|
var compilationId
|
|
var timeThreshold = 0
|
|
var allowJs = false
|
|
var compiledDir
|
|
var preferTs = false
|
|
var ignore = [/node_modules/]
|
|
var readyFile
|
|
var execCheck = false
|
|
var exitChild = false
|
|
var sourceMapSupportPath
|
|
var libPath
|
|
|
|
var checkFileScript = join(__dirname, 'check-file-exists.js')
|
|
|
|
var waitForFile = function(fileName) {
|
|
var start = new Date().getTime()
|
|
while (true) {
|
|
const exists = execCheck
|
|
? execSync(['node', checkFileScript, '"' + fileName + '"'].join(' '), {
|
|
stdio: 'inherit'
|
|
}) || true
|
|
: fs.existsSync(fileName)
|
|
|
|
if (exists) {
|
|
return
|
|
}
|
|
var passed = new Date().getTime() - start
|
|
if (timeThreshold && passed > timeThreshold) {
|
|
throw new Error('Could not require ' + fileName)
|
|
}
|
|
}
|
|
}
|
|
|
|
var compile = (code, fileName) => {
|
|
var compiledPath = getCompiledPath(code, fileName, compiledDir)
|
|
process.send && process.send({
|
|
compile: fileName,
|
|
compiledPath: compiledPath
|
|
})
|
|
var compileRequestFile = [compiledDir, compilationId + '.req'].join(sep)
|
|
fs.writeFileSync(compileRequestFile, [fileName, compiledPath].join('\n'))
|
|
waitForFile(compiledPath + '.done')
|
|
var compiled = fs.readFileSync(compiledPath, 'utf-8')
|
|
return compiled
|
|
}
|
|
|
|
function registerExtensions(extensions) {
|
|
extensions.forEach(function(ext) {
|
|
var old = require.extensions[ext] || require.extensions['.js']
|
|
require.extensions[ext] = function(m, fileName) {
|
|
var _compile = m._compile
|
|
m._compile = function(code, fileName) {
|
|
return _compile.call(this, compile(code, fileName), fileName)
|
|
}
|
|
return old(m, fileName)
|
|
}
|
|
})
|
|
}
|
|
|
|
function isFileInNodeModules(fileName) {
|
|
return fileName.indexOf(sep + 'node_modules' + sep) >= 0
|
|
}
|
|
|
|
function registerJsExtension() {
|
|
var old = require.extensions['.js']
|
|
if (allowJs || preferTs) {
|
|
require.extensions['.js'] = function(m, fileName) {
|
|
if (fileName.indexOf(libPath) === 0) {
|
|
return old(m, fileName)
|
|
}
|
|
var tsCode
|
|
var tsFileName
|
|
if (preferTs && !isFileInNodeModules(fileName)) {
|
|
tsFileName = fileName.replace(/\.js$/, '.ts')
|
|
if (fs.existsSync(tsFileName)) {
|
|
tsCode = fs.readFileSync(tsFileName, 'utf-8')
|
|
}
|
|
}
|
|
var _compile = m._compile
|
|
var isIgnored =
|
|
ignore &&
|
|
ignore.reduce(function(res, ignore) {
|
|
return res || ignore.test(fileName)
|
|
}, false)
|
|
if (tsCode !== undefined || (allowJs && !isIgnored)) {
|
|
m._compile = function(code, fileName) {
|
|
if (tsCode !== undefined) {
|
|
code = tsCode
|
|
fileName = tsFileName
|
|
}
|
|
return _compile.call(this, compile(code, fileName), fileName)
|
|
}
|
|
}
|
|
return old(m, fileName)
|
|
}
|
|
}
|
|
}
|
|
|
|
var sourceMapRequire = Module.createRequire
|
|
? Module.createRequire(sourceMapSupportPath)
|
|
: require
|
|
|
|
sourceMapRequire(sourceMapSupportPath).install({
|
|
hookRequire: true
|
|
})
|
|
|
|
registerExtensions(['.ts', '.tsx'])
|
|
registerJsExtension()
|
|
|
|
if (readyFile) {
|
|
var time = new Date().getTime()
|
|
while (!fs.existsSync(readyFile)) {
|
|
if (new Date().getTime() - time > 5000) {
|
|
throw new Error('Waiting ts-node-dev ready file failed')
|
|
}
|
|
}
|
|
}
|
|
|
|
if (exitChild) {
|
|
process.on('SIGTERM', function() {
|
|
console.log('Child got SIGTERM, exiting.')
|
|
process.exit()
|
|
})
|
|
}
|
|
|
|
module.exports.registerExtensions = registerExtensions
|