1 | 'use strict'
|
2 | const fs = require('fs')
|
3 | const path = require('path')
|
4 | const mksnapshot = require('mksnapshot')
|
5 | const vm = require('vm')
|
6 |
|
7 | const stripBOM = function (content) {
|
8 | if (content.charCodeAt(0) === 0xFEFF) {
|
9 | content = content.slice(1)
|
10 | }
|
11 | return content
|
12 | }
|
13 |
|
14 | const wrapModuleCode = function (script) {
|
15 | script = script.replace(/^#!.*/, '')
|
16 | return `(function(exports, require, module, __filename, __dirname) { ${script} \n});`
|
17 | }
|
18 |
|
19 | const 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 |
|
29 | const 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 |
|
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 |
|
62 | module.exports = createSnapshot
|