• ジャンプ先 … +
    browser.coffee cake.coffee coffeescript.coffee command.coffee grammar.coffee helpers.coffee index.coffee lexer.coffee nodes.coffee optparse.coffee register.coffee repl.coffee rewriter.coffee scope.litcoffee sourcemap.litcoffee
  • register.coffee

  • §
    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