1 | var fs = require('fs')
|
2 | var getCompiledPath = require('./get-compiled-path')
|
3 | var sep = require('path').sep
|
4 | var join = require('path').join
|
5 | var extname = require('path').extname
|
6 | var execSync = require('child_process').execSync
|
7 | var Module = require("module")
|
8 | var compilationId
|
9 | var timeThreshold = 0
|
10 | var allowJs = false
|
11 | var compiledDir
|
12 | var preferTs = false
|
13 | var ignore = [/node_modules/]
|
14 | var readyFile
|
15 | var execCheck = false
|
16 | var exitChild = false
|
17 | var sourceMapSupportPath
|
18 | var libPath
|
19 |
|
20 | var checkFileScript = join(__dirname, 'check-file-exists.js')
|
21 |
|
22 | var 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 |
|
41 | var 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 |
|
54 | function 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 |
|
79 | function isFileInNodeModules(fileName) {
|
80 | return fileName.indexOf(sep + 'node_modules' + sep) >= 0
|
81 | }
|
82 |
|
83 | function registerJsExtension() {
|
84 | var old = require.extensions['.js']
|
85 |
|
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 |
|
94 |
|
95 |
|
96 |
|
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 |
|
121 | var sourceMapRequire = Module.createRequire
|
122 | ? Module.createRequire(sourceMapSupportPath)
|
123 | : require
|
124 |
|
125 | sourceMapRequire(sourceMapSupportPath).install({
|
126 | hookRequire: true
|
127 | })
|
128 |
|
129 | registerExtensions(['.ts', '.tsx'])
|
130 | registerJsExtension()
|
131 |
|
132 | if (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 |
|
141 | if (exitChild) {
|
142 | process.on('SIGTERM', function() {
|
143 | console.log('Child got SIGTERM, exiting.')
|
144 | process.exit()
|
145 | })
|
146 | }
|
147 |
|
148 | module.exports.registerExtensions = registerExtensions
|