-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
change-ext.mts
129 lines (118 loc) · 2.94 KB
/
change-ext.mts
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/**
* @file changeExt
* @module pathe/lib/changeExt
*/
import validateString from '#internal/validate-string'
import validateURLString from '#internal/validate-url-string'
import addExt from '#lib/add-ext'
import extname from '#lib/extname'
import formatExt from '#lib/format-ext'
import removeExt from '#lib/remove-ext'
import type { EmptyString, Ext } from '@flex-development/pathe'
export default changeExt
/**
* Change the file extension of `input`.
*
* Does nothing if the file extension of `input` is already `ext`.
*
* @category
* utils
*
* @this {void}
*
* @param {string} input
* The path or URL string to handle
* @param {string | null | undefined} [ext]
* The file extension to add
* @return {string}
* `input` unmodified or with changed file extension
*/
function changeExt(
this: void,
input: string,
ext?: string | null | undefined
): string
/**
* Change the file extension of `url`.
*
* Does nothing if the file extension of `url` is already `ext`.
*
* @category
* utils
*
* @this {void}
*
* @param {URL} url
* The {@linkcode URL} to handle
* @param {string | null | undefined} [ext]
* The file extension to add
* @return {URL}
* `url` unmodified or with changed file extension
*/
function changeExt(this: void, url: URL, ext?: string | null | undefined): URL
/**
* Change the file extension of `input`.
*
* Does nothing if the file extension of `input` is already `ext`.
*
* @example
* changeExt('file') // 'file'
* @example
* changeExt('file.mjs', null) // 'file'
* @example
* changeExt('file', 'mjs') // 'file.mjs'
* @example
* changeExt('file', '.mjs') // 'file.mjs'
* @example
* changeExt('file.mts', '.d.mts') // 'file.d.mts'
*
* @category
* utils
*
* @this {void}
*
* @param {URL | string} input
* The {@linkcode URL}, URL string, or path to handle
* @param {string | null | undefined} [ext]
* The file extension to add
* @return {URL | string}
* `input` unmodified or with changed file extension
*/
function changeExt(
this: void,
input: URL | string,
ext?: string | null | undefined
): URL | string
/**
* @this {void}
*
* @param {URL | string} input
* The {@linkcode URL}, URL string, or path to handle
* @param {string | null | undefined} [ext]
* The file extension to add
* @return {URL | string}
* `input` unmodified or with changed file extension
*/
function changeExt(
this: void,
input: URL | string,
ext?: string | null | undefined
): URL | string {
validateURLString(input, 'input')
if (typeof input === 'string') {
if (ext !== null && ext !== undefined) {
validateString(ext, 'ext')
ext = formatExt(ext)
}
/**
* File extension of {@linkcode input}.
*
* @const {EmptyString | Ext} extension
*/
const extension: EmptyString | Ext = extname(input)
input = removeExt(input, extension)
if (!ext) return input
return addExt(input, ext)
}
return input.href = changeExt(input.href, ext), input
}