JavaScript Extension Development API for Oracle Visual Builder Cloud Service - Classic Applications

Source: components.dt/js/api/ComponentProviderRegistry.js

define([
    'module',
    'components.dt/js/spi/registration/DropZoneAcceptorProvider',
    'components.dt/js/spi/registration/DropZoneSupplierProvider',
    'components.dt/js/spi/registration/PasterProvider',
    'core/js/api/Listenable'
], function (
    module,
    DropZoneAcceptorProvider,
    DropZoneSupplierProvider,
    PasterProvider,
    Listenable
    ) {

    'use strict';

    /**
     * Registry of custom component service providers.
     *
     * <p>When writing a custom component that is about to be registered into
     * ABCS you register its service providers in <em>ComponentProviderRegistry</em>.
     * ABCS then picks the providers from here and ask them to return service
     * instances ({@link components.dt/js/spi/creators/Creator Creators},
     * {@link components.dt/js/spi/generators/Generator Generators},
     * {@link components.dt/js/spi/propertyinspectors/PropertyInspector Property Inspectors}
     * and others) when needed depending on the lifecycle phase applied to the component
     * at the moment.</p>
     *
     * <p>Service providers (and the services themselves) that you may plug into ABCS
     * are descibed by the {@link components.dt/js/api/ComponentProviderRegistry.ComponentRegistration component registration object},
     * registered into ABCS with {@link components.dt/js/api/ComponentProviderRegistry#registerComponent ComponentProviderRegistry.registerComponent}
     * and unregistered (when the component is to be removed from ABCS) with
     * {@link components.dt/js/api/ComponentProviderRegistry#unregisterComponent ComponentProviderRegistry.unregisterComponent}</p>
     *
     * @AbcsExtension stable
     * @version 16.3.5
     * @exports components.dt/js/api/ComponentProviderRegistry
     * @constructor
     * @private
     * @singleton
     * @see {@link components.dt/js/api/ComponentProviderRegistry.ComponentRegistration ComponentProviderRegistry.ComponentRegistration}
     * for how to build a registration object.
     * @see {@link components.dt/js/api/ComponentProviderRegistry#registerComponent ComponentProviderRegistry.registerComponent} how to register components.
     * @see {@link components.dt/js/api/ComponentProviderRegistry#unregisterComponent ComponentProviderRegistry.unregisterComponent} how to unregister components.
     */
    function ComponentProviderRegistry() {
        AbcsLib.checkSingleton(ComponentProviderRegistry);
        Listenable.apply(this, arguments);

        this._registrations = {};
    }

    AbcsLib.mixin(ComponentProviderRegistry, Listenable);

    ComponentProviderRegistry._LOGGER = Logger.get(module.id);

    /**
     * Fired when a component is (re)registered.
     */
    ComponentProviderRegistry.prototype.COMPONENT_REGISTERED = 'ComponentProviderRegistry.componentRegistered';

    /**
     * Fired when a component is unregistered.
     */
    ComponentProviderRegistry.prototype.COMPONENT_UNREGISTERED = 'ComponentProviderRegistry.componentUnregistered';

    /**
     * Registers component service providers into ABCS and with that basically
     * activates the component's functionality inside ABCS UI.
     *
     * <p>This is to be called when you want to make your component active inside
     * ABCS and make it able to be dropped from the Component Palette, properly
     * render inside an ABCS page or let users modify its behaviour in Property
     * Inspector UI.</p>
     *
     * <p>You are supposed to pass a {@link components.dt/js/api/ComponentProviderRegistry.ComponentRegistration component registration object}
     * defining providers of the various ABCS services as the method parameter.</p>
     *
     * <p>This <strong>does not overwrite</strong> previous registrations, if there
     * is a registration with the same id already present, it will not be overwritten
     * and <code>false</code> will be returned.</p>
     *
     * @AbcsExtension stable
     * @version 16.3.5
     * @param {components.dt/js/api/ComponentProviderRegistry.ComponentRegistration} componentRegistration component registration
     * @return {Boolean} <code>true</code> when the component successfully registers
     * its registration object. If there is an existing registration with the same id
     * present, the method will return <code>false</code>.
     * @throws {Error} When <code>componentRegistration</code> is invalid.
     * @example <caption>Register component services</caption>
     * define([
     *     'components.dt/js/api/ComponentProviderRegistry',
     *     'myComponent/PaletteRegistrationProvider',
     *     'myComponent/CreatorProvider',
     *     'myComponent/GeneratorProvider',
     *     'myComponent/PropertyInspectorProvider',
     *     'myComponent/DeleterProvider'
     * ], function (
     *     componentProviderRegistry,
     *     myPaletteRegistrationProviderInstance,
     *     myCreatorProviderInstance,
     *     myGeneratorProviderInstance,
     *     myPropertyInspectorProviderInstance,
     *     myDeleterProviderInstance
     * ) {
     *     // create registration object with all service providers to register
     *     var myComponentRegistration = {
     *         id: 'com.my.MyComponent',
     *         displayName: 'My Cool Component',
     *         paletteRegistrationProvider: myPaletteRegistrationProviderInstance,
     *         creatorProvider: myCreatorProviderInstance,
     *         generatorProvider: myGeneratorProviderInstance,
     *         propertyInspectorProvider: myPropertyInspectorProviderInstance,
     *         deleterProvider: myDeleterProviderInstance
     *     };
     *
     *     // register the component registration into ABCS
     *     componentProviderRegistry.registerComponent(myComponentRegistration);
     * });
     * @see {@link components.dt/js/api/ComponentProviderRegistry.ComponentRegistration ComponentProviderRegistry.ComponentRegistration}
     * for how to build a registration object.
     */
    ComponentProviderRegistry.prototype.registerComponent = function (componentRegistration) {
        AbcsLib.checkParameterCount(1);
        AbcsLib.checkDefined(componentRegistration, 'componentRegistration');
        ComponentProviderRegistry._checkRegistration(componentRegistration);
        if (this._registrations[componentRegistration.id]) {
            return false;
        }
        this._registrations[componentRegistration.id] = {
            id: componentRegistration.id,
            displayName: componentRegistration.displayName,
            creatorProvider: componentRegistration.creatorProvider,
            propertyInspectorProvider: componentRegistration.propertyInspectorProvider,
            generatorProvider: componentRegistration.generatorProvider,
            deleterProvider: componentRegistration.extendedDeleterProvider || componentRegistration.deleterProvider,
            extendedDeleterProvider: componentRegistration.extendedDeleterProvider,
            pasterProvider: componentRegistration.pasterProvider,
            paletteRegistrationProvider: componentRegistration.paletteRegistrationProvider,
            dropZoneAcceptorProvider: componentRegistration.dropZoneAcceptorProvider,
            dropZoneSupplierProvider: componentRegistration.dropZoneSupplierProvider
        };
        this.fireEvent(this.COMPONENT_REGISTERED, componentRegistration.id);
        return true;
    };

    /**
     * Removes existing component's registration.
     *
     * <p>Call this if you no longer want your component to be part of ABCS.</p>
     *
     * <p>Removes all its palette registration, creators, property inspectors, generators
     * and other services from the ABCS system previously registered with
     * {@link components.dt/js/api/ComponentProviderRegistry.registerComponent ComponentProviderRegistry.registerComponent}.</p>
     *
     * @AbcsExtension stable
     * @version 16.3.5
     * @param {String} componentID component id the component was registered with.
     * @returns {Boolean} flag indicating the component has been unregistered
     * successfully. Will be <code>true</code> only if a previously existing registration
     * is successfully removed.
     * @example <caption>Unregister component services</caption>
     * // simply call ComponentProviderRegistry.unregisterComponent
     * // to unregister all component service providers
     * if (componentProviderRegistry.unregisterComponent('com.my.MyComponent')) {
     *     console.log('MyComponent successfully unregistered from ABCS');
     * }
     */
    ComponentProviderRegistry.prototype.unregisterComponent = function (componentID) {
        AbcsLib.checkParameterCount(1);
        AbcsLib.checkDefined(componentID, componentID);
        AbcsLib.checkDataType(componentID, AbcsLib.Type.STRING);
        var registration = this._registrations[componentID];
        if (registration) {
            delete this._registrations[componentID];
            this.fireEvent(this.COMPONENT_UNREGISTERED, componentID);
            return true;
        }
        return false;
    };

    ComponentProviderRegistry.prototype.findPropertyInspector = function (view) {
        if (view) {
            for (var key in this._registrations) {
                var registration = this._registrations[key];
                var provider = registration.propertyInspectorProvider;
                if (provider) {
                    var propertyInspector = provider.getPropertyInspector(view);
                    if (propertyInspector) {
                        return propertyInspector;
                    }
                }
            }
        }
        return null;
    };

    ComponentProviderRegistry.prototype.findViewGenerator = function (view) {
        if (view) {
            for (var key in this._registrations) {
                var registration = this._registrations[key];
                var provider = registration.generatorProvider;
                var generator = provider && provider.getGenerator(view);
                if (generator) {
                    return generator;
                }
            }
        }
        return null;
    };

    ComponentProviderRegistry.prototype.findViewDeleter = function (view) {
        if (view) {
            for (var key in this._registrations) {
                var registration = this._registrations[key];
                var provider = registration.deleterProvider;
                var deleter = provider && provider.getDeleter(view);
                if (deleter) {
                    return deleter;
                }
            }
        }
        return null;
    };

    ComponentProviderRegistry.prototype.findViewToDelete = function (view) {
        var viewToDelete = view;
        if (viewToDelete) {
            do {
                view = viewToDelete;
                viewToDelete = this._findViewToDelete(viewToDelete);
            } while (view !== viewToDelete);
        }
        return viewToDelete;
    };

    ComponentProviderRegistry.prototype._findViewToDelete = function (view) {
        for (var key in this._registrations) {
            var registration = this._registrations[key];
            var provider = registration.extendedDeleterProvider;
            var viewToDelete = provider && provider.getTopViewToDelete(view);
            if (viewToDelete && view !== viewToDelete) {
                view = viewToDelete;
                break;
            }
        }
        return view;
    };

    ComponentProviderRegistry.prototype.findViewPaster = function (view) {
        if (view) {
            for (var key in this._registrations) {
                var registration = this._registrations[key];
                var provider = registration.pasterProvider;
                var paster = provider && provider.getPaster(view);
                if (paster && paster.canPaste(view)) {
                    return paster;
                }
            }
        }
        return null;
    };

    ComponentProviderRegistry.prototype.findCreator = function (componentId) {
        if (componentId) {
            var registration = this._registrations[componentId];
            var provider = registration && registration.creatorProvider;
            if (provider) {
                return provider.getCreator();
            }
        }
    };

    ComponentProviderRegistry.prototype.getDisplayName = function (componentId) {
        var result;
        if (componentId) {
            var registration = this._registrations[componentId];
            result = registration && registration.displayName;
        }
        return result;
    };

    /**
     * Get registration for all registered components.
     *
     * @param {String} [componentId] get registration only for the given component
     * @returns {Array} palette item registrations
     */
    ComponentProviderRegistry.prototype.getPaletteRegistrations = function (componentId) {
        var self = this;
        var items = [];
        var keys = componentId && [componentId] || Object.keys(self._registrations);
        for (var i = 0; i < keys.length; ++i) {
            var key = keys[i];
            var registration = this._registrations[key];
            var paletteRegistrationProvider = registration.paletteRegistrationProvider;
            var paletteItemConfig = paletteRegistrationProvider && paletteRegistrationProvider.getPaletteItemConfig();
            if (paletteItemConfig) {
                var categories = paletteItemConfig.categoryName;
                if (!categories) {
                    categories = [];
                } else if (!(categories instanceof Array)) {
                    categories = [categories];
                }
                items.push({
                    paletteItemConfig: paletteItemConfig,
                    categories: categories,
                    componentId: key,
                    displayName: registration.displayName,
                    creator: self.findCreator(key)
                });
            }
        }
        return items;
    };

    ComponentProviderRegistry.prototype.findDropZoneAcceptor = function (view) {
        var result = null;
        if (view) {
            for (var key in this._registrations) {
                var registration = this._registrations[key];
                var dropZoneAcceptorProvider = registration.dropZoneAcceptorProvider;
                var dropZoneAcceptor = dropZoneAcceptorProvider && dropZoneAcceptorProvider.getDropZoneAcceptor(view);
                if (dropZoneAcceptor) {
                    result = dropZoneAcceptor;
                    break;
                }
            }
        }
        return result;
    };

    ComponentProviderRegistry.prototype.getDropZoneSuppliers = function () {
        var items = [];
        for (var key in this._registrations) {
            var registration = this._registrations[key];
            var dropZoneSupplierProvider = registration.dropZoneSupplierProvider;
            if (dropZoneSupplierProvider) {
                items.push(dropZoneSupplierProvider.getDropZoneSupplier());
            }
        }
        return items;
    };

    ComponentProviderRegistry._checkRegistration = function (componentRegistration) {
        AbcsLib.checkDefined(componentRegistration.id, 'componentRegistration.id');
        AbcsLib.checkDataType(componentRegistration.id, AbcsLib.Type.STRING);
        if (!componentRegistration.id) {
            throw new Error('componentRegistration.id must not be empty');
        }
        AbcsLib.checkDefined(componentRegistration.displayName, 'componentRegistration.displayName');
        AbcsLib.checkDataType(componentRegistration.displayName, AbcsLib.Type.STRING);
        if (!componentRegistration.displayName) {
            throw new Error('componentRegistration.displayName must not be empty');
        }
        AbcsLib.checkObjectLiteral(componentRegistration, [
            'id',
            'displayName',
            'creatorProvider',
            'propertyInspectorProvider',
            'generatorProvider',
            'deleterProvider',
            'extendedDeleterProvider',
            'pasterProvider',
            'paletteRegistrationProvider',
            'dropZoneAcceptorProvider',
            'dropZoneSupplierProvider'
        ]);
        // we may check only the unpublished SPIs as for those already out
        // a failure would be an incompatible change
        if (componentRegistration.dropZoneAcceptorProvider) {
            AbcsLib.checkSPIImpl(componentRegistration.dropZoneAcceptorProvider, DropZoneAcceptorProvider);
        }
        if (componentRegistration.dropZoneSupplierProvider) {
            AbcsLib.checkSPIImpl(componentRegistration.dropZoneSupplierProvider, DropZoneSupplierProvider);
        }
        if (componentRegistration.pasterProvider) {
            AbcsLib.checkSPIImpl(componentRegistration.pasterProvider, PasterProvider);
        }
        if (componentRegistration.extendedDeleterProvider) {
            AbcsLib.checkObjectLiteral(componentRegistration.extendedDeleterProvider, ['getDeleter', 'getTopViewToDelete']);
        }
        if (componentRegistration.extendedDeleterProvider && componentRegistration.deleterProvider) {
            throw new Error('Cannot specify both deleterProvider and extendedDeleterProvider');
        }
    };

    /**
     * Component registration object containing info about component providers.
     * Describes what ABCS Component services the component provides and wants
     * to plug into ABCS and thus the component lifecycle it supports.
     *
     * <p>Custom UI components consists of several related services plugged into
     * ABCS that define its lifecycle and behavior and specify how the component
     * renders its model, how it is registered in the Component Palette, what {@link pages.dt/js/api/View view}
     * hierarchy representing the component model it creates or how it lets users
     * modify its behavior in the Property Inspector UI.</p>
     *
     * <p>Create an object described by this interface and register into ABCS
     * with {@link components.dt/js/api/ComponentProviderRegistry#registerComponent ComponentProviderRegistry.registerComponent}.<br>
     * ABCS lets you register the following providers returning ABCS component
     * SPI implementations describing the lifecycle of your custom component:</p>
     *
     * <dl>
     * <dt>{@link components.dt/js/spi/registration/CreatorProvider creatorProvider}</dt>
     * <dd><p>Returns instances of your component {@link components.dt/js/spi/creators/Creator creator}.<br>
     * Creator is called when ABCS makes new instances of your component, either
     * when dropped from the Component Palette or made programatically via the
     * {@link components.dt/js/api/ComponentFactory Creator API}.</p>
     * <p>You should always register an instance of <em>CreatorProvider</em> as without
     * it ABCS will not be able to create your components.</p></dd>
     *
     * <dt>{@link components.dt/js/spi/registration/PaletteRegistrationProvider paletteRegistrationProvider}</dt>
     * <dd><p>Returns {@link components.dt/js/spi/registration/PaletteRegistrationProvider.PaletteItemConfig palette registration configuration}
     * defining the way your component is registered inside the ABCS Component Palette
     * and how it behaves when being dropped into the ABCS designer (a page).</p>
     * <p>Not all components need to be registered in the Component Palette as some
     * may only be instantiated programatically through the {@link components.dt/js/api/ComponentFactory Creator API}
     * meaning they will not be standalone components but will live only as part
     * of a composite <dfn title="Component built from smaller blocks with ABCS designer understanding its hierarchy and able to customize its internals">white-box component</dfn>.</p></dd>
     *
     * <dt>{@link components.dt/js/spi/registration/GeneratorProvider generatorProvider}</dt>
     * <dd><p>Returns component's {@link components.dt/js/spi/generators/Generator generator}
     * transforming your component {@link pages.dt/js/api/View views} into DOM
     * elements browser can then render in the page.</p>
     * </dd>
     *
     * <dt>{@link components.dt/js/spi/registration/PropertyInspectorProvider propertyInspectorProvider}</dt>
     * <dd><p>Returns an instance of a {@link components.dt/js/spi/propertyinspectors/PropertyInspector property inspector}.
     * A property inspector defines how (and if) users are allowed to modify the component's
     * behaviour inside the ABCS Property Inspector UI. It defines the view and model
     * for the component's implementation of a Property inspector that will show
     * when the component is selected in the ABCS designer.</p>
     * <p>If you do not want to allow users to modify your component properties
     * and behavior you do not need to register this provider in which case no
     * Property Inspector UI will be displayed when the component is selected.</p></dd>
     *
     * <dt>{@link components.dt/js/spi/registration/DeleterProvider deleterProvider}</dt>
     * <dd><p>Returns an instance of a {@link components.dt/js/spi/deleters/Deleter deleter}.
     * This service is responsible for a cleanup of any artifacts created by your
     * component during its lifecycle when the component is deleted from a page.</p>
     * <p>Registering its instance is not always necessary, it is required only
     * when the component creates artifacts that you no longer want to be part of
     * the parent ABCS application.<br>
     * It may also come in handy if you want to display a removal confirmation
     * dialog prior to the actual removal.</p></dd>
     * </dl>
     *
     * <p>The component lifecycle usually consists of:</p>
     * <ul>
     * <li>User looks the component up in the Component Palette where it is
     * registered using a {@link components.dt/js/spi/registration/PaletteRegistrationProvider PaletteRegistrationProvider}.</li>
     *
     * <li>User drag and drops the component from the palette into the ABCS
     * designer and at that point ABCS calls the component's {@link components.dt/js/spi/creators/Creator Creator}
     * returned by registered {@link components.dt/js/spi/registration/CreatorProvider CreatorProvider}.
     * The <em>creator</em> creates component's {@link pages.dt/js/api/View views} and
     * combines them into the componet's view hierarchy (consisting of either one
     * view or more complex treeish structure).</li>
     *
     * <li>ABCS renders the current page with component views created by the component's {@link components.dt/js/spi/creators/Creator Creator}
     * and calls the component's {@link components.dt/js/spi/generators/Generator Generator}
     * returned by the registered {@link components.dt/js/spi/registration/GeneratorProvider GeneratorProvider}
     * to take care of transforming the views into DOM elements (wrapped in <i>jQuery</i>
     * elements) browser then can properly render.</li>
     *
     * <li>When user selects the component (one of its views) ABCS calls the
     * {@link components.dt/js/spi/propertyinspectors/PropertyInspector PropertyInspector} (if supported and returned by the component)
     * returned by the registered {@link components.dt/js/spi/registration/PropertyInspectorProvider PropertyInspectorProvider}
     * and renders the Property Inspector UI according to the view and model defined
     * by it.</li>
     *
     * <li>Finally when the component is deleted from a page ABCS lets the component's
     * {@link components.dt/js/spi/deleters/Deleter Deleter} (if supported and returned)
     * returned by the registered {@link components.dt/js/spi/registration/DeleterProvider DeleterProvider}
     * to clean up and artifacts created during the component's lifecycle that
     * need to be removed along with the component.</li>
     * </ul>
     *
     * @AbcsExtension stable
     * @version 16.3.5
     * @memberof components.dt/js/api/ComponentProviderRegistry
     * @objectLiteral
     * @see {@link components.dt/js/api/ComponentProviderRegistry ComponentProviderRegistry}
     * @see {@link components.dt/js/spi/registration/PaletteRegistrationProvider PaletteRegistrationProvider}
     * @see {@link components.dt/js/spi/registration/CreatorProvider CreatorProvider}
     * @see {@link components.dt/js/spi/registration/GeneratorProvider GeneratorProvider}
     * @see {@link components.dt/js/spi/registration/PropertyInspectorProvider PropertyInspectorProvider}
     * @see {@link components.dt/js/spi/registration/DeleterProvider DeleterProvider}
     * @example <caption>Registering component services</caption>
     * define([
     *     'components.dt/js/api/ComponentProviderRegistry',
     *     'myComponent/PaletteRegistrationProvider',
     *     'myComponent/CreatorProvider',
     *     'myComponent/GeneratorProvider',
     *     'myComponent/PropertyInspectorProvider',
     *     'myComponent/DeleterProvider'
     * ], function (
     *     componentProviderRegistry,
     *     myPaletteRegistrationProviderInstance,
     *     myCreatorProviderInstance,
     *     myGeneratorProviderInstance,
     *     myPropertyInspectorProviderInstance,
     *     myDeleterProviderInstance
     * ) {
     *     // create registration object with all service providers to register
     *     var myComponentRegistration = {
     *         id: 'com.my.MyComponent',
     *         displayName: 'My Cool Component',
     *         paletteRegistrationProvider: myPaletteRegistrationProviderInstance,
     *         creatorProvider: myCreatorProviderInstance,
     *         generatorProvider: myGeneratorProviderInstance,
     *         propertyInspectorProvider: myPropertyInspectorProviderInstance,
     *         deleterProvider: myDeleterProviderInstance
     *     };
     *
     *     // register the component registration into ABCS
     *     componentProviderRegistry.registerComponent(myComponentRegistration);
     * });
     */
    var ComponentRegistration = function () {
    };

    /**
     * Specifies the component ID.
     *
     * <p><strong>Must</strong> be provided and must be a globally unique identifier.</p>
     *
     * @AbcsExtension stable
     * @version 16.3.5
     * @type {String}
     */
    ComponentRegistration.prototype.id = '';

    /**
     * Specifies the component's display name.
     *
     * <p>The display name will be show up in various places in ABCS where the
     * component takes place (such as in the Component Palette from where it may
     * be dropped into the designer).</p>
     *
     * <p><strong>Must</strong> be specified.</p>
     *
     * @AbcsExtension stable
     * @version 16.3.5
     * @type {String}
     */
    ComponentRegistration.prototype.displayName = '';

    /**
     * Provider of component's {@link components.dt/js/spi/creators/Creator creator}.
     *
     * <p>Returns instances of your component {@link components.dt/js/spi/creators/Creator creator}.<br>
     * Creator is called when ABCS makes new instances of your component, either
     * when dropped from the Component Palette or made programatically via the
     * {@link components.dt/js/api/ComponentFactory Creator API}.</p>
     *
     * @AbcsExtension stable
     * @version 16.3.5
     * @type {components.dt/js/spi/registration/CreatorProvider}
     * @see {@link components.dt/js/spi/registration/CreatorProvider CreatorProvider}
     * @see {@link components.dt/js/spi/creators/Creator Creator}
     */
    ComponentRegistration.prototype.creatorProvider = '';

    /**
     * Provider of component's {@link components.dt/js/spi/registration/PropertyInspectorProvider property inspector}.
     *
     * <p>Returns an instance of a {@link components.dt/js/spi/propertyinspectors/PropertyInspector property inspector}.<br>
     * A property inspector defines how (and if) users are allowed to modify the component's
     * behaviour inside the ABCS Property Inspector UI. It defines the view and model
     * for the component's implementation of a Property inspector that will show
     * when the component is selected in the ABCS designer.</p>
     * <p>If you do not want to allow users to modify your component properties
     * and behavior you do not need to register this provider in which case no
     * Property Inspector UI will be displayed when the component is selected.</p>
     *
     * @AbcsExtension stable
     * @version 16.3.5
     * @type {components.dt/js/spi/registration/PropertyInspectorProvider}
     * @see {@link components.dt/js/spi/registration/PropertyInspectorProvider PropertyInspectorProvider}
     * @see {@link components.dt/js/spi/propertyinspectors/PropertyInspector PropertyInspector}
     */
    ComponentRegistration.prototype.propertyInspectorProvider = '';

    /**
     * Provider of component's {@link components.dt/js/spi/generators/Generator generator}.
     *
     * <p>Returns component's {@link components.dt/js/spi/generators/Generator generator}.<br>
     * Generator transforms your component {@link pages.dt/js/api/View views} into DOM
     * elements browser can then render in the page.</p>
     *
     * @AbcsExtension stable
     * @version 16.3.5
     * @type {components.dt/js/spi/registration/GeneratorProvider}
     * @see {@link components.dt/js/spi/registration/GeneratorProvider GeneratorProvider}
     * @see {@link components.dt/js/spi/generators/Generator Generator}
     */
    ComponentRegistration.prototype.generatorProvider = '';

    /**
     * Provider of component's {@link components.dt/js/spi/deleters/Deleter deleter}.
     *
     * <p>Returns an instance of a {@link components.dt/js/spi/deleters/Deleter deleter}.<br>
     * This service is responsible for a cleanup of any artifacts created by your
     * component during its lifecycle when the component is deleted from a page.</p>
     * <p>Registering its instance is not always necessary, it is required only
     * when the component creates artifacts that you no longer want to be part of
     * the parent ABCS application.</p>
     *
     * @AbcsExtension stable
     * @version 16.3.5
     * @type {components.dt/js/spi/registration/DeleterProvider}
     * @see {@link components.dt/js/spi/registration/DeleterProvider DeleterProvider}
     * @see {@link components.dt/js/spi/deleters/Deleter Deleter}
     */
    ComponentRegistration.prototype.deleterProvider = '';

    /**
     * Provider of component's {@link components.dt/js/spi/deleters/Deleter deleter}.
     *
     * <p>Returns an instance of a {@link components.dt/js/spi/deleters/Deleter deleter}
     * and provides additional information useful when deleting views in oppose to
     * the basic {@link components.dt/js/spi/registration/DeleterProvider DeleterProvider}.<br>
     * This service is responsible for a cleanup of any artifacts created by your
     * component during its lifecycle when the component is deleted from a page.</p>
     * <p>Registering its instance is not always necessary, it is required only
     * when the component creates artifacts that you no longer want to be part of
     * the parent ABCS application.</p>
     *
     * @type {components.dt/js/spi/registration/ExtendedDeleterProvider}
     * @see {@link components.dt/js/spi/registration/ExtendedDeleterProvider ExtendedDeleterProvider}
     * @see {@link components.dt/js/spi/deleters/Deleter Deleter}
     */
    ComponentRegistration.prototype.extendedDeleterProvider = '';

    /**
     * Provider of component's paster.
     *
     * @AbcsExtension unstable
     * @type {components.dt/js/spi/registration/PasterProvider}
     */
    ComponentRegistration.prototype.pasterProvider = '';

    /**
     * Provider of component's {@link components.dt/js/spi/registration/PaletteRegistrationProvider.PaletteItemConfig palette registration}.
     *
     * <p>Returns {@link components.dt/js/spi/registration/PaletteRegistrationProvider.PaletteItemConfig palette registration configuration}
     * defining the way your component is registered inside the ABCS Component Palette
     * and how it behaves when being dropped into the ABCS designer (a page).</p>
     * <p>Not all components need to be registered in the Component Palette as some
     * may only be instantiated programatically through the {@link components.dt/js/api/ComponentFactory Creator API}
     * meaning they will not be standalone components but will live only as part
     * of a composite <dfn title="Component built from smaller blocks with ABCS designer understanding its hierarchy and able to customize its internals">white-box component</dfn>.</p>
     * @AbcsExtension stable
     * @version 16.3.5
     * @type {components.dt/js/spi/registration/PaletteRegistrationProvider}
     * @see {@link components.dt/js/spi/registration/PaletteRegistrationProvider PaletteRegistrationProvider}
     * @see {@link components.dt/js/spi/registration/PaletteRegistrationProvider.PaletteItemConfig PaletteRegistrationProvider.PaletteItemConfig}
     */
    ComponentRegistration.prototype.paletteRegistrationProvider = '';

    /**
     * Provider of component's drop zone acceptor.
     *
     * @type {components.dt/js/spi/registration/DropZoneAcceptorProvider}
     */
    ComponentRegistration.prototype.dropZoneAcceptorProvider = '';

    /**
     * Provider of component's drop zone supplier.
     *
     * @type {components.dt/js/spi/registration/DropZoneSupplierProvider}
     */
    ComponentRegistration.prototype.dropZoneSupplierProvider = '';

    return AbcsLib.initSingleton(ComponentProviderRegistry);

});