electron-compile
Version:
Electron supporting package to compile JS and CSS in Electron applications
95 lines (74 loc) • 2.57 kB
text/coffeescript
crypto = require 'crypto'
path = require 'path'
CoffeeScript = null # defer until used
fs = require 'fs-plus'
stats =
hits: 0
misses: 0
cacheDirectory = null
getCachePath = (coffee) ->
digest = crypto.createHash('sha1').update(coffee, 'utf8').digest('hex')
path.join(cacheDirectory, "#{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)
loadCoffeeScript = ->
coffee = require 'coffee-script'
# Work around for https://github.com/jashkenas/coffeescript/issues/3890
coffeePrepareStackTrace = Error.prepareStackTrace
if coffeePrepareStackTrace?
Error.prepareStackTrace = (error, stack) ->
try
return coffeePrepareStackTrace(error, stack)
catch coffeeError
return stack
coffee
compileCoffeeScript = (coffee, filePath, cachePath) ->
CoffeeScript ?= loadCoffeeScript()
{js, v3SourceMap} = CoffeeScript.compile(coffee, filename: filePath, sourceMap: true)
stats.misses++
if btoa? and unescape? and encodeURIComponent?
js = """
#{js}
//# sourceMappingURL=data:application/json;base64,#{btoa unescape encodeURIComponent v3SourceMap}
//# 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)
exports.register = ->
propertyConfig =
enumerable: true
value: requireCoffeeScript
writable: false
Object.defineProperty(require.extensions, '.coffee', propertyConfig)
Object.defineProperty(require.extensions, '.litcoffee', propertyConfig)
Object.defineProperty(require.extensions, '.coffee.md', propertyConfig)
return
exports.getCacheMisses = -> stats.misses
exports.getCacheHits = -> stats.hits
exports.resetCacheStats = ->
stats =
hits: 0
misses: 0
exports.setCacheDirectory = (newCacheDirectory) ->
cacheDirectory = newCacheDirectory
exports.getCacheDirectory = -> cacheDirectory
exports.addPathToCache = (filePath) ->
coffee = fs.readFileSync(filePath, 'utf8')
cachePath = getCachePath(coffee)
compileCoffeeScript(coffee, filePath, cachePath)
return