taggedjs
Version:
tagged template reactive html
79 lines • 3.32 kB
JavaScript
import { tags } from '../tag/tag.utils.js';
import { empty, ValueTypes } from '../tag/ValueTypes.enum.js';
import { destroySupport } from './destroySupport.function.js';
import { paint, painting } from './paint.function.js';
import { createSupport } from '../tag/createSupport.function.js';
import { runAfterRender } from '../render/afterRender.function.js';
import { executeWrap } from './executeWrap.function.js';
import { registerTagElement } from './registerNewTagElement.function.js';
import { loadNewBaseSupport } from '../tag/loadNewBaseSupport.function.js';
import { reState } from '../state/state.utils.js';
export function renderTagElement(app, global, templater, templater2, element, subject, isAppFunction) {
const placeholder = document.createTextNode(empty);
tags.push((templater.wrapper || { original: templater }));
const support = runWrapper(templater, placeholder, element, subject, isAppFunction);
global.isApp = true;
if (isAppFunction) {
templater2.tag = support.templater.tag;
}
if (!element) {
throw new Error(`Cannot tagElement, element received is type ${typeof element} and not type Element`);
}
// enables hmr destroy so it can control entire app
;
element.destroy = function () {
const events = global.events;
for (const eventName in events) {
const callback = events[eventName];
element.removeEventListener(eventName, callback);
}
global.events = {};
++painting.locks;
const toAwait = destroySupport(support, global); // never return anything here
--painting.locks;
paint();
return toAwait;
};
++painting.locks;
const newFragment = registerTagElement(support, element, global, templater, app, placeholder);
--painting.locks;
paint();
element.appendChild(newFragment);
return {
support,
tags,
ValueTypes,
};
}
export function runWrapper(templater, placeholder, appElement, subject, isAppFunction) {
subject.placeholder = placeholder;
const global = subject.global;
const oldest = global.oldest;
const isFirstRender = global.newest === oldest;
const newSupport = createSupport(templater, global.newest, global.newest.appSupport, // ownerSupport.appSupport as AnySupport,
subject);
if (!isFirstRender) {
reState(newSupport, global.newest, // global.oldest, // global.newest,
oldest.state);
}
if (templater.tagJsType === ValueTypes.stateRender) {
return executeStateWrap(templater, isAppFunction, newSupport, subject, appElement);
}
// Call the apps function for our tag templater
const wrapper = templater.wrapper;
const nowSupport = wrapper(newSupport, subject);
runAfterRender(newSupport);
return nowSupport;
}
function executeStateWrap(templater, isAppFunction, newSupport, subject, appElement) {
const result = (templater.wrapper || { original: templater });
if (!isAppFunction) {
const newSupport = loadNewBaseSupport(templater, subject, appElement);
runAfterRender(newSupport);
return newSupport;
}
executeWrap(templater, result, newSupport);
runAfterRender(newSupport);
return newSupport;
}
//# sourceMappingURL=renderTagElement.function.js.map