mirror of
https://github.com/atom/atom.git
synced 2026-01-23 22:08:08 -05:00
180 lines
4.9 KiB
CoffeeScript
180 lines
4.9 KiB
CoffeeScript
paths = [
|
|
"#{window.resourcePath}/spec"
|
|
"#{window.resourcePath}/benchmark"
|
|
"#{window.resourcePath}/src/stdlib"
|
|
"#{window.resourcePath}/src/app"
|
|
"#{window.resourcePath}/src/packages"
|
|
"#{window.resourcePath}/src"
|
|
"#{window.resourcePath}/vendor/packages"
|
|
"#{window.resourcePath}/vendor"
|
|
"#{window.resourcePath}/static"
|
|
"#{window.resourcePath}/themes"
|
|
"#{window.resourcePath}"
|
|
]
|
|
|
|
window.__filename = null
|
|
|
|
nakedLoad = (file) ->
|
|
file = resolve file
|
|
code = __read file
|
|
window.eval(code + "\n//@ sourceURL=" + file)
|
|
|
|
require = (path, cb) ->
|
|
return cb require path if cb?
|
|
|
|
unless file = resolve(path)
|
|
throw new Error("Require can't find file at path '#{path}'")
|
|
|
|
ext = file.split('.').pop()
|
|
|
|
if __moduleExists file
|
|
if not __modules.loaded[file.toLowerCase()]?
|
|
console.warn "Circular require: #{window.__filename} required #{file}"
|
|
return __modules[file]
|
|
else if __modules.loaded[file.toLowerCase()]
|
|
console.warn "Multiple requires (different cases) for #{file}"
|
|
|
|
[ previousFilename, window.__filename ] = [ window.__filename, file ]
|
|
__modules[file] = {} # Fix for circular references
|
|
__modules[file] = (exts[ext] or (file) -> __read file) file
|
|
window.__filename = previousFilename
|
|
__modules[file]
|
|
|
|
define = (cb) ->
|
|
__defines.push ->
|
|
exports = __modules[window.__filename] or {}
|
|
module = exports: exports
|
|
cb.call exports, require, exports, module
|
|
__modules.loaded[window.__filename.toLowerCase()] = true
|
|
module.exports or exports
|
|
|
|
exts =
|
|
js: (file, code) ->
|
|
code or= __read file
|
|
eval("define(function(require, exports, module) { 'use strict';#{code}})\n//@ sourceURL=#{file}")
|
|
__defines.pop()?.call()
|
|
coffee: (file, retry=true) ->
|
|
cacheFilePath = getCacheFilePath(file)
|
|
if __exists(cacheFilePath)
|
|
compiled = __read(cacheFilePath)
|
|
writeToCache = false
|
|
else
|
|
{CoffeeScript} = require 'coffee-script'
|
|
compiled = CoffeeScript.compile(__read(file), filename: file)
|
|
writeToCache = true
|
|
|
|
evaluated = exts.js(file, compiled)
|
|
$native.write(cacheFilePath, compiled) if writeToCache
|
|
evaluated
|
|
|
|
getPath = (path) ->
|
|
path = resolve(path)
|
|
return path unless path.split('.').pop() is 'coffee'
|
|
|
|
cacheFilePath = getCacheFilePath(path)
|
|
unless __exists(cacheFilePath)
|
|
{CoffeeScript} = require 'coffee-script'
|
|
compiled = CoffeeScript.compile(__read(path), filename: path)
|
|
$native.write(cacheFilePath, compiled)
|
|
cacheFilePath
|
|
|
|
getCacheFilePath = (path) ->
|
|
"/tmp/atom-compiled-scripts/#{$native.md5ForPath(path)}"
|
|
|
|
resolve = (name, {verifyExistence}={}) ->
|
|
verifyExistence ?= true
|
|
file = name
|
|
if /!/.test file
|
|
file = file.split('!').pop()
|
|
|
|
if file[0..1] is './'
|
|
prefix = window.__filename.split('/')[0..-2].join '/'
|
|
file = file.replace './', "#{prefix}/"
|
|
|
|
if file[0..2] is '../'
|
|
prefix = window.__filename.split('/')[0..-3].join '/'
|
|
file = file.replace '../', "#{prefix}/"
|
|
|
|
if file[0] isnt '/'
|
|
moduleAlreadyLoaded = paths.some (path) ->
|
|
if __moduleExists "#{path}/#{file}"
|
|
file = "#{path}/#{file}"
|
|
else if __moduleExists "#{path}/#{file}.js"
|
|
file = "#{path}/#{file}.js"
|
|
else if expanded = __moduleExpand "#{path}/#{file}"
|
|
file = expanded
|
|
|
|
if not moduleAlreadyLoaded
|
|
hasExtension = /\.(.+)$/.test(file)
|
|
paths.some (path) ->
|
|
fileExists = hasExtension and __exists "#{path}/#{file}"
|
|
jsFileExists = not hasExtension and __exists "#{path}/#{file}.js"
|
|
|
|
if jsFileExists
|
|
file = "#{path}/#{file}.js"
|
|
else if fileExists
|
|
file = "#{path}/#{file}"
|
|
else if expanded = __expand "#{path}/#{file}"
|
|
file = expanded
|
|
else
|
|
file = __expand(file) or file
|
|
|
|
if file[0] == '/'
|
|
file
|
|
else
|
|
console.warn("Failed to resolve '#{name}'") if verifyExistence
|
|
null
|
|
|
|
__moduleExists = (path) ->
|
|
__modules[path]?
|
|
|
|
__moduleExpand = (path) ->
|
|
return path if __moduleExists path
|
|
for ext, handler of exts
|
|
return "#{path}.#{ext}" if __moduleExists "#{path}.#{ext}"
|
|
return "#{path}/index.#{ext}" if __moduleExists "#{path}/index.#{ext}"
|
|
null
|
|
|
|
__expand = (path) ->
|
|
modulePath = __moduleExpand path
|
|
return modulePath if modulePath
|
|
|
|
return path if __isFile path
|
|
for ext, handler of exts
|
|
return "#{path}.#{ext}" if __exists "#{path}.#{ext}"
|
|
return "#{path}/index.#{ext}" if __exists "#{path}/index.#{ext}"
|
|
|
|
return path if __exists path
|
|
null
|
|
|
|
__exists = (path) ->
|
|
$native.exists path
|
|
|
|
__isFile = (path) ->
|
|
$native.isFile path
|
|
|
|
__read = (path) ->
|
|
try
|
|
$native.read(path)
|
|
catch e
|
|
console.error "Failed to read `#{path}`"
|
|
throw e
|
|
|
|
__modules = { loaded : {} }
|
|
__defines = []
|
|
|
|
this.require = require
|
|
this.nakedLoad = nakedLoad
|
|
this.define = define
|
|
|
|
this.require.paths = paths
|
|
this.require.getPath = getPath
|
|
this.require.exts = exts
|
|
|
|
this.require.resolve = resolve
|
|
this.require.nameToUrl = (path) -> "#{path}.js"
|
|
this.require.__modules = __modules
|
|
|
|
# issue #17
|
|
this.require.noWorker = true
|