UNPKG

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