|
- const EXTENSION_DELIMITER = '.'
- const MULTIPLE_VALID_EXTENSION_DELIMITER = ' '
-
- export type IsValidFilenameConfig = {
- validExtensions: string | string[]
- allowMultipleExtensions?: boolean
- }
-
- type IsValidFileName = (config: IsValidFilenameConfig) => (maybeFileName: string) => boolean
-
- const isValidFileName: IsValidFileName = config => {
- let validExtensionsArray: string[]
- const maybeValidExtensions = config.validExtensions as unknown
- if (typeof maybeValidExtensions === 'string') {
- validExtensionsArray = (config.validExtensions as string)
- .split(MULTIPLE_VALID_EXTENSION_DELIMITER)
- .filter(p => p.trim().length > 0)
- } else if (
- Array.isArray(maybeValidExtensions)
- && (config.validExtensions as unknown[]).every(s => typeof s === 'string')
- ) {
- if ((config.validExtensions as unknown[]).length < 1) {
- throw RangeError('There must be at least 1 valid extension defined.')
- }
- validExtensionsArray = config.validExtensions as string[]
- } else {
- throw TypeError('Valid extensions should be a space-delimited string or a string array.')
- }
-
- // strip . in valid extensions for easier matching
- const validExtensions = validExtensionsArray.map(e => (
- e.startsWith(EXTENSION_DELIMITER)
- ? e.slice(EXTENSION_DELIMITER.length)
- : e
- ))
-
- return maybeFileName => {
- if (typeof maybeFileName as unknown !== 'string') {
- throw TypeError('Argument should be a string.')
- }
-
- const fileName = maybeFileName as string
- const [, ...extensions] = fileName.split(EXTENSION_DELIMITER)
-
- if (config.allowMultipleExtensions) {
- return validExtensions.reduce<boolean>(
- (isValid, validExtension) => (
- isValid
- || extensions.includes(validExtension)
- ),
- false
- )
- }
-
- return validExtensions.reduce<boolean>(
- (isValid, validExtension) => (
- isValid
- || extensions.join(EXTENSION_DELIMITER).endsWith(validExtension)
- ),
- false
- )
- }
- }
-
- export default isValidFileName
|