xy-server/node_modules/ts-node-dev/lib/child-require-hook.js
2025-04-23 09:34:08 +08:00

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