UNPKG

4.18 kBJavaScriptView Raw
1var fs = require('fs')
2var getCompiledPath = require('./get-compiled-path')
3var sep = require('path').sep
4var join = require('path').join
5var extname = require('path').extname
6var execSync = require('child_process').execSync
7var Module = require("module")
8var compilationId
9var timeThreshold = 0
10var allowJs = false
11var compiledDir
12var preferTs = false
13var ignore = [/node_modules/]
14var readyFile
15var execCheck = false
16var exitChild = false
17var sourceMapSupportPath
18var libPath
19
20var checkFileScript = join(__dirname, 'check-file-exists.js')
21
22var waitForFile = function(fileName) {
23 var start = new Date().getTime()
24 while (true) {
25 var exists = execCheck
26 ? execSync(['node', checkFileScript, '"' + fileName + '"'].join(' '), {
27 stdio: 'inherit'
28 }) || true
29 : fs.existsSync(fileName)
30
31 if (exists) {
32 return
33 }
34 var passed = new Date().getTime() - start
35 if (timeThreshold && passed > timeThreshold) {
36 throw new Error('Could not require ' + fileName)
37 }
38 }
39}
40
41var compile = (code, fileName) => {
42 var compiledPath = getCompiledPath(code, fileName, compiledDir)
43 process.send && process.send({
44 compile: fileName,
45 compiledPath: compiledPath
46 })
47 var compileRequestFile = [compiledDir, compilationId + '.req'].join(sep)
48 fs.writeFileSync(compileRequestFile, [fileName, compiledPath].join('\n'))
49 waitForFile(compiledPath + '.done')
50 var compiled = fs.readFileSync(compiledPath, 'utf-8')
51 return compiled
52}
53
54function registerExtensions(extensions) {
55 extensions.forEach(function(ext) {
56 var old = require.extensions[ext] || require.extensions['.js']
57 require.extensions[ext] = function(m, fileName) {
58 var _compile = m._compile
59 m._compile = function(code, fileName) {
60 return _compile.call(this, compile(code, fileName), fileName)
61 }
62 return old(m, fileName)
63 }
64 })
65 if (preferTs) {
66 function reorderRequireExtension (ext) {
67 var old = require.extensions[ext]
68 delete require.extensions[ext]
69 require.extensions[ext] = old
70 }
71 var order = ['.ts'].concat(Object.keys(require.extensions)
72 .filter(_ => _ !== '.ts'))
73 order.forEach(function (ext) {
74 reorderRequireExtension(ext)
75 })
76 }
77}
78
79function isFileInNodeModules(fileName) {
80 return fileName.indexOf(sep + 'node_modules' + sep) >= 0
81}
82
83function registerJsExtension() {
84 var old = require.extensions['.js']
85 // handling preferTs probably redundant after reordering
86 if (allowJs || preferTs) {
87 require.extensions['.js'] = function(m, fileName) {
88 if (fileName.indexOf(libPath) === 0) {
89 return old(m, fileName)
90 }
91 var tsCode
92 var tsFileName
93 // if (preferTs && !isFileInNodeModules(fileName)) {
94 // tsFileName = fileName.replace(/\.js$/, '.ts')
95 // // if (fs.existsSync(tsFileName)) {
96 // // tsCode = fs.readFileSync(tsFileName, 'utf-8')
97 // // }
98 // }
99 var _compile = m._compile
100 var isIgnored =
101 ignore &&
102 ignore.reduce(function(res, ignore) {
103 return res || ignore.test(fileName)
104 }, false)
105 var ext = extname(fileName)
106 if (tsCode !== undefined || (allowJs && !isIgnored && ext == '.js')) {
107 m._compile = function(code, fileName) {
108 if (tsCode !== undefined) {
109 code = tsCode
110 fileName = tsFileName
111 }
112 return _compile.call(this, compile(code, fileName), fileName)
113 }
114 }
115
116 return old(m, fileName)
117 }
118 }
119}
120
121var sourceMapRequire = Module.createRequire
122 ? Module.createRequire(sourceMapSupportPath)
123 : require
124
125sourceMapRequire(sourceMapSupportPath).install({
126 hookRequire: true
127})
128
129registerExtensions(['.ts', '.tsx'])
130registerJsExtension()
131
132if (readyFile) {
133 var time = new Date().getTime()
134 while (!fs.existsSync(readyFile)) {
135 if (new Date().getTime() - time > 5000) {
136 throw new Error('Waiting ts-node-dev ready file failed')
137 }
138 }
139}
140
141if (exitChild) {
142 process.on('SIGTERM', function() {
143 console.log('Child got SIGTERM, exiting.')
144 process.exit()
145 })
146}
147
148module.exports.registerExtensions = registerExtensions