@loaders.gl/core
Version:
The core API for working with loaders.gl loaders and writers
77 lines (67 loc) • 2.57 kB
text/typescript
// loaders.gl
// SPDX-License-Identifier: MIT
// Copyright (c) vis.gl contributors
import type {Loader, LoaderOptions, LoaderContext} from '@loaders.gl/loader-utils';
import {getFetchFunction} from './get-fetch-function';
import {extractQueryString, stripQueryString} from '../utils/url-utils';
import {path} from '@loaders.gl/loader-utils';
/** Properties for creating an updated context */
type LoaderContextProps = Omit<LoaderContext, 'fetch'> & Partial<Pick<LoaderContext, 'fetch'>>;
/**
* "sub" loaders invoked by other loaders get a "context" injected on `this`
* The context will inject core methods like `parse` and contain information
* about loaders and options passed in to the top-level `parse` call.
*
* @param context
* @param options
* @param previousContext
*/
export function getLoaderContext(
context: LoaderContextProps,
options: LoaderOptions,
parentContext: LoaderContext | null
): LoaderContext {
// For recursive calls, we already have a context
// TODO - add any additional loaders to context?
if (parentContext) {
return parentContext;
}
const newContext: LoaderContext = {
fetch: getFetchFunction(options, context),
...context
};
// Parse URLs so that subloaders can easily generate correct strings
if (newContext.url) {
const baseUrl = stripQueryString(newContext.url);
newContext.baseUrl = baseUrl;
newContext.queryString = extractQueryString(newContext.url);
newContext.filename = path.filename(baseUrl);
newContext.baseUrl = path.dirname(baseUrl);
}
// Recursive loading does not use single loader
if (!Array.isArray(newContext.loaders)) {
newContext.loaders = null;
}
return newContext;
}
// eslint-disable-next-line complexity
export function getLoadersFromContext(
loaders: Loader[] | Loader | undefined,
context?: LoaderContext
): Loader | Loader[] | undefined {
// A single loader (non-array) indicates no selection desired. Force select.
if (loaders && !Array.isArray(loaders)) {
return loaders;
}
// Create a merged list
let candidateLoaders;
if (loaders) {
candidateLoaders = Array.isArray(loaders) ? loaders : [loaders];
}
if (context && context.loaders) {
const contextLoaders = Array.isArray(context.loaders) ? context.loaders : [context.loaders];
candidateLoaders = candidateLoaders ? [...candidateLoaders, ...contextLoaders] : contextLoaders;
}
// If no loaders, return null to look in globally registered loaders
return candidateLoaders && candidateLoaders.length ? candidateLoaders : undefined;
}