|
|
import { e as escape_html, a as set_ssr_context, b as ssr_context, p as push, c as pop } from "./context.js"; |
|
|
import { clsx as clsx$1 } from "clsx"; |
|
|
const DERIVED = 1 << 1; |
|
|
const EFFECT = 1 << 2; |
|
|
const RENDER_EFFECT = 1 << 3; |
|
|
const BLOCK_EFFECT = 1 << 4; |
|
|
const BRANCH_EFFECT = 1 << 5; |
|
|
const ROOT_EFFECT = 1 << 6; |
|
|
const BOUNDARY_EFFECT = 1 << 7; |
|
|
const CONNECTED = 1 << 9; |
|
|
const CLEAN = 1 << 10; |
|
|
const DIRTY = 1 << 11; |
|
|
const MAYBE_DIRTY = 1 << 12; |
|
|
const INERT = 1 << 13; |
|
|
const DESTROYED = 1 << 14; |
|
|
const EFFECT_RAN = 1 << 15; |
|
|
const EFFECT_TRANSPARENT = 1 << 16; |
|
|
const EAGER_EFFECT = 1 << 17; |
|
|
const HEAD_EFFECT = 1 << 18; |
|
|
const EFFECT_PRESERVED = 1 << 19; |
|
|
const USER_EFFECT = 1 << 20; |
|
|
const WAS_MARKED = 1 << 15; |
|
|
const REACTION_IS_UPDATING = 1 << 21; |
|
|
const ASYNC = 1 << 22; |
|
|
const ERROR_VALUE = 1 << 23; |
|
|
const STATE_SYMBOL = Symbol("$state"); |
|
|
const LEGACY_PROPS = Symbol("legacy props"); |
|
|
const STALE_REACTION = new class StaleReactionError extends Error { |
|
|
name = "StaleReactionError"; |
|
|
message = "The reaction that called `getAbortSignal()` was re-run or destroyed"; |
|
|
}(); |
|
|
const COMMENT_NODE = 8; |
|
|
const HYDRATION_START = "["; |
|
|
const HYDRATION_START_ELSE = "[!"; |
|
|
const HYDRATION_END = "]"; |
|
|
const HYDRATION_ERROR = {}; |
|
|
const ELEMENT_IS_NAMESPACED = 1; |
|
|
const ELEMENT_PRESERVE_ATTRIBUTE_CASE = 1 << 1; |
|
|
const ELEMENT_IS_INPUT = 1 << 2; |
|
|
const UNINITIALIZED = Symbol(); |
|
|
const DOM_BOOLEAN_ATTRIBUTES = [ |
|
|
"allowfullscreen", |
|
|
"async", |
|
|
"autofocus", |
|
|
"autoplay", |
|
|
"checked", |
|
|
"controls", |
|
|
"default", |
|
|
"disabled", |
|
|
"formnovalidate", |
|
|
"indeterminate", |
|
|
"inert", |
|
|
"ismap", |
|
|
"loop", |
|
|
"multiple", |
|
|
"muted", |
|
|
"nomodule", |
|
|
"novalidate", |
|
|
"open", |
|
|
"playsinline", |
|
|
"readonly", |
|
|
"required", |
|
|
"reversed", |
|
|
"seamless", |
|
|
"selected", |
|
|
"webkitdirectory", |
|
|
"defer", |
|
|
"disablepictureinpicture", |
|
|
"disableremoteplayback" |
|
|
]; |
|
|
function is_boolean_attribute(name) { |
|
|
return DOM_BOOLEAN_ATTRIBUTES.includes(name); |
|
|
} |
|
|
const PASSIVE_EVENTS = ["touchstart", "touchmove"]; |
|
|
function is_passive_event(name) { |
|
|
return PASSIVE_EVENTS.includes(name); |
|
|
} |
|
|
const replacements = { |
|
|
translate: new Map([ |
|
|
[true, "yes"], |
|
|
[false, "no"] |
|
|
]) |
|
|
}; |
|
|
function attr(name, value, is_boolean = false) { |
|
|
if (name === "hidden" && value !== "until-found") { |
|
|
is_boolean = true; |
|
|
} |
|
|
if (value == null || !value && is_boolean) return ""; |
|
|
const normalized = name in replacements && replacements[name].get(value) || value; |
|
|
const assignment = is_boolean ? "" : `="${escape_html(normalized, true)}"`; |
|
|
return ` ${name}${assignment}`; |
|
|
} |
|
|
function clsx(value) { |
|
|
if (typeof value === "object") { |
|
|
return clsx$1(value); |
|
|
} else { |
|
|
return value ?? ""; |
|
|
} |
|
|
} |
|
|
const whitespace = [..." \n\r\f \v\uFEFF"]; |
|
|
function to_class(value, hash, directives) { |
|
|
var classname = value == null ? "" : "" + value; |
|
|
if (hash) { |
|
|
classname = classname ? classname + " " + hash : hash; |
|
|
} |
|
|
if (directives) { |
|
|
for (var key in directives) { |
|
|
if (directives[key]) { |
|
|
classname = classname ? classname + " " + key : key; |
|
|
} else if (classname.length) { |
|
|
var len = key.length; |
|
|
var a = 0; |
|
|
while ((a = classname.indexOf(key, a)) >= 0) { |
|
|
var b = a + len; |
|
|
if ((a === 0 || whitespace.includes(classname[a - 1])) && (b === classname.length || whitespace.includes(classname[b]))) { |
|
|
classname = (a === 0 ? "" : classname.substring(0, a)) + classname.substring(b + 1); |
|
|
} else { |
|
|
a = b; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
return classname === "" ? null : classname; |
|
|
} |
|
|
function append_styles(styles, important = false) { |
|
|
var separator = important ? " !important;" : ";"; |
|
|
var css = ""; |
|
|
for (var key in styles) { |
|
|
var value = styles[key]; |
|
|
if (value != null && value !== "") { |
|
|
css += " " + key + ": " + value + separator; |
|
|
} |
|
|
} |
|
|
return css; |
|
|
} |
|
|
function to_css_name(name) { |
|
|
if (name[0] !== "-" || name[1] !== "-") { |
|
|
return name.toLowerCase(); |
|
|
} |
|
|
return name; |
|
|
} |
|
|
function to_style(value, styles) { |
|
|
if (styles) { |
|
|
var new_style = ""; |
|
|
var normal_styles; |
|
|
var important_styles; |
|
|
if (Array.isArray(styles)) { |
|
|
normal_styles = styles[0]; |
|
|
important_styles = styles[1]; |
|
|
} else { |
|
|
normal_styles = styles; |
|
|
} |
|
|
if (value) { |
|
|
value = String(value).replaceAll(/\s*\/\*.*?\*\/\s*/g, "").trim(); |
|
|
var in_str = false; |
|
|
var in_apo = 0; |
|
|
var in_comment = false; |
|
|
var reserved_names = []; |
|
|
if (normal_styles) { |
|
|
reserved_names.push(...Object.keys(normal_styles).map(to_css_name)); |
|
|
} |
|
|
if (important_styles) { |
|
|
reserved_names.push(...Object.keys(important_styles).map(to_css_name)); |
|
|
} |
|
|
var start_index = 0; |
|
|
var name_index = -1; |
|
|
const len = value.length; |
|
|
for (var i = 0; i < len; i++) { |
|
|
var c = value[i]; |
|
|
if (in_comment) { |
|
|
if (c === "/" && value[i - 1] === "*") { |
|
|
in_comment = false; |
|
|
} |
|
|
} else if (in_str) { |
|
|
if (in_str === c) { |
|
|
in_str = false; |
|
|
} |
|
|
} else if (c === "/" && value[i + 1] === "*") { |
|
|
in_comment = true; |
|
|
} else if (c === '"' || c === "'") { |
|
|
in_str = c; |
|
|
} else if (c === "(") { |
|
|
in_apo++; |
|
|
} else if (c === ")") { |
|
|
in_apo--; |
|
|
} |
|
|
if (!in_comment && in_str === false && in_apo === 0) { |
|
|
if (c === ":" && name_index === -1) { |
|
|
name_index = i; |
|
|
} else if (c === ";" || i === len - 1) { |
|
|
if (name_index !== -1) { |
|
|
var name = to_css_name(value.substring(start_index, name_index).trim()); |
|
|
if (!reserved_names.includes(name)) { |
|
|
if (c !== ";") { |
|
|
i++; |
|
|
} |
|
|
var property = value.substring(start_index, i).trim(); |
|
|
new_style += " " + property + ";"; |
|
|
} |
|
|
} |
|
|
start_index = i + 1; |
|
|
name_index = -1; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
if (normal_styles) { |
|
|
new_style += append_styles(normal_styles); |
|
|
} |
|
|
if (important_styles) { |
|
|
new_style += append_styles(important_styles, true); |
|
|
} |
|
|
new_style = new_style.trim(); |
|
|
return new_style === "" ? null : new_style; |
|
|
} |
|
|
return value == null ? null : String(value); |
|
|
} |
|
|
const BLOCK_OPEN = `<!--${HYDRATION_START}-->`; |
|
|
const BLOCK_CLOSE = `<!--${HYDRATION_END}-->`; |
|
|
const EMPTY_COMMENT = `<!---->`; |
|
|
let controller = null; |
|
|
function abort() { |
|
|
controller?.abort(STALE_REACTION); |
|
|
controller = null; |
|
|
} |
|
|
function await_invalid() { |
|
|
const error = new Error(`await_invalid |
|
|
Encountered asynchronous work while rendering synchronously. |
|
|
https://svelte.dev/e/await_invalid`); |
|
|
error.name = "Svelte error"; |
|
|
throw error; |
|
|
} |
|
|
class Renderer { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#out = []; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#on_destroy = void 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#is_component_body = false; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type; |
|
|
|
|
|
#parent; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
promise = void 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
global; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
constructor(global, parent) { |
|
|
this.#parent = parent; |
|
|
this.global = global; |
|
|
this.local = parent ? { ...parent.local } : { select_value: void 0 }; |
|
|
this.type = parent ? parent.type : "body"; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
head(fn) { |
|
|
const head2 = new Renderer(this.global, this); |
|
|
head2.type = "head"; |
|
|
this.#out.push(head2); |
|
|
head2.child(fn); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async_block(blockers, fn) { |
|
|
this.#out.push(BLOCK_OPEN); |
|
|
this.async(blockers, fn); |
|
|
this.#out.push(BLOCK_CLOSE); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async(blockers, fn) { |
|
|
let callback = fn; |
|
|
if (blockers.length > 0) { |
|
|
const context = ssr_context; |
|
|
callback = (renderer) => { |
|
|
return Promise.all(blockers).then(() => { |
|
|
const previous_context = ssr_context; |
|
|
try { |
|
|
set_ssr_context(context); |
|
|
return fn(renderer); |
|
|
} finally { |
|
|
set_ssr_context(previous_context); |
|
|
} |
|
|
}); |
|
|
}; |
|
|
} |
|
|
this.child(callback); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
run(thunks) { |
|
|
const context = ssr_context; |
|
|
let promise = Promise.resolve(thunks[0]()); |
|
|
const promises = [promise]; |
|
|
for (const fn of thunks.slice(1)) { |
|
|
promise = promise.then(() => { |
|
|
const previous_context = ssr_context; |
|
|
set_ssr_context(context); |
|
|
try { |
|
|
return fn(); |
|
|
} finally { |
|
|
set_ssr_context(previous_context); |
|
|
} |
|
|
}); |
|
|
promises.push(promise); |
|
|
} |
|
|
return promises; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
child(fn) { |
|
|
const child = new Renderer(this.global, this); |
|
|
this.#out.push(child); |
|
|
const parent = ssr_context; |
|
|
set_ssr_context({ |
|
|
...ssr_context, |
|
|
p: parent, |
|
|
c: null, |
|
|
r: child |
|
|
}); |
|
|
const result = fn(child); |
|
|
set_ssr_context(parent); |
|
|
if (result instanceof Promise) { |
|
|
if (child.global.mode === "sync") { |
|
|
await_invalid(); |
|
|
} |
|
|
result.catch(() => { |
|
|
}); |
|
|
child.promise = result; |
|
|
} |
|
|
return child; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
component(fn, component_fn) { |
|
|
push(); |
|
|
const child = this.child(fn); |
|
|
child.#is_component_body = true; |
|
|
pop(); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
select(attrs, fn, css_hash, classes, styles, flags) { |
|
|
const { value, ...select_attrs } = attrs; |
|
|
this.push(`<select${attributes(select_attrs, css_hash, classes, styles, flags)}>`); |
|
|
this.child((renderer) => { |
|
|
renderer.local.select_value = value; |
|
|
fn(renderer); |
|
|
}); |
|
|
this.push("</select>"); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
option(attrs, body, css_hash, classes, styles, flags) { |
|
|
this.#out.push(`<option${attributes(attrs, css_hash, classes, styles, flags)}`); |
|
|
const close = (renderer, value, { head: head2, body: body2 }) => { |
|
|
if ("value" in attrs) { |
|
|
value = attrs.value; |
|
|
} |
|
|
if (value === this.local.select_value) { |
|
|
renderer.#out.push(" selected"); |
|
|
} |
|
|
renderer.#out.push(`>${body2}</option>`); |
|
|
if (head2) { |
|
|
renderer.head((child) => child.push(head2)); |
|
|
} |
|
|
}; |
|
|
if (typeof body === "function") { |
|
|
this.child((renderer) => { |
|
|
const r = new Renderer(this.global, this); |
|
|
body(r); |
|
|
if (this.global.mode === "async") { |
|
|
return r.#collect_content_async().then((content) => { |
|
|
close(renderer, content.body.replaceAll("<!---->", ""), content); |
|
|
}); |
|
|
} else { |
|
|
const content = r.#collect_content(); |
|
|
close(renderer, content.body.replaceAll("<!---->", ""), content); |
|
|
} |
|
|
}); |
|
|
} else { |
|
|
close(this, body, { body }); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
title(fn) { |
|
|
const path = this.get_path(); |
|
|
const close = (head2) => { |
|
|
this.global.set_title(head2, path); |
|
|
}; |
|
|
this.child((renderer) => { |
|
|
const r = new Renderer(renderer.global, renderer); |
|
|
fn(r); |
|
|
if (renderer.global.mode === "async") { |
|
|
return r.#collect_content_async().then((content) => { |
|
|
close(content.head); |
|
|
}); |
|
|
} else { |
|
|
const content = r.#collect_content(); |
|
|
close(content.head); |
|
|
} |
|
|
}); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
push(content) { |
|
|
if (typeof content === "function") { |
|
|
this.child(async (renderer) => renderer.push(await content())); |
|
|
} else { |
|
|
this.#out.push(content); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
on_destroy(fn) { |
|
|
(this.#on_destroy ??= []).push(fn); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
get_path() { |
|
|
return this.#parent ? [...this.#parent.get_path(), this.#parent.#out.indexOf(this)] : []; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
copy() { |
|
|
const copy = new Renderer(this.global, this.#parent); |
|
|
copy.#out = this.#out.map((item) => item instanceof Renderer ? item.copy() : item); |
|
|
copy.promise = this.promise; |
|
|
return copy; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subsume(other) { |
|
|
if (this.global.mode !== other.global.mode) { |
|
|
throw new Error( |
|
|
"invariant: A renderer cannot switch modes. If you're seeing this, there's a compiler bug. File an issue!" |
|
|
); |
|
|
} |
|
|
this.local = other.local; |
|
|
this.#out = other.#out.map((item) => { |
|
|
if (item instanceof Renderer) { |
|
|
item.subsume(item); |
|
|
} |
|
|
return item; |
|
|
}); |
|
|
this.promise = other.promise; |
|
|
this.type = other.type; |
|
|
} |
|
|
get length() { |
|
|
return this.#out.length; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static render(component, options = {}) { |
|
|
let sync; |
|
|
const result = ( |
|
|
|
|
|
{} |
|
|
); |
|
|
Object.defineProperties(result, { |
|
|
html: { |
|
|
get: () => { |
|
|
return (sync ??= Renderer.#render(component, options)).body; |
|
|
} |
|
|
}, |
|
|
head: { |
|
|
get: () => { |
|
|
return (sync ??= Renderer.#render(component, options)).head; |
|
|
} |
|
|
}, |
|
|
body: { |
|
|
get: () => { |
|
|
return (sync ??= Renderer.#render(component, options)).body; |
|
|
} |
|
|
}, |
|
|
then: { |
|
|
value: ( |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(onfulfilled, onrejected) => { |
|
|
{ |
|
|
const result2 = sync ??= Renderer.#render(component, options); |
|
|
const user_result = onfulfilled({ |
|
|
head: result2.head, |
|
|
body: result2.body, |
|
|
html: result2.body |
|
|
}); |
|
|
return Promise.resolve(user_result); |
|
|
} |
|
|
} |
|
|
) |
|
|
} |
|
|
}); |
|
|
return result; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*#collect_on_destroy() { |
|
|
for (const component of this.#traverse_components()) { |
|
|
yield* component.#collect_ondestroy(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*#traverse_components() { |
|
|
for (const child of this.#out) { |
|
|
if (typeof child !== "string") { |
|
|
yield* child.#traverse_components(); |
|
|
} |
|
|
} |
|
|
if (this.#is_component_body) { |
|
|
yield this; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
*#collect_ondestroy() { |
|
|
if (this.#on_destroy) { |
|
|
for (const fn of this.#on_destroy) { |
|
|
yield fn; |
|
|
} |
|
|
} |
|
|
for (const child of this.#out) { |
|
|
if (child instanceof Renderer && !child.#is_component_body) { |
|
|
yield* child.#collect_ondestroy(); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static #render(component, options) { |
|
|
var previous_context = ssr_context; |
|
|
try { |
|
|
const renderer = Renderer.#open_render("sync", component, options); |
|
|
const content = renderer.#collect_content(); |
|
|
return Renderer.#close_render(content, renderer); |
|
|
} finally { |
|
|
abort(); |
|
|
set_ssr_context(previous_context); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static async #render_async(component, options) { |
|
|
var previous_context = ssr_context; |
|
|
try { |
|
|
const renderer = Renderer.#open_render("async", component, options); |
|
|
const content = await renderer.#collect_content_async(); |
|
|
return Renderer.#close_render(content, renderer); |
|
|
} finally { |
|
|
abort(); |
|
|
set_ssr_context(previous_context); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#collect_content(content = { head: "", body: "" }) { |
|
|
for (const item of this.#out) { |
|
|
if (typeof item === "string") { |
|
|
content[this.type] += item; |
|
|
} else if (item instanceof Renderer) { |
|
|
item.#collect_content(content); |
|
|
} |
|
|
} |
|
|
return content; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async #collect_content_async(content = { head: "", body: "" }) { |
|
|
await this.promise; |
|
|
for (const item of this.#out) { |
|
|
if (typeof item === "string") { |
|
|
content[this.type] += item; |
|
|
} else if (item instanceof Renderer) { |
|
|
await item.#collect_content_async(content); |
|
|
} |
|
|
} |
|
|
return content; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static #open_render(mode, component, options) { |
|
|
const renderer = new Renderer( |
|
|
new SSRState(mode, options.idPrefix ? options.idPrefix + "-" : "") |
|
|
); |
|
|
renderer.push(BLOCK_OPEN); |
|
|
if (options.context) { |
|
|
push(); |
|
|
ssr_context.c = options.context; |
|
|
ssr_context.r = renderer; |
|
|
} |
|
|
component(renderer, options.props ?? {}); |
|
|
if (options.context) { |
|
|
pop(); |
|
|
} |
|
|
renderer.push(BLOCK_CLOSE); |
|
|
return renderer; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static #close_render(content, renderer) { |
|
|
for (const cleanup of renderer.#collect_on_destroy()) { |
|
|
cleanup(); |
|
|
} |
|
|
let head2 = content.head + renderer.global.get_title(); |
|
|
let body = content.body; |
|
|
for (const { hash, code } of renderer.global.css) { |
|
|
head2 += `<style id="${hash}">${code}</style>`; |
|
|
} |
|
|
return { |
|
|
head: head2, |
|
|
body |
|
|
}; |
|
|
} |
|
|
} |
|
|
class SSRState { |
|
|
|
|
|
mode; |
|
|
|
|
|
uid; |
|
|
|
|
|
css = new Set(); |
|
|
|
|
|
#title = { path: [], value: "" }; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
constructor(mode, id_prefix = "") { |
|
|
this.mode = mode; |
|
|
let uid = 1; |
|
|
this.uid = () => `${id_prefix}s${uid++}`; |
|
|
} |
|
|
get_title() { |
|
|
return this.#title.value; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set_title(value, path) { |
|
|
const current = this.#title.path; |
|
|
let i = 0; |
|
|
let l = Math.min(path.length, current.length); |
|
|
while (i < l && path[i] === current[i]) i += 1; |
|
|
if (path[i] === void 0) return; |
|
|
if (current[i] === void 0 || path[i] > current[i]) { |
|
|
this.#title.path = path; |
|
|
this.#title.value = value; |
|
|
} |
|
|
} |
|
|
} |
|
|
const INVALID_ATTR_NAME_CHAR_REGEX = /[\s'">/=\u{FDD0}-\u{FDEF}\u{FFFE}\u{FFFF}\u{1FFFE}\u{1FFFF}\u{2FFFE}\u{2FFFF}\u{3FFFE}\u{3FFFF}\u{4FFFE}\u{4FFFF}\u{5FFFE}\u{5FFFF}\u{6FFFE}\u{6FFFF}\u{7FFFE}\u{7FFFF}\u{8FFFE}\u{8FFFF}\u{9FFFE}\u{9FFFF}\u{AFFFE}\u{AFFFF}\u{BFFFE}\u{BFFFF}\u{CFFFE}\u{CFFFF}\u{DFFFE}\u{DFFFF}\u{EFFFE}\u{EFFFF}\u{FFFFE}\u{FFFFF}\u{10FFFE}\u{10FFFF}]/u; |
|
|
function render(component, options = {}) { |
|
|
return Renderer.render( |
|
|
|
|
|
component, |
|
|
options |
|
|
); |
|
|
} |
|
|
function head(hash, renderer, fn) { |
|
|
renderer.head((renderer2) => { |
|
|
renderer2.push(`<!--${hash}-->`); |
|
|
renderer2.child(fn); |
|
|
renderer2.push(EMPTY_COMMENT); |
|
|
}); |
|
|
} |
|
|
function attributes(attrs, css_hash, classes, styles, flags = 0) { |
|
|
if (styles) { |
|
|
attrs.style = to_style(attrs.style, styles); |
|
|
} |
|
|
if (attrs.class) { |
|
|
attrs.class = clsx(attrs.class); |
|
|
} |
|
|
if (css_hash || classes) { |
|
|
attrs.class = to_class(attrs.class, css_hash, classes); |
|
|
} |
|
|
let attr_str = ""; |
|
|
let name; |
|
|
const is_html = (flags & ELEMENT_IS_NAMESPACED) === 0; |
|
|
const lowercase = (flags & ELEMENT_PRESERVE_ATTRIBUTE_CASE) === 0; |
|
|
const is_input = (flags & ELEMENT_IS_INPUT) !== 0; |
|
|
for (name in attrs) { |
|
|
if (typeof attrs[name] === "function") continue; |
|
|
if (name[0] === "$" && name[1] === "$") continue; |
|
|
if (INVALID_ATTR_NAME_CHAR_REGEX.test(name)) continue; |
|
|
var value = attrs[name]; |
|
|
if (lowercase) { |
|
|
name = name.toLowerCase(); |
|
|
} |
|
|
if (is_input) { |
|
|
if (name === "defaultvalue" || name === "defaultchecked") { |
|
|
name = name === "defaultvalue" ? "value" : "checked"; |
|
|
if (attrs[name]) continue; |
|
|
} |
|
|
} |
|
|
attr_str += attr(name, value, is_html && is_boolean_attribute(name)); |
|
|
} |
|
|
return attr_str; |
|
|
} |
|
|
function bind_props(props_parent, props_now) { |
|
|
for (const key in props_now) { |
|
|
const initial_value = props_parent[key]; |
|
|
const value = props_now[key]; |
|
|
if (initial_value === void 0 && value !== void 0 && Object.getOwnPropertyDescriptor(props_parent, key)?.set) { |
|
|
props_parent[key] = value; |
|
|
} |
|
|
} |
|
|
} |
|
|
function props_id(renderer) { |
|
|
const uid = renderer.global.uid(); |
|
|
renderer.push("<!--$" + uid + "-->"); |
|
|
return uid; |
|
|
} |
|
|
export { |
|
|
ASYNC as A, |
|
|
BOUNDARY_EFFECT as B, |
|
|
COMMENT_NODE as C, |
|
|
DIRTY as D, |
|
|
ERROR_VALUE as E, |
|
|
props_id as F, |
|
|
HYDRATION_ERROR as H, |
|
|
INERT as I, |
|
|
LEGACY_PROPS as L, |
|
|
MAYBE_DIRTY as M, |
|
|
ROOT_EFFECT as R, |
|
|
STATE_SYMBOL as S, |
|
|
UNINITIALIZED as U, |
|
|
WAS_MARKED as W, |
|
|
HYDRATION_END as a, |
|
|
HYDRATION_START as b, |
|
|
HYDRATION_START_ELSE as c, |
|
|
EFFECT_RAN as d, |
|
|
CLEAN as e, |
|
|
EFFECT as f, |
|
|
BLOCK_EFFECT as g, |
|
|
DERIVED as h, |
|
|
BRANCH_EFFECT as i, |
|
|
DESTROYED as j, |
|
|
HEAD_EFFECT as k, |
|
|
EFFECT_TRANSPARENT as l, |
|
|
EFFECT_PRESERVED as m, |
|
|
CONNECTED as n, |
|
|
EAGER_EFFECT as o, |
|
|
STALE_REACTION as p, |
|
|
RENDER_EFFECT as q, |
|
|
USER_EFFECT as r, |
|
|
REACTION_IS_UPDATING as s, |
|
|
is_passive_event as t, |
|
|
render as u, |
|
|
attr as v, |
|
|
head as w, |
|
|
attributes as x, |
|
|
clsx as y, |
|
|
bind_props as z |
|
|
}; |
|
|
|