Browse Source

Add urlExtension module and tests.

PatrickNausha 4 năm trước cách đây
mục cha
commit
bfbc23d724
2 tập tin đã thay đổi với 75 bổ sung0 xóa
  1. 41 0
      src/utilities/urlExtension.js
  2. 34 0
      test/urlExtension.test.js

+ 41 - 0
src/utilities/urlExtension.js

@@ -0,0 +1,41 @@
+/**
+ * Returns the file extension of the path component of a URL
+ * @param {string} url
+ * @returns {string} null if no extension found
+ */
+export function getUrlExtension( url ) {
+
+	let parsedUrl;
+	try {
+
+		parsedUrl = new URL( url );
+
+	} catch ( _ ) {
+
+		try {
+
+			// Try again as a relative URL
+			parsedUrl = new URL( 'https://example.com/' + url );
+
+		} catch ( _ ) {
+
+			// Ignore invalid URLs
+			return null;
+
+		}
+
+	}
+
+	const filename = parsedUrl.pathname.split( '/' ).pop();
+	const dotIndex = filename.lastIndexOf( '.' );
+	if ( dotIndex === - 1 || dotIndex === filename.length - 1 ) {
+
+		// Has no extension or has trailing .
+		return null;
+
+	}
+
+	const extension = filename.substring( dotIndex + 1 );
+	return extension;
+
+}

+ 34 - 0
test/urlExtension.test.js

@@ -0,0 +1,34 @@
+import { getUrlExtension } from '../src/utilities/urlExtension.js';
+
+describe( 'getUrlExtension', () => {
+
+	it.each( [
+		'https://cloud.skylineglobe.com/sg/b3dm/NeveTzedek3.420160/tileset.json',
+		'https://cloud.skylineglobe.com/sg/b3dm/NeveTzedek3.420160/tileset.json?foo=bar',
+		'https://cloud.skylineglobe.com/sg/b3dm/NeveTzedek3.420160/tileset.json?a.b=c.d',
+		'https://cloud.skylineglobe.com/tileset.json',
+		'https://cloud.skylineglobe.com//tileset.json',
+		'file:///Users/paigemansfield/patricks-code/3DTilesRendererJS/example/b3dmExample.json',
+		'foo.json',
+		'foo.json?a=b',
+		'/foo.json',
+	] )( 'parses the json extension out of %s', url => {
+
+		expect( getUrlExtension( url ) ).toBe( 'json' );
+
+	} );
+
+	it.each( [
+		'https://cloud.skylineglobe.com/tileset',
+		'https://cloud.skylineglobe.com/sg/b3dm/NeveTzedek3.420160/tileset?foo=bar',
+		'https://cloud.skylineglobe.com/sg/b3dm/NeveTzedek3.420160/tileset?a.b=c.d',
+		'https://cloud.skylineglobe.com/tileset',
+		'https://cloud.skylineglobe.com/tileset.',
+		'bacon',
+	] )( 'returns null for strings that are not URLs with extensions %s', url => {
+
+		expect( getUrlExtension( url ) ).toBeNull();
+
+	} );
+
+} );