snapshot.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. 'use strict'
  2. const fs = process.versions.electron ? require('original-fs') : require('fs')
  3. const path = require('path')
  4. const mksnapshot = require('mksnapshot')
  5. const vm = require('vm')
  6. const stripBOM = function (content) {
  7. if (content.charCodeAt(0) === 0xFEFF) {
  8. content = content.slice(1)
  9. }
  10. return content
  11. }
  12. const wrapModuleCode = function (script) {
  13. script = script.replace(/^#!.*/, '')
  14. return `(function(exports, require, module, __filename, __dirname) { ${script} \n});`
  15. }
  16. const dumpObjectToJS = function (content) {
  17. let result = 'var __ATOM_SHELL_SNAPSHOT = {\n'
  18. for (const filename in content) {
  19. const func = content[filename].toString()
  20. result += ` '${filename}': ${func},\n`
  21. }
  22. result += '};\n'
  23. return result
  24. }
  25. const createSnapshot = function (src, dest, filenames, metadata, options, callback) {
  26. const content = {}
  27. try {
  28. src = path.resolve(src)
  29. for (const filename of filenames) {
  30. const file = metadata[filename]
  31. if ((file.type === 'file' || file.type === 'link') && filename.substr(-3) === '.js') {
  32. const script = wrapModuleCode(stripBOM(fs.readFileSync(filename, 'utf8')))
  33. const relativeFilename = path.relative(src, filename)
  34. try {
  35. const compiled = vm.runInThisContext(script, {filename: relativeFilename})
  36. content[relativeFilename] = compiled
  37. } catch (error) {
  38. console.error('Ignoring ' + relativeFilename + ' for ' + error.name)
  39. }
  40. }
  41. }
  42. } catch (error) {
  43. return callback(error)
  44. }
  45. // run mksnapshot
  46. const str = dumpObjectToJS(content)
  47. const version = options.version
  48. const arch = options.arch
  49. const builddir = options.builddir
  50. let snapshotdir = options.snapshotdir
  51. if (typeof snapshotdir === 'undefined' || snapshotdir === null) { snapshotdir = path.dirname(dest) }
  52. const target = path.resolve(snapshotdir, 'snapshot_blob.bin')
  53. return mksnapshot(str, target, version, arch, builddir, callback)
  54. }
  55. module.exports = createSnapshot