marko
Version:
Optimized runtime for Marko templates.
202 lines (201 loc) • 13.1 kB
JavaScript
let empty = [], rest = Symbol(), classIdToBranch = /* @__PURE__ */ new Map(), classEventResolver, scopesByRender = /* @__PURE__ */ new WeakMap(), getRenderScopes = ($global) => {
init($global.runtimeId);
let render = self[$global.runtimeId]?.[$global.renderId], scopes = render && scopesByRender.get(render);
return render && !scopes && scopesByRender.set(render, scopes = {}), scopes;
}, compat = {
patchDynamicTag,
queueEffect,
init(warp10Noop) {
_resumed.$C_s = (scope) => {
if (getRenderScopes(scope.$)[scope.L] = scope, scope.m5c && classIdToBranch.set(scope.m5c, scope), classEventResolver) for (let key in scope) {
let resolved = classEventResolver(scope[key], scope);
resolved !== scope[key] && (scope[key] = resolved);
}
}, _resumed.$C_b = warp10Noop;
},
setClassEventResolver(fn) {
classEventResolver = fn;
},
resumeClassFunction(id, build) {
_resumed[id] = build;
},
getScope($global, scopeId) {
return getRenderScopes($global)?.[scopeId];
},
setRendererId(renderer, id) {
renderer.a = id;
},
isRenderer(renderer) {
return renderer.b;
},
getStartNode(branch) {
return branch.S;
},
getEndNode(branch) {
return branch.K;
},
setScopeNodes(branch, startNode, endNode) {
branch.S = startNode, branch.K = endNode;
},
runComponentEffects() {
this.effects && runEffects(this.effects);
},
runComponentDestroy() {
this.scope && destroyBranch(this.scope);
},
resolveRegistered(value, $global) {
return Array.isArray(value) && typeof value[0] == "string" ? getRegisteredWithScope(value[0], getRenderScopes($global)?.[value[1]]) : value;
},
createRenderer(params, clone) {
let renderer = _content("", 0, 0, 0, params)();
return renderer.b = (branch) => {
let cloned = clone();
branch.S = cloned.startNode, branch.K = cloned.endNode;
}, renderer;
},
render(out, component, renderer, args) {
init(out.global.runtimeId);
let branch = component.scope, created = 0;
if (!branch && (branch = classIdToBranch.get(component.id)) && (component.scope = branch, classIdToBranch.delete(component.id)), args[0] && typeof args[0] == "object" && "renderBody" in args[0]) {
let input = args[0], normalizedInput = args[0] = {};
for (let key in input) normalizedInput[key === "renderBody" ? "content" : key] = input[key];
}
let renderBranch = () => {
branch ||= (created = 1, component.scope = createAndSetupBranch(out.global, renderer, renderer.e, document.body)), renderer.d?.(branch, renderer._ ? args[0] : args);
};
if (component.effects = rendering ? renderBranch() : prepareEffects(renderBranch), created) return toInsertNode(branch.S, branch.K);
}
}, _template = (id, template, walks, setup, inputSignal) => {
let renderer = _content(id, template, walks, setup, inputSignal)();
return renderer.mount = mount, renderer._ = renderer, _resumed[id] = renderer;
}, noop = (_) => 0;
import { $ as _attr_style_items, $t as insertBranchBefore, A as _attr_input_value, B as _controllable_select, Bt as _hoist_resume, C as _attr_details_or_dialog_open_script, Cn as _call, Ct as _resumed, D as _attr_input_checkedValue_script, Dt as initEmbedded, E as _attr_input_checkedValue_default, Et as init, F as _attr_select_value, Ft as _el_read, G as _attr_class, Gt as _or, Ht as _if_closure, I as _attr_select_value_default, It as _for_closure, J as _attr_class_names, Jt as _script, K as _attr_class_item, Kt as _return, L as _attr_select_value_script, Lt as _for_selector, M as _attr_input_value_default, Mt as _closure, N as _attr_input_value_dynamic_default, Nt as _closure_get, O as _attr_input_checked_default, Ot as ready, P as _attr_input_value_script, Pt as _const, Q as _attr_style_item, Qt as destroyBranch, R as _controllable_input, Rt as _global_read, S as _attr_details_or_dialog_open_default, Sn as _hoist_read_error, St as _el, T as _attr_input_checkedValue, Tt as getRegisteredWithScope, Ut as _let, V as _controllable_textarea, Vt as _id, W as _attr, Wt as _let_change, X as _attr_nonce, Xt as _var_change, Y as _attr_content, Yt as _var, Z as _attr_style, Zt as _assert_init, _ as patchDynamicTag, _n as forOf, _t as _return_setup, a as _for_in, at as _html, b as startAwait, bn as _assert_class_toggles, bt as setupBranch, c as _for_to, cn as prepareEffects, ct as _style_shell, d as _for_until_unkeyed, dn as queueRender, dt as _to_text, en as removeAndDestroyBranch, et as _attrs, f as _if, fn as rendering, ft as insertChildNodes, gn as forIn, gt as _content_resume, hn as runId, ht as _content_closures, i as _dynamic_tag_content, in as $signalReset, it as _attrs_script, j as _attr_input_value_attribute_default, jt as _child_setup, k as _attr_input_checked_script, kt as readyFailed, l as _for_to_unkeyed, ln as queueAsyncRender, lt as _text, m as _try, mn as runEffects, mt as _content, n as _await_promise, nn as _on, nt as _attrs_partial, o as _for_of, ot as _lifecycle, p as _show, pn as run, pt as toInsertNode, q as _attr_class_items, qt as _return_change, r as _dynamic_tag, rn as $signal, rt as _attrs_partial_content, s as _for_of_unkeyed, st as _style_rule_item, t as _await_content, tn as syncGen, tt as _attrs_content, u as _for_until, un as queueEffect, ut as _text_content, v as renderCatch, vn as forTo, vt as createAndSetupBranch, w as _attr_input_checked, wt as _var_resume, x as _attr_details_or_dialog_open, xn as _assert_hoist, xt as _dynamic_tag_var_resume, yn as forUntil, yt as createBranch, z as _controllable_open, zt as _hoist } from "./dom-Ci2W4l1P.mjs";
//#region src/common/attr-tag.ts
function attrTag(attrs) {
return attrs[Symbol.iterator] = attrTagIterator, attrs[rest] = empty, attrs;
}
function attrTags(first, attrs) {
return first ? (first[rest] === empty ? first[rest] = [attrs] : first[rest].push(attrs), first) : attrTag(attrs);
}
function* attrTagIterator() {
yield this, yield* this[rest];
}
//#endregion
//#region src/common/compat-meta.ts
//#endregion
//#region src/dom/compat.ts
//#endregion
//#region src/dom/template.ts
function mount(input = {}, reference, position) {
let branch, parentNode = reference, nextSibling = null, { $global } = input;
switch ($global ? ({$global, ...input} = input, $global = {
runtimeId: "M",
renderId: "_",
...$global
}) : $global = {
runtimeId: "M",
renderId: "_"
}, position) {
case "beforebegin":
parentNode = reference.parentNode, nextSibling = reference;
break;
case "afterbegin":
nextSibling = reference.firstChild;
break;
case "afterend": parentNode = reference.parentNode, nextSibling = reference.nextSibling;
}
let curValue, args = this.d, effects = prepareEffects(() => {
branch = createBranch($global, this, void 0, parentNode), branch.T = (newValue) => {
curValue = newValue;
}, this.c?.(branch), args?.(branch, input);
});
return insertChildNodes(parentNode, nextSibling, branch.S, branch.K), runEffects(effects), {
get value() {
return curValue;
},
set value(newValue) {
_var_change(branch, newValue);
},
update(newInput = {}) {
args && (newInput.$global && ({$global, ...newInput} = newInput), runEffects(prepareEffects(() => {
args(branch, newInput);
})));
},
destroy() {
removeAndDestroyBranch(branch);
}
};
}
//#endregion
//#region src/dom/load.ts
function _load_template(id, load) {
let pending, lazyTemplate = _template(id, 0, 0, (branch) => {
let awaitCounter = startAwait(branch);
branch.X ||= /* @__PURE__ */ new Map(), (pending ||= load()).then((renderer) => {
Object.assign(lazyTemplate, renderer), queueAsyncRender(branch, (branch) => insertLoaded(renderer, branch, branch.S, awaitCounter));
}, loadFailed(branch, awaitCounter));
}, _load_signal(() => (pending ||= load()).then((r) => ({ _: r.d || noop }))));
return lazyTemplate;
}
function _load_setup(load) {
let pending, renderer, insertCached = (child, marker) => insertLoaded(renderer, child, marker);
return (owner, child, marker) => {
if (renderer) queueRender(child, insertCached, -1, marker);
else {
let awaitCounter = startAwait(owner);
child.X ||= /* @__PURE__ */ new Map(), (pending ||= load()).then((mod) => {
renderer ||= _content("", ...mod._)(), queueAsyncRender(child, (child) => insertLoaded(renderer, child, marker, awaitCounter));
}, loadFailed(child, awaitCounter));
}
};
}
function insertLoaded(renderer, branch, marker, awaitCounter) {
let parent = () => marker.parentNode, values = branch.X, clone = () => {
syncGen(branch), renderer.b(branch, parent().namespaceURI), branch.X = 0;
}, insert = () => {
insertBranchBefore(branch, parent(), marker), marker.remove(), awaitCounter?.c();
}, remaining;
if (remaining = values?.size) {
awaitCounter ||= startAwait(branch);
let fail = loadFailed(branch, awaitCounter);
values.forEach(([, apply], promise) => promise.then((mod) => (apply._ = mod._) && !--remaining && queueAsyncRender(branch, (branch) => {
clone(), renderer.c?.(branch), values.forEach(([value, apply]) => apply(branch, value)), insert();
}), (error) => remaining > 0 && (remaining = 0, fail(error))));
} else clone(), setupBranch(renderer, branch), insert();
}
function loadFailed(scope, awaitCounter) {
return (error) => {
awaitCounter && (awaitCounter.m ? awaitCounter.i = 0 : awaitCounter.i && awaitCounter.c()), queueAsyncRender(scope, renderCatch, error);
};
}
function _load_signal(load) {
let pending, apply = (scope, value) => {
pending ||= load(), scope.X || !("X" in scope) && scope.H === runId ? (scope.X ||= /* @__PURE__ */ new Map()).set(pending, [value, apply]) : apply._ ? apply._(scope, value) : pending.then((mod) => queueAsyncRender(scope, apply._ = mod._, value), noop);
};
return apply;
}
function _load_visible_trigger(selector, options) {
let pending, el;
return (load) => () => (pending ||= new Promise((resolve) => (el = getSelectorOrResolve(selector, resolve)) && new IntersectionObserver((entries, io) => entries.some((entry) => entry.isIntersecting) && resolve(io.disconnect()), options).observe(el))).then(load);
}
function _load_idle_trigger(options) {
let pending;
return (load) => () => (pending ||= new Promise((resolve) => (self.requestIdleCallback || resolve)(resolve, options))).then(load);
}
function _load_event_trigger(event, selector) {
let pending;
return (load) => () => (pending ||= new Promise((resolve) => getSelectorOrResolve(selector, resolve)?.addEventListener(event, resolve, { once: !0 }))).then(load);
}
function _load_media_trigger(query) {
let pending, mql;
return (load) => () => (pending ||= new Promise((resolve) => (mql = matchMedia(query)).matches ? resolve() : mql.addEventListener("change", resolve, { once: !0 }))).then(load);
}
function _load_race_trigger(...triggers) {
let pending;
return (load) => () => (pending ||= Promise.race(triggers.map((t) => t(noop)()))).then(load);
}
function getSelectorOrResolve(selector, resolve) {
return document.querySelector(selector) || resolve();
}
//#endregion
export { $signal, $signalReset, _assert_class_toggles, _assert_hoist, _assert_init, _attr, _attr_class, _attr_class_item, _attr_class_items, _attr_class_names, _attr_content, _attr_details_or_dialog_open as _attr_details_open, _attr_details_or_dialog_open as _attr_dialog_open, _attr_details_or_dialog_open_default as _attr_details_open_default, _attr_details_or_dialog_open_default as _attr_dialog_open_default, _attr_details_or_dialog_open_script as _attr_details_open_script, _attr_details_or_dialog_open_script as _attr_dialog_open_script, _attr_input_checked, _attr_input_checkedValue, _attr_input_checkedValue_default, _attr_input_checkedValue_script, _attr_input_checked_default, _attr_input_checked_script, _attr_input_value, _attr_input_value as _attr_textarea_value, _attr_input_value_attribute_default, _attr_input_value_default, _attr_input_value_default as _attr_textarea_value_default, _attr_input_value_dynamic_default, _attr_input_value_script, _attr_input_value_script as _attr_textarea_value_script, _attr_nonce, _attr_select_value, _attr_select_value_default, _attr_select_value_script, _attr_style, _attr_style_item, _attr_style_items, _attrs, _attrs_content, _attrs_partial, _attrs_partial_content, _attrs_script, _await_content, _await_promise, _call, _child_setup, _closure, _closure_get, _const, _content, _content_closures, _content_resume, _controllable_input, _controllable_open, _controllable_select, _controllable_textarea, _dynamic_tag, _dynamic_tag_content, _dynamic_tag_var_resume, _el, _el_read, _for_closure, _for_in, _for_of, _for_of_unkeyed, _for_selector, _for_to, _for_to_unkeyed, _for_until, _for_until_unkeyed, _global_read, _hoist, _hoist_read_error, _hoist_resume, _html, _id, _if, _if_closure, _let, _let_change, _lifecycle, _load_event_trigger, _load_idle_trigger, _load_media_trigger, _load_race_trigger, _load_setup, _load_signal, _load_template, _load_visible_trigger, _on, _or, _resumed, _return, _return_change, _return_setup, _script, _show, _style_rule_item, _style_shell, _template, _text, _text_content, _to_text, _try, _var, _var_change, _var_resume, attrTag, attrTags, compat, forIn, forOf, forTo, forUntil, init, initEmbedded, ready, readyFailed, run };