Skip to content

Commit d41c6b2

Browse files
DavidParks8dherges
authored andcommitted
fix: properly handle rejected promises in utils (#130) (#126)
Resolves #126
1 parent e56d8f8 commit d41c6b2

File tree

6 files changed

+61
-70
lines changed

6 files changed

+61
-70
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ npm-debug.log*
55
yarn-debug.log*
66
yarn-error.log*
77

8+
# IDE temp data
9+
/.vs
10+
/.idea
11+
812
# Runtime data
913
pids
1014
*.pid

src/lib/util/copy.ts

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,14 @@
1+
import { promisify } from './promisify';
12
const cpx = require('cpx');
23

3-
export const copyFiles = (src: string, dest: string, options?: any): Promise<any> => {
4-
5-
return new Promise((resolve, reject) => {
4+
export const copyFiles = (src: string, dest: string, options?: any): Promise<void> => {
65

6+
return promisify<void>((resolveOrReject) => {
77
if (options) {
8-
cpx.copy(src, dest, options, (err) => {
9-
if (err) {
10-
reject();
11-
}
12-
13-
resolve();
14-
});
8+
cpx.copy(src, dest, options, resolveOrReject);
159
} else {
16-
cpx.copy(src, dest, (err) => {
17-
if (err) {
18-
reject();
19-
}
20-
21-
resolve();
22-
});
10+
cpx.copy(src, dest, resolveOrReject);
2311
}
24-
2512
});
2613

27-
}
14+
};

src/lib/util/fs.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,32 @@
11
import * as fs from 'fs';
22
import * as path from 'path';
33
const read = require('read-file');
4+
import { promisify } from './promisify';
45

56
export const readFile = (file: string): Promise<string> => {
67

7-
return new Promise((resolve, reject) => {
8-
9-
read(file, { encoding: 'utf8', normalize: true }, (err, buffer: Buffer) => {
10-
if (err) {
11-
reject(err);
8+
return promisify<string>((resolveOrReject) => {
9+
const fileReadOptions = {
10+
encoding: 'utf8',
11+
normalize: true
12+
};
13+
read(file, fileReadOptions, (err, buffer?: Buffer) => {
14+
if (buffer) {
15+
resolveOrReject(err, buffer.toString());
16+
} else {
17+
resolveOrReject(err);
1218
}
13-
14-
resolve(buffer.toString());
1519
});
1620
});
21+
1722
};
1823

19-
export const writeFile = (file: string, content: any): Promise<any> => {
24+
export const writeFile = (file: string, content: any): Promise<string> => {
2025

21-
return new Promise((resolve, reject) => {
22-
fs.writeFile(file, content, (err) => {
23-
if (err) {
24-
reject(err);
25-
}
26-
27-
resolve();
28-
});
26+
return promisify<string>((resolveOrReject) => {
27+
fs.writeFile(file, content, resolveOrReject);
2928
});
29+
3030
};
3131

3232

src/lib/util/json.ts

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const glob = require('glob')
2-
import { readFile, writeFile } from '../util/fs';
2+
import { readFile, writeFile } from './fs';
3+
import { promisify } from './promisify';
34

45
/**
56
* Reads a JSON file.
@@ -25,25 +26,23 @@ export const writeJson = (object: any, file: string): Promise<any> =>
2526
* Modifies a set of JSON files by invoking `modifyFn`
2627
*
2728
* @param globPattern A glob pattern matching several files. Example: '**\/*.js.map'
28-
* @param modifyFn A callback function that tajes a JSON-parsed input and should return an output
29+
* @param modifyFn A callback function that takes a JSON-parsed input and should return an output
2930
* that will be JSON-stringified
3031
*/
3132
export const modifyJsonFiles = (globPattern: string, modifyFn: (jsonObj: any) => any): Promise<void> => {
3233

33-
return new Promise<string[]>((resolve, reject) => {
34-
glob(globPattern, (err, files: string[]) => {
35-
if (err) {
36-
reject(err);
37-
}
38-
39-
resolve(files);
40-
});
41-
})
42-
.then((fileNames: string[]): Promise<string[]> => Promise.all(
43-
fileNames.map((fileName: string): Promise<string> => readFile(fileName)
44-
.then((fileContent: string) => writeFile(fileName, JSON.stringify(modifyFn(JSON.parse(fileContent)))))
34+
return promisify<string[]>((resolveOrReject) => {
35+
glob(globPattern, resolveOrReject);
36+
})
37+
.then((fileNames: string[]): Promise<string[]> =>
38+
Promise.all(
39+
fileNames.map((fileName: string): Promise<string> =>
40+
readFile(fileName)
41+
.then((fileContent: string) =>
42+
writeFile(fileName, JSON.stringify(modifyFn(JSON.parse(fileContent))))
43+
)
4544
))
4645
)
47-
.then(() => Promise.resolve());
46+
.then(() => Promise.resolve());
4847

4948
};

src/lib/util/promisify.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
2+
export type PromiseCallback<T> = (err: Error, value?: T) => void;
3+
4+
export function promisify<T>(resolver: (resolveOrReject: PromiseCallback<T>) => void): Promise<T> {
5+
return new Promise<T>((resolve, reject) => {
6+
resolver(((err: Error, value?: T): void => {
7+
if (err) {
8+
reject(err);
9+
} else {
10+
resolve(value);
11+
}
12+
}))
13+
});
14+
}

src/lib/util/rimraf.ts

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,16 @@
11
const rm = require('rimraf');
2-
import { debug } from '../util/log';
2+
import { promisify } from './promisify';
3+
import { debug } from './log';
34

45
export const rimraf = (f: any, opts?: any) => {
6+
debug(`rimraf ${f}`);
57

6-
return new Promise((resolve, reject) => {
7-
debug(`rimraf ${f}`);
8-
8+
return promisify<void>((resolveOrReject) => {
99
if (opts) {
10-
rm(f, opts, (err) => {
11-
if (err) {
12-
reject(err);
13-
}
14-
15-
resolve();
16-
});
10+
rm(f, opts, resolveOrReject);
1711
} else {
18-
rm(f, (err) => {
19-
if (err) {
20-
reject(err);
21-
}
22-
23-
resolve();
24-
});
12+
rm(f, resolveOrReject);
2513
}
26-
2714
});
2815

29-
}
16+
};

0 commit comments

Comments
 (0)