Skip to content

Commit 8a03eae

Browse files
authored
feat: drop support for Node < 8 (#170)
BREAKING CHANGE: drop support for versions of Node which are EOL'd as of 2019-04-30. * chore: upgrade mocha to fix some devDeps issues with npm audit * chore: upgrade commander and electron deps * chore: upgrade electron-mocha, which requires Node >= 8 * docs: update code examples for Node 8 * refactor: replace pify with util.promisify * refactor: use async/await everywhere * chore: remove Node 6 from the Node versions tested in CI * refactor: use async readFile method * refactor: simplify pattern construction * docs: reformat createPackageFromFiles doc comment * refactor: DRY up determineFileType * chore: remove mz devDependency
1 parent 22756a7 commit 8a03eae

13 files changed

+603
-555
lines changed

README.md

+13-15
Original file line numberDiff line numberDiff line change
@@ -85,15 +85,14 @@ $ asar pack app app.asar --unpack-dir "{**/x1,**/x2,z4/w1}"
8585

8686
### Example
8787

88-
```js
89-
var asar = require('asar');
88+
```javascript
89+
const asar = require('asar');
9090

91-
var src = 'some/path/';
92-
var dest = 'name.asar';
91+
const src = 'some/path/';
92+
const dest = 'name.asar';
9393

94-
asar.createPackage(src, dest).then(function() {
95-
console.log('done.');
96-
})
94+
await asar.createPackage(src, dest);
95+
console.log('done.');
9796
```
9897

9998
Please note that there is currently **no** error handling provided!
@@ -103,19 +102,18 @@ You can pass in a `transform` option, that is a function, which either returns
103102
nothing, or a `stream.Transform`. The latter will be used on files that will be
104103
in the `.asar` file to transform them (e.g. compress).
105104

106-
```js
107-
var asar = require('asar');
105+
```javascript
106+
const asar = require('asar');
108107

109-
var src = 'some/path/';
110-
var dest = 'name.asar';
108+
const src = 'some/path/';
109+
const dest = 'name.asar';
111110

112-
function transform(filename) {
111+
function transform (filename) {
113112
return new CustomTransformStream()
114113
}
115114

116-
asar.createPackageWithOptions(src, dest, { transform: transform }).then(function() {
117-
console.log('done.');
118-
})
115+
await asar.createPackageWithOptions(src, dest, { transform: transform });
116+
console.log('done.');
119117
```
120118

121119
## Using with grunt

appveyor.yml

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ skip_tags: true
88

99
environment:
1010
matrix:
11-
- nodejs_version: "6"
1211
- nodejs_version: "8"
1312
- nodejs_version: "10"
1413

lib/asar.js

+28-39
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
'use strict'
22

3-
const pify = require('pify')
4-
5-
const fs = process.versions.electron ? require('original-fs') : require('fs')
3+
const fs = require('./wrapped-fs')
64
const path = require('path')
75
const minimatch = require('minimatch')
8-
const mkdirp = pify(require('mkdirp'))
96

107
const Filesystem = require('./filesystem')
118
const disk = require('./disk')
@@ -29,32 +26,30 @@ function isUnpackedDir (dirPath, pattern, unpackDirs) {
2926
}
3027
}
3128

