-
-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathhooks.ts
68 lines (63 loc) · 1.79 KB
/
hooks.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import { promisify } from 'util';
import {
FinalizePackageTargetsHookFunction,
HookFunction,
HookFunctionErrorCallback,
} from './types';
export async function promisifyHooks(
hooks: HookFunction[] | FinalizePackageTargetsHookFunction[] | undefined,
args?: unknown[],
) {
if (!hooks || !Array.isArray(hooks)) {
return Promise.resolve();
}
await Promise.all(
hooks.map((hookFn) => promisify(hookFn).apply(promisifyHooks, args)),
);
}
/**
* By default, the functions are called in parallel (via
* [`Promise.all`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)).
* If you need the functions called serially, you can use the `serialHooks` utility function:
*
* ```javascript
* const { packager, serialHooks } = require('@electron/packager')
*
* packager({
* // ...
* afterCopy: [serialHooks([
* (buildPath, electronVersion, platform, arch, callback) => {
* setTimeout(() => {
* console.log('first function')
* callback()
* }, 1000)
* },
* (buildPath, electronVersion, platform, arch, callback) => {
* console.log('second function')
* callback()
* }
* ])],
* // ...
* })
* ```
*/
export function serialHooks(hooks: Parameters<typeof promisifyHooks>[0] = []) {
return async function runSerialHook(
...serialHookParams: Parameters<
HookFunction | FinalizePackageTargetsHookFunction
>
) {
const args = Array.prototype.slice.call(
serialHookParams,
0,
-1,
) as Parameters<HookFunction>;
const [done] = Array.prototype.slice.call(serialHookParams, -1) as [
HookFunctionErrorCallback,
];
for (const hook of hooks) {
await (hook as HookFunction).apply(runSerialHook, args);
}
return done();
};
}