mirror of
https://github.com/Foundry376/Mailspring.git
synced 2024-09-22 08:16:09 +08:00
76 lines
2.3 KiB
CoffeeScript
76 lines
2.3 KiB
CoffeeScript
|
crypto = require 'crypto'
|
||
|
path = require 'path'
|
||
|
|
||
|
CoffeeScript = require 'coffee-script'
|
||
|
CSON = require 'season'
|
||
|
fs = require 'fs-plus'
|
||
|
|
||
|
cacheDir = path.join(fs.absolute('~/.atom'), 'compile-cache')
|
||
|
|
||
|
stats =
|
||
|
hits: 0
|
||
|
misses: 0
|
||
|
|
||
|
# Use separate compile cache when sudo'ing as root to avoid permission issues
|
||
|
if process.env.USER is 'root' and process.env.SUDO_USER and process.env.SUDO_USER isnt process.env.USER
|
||
|
cacheDir = path.join(cacheDir, 'root')
|
||
|
|
||
|
coffeeCacheDir = path.join(cacheDir, 'coffee')
|
||
|
CSON.setCacheDir(path.join(cacheDir, 'cson'))
|
||
|
|
||
|
getCachePath = (coffee) ->
|
||
|
digest = crypto.createHash('sha1').update(coffee, 'utf8').digest('hex')
|
||
|
path.join(coffeeCacheDir, "#{digest}.js")
|
||
|
|
||
|
getCachedJavaScript = (cachePath) ->
|
||
|
if fs.isFileSync(cachePath)
|
||
|
try
|
||
|
cachedJavaScript = fs.readFileSync(cachePath, 'utf8')
|
||
|
stats.hits++
|
||
|
return cachedJavaScript
|
||
|
return
|
||
|
|
||
|
convertFilePath = (filePath) ->
|
||
|
if process.platform is 'win32'
|
||
|
filePath = "/#{path.resolve(filePath).replace(/\\/g, '/')}"
|
||
|
encodeURI(filePath)
|
||
|
|
||
|
compileCoffeeScript = (coffee, filePath, cachePath) ->
|
||
|
{js, v3SourceMap} = CoffeeScript.compile(coffee, filename: filePath, sourceMap: true)
|
||
|
stats.misses++
|
||
|
# Include source map in the web page environment.
|
||
|
if btoa? and JSON? and unescape? and encodeURIComponent?
|
||
|
js = "#{js}\n//# sourceMappingURL=data:application/json;base64,#{btoa unescape encodeURIComponent v3SourceMap}\n//# sourceURL=#{convertFilePath(filePath)}"
|
||
|
try
|
||
|
fs.writeFileSync(cachePath, js)
|
||
|
js
|
||
|
|
||
|
requireCoffeeScript = (module, filePath) ->
|
||
|
coffee = fs.readFileSync(filePath, 'utf8')
|
||
|
cachePath = getCachePath(coffee)
|
||
|
js = getCachedJavaScript(cachePath) ? compileCoffeeScript(coffee, filePath, cachePath)
|
||
|
module._compile(js, filePath)
|
||
|
|
||
|
module.exports =
|
||
|
cacheDir: cacheDir
|
||
|
|
||
|
register: ->
|
||
|
Object.defineProperty(require.extensions, '.coffee', {
|
||
|
value: requireCoffeeScript
|
||
|
})
|
||
|
|
||
|
addPathToCache: (filePath) ->
|
||
|
switch path.extname(filePath)
|
||
|
when '.coffee'
|
||
|
content = fs.readFileSync(filePath, 'utf8')
|
||
|
cachePath = getCachePath(coffee)
|
||
|
compileCoffeeScript(coffee, filePath, cachePath)
|
||
|
when '.cson'
|
||
|
CSON.readFileSync(filePath)
|
||
|
when '.js'
|
||
|
require('./6to5').addPathToCache(filePath)
|
||
|
|
||
|
getCacheMisses: -> stats.misses
|
||
|
|
||
|
getCacheHits: -> stats.hits
|