CoffeeScript = require './'
child_process = require 'child_process'
helpers = require './helpers'
path = require 'path'
{patchStackTrace} = CoffeeScript
CoffeeScript = require './'
child_process = require 'child_process'
helpers = require './helpers'
path = require 'path'
{patchStackTrace} = CoffeeScript
Node の組み込みソースマップスタックトレース変換が有効になったことを確認します。
nodeSourceMapsSupportEnabled = process? and (
process.execArgv.includes('--enable-source-maps') or
process.env.NODE_OPTIONS?.includes('--enable-source-maps')
)
unless Error.prepareStackTrace or nodeSourceMapsSupportEnabled
cacheSourceMaps = true
patchStackTrace()
Node 用に CoffeeScript ファイルを読み込み実行し、すべての BOM
を削除します。
loadFile = (module, filename) ->
options = module.options or getRootModule(module).options or {}
現在、CoffeeScript.compile
は存在する場合はすべてのソースマップをキャッシュしています。sourceMap は filename
で取得でき利用できます。
if cacheSourceMaps or nodeSourceMapsSupportEnabled
options.inlineMap = true
js = CoffeeScript._compileFile filename, options
module._compile js, filename
Node のインストール済みバージョンが require.extensions
をサポートしている場合は、拡張機能として CoffeeScript を登録します。
if require.extensions
for ext in CoffeeScript.FILE_EXTENSIONS
require.extensions[ext] = loadFile
多ドット拡張機能を処理できるよう Node のモジュールローダーにパッチを当てます。必要なはずのない、ひどいものです。
Module = require 'module'
findExtension = (filename) ->
extensions = path.basename(filename).split '.'
ドットファイルから最初のドットを除去します。
extensions.shift() if extensions[0] is ''
可能な限り長い拡張子から始め、短いものに変えていきます。
while extensions.shift()
curExtension = '.' + extensions.join '.'
return curExtension if Module._extensions[curExtension]
'.js'
Module::load = (filename) ->
@filename = filename
@paths = Module._nodeModulePaths path.dirname filename
extension = findExtension filename
Module._extensions[extension](this, filename)
@loaded = true
Node の場合は、child_process.fork
にパッチを当て、CoffeeScript ファイルと JavaScript ファイルの両方を直接フォークできるようにします。
if child_process
{fork} = child_process
binary = require.resolve '../../bin/coffee'
child_process.fork = (path, args, options) ->
if helpers.isCoffee path
unless Array.isArray args
options = args or {}
args = []
args = [path].concat args
path = binary
fork path, args, options
最上位モジュールにアタッチされた options
オブジェクトを見つけるユーティリティ関数です。
getRootModule = (module) ->
if module.parent then getRootModule module.parent else module