53 lines
1.8 KiB
JavaScript
53 lines
1.8 KiB
JavaScript
/* Riot WIP, @license MIT */
|
|
import { panic, defineDefaults, MOUNT_METHOD_KEY, defineProperty, IS_PURE_SYMBOL } from '@riotjs/util';
|
|
import { PURE_COMPONENT_API } from './pure-component-api.js';
|
|
import { bindDOMNodeToComponentInstance } from './bind-dom-node-to-component-instance.js';
|
|
import { createCoreAPIMethods } from './create-core-api-methods.js';
|
|
|
|
/**
|
|
* Create a pure component
|
|
* @param {Function} pureFactoryFunction - pure component factory function
|
|
* @param {Array} options.slots - component slots
|
|
* @param {Array} options.attributes - component attributes
|
|
* @param {Array} options.template - template factory function
|
|
* @param {Array} options.template - template factory function
|
|
* @param {any} options.props - initial component properties
|
|
* @returns {Object} pure component object
|
|
*/
|
|
|
|
function createPureComponent(pureFactoryFunction, _ref) {
|
|
let {
|
|
slots,
|
|
attributes,
|
|
props,
|
|
css,
|
|
template
|
|
} = _ref;
|
|
if (template) panic('Pure components can not have html');
|
|
if (css) panic('Pure components do not have css');
|
|
const component = defineDefaults(pureFactoryFunction({
|
|
slots,
|
|
attributes,
|
|
props
|
|
}), PURE_COMPONENT_API);
|
|
return createCoreAPIMethods(method => function () {
|
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
|
|
// intercept the mount calls to bind the DOM node to the pure object created
|
|
// see also https://github.com/riot/riot/issues/2806
|
|
if (method === MOUNT_METHOD_KEY) {
|
|
const [element] = args; // mark this node as pure element
|
|
|
|
defineProperty(element, IS_PURE_SYMBOL, true);
|
|
bindDOMNodeToComponentInstance(element, component);
|
|
}
|
|
|
|
component[method](...args);
|
|
return component;
|
|
});
|
|
}
|
|
|
|
export { createPureComponent };
|