32-
module.exports.createPackage = function (src, dest) {
29+
module.exports.createPackage = async function (src, dest) {
3330
return module.exports.createPackageWithOptions(src, dest, {})
3431
}
3532

36-
module.exports.createPackageWithOptions = function (src, dest, options) {
33+
module.exports.createPackageWithOptions = async function (src, dest, options) {
3734
const globOptions = options.globOptions ? options.globOptions : {}
3835
globOptions.dot = options.dot === undefined ? true : options.dot
3936

40-
let pattern = src + '/**/*'
41-
if (options.pattern) {
42-
pattern = src + options.pattern
43-
}
37+
const pattern = src + (options.pattern ? options.pattern : '/**/*')
4438

45-
return crawlFilesystem(pattern, globOptions)
46-
.then(([filenames, metadata]) => module.exports.createPackageFromFiles(src, dest, filenames, metadata, options))
39+
const [filenames, metadata] = await crawlFilesystem(pattern, globOptions)
40+
return module.exports.createPackageFromFiles(src, dest, filenames, metadata, options)
4741
}
4842

49-
/*
50-
createPackageFromFiles - Create an asar-archive from a list of filenames
51-
src: Base path. All files are relative to this.
52-
dest: Archive filename (& path).
53-
filenames: Array of filenames relative to src.
54-
metadata: Object with filenames as keys and {type='directory|file|link', stat: fs.stat} as values. (Optional)
55-
options: The options.
43+
/**
44+
* Create an ASAR archive from a list of filenames.
45+
*
46+
* @param {string} src: Base path. All files are relative to this.
47+
* @param {string} dest: Archive filename (& path).
48+
* @param {array} filenames: List of filenames relative to src.
49+
* @param {object} metadata: Object with filenames as keys and {type='directory|file|link', stat: fs.stat} as values. (Optional)
50+
* @param {object} options: Options passed to `createPackageWithOptions`.
5651
*/
57-
module.exports.createPackageFromFiles = function (src, dest, filenames, metadata, options) {
52+
module.exports.createPackageFromFiles = async function (src, dest, filenames, metadata, options) {
5853
if (typeof metadata === 'undefined' || metadata === null) { metadata = {} }
5954
if (typeof options === 'undefined' || options === null) { options = {} }
6055

@@ -68,7 +63,7 @@ module.exports.createPackageFromFiles = function (src, dest, filenames, metadata
6863

6964
let filenamesSorted = []
7065
if (options.ordering) {
71-
const orderingFiles = fs.readFileSync(options.ordering).toString().split('\n').map(function (line) {
66+
const orderingFiles = (await fs.readFile(options.ordering)).toString().split('\n').map(line => {
7267
if (line.includes(':')) { line = line.split(':').pop() }
7368
line = line.trim()
7469
if (line.startsWith('/')) { line = line.slice(1) }
@@ -106,17 +101,11 @@ module.exports.createPackageFromFiles = function (src, dest, filenames, metadata
106101
filenamesSorted = filenames
107102
}
108103

109-
const handleFile = function (filename) {
110-
let file = metadata[filename]
111-
let type
112-
if (!file) {
113-
const stat = fs.lstatSync(filename)
114-
if (stat.isDirectory()) { type = 'directory' }
115-
if (stat.isFile()) { type = 'file' }
116-
if (stat.isSymbolicLink()) { type = 'link' }
117-
file = { stat, type }
118-
metadata[filename] = file
104+
const handleFile = async function (filename) {
105+
if (!metadata[filename]) {
106+
metadata[filename] = await crawlFilesystem.determineFileType(filename)
119107
}
108+
const file = metadata[filename]
120109

121110
let shouldUnpack
122111
switch (file.type) {
@@ -146,18 +135,18 @@ module.exports.createPackageFromFiles = function (src, dest, filenames, metadata
146135
return Promise.resolve()
147136
}
148137

149-
const insertsDone = function () {
150-
return mkdirp(path.dirname(dest))
151-
.then(() => disk.writeFilesystem(dest, filesystem, files, metadata))
138+
const insertsDone = async function () {
139+
await fs.mkdirp(path.dirname(dest))
140+
return disk.writeFilesystem(dest, filesystem, files, metadata)
152141
}
153142

154143
const names = filenamesSorted.slice()
155144

156-
const next = function (name) {
145+
const next = async function (name) {
157146
if (!name) { return insertsDone() }
158147

159-
return handleFile(name)
160-
.then(() => next(names.shift()))
148+
await handleFile(name)
149+
return next(names.shift())
161150
}
162151

163152
return next(names.shift())
@@ -185,15 +174,15 @@ module.exports.extractAll = function (archive, dest) {
185174
const followLinks = process.platform === 'win32'
186175

187176
// create destination directory
188-
mkdirp.sync(dest)
177+
fs.mkdirpSync(dest)
189178

190179
return filenames.map((filename) => {
191180
filename = filename.substr(1) // get rid of leading slash
192181
const destFilename = path.join(dest, filename)
193182
const file = filesystem.getFile(filename, followLinks)
194183
if (file.files) {
195184
// it's a directory, create it and continue with the next entry
196-
mkdirp.sync(destFilename)
185+
fs.mkdirpSync(destFilename)
197186
} else if (file.link) {
198187
// it's a symlink, create a symlink
199188
const linkSrcPath = path.dirname(path.join(dest, file.link))

lib/crawlfs.js

+23-29
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,31 @@
11
'use strict'
22

3-
const pify = require('pify')
3+
const { promisify } = require('util')
44

5-
const fs = pify(process.versions.electron ? require('original-fs') : require('fs'))
6-
const glob = pify(require('glob'))
5+
const fs = require('./wrapped-fs')
6+
const glob = promisify(require('glob'))
77

8-
function determineFileType (filename) {
9-
return fs.lstat(filename)
10-
.then(stat => {
11-
if (stat.isFile()) {
12-
return [filename, { type: 'file', stat: stat }]
13-
} else if (stat.isDirectory()) {
14-
return [filename, { type: 'directory', stat: stat }]
15-
} else if (stat.isSymbolicLink()) {
16-
return [filename, { type: 'link', stat: stat }]
17-
}
18-
19-
return [filename, undefined]
20-
})
8+
async function determineFileType (filename) {
9+
const stat = await fs.lstat(filename)
10+
if (stat.isFile()) {
11+
return { type: 'file', stat }
12+
} else if (stat.isDirectory()) {
13+
return { type: 'directory', stat }
14+
} else if (stat.isSymbolicLink()) {
15+
return { type: 'link', stat }
16+
}
2117
}
2218

23-
module.exports = function (dir, options) {
19+
module.exports = async function (dir, options) {
2420
const metadata = {}
25-
return glob(dir, options)
26-
.then(filenames => Promise.all(filenames.map(filename => determineFileType(filename))))
27-
.then(results => {
28-
const filenames = []
29-
for (const [filename, type] of results) {
30-
filenames.push(filename)
31-
if (type) {
32-
metadata[filename] = type
33-
}
34-
}
35-
return [filenames, metadata]
36-
})
21+
const crawled = await glob(dir, options)
22+
const results = await Promise.all(crawled.map(async filename => [filename, await determineFileType(filename)]))
23+
const filenames = results.map(([filename, type]) => {
24+
if (type) {
25+
metadata[filename] = type
26+
}
27+
return filename
28+
})
29+
return [filenames, metadata]
3730
}
31+
module.exports.determineFileType = determineFileType

lib/disk.js

+13-16
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,21 @@
11
'use strict'
22

3-
const pify = require('pify')
4-
5-
const fs = pify(process.versions.electron ? require('original-fs') : require('fs'))
3+
const fs = require('./wrapped-fs')
64
const path = require('path')
7-
const mkdirp = pify(require('mkdirp'))
85
const pickle = require('chromium-pickle-js')
96

107
const Filesystem = require('./filesystem')
118
let filesystemCache = {}
129

13-
function copyFile (dest, src, filename) {
10+
async function copyFile (dest, src, filename) {
1411
const srcFile = path.join(src, filename)
1512
const targetFile = path.join(dest, filename)
1613

17-
return Promise.all([fs.readFile(srcFile), fs.stat(srcFile), mkdirp(path.dirname(targetFile))])
18-
.then(([content, stats, _]) => fs.writeFile(targetFile, content, { mode: stats.mode }))
14+
const [content, stats] = await Promise.all([fs.readFile(srcFile), fs.stat(srcFile), fs.mkdirp(path.dirname(targetFile))])
15+
return fs.writeFile(targetFile, content, { mode: stats.mode })
1916
}
2017

21-
function streamTransformedFile (originalFilename, outStream, transformed) {
18+
async function streamTransformedFile (originalFilename, outStream, transformed) {
2219
return new Promise((resolve, reject) => {
2320
const stream = fs.createReadStream(transformed ? transformed.path : originalFilename)
2421
stream.pipe(outStream, { end: false })
@@ -27,20 +24,19 @@ function streamTransformedFile (originalFilename, outStream, transformed) {
2724
})
2825
}
2926

30-
const writeFileListToStream = function (dest, filesystem, out, list, metadata) {
31-
let promise = Promise.resolve()
27+
const writeFileListToStream = async function (dest, filesystem, out, list, metadata) {
3228
for (const file of list) {
3329
if (file.unpack) { // the file should not be packed into archive
3430
const filename = path.relative(filesystem.src, file.filename)
35-
promise = promise.then(() => copyFile(`${dest}.unpacked`, filesystem.src, filename))
31+
await copyFile(`${dest}.unpacked`, filesystem.src, filename)
3632
} else {
37-
promise = promise.then(() => streamTransformedFile(file.filename, out, metadata[file.filename].transformed))
33+
await streamTransformedFile(file.filename, out, metadata[file.filename].transformed)
3834
}
3935
}
40-
return promise.then(() => out.end())
36+
return out.end()
4137
}
4238

43-
module.exports.writeFilesystem = function (dest, filesystem, files, metadata) {
39+
module.exports.writeFilesystem = async function (dest, filesystem, files, metadata) {
4440
const headerPickle = pickle.createEmpty()
4541
headerPickle.writeString(JSON.stringify(filesystem.header))
4642
const headerBuf = headerPickle.toBuffer()
@@ -50,11 +46,12 @@ module.exports.writeFilesystem = function (dest, filesystem, files, metadata) {
5046
const sizeBuf = sizePickle.toBuffer()
5147

5248
const out = fs.createWriteStream(dest)
53-
return new Promise((resolve, reject) => {
49+
await new Promise((resolve, reject) => {
5450
out.on('error', reject)
5551
out.write(sizeBuf)
5652
return out.write(headerBuf, () => resolve())
57-
}).then(() => writeFileListToStream(dest, filesystem, out, files, metadata))
53+
})
54+
return writeFileListToStream(dest, filesystem, out, files, metadata)
5855
}
5956

6057
module.exports.readArchiveHeaderSync = function (archive) {

lib/filesystem.js

+15-22
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
'use strict'
22

3-
const pify = require('pify')
4-
5-
const fs = pify(process.versions.electron ? require('original-fs') : require('fs'))
3+
const fs = require('./wrapped-fs')
64
const path = require('path')
75
const tmp = require('tmp-promise')
86
const UINT64 = require('cuint').UINT64
@@ -50,7 +48,7 @@ class Filesystem {
5048
return node.files
5149
}
5250

53-
insertFile (p, shouldUnpack, file, options) {
51+
async insertFile (p, shouldUnpack, file, options) {
5452
const dirNode = this.searchNodeFromPath(path.dirname(p))
5553
const node = this.searchNodeFromPath(p)
5654
if (shouldUnpack || dirNode.unpacked) {
@@ -84,25 +82,20 @@ class Filesystem {
8482

8583
const transformed = options.transform && options.transform(p)
8684
if (transformed) {
87-
return tmp.file()
88-
.then(tmpfile => {
89-
return new Promise((resolve, reject) => {
90-
const out = fs.createWriteStream(tmpfile.path)
91-
const stream = fs.createReadStream(p)
92-
93-
stream.pipe(transformed).pipe(out)
94-
return out.on('close', () => {
95-
return fs.lstat(tmpfile.path)
96-
.then(stat => {
97-
file.transformed = {
98-
path: tmpfile.path,
99-
stat
100-
}
101-
return handler(resolve, reject)
102-
})
103-
})
104-
})
85+
const tmpfile = await tmp.file()
86+
return new Promise((resolve, reject) => {
87+
const out = fs.createWriteStream(tmpfile.path)
88+
const stream = fs.createReadStream(p)
89+
90+
stream.pipe(transformed).pipe(out)
91+
return out.on('close', async () => {
92+
file.transformed = {
93+
path: tmpfile.path,
94+
stat: await fs.lstat(tmpfile.path)
95+
}
96+
return handler(resolve, reject)
10597
})
98+
})
10699
} else {
107100
return handler()
108101
}

0 commit comments

Comments
 (0)