-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
83 lines (73 loc) · 1.83 KB
/
index.js
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/**
* @typedef {import('vfile').VFile} VFile
* @typedef {import('mkdirp').Mode | import('mkdirp').Options} Options
* @typedef {import('mkdirp').Mode | import('mkdirp').OptionsSync} OptionsSync
*/
/**
* @template CallbackFile
* @callback Callback
* @param {Error|null} error
* @param {CallbackFile} file
*/
import path from 'node:path'
import oMkdirp from 'mkdirp'
export const mkdirp =
/**
* @type {{
* <File = VFile>(file: File, options: Options, callback: Callback<File>): void
* <File = VFile>(file: File, callback: Callback<File>): void
* <File = VFile>(file: File, options?: Options): Promise<File>
* }}
*/
(
/**
* @template {VFile} LocalFile
* @param {LocalFile} file
* @param {Options} [options]
* @param {Callback<LocalFile>} [callback]
* @returns {Promise<LocalFile>?}
*/
function (file, options, callback) {
const root = base(file)
if (!callback && typeof options === 'function') {
callback = options
options = {}
}
if (!callback) {
return new Promise(executor)
}
executor(null, callback)
/**
* @param {(x: LocalFile) => void} resolve
* @param {(x: Error, y?: LocalFile) => void} reject
*/
function executor(resolve, reject) {
oMkdirp(root, options).then(ok, reject)
/** */
function ok() {
if (resolve) {
resolve(file)
} else {
callback(null, file)
}
}
}
}
)
/**
* @template {VFile} File
* @param {File} file
* @param {OptionsSync} [options]
* @returns {File}
*/
export function mkdirpSync(file, options) {
oMkdirp.sync(base(file), options)
return file
}
/**
* @param {VFile} file
* @returns {string}
*/
function base(file) {
return path.resolve(file.cwd, file.dirname)
}