@loaders.gl/core
Version:
Framework-independent loaders for 3D graphics formats
211 lines (181 loc) • 5.77 kB
JavaScript
import _typeof from "@babel/runtime/helpers/esm/typeof";
import { getRegisteredLoaders } from './register-loaders';
import { normalizeLoader } from './loader-utils/normalize-loader';
var EXT_PATTERN = /[^.]+$/;
export function selectLoader(loaders) {
var url = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
var _ref = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {},
_ref$nothrow = _ref.nothrow,
nothrow = _ref$nothrow === void 0 ? false : _ref$nothrow;
url = url || '';
if (loaders && !Array.isArray(loaders)) {
var _loader = loaders;
normalizeLoader(_loader);
return _loader;
}
loaders = loaders || getRegisteredLoaders();
normalizeLoaders(loaders);
url = url.replace(/\?.*/, '');
var loader = null;
loader = loader || findLoaderByUrl(loaders, url);
loader = loader || findLoaderByExamingInitialData(loaders, data);
if (!loader) {
if (nothrow) {
return null;
}
throw new Error("No valid loader found for ".concat(url));
}
return loader;
}
function normalizeLoaders(loaders) {
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = loaders[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var loader = _step.value;
normalizeLoader(loader);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator["return"] != null) {
_iterator["return"]();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
function findLoaderByUrl(loaders, url) {
var match = url.match(EXT_PATTERN);
var extension = match && match[0];
var loader = extension && findLoaderByExtension(loaders, extension);
return loader;
}
function findLoaderByExtension(loaders, extension) {
extension = extension.toLowerCase();
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = loaders[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var loader = _step2.value;
var _iteratorNormalCompletion3 = true;
var _didIteratorError3 = false;
var _iteratorError3 = undefined;
try {
for (var _iterator3 = loader.extensions[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
var loaderExtension = _step3.value;
if (loaderExtension.toLowerCase() === extension) {
return loader;
}
}
} catch (err) {
_didIteratorError3 = true;
_iteratorError3 = err;
} finally {
try {
if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) {
_iterator3["return"]();
}
} finally {
if (_didIteratorError3) {
throw _iteratorError3;
}
}
}
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
_iterator2["return"]();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
return null;
}
function findLoaderByExamingInitialData(loaders, data) {
if (!data) {
return null;
}
var _iteratorNormalCompletion4 = true;
var _didIteratorError4 = false;
var _iteratorError4 = undefined;
try {
for (var _iterator4 = loaders[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
var loader = _step4.value;
if (typeof data === 'string') {
if (testText(data, loader)) {
return loader;
}
} else if (ArrayBuffer.isView(data)) {
if (testBinary(data.buffer, data.byteOffset, loader)) {
return loader;
}
} else if (data instanceof ArrayBuffer) {
var byteOffset = 0;
if (testBinary(data, byteOffset, loader)) {
return loader;
}
}
}
} catch (err) {
_didIteratorError4 = true;
_iteratorError4 = err;
} finally {
try {
if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) {
_iterator4["return"]();
}
} finally {
if (_didIteratorError4) {
throw _iteratorError4;
}
}
}
return null;
}
function testText(data, loader) {
return loader.testText && loader.testText(data);
}
function testBinary(data, byteOffset, loader) {
var type = Array.isArray(loader.test) ? 'array' : _typeof(loader.test);
switch (type) {
case 'function':
return loader.test(data, loader);
case 'string':
case 'array':
var tests = Array.isArray(loader.test) ? loader.test : [loader.test];
return tests.some(function (test) {
var magic = getMagicString(data, byteOffset, test.length);
return test === magic;
});
default:
return false;
}
}
function getMagicString(arrayBuffer, byteOffset, length) {
if (arrayBuffer.byteLength <= byteOffset + length) {
return '';
}
var dataView = new DataView(arrayBuffer);
var magic = '';
for (var i = 0; i < length; i++) {
magic += String.fromCharCode(dataView.getUint8(byteOffset + i));
}
return magic;
}
//# sourceMappingURL=select-loader.js.map