diff --git a/src/item/fileItem/fileItem.test.ts b/src/item/fileItem/fileItem.test.ts new file mode 100644 index 00000000..68f4b031 --- /dev/null +++ b/src/item/fileItem/fileItem.test.ts @@ -0,0 +1,29 @@ +import { describe, expect, it } from 'vitest'; + +import { getFileExtension } from './fileItem.js'; + +describe('File Item utils', () => { + describe('getFileExtension', () => { + it('Simple extensions', () => { + expect(getFileExtension('sample.txt')).toEqual('.txt'); + expect(getFileExtension('sample.jpeg')).toEqual('.jpeg'); + expect(getFileExtension('s.t')).toEqual('.t'); + }); + it('Simple extensions without dots', () => { + expect(getFileExtension('sample.txt', { includeDot: false })).toEqual( + 'txt', + ); + expect( + getFileExtension('sample.test.txt', { includeDot: false }), + ).toEqual('txt'); + }); + it('Filename with multiple extensions', () => { + expect(getFileExtension('sample.test.txt')).toEqual('.txt'); + expect(getFileExtension('sample.test.hello.wow.txt')).toEqual('.txt'); + }); + it('No extensions return undefined', () => { + expect(getFileExtension('sample')).toEqual(undefined); + expect(getFileExtension('sample.')).toEqual(undefined); + }); + }); +}); diff --git a/src/item/fileItem/fileItem.ts b/src/item/fileItem/fileItem.ts index ebab21ce..8c52e0c7 100644 --- a/src/item/fileItem/fileItem.ts +++ b/src/item/fileItem/fileItem.ts @@ -52,6 +52,27 @@ export const buildS3FileExtra = ( [ItemType.S3_FILE]: extra, }); +/** + * Extract extension from filename. + * @param fileName Name of the file to get the extension from + * @param options Options object, currently contains `includeDot` to return the extension with a leading dot, for easy concatenation, this option is true by default + * @returns + */ +export const getFileExtension = ( + fileName: string, + { includeDot = true } = {}, +): string | undefined => { + // this code has been adapted from https://stackoverflow.com/a/680982 + const extensionRegex = /(?:\.([^.]+))?$/; + const extension = extensionRegex.exec(fileName)?.[1]; + if (extension) { + if (includeDot) { + return `.${extension}`; + } + return extension; + } +}; + /** * File Settings */