# Source: index.js

    /**
     * Whether imported (ES6 modules) or loaded via script tag (UMD), this module represents
     *  the "public interface" via which core LocusZoom features and plugins are exposed for programmatic usage.
     *
     * A library using this file will need to load `locuszoom.css` separately in order for styles to appear.
     *
     * @module LocusZoom
     */
    import version from './version';

    import {default as DataSources} from './data';
    import { populate } from './helpers/display';

    import {
        ADAPTERS as Adapters,
        DATA_LAYERS as DataLayers,
        DATA_OPS as DataFunctions,
        LAYOUTS as Layouts,
        MATCHERS as MatchFunctions,
        SCALABLE as ScaleFunctions,
        TRANSFORMS as TransformationFunctions,
        WIDGETS as Widgets,
    } from './registry';

    const LocusZoom = {
        version,
        // Helpers for creating plots- the main public interface for most use cases
        populate,
        DataSources,
        // Registries for plugin system
        Adapters,
        DataLayers,
        DataFunctions,
        Layouts,
        MatchFunctions,
        ScaleFunctions,
        TransformationFunctions,
        Widgets,

        get KnownDataSources() { // Backwards- compatibility alias
            console.warn('Deprecation warning: KnownDataSources has been renamed to "Adapters"');
            return Adapters;
        },
    };

    /**
     * @callback pluginCallback
     * @param {Object} LocusZoom The global LocusZoom object
     * @param args Any additional arguments passed to LocusZoom.use will be passed to the function when the plugin is loaded
     */

    const INSTALLED_PLUGINS = [];

    /**
     * @alias module:LocusZoom.use
     * @param {pluginCallback} plugin The plugin should be a module that exports the function as either the default export,
     *  or as a member named "install"
     * @param args Additional options to be passed when creating the plugin
     */
    LocusZoom.use = function(plugin, ...args) {
        // Deliberately similar implementation to Vue.js .use() plugin system
        if (INSTALLED_PLUGINS.includes(plugin)) {
            // Avoid double-installation of a plugin
            return;
        }

        args.unshift(LocusZoom); // All plugins are passed a reference to LocusZoom object
        if (typeof plugin.install === 'function') {
            plugin.install.apply(plugin, args);
        } else if (typeof plugin === 'function') {
            plugin.apply(null, args);
        } else {
            throw new Error('Plugin must export a function that receives the LocusZoom object as an argument');
        }
        INSTALLED_PLUGINS.push(plugin);
    };

    export default LocusZoom;