-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
format.ts
66 lines (59 loc) · 2.2 KB
/
format.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
/**
* @file format
* @module pathe/lib/format
*/
import type { FormatInputPathObject } from '#src/interfaces'
import ensurePosix from '#src/internal/ensure-posix'
import validateObject from '#src/internal/validate-object'
import formatExt from '#src/utils/format-ext'
import type { Optional } from '@flex-development/tutils'
import sep from './sep'
/**
* Returns a path string from an object — the opposite of [`parse`][1].
*
* When adding properties to `pathObject`, there are combinations where one
* property has priority over another:
*
* - `pathObject.root` is ignored if `pathObject.dir` is provided
* - `pathObject.ext` is ignored if `pathObject.base` exists
* - `pathObject.name` is ignored if `pathObject.base` exists
*
* [1]: {@link ./parse.ts}
*
* @param {FormatInputPathObject} pathObject - Object to evaluate
* @param {string} [pathObject.base] - File name including extension (if any)
* @param {string} [pathObject.dir] - Directory name or full directory path
* @param {string} [pathObject.ext] - File extension (if any)
* @param {string} [pathObject.name] - File name without extension (if any)
* @param {string} [pathObject.root] - Root of path
* @return {string} Path string
* @throws {TypeError} If `pathObject` is not an object
*/
const format = (pathObject: FormatInputPathObject): string => {
validateObject(pathObject, 'pathObject')
// ensure path components meet posix standards
pathObject.base && (pathObject.base = ensurePosix(pathObject.base))
pathObject.dir && (pathObject.dir = ensurePosix(pathObject.dir))
pathObject.ext && (pathObject.ext = ensurePosix(pathObject.ext))
pathObject.name && (pathObject.name = ensurePosix(pathObject.name))
pathObject.root && (pathObject.root = ensurePosix(pathObject.root))
/**
* File name including extension (if any).
*
* @const {string} base
*/
const base: string =
pathObject.base || `${pathObject.name ?? ''}${formatExt(pathObject.ext)}`
/**
* Directory name or full path.
*
* @const {Optional<string>} dir
*/
const dir: Optional<string> = pathObject.dir || pathObject.root
return !dir
? base
: dir === pathObject.root
? `${dir}${base}`
: `${dir}${sep}${base}`
}
export default format