@emkodev/emroute 1.8.0 → 1.8.2-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/core/renderer/html.renderer.ts +1 -1
- package/core/renderer/md.renderer.ts +1 -1
- package/core/renderer/ssr.renderer.ts +21 -1
- package/core/server/emroute.server.ts +45 -52
- package/core/util/widget-resolve.util.ts +2 -2
- package/core/widget/widget.registry.ts +29 -2
- package/dist/core/renderer/html.renderer.js +1 -1
- package/dist/core/renderer/html.renderer.js.map +1 -1
- package/dist/core/renderer/md.renderer.js +1 -1
- package/dist/core/renderer/md.renderer.js.map +1 -1
- package/dist/core/renderer/ssr.renderer.d.ts +4 -1
- package/dist/core/renderer/ssr.renderer.js +20 -0
- package/dist/core/renderer/ssr.renderer.js.map +1 -1
- package/dist/core/server/emroute.server.d.ts +0 -2
- package/dist/core/server/emroute.server.js +36 -47
- package/dist/core/server/emroute.server.js.map +1 -1
- package/dist/core/util/widget-resolve.util.d.ts +1 -3
- package/dist/core/util/widget-resolve.util.js +2 -2
- package/dist/core/util/widget-resolve.util.js.map +1 -1
- package/dist/core/widget/widget.registry.d.ts +8 -0
- package/dist/core/widget/widget.registry.js +28 -2
- package/dist/core/widget/widget.registry.js.map +1 -1
- package/dist/emroute.js +227 -66
- package/dist/emroute.js.map +13 -13
- package/dist/runtime/abstract.runtime.js +7 -3
- package/dist/runtime/abstract.runtime.js.map +1 -1
- package/dist/runtime/fetch.runtime.js +7 -1
- package/dist/runtime/fetch.runtime.js.map +1 -1
- package/dist/server/build.util.d.ts +1 -1
- package/dist/server/build.util.js +10 -28
- package/dist/server/build.util.js.map +1 -1
- package/dist/src/element/component.element.d.ts +4 -1
- package/dist/src/element/component.element.js +4 -1
- package/dist/src/element/component.element.js.map +1 -1
- package/dist/src/overlay/mod.d.ts +1 -1
- package/dist/src/overlay/overlay.service.js +136 -6
- package/dist/src/overlay/overlay.service.js.map +1 -1
- package/dist/src/overlay/overlay.type.d.ts +28 -4
- package/dist/src/renderer/spa/emroute.app.d.ts +3 -0
- package/dist/src/renderer/spa/emroute.app.js +18 -3
- package/dist/src/renderer/spa/emroute.app.js.map +1 -1
- package/package.json +2 -2
- package/runtime/abstract.runtime.ts +11 -5
- package/runtime/fetch.runtime.ts +6 -1
- package/server/build.util.ts +10 -30
- package/src/element/component.element.ts +4 -1
- package/src/overlay/mod.ts +1 -1
- package/src/overlay/overlay.service.ts +158 -8
- package/src/overlay/overlay.type.ts +27 -2
- package/src/renderer/spa/emroute.app.ts +20 -3
package/dist/emroute.js.map
CHANGED
|
@@ -6,33 +6,33 @@
|
|
|
6
6
|
"/**\n * HTML Utilities (Browser Layer)\n *\n * Re-exports pure functions from core/ and provides browser-specific\n * SSR-compatible HTMLElement mock.\n */\n// Re-export everything from core\nexport { SSR_ATTR, LAZY_ATTR, assertSafeRedirect, escapeHtml, unescapeHtml, scopeWidgetCss, STATUS_MESSAGES, } from \"../../core/util/html.util.js\";\n/**\n * SSR-compatible ShadowRoot mock.\n */\nclass SsrShadowRoot {\n host;\n _innerHTML = '';\n constructor(host) {\n this.host = host;\n }\n get innerHTML() {\n return this._innerHTML;\n }\n set innerHTML(value) {\n this._innerHTML = value;\n }\n setHTMLUnsafe(html, _options) {\n this._innerHTML = html;\n }\n append(..._nodes) { }\n querySelector(_selector) {\n return null;\n }\n querySelectorAll(_selector) {\n return [];\n }\n get childNodes() {\n return [];\n }\n get firstChild() {\n return null;\n }\n}\n/**\n * SSR-compatible HTMLElement mock.\n */\nclass SsrHTMLElement {\n _innerHTML = '';\n _shadowRoot = null;\n _attributes = new Map();\n style = new Proxy({}, {\n set(_target, _prop, _value) {\n return true;\n },\n get(_target, prop) {\n if (typeof prop === 'string')\n return '';\n return undefined;\n },\n });\n get innerHTML() {\n return this._innerHTML;\n }\n set innerHTML(value) {\n this._innerHTML = value;\n }\n get shadowRoot() {\n return this._shadowRoot;\n }\n get childNodes() {\n return [];\n }\n get firstChild() {\n return null;\n }\n get attributes() {\n const attrs = [];\n for (const [name, value] of this._attributes) {\n attrs.push({ name, value });\n }\n return attrs;\n }\n attachShadow(_init) {\n this._shadowRoot = new SsrShadowRoot(this);\n return this._shadowRoot;\n }\n getAttribute(name) {\n return this._attributes.get(name) ?? null;\n }\n setAttribute(name, value) {\n this._attributes.set(name, value);\n }\n removeAttribute(name) {\n this._attributes.delete(name);\n }\n hasAttribute(name) {\n return this._attributes.has(name);\n }\n querySelector(_selector) {\n return null;\n }\n querySelectorAll(_selector) {\n return [];\n }\n append(..._nodes) { }\n appendChild(node) {\n return node;\n }\n}\n/** Server-safe base class: HTMLElement in browser, SSR mock on server. */\nexport const HTMLElementBase = globalThis.HTMLElement ??\n SsrHTMLElement;\n//# sourceMappingURL=html.util.js.map",
|
|
7
7
|
"/**\n * Router Slot Element\n *\n * <router-slot> is where page content is rendered.\n * Supports nested routes via parent page containing slot.\n *\n * Usage:\n * ```html\n * <router-slot></router-slot>\n * ```\n *\n * For nested routes, parent page includes:\n * ```typescript\n * export default function render() {\n * return `\n * <header>...</header>\n * <main>\n * <router-slot></router-slot>\n * </main>\n * `;\n * }\n * ```\n */\nimport { HTMLElementBase } from \"../util/html.util.js\";\n/**\n * Router slot web component.\n * Serves as the mounting point for page content.\n */\nexport class RouterSlot extends HTMLElementBase {\n}\n//# sourceMappingURL=slot.element.js.map",
|
|
8
8
|
"/**\n * Markdown Element — <mark-down> custom element.\n *\n * Renders markdown content with pluggable renderer.\n * Supports:\n * - Inline content: <mark-down># Title</mark-down>\n * - Source attribute: <mark-down src=\"/path/to.md\"></mark-down>\n */\nimport { HTMLElementBase } from \"../util/html.util.js\";\nimport { escapeHtml } from \"../../core/util/html.util.js\";\nexport class MarkdownElement extends HTMLElementBase {\n static renderer = null;\n static rendererInitPromise = null;\n abortController = null;\n /**\n * Set the markdown renderer.\n * Must be called before any <mark-down> elements are connected.\n *\n * @example\n * ```ts\n * import { createEmkoRenderer } from './emko.renderer.ts';\n * MarkdownElement.setRenderer(await createEmkoRenderer());\n * ```\n */\n static setRenderer(renderer) {\n MarkdownElement.renderer = renderer;\n MarkdownElement.rendererInitPromise = renderer.init ? renderer.init() : null;\n }\n /** Get the current renderer (if set). Used by bootEmrouteApp to pass through to Emroute.create(). */\n static getConfiguredRenderer() {\n return MarkdownElement.renderer;\n }\n /**\n * Get the current renderer, waiting for init if needed.\n */\n static async getRenderer() {\n const renderer = MarkdownElement.renderer;\n if (!renderer) {\n throw new Error('No markdown renderer configured. Call MarkdownElement.setRenderer() before using <mark-down> elements.');\n }\n if (MarkdownElement.rendererInitPromise) {\n await MarkdownElement.rendererInitPromise;\n }\n return renderer;\n }\n async connectedCallback() {\n this.abortController = new AbortController();\n await this.loadContent();\n }\n disconnectedCallback() {\n this.abortController?.abort();\n this.abortController = null;\n }\n async loadContent() {\n const src = this.getAttribute('src');\n const inlineContent = this.textContent?.trim();\n if (src) {\n await this.loadFromSrc(src);\n }\n else if (inlineContent) {\n await this.renderContent(inlineContent);\n }\n else {\n this.innerHTML = '';\n }\n }\n async loadFromSrc(src) {\n const signal = this.abortController?.signal;\n try {\n const response = await fetch(src, signal ? { signal } : {});\n if (!response.ok) {\n throw new Error(`Failed to fetch ${src}: ${response.status}`);\n }\n const markdown = await response.text();\n await this.renderContent(markdown);\n }\n catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n this.showError(error);\n }\n }\n async renderContent(markdown) {\n try {\n const renderer = await MarkdownElement.getRenderer();\n this.innerHTML = renderer.render(markdown);\n }\n catch (error) {\n this.showError(error);\n }\n }\n showError(error) {\n const message = error instanceof Error ? error.message : String(error);\n this.innerHTML = `<div>Markdown Error: ${escapeHtml(message)}</div>`;\n }\n}\n//# sourceMappingURL=markdown.element.js.map",
|
|
9
|
-
"/**\n * Widget Element - Browser Custom Element\n *\n * Renders Widget instances in the browser as `widget-{name}` elements.\n * Handles:\n * - SSR hydration (ssr attribute)\n * - Client-side data fetching with AbortSignal\n * - Companion file loading (html, md, css)\n * - Loading/error states\n */\nimport { HTMLElementBase } from \"../util/html.util.js\";\nimport { LAZY_ATTR, SSR_ATTR } from \"../../core/util/html.util.js\";\n/** Strip keys with undefined values — returns the filtered object, or undefined if all values are undefined. */\nfunction filterUndefined(obj) {\n const result = {};\n let hasValue = false;\n for (const [k, v] of Object.entries(obj)) {\n if (v !== undefined) {\n result[k] = v;\n hasValue = true;\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return hasValue ? result : undefined;\n}\n/**\n * Custom element that renders a Component in the browser.\n */\nexport class ComponentElement extends HTMLElementBase {\n /** Lazy module loaders keyed by tag name — set by registerLazy(). */\n static lazyLoaders = new Map();\n /** App-level context provider set once during router initialization. */\n static extendContext;\n /** Register (or clear) the context provider that enriches every widget's ComponentContext. */\n static setContextProvider(provider) {\n ComponentElement.extendContext = provider;\n }\n component;\n effectiveFiles;\n params = null;\n data = null;\n context;\n state = 'idle';\n errorMessage = '';\n deferred = null;\n abortController = null;\n intersectionObserver = null;\n /** Promise that resolves with fetched data (available after loadData starts) */\n dataPromise = null;\n constructor(component, files) {\n super();\n this.component = component;\n this.effectiveFiles = files;\n // Attach shadow root if not already present (Declarative Shadow DOM creates it from <template shadowrootmode=\"open\">)\n // This enables progressive enhancement: SSR with DSD works without JS, then hydrates when JS loads\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n }\n }\n /**\n * Register a widget as a custom element: `widget-{name}`.\n * Creates a fresh widget instance per DOM element (per-element state).\n * Optional `files` parameter provides discovered file paths without mutating\n * the component instance.\n */\n static register(component, files) {\n const tagName = `widget-${component.name}`;\n if (!globalThis.customElements || customElements.get(tagName)) {\n return;\n }\n const WidgetClass = component.constructor;\n const BoundElement = class extends ComponentElement {\n constructor() {\n super(new WidgetClass(), files);\n }\n };\n customElements.define(tagName, BoundElement);\n }\n /**\n * Register a widget class (not instance) as a custom element: `widget-{name}`.\n * Used for manifest-based registration where classes are loaded dynamically.\n */\n static registerClass(WidgetClass, name, files) {\n const tagName = `widget-${name}`;\n if (!globalThis.customElements || customElements.get(tagName)) {\n return;\n }\n const BoundElement = class extends ComponentElement {\n constructor() {\n super(new WidgetClass(), files);\n }\n };\n customElements.define(tagName, BoundElement);\n }\n /**\n * Register a widget lazily: define the custom element immediately (so SSR\n * content via Declarative Shadow DOM is adopted), but defer loading the\n * module until connectedCallback fires. Once loaded, the real component\n * replaces the placeholder and hydration proceeds normally.\n */\n static registerLazy(name, loader) {\n const tagName = `widget-${name}`;\n if (!globalThis.customElements || customElements.get(tagName))\n return;\n ComponentElement.lazyLoaders.set(tagName, loader);\n // Placeholder component — replaced by the real one once the module loads.\n // Cast needed because Component is abstract; the real module replaces this.\n const placeholder = {\n name,\n getData: () => Promise.resolve(null),\n renderHTML: () => '',\n renderMarkdown: () => '',\n renderError: () => '',\n renderMarkdownError: () => '',\n };\n const BoundElement = class extends ComponentElement {\n constructor() {\n super(placeholder);\n }\n };\n customElements.define(tagName, BoundElement);\n }\n /**\n * Promise that resolves when component is ready (data loaded and rendered).\n * Used by router to wait for async components.\n */\n get ready() {\n if (this.state === 'ready') {\n return Promise.resolve();\n }\n this.deferred ??= Promise.withResolvers();\n return this.deferred.promise;\n }\n async connectedCallback() {\n // Lazy module loading — resolve actual component before proceeding\n const tagName = this.tagName.toLowerCase();\n const lazyLoader = ComponentElement.lazyLoaders.get(tagName);\n if (lazyLoader) {\n try {\n const mod = await lazyLoader();\n if (mod.__files && typeof mod.__files === 'object') {\n this.effectiveFiles = mod.__files;\n }\n for (const exp of Object.values(mod)) {\n if (exp && typeof exp === 'object' && 'getData' in exp) {\n const WidgetClass = exp.constructor;\n this.component = new WidgetClass();\n break;\n }\n if (typeof exp === 'function' && exp.prototype?.getData) {\n this.component = new exp();\n break;\n }\n }\n }\n catch {\n // Module failed to load (e.g. raw .ts served without transpilation).\n // SSR content is already visible — skip hydration gracefully.\n if (this.hasAttribute(SSR_ATTR)) {\n this.removeAttribute(SSR_ATTR);\n this.signalReady();\n return;\n }\n }\n }\n this.component.element = this;\n this.style.contentVisibility = 'auto';\n this.abortController = new AbortController();\n const signal = this.abortController.signal;\n // Parse params from element attributes\n const params = {};\n for (const attr of this.attributes) {\n if (attr.name === SSR_ATTR || attr.name === LAZY_ATTR)\n continue;\n const key = attr.name.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n try {\n params[key] = JSON.parse(attr.value);\n }\n catch {\n params[key] = attr.value;\n }\n }\n this.params = params;\n // Validate params\n if (this.component.validateParams && this.params !== null) {\n const error = this.component.validateParams(this.params);\n if (error) {\n this.setError(error);\n return;\n }\n }\n // Load companion files (html, md, css) if declared\n const files = await this.loadFiles();\n if (signal.aborted)\n return;\n const currentUrl = globalThis.location ? new URL(location.href) : new URL('http://localhost/');\n const filteredFiles = filterUndefined(files);\n const base = {\n url: currentUrl,\n pathname: currentUrl.pathname,\n searchParams: currentUrl.searchParams,\n params: this.params ?? {},\n ...(filteredFiles ? { files: filteredFiles } : {}),\n };\n this.context = ComponentElement.extendContext ? ComponentElement.extendContext(base) : base;\n // Hydrate from SSR: adopt content from Declarative Shadow DOM\n if (this.hasAttribute(SSR_ATTR)) {\n this.removeAttribute(SSR_ATTR);\n // Read SSR data from light DOM (JSON text placed alongside shadow root)\n const lightText = this.textContent?.trim();\n if (lightText) {\n try {\n this.data = JSON.parse(lightText);\n }\n catch {\n // Not valid JSON — proceed with data: null\n }\n }\n // Clear light DOM content (JSON text)\n this.textContent = '';\n this.state = 'ready';\n // Call hydrate() hook to attach event listeners\n if (this.component.hydrate) {\n const args = { data: this.data, params: this.params, context: this.context };\n queueMicrotask(() => {\n this.component.hydrate(args);\n });\n }\n this.signalReady();\n return;\n }\n // Lazy: defer loadData until element is visible\n if (this.hasAttribute(LAZY_ATTR)) {\n this.intersectionObserver = new IntersectionObserver((entries) => {\n const entry = entries[0];\n if (entry.isIntersecting) {\n this.intersectionObserver?.disconnect();\n this.intersectionObserver = null;\n this.loadData();\n }\n });\n this.intersectionObserver.observe(this);\n return;\n }\n await this.loadData();\n }\n disconnectedCallback() {\n this.component.destroy?.();\n this.component.element = undefined;\n this.intersectionObserver?.disconnect();\n this.intersectionObserver = null;\n this.abortController?.abort();\n this.abortController = null;\n this.state = 'idle';\n this.data = null;\n this.context = undefined;\n this.dataPromise = null;\n this.errorMessage = '';\n this.signalReady();\n this.deferred = null;\n }\n /**\n * Reload component data. Aborts any in-flight request first.\n */\n async reload() {\n if (this.params === null)\n return;\n // Abort previous and create fresh controller\n this.abortController?.abort();\n this.abortController = new AbortController();\n await this.loadData();\n }\n /**\n * Get companion files for this widget instance.\n * Returns inlined content from __files (set during lazy module load) directly.\n */\n async loadFiles() {\n return this.effectiveFiles ?? {};\n }\n async loadData() {\n if (this.params === null)\n return;\n const signal = this.abortController?.signal;\n this.state = 'loading';\n this.render();\n try {\n const promise = this.component.getData({\n params: this.params,\n ...(signal ? { signal } : {}),\n context: this.context,\n });\n this.dataPromise = promise;\n this.data = await promise;\n // Check abort after await — don't touch DOM if disconnected\n if (signal?.aborted)\n return;\n this.state = 'ready';\n }\n catch (e) {\n if (e instanceof DOMException && e.name === 'AbortError')\n return;\n if (signal?.aborted)\n return;\n this.setError(e instanceof Error ? e.message : String(e));\n return;\n }\n this.render();\n this.signalReady();\n }\n setError(message) {\n this.state = 'error';\n this.errorMessage = message;\n this.render();\n this.signalReady(); // Ready even on error (completed loading)\n }\n signalReady() {\n this.deferred?.resolve();\n this.deferred = null;\n }\n render() {\n if (this.params === null) {\n this.shadowRoot.setHTMLUnsafe('');\n return;\n }\n if (this.state === 'error') {\n this.shadowRoot.setHTMLUnsafe(this.component.renderError({\n error: new Error(this.errorMessage),\n params: this.params,\n }));\n return;\n }\n this.shadowRoot.setHTMLUnsafe(this.component.renderHTML({\n data: this.state === 'ready' ? this.data : null,\n params: this.params,\n context: this.context,\n }));\n // Call hydrate() after rendering to attach event listeners\n if (this.state === 'ready' && this.component.hydrate) {\n const args = { data: this.data, params: this.params, context: this.context };\n queueMicrotask(() => {\n this.component.hydrate(args);\n });\n }\n }\n}\n//# sourceMappingURL=component.element.js.map",
|
|
10
|
-
"/**\n * Widget Registry\n *\n * Name → Component lookup. Used by all renderers.\n * Pages are NOT in this registry — they live in the routes manifest.\n */\nexport class WidgetRegistry {\n entries = new Map();\n add(widget, modulePath) {\n this.entries.set(widget.name, { widget, modulePath });\n }\n get(name) {\n return this.entries.get(name)?.widget;\n }\n getModulePath(name) {\n return this.entries.get(name)?.modulePath;\n }\n [Symbol.iterator]() {\n const entries = this.entries.values();\n return (function* () {\n for (const entry of entries)\n yield entry.widget;\n })();\n }\n}\n//# sourceMappingURL=widget.registry.js.map",
|
|
9
|
+
"/**\n * Widget Element - Browser Custom Element\n *\n * Renders Widget instances in the browser as `widget-{name}` elements.\n * Handles:\n * - SSR hydration (ssr attribute)\n * - Client-side data fetching with AbortSignal\n * - Companion file loading (html, md, css)\n * - Loading/error states\n */\nimport { HTMLElementBase } from \"../util/html.util.js\";\nimport { LAZY_ATTR, SSR_ATTR } from \"../../core/util/html.util.js\";\n/** Strip keys with undefined values — returns the filtered object, or undefined if all values are undefined. */\nfunction filterUndefined(obj) {\n const result = {};\n let hasValue = false;\n for (const [k, v] of Object.entries(obj)) {\n if (v !== undefined) {\n result[k] = v;\n hasValue = true;\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return hasValue ? result : undefined;\n}\n/**\n * Custom element that renders a Component in the browser.\n */\nexport class ComponentElement extends HTMLElementBase {\n /** Lazy module loaders keyed by tag name — set by registerLazy(). */\n static lazyLoaders = new Map();\n /** App-level context provider set once during router initialization. */\n static extendContext;\n /**\n * Register (or clear) the context provider that enriches every widget's ComponentContext.\n * @deprecated Use `bootEmrouteApp({ extendContext })` instead — it wires both pages and widgets.\n */\n static setContextProvider(provider) {\n ComponentElement.extendContext = provider;\n }\n component;\n effectiveFiles;\n params = null;\n data = null;\n context;\n state = 'idle';\n errorMessage = '';\n deferred = null;\n abortController = null;\n intersectionObserver = null;\n /** Promise that resolves with fetched data (available after loadData starts) */\n dataPromise = null;\n constructor(component, files) {\n super();\n this.component = component;\n this.effectiveFiles = files;\n // Attach shadow root if not already present (Declarative Shadow DOM creates it from <template shadowrootmode=\"open\">)\n // This enables progressive enhancement: SSR with DSD works without JS, then hydrates when JS loads\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n }\n }\n /**\n * Register a widget as a custom element: `widget-{name}`.\n * Creates a fresh widget instance per DOM element (per-element state).\n * Optional `files` parameter provides discovered file paths without mutating\n * the component instance.\n */\n static register(component, files) {\n const tagName = `widget-${component.name}`;\n if (!globalThis.customElements || customElements.get(tagName)) {\n return;\n }\n const WidgetClass = component.constructor;\n const BoundElement = class extends ComponentElement {\n constructor() {\n super(new WidgetClass(), files);\n }\n };\n customElements.define(tagName, BoundElement);\n }\n /**\n * Register a widget class (not instance) as a custom element: `widget-{name}`.\n * Used for manifest-based registration where classes are loaded dynamically.\n */\n static registerClass(WidgetClass, name, files) {\n const tagName = `widget-${name}`;\n if (!globalThis.customElements || customElements.get(tagName)) {\n return;\n }\n const BoundElement = class extends ComponentElement {\n constructor() {\n super(new WidgetClass(), files);\n }\n };\n customElements.define(tagName, BoundElement);\n }\n /**\n * Register a widget lazily: define the custom element immediately (so SSR\n * content via Declarative Shadow DOM is adopted), but defer loading the\n * module until connectedCallback fires. Once loaded, the real component\n * replaces the placeholder and hydration proceeds normally.\n */\n static registerLazy(name, loader) {\n const tagName = `widget-${name}`;\n if (!globalThis.customElements || customElements.get(tagName))\n return;\n ComponentElement.lazyLoaders.set(tagName, loader);\n // Placeholder component — replaced by the real one once the module loads.\n // Cast needed because Component is abstract; the real module replaces this.\n const placeholder = {\n name,\n getData: () => Promise.resolve(null),\n renderHTML: () => '',\n renderMarkdown: () => '',\n renderError: () => '',\n renderMarkdownError: () => '',\n };\n const BoundElement = class extends ComponentElement {\n constructor() {\n super(placeholder);\n }\n };\n customElements.define(tagName, BoundElement);\n }\n /**\n * Promise that resolves when component is ready (data loaded and rendered).\n * Used by router to wait for async components.\n */\n get ready() {\n if (this.state === 'ready') {\n return Promise.resolve();\n }\n this.deferred ??= Promise.withResolvers();\n return this.deferred.promise;\n }\n async connectedCallback() {\n // Lazy module loading — resolve actual component before proceeding\n const tagName = this.tagName.toLowerCase();\n const lazyLoader = ComponentElement.lazyLoaders.get(tagName);\n if (lazyLoader) {\n try {\n const mod = await lazyLoader();\n if (mod.__files && typeof mod.__files === 'object') {\n this.effectiveFiles = mod.__files;\n }\n for (const exp of Object.values(mod)) {\n if (exp && typeof exp === 'object' && 'getData' in exp) {\n const WidgetClass = exp.constructor;\n this.component = new WidgetClass();\n break;\n }\n if (typeof exp === 'function' && exp.prototype?.getData) {\n this.component = new exp();\n break;\n }\n }\n }\n catch {\n // Module failed to load (e.g. raw .ts served without transpilation).\n // SSR content is already visible — skip hydration gracefully.\n if (this.hasAttribute(SSR_ATTR)) {\n this.removeAttribute(SSR_ATTR);\n this.signalReady();\n return;\n }\n }\n }\n this.component.element = this;\n this.style.contentVisibility = 'auto';\n this.abortController = new AbortController();\n const signal = this.abortController.signal;\n // Parse params from element attributes\n const params = {};\n for (const attr of this.attributes) {\n if (attr.name === SSR_ATTR || attr.name === LAZY_ATTR)\n continue;\n const key = attr.name.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n try {\n params[key] = JSON.parse(attr.value);\n }\n catch {\n params[key] = attr.value;\n }\n }\n this.params = params;\n // Validate params\n if (this.component.validateParams && this.params !== null) {\n const error = this.component.validateParams(this.params);\n if (error) {\n this.setError(error);\n return;\n }\n }\n // Load companion files (html, md, css) if declared\n const files = await this.loadFiles();\n if (signal.aborted)\n return;\n const currentUrl = globalThis.location ? new URL(location.href) : new URL('http://localhost/');\n const filteredFiles = filterUndefined(files);\n const base = {\n url: currentUrl,\n pathname: currentUrl.pathname,\n searchParams: currentUrl.searchParams,\n params: this.params ?? {},\n ...(filteredFiles ? { files: filteredFiles } : {}),\n };\n this.context = ComponentElement.extendContext ? ComponentElement.extendContext(base) : base;\n // Hydrate from SSR: adopt content from Declarative Shadow DOM\n if (this.hasAttribute(SSR_ATTR)) {\n this.removeAttribute(SSR_ATTR);\n // Read SSR data from light DOM (JSON text placed alongside shadow root)\n const lightText = this.textContent?.trim();\n if (lightText) {\n try {\n this.data = JSON.parse(lightText);\n }\n catch {\n // Not valid JSON — proceed with data: null\n }\n }\n // Clear light DOM content (JSON text)\n this.textContent = '';\n this.state = 'ready';\n // Call hydrate() hook to attach event listeners\n if (this.component.hydrate) {\n const args = { data: this.data, params: this.params, context: this.context };\n queueMicrotask(() => {\n this.component.hydrate(args);\n });\n }\n this.signalReady();\n return;\n }\n // Lazy: defer loadData until element is visible\n if (this.hasAttribute(LAZY_ATTR)) {\n this.intersectionObserver = new IntersectionObserver((entries) => {\n const entry = entries[0];\n if (entry.isIntersecting) {\n this.intersectionObserver?.disconnect();\n this.intersectionObserver = null;\n this.loadData();\n }\n });\n this.intersectionObserver.observe(this);\n return;\n }\n await this.loadData();\n }\n disconnectedCallback() {\n this.component.destroy?.();\n this.component.element = undefined;\n this.intersectionObserver?.disconnect();\n this.intersectionObserver = null;\n this.abortController?.abort();\n this.abortController = null;\n this.state = 'idle';\n this.data = null;\n this.context = undefined;\n this.dataPromise = null;\n this.errorMessage = '';\n this.signalReady();\n this.deferred = null;\n }\n /**\n * Reload component data. Aborts any in-flight request first.\n */\n async reload() {\n if (this.params === null)\n return;\n // Abort previous and create fresh controller\n this.abortController?.abort();\n this.abortController = new AbortController();\n await this.loadData();\n }\n /**\n * Get companion files for this widget instance.\n * Returns inlined content from __files (set during lazy module load) directly.\n */\n async loadFiles() {\n return this.effectiveFiles ?? {};\n }\n async loadData() {\n if (this.params === null)\n return;\n const signal = this.abortController?.signal;\n this.state = 'loading';\n this.render();\n try {\n const promise = this.component.getData({\n params: this.params,\n ...(signal ? { signal } : {}),\n context: this.context,\n });\n this.dataPromise = promise;\n this.data = await promise;\n // Check abort after await — don't touch DOM if disconnected\n if (signal?.aborted)\n return;\n this.state = 'ready';\n }\n catch (e) {\n if (e instanceof DOMException && e.name === 'AbortError')\n return;\n if (signal?.aborted)\n return;\n this.setError(e instanceof Error ? e.message : String(e));\n return;\n }\n this.render();\n this.signalReady();\n }\n setError(message) {\n this.state = 'error';\n this.errorMessage = message;\n this.render();\n this.signalReady(); // Ready even on error (completed loading)\n }\n signalReady() {\n this.deferred?.resolve();\n this.deferred = null;\n }\n render() {\n if (this.params === null) {\n this.shadowRoot.setHTMLUnsafe('');\n return;\n }\n if (this.state === 'error') {\n this.shadowRoot.setHTMLUnsafe(this.component.renderError({\n error: new Error(this.errorMessage),\n params: this.params,\n }));\n return;\n }\n this.shadowRoot.setHTMLUnsafe(this.component.renderHTML({\n data: this.state === 'ready' ? this.data : null,\n params: this.params,\n context: this.context,\n }));\n // Call hydrate() after rendering to attach event listeners\n if (this.state === 'ready' && this.component.hydrate) {\n const args = { data: this.data, params: this.params, context: this.context };\n queueMicrotask(() => {\n this.component.hydrate(args);\n });\n }\n }\n}\n//# sourceMappingURL=component.element.js.map",
|
|
10
|
+
"/**\n * Widget Registry\n *\n * Name → Component lookup. Used by all renderers.\n * Pages are NOT in this registry — they live in the routes manifest.\n *\n * Supports eager entries (widget instance) and lazy entries (module path only).\n * Lazy entries are resolved on demand by the renderer via Pipeline → Runtime.\n */\nexport class WidgetRegistry {\n entries = new Map();\n /** Register a widget instance (eager). */\n add(widget, modulePath) {\n this.entries.set(widget.name, { widget, modulePath });\n }\n /** Register a widget by name and module path (lazy — resolved on demand by renderer). */\n addLazy(name, modulePath) {\n if (!this.entries.has(name)) {\n this.entries.set(name, { modulePath });\n }\n }\n get(name) {\n return this.entries.get(name)?.widget;\n }\n getModulePath(name) {\n return this.entries.get(name)?.modulePath;\n }\n [Symbol.iterator]() {\n const entries = this.entries.values();\n return (function* () {\n for (const entry of entries) {\n if (entry.widget)\n yield entry.widget;\n }\n })();\n }\n}\n/** Extract a WidgetComponent from a loaded module's exports. */\nexport function extractWidgetExport(mod) {\n for (const value of Object.values(mod)) {\n if (!value)\n continue;\n if (typeof value === 'object' && 'getData' in value) {\n return value;\n }\n if (typeof value === 'function' && value.prototype?.getData) {\n return new value();\n }\n }\n return null;\n}\n//# sourceMappingURL=widget.registry.js.map",
|
|
11
11
|
"/**\n * Route Trie\n *\n * Default RouteResolver implementation. O(depth) route matching over\n * the RouteNode tree.\n *\n * Walks the RouteNode tree directly — no conversion step, no internal state\n * beyond the tree reference. Each URL segment is matched in order:\n * static → dynamic (:param) → wildcard (:rest*). Backtracking handles\n * cases where a dynamic path leads to a dead end but a wildcard at an\n * ancestor would match.\n *\n * Static segment matching is case-sensitive, per RFC 3986.\n */\n/**\n * Default RouteResolver implementation.\n * Walks the RouteNode tree directly — no conversion, no Maps.\n */\nexport class RouteTrie {\n tree;\n constructor(tree) {\n this.tree = tree;\n }\n match(pathname) {\n pathname = this.normalizePath(pathname);\n if (pathname === '/') {\n if (this.tree.files || this.tree.redirect) {\n return { node: this.tree, pattern: '/', params: {} };\n }\n return undefined;\n }\n return this.walk(this.tree, this.splitSegments(pathname), 0, {}, '/');\n }\n findErrorBoundary(pathname) {\n pathname = this.normalizePath(pathname);\n if (pathname === '/')\n return this.tree.errorBoundary;\n return this.walkForBoundary(this.tree, this.splitSegments(pathname), 0, this.tree.errorBoundary);\n }\n findRoute(pattern) {\n if (pattern === '/') {\n return (this.tree.files || this.tree.redirect) ? this.tree : undefined;\n }\n const segments = this.splitSegments(pattern);\n let node = this.tree;\n for (const segment of segments) {\n let child;\n if (segment.startsWith(':') && segment.endsWith('*')) {\n child = node.wildcard?.child;\n }\n else if (segment.startsWith(':')) {\n child = node.dynamic?.child;\n }\n else {\n child = node.children?.[segment];\n }\n if (!child)\n return undefined;\n node = child;\n }\n return (node.files || node.redirect) ? node : undefined;\n }\n // ── Private helpers ─────────────────────────────────────────────────\n safeDecode(segment) {\n try {\n return decodeURIComponent(segment);\n }\n catch {\n return segment;\n }\n }\n splitSegments(pathname) {\n return pathname.substring(1).split('/');\n }\n normalizePath(pathname) {\n if (pathname.length > 1 && pathname.endsWith('/')) {\n pathname = pathname.slice(0, -1);\n }\n if (!pathname.startsWith('/')) {\n pathname = '/' + pathname;\n }\n return pathname;\n }\n walk(node, segments, index, params, pattern) {\n if (index === segments.length) {\n if (node.files || node.redirect) {\n return { node, pattern, params: { ...params } };\n }\n if (node.wildcard && (node.wildcard.child.files || node.wildcard.child.redirect)) {\n const wp = pattern === '/' ? `/:${node.wildcard.param}*` : `${pattern}/:${node.wildcard.param}*`;\n return {\n node: node.wildcard.child,\n pattern: wp,\n params: { ...params, [node.wildcard.param]: '' },\n };\n }\n return undefined;\n }\n const segment = segments[index];\n // Static\n const staticChild = node.children?.[segment];\n if (staticChild) {\n const childPattern = pattern === '/' ? `/${segment}` : `${pattern}/${segment}`;\n const result = this.walk(staticChild, segments, index + 1, params, childPattern);\n if (result)\n return result;\n }\n // Dynamic\n if (node.dynamic) {\n const { param, child } = node.dynamic;\n params[param] = this.safeDecode(segment);\n const childPattern = pattern === '/' ? `/:${param}` : `${pattern}/:${param}`;\n const result = this.walk(child, segments, index + 1, params, childPattern);\n if (result)\n return result;\n delete params[param];\n }\n // Wildcard\n if (node.wildcard && (node.wildcard.child.files || node.wildcard.child.redirect)) {\n const { param, child } = node.wildcard;\n let rest = this.safeDecode(segment);\n for (let i = index + 1; i < segments.length; i++) {\n rest += '/' + this.safeDecode(segments[i]);\n }\n const wp = pattern === '/' ? `/:${param}*` : `${pattern}/:${param}*`;\n return {\n node: child,\n pattern: wp,\n params: { ...params, [param]: rest },\n };\n }\n return undefined;\n }\n walkForBoundary(node, segments, index, deepest) {\n if (index === segments.length) {\n return node.errorBoundary ?? deepest;\n }\n const segment = segments[index];\n const staticChild = node.children?.[segment];\n if (staticChild) {\n return this.walkForBoundary(staticChild, segments, index + 1, staticChild.errorBoundary ?? deepest);\n }\n if (node.dynamic) {\n return this.walkForBoundary(node.dynamic.child, segments, index + 1, node.dynamic.child.errorBoundary ?? deepest);\n }\n if (node.wildcard) {\n return node.wildcard.child.errorBoundary ?? deepest;\n }\n return deepest;\n }\n}\n//# sourceMappingURL=route.trie.js.map",
|
|
12
12
|
"/**\n * Abstract Runtime\n *\n * Storage contract. Speaks Request/Response.\n * Concrete implementations decide how to store, cache, scan, and serve.\n *\n * Three access patterns:\n * - handle() — raw passthrough\n * - query() — read (Response or string)\n * - command() — write/delete\n */\n/** Well-known manifest paths (convention between Runtime and consumers). */\nexport const ROUTES_MANIFEST_PATH = '/routes.manifest.json';\nexport const WIDGETS_MANIFEST_PATH = '/widgets.manifest.json';\nexport const ELEMENTS_MANIFEST_PATH = '/elements.manifest.json';\nexport class Runtime {\n /** Dynamically import a module from storage. */\n loadModule(_path) {\n throw new Error(`loadModule not implemented for ${this.constructor.name}`);\n }\n /** Transpile TypeScript to JavaScript. */\n transpile(_source) {\n throw new Error(`transpile not implemented for ${this.constructor.name}`);\n }\n}\n//# sourceMappingURL=abstract.runtime.js.map",
|
|
13
13
|
"const noop = () => { };\n/** Default no-op logger. */\nexport const defaultLogger = { error: noop, warn: noop };\n/** @deprecated Pass `logger` in Emroute.create() config instead. This function is a no-op. */\nexport function setLogger(_logger) {\n console.warn('[emroute] setLogger() is deprecated. Pass `logger` in Emroute.create() config instead.');\n}\n//# sourceMappingURL=logger.type.js.map",
|
|
14
14
|
"/**\n * Pipeline\n *\n * Orchestration layer between Router, Runtime, and Component.\n *\n * Owns:\n * - Route matching (reads manifest from Runtime, walks RouteNode tree)\n * - Module loading (delegates to Runtime)\n * - Companion file reading (delegates to Runtime)\n * - ComponentContext building\n * - Route hierarchy construction\n *\n * Does NOT own:\n * - Rendering (that's Renderer)\n * - HTTP routing / base paths (that's Server)\n * - Storage I/O (that's Runtime)\n * - Navigation events (that's the browser adapter)\n */\nimport { RouteTrie } from \"../router/route.trie.js\";\nimport { ROUTES_MANIFEST_PATH } from \"../runtime/abstract.runtime.js\";\nimport { defaultLogger } from \"../type/logger.type.js\";\n/** Default root route — renders a slot for child routes. */\nexport const DEFAULT_ROOT_ROUTE = {\n pattern: '/',\n type: 'page',\n modulePath: '__default_root__',\n};\n/** Synthesize a RouteConfig from matched route data. */\nfunction toRouteConfig(node, pattern) {\n return {\n pattern,\n type: node.redirect ? 'redirect' : 'page',\n modulePath: node.redirect ?? node.files?.ts ?? node.files?.js ?? node.files?.html ?? node.files?.md ?? '',\n ...(node.files ? { files: node.files } : {}),\n };\n}\nexport class Pipeline {\n runtime;\n contextProvider;\n logger;\n moduleLoaders;\n constructor(options) {\n this.runtime = options.runtime;\n this.contextProvider = options.contextProvider;\n this.logger = options.logger ?? defaultLogger;\n this.moduleLoaders = options.moduleLoaders ?? {};\n }\n // ── Route resolver (from Runtime) ───────────────────────────────────\n async getResolver() {\n const response = await this.runtime.query(ROUTES_MANIFEST_PATH);\n const tree = response.status === 404 ? {} : await response.json();\n return new RouteTrie(tree);\n }\n // ── Matching ────────────────────────────────────────────────────────\n async match(url) {\n const resolver = await this.getResolver();\n const resolved = resolver.match(url.pathname);\n if (resolved) {\n return { route: toRouteConfig(resolved.node, resolved.pattern), params: resolved.params };\n }\n if (url.pathname === '/' || url.pathname === '') {\n return { route: DEFAULT_ROOT_ROUTE, params: {} };\n }\n return undefined;\n }\n async findRoute(pattern) {\n const resolver = await this.getResolver();\n const node = resolver.findRoute(pattern);\n if (!node)\n return undefined;\n return toRouteConfig(node, pattern);\n }\n async findErrorBoundary(pathname) {\n const resolver = await this.getResolver();\n const modulePath = resolver.findErrorBoundary(pathname);\n if (!modulePath)\n return undefined;\n return { pattern: pathname, modulePath };\n }\n async getStatusPage(status) {\n const resolver = await this.getResolver();\n const node = resolver.findRoute(`/${status}`);\n if (!node)\n return undefined;\n return toRouteConfig(node, `/${status}`);\n }\n async getErrorHandler() {\n const resolver = await this.getResolver();\n const modulePath = resolver.findErrorBoundary('/');\n if (!modulePath)\n return undefined;\n return { pattern: '/', type: 'error', modulePath };\n }\n // ── Route hierarchy ────────────────────────────────────────────────\n buildRouteHierarchy(pattern) {\n if (pattern === '/')\n return ['/'];\n const segments = pattern.split('/').filter(Boolean);\n const hierarchy = ['/'];\n let current = '';\n for (const segment of segments) {\n current += '/' + segment;\n hierarchy.push(current);\n }\n return hierarchy;\n }\n // ── Module loading ─────────────────────────────────────────────────\n async loadModule(modulePath) {\n const loader = this.moduleLoaders[modulePath];\n if (loader) {\n return await loader();\n }\n const abs = modulePath.startsWith('/') ? modulePath : '/' + modulePath;\n return await this.runtime.loadModule(abs);\n }\n /**\n * Get inlined `__files` from a loaded module (merged module pattern).\n */\n getModuleFiles(mod) {\n if (!mod || typeof mod !== 'object')\n return undefined;\n const files = mod.__files;\n if (!files || typeof files !== 'object')\n return undefined;\n return files;\n }\n // ── File loading ───────────────────────────────────────────────────\n async loadFiles(files) {\n const load = async (path) => {\n const abs = path.startsWith('/') ? path : '/' + path;\n try {\n return await this.runtime.query(abs, { as: 'text' });\n }\n catch (e) {\n console.warn(`[Pipeline] Failed to load file ${path}:`, e instanceof Error ? e.message : e);\n return undefined;\n }\n };\n const [html, md, css] = await Promise.all([\n files.html ? load(files.html) : undefined,\n files.md ? load(files.md) : undefined,\n files.css ? load(files.css) : undefined,\n ]);\n const result = {};\n if (html !== undefined)\n result.html = html;\n if (md !== undefined)\n result.md = md;\n if (css !== undefined)\n result.css = css;\n return result;\n }\n // ── Context building ───────────────────────────────────────────────\n toRouteInfo(matched, url) {\n return { url, params: matched.params };\n }\n async buildContext(routeInfo, route, signal, isLeaf, loadedModule) {\n const rf = route.files;\n // Try inlined __files from merged module first\n const inlined = loadedModule ? this.getModuleFiles(loadedModule) : undefined;\n let files;\n if (inlined) {\n files = inlined;\n }\n else if (rf) {\n const filePaths = {};\n if (rf.html)\n filePaths.html = rf.html;\n if (rf.md)\n filePaths.md = rf.md;\n if (rf.css)\n filePaths.css = rf.css;\n files = await this.loadFiles(filePaths);\n }\n else {\n files = {};\n }\n const base = {\n ...routeInfo,\n pathname: routeInfo.url.pathname,\n searchParams: routeInfo.url.searchParams,\n files,\n ...(signal ? { signal } : {}),\n ...(isLeaf !== undefined ? { isLeaf } : {}),\n };\n return this.contextProvider ? this.contextProvider(base) : base;\n }\n}\n//# sourceMappingURL=pipeline.js.map",
|
|
15
|
-
"/**\n * Widget Resolve Utilities\n *\n * Server-side resolution of <widget-*> tags in HTML.\n * Calls getData() + renderHTML() on widgets and injects SSR hydration data.\n */\nimport { defaultLogger } from \"../type/logger.type.js\";\nimport { LAZY_ATTR, SSR_ATTR } from \"./html.util.js\";\n/** Maximum nesting depth for widgets to prevent infinite loops */\nexport const MAX_WIDGET_DEPTH = 10;\n/**\n * Recursively resolve widgets in content with depth limit.\n */\nexport async function resolveRecursively(content, parse, resolve, replace, depth = 0, logger = defaultLogger) {\n if (depth >= MAX_WIDGET_DEPTH) {\n logger.warn(`Widget nesting depth limit reached (${MAX_WIDGET_DEPTH}). ` +\n 'Possible circular dependency or excessive nesting.');\n return content;\n }\n const widgets = parse(content);\n if (widgets.length === 0)\n return content;\n const replacements = new Map();\n await Promise.all(widgets.map(async (widget) => {\n let rendered = await resolve(widget);\n rendered = await resolveRecursively(rendered, parse, resolve, replace, depth + 1, logger);\n replacements.set(widget, rendered);\n }));\n return replace(content, replacements);\n}\n/**\n * Resolve <widget-*> tags in HTML by calling getData() + renderHTML().\n */\nexport function resolveWidgetTags(html,
|
|
15
|
+
"/**\n * Widget Resolve Utilities\n *\n * Server-side resolution of <widget-*> tags in HTML.\n * Calls getData() + renderHTML() on widgets and injects SSR hydration data.\n */\nimport { defaultLogger } from \"../type/logger.type.js\";\nimport { LAZY_ATTR, SSR_ATTR } from \"./html.util.js\";\n/** Maximum nesting depth for widgets to prevent infinite loops */\nexport const MAX_WIDGET_DEPTH = 10;\n/**\n * Recursively resolve widgets in content with depth limit.\n */\nexport async function resolveRecursively(content, parse, resolve, replace, depth = 0, logger = defaultLogger) {\n if (depth >= MAX_WIDGET_DEPTH) {\n logger.warn(`Widget nesting depth limit reached (${MAX_WIDGET_DEPTH}). ` +\n 'Possible circular dependency or excessive nesting.');\n return content;\n }\n const widgets = parse(content);\n if (widgets.length === 0)\n return content;\n const replacements = new Map();\n await Promise.all(widgets.map(async (widget) => {\n let rendered = await resolve(widget);\n rendered = await resolveRecursively(rendered, parse, resolve, replace, depth + 1, logger);\n replacements.set(widget, rendered);\n }));\n return replace(content, replacements);\n}\n/**\n * Resolve <widget-*> tags in HTML by calling getData() + renderHTML().\n */\nexport function resolveWidgetTags(html, getWidget, routeInfo, loadFiles, contextProvider, logger = defaultLogger) {\n const tagPattern = /<widget-(?<name>[a-z][a-z0-9-]*)(?<attrs>\\s[^>]*)?>(?<content>.*?)<\\/widget-\\k<name>>/gis;\n const wrappers = new Map();\n const ssrAttrPattern = new RegExp(`\\\\s${SSR_ATTR}(?:\\\\s|=|$)`);\n const parse = (content) => {\n const matches = content.matchAll(tagPattern).toArray();\n return matches.filter((match) => {\n const attrsString = match.groups.attrs || '';\n return !ssrAttrPattern.test(attrsString);\n });\n };\n const resolve = async (match) => {\n const widgetName = match.groups.name;\n const attrsString = match.groups.attrs?.trim() ?? '';\n const widget = await getWidget(widgetName);\n if (!widget)\n return match[0];\n const params = parseAttrsToParams(attrsString);\n try {\n let files;\n if (loadFiles) {\n files = await loadFiles(widgetName);\n }\n const baseContext = {\n ...routeInfo,\n pathname: routeInfo.url.pathname,\n searchParams: routeInfo.url.searchParams,\n ...(files ? { files } : {}),\n };\n const context = contextProvider ? contextProvider(baseContext) : baseContext;\n const data = await widget.getData({ params, context });\n const rendered = widget.renderHTML({ data, params, context });\n wrappers.set(match, {\n tagName: `widget-${widgetName}`,\n attrs: attrsString ? ` ${attrsString}` : '',\n ssrData: widget.exposeSsrData ? escapeAttr(JSON.stringify(data)) : '',\n });\n return rendered;\n }\n catch (e) {\n logger.error(`[SSR HTML] Widget \"${widgetName}\" render failed`, e instanceof Error ? e : undefined);\n return match[0];\n }\n };\n const replace = (content, replacements) => {\n let result = content;\n const entries = [...replacements.entries()].sort((a, b) => b[0].index - a[0].index);\n for (const [match, innerHtml] of entries) {\n const start = match.index;\n const end = start + match[0].length;\n const wrap = wrappers.get(match);\n const lightDomData = wrap?.ssrData ? wrap.ssrData : '';\n const replacement = wrap\n ? `<${wrap.tagName}${wrap.attrs} ${SSR_ATTR}><template shadowrootmode=\"open\">${innerHtml}</template>${lightDomData}</${wrap.tagName}>`\n : innerHtml;\n result = result.slice(0, start) + replacement + result.slice(end);\n }\n return result;\n };\n return resolveRecursively(html, parse, resolve, replace, 0, logger);\n}\n/** Parse HTML attribute string into params object. */\nexport function parseAttrsToParams(attrsString) {\n const params = {};\n if (!attrsString)\n return params;\n const attrPattern = /(?<attr>[a-z][a-z0-9-]*)(?:=\"(?<dq>[^\"]*)\"|='(?<sq>[^']*)'|=(?<uq>[^\\s>]+))?/gi;\n for (const match of attrsString.matchAll(attrPattern)) {\n const { attr: attrName, dq, sq, uq } = match.groups;\n if (!attrName || attrName === SSR_ATTR || attrName === LAZY_ATTR)\n continue;\n const key = attrName.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n const rawValue = dq ?? sq ?? uq;\n if (rawValue === undefined) {\n params[key] = '';\n continue;\n }\n const raw = rawValue.replaceAll('&', '&').replaceAll(''', \"'\").replaceAll('"', '\"');\n try {\n params[key] = JSON.parse(raw);\n }\n catch {\n params[key] = raw;\n }\n }\n return params;\n}\nfunction escapeAttr(value) {\n return value.replaceAll('&', '&').replaceAll(\"'\", ''');\n}\n//# sourceMappingURL=widget-resolve.util.js.map",
|
|
16
16
|
"/**\n * Component Base Class\n *\n * Everything is a Component: pages and widgets.\n * Components render differently based on context:\n * - /md/* → Markdown (LLMs, text clients)\n * - /html/* → Pre-rendered HTML (SSR)\n * - SPA → Hydrated custom elements\n */\nimport { escapeHtml } from \"../util/html.util.js\";\nexport class Component {\n /** Host element reference, set by ComponentElement in the browser. */\n element;\n /** Associated file paths for pre-loaded content (html, md, css). */\n files;\n /**\n * When true, SSR serializes the getData() result into the element's\n * light DOM so the client can access it immediately in hydrate()\n * without re-fetching.\n */\n exposeSsrData;\n renderHTML(args) {\n if (args.data === null) {\n return `<div data-component=\"${this.name}\">Loading...</div>`;\n }\n const markdown = this.renderMarkdown({\n data: args.data,\n params: args.params,\n context: args.context,\n });\n return `<div data-component=\"${this.name}\" data-markdown>${escapeHtml(markdown)}</div>`;\n }\n experimentalUseTemplate(sourceOrId, id) {\n // DOM path: single arg = template id, find in shadow DOM\n if (id === undefined) {\n const templateId = sourceOrId;\n const shadowRoot = this.element?.shadowRoot;\n const template = shadowRoot?.querySelector(`template#${templateId}`);\n if (!template) {\n throw new Error(`[${this.name}] Template \"#${templateId}\" not found in shadow DOM. ` +\n 'Ensure the <template> element exists in the companion HTML.');\n }\n return (slots) => {\n const clone = template.content.cloneNode(true);\n if (!slots)\n return clone;\n for (const [name, content] of Object.entries(slots)) {\n const selector = name === 'default' ? 'slot:not([name])' : `slot[name=\"${name}\"]`;\n const slot = clone.querySelector(selector);\n if (!slot)\n continue;\n const temp = document.createElement('template');\n temp.innerHTML = content;\n slot.replaceWith(temp.content);\n }\n return clone;\n };\n }\n const source = sourceOrId;\n // Markdown path: ```template:id ... ```\n const mdPattern = new RegExp('```template:' + id + '\\\\n([\\\\s\\\\S]*?)```');\n const mdMatch = source.match(mdPattern);\n if (mdMatch) {\n const skeleton = mdMatch[1];\n return (slots) => {\n if (!slots)\n return skeleton;\n let result = skeleton;\n for (const [name, content] of Object.entries(slots)) {\n result = result.replaceAll(`slot:${name}`, content);\n }\n return result;\n };\n }\n // HTML path: <template id=\"...\">...</template>\n const htmlPattern = new RegExp(`<template\\\\s+id=[\"']${id}[\"'][^>]*>([\\\\s\\\\S]*?)</template>`);\n const htmlMatch = source.match(htmlPattern);\n if (!htmlMatch) {\n throw new Error(`[${this.name}] Template \"${id}\" not found in source. ` +\n 'Expected <template id=\"' + id + '\"> in HTML or ```template:' + id + ' in markdown.');\n }\n const skeleton = htmlMatch[1];\n return (slots) => {\n if (!slots)\n return skeleton;\n let result = skeleton;\n for (const [name, content] of Object.entries(slots)) {\n if (name === 'default')\n continue;\n result = result.replaceAll(new RegExp(`<slot\\\\s+name=[\"']${name}[\"'][^>]*>[\\\\s\\\\S]*?</slot>`, 'g'), content);\n }\n if ('default' in slots) {\n result = result.replaceAll(/<slot\\s*>[\\s\\S]*?<\\/slot>/g, slots['default']);\n }\n return result;\n };\n }\n renderError(args) {\n const msg = args.error instanceof Error ? args.error.message : String(args.error);\n return `<div data-component=\"${this.name}\">Error: ${escapeHtml(msg)}</div>`;\n }\n renderMarkdownError(error) {\n const msg = error instanceof Error ? error.message : String(error);\n return `> **Error** (\\`${this.name}\\`): ${msg}`;\n }\n}\n//# sourceMappingURL=abstract.component.js.map",
|
|
17
17
|
"/**\n * Page Component\n *\n * Params come from URL, context carries file content.\n *\n * Default implementations follow the fallback table:\n * - renderHTML: html file → md via <mark-down> → <router-slot /> (non-leaf only)\n * - renderMarkdown: md file → ```router-slot\\n``` (non-leaf only)\n * - getData: no-op (returns null)\n */\nimport { Component } from \"./abstract.component.js\";\nimport { escapeHtml } from \"../util/html.util.js\";\nexport class PageComponent extends Component {\n name = 'page';\n pattern;\n getData(_args) {\n return Promise.resolve(null);\n }\n renderHTML(args) {\n const files = args.context.files;\n const style = files?.css ? `<style>${files.css}</style>\\n` : '';\n if (files?.html) {\n let html = style + files.html;\n if (files.md && html.includes('<mark-down></mark-down>')) {\n html = html.replace('<mark-down></mark-down>', `<mark-down>${escapeHtml(files.md)}</mark-down>`);\n }\n return html;\n }\n if (files?.md) {\n const hasSlot = files.md.includes('```router-slot');\n const slot = args.context.isLeaf || hasSlot ? '' : '\\n<router-slot></router-slot>';\n return `${style}<mark-down>${escapeHtml(files.md)}</mark-down>${slot}`;\n }\n return args.context.isLeaf ? '' : '<router-slot></router-slot>';\n }\n renderMarkdown(args) {\n const files = args.context.files;\n if (files?.md) {\n return files.md;\n }\n return args.context.isLeaf ? '' : '```router-slot\\n```';\n }\n getTitle(_args) {\n return undefined;\n }\n}\n/** Shared default instance used by renderers when no custom .page.ts exists. */\nexport default new PageComponent();\n//# sourceMappingURL=page.component.js.map",
|
|
18
|
-
"/**\n * SSR Renderer Base\n *\n * Abstract base class for server-side renderers.\n * Provides the shared render() pipeline; subclasses supply format-specific rendering.\n */\nimport defaultPageComponent from \"../component/page.component.js\";\nimport { DEFAULT_ROOT_ROUTE } from \"../pipeline/pipeline.js\";\nimport { assertSafeRedirect } from \"../util/html.util.js\";\n/**\n * Abstract SSR renderer with shared routing pipeline.\n */\nexport class SsrRenderer {\n pipeline;\n widgets;\n logger;\n constructor(pipeline, options = {}) {\n this.pipeline = pipeline;\n this.logger = pipeline.logger;\n this.widgets = options.widgets ?? null;\n }\n /**\n * Render a URL to a content string.\n */\n async render(url, signal) {\n const matched = await this.pipeline.match(url);\n if (!matched) {\n const statusPage = await this.pipeline.getStatusPage(404);\n if (statusPage) {\n try {\n const ri = { url, params: {} };\n const result = await this.renderRouteContent(ri, statusPage, undefined, signal);\n return { content: this.stripSlots(result.content), status: 404, ...(result.title !== undefined ? { title: result.title } : {}) };\n }\n catch (e) {\n this.logger.error(`[${this.label}] Failed to render 404 status page for ${url.pathname}`, e instanceof Error ? e : undefined);\n }\n }\n return { content: this.renderStatusPage(404, url), status: 404 };\n }\n // Handle redirect\n if (matched.route.type === 'redirect') {\n const module = await this.pipeline.loadModule(matched.route.modulePath);\n const redirectConfig = module.default;\n assertSafeRedirect(redirectConfig.to);\n return {\n content: this.renderRedirect(redirectConfig.to),\n status: redirectConfig.status ?? 301,\n redirect: redirectConfig.to,\n };\n }\n const routeInfo = this.pipeline.toRouteInfo(matched, url);\n try {\n const { content, title } = await this.renderPage(routeInfo, matched, signal);\n return { content, status: 200, ...(title !== undefined ? { title } : {}) };\n }\n catch (error) {\n if (error instanceof Response) {\n const statusPage = await this.pipeline.getStatusPage(error.status);\n if (statusPage) {\n try {\n const ri = { url, params: {} };\n const result = await this.renderRouteContent(ri, statusPage, undefined, signal);\n return {\n content: this.stripSlots(result.content),\n status: error.status,\n ...(result.title !== undefined ? { title: result.title } : {}),\n };\n }\n catch (e) {\n this.logger.error(`[${this.label}] Failed to render ${error.status} status page for ${url.pathname}`, e instanceof Error ? e : undefined);\n }\n }\n return { content: this.renderStatusPage(error.status, url), status: error.status };\n }\n this.logger.error(`[${this.label}] Error rendering ${url.pathname}:`, error instanceof Error ? error : undefined);\n const boundary = await this.pipeline.findErrorBoundary(url.pathname);\n if (boundary) {\n const result = await this.tryRenderErrorModule(boundary.modulePath, url, 'boundary');\n if (result)\n return result;\n }\n const errorHandler = await this.pipeline.getErrorHandler();\n if (errorHandler) {\n const result = await this.tryRenderErrorModule(errorHandler.modulePath, url, 'handler');\n if (result)\n return result;\n }\n return { content: this.renderErrorPage(error, url), status: 500 };\n }\n }\n /**\n * Render a matched page by composing the route hierarchy.\n */\n async renderPage(routeInfo, matched, signal) {\n const hierarchy = this.pipeline.buildRouteHierarchy(matched.route.pattern);\n const segments = [];\n for (let i = 0; i < hierarchy.length; i++) {\n const routePattern = hierarchy[i];\n let route = await this.pipeline.findRoute(routePattern);\n if (!route && routePattern === '/') {\n route = DEFAULT_ROOT_ROUTE;\n }\n if (!route)\n continue;\n if (route === matched.route && routePattern !== matched.route.pattern)\n continue;\n segments.push({ route, isLeaf: i === hierarchy.length - 1 });\n }\n const results = await Promise.all(segments.map(({ route, isLeaf }) => this.renderRouteContent(routeInfo, route, isLeaf, signal)));\n let result = '';\n let pageTitle;\n let lastRenderedPattern = '';\n for (let i = 0; i < segments.length; i++) {\n const { content, title } = results[i];\n if (title) {\n pageTitle = title;\n }\n if (result === '') {\n result = content;\n }\n else {\n const injected = this.injectSlot(result, content, lastRenderedPattern);\n if (injected === result) {\n this.logger.warn(`[${this.label}] Route \"${lastRenderedPattern}\" has no <router-slot> ` +\n `for child route \"${hierarchy[i]}\" to render into. ` +\n `Add <router-slot></router-slot> to the parent template.`);\n }\n result = injected;\n }\n lastRenderedPattern = segments[i].route.pattern;\n }\n result = this.stripSlots(result);\n return { content: result, ...(pageTitle !== undefined ? { title: pageTitle } : {}) };\n }\n /** Load component, build context, get data, render content, get title. */\n async loadRouteContent(routeInfo, route, isLeaf, signal) {\n const files = route.files ?? {};\n const tsModule = files.ts ?? files.js;\n const loadedModule = tsModule\n ? await this.pipeline.loadModule(tsModule)\n : undefined;\n const component = loadedModule?.default ?? defaultPageComponent;\n const context = await this.pipeline.buildContext(routeInfo, route, signal, isLeaf, loadedModule);\n const data = await component.getData({ params: routeInfo.params, ...(signal ? { signal } : {}), context });\n const content = this.renderContent(component, { data, params: routeInfo.params, context });\n const title = component.getTitle({ data, params: routeInfo.params, context });\n return { content, ...(title !== undefined ? { title } : {}) };\n }\n renderComponent(component, data, context) {\n return this.renderContent(component, { data, params: {}, context });\n }\n static EMPTY_URL = new URL('http://error');\n async tryRenderErrorModule(modulePath, url, kind) {\n try {\n const module = await this.pipeline.loadModule(modulePath);\n const component = module.default;\n const minCtx = {\n url: SsrRenderer.EMPTY_URL,\n params: {},\n pathname: '',\n searchParams: new URLSearchParams(),\n };\n const data = await component.getData({ params: {}, context: minCtx });\n const content = this.renderComponent(component, data, minCtx);\n return { content, status: 500 };\n }\n catch (e) {\n this.logger.error(`[${this.label}] Error ${kind} failed for ${url.pathname}`, e instanceof Error ? e : undefined);\n return null;\n }\n }\n}\n//# sourceMappingURL=ssr.renderer.js.map",
|
|
19
|
-
"/**\n * SSR HTML Renderer\n *\n * Server-side HTML rendering.\n * Generates complete HTML strings without DOM manipulation.\n * Expands <mark-down> tags server-side when a markdown renderer is provided.\n */\nimport { DEFAULT_ROOT_ROUTE } from \"../pipeline/pipeline.js\";\nimport { escapeHtml, STATUS_MESSAGES, unescapeHtml } from \"../util/html.util.js\";\nimport { resolveWidgetTags } from \"../util/widget-resolve.util.js\";\nimport { SsrRenderer } from \"./ssr.renderer.js\";\nexport class SsrHtmlRenderer extends SsrRenderer {\n label = 'SSR HTML';\n markdownRenderer;\n markdownReady = null;\n constructor(pipeline, options = {}) {\n super(pipeline, options);\n this.markdownRenderer = options.markdownRenderer ?? null;\n if (this.markdownRenderer?.init) {\n this.markdownReady = this.markdownRenderer.init();\n }\n }\n injectSlot(parent, child, parentPattern) {\n const escaped = parentPattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return parent.replace(new RegExp(`<router-slot\\\\b[^>]*\\\\bpattern=\"${escaped}\"[^>]*></router-slot>`), child);\n }\n stripSlots(result) {\n return result.replace(/<router-slot[^>]*><\\/router-slot>/g, '');\n }\n async renderRouteContent(routeInfo, route, isLeaf, signal) {\n if (route.modulePath === DEFAULT_ROOT_ROUTE.modulePath) {\n return { content: `<router-slot pattern=\"${route.pattern}\"></router-slot>` };\n }\n const { content: rawContent, title } = await this.loadRouteContent(routeInfo, route, isLeaf, signal);\n let content = rawContent;\n content = await this.expandMarkdown(content);\n // Attribute bare <router-slot> tags with this route's pattern\n content = this.attributeSlots(content, route.pattern);\n // Resolve <widget-*> tags\n if (this.widgets) {\n content = await resolveWidgetTags(content, this.
|
|
18
|
+
"/**\n * SSR Renderer Base\n *\n * Abstract base class for server-side renderers.\n * Provides the shared render() pipeline; subclasses supply format-specific rendering.\n */\nimport defaultPageComponent from \"../component/page.component.js\";\nimport { DEFAULT_ROOT_ROUTE } from \"../pipeline/pipeline.js\";\nimport { assertSafeRedirect } from \"../util/html.util.js\";\nimport { extractWidgetExport } from \"../widget/widget.registry.js\";\n/**\n * Abstract SSR renderer with shared routing pipeline.\n */\nexport class SsrRenderer {\n pipeline;\n widgets;\n logger;\n constructor(pipeline, options = {}) {\n this.pipeline = pipeline;\n this.logger = pipeline.logger;\n this.widgets = options.widgets ?? null;\n }\n /** Resolve a widget by name — eager lookup, then lazy load via Pipeline → Runtime. */\n async resolveWidget(name) {\n if (!this.widgets)\n return undefined;\n const widget = this.widgets.get(name);\n if (widget)\n return widget;\n const path = this.widgets.getModulePath(name);\n if (!path)\n return undefined;\n try {\n const mod = await this.pipeline.loadModule(path);\n return extractWidgetExport(mod) ?? undefined;\n }\n catch (e) {\n this.logger.error(`[${this.label}] Failed to load widget \"${name}\"`, e instanceof Error ? e : undefined);\n return undefined;\n }\n }\n /**\n * Render a URL to a content string.\n */\n async render(url, signal) {\n const matched = await this.pipeline.match(url);\n if (!matched) {\n const statusPage = await this.pipeline.getStatusPage(404);\n if (statusPage) {\n try {\n const ri = { url, params: {} };\n const result = await this.renderRouteContent(ri, statusPage, undefined, signal);\n return { content: this.stripSlots(result.content), status: 404, ...(result.title !== undefined ? { title: result.title } : {}) };\n }\n catch (e) {\n this.logger.error(`[${this.label}] Failed to render 404 status page for ${url.pathname}`, e instanceof Error ? e : undefined);\n }\n }\n return { content: this.renderStatusPage(404, url), status: 404 };\n }\n // Handle redirect\n if (matched.route.type === 'redirect') {\n const module = await this.pipeline.loadModule(matched.route.modulePath);\n const redirectConfig = module.default;\n assertSafeRedirect(redirectConfig.to);\n return {\n content: this.renderRedirect(redirectConfig.to),\n status: redirectConfig.status ?? 301,\n redirect: redirectConfig.to,\n };\n }\n const routeInfo = this.pipeline.toRouteInfo(matched, url);\n try {\n const { content, title } = await this.renderPage(routeInfo, matched, signal);\n return { content, status: 200, ...(title !== undefined ? { title } : {}) };\n }\n catch (error) {\n if (error instanceof Response) {\n const statusPage = await this.pipeline.getStatusPage(error.status);\n if (statusPage) {\n try {\n const ri = { url, params: {} };\n const result = await this.renderRouteContent(ri, statusPage, undefined, signal);\n return {\n content: this.stripSlots(result.content),\n status: error.status,\n ...(result.title !== undefined ? { title: result.title } : {}),\n };\n }\n catch (e) {\n this.logger.error(`[${this.label}] Failed to render ${error.status} status page for ${url.pathname}`, e instanceof Error ? e : undefined);\n }\n }\n return { content: this.renderStatusPage(error.status, url), status: error.status };\n }\n this.logger.error(`[${this.label}] Error rendering ${url.pathname}:`, error instanceof Error ? error : undefined);\n const boundary = await this.pipeline.findErrorBoundary(url.pathname);\n if (boundary) {\n const result = await this.tryRenderErrorModule(boundary.modulePath, url, 'boundary');\n if (result)\n return result;\n }\n const errorHandler = await this.pipeline.getErrorHandler();\n if (errorHandler) {\n const result = await this.tryRenderErrorModule(errorHandler.modulePath, url, 'handler');\n if (result)\n return result;\n }\n return { content: this.renderErrorPage(error, url), status: 500 };\n }\n }\n /**\n * Render a matched page by composing the route hierarchy.\n */\n async renderPage(routeInfo, matched, signal) {\n const hierarchy = this.pipeline.buildRouteHierarchy(matched.route.pattern);\n const segments = [];\n for (let i = 0; i < hierarchy.length; i++) {\n const routePattern = hierarchy[i];\n let route = await this.pipeline.findRoute(routePattern);\n if (!route && routePattern === '/') {\n route = DEFAULT_ROOT_ROUTE;\n }\n if (!route)\n continue;\n if (route === matched.route && routePattern !== matched.route.pattern)\n continue;\n segments.push({ route, isLeaf: i === hierarchy.length - 1 });\n }\n const results = await Promise.all(segments.map(({ route, isLeaf }) => this.renderRouteContent(routeInfo, route, isLeaf, signal)));\n let result = '';\n let pageTitle;\n let lastRenderedPattern = '';\n for (let i = 0; i < segments.length; i++) {\n const { content, title } = results[i];\n if (title) {\n pageTitle = title;\n }\n if (result === '') {\n result = content;\n }\n else {\n const injected = this.injectSlot(result, content, lastRenderedPattern);\n if (injected === result) {\n this.logger.warn(`[${this.label}] Route \"${lastRenderedPattern}\" has no <router-slot> ` +\n `for child route \"${hierarchy[i]}\" to render into. ` +\n `Add <router-slot></router-slot> to the parent template.`);\n }\n result = injected;\n }\n lastRenderedPattern = segments[i].route.pattern;\n }\n result = this.stripSlots(result);\n return { content: result, ...(pageTitle !== undefined ? { title: pageTitle } : {}) };\n }\n /** Load component, build context, get data, render content, get title. */\n async loadRouteContent(routeInfo, route, isLeaf, signal) {\n const files = route.files ?? {};\n const tsModule = files.ts ?? files.js;\n const loadedModule = tsModule\n ? await this.pipeline.loadModule(tsModule)\n : undefined;\n const component = loadedModule?.default ?? defaultPageComponent;\n const context = await this.pipeline.buildContext(routeInfo, route, signal, isLeaf, loadedModule);\n const data = await component.getData({ params: routeInfo.params, ...(signal ? { signal } : {}), context });\n const content = this.renderContent(component, { data, params: routeInfo.params, context });\n const title = component.getTitle({ data, params: routeInfo.params, context });\n return { content, ...(title !== undefined ? { title } : {}) };\n }\n renderComponent(component, data, context) {\n return this.renderContent(component, { data, params: {}, context });\n }\n static EMPTY_URL = new URL('http://error');\n async tryRenderErrorModule(modulePath, url, kind) {\n try {\n const module = await this.pipeline.loadModule(modulePath);\n const component = module.default;\n const minCtx = {\n url: SsrRenderer.EMPTY_URL,\n params: {},\n pathname: '',\n searchParams: new URLSearchParams(),\n };\n const data = await component.getData({ params: {}, context: minCtx });\n const content = this.renderComponent(component, data, minCtx);\n return { content, status: 500 };\n }\n catch (e) {\n this.logger.error(`[${this.label}] Error ${kind} failed for ${url.pathname}`, e instanceof Error ? e : undefined);\n return null;\n }\n }\n}\n//# sourceMappingURL=ssr.renderer.js.map",
|
|
19
|
+
"/**\n * SSR HTML Renderer\n *\n * Server-side HTML rendering.\n * Generates complete HTML strings without DOM manipulation.\n * Expands <mark-down> tags server-side when a markdown renderer is provided.\n */\nimport { DEFAULT_ROOT_ROUTE } from \"../pipeline/pipeline.js\";\nimport { escapeHtml, STATUS_MESSAGES, unescapeHtml } from \"../util/html.util.js\";\nimport { resolveWidgetTags } from \"../util/widget-resolve.util.js\";\nimport { SsrRenderer } from \"./ssr.renderer.js\";\nexport class SsrHtmlRenderer extends SsrRenderer {\n label = 'SSR HTML';\n markdownRenderer;\n markdownReady = null;\n constructor(pipeline, options = {}) {\n super(pipeline, options);\n this.markdownRenderer = options.markdownRenderer ?? null;\n if (this.markdownRenderer?.init) {\n this.markdownReady = this.markdownRenderer.init();\n }\n }\n injectSlot(parent, child, parentPattern) {\n const escaped = parentPattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return parent.replace(new RegExp(`<router-slot\\\\b[^>]*\\\\bpattern=\"${escaped}\"[^>]*></router-slot>`), child);\n }\n stripSlots(result) {\n return result.replace(/<router-slot[^>]*><\\/router-slot>/g, '');\n }\n async renderRouteContent(routeInfo, route, isLeaf, signal) {\n if (route.modulePath === DEFAULT_ROOT_ROUTE.modulePath) {\n return { content: `<router-slot pattern=\"${route.pattern}\"></router-slot>` };\n }\n const { content: rawContent, title } = await this.loadRouteContent(routeInfo, route, isLeaf, signal);\n let content = rawContent;\n content = await this.expandMarkdown(content);\n // Attribute bare <router-slot> tags with this route's pattern\n content = this.attributeSlots(content, route.pattern);\n // Resolve <widget-*> tags\n if (this.widgets) {\n content = await resolveWidgetTags(content, (name) => this.resolveWidget(name), routeInfo, async (name) => {\n const modulePath = this.widgets.getModulePath(name);\n if (modulePath) {\n const mod = await this.pipeline.loadModule(modulePath);\n const inlined = this.pipeline.getModuleFiles(mod);\n if (inlined)\n return inlined;\n }\n return {};\n }, this.pipeline.contextProvider, this.logger);\n }\n return { content, ...(title !== undefined ? { title } : {}) };\n }\n renderContent(component, args) {\n return component.renderHTML(args);\n }\n renderRedirect(to) {\n return `<meta http-equiv=\"refresh\" content=\"0;url=${escapeHtml(to)}\">`;\n }\n renderStatusPage(status, url) {\n return `\n <h1>${STATUS_MESSAGES[status] ?? 'Error'}</h1>\n <p>Path: ${escapeHtml(url.pathname)}</p>\n `;\n }\n renderErrorPage(error, url) {\n const message = error instanceof Error ? error.message : String(error);\n return `\n <h1>Error</h1>\n <p>Path: ${escapeHtml(url.pathname)}</p>\n <p>${escapeHtml(message)}</p>\n `;\n }\n attributeSlots(content, routePattern) {\n return content.replace(/<router-slot(?![^>]*\\bpattern=)([^>]*)><\\/router-slot>/g, `<router-slot pattern=\"${routePattern}\"$1></router-slot>`);\n }\n async expandMarkdown(content) {\n if (!this.markdownRenderer)\n return content;\n if (!content.includes('<mark-down>'))\n return content;\n if (this.markdownReady) {\n await this.markdownReady;\n }\n const renderer = this.markdownRenderer;\n const pattern = /<mark-down>([\\s\\S]*?)<\\/mark-down>/g;\n return content.replace(pattern, (_match, escaped) => {\n const markdown = unescapeHtml(escaped);\n return renderer.render(markdown);\n });\n }\n}\n//# sourceMappingURL=html.renderer.js.map",
|
|
20
20
|
"/**\n * Widget Parser\n *\n * Parses fenced widget blocks from markdown content.\n *\n * Syntax:\n * ```widget:widget-name\n * {\"key\": \"value\"}\n * ```\n */\nconst WIDGET_PATTERN = /```widget:(?<name>[a-z][a-z0-9-]*)\\n(?<params>.*?)```/gs;\nexport function parseWidgetBlocks(markdown) {\n const blocks = [];\n for (const match of markdown.matchAll(WIDGET_PATTERN)) {\n const fullMatch = match[0];\n const { name: widgetName, params: paramsRaw } = match.groups;\n const paramsJson = paramsRaw.trim();\n const startIndex = match.index;\n const block = {\n fullMatch,\n widgetName: widgetName,\n params: null,\n startIndex,\n endIndex: startIndex + fullMatch.length,\n };\n if (paramsJson) {\n try {\n const parsed = JSON.parse(paramsJson);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n block.params = parsed;\n }\n else {\n block.parseError = 'Params must be a JSON object';\n }\n }\n catch (e) {\n block.parseError = `Invalid JSON: ${e instanceof Error ? e.message : String(e)}`;\n }\n }\n else {\n block.params = {};\n }\n blocks.push(block);\n }\n return blocks;\n}\nexport function replaceWidgetBlocks(markdown, replacements) {\n const sortedBlocks = [...replacements.entries()].sort(([a], [b]) => b.startIndex - a.startIndex);\n let result = markdown;\n for (const [block, replacement] of sortedBlocks) {\n result = result.slice(0, block.startIndex) + replacement + result.slice(block.endIndex);\n }\n return result;\n}\n//# sourceMappingURL=widget.parser.js.map",
|
|
21
|
-
"/**\n * SSR Markdown Renderer\n *\n * Server-side Markdown rendering.\n * Generates Markdown strings for LLM consumption, text clients, curl.\n */\nimport { DEFAULT_ROOT_ROUTE } from \"../pipeline/pipeline.js\";\nimport { STATUS_MESSAGES } from \"../util/html.util.js\";\nimport { resolveRecursively } from \"../util/widget-resolve.util.js\";\nimport { parseWidgetBlocks, replaceWidgetBlocks } from \"../widget/widget.parser.js\";\nimport { SsrRenderer } from \"./ssr.renderer.js\";\nconst BARE_SLOT_BLOCK = '```router-slot\\n```';\nfunction routerSlotBlock(pattern) {\n return `\\`\\`\\`router-slot\\n{\"pattern\":\"${pattern}\"}\\n\\`\\`\\``;\n}\nexport class SsrMdRenderer extends SsrRenderer {\n label = 'SSR MD';\n constructor(pipeline, options = {}) {\n super(pipeline, options);\n }\n injectSlot(parent, child, parentPattern) {\n return parent.replace(routerSlotBlock(parentPattern), child);\n }\n stripSlots(result) {\n return result\n .replace(/```router-slot\\n(?:\\{[^}]*\\}\\n)?```/g, '')\n .trim();\n }\n async renderRouteContent(routeInfo, route, isLeaf, signal) {\n if (route.modulePath === DEFAULT_ROOT_ROUTE.modulePath) {\n return { content: routerSlotBlock(route.pattern) };\n }\n const { content: rawContent, title } = await this.loadRouteContent(routeInfo, route, isLeaf, signal);\n let content = rawContent;\n // Attribute bare router-slot blocks with this route's pattern\n content = content.replaceAll(BARE_SLOT_BLOCK, routerSlotBlock(route.pattern));\n // Resolve fenced widget blocks\n if (this.widgets) {\n content = await this.resolveWidgets(content, routeInfo);\n }\n return { content, ...(title !== undefined ? { title } : {}) };\n }\n renderContent(component, args) {\n return component.renderMarkdown(args);\n }\n renderRedirect(to) {\n return `Redirect to: ${to}`;\n }\n renderStatusPage(status, url) {\n return `# ${STATUS_MESSAGES[status] ?? 'Error'}\\n\\nPath: \\`${url.pathname}\\``;\n }\n renderErrorPage(_error, url) {\n return `# Internal Server Error\\n\\nPath: \\`${url.pathname}\\``;\n }\n resolveWidgets(content, routeInfo) {\n return resolveRecursively(content, parseWidgetBlocks, async (block) => {\n if (block.parseError || !block.params) {\n return `> **Error** (\\`${block.widgetName}\\`): ${block.parseError}`;\n }\n const widget = this.
|
|
21
|
+
"/**\n * SSR Markdown Renderer\n *\n * Server-side Markdown rendering.\n * Generates Markdown strings for LLM consumption, text clients, curl.\n */\nimport { DEFAULT_ROOT_ROUTE } from \"../pipeline/pipeline.js\";\nimport { STATUS_MESSAGES } from \"../util/html.util.js\";\nimport { resolveRecursively } from \"../util/widget-resolve.util.js\";\nimport { parseWidgetBlocks, replaceWidgetBlocks } from \"../widget/widget.parser.js\";\nimport { SsrRenderer } from \"./ssr.renderer.js\";\nconst BARE_SLOT_BLOCK = '```router-slot\\n```';\nfunction routerSlotBlock(pattern) {\n return `\\`\\`\\`router-slot\\n{\"pattern\":\"${pattern}\"}\\n\\`\\`\\``;\n}\nexport class SsrMdRenderer extends SsrRenderer {\n label = 'SSR MD';\n constructor(pipeline, options = {}) {\n super(pipeline, options);\n }\n injectSlot(parent, child, parentPattern) {\n return parent.replace(routerSlotBlock(parentPattern), child);\n }\n stripSlots(result) {\n return result\n .replace(/```router-slot\\n(?:\\{[^}]*\\}\\n)?```/g, '')\n .trim();\n }\n async renderRouteContent(routeInfo, route, isLeaf, signal) {\n if (route.modulePath === DEFAULT_ROOT_ROUTE.modulePath) {\n return { content: routerSlotBlock(route.pattern) };\n }\n const { content: rawContent, title } = await this.loadRouteContent(routeInfo, route, isLeaf, signal);\n let content = rawContent;\n // Attribute bare router-slot blocks with this route's pattern\n content = content.replaceAll(BARE_SLOT_BLOCK, routerSlotBlock(route.pattern));\n // Resolve fenced widget blocks\n if (this.widgets) {\n content = await this.resolveWidgets(content, routeInfo);\n }\n return { content, ...(title !== undefined ? { title } : {}) };\n }\n renderContent(component, args) {\n return component.renderMarkdown(args);\n }\n renderRedirect(to) {\n return `Redirect to: ${to}`;\n }\n renderStatusPage(status, url) {\n return `# ${STATUS_MESSAGES[status] ?? 'Error'}\\n\\nPath: \\`${url.pathname}\\``;\n }\n renderErrorPage(_error, url) {\n return `# Internal Server Error\\n\\nPath: \\`${url.pathname}\\``;\n }\n resolveWidgets(content, routeInfo) {\n return resolveRecursively(content, parseWidgetBlocks, async (block) => {\n if (block.parseError || !block.params) {\n return `> **Error** (\\`${block.widgetName}\\`): ${block.parseError}`;\n }\n const widget = await this.resolveWidget(block.widgetName);\n if (!widget) {\n return `> **Error**: Unknown widget \\`${block.widgetName}\\``;\n }\n try {\n let files;\n const modulePath = this.widgets.getModulePath(block.widgetName);\n if (modulePath) {\n const mod = await this.pipeline.loadModule(modulePath);\n files = this.pipeline.getModuleFiles(mod);\n }\n const baseContext = {\n ...routeInfo,\n pathname: routeInfo.url.pathname,\n searchParams: routeInfo.url.searchParams,\n ...(files ? { files } : {}),\n };\n const context = this.pipeline.contextProvider\n ? this.pipeline.contextProvider(baseContext)\n : baseContext;\n const data = await widget.getData({ params: block.params, context });\n return widget.renderMarkdown({ data, params: block.params, context });\n }\n catch (e) {\n return widget.renderMarkdownError(e);\n }\n }, replaceWidgetBlocks, 0, this.logger);\n }\n}\n//# sourceMappingURL=md.renderer.js.map",
|
|
22
22
|
"/**\n * Markdown Link Rewriting\n *\n * Rewrites internal absolute links in markdown to include a base path prefix.\n * Skips fenced code blocks and links already under a known base path.\n */\nexport function rewriteMdLinks(markdown, base, skipPrefixes) {\n const prefix = base + '/';\n const skip = skipPrefixes.map((p) => p.slice(1) + '/').join('|');\n const inlineRe = new RegExp(`\\\\]\\\\(\\\\/(?!${skip})`, 'g');\n const refRe = new RegExp(`^(\\\\[[^\\\\]]+\\\\]:\\\\s+)\\\\/(?!${skip})`, 'g');\n const lines = markdown.split('\\n');\n let inCodeBlock = false;\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].startsWith('```')) {\n inCodeBlock = !inCodeBlock;\n continue;\n }\n if (inCodeBlock)\n continue;\n lines[i] = lines[i].replaceAll(inlineRe, `](${prefix}`);\n lines[i] = lines[i].replaceAll(refRe, `$1${prefix}`);\n }\n return lines.join('\\n');\n}\n//# sourceMappingURL=md.util.js.map",
|
|
23
|
-
"/**\n * Emroute\n *\n * Framework entry point. Reads manifests from Runtime,\n * builds Pipeline + Renderers, handles Request → Response.\n */\nimport { Pipeline } from \"../pipeline/pipeline.js\";\nimport { SsrHtmlRenderer } from \"../renderer/html.renderer.js\";\nimport { SsrMdRenderer } from \"../renderer/md.renderer.js\";\nimport { WidgetRegistry } from \"../widget/widget.registry.js\";\nimport { escapeHtml } from \"../util/html.util.js\";\nimport { rewriteMdLinks } from \"../util/md.util.js\";\nimport { ROUTES_MANIFEST_PATH, WIDGETS_MANIFEST_PATH, } from \"../runtime/abstract.runtime.js\";\nexport const DEFAULT_BASE_PATH = { html: '/html', md: '/md', app: '/app' };\nexport class Emroute {\n runtime;\n htmlBase;\n mdBase;\n appBase;\n spa;\n title;\n htmlRenderer;\n mdRenderer;\n shell;\n constructor(htmlRenderer, mdRenderer, shell, runtime, htmlBase, mdBase, appBase, spa, title) {\n this.runtime = runtime;\n this.htmlBase = htmlBase;\n this.mdBase = mdBase;\n this.appBase = appBase;\n this.spa = spa;\n this.title = title;\n this.htmlRenderer = htmlRenderer;\n this.mdRenderer = mdRenderer;\n this.shell = shell;\n }\n static async create(config, runtime) {\n const { spa = 'root' } = config;\n const { html: htmlBase, md: mdBase, app: appBase } = config.basePath ?? DEFAULT_BASE_PATH;\n // ── Verify route manifest exists ──────────────────────────────────\n const manifestResponse = await runtime.query(ROUTES_MANIFEST_PATH);\n if (manifestResponse.status === 404 && !config.routeTree) {\n throw new Error(`[emroute] ${ROUTES_MANIFEST_PATH} not found in runtime. ` +\n 'Provide routeTree in config or ensure the runtime produces it.');\n }\n if (config.routeTree && manifestResponse.status === 404) {\n await runtime.command(ROUTES_MANIFEST_PATH, {\n body: JSON.stringify(config.routeTree),\n });\n }\n // ── Pipeline ──────────────────────────────────────────────────────\n const pipeline = new Pipeline({\n runtime,\n ...(config.extendContext ? { contextProvider: config.extendContext } : {}),\n ...(config.moduleLoaders ? { moduleLoaders: config.moduleLoaders } : {}),\n });\n // ── Widgets ───────────────────────────────────────────────────────\n let widgets = config.widgets;\n const widgetsResponse = await runtime.query(WIDGETS_MANIFEST_PATH);\n if (widgetsResponse.status !== 404) {\n const entries = await widgetsResponse.json();\n if (!config.widgets) {\n widgets = await Emroute.importWidgets(entries, runtime);\n }\n }\n // ── Renderers ─────────────────────────────────────────────────────\n let ssrHtmlRenderer = null;\n let ssrMdRenderer = null;\n if (spa !== 'only') {\n ssrHtmlRenderer = new SsrHtmlRenderer(pipeline, {\n ...(config.markdownRenderer ? { markdownRenderer: config.markdownRenderer } : {}),\n ...(widgets ? { widgets } : {}),\n });\n ssrMdRenderer = new SsrMdRenderer(pipeline, {\n ...(widgets ? { widgets } : {}),\n });\n }\n // ── HTML shell ────────────────────────────────────────────────────\n const title = config.title ?? 'emroute';\n const shellBase = (spa === 'root' || spa === 'only') ? appBase : htmlBase;\n let shell = await Emroute.resolveShell(runtime, title, shellBase);\n if ((await runtime.query('/main.css')).status !== 404) {\n shell = shell.replace('</head>', ' <link rel=\"stylesheet\" href=\"/main.css\">\\n</head>');\n }\n return new Emroute(ssrHtmlRenderer, ssrMdRenderer, shell, runtime, htmlBase, mdBase, appBase, spa, title);\n }\n // ── handleRequest ─────────────────────────────────────────────────\n async handleRequest(req) {\n const url = new URL(req.url);\n const pathname = url.pathname;\n const mdPrefix = this.mdBase + '/';\n const htmlPrefix = this.htmlBase + '/';\n const appPrefix = this.appBase + '/';\n // SSR Markdown: /md/*\n if (this.mdRenderer &&\n (pathname.startsWith(mdPrefix) || pathname === this.mdBase)) {\n const routePath = pathname === this.mdBase ? '/' : pathname.slice(this.mdBase.length);\n if (routePath.length > 1 && routePath.endsWith('/')) {\n const canonical = this.mdBase + routePath.slice(0, -1) + (url.search || '');\n return Response.redirect(new URL(canonical, url.origin), 301);\n }\n try {\n const routeUrl = new URL(routePath + url.search, url.origin);\n const { content, status, redirect } = await this.mdRenderer.render(routeUrl, req.signal);\n if (redirect) {\n const target = redirect.startsWith('/') ? this.mdBase + redirect : redirect;\n return Response.redirect(new URL(target, url.origin), status);\n }\n return new Response(rewriteMdLinks(content, this.mdBase, [this.mdBase, this.htmlBase]), {\n status,\n headers: { 'Content-Type': 'text/markdown; charset=utf-8; variant=CommonMark' },\n });\n }\n catch (e) {\n console.error(`[emroute] Error rendering ${pathname}:`, e);\n return new Response('Internal Server Error', { status: 500 });\n }\n }\n // SSR HTML: /html/*\n if (this.htmlRenderer &&\n (pathname.startsWith(htmlPrefix) || pathname === this.htmlBase)) {\n const routePath = pathname === this.htmlBase ? '/' : pathname.slice(this.htmlBase.length);\n if (routePath.length > 1 && routePath.endsWith('/')) {\n const canonical = this.htmlBase + routePath.slice(0, -1) + (url.search || '');\n return Response.redirect(new URL(canonical, url.origin), 301);\n }\n try {\n const routeUrl = new URL(routePath + url.search, url.origin);\n const result = await this.htmlRenderer.render(routeUrl, req.signal);\n if (result.redirect) {\n const target = result.redirect.startsWith('/') ? this.htmlBase + result.redirect : result.redirect;\n return Response.redirect(new URL(target, url.origin), result.status);\n }\n const ssrTitle = result.title ?? this.title;\n const html = Emroute.injectSsrContent(this.shell, result.content, ssrTitle, pathname);\n return new Response(html, {\n status: result.status,\n headers: { 'Content-Type': 'text/html; charset=utf-8' },\n });\n }\n catch (e) {\n console.error(`[emroute] Error rendering ${pathname}:`, e);\n return new Response('Internal Server Error', { status: 500 });\n }\n }\n // /app/*\n if (pathname.startsWith(appPrefix) || pathname === this.appBase) {\n return new Response(this.shell, {\n status: 200,\n headers: { 'Content-Type': 'text/html; charset=utf-8' },\n });\n }\n // Unhandled SSR paths in 'only' mode — serve shell\n if (pathname.startsWith(htmlPrefix) || pathname === this.htmlBase ||\n pathname.startsWith(mdPrefix) || pathname === this.mdBase) {\n return new Response(this.shell, {\n status: 200,\n headers: { 'Content-Type': 'text/html; charset=utf-8' },\n });\n }\n // Static files\n const lastSegment = pathname.split('/').pop() ?? '';\n if (lastSegment.includes('.')) {\n const fileResponse = await this.runtime.handle(pathname);\n if (fileResponse.status === 200)\n return fileResponse;\n return null;\n }\n // Bare paths → redirect\n const base = (this.spa === 'root' || this.spa === 'only') ? this.appBase : this.htmlBase;\n const bare = pathname === '/' ? '' : pathname.slice(1).replace(/\\/$/, '');\n return Response.redirect(new URL(`${base}/${bare}`, url.origin), 302);\n }\n // ── Private static helpers ────────────────────────────────────────\n static extractWidgetExport(mod) {\n for (const value of Object.values(mod)) {\n if (!value)\n continue;\n if (typeof value === 'object' && 'getData' in value) {\n return value;\n }\n if (typeof value === 'function' && value.prototype?.getData) {\n return new value();\n }\n }\n return null;\n }\n static async importWidgets(entries, runtime) {\n const registry = new WidgetRegistry();\n for (const entry of entries) {\n try {\n const runtimePath = entry.modulePath.startsWith('/')\n ? entry.modulePath\n : `/${entry.modulePath}`;\n const mod = await runtime.loadModule(runtimePath);\n const instance = Emroute.extractWidgetExport(mod);\n if (!instance)\n continue;\n registry.add(instance, runtimePath);\n }\n catch (e) {\n console.error(`[emroute] Failed to load widget ${entry.modulePath}:`, e);\n }\n }\n return registry;\n }\n static buildHtmlShell(title, htmlBase) {\n const baseTag = htmlBase ? `\\n <base href=\"${escapeHtml(htmlBase)}/\">` : '';\n return `<!DOCTYPE html>\n<html>\n<head>${baseTag}\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>${escapeHtml(title)}</title>\n <style>@view-transition { navigation: auto; } router-slot { display: contents; }</style>\n</head>\n<body>\n <router-slot></router-slot>\n</body>\n</html>`;\n }\n static injectSsrContent(html, content, title, ssrRoute) {\n const slotPattern = /<router-slot\\b[^>]*>.*?<\\/router-slot>/s;\n if (!slotPattern.test(html))\n return html;\n const ssrAttr = ssrRoute ? ` data-ssr-route=\"${ssrRoute}\"` : '';\n html = html.replace(slotPattern, `<router-slot${ssrAttr}>${content}</router-slot>`);\n if (title) {\n html = html.replace(/<title>[^<]*<\\/title>/, `<title>${escapeHtml(title)}</title>`);\n }\n return html;\n }\n static async resolveShell(runtime, title, htmlBase) {\n const response = await runtime.query('/index.html');\n if (response.status !== 404)\n return await response.text();\n return Emroute.buildHtmlShell(title, htmlBase);\n }\n}\n//# sourceMappingURL=emroute.server.js.map",
|
|
23
|
+
"/**\n * Emroute\n *\n * Framework entry point. Reads manifests from Runtime,\n * builds Pipeline + Renderers, handles Request → Response.\n */\nimport { Pipeline } from \"../pipeline/pipeline.js\";\nimport { SsrHtmlRenderer } from \"../renderer/html.renderer.js\";\nimport { SsrMdRenderer } from \"../renderer/md.renderer.js\";\nimport { WidgetRegistry } from \"../widget/widget.registry.js\";\nimport { escapeHtml } from \"../util/html.util.js\";\nimport { rewriteMdLinks } from \"../util/md.util.js\";\nimport { ROUTES_MANIFEST_PATH, WIDGETS_MANIFEST_PATH, } from \"../runtime/abstract.runtime.js\";\nexport const DEFAULT_BASE_PATH = { html: '/html', md: '/md', app: '/app' };\nexport class Emroute {\n runtime;\n htmlBase;\n mdBase;\n appBase;\n spa;\n title;\n htmlRenderer;\n mdRenderer;\n shell;\n constructor(htmlRenderer, mdRenderer, shell, runtime, htmlBase, mdBase, appBase, spa, title) {\n this.runtime = runtime;\n this.htmlBase = htmlBase;\n this.mdBase = mdBase;\n this.appBase = appBase;\n this.spa = spa;\n this.title = title;\n this.htmlRenderer = htmlRenderer;\n this.mdRenderer = mdRenderer;\n this.shell = shell;\n }\n static async create(config, runtime) {\n const { spa = 'root' } = config;\n const { html: htmlBase, md: mdBase, app: appBase } = config.basePath ?? DEFAULT_BASE_PATH;\n // ── Verify route manifest exists ──────────────────────────────────\n const manifestResponse = await runtime.query(ROUTES_MANIFEST_PATH);\n if (manifestResponse.status === 404 && !config.routeTree) {\n throw new Error(`[emroute] ${ROUTES_MANIFEST_PATH} not found in runtime. ` +\n 'Provide routeTree in config or ensure the runtime produces it.');\n }\n if (config.routeTree && manifestResponse.status === 404) {\n await runtime.command(ROUTES_MANIFEST_PATH, {\n body: JSON.stringify(config.routeTree),\n });\n }\n // ── Pipeline ──────────────────────────────────────────────────────\n const pipeline = new Pipeline({\n runtime,\n ...(config.extendContext ? { contextProvider: config.extendContext } : {}),\n ...(config.moduleLoaders ? { moduleLoaders: config.moduleLoaders } : {}),\n });\n // ── Widgets ───────────────────────────────────────────────────────\n let widgets;\n const widgetsResponse = await runtime.query(WIDGETS_MANIFEST_PATH);\n if (widgetsResponse.status !== 404) {\n const entries = await widgetsResponse.json();\n widgets = new WidgetRegistry();\n for (const entry of entries) {\n widgets.addLazy(entry.name, entry.modulePath);\n }\n }\n if (config.widgets) {\n if (!widgets)\n widgets = new WidgetRegistry();\n for (const w of config.widgets)\n widgets.add(w);\n }\n // ── Renderers ─────────────────────────────────────────────────────\n let ssrHtmlRenderer = null;\n let ssrMdRenderer = null;\n if (spa !== 'only') {\n ssrHtmlRenderer = new SsrHtmlRenderer(pipeline, {\n ...(config.markdownRenderer ? { markdownRenderer: config.markdownRenderer } : {}),\n ...(widgets ? { widgets } : {}),\n });\n ssrMdRenderer = new SsrMdRenderer(pipeline, {\n ...(widgets ? { widgets } : {}),\n });\n }\n // ── HTML shell ────────────────────────────────────────────────────\n const title = config.title ?? 'emroute';\n const shellBase = (spa === 'root' || spa === 'only') ? appBase : htmlBase;\n const shell = await Emroute.resolveShell(runtime, title, shellBase, spa);\n return new Emroute(ssrHtmlRenderer, ssrMdRenderer, shell, runtime, htmlBase, mdBase, appBase, spa, title);\n }\n // ── handleRequest ─────────────────────────────────────────────────\n async handleRequest(req) {\n const url = new URL(req.url);\n const pathname = url.pathname;\n const mdPrefix = this.mdBase + '/';\n const htmlPrefix = this.htmlBase + '/';\n const appPrefix = this.appBase + '/';\n // SSR Markdown: /md/*\n if (this.mdRenderer &&\n (pathname.startsWith(mdPrefix) || pathname === this.mdBase)) {\n const routePath = pathname === this.mdBase ? '/' : pathname.slice(this.mdBase.length);\n if (routePath.length > 1 && routePath.endsWith('/')) {\n const canonical = this.mdBase + routePath.slice(0, -1) + (url.search || '');\n return Response.redirect(new URL(canonical, url.origin), 301);\n }\n try {\n const routeUrl = new URL(routePath + url.search, url.origin);\n const { content, status, redirect } = await this.mdRenderer.render(routeUrl, req.signal);\n if (redirect) {\n const target = redirect.startsWith('/') ? this.mdBase + redirect : redirect;\n return Response.redirect(new URL(target, url.origin), status);\n }\n return new Response(rewriteMdLinks(content, this.mdBase, [this.mdBase, this.htmlBase]), {\n status,\n headers: { 'Content-Type': 'text/markdown; charset=utf-8; variant=CommonMark' },\n });\n }\n catch (e) {\n console.error(`[emroute] Error rendering ${pathname}:`, e);\n return new Response('Internal Server Error', { status: 500 });\n }\n }\n // SSR HTML: /html/*\n if (this.htmlRenderer &&\n (pathname.startsWith(htmlPrefix) || pathname === this.htmlBase)) {\n const routePath = pathname === this.htmlBase ? '/' : pathname.slice(this.htmlBase.length);\n if (routePath.length > 1 && routePath.endsWith('/')) {\n const canonical = this.htmlBase + routePath.slice(0, -1) + (url.search || '');\n return Response.redirect(new URL(canonical, url.origin), 301);\n }\n try {\n const routeUrl = new URL(routePath + url.search, url.origin);\n const result = await this.htmlRenderer.render(routeUrl, req.signal);\n if (result.redirect) {\n const target = result.redirect.startsWith('/') ? this.htmlBase + result.redirect : result.redirect;\n return Response.redirect(new URL(target, url.origin), result.status);\n }\n const ssrTitle = result.title ?? this.title;\n const html = Emroute.injectSsrContent(this.shell, result.content, ssrTitle, pathname);\n return new Response(html, {\n status: result.status,\n headers: { 'Content-Type': 'text/html; charset=utf-8' },\n });\n }\n catch (e) {\n console.error(`[emroute] Error rendering ${pathname}:`, e);\n return new Response('Internal Server Error', { status: 500 });\n }\n }\n // /app/*\n if (pathname.startsWith(appPrefix) || pathname === this.appBase) {\n return new Response(this.shell, {\n status: 200,\n headers: { 'Content-Type': 'text/html; charset=utf-8' },\n });\n }\n // Unhandled SSR paths in 'only' mode — redirect to /app/\n if (pathname.startsWith(htmlPrefix) || pathname === this.htmlBase ||\n pathname.startsWith(mdPrefix) || pathname === this.mdBase) {\n const routePath = pathname.startsWith(htmlPrefix) ? pathname.slice(this.htmlBase.length)\n : pathname.startsWith(mdPrefix) ? pathname.slice(this.mdBase.length)\n : '/';\n return Response.redirect(new URL(this.appBase + routePath + (url.search || ''), url.origin), 302);\n }\n // Static files\n const lastSegment = pathname.split('/').pop() ?? '';\n if (lastSegment.includes('.')) {\n const fileResponse = await this.runtime.handle(pathname);\n if (fileResponse.status === 200)\n return fileResponse;\n return null;\n }\n // Bare paths → redirect\n const base = (this.spa === 'root' || this.spa === 'only') ? this.appBase : this.htmlBase;\n const bare = pathname === '/' ? '' : pathname.slice(1).replace(/\\/$/, '');\n return Response.redirect(new URL(`${base}/${bare}`, url.origin), 302);\n }\n // ── Private static helpers ────────────────────────────────────────\n static async buildHtmlShell(runtime, title, basePath, spa) {\n const baseTag = basePath ? `\\n <base href=\"${escapeHtml(basePath)}/\">` : '';\n let cssTag = '';\n if ((await runtime.query('/main.css')).status !== 404) {\n cssTag = '\\n <link rel=\"stylesheet\" href=\"/main.css\">';\n }\n const needsJs = spa !== 'none';\n let importMapHtml = '';\n if (needsJs) {\n const mapResponse = await runtime.query('/importmap.json');\n if (mapResponse.status !== 404) {\n const importMap = await mapResponse.text();\n importMapHtml = `\\n <script type=\"importmap\">\\n${importMap}\\n </script>`;\n }\n }\n let scriptHtml = '';\n if (needsJs && (await runtime.query('/app.js')).status !== 404) {\n scriptHtml = '\\n <script type=\"module\" src=\"/app.js\"></script>';\n }\n return `<!DOCTYPE html>\n<html>\n<head>${baseTag}\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>${escapeHtml(title)}</title>\n <style>@view-transition { navigation: auto; } router-slot { display: contents; }</style>${cssTag}\n</head>\n<body>\n <router-slot></router-slot>${importMapHtml}${scriptHtml}\n</body>\n</html>`;\n }\n static injectSsrContent(html, content, title, ssrRoute) {\n const slotPattern = /<router-slot\\b[^>]*>.*?<\\/router-slot>/s;\n if (!slotPattern.test(html))\n return html;\n const ssrAttr = ssrRoute ? ` data-ssr-route=\"${ssrRoute}\"` : '';\n html = html.replace(slotPattern, `<router-slot${ssrAttr}>${content}</router-slot>`);\n if (title) {\n html = html.replace(/<title>[^<]*<\\/title>/, `<title>${escapeHtml(title)}</title>`);\n }\n return html;\n }\n static async resolveShell(runtime, title, basePath, spa) {\n const response = await runtime.query('/index.html');\n if (response.status !== 404)\n return await response.text();\n return Emroute.buildHtmlShell(runtime, title, basePath, spa);\n }\n}\n//# sourceMappingURL=emroute.server.js.map",
|
|
24
24
|
"/**\n * Route Tree Utilities\n *\n * Pure functions for building a RouteNode tree from filesystem paths.\n */\n/**\n * Resolve the target node for a page or redirect file based on its name.\n *\n * - \"index\" at root → the node itself (root route)\n * - \"index\" in a subdirectory → wildcard catch-all on the node\n * - \"[param]\" → dynamic child\n * - anything else → static child\n */\nexport function resolveTargetNode(node, name, isRoot) {\n if (name === 'index') {\n if (isRoot)\n return node;\n node.wildcard ??= { param: 'rest', child: {} };\n return node.wildcard.child;\n }\n if (name.startsWith('[') && name.endsWith(']')) {\n const param = name.slice(1, -1);\n node.dynamic ??= { param, child: {} };\n return node.dynamic.child;\n }\n node.children ??= {};\n node.children[name] ??= {};\n return node.children[name];\n}\n//# sourceMappingURL=route-tree.util.js.map",
|
|
25
|
-
"import { resolveTargetNode } from \"../core/util/route-tree.util.js\";\nexport const CONTENT_TYPES = new Map([\n ['.html', 'text/html; charset=utf-8'],\n ['.css', 'text/css; charset=utf-8'],\n ['.js', 'application/javascript; charset=utf-8'],\n ['.mjs', 'application/javascript; charset=utf-8'],\n ['.ts', 'text/typescript; charset=utf-8'],\n ['.json', 'application/json; charset=utf-8'],\n ['.md', 'text/plain; charset=utf-8'],\n ['.txt', 'text/plain; charset=utf-8'],\n ['.wasm', 'application/wasm'],\n ['.map', 'application/json; charset=utf-8'],\n ['.png', 'image/png'],\n ['.jpg', 'image/jpeg'],\n ['.jpeg', 'image/jpeg'],\n ['.gif', 'image/gif'],\n ['.svg', 'image/svg+xml'],\n ['.ico', 'image/x-icon'],\n ['.webp', 'image/webp'],\n ['.avif', 'image/avif'],\n ['.woff', 'font/woff'],\n ['.woff2', 'font/woff2'],\n ['.ttf', 'font/ttf'],\n]);\nexport const DEFAULT_ROUTES_DIR = '/routes';\nexport const DEFAULT_WIDGETS_DIR = '/widgets';\nexport const DEFAULT_ELEMENTS_DIR = '/elements';\nimport { ROUTES_MANIFEST_PATH, WIDGETS_MANIFEST_PATH, ELEMENTS_MANIFEST_PATH, } from \"../core/runtime/abstract.runtime.js\";\nexport { ROUTES_MANIFEST_PATH, WIDGETS_MANIFEST_PATH, ELEMENTS_MANIFEST_PATH };\n/**\n * Abstract resource provider. Speaks Request/Response (ADR-1).\n *\n * Three access patterns:\n * - `handle()` — raw passthrough, server forwards browser requests as-is.\n * - `query()` — read. Returns Response, or string when `{ as: \"text\" }`.\n * - `command()` — write (PUT by default, override with `{ method }` in options).\n *\n * Includes manifest resolution: when `query(ROUTES_MANIFEST_PATH)` or\n * `query(WIDGETS_MANIFEST_PATH)` returns 404, the runtime scans the\n * configured directories and caches the result.\n */\nexport class Runtime {\n config;\n constructor(config = {}) {\n this.config = config;\n this.config = config;\n }\n /** Write or delete. Defaults to PUT; pass `{ method: \"DELETE\" }` to remove. */\n command(resource, options) {\n const path = typeof resource === 'string'\n ? resource\n : new URL(resource instanceof Request ? resource.url : resource.toString()).pathname;\n const method = options?.method ?? 'PUT';\n const isDelete = method === 'DELETE';\n const result = this.handle(resource, { method, ...options });\n const routesDir = this.config.routesDir ?? DEFAULT_ROUTES_DIR;\n const widgetsDir = this.config.widgetsDir ?? DEFAULT_WIDGETS_DIR;\n const elementsDir = this.config.elementsDir ?? DEFAULT_ELEMENTS_DIR;\n if (path.startsWith(routesDir + '/')) {\n return result.then(async (res) => {\n if (isDelete) {\n await this.pruneRouteFromManifest(path, routesDir);\n }\n else {\n await this.mergeRouteIntoManifest(path, routesDir);\n await this.retranspileIfNeeded(path, routesDir, 'route');\n }\n return res;\n });\n }\n if (path.startsWith(widgetsDir + '/')) {\n return result.then(async (res) => {\n if (isDelete) {\n await this.pruneWidgetFromManifest(path, widgetsDir);\n }\n else {\n await this.mergeWidgetIntoManifest(path, widgetsDir);\n await this.retranspileIfNeeded(path, widgetsDir, 'widget');\n }\n return res;\n });\n }\n if (path.startsWith(elementsDir + '/')) {\n return result.then(async (res) => {\n if (isDelete) {\n await this.pruneElementFromManifest(path, elementsDir);\n }\n else {\n await this.mergeElementIntoManifest(path, elementsDir);\n await this.retranspileIfNeeded(path, elementsDir, 'element');\n }\n return res;\n });\n }\n return result;\n }\n /**\n * Parse a single route file path and merge it into the stored manifest.\n * Avoids a full directory rescan — just reads the current manifest,\n * inserts the new entry, and writes it back.\n */\n async mergeRouteIntoManifest(filePath, routesDir) {\n const relativePath = filePath.slice(routesDir.length + 1);\n const parts = relativePath.split('/');\n const filename = parts[parts.length - 1];\n const dirSegments = parts.slice(0, -1);\n const match = filename.match(/^(.+?)\\.(page|error|redirect)\\.(ts|js|html|md|css)$/);\n if (!match)\n return;\n const name = match[1];\n const kind = match[2];\n const ext = match[3];\n // Read current manifest (or start fresh)\n const response = await this.handle(ROUTES_MANIFEST_PATH);\n const tree = response.status === 404\n ? {}\n : await response.json();\n // Walk to the parent node\n let node = tree;\n for (const dir of dirSegments) {\n if (dir.startsWith('[') && dir.endsWith(']')) {\n const param = dir.slice(1, -1);\n node.dynamic ??= { param, child: {} };\n node = node.dynamic.child;\n }\n else {\n node.children ??= {};\n node.children[dir] ??= {};\n node = node.children[dir];\n }\n }\n // Place the file\n if (kind === 'error') {\n node.errorBoundary = filePath;\n }\n else {\n const target = resolveTargetNode(node, name, dirSegments.length === 0);\n if (kind === 'redirect') {\n target.redirect = filePath;\n }\n else {\n target.files ??= {};\n target.files[ext] = filePath;\n }\n }\n // Write updated manifest back\n this.routesManifestCache = null;\n await this.handle(ROUTES_MANIFEST_PATH, {\n method: 'PUT',\n body: JSON.stringify(tree),\n });\n }\n /**\n * Remove a route entry from the stored manifest when a file is deleted.\n * Walks the tree to find the node, clears the relevant field, then\n * prunes empty ancestor nodes.\n */\n async pruneRouteFromManifest(filePath, routesDir) {\n const relativePath = filePath.slice(routesDir.length + 1);\n const parts = relativePath.split('/');\n const filename = parts[parts.length - 1];\n const dirSegments = parts.slice(0, -1);\n const match = filename.match(/^(.+?)\\.(page|error|redirect)\\.(ts|js|html|md|css)$/);\n if (!match)\n return;\n const name = match[1];\n const kind = match[2];\n const ext = match[3];\n const response = await this.handle(ROUTES_MANIFEST_PATH);\n if (response.status === 404)\n return;\n const tree = await response.json();\n // Walk to the parent node, tracking path for pruning\n const ancestors = [];\n let node = tree;\n for (const dir of dirSegments) {\n if (dir.startsWith('[') && dir.endsWith(']')) {\n if (!node.dynamic)\n return;\n ancestors.push({ node, key: dir, via: 'dynamic' });\n node = node.dynamic.child;\n }\n else {\n if (!node.children?.[dir])\n return;\n ancestors.push({ node, key: dir, via: 'children' });\n node = node.children[dir];\n }\n }\n // Clear the field\n if (kind === 'error') {\n if (node.errorBoundary === filePath)\n delete node.errorBoundary;\n }\n else {\n const isRoot = dirSegments.length === 0;\n const target = this.findTargetNode(node, name, isRoot);\n if (!target)\n return;\n if (kind === 'redirect') {\n if (target.redirect === filePath)\n delete target.redirect;\n }\n else {\n if (target.files?.[ext] === filePath) {\n delete target.files[ext];\n if (Object.keys(target.files).length === 0)\n delete target.files;\n }\n }\n // If target is a child node and now empty, remove it\n if (target !== node && this.isEmptyNode(target)) {\n if (name === 'index' && !isRoot) {\n delete node.wildcard;\n }\n else if (name.startsWith('[') && name.endsWith(']')) {\n delete node.dynamic;\n }\n else if (node.children) {\n delete node.children[name];\n if (Object.keys(node.children).length === 0)\n delete node.children;\n }\n }\n }\n // Prune empty ancestors bottom-up\n for (let i = ancestors.length - 1; i >= 0; i--) {\n const { node: parent, key, via } = ancestors[i];\n const child = via === 'dynamic' ? parent.dynamic?.child : parent.children?.[key];\n if (child && this.isEmptyNode(child)) {\n if (via === 'dynamic') {\n delete parent.dynamic;\n }\n else if (parent.children) {\n delete parent.children[key];\n if (Object.keys(parent.children).length === 0)\n delete parent.children;\n }\n }\n }\n this.routesManifestCache = null;\n await this.handle(ROUTES_MANIFEST_PATH, {\n method: 'PUT',\n body: JSON.stringify(tree),\n });\n }\n /** Find a target node without creating it (read-only counterpart to resolveTargetNode). */\n findTargetNode(node, name, isRoot) {\n if (name === 'index') {\n return isRoot ? node : (node.wildcard?.child ?? null);\n }\n if (name.startsWith('[') && name.endsWith(']')) {\n return node.dynamic?.child ?? null;\n }\n return node.children?.[name] ?? null;\n }\n isEmptyNode(node) {\n return (!node.files &&\n !node.errorBoundary &&\n !node.redirect &&\n !node.children &&\n !node.dynamic &&\n !node.wildcard);\n }\n /**\n * Remove a widget entry from the stored manifest when a file is deleted.\n */\n async pruneWidgetFromManifest(filePath, widgetsDir) {\n const relativePath = filePath.slice(widgetsDir.length + 1);\n const parts = relativePath.split('/');\n if (parts.length !== 2)\n return;\n const [dirName, filename] = parts;\n const match = filename.match(/^(.+?)\\.widget\\.(ts|js|html|md|css)$/);\n if (!match)\n return;\n const name = match[1];\n const ext = match[2];\n if (name !== dirName)\n return;\n const response = await this.handle(WIDGETS_MANIFEST_PATH);\n if (response.status === 404)\n return;\n const entries = await response.json();\n if (ext === 'ts' || ext === 'js') {\n // Module deleted → remove entire entry\n const idx = entries.findIndex((e) => e.name === name);\n if (idx === -1)\n return;\n entries.splice(idx, 1);\n }\n else {\n // Companion deleted → remove from files\n const entry = entries.find((e) => e.name === name);\n if (!entry?.files)\n return;\n delete entry.files[ext];\n if (Object.keys(entry.files).length === 0)\n delete entry.files;\n }\n this.widgetsManifestCache = null;\n await this.handle(WIDGETS_MANIFEST_PATH, {\n method: 'PUT',\n body: JSON.stringify(entries),\n });\n }\n /**\n * Remove an element entry from the stored manifest when a file is deleted.\n */\n async pruneElementFromManifest(filePath, elementsDir) {\n const relativePath = filePath.slice(elementsDir.length + 1);\n const parts = relativePath.split('/');\n if (parts.length !== 2)\n return;\n const [dirName, filename] = parts;\n const match = filename.match(/^(.+?)\\.element\\.(ts|js)$/);\n if (!match)\n return;\n const name = match[1];\n if (name !== dirName)\n return;\n const response = await this.handle(ELEMENTS_MANIFEST_PATH);\n if (response.status === 404)\n return;\n const entries = await response.json();\n const idx = entries.findIndex((e) => e.name === name);\n if (idx === -1)\n return;\n entries.splice(idx, 1);\n this.elementsManifestCache = null;\n await this.handle(ELEMENTS_MANIFEST_PATH, {\n method: 'PUT',\n body: JSON.stringify(entries),\n });\n }\n /**\n * After a source or companion file is written, check if a built `.js`\n * artifact exists for that module. If so, re-transpile the `.ts` source\n * with companions inlined and write the `.js` back.\n *\n * Best-effort: silently skips if `transpile()` is not implemented.\n */\n async retranspileIfNeeded(filePath, dir, kind) {\n // Only act on source/companion files, not the .js output itself\n if (filePath.endsWith('.js'))\n return;\n const relativePath = filePath.slice(dir.length + 1);\n const parts = relativePath.split('/');\n const filename = parts[parts.length - 1];\n // Determine the module base name and the .js output path\n let jsPath;\n if (kind === 'route') {\n const match = filename.match(/^(.+?)\\.(page)\\.(ts|html|md|css)$/);\n if (!match)\n return;\n const name = match[1];\n jsPath = `${dir}/${parts.slice(0, -1).join('/')}${parts.length > 1 ? '/' : ''}${name}.page.js`;\n }\n else if (kind === 'widget') {\n const match = filename.match(/^(.+?)\\.(widget)\\.(ts|html|md|css)$/);\n if (!match)\n return;\n const name = match[1];\n jsPath = `${dir}/${name}/${name}.widget.js`;\n }\n else {\n const match = filename.match(/^(.+?)\\.(element)\\.ts$/);\n if (!match)\n return;\n const name = match[1];\n jsPath = `${dir}/${name}/${name}.element.js`;\n }\n // Check if the .js artifact exists\n const jsResponse = await this.handle(jsPath);\n if (jsResponse.status === 404)\n return;\n // Read the .ts source\n const tsPath = jsPath.replace(/\\.js$/, '.ts');\n let tsSource;\n try {\n tsSource = await this.query(tsPath, { as: 'text' });\n }\n catch {\n return; // .ts doesn't exist (maybe .js was hand-written)\n }\n // Collect companion files and inline them\n const companionExts = kind === 'element' ? [] : ['html', 'md', 'css'];\n const files = {};\n for (const ext of companionExts) {\n const companionPath = tsPath.replace(/\\.ts$/, `.${ext}`);\n try {\n files[ext] = await this.query(companionPath, { as: 'text' });\n }\n catch {\n // companion doesn't exist — skip\n }\n }\n // Transpile\n let jsCode;\n try {\n jsCode = await this.transpile(tsSource);\n }\n catch {\n return; // transpile not implemented — skip silently\n }\n // Append __files export if there are companions\n if (Object.keys(files).length > 0) {\n const entries = Object.entries(files)\n .map(([k, v]) => `${k}: \\`${v.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`').replace(/\\$/g, '\\\\$')}\\``)\n .join(', ');\n jsCode += `\\nexport const __files = { ${entries} };\\n`;\n }\n await this.handle(jsPath, { method: 'PUT', body: jsCode });\n }\n /**\n * Dynamically import a module from this runtime's storage.\n * Used by the server for SSR imports of `.page.ts` and `.widget.ts` files.\n */\n loadModule(_path) {\n throw new Error(`loadModule not implemented for ${this.constructor.name}`);\n }\n /**\n * Transpile TypeScript source to JavaScript.\n * Used by the build step to produce browser-loadable .js modules.\n */\n transpile(_source) {\n throw new Error(`transpile not implemented for ${this.constructor.name}`);\n }\n /**\n * Parse a widget file path and merge it into the stored manifest.\n * Reads the current manifest, upserts the entry, writes it back.\n */\n async mergeWidgetIntoManifest(filePath, widgetsDir) {\n const relativePath = filePath.slice(widgetsDir.length + 1);\n const parts = relativePath.split('/');\n if (parts.length !== 2)\n return; // must be widgets/{name}/{file}\n const [dirName, filename] = parts;\n // Only act on .widget.{ts,js,html,md,css} files\n const match = filename.match(/^(.+?)\\.widget\\.(ts|js|html|md|css)$/);\n if (!match)\n return;\n const name = match[1];\n const ext = match[2];\n if (name !== dirName)\n return; // filename must match directory\n const response = await this.handle(WIDGETS_MANIFEST_PATH);\n const entries = response.status === 404\n ? []\n : await response.json();\n const prefix = widgetsDir.replace(/^\\//, '');\n if (ext === 'ts' || ext === 'js') {\n // Module file — upsert the entry\n let entry = entries.find((e) => e.name === name);\n if (!entry) {\n entry = {\n name,\n modulePath: `${prefix}/${name}/${filename}`,\n tagName: `widget-${name}`,\n };\n entries.push(entry);\n entries.sort((a, b) => a.name.localeCompare(b.name));\n }\n else {\n entry.modulePath = `${prefix}/${name}/${filename}`;\n }\n }\n else {\n // Companion file — update files on existing entry\n const entry = entries.find((e) => e.name === name);\n if (!entry)\n return; // no module yet, companion alone is not enough\n entry.files ??= {};\n entry.files[ext] = `${prefix}/${name}/${filename}`;\n }\n this.widgetsManifestCache = null;\n await this.handle(WIDGETS_MANIFEST_PATH, {\n method: 'PUT',\n body: JSON.stringify(entries),\n });\n }\n /**\n * Parse an element file path and merge it into the stored manifest.\n * Reads the current manifest, upserts the entry, writes it back.\n */\n async mergeElementIntoManifest(filePath, elementsDir) {\n const relativePath = filePath.slice(elementsDir.length + 1);\n const parts = relativePath.split('/');\n if (parts.length !== 2)\n return;\n const [dirName, filename] = parts;\n const match = filename.match(/^(.+?)\\.element\\.(ts|js)$/);\n if (!match)\n return;\n const name = match[1];\n if (name !== dirName)\n return;\n // Custom element names must contain a hyphen\n if (!name.includes('-'))\n return;\n const response = await this.handle(ELEMENTS_MANIFEST_PATH);\n const entries = response.status === 404\n ? []\n : await response.json();\n const prefix = elementsDir.replace(/^\\//, '');\n let entry = entries.find((e) => e.name === name);\n if (!entry) {\n entry = {\n name,\n modulePath: `${prefix}/${name}/${filename}`,\n tagName: name,\n };\n entries.push(entry);\n entries.sort((a, b) => a.name.localeCompare(b.name));\n }\n else {\n entry.modulePath = `${prefix}/${name}/${filename}`;\n }\n this.elementsManifestCache = null;\n await this.handle(ELEMENTS_MANIFEST_PATH, {\n method: 'PUT',\n body: JSON.stringify(entries),\n });\n }\n // ── Manifest resolution ─────────────────────────────────────────────\n routesManifestCache = null;\n widgetsManifestCache = null;\n elementsManifestCache = null;\n /** Clear cached manifests so the next query triggers a fresh scan. */\n invalidateManifests() {\n this.routesManifestCache = null;\n this.widgetsManifestCache = null;\n this.elementsManifestCache = null;\n }\n /**\n * Resolve the routes manifest. Called when the concrete runtime returns\n * 404 for ROUTES_MANIFEST_PATH. Scans `config.routesDir` (or default).\n */\n async resolveRoutesManifest() {\n if (this.routesManifestCache)\n return this.routesManifestCache.clone();\n const routesDir = this.config.routesDir ?? DEFAULT_ROUTES_DIR;\n // Check if directory exists by querying it\n const dirResponse = await this.query(routesDir + '/');\n if (dirResponse.status === 404) {\n return new Response('Not Found', { status: 404 });\n }\n const tree = await this.scanRoutes(routesDir);\n this.routesManifestCache = Response.json(tree);\n return this.routesManifestCache.clone();\n }\n /**\n * Resolve the widgets manifest. Called when the concrete runtime returns\n * 404 for WIDGETS_MANIFEST_PATH. Scans `config.widgetsDir` (or default).\n */\n async resolveWidgetsManifest() {\n if (this.widgetsManifestCache)\n return this.widgetsManifestCache.clone();\n const widgetsDir = this.config.widgetsDir ?? DEFAULT_WIDGETS_DIR;\n const dirResponse = await this.query(widgetsDir + '/');\n if (dirResponse.status === 404) {\n return new Response('Not Found', { status: 404 });\n }\n const entries = await this.scanWidgets(widgetsDir, widgetsDir.replace(/^\\//, ''));\n this.widgetsManifestCache = Response.json(entries);\n return this.widgetsManifestCache.clone();\n }\n /**\n * Resolve the elements manifest. Called when the concrete runtime returns\n * 404 for ELEMENTS_MANIFEST_PATH. Scans `config.elementsDir` (or default).\n */\n async resolveElementsManifest() {\n if (this.elementsManifestCache)\n return this.elementsManifestCache.clone();\n const elementsDir = this.config.elementsDir ?? DEFAULT_ELEMENTS_DIR;\n const dirResponse = await this.query(elementsDir + '/');\n if (dirResponse.status === 404) {\n return new Response('Not Found', { status: 404 });\n }\n const entries = await this.scanElements(elementsDir, elementsDir.replace(/^\\//, ''));\n this.elementsManifestCache = Response.json(entries);\n return this.elementsManifestCache.clone();\n }\n // ── Scanning ──────────────────────────────────────────────────────────\n async *walkDirectory(dir) {\n const trailingDir = dir.endsWith('/') ? dir : dir + '/';\n const response = await this.query(trailingDir);\n const entries = await response.json();\n for (const entry of entries) {\n const path = `${trailingDir}${entry}`;\n if (entry.endsWith('/')) {\n yield* this.walkDirectory(path);\n }\n else {\n yield path;\n }\n }\n }\n /**\n * Scan a routes directory and build a RouteNode tree.\n * The filesystem structure maps directly to the tree — no intermediate array.\n */\n async scanRoutes(routesDir) {\n const root = {};\n const allFiles = [];\n for await (const file of this.walkDirectory(routesDir)) {\n allFiles.push(file);\n }\n for (const filePath of allFiles) {\n const relativePath = filePath.replace(`${routesDir}/`, '');\n const parts = relativePath.split('/');\n const filename = parts[parts.length - 1];\n const dirSegments = parts.slice(0, -1);\n // Parse filename: name.kind.ext (e.g. \"about.page.ts\", \"[id].page.html\", \"index.error.ts\")\n const match = filename.match(/^(.+?)\\.(page|error|redirect)\\.(ts|js|html|md|css)$/);\n if (!match)\n continue;\n const name = match[1];\n const kind = match[2];\n const ext = match[3];\n // Walk directory segments to reach the parent node\n let node = root;\n for (const dir of dirSegments) {\n if (dir.startsWith('[') && dir.endsWith(']')) {\n const param = dir.slice(1, -1);\n node.dynamic ??= { param, child: {} };\n node = node.dynamic.child;\n }\n else {\n node.children ??= {};\n node.children[dir] ??= {};\n node = node.children[dir];\n }\n }\n // Place the file on the correct node\n if (kind === 'error') {\n // Error boundary scopes to the directory it's in.\n // Root index.error.ts → root.errorBoundary (global handler).\n // projects/projects.error.ts → projects node errorBoundary.\n node.errorBoundary = filePath;\n continue;\n }\n // For page and redirect files, the name determines the final node\n const target = resolveTargetNode(node, name, dirSegments.length === 0);\n if (kind === 'redirect') {\n target.redirect = filePath;\n }\n else {\n // kind === 'page'\n target.files ??= {};\n target.files[ext] = filePath;\n }\n }\n return root;\n }\n async scanWidgets(widgetsDir, pathPrefix) {\n const COMPANION_EXTENSIONS = ['html', 'md', 'css'];\n const entries = [];\n const trailingDir = widgetsDir.endsWith('/') ? widgetsDir : widgetsDir + '/';\n const response = await this.query(trailingDir);\n const listing = await response.json();\n for (const item of listing) {\n if (!item.endsWith('/'))\n continue;\n const name = item.slice(0, -1);\n // Try .widget.ts first, then .widget.js\n let moduleFile = `${name}.widget.ts`;\n let modulePath = `${trailingDir}${name}/${moduleFile}`;\n if ((await this.query(modulePath)).status === 404) {\n moduleFile = `${name}.widget.js`;\n modulePath = `${trailingDir}${name}/${moduleFile}`;\n if ((await this.query(modulePath)).status === 404)\n continue;\n }\n const prefix = pathPrefix ? `${pathPrefix}/` : '';\n const entry = {\n name,\n modulePath: `${prefix}${name}/${moduleFile}`,\n tagName: `widget-${name}`,\n };\n const files = {};\n let hasFiles = false;\n for (const ext of COMPANION_EXTENSIONS) {\n const companionFile = `${name}.widget.${ext}`;\n const companionPath = `${trailingDir}${name}/${companionFile}`;\n if ((await this.query(companionPath)).status !== 404) {\n files[ext] = `${prefix}${name}/${companionFile}`;\n hasFiles = true;\n }\n }\n if (hasFiles)\n entry.files = files;\n entries.push(entry);\n }\n entries.sort((a, b) => a.name.localeCompare(b.name));\n return entries;\n }\n async scanElements(elementsDir, pathPrefix) {\n const entries = [];\n const trailingDir = elementsDir.endsWith('/') ? elementsDir : elementsDir + '/';\n const response = await this.query(trailingDir);\n const listing = await response.json();\n for (const item of listing) {\n if (!item.endsWith('/'))\n continue;\n const name = item.slice(0, -1);\n // Custom element names must contain a hyphen (web spec requirement)\n if (!name.includes('-')) {\n console.warn(`[emroute] Skipping element \"${name}\": custom element names must contain a hyphen (e.g. \"my-element\")`);\n continue;\n }\n // Try .element.ts first, then .element.js\n let moduleFile = `${name}.element.ts`;\n let modulePath = `${trailingDir}${name}/${moduleFile}`;\n if ((await this.query(modulePath)).status === 404) {\n moduleFile = `${name}.element.js`;\n modulePath = `${trailingDir}${name}/${moduleFile}`;\n if ((await this.query(modulePath)).status === 404)\n continue;\n }\n const prefix = pathPrefix ? `${pathPrefix}/` : '';\n entries.push({\n name,\n modulePath: `${prefix}${name}/${moduleFile}`,\n tagName: name,\n });\n }\n entries.sort((a, b) => a.name.localeCompare(b.name));\n return entries;\n }\n}\n//# sourceMappingURL=abstract.runtime.js.map",
|
|
26
|
-
"/**\n * Fetch Runtime\n *\n * Browser-compatible Runtime that delegates all reads to a remote server\n * via `fetch()`. Used by EmrouteApp in `root` mode — same Emroute\n * instance runs in the browser, but the Runtime fetches files from the\n * real server instead of reading from disk.\n *\n * No bundling, no transpiling, no filesystem access.\n * No directory scanning — the remote server already has manifests.\n */\nvar __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n};\nimport { Runtime, } from \"./abstract.runtime.js\";\nexport class FetchRuntime extends Runtime {\n origin;\n /**\n * @param origin — Server origin, e.g. `'http://localhost:4100'` or `location.origin`.\n */\n constructor(origin, config = {}) {\n super(config);\n this.origin = origin.endsWith('/') ? origin.slice(0, -1) : origin;\n }\n handle(resource, init) {\n const url = this.toUrl(resource);\n return fetch(url, init);\n }\n query(resource, options) {\n if (options?.as === 'text') {\n return fetch(this.toUrl(resource)).then((r) => r.text());\n }\n return this.handle(resource, options);\n }\n async loadModule(path) {\n const url = `${this.origin}${path}`;\n const response = await fetch(url);\n const js = await response.text();\n const blob = new Blob([js], { type: 'application/javascript' });\n return import(__rewriteRelativeImportExtension(URL.
|
|
27
|
-
"/// <reference path=\"../../type/navigation-api.d.ts\" />\n/**\n * Emroute App\n *\n * Browser entry point for `/app/` routes. Wraps an Emroute instance\n * (same server, same pipeline) with Navigation API glue that intercepts\n * link clicks, calls `htmlRouter.render()`, and injects the result.\n */\nimport { Emroute } from \"../../../core/server/emroute.server.js\";\nimport { FetchRuntime } from \"../../../runtime/fetch.runtime.js\";\nimport { ROUTES_MANIFEST_PATH, WIDGETS_MANIFEST_PATH, ELEMENTS_MANIFEST_PATH } from \"../../../core/runtime/abstract.runtime.js\";\nimport { DEFAULT_BASE_PATH } from \"../../../core/server/emroute.server.js\";\nimport { assertSafeRedirect, escapeHtml } from \"../../../core/util/html.util.js\";\nimport { ComponentElement } from \"../../element/component.element.js\";\nimport { MarkdownElement } from \"../../element/markdown.element.js\";\nimport { WidgetRegistry } from \"../../../core/widget/widget.registry.js\";\n/** Browser app — Navigation API wired to an Emroute. */\nexport class EmrouteApp {\n server;\n appBase;\n slot = null;\n abortController = null;\n constructor(server, options) {\n const bp = options?.basePath ?? DEFAULT_BASE_PATH;\n this.server = server;\n this.appBase = bp.app;\n }\n async initialize(slotSelector = 'router-slot') {\n this.slot = document.querySelector(slotSelector);\n if (!this.slot) {\n console.error('[EmrouteApp] Slot not found:', slotSelector);\n return;\n }\n if (!('navigation' in globalThis)) {\n console.warn('[EmrouteApp] Navigation API not available');\n return;\n }\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n navigation.addEventListener('navigate', (event) => {\n if (!event.canIntercept)\n return;\n if (event.hashChange)\n return;\n if (event.downloadRequest !== null)\n return;\n const url = new URL(event.destination.url);\n if (!this.isAppPath(url.pathname))\n return;\n event.intercept({\n scroll: 'manual',\n handler: async () => {\n await this.handleNavigation(url, event.signal);\n event.scroll();\n },\n });\n }, { signal });\n // SSR adoption — server already rendered this page, skip re-render\n const ssrRoute = this.slot.getAttribute('data-ssr-route');\n if (ssrRoute && (location.pathname === ssrRoute || location.pathname === ssrRoute + '/')) {\n this.slot.removeAttribute('data-ssr-route');\n return;\n }\n // Initial render\n await this.handleNavigation(new URL(location.href), this.abortController.signal);\n }\n dispose() {\n this.abortController?.abort();\n this.abortController = null;\n this.slot = null;\n }\n async navigate(url, options = {}) {\n try {\n const { finished } = navigation.navigate(url, {\n state: options.state,\n history: options.replace ? 'replace' : 'auto',\n });\n await finished;\n }\n catch (e) {\n if (e instanceof DOMException && e.name === 'AbortError')\n return;\n throw e;\n }\n }\n isAppPath(pathname) {\n return pathname === this.appBase || pathname.startsWith(this.appBase + '/');\n }\n stripAppBase(pathname) {\n if (pathname === this.appBase)\n return '/';\n if (pathname.startsWith(this.appBase + '/'))\n return pathname.slice(this.appBase.length);\n return pathname;\n }\n async handleNavigation(url, signal) {\n if (!this.slot || !this.server.htmlRenderer)\n return;\n const routePath = this.stripAppBase(url.pathname);\n const routeUrl = new URL(routePath + url.search, url.origin);\n try {\n const { content, title, redirect } = await this.server.htmlRenderer.render(routeUrl, signal);\n if (signal.aborted)\n return;\n if (redirect) {\n assertSafeRedirect(redirect);\n const target = redirect.startsWith('/') ? this.appBase + redirect : redirect;\n navigation.navigate(target, { history: 'replace' });\n return;\n }\n if (document.startViewTransition) {\n const transition = document.startViewTransition(() => {\n this.slot.setHTMLUnsafe(content);\n });\n signal.addEventListener('abort', () => transition.skipTransition(), { once: true });\n await transition.updateCallbackDone;\n }\n else {\n this.slot.setHTMLUnsafe(content);\n }\n if (title)\n document.title = title;\n }\n catch (error) {\n if (signal.aborted)\n return;\n console.error('[EmrouteApp] Navigation error:', error);\n if (this.slot) {\n const message = error instanceof Error ? error.message : String(error);\n this.slot.setHTMLUnsafe(`<h1>Error</h1><p>${escapeHtml(message)}</p>`);\n }\n }\n }\n}\n/**\n * Create and initialize the browser app.\n *\n * Stored on `globalThis.__emroute_app` for programmatic access.\n */\nexport async function createEmrouteApp(server, options) {\n const g = globalThis;\n if (g.__emroute_app) {\n console.warn('eMroute: App already initialized.');\n return g.__emroute_app;\n }\n const app = new EmrouteApp(server, options);\n await app.initialize();\n g.__emroute_app = app;\n return app;\n}\n/**\n * Boot the browser app from runtime manifests.\n *\n * Fetches route tree and widget manifest as JSON, creates lazy module\n * loaders via FetchRuntime, registers widgets for deferred hydration,\n * and wires the Navigation API.\n *\n * Consumer `main.ts` calls this after setting up MarkdownElement renderer,\n * custom elements, etc.\n */\nexport async function bootEmrouteApp(options) {\n const origin = options?.origin ?? location.origin;\n const runtime = new FetchRuntime(origin);\n // Fetch route tree\n const routesResponse = await runtime.handle(ROUTES_MANIFEST_PATH);\n if (!routesResponse.ok) {\n throw new Error(`[emroute] Failed to fetch ${ROUTES_MANIFEST_PATH}: ${routesResponse.status}`);\n }\n const routeTree = await routesResponse.json();\n // Fetch widget manifest (optional — app may have no widgets)\n const widgetsResponse = await runtime.handle(WIDGETS_MANIFEST_PATH);\n const widgetEntries = widgetsResponse.ok\n ? await widgetsResponse.json()\n : [];\n // Fetch element manifest (optional — app may have no custom elements)\n const elementsResponse = await runtime.handle(ELEMENTS_MANIFEST_PATH);\n const elementEntries = elementsResponse.ok\n ? await elementsResponse.json()\n : [];\n // Build lazy module loaders for all route + widget + element modules\n const moduleLoaders = buildLazyLoaders(routeTree, widgetEntries, elementEntries, runtime);\n // Register widgets eagerly (tag defined immediately, module loads on connectedCallback)\n const widgets = new WidgetRegistry();\n for (const entry of widgetEntries) {\n ComponentElement.registerLazy(entry.name, moduleLoaders[entry.modulePath]);\n }\n // Register custom elements — import all modules, define when loaded\n for (const entry of elementEntries) {\n const loader = moduleLoaders[entry.modulePath];\n if (loader) {\n loader().then((mod) => {\n const cls = mod.default;\n if (typeof cls === 'function' && !customElements.get(entry.tagName)) {\n customElements.define(entry.tagName, cls);\n }\n }).catch((e) => {\n console.error(`[emroute] Failed to load element ${entry.tagName}:`, e);\n });\n }\n }\n // Create Emroute instance (same class as SSR)\n const mdRenderer = MarkdownElement.getConfiguredRenderer();\n const server = await Emroute.create({\n routeTree,\n widgets,\n moduleLoaders,\n ...(mdRenderer ? { markdownRenderer: mdRenderer } : {}),\n }, runtime);\n return createEmrouteApp(server, options);\n}\n/**\n * Walk the route tree, widget entries, and element entries to build a map of\n * `path → () => runtime.loadModule(path)` lazy loaders.\n */\nfunction buildLazyLoaders(tree, widgetEntries, elementEntries, runtime) {\n const paths = new Set();\n function walk(node) {\n const modulePath = node.files?.ts ?? node.files?.js;\n if (modulePath)\n paths.add(modulePath);\n if (node.redirect)\n paths.add(node.redirect);\n if (node.errorBoundary)\n paths.add(node.errorBoundary);\n if (node.children) {\n for (const child of Object.values(node.children))\n walk(child);\n }\n if (node.dynamic)\n walk(node.dynamic.child);\n if (node.wildcard)\n walk(node.wildcard.child);\n }\n walk(tree);\n for (const entry of widgetEntries)\n paths.add(entry.modulePath);\n for (const entry of elementEntries)\n paths.add(entry.modulePath);\n const loaders = {};\n for (const path of paths) {\n const absolute = path.startsWith('/') ? path : '/' + path;\n loaders[path] = () => runtime.loadModule(absolute);\n }\n return loaders;\n}\n//# sourceMappingURL=emroute.app.js.map",
|
|
25
|
+
"import { resolveTargetNode } from \"../core/util/route-tree.util.js\";\nexport const CONTENT_TYPES = new Map([\n ['.html', 'text/html; charset=utf-8'],\n ['.css', 'text/css; charset=utf-8'],\n ['.js', 'application/javascript; charset=utf-8'],\n ['.mjs', 'application/javascript; charset=utf-8'],\n ['.ts', 'text/typescript; charset=utf-8'],\n ['.json', 'application/json; charset=utf-8'],\n ['.md', 'text/plain; charset=utf-8'],\n ['.txt', 'text/plain; charset=utf-8'],\n ['.wasm', 'application/wasm'],\n ['.map', 'application/json; charset=utf-8'],\n ['.png', 'image/png'],\n ['.jpg', 'image/jpeg'],\n ['.jpeg', 'image/jpeg'],\n ['.gif', 'image/gif'],\n ['.svg', 'image/svg+xml'],\n ['.ico', 'image/x-icon'],\n ['.webp', 'image/webp'],\n ['.avif', 'image/avif'],\n ['.woff', 'font/woff'],\n ['.woff2', 'font/woff2'],\n ['.ttf', 'font/ttf'],\n]);\nexport const DEFAULT_ROUTES_DIR = '/routes';\nexport const DEFAULT_WIDGETS_DIR = '/widgets';\nexport const DEFAULT_ELEMENTS_DIR = '/elements';\nimport { ROUTES_MANIFEST_PATH, WIDGETS_MANIFEST_PATH, ELEMENTS_MANIFEST_PATH, } from \"../core/runtime/abstract.runtime.js\";\nexport { ROUTES_MANIFEST_PATH, WIDGETS_MANIFEST_PATH, ELEMENTS_MANIFEST_PATH };\n/**\n * Abstract resource provider. Speaks Request/Response (ADR-1).\n *\n * Three access patterns:\n * - `handle()` — raw passthrough, server forwards browser requests as-is.\n * - `query()` — read. Returns Response, or string when `{ as: \"text\" }`.\n * - `command()` — write (PUT by default, override with `{ method }` in options).\n *\n * Includes manifest resolution: when `query(ROUTES_MANIFEST_PATH)` or\n * `query(WIDGETS_MANIFEST_PATH)` returns 404, the runtime scans the\n * configured directories and caches the result.\n */\nexport class Runtime {\n config;\n constructor(config = {}) {\n this.config = config;\n this.config = config;\n }\n /** Write or delete. Defaults to PUT; pass `{ method: \"DELETE\" }` to remove. */\n command(resource, options) {\n const path = typeof resource === 'string'\n ? resource\n : new URL(resource instanceof Request ? resource.url : resource.toString()).pathname;\n const method = options?.method ?? 'PUT';\n const isDelete = method === 'DELETE';\n const result = this.handle(resource, { method, ...options });\n const routesDir = this.config.routesDir ?? DEFAULT_ROUTES_DIR;\n const widgetsDir = this.config.widgetsDir ?? DEFAULT_WIDGETS_DIR;\n const elementsDir = this.config.elementsDir ?? DEFAULT_ELEMENTS_DIR;\n if (path.startsWith(routesDir + '/')) {\n return result.then(async (res) => {\n if (isDelete) {\n await this.pruneRouteFromManifest(path, routesDir);\n }\n else {\n await this.mergeRouteIntoManifest(path, routesDir);\n await this.retranspileIfNeeded(path, routesDir, 'route');\n }\n return res;\n });\n }\n if (path.startsWith(widgetsDir + '/')) {\n return result.then(async (res) => {\n if (isDelete) {\n await this.pruneWidgetFromManifest(path, widgetsDir);\n }\n else {\n await this.mergeWidgetIntoManifest(path, widgetsDir);\n await this.retranspileIfNeeded(path, widgetsDir, 'widget');\n }\n return res;\n });\n }\n if (path.startsWith(elementsDir + '/')) {\n return result.then(async (res) => {\n if (isDelete) {\n await this.pruneElementFromManifest(path, elementsDir);\n }\n else {\n await this.mergeElementIntoManifest(path, elementsDir);\n await this.retranspileIfNeeded(path, elementsDir, 'element');\n }\n return res;\n });\n }\n return result;\n }\n /**\n * Parse a single route file path and merge it into the stored manifest.\n * Avoids a full directory rescan — just reads the current manifest,\n * inserts the new entry, and writes it back.\n */\n async mergeRouteIntoManifest(filePath, routesDir) {\n const relativePath = filePath.slice(routesDir.length + 1);\n const parts = relativePath.split('/');\n const filename = parts[parts.length - 1];\n const dirSegments = parts.slice(0, -1);\n const match = filename.match(/^(.+?)\\.(page|error|redirect)\\.(ts|js|html|md|css)$/);\n if (!match)\n return;\n const name = match[1];\n const kind = match[2];\n const ext = match[3];\n // Read current manifest (or start fresh)\n const response = await this.handle(ROUTES_MANIFEST_PATH);\n const tree = response.status === 404\n ? {}\n : await response.json();\n // Walk to the parent node\n let node = tree;\n for (const dir of dirSegments) {\n if (dir.startsWith('[') && dir.endsWith(']')) {\n const param = dir.slice(1, -1);\n node.dynamic ??= { param, child: {} };\n node = node.dynamic.child;\n }\n else {\n node.children ??= {};\n node.children[dir] ??= {};\n node = node.children[dir];\n }\n }\n // Place the file\n if (kind === 'error') {\n node.errorBoundary = filePath;\n }\n else {\n const target = resolveTargetNode(node, name, dirSegments.length === 0);\n if (kind === 'redirect') {\n target.redirect = filePath;\n }\n else {\n target.files ??= {};\n target.files[ext] = filePath;\n }\n }\n // Write updated manifest back\n this.routesManifestCache = null;\n await this.handle(ROUTES_MANIFEST_PATH, {\n method: 'PUT',\n body: JSON.stringify(tree),\n });\n }\n /**\n * Remove a route entry from the stored manifest when a file is deleted.\n * Walks the tree to find the node, clears the relevant field, then\n * prunes empty ancestor nodes.\n */\n async pruneRouteFromManifest(filePath, routesDir) {\n const relativePath = filePath.slice(routesDir.length + 1);\n const parts = relativePath.split('/');\n const filename = parts[parts.length - 1];\n const dirSegments = parts.slice(0, -1);\n const match = filename.match(/^(.+?)\\.(page|error|redirect)\\.(ts|js|html|md|css)$/);\n if (!match)\n return;\n const name = match[1];\n const kind = match[2];\n const ext = match[3];\n const response = await this.handle(ROUTES_MANIFEST_PATH);\n if (response.status === 404)\n return;\n const tree = await response.json();\n // Walk to the parent node, tracking path for pruning\n const ancestors = [];\n let node = tree;\n for (const dir of dirSegments) {\n if (dir.startsWith('[') && dir.endsWith(']')) {\n if (!node.dynamic)\n return;\n ancestors.push({ node, key: dir, via: 'dynamic' });\n node = node.dynamic.child;\n }\n else {\n if (!node.children?.[dir])\n return;\n ancestors.push({ node, key: dir, via: 'children' });\n node = node.children[dir];\n }\n }\n // Clear the field\n if (kind === 'error') {\n if (node.errorBoundary === filePath)\n delete node.errorBoundary;\n }\n else {\n const isRoot = dirSegments.length === 0;\n const target = this.findTargetNode(node, name, isRoot);\n if (!target)\n return;\n if (kind === 'redirect') {\n if (target.redirect === filePath)\n delete target.redirect;\n }\n else {\n if (target.files?.[ext] === filePath) {\n delete target.files[ext];\n if (Object.keys(target.files).length === 0)\n delete target.files;\n }\n }\n // If target is a child node and now empty, remove it\n if (target !== node && this.isEmptyNode(target)) {\n if (name === 'index' && !isRoot) {\n delete node.wildcard;\n }\n else if (name.startsWith('[') && name.endsWith(']')) {\n delete node.dynamic;\n }\n else if (node.children) {\n delete node.children[name];\n if (Object.keys(node.children).length === 0)\n delete node.children;\n }\n }\n }\n // Prune empty ancestors bottom-up\n for (let i = ancestors.length - 1; i >= 0; i--) {\n const { node: parent, key, via } = ancestors[i];\n const child = via === 'dynamic' ? parent.dynamic?.child : parent.children?.[key];\n if (child && this.isEmptyNode(child)) {\n if (via === 'dynamic') {\n delete parent.dynamic;\n }\n else if (parent.children) {\n delete parent.children[key];\n if (Object.keys(parent.children).length === 0)\n delete parent.children;\n }\n }\n }\n this.routesManifestCache = null;\n await this.handle(ROUTES_MANIFEST_PATH, {\n method: 'PUT',\n body: JSON.stringify(tree),\n });\n }\n /** Find a target node without creating it (read-only counterpart to resolveTargetNode). */\n findTargetNode(node, name, isRoot) {\n if (name === 'index') {\n return isRoot ? node : (node.wildcard?.child ?? null);\n }\n if (name.startsWith('[') && name.endsWith(']')) {\n return node.dynamic?.child ?? null;\n }\n return node.children?.[name] ?? null;\n }\n isEmptyNode(node) {\n return (!node.files &&\n !node.errorBoundary &&\n !node.redirect &&\n !node.children &&\n !node.dynamic &&\n !node.wildcard);\n }\n /**\n * Remove a widget entry from the stored manifest when a file is deleted.\n */\n async pruneWidgetFromManifest(filePath, widgetsDir) {\n const relativePath = filePath.slice(widgetsDir.length + 1);\n const parts = relativePath.split('/');\n if (parts.length !== 2)\n return;\n const [dirName, filename] = parts;\n const match = filename.match(/^(.+?)\\.widget\\.(ts|js|html|md|css)$/);\n if (!match)\n return;\n const name = match[1];\n const ext = match[2];\n if (name !== dirName)\n return;\n const response = await this.handle(WIDGETS_MANIFEST_PATH);\n if (response.status === 404)\n return;\n const entries = await response.json();\n if (ext === 'ts' || ext === 'js') {\n // Module deleted → remove entire entry\n const idx = entries.findIndex((e) => e.name === name);\n if (idx === -1)\n return;\n entries.splice(idx, 1);\n }\n else {\n // Companion deleted → remove from files\n const entry = entries.find((e) => e.name === name);\n if (!entry?.files)\n return;\n delete entry.files[ext];\n if (Object.keys(entry.files).length === 0)\n delete entry.files;\n }\n this.widgetsManifestCache = null;\n await this.handle(WIDGETS_MANIFEST_PATH, {\n method: 'PUT',\n body: JSON.stringify(entries),\n });\n }\n /**\n * Remove an element entry from the stored manifest when a file is deleted.\n */\n async pruneElementFromManifest(filePath, elementsDir) {\n const relativePath = filePath.slice(elementsDir.length + 1);\n const parts = relativePath.split('/');\n if (parts.length !== 2)\n return;\n const [dirName, filename] = parts;\n const match = filename.match(/^(.+?)\\.element\\.(ts|js)$/);\n if (!match)\n return;\n const name = match[1];\n if (name !== dirName)\n return;\n const response = await this.handle(ELEMENTS_MANIFEST_PATH);\n if (response.status === 404)\n return;\n const entries = await response.json();\n const idx = entries.findIndex((e) => e.name === name);\n if (idx === -1)\n return;\n entries.splice(idx, 1);\n this.elementsManifestCache = null;\n await this.handle(ELEMENTS_MANIFEST_PATH, {\n method: 'PUT',\n body: JSON.stringify(entries),\n });\n }\n /**\n * After a source or companion file is written, check if a built `.js`\n * artifact exists for that module. If so, re-transpile the `.ts` source\n * with companions inlined and write the `.js` back.\n *\n * Best-effort: silently skips if `transpile()` is not implemented.\n */\n async retranspileIfNeeded(filePath, dir, kind) {\n // Only act on source/companion files, not the .js output itself\n if (filePath.endsWith('.js'))\n return;\n const relativePath = filePath.slice(dir.length + 1);\n const parts = relativePath.split('/');\n const filename = parts[parts.length - 1];\n // Determine the module base name and the .js output path\n let jsPath;\n if (kind === 'route') {\n const match = filename.match(/^(.+?)\\.(page)\\.(ts|html|md|css)$/);\n if (!match)\n return;\n const name = match[1];\n jsPath = `${dir}/${parts.slice(0, -1).join('/')}${parts.length > 1 ? '/' : ''}${name}.page.js`;\n }\n else if (kind === 'widget') {\n const match = filename.match(/^(.+?)\\.(widget)\\.(ts|html|md|css)$/);\n if (!match)\n return;\n const name = match[1];\n jsPath = `${dir}/${name}/${name}.widget.js`;\n }\n else {\n const match = filename.match(/^(.+?)\\.(element)\\.ts$/);\n if (!match)\n return;\n const name = match[1];\n jsPath = `${dir}/${name}/${name}.element.js`;\n }\n // Check if the .js artifact exists\n const jsResponse = await this.handle(jsPath);\n if (jsResponse.status === 404)\n return;\n // Read the .ts source\n const tsPath = jsPath.replace(/\\.js$/, '.ts');\n let tsSource;\n try {\n tsSource = await this.query(tsPath, { as: 'text' });\n }\n catch {\n return; // .ts doesn't exist (maybe .js was hand-written)\n }\n // Collect companion files and inline them\n const companionExts = kind === 'element' ? [] : ['html', 'md', 'css'];\n const files = {};\n for (const ext of companionExts) {\n const companionPath = tsPath.replace(/\\.ts$/, `.${ext}`);\n try {\n files[ext] = await this.query(companionPath, { as: 'text' });\n }\n catch {\n // companion doesn't exist — skip\n }\n }\n // Transpile\n let jsCode;\n try {\n jsCode = await this.transpile(tsSource);\n }\n catch {\n return; // transpile not implemented — skip silently\n }\n // Append __files export if there are companions\n if (Object.keys(files).length > 0) {\n const entries = Object.entries(files)\n .map(([k, v]) => `${k}: \\`${v.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`').replace(/\\$/g, '\\\\$')}\\``)\n .join(', ');\n jsCode += `\\nexport const __files = { ${entries} };\\n`;\n }\n await this.handle(jsPath, { method: 'PUT', body: jsCode });\n }\n /**\n * Dynamically import a module from this runtime's storage.\n * Used by the server for SSR imports of `.page.ts` and `.widget.ts` files.\n */\n loadModule(_path) {\n throw new Error(`loadModule not implemented for ${this.constructor.name}`);\n }\n /**\n * Transpile TypeScript source to JavaScript.\n * Used by the build step to produce browser-loadable .js modules.\n */\n transpile(_source) {\n throw new Error(`transpile not implemented for ${this.constructor.name}`);\n }\n /**\n * Parse a widget file path and merge it into the stored manifest.\n * Reads the current manifest, upserts the entry, writes it back.\n */\n async mergeWidgetIntoManifest(filePath, widgetsDir) {\n const relativePath = filePath.slice(widgetsDir.length + 1);\n const parts = relativePath.split('/');\n if (parts.length !== 2)\n return; // must be widgets/{name}/{file}\n const [dirName, filename] = parts;\n // Only act on .widget.{ts,js,html,md,css} files\n const match = filename.match(/^(.+?)\\.widget\\.(ts|js|html|md|css)$/);\n if (!match)\n return;\n const name = match[1];\n const ext = match[2];\n if (name !== dirName)\n return; // filename must match directory\n const response = await this.handle(WIDGETS_MANIFEST_PATH);\n const entries = response.status === 404\n ? []\n : await response.json();\n const prefix = widgetsDir.replace(/^\\//, '');\n if (ext === 'ts' || ext === 'js') {\n // Module file — upsert the entry\n let entry = entries.find((e) => e.name === name);\n if (!entry) {\n entry = {\n name,\n modulePath: `${prefix}/${name}/${filename}`,\n tagName: `widget-${name}`,\n };\n entries.push(entry);\n entries.sort((a, b) => a.name.localeCompare(b.name));\n }\n else {\n entry.modulePath = `${prefix}/${name}/${filename}`;\n }\n }\n else {\n // Companion file — update files on existing entry\n const entry = entries.find((e) => e.name === name);\n if (!entry)\n return; // no module yet, companion alone is not enough\n entry.files ??= {};\n entry.files[ext] = `${prefix}/${name}/${filename}`;\n }\n this.widgetsManifestCache = null;\n await this.handle(WIDGETS_MANIFEST_PATH, {\n method: 'PUT',\n body: JSON.stringify(entries),\n });\n }\n /**\n * Parse an element file path and merge it into the stored manifest.\n * Reads the current manifest, upserts the entry, writes it back.\n */\n async mergeElementIntoManifest(filePath, elementsDir) {\n const relativePath = filePath.slice(elementsDir.length + 1);\n const parts = relativePath.split('/');\n if (parts.length !== 2)\n return;\n const [dirName, filename] = parts;\n const match = filename.match(/^(.+?)\\.element\\.(ts|js)$/);\n if (!match)\n return;\n const name = match[1];\n if (name !== dirName)\n return;\n // Custom element names must contain a hyphen\n if (!name.includes('-'))\n return;\n const response = await this.handle(ELEMENTS_MANIFEST_PATH);\n const entries = response.status === 404\n ? []\n : await response.json();\n const prefix = elementsDir.replace(/^\\//, '');\n let entry = entries.find((e) => e.name === name);\n if (!entry) {\n entry = {\n name,\n modulePath: `${prefix}/${name}/${filename}`,\n tagName: name,\n };\n entries.push(entry);\n entries.sort((a, b) => a.name.localeCompare(b.name));\n }\n else {\n entry.modulePath = `${prefix}/${name}/${filename}`;\n }\n this.elementsManifestCache = null;\n await this.handle(ELEMENTS_MANIFEST_PATH, {\n method: 'PUT',\n body: JSON.stringify(entries),\n });\n }\n // ── Manifest resolution ─────────────────────────────────────────────\n routesManifestCache = null;\n widgetsManifestCache = null;\n elementsManifestCache = null;\n /** Clear cached manifests so the next query triggers a fresh scan. */\n invalidateManifests() {\n this.routesManifestCache = null;\n this.widgetsManifestCache = null;\n this.elementsManifestCache = null;\n }\n /**\n * Resolve the routes manifest. Called when the concrete runtime returns\n * 404 for ROUTES_MANIFEST_PATH. Scans `config.routesDir` (or default).\n */\n async resolveRoutesManifest() {\n if (this.routesManifestCache)\n return this.routesManifestCache.clone();\n const routesDir = this.config.routesDir ?? DEFAULT_ROUTES_DIR;\n // Check if directory exists by querying it\n const dirResponse = await this.query(routesDir + '/');\n if (dirResponse.status === 404) {\n return new Response('Not Found', { status: 404 });\n }\n const tree = await this.scanRoutes(routesDir);\n this.routesManifestCache = Response.json(tree);\n return this.routesManifestCache.clone();\n }\n /**\n * Resolve the widgets manifest. Called when the concrete runtime returns\n * 404 for WIDGETS_MANIFEST_PATH. Scans `config.widgetsDir` (or default).\n */\n async resolveWidgetsManifest() {\n if (this.widgetsManifestCache)\n return this.widgetsManifestCache.clone();\n const widgetsDir = this.config.widgetsDir ?? DEFAULT_WIDGETS_DIR;\n const dirResponse = await this.query(widgetsDir + '/');\n if (dirResponse.status === 404) {\n return new Response('Not Found', { status: 404 });\n }\n const entries = await this.scanWidgets(widgetsDir, widgetsDir.replace(/^\\//, ''));\n this.widgetsManifestCache = Response.json(entries);\n return this.widgetsManifestCache.clone();\n }\n /**\n * Resolve the elements manifest. Called when the concrete runtime returns\n * 404 for ELEMENTS_MANIFEST_PATH. Scans `config.elementsDir` (or default).\n */\n async resolveElementsManifest() {\n if (this.elementsManifestCache)\n return this.elementsManifestCache.clone();\n const elementsDir = this.config.elementsDir ?? DEFAULT_ELEMENTS_DIR;\n const dirResponse = await this.query(elementsDir + '/');\n if (dirResponse.status === 404) {\n return new Response('Not Found', { status: 404 });\n }\n const entries = await this.scanElements(elementsDir, elementsDir.replace(/^\\//, ''));\n this.elementsManifestCache = Response.json(entries);\n return this.elementsManifestCache.clone();\n }\n // ── Scanning ──────────────────────────────────────────────────────────\n async *walkDirectory(dir) {\n const trailingDir = dir.endsWith('/') ? dir : dir + '/';\n const response = await this.query(trailingDir);\n const entries = await response.json();\n for (const entry of entries) {\n const path = `${trailingDir}${entry}`;\n if (entry.endsWith('/')) {\n yield* this.walkDirectory(path);\n }\n else {\n yield path;\n }\n }\n }\n /**\n * Scan a routes directory and build a RouteNode tree.\n * The filesystem structure maps directly to the tree — no intermediate array.\n */\n async scanRoutes(routesDir) {\n const root = {};\n const allFiles = [];\n for await (const file of this.walkDirectory(routesDir)) {\n allFiles.push(file);\n }\n for (const filePath of allFiles) {\n const relativePath = filePath.replace(`${routesDir}/`, '');\n const parts = relativePath.split('/');\n const filename = parts[parts.length - 1];\n const dirSegments = parts.slice(0, -1);\n // Parse filename: name.kind.ext (e.g. \"about.page.ts\", \"[id].page.html\", \"index.error.ts\")\n const match = filename.match(/^(.+?)\\.(page|error|redirect)\\.(ts|js|html|md|css)$/);\n if (!match)\n continue;\n const name = match[1];\n const kind = match[2];\n const ext = match[3];\n // Walk directory segments to reach the parent node\n let node = root;\n for (const dir of dirSegments) {\n if (dir.startsWith('[') && dir.endsWith(']')) {\n const param = dir.slice(1, -1);\n node.dynamic ??= { param, child: {} };\n node = node.dynamic.child;\n }\n else {\n node.children ??= {};\n node.children[dir] ??= {};\n node = node.children[dir];\n }\n }\n // Place the file on the correct node\n if (kind === 'error') {\n // Error boundary scopes to the directory it's in.\n // Root index.error.ts → root.errorBoundary (global handler).\n // projects/projects.error.ts → projects node errorBoundary.\n node.errorBoundary = filePath;\n continue;\n }\n // For page and redirect files, the name determines the final node\n const target = resolveTargetNode(node, name, dirSegments.length === 0);\n if (kind === 'redirect') {\n target.redirect = filePath;\n }\n else {\n // kind === 'page'\n target.files ??= {};\n target.files[ext] = filePath;\n }\n }\n return root;\n }\n async scanWidgets(widgetsDir, pathPrefix) {\n const COMPANION_EXTENSIONS = ['html', 'md', 'css'];\n const entries = [];\n const trailingDir = widgetsDir.endsWith('/') ? widgetsDir : widgetsDir + '/';\n const response = await this.query(trailingDir);\n const listing = await response.json();\n for (const item of listing) {\n if (!item.endsWith('/'))\n continue;\n const name = item.slice(0, -1);\n // Try .widget.ts first, then .widget.js\n let moduleFile = `${name}.widget.ts`;\n let modulePath = `${trailingDir}${name}/${moduleFile}`;\n if ((await this.query(modulePath)).status === 404) {\n moduleFile = `${name}.widget.js`;\n modulePath = `${trailingDir}${name}/${moduleFile}`;\n if ((await this.query(modulePath)).status === 404)\n continue;\n }\n const prefix = pathPrefix ? `${pathPrefix}/` : '';\n const entry = {\n name,\n modulePath: `${prefix}${name}/${moduleFile}`,\n tagName: `widget-${name}`,\n };\n const files = {};\n let hasFiles = false;\n const companionResults = await Promise.all(COMPANION_EXTENSIONS.map(async (ext) => {\n const companionFile = `${name}.widget.${ext}`;\n const companionPath = `${trailingDir}${name}/${companionFile}`;\n const exists = (await this.query(companionPath)).status !== 404;\n return { ext, exists, path: `${prefix}${name}/${companionFile}` };\n }));\n for (const { ext, exists, path } of companionResults) {\n if (exists) {\n files[ext] = path;\n hasFiles = true;\n }\n }\n if (hasFiles)\n entry.files = files;\n entries.push(entry);\n }\n entries.sort((a, b) => a.name.localeCompare(b.name));\n return entries;\n }\n async scanElements(elementsDir, pathPrefix) {\n const entries = [];\n const trailingDir = elementsDir.endsWith('/') ? elementsDir : elementsDir + '/';\n const response = await this.query(trailingDir);\n const listing = await response.json();\n for (const item of listing) {\n if (!item.endsWith('/'))\n continue;\n const name = item.slice(0, -1);\n // Custom element names must contain a hyphen (web spec requirement)\n if (!name.includes('-')) {\n console.warn(`[emroute] Skipping element \"${name}\": custom element names must contain a hyphen (e.g. \"my-element\")`);\n continue;\n }\n // Try .element.ts first, then .element.js\n let moduleFile = `${name}.element.ts`;\n let modulePath = `${trailingDir}${name}/${moduleFile}`;\n if ((await this.query(modulePath)).status === 404) {\n moduleFile = `${name}.element.js`;\n modulePath = `${trailingDir}${name}/${moduleFile}`;\n if ((await this.query(modulePath)).status === 404)\n continue;\n }\n const prefix = pathPrefix ? `${pathPrefix}/` : '';\n entries.push({\n name,\n modulePath: `${prefix}${name}/${moduleFile}`,\n tagName: name,\n });\n }\n entries.sort((a, b) => a.name.localeCompare(b.name));\n return entries;\n }\n}\n//# sourceMappingURL=abstract.runtime.js.map",
|
|
26
|
+
"/**\n * Fetch Runtime\n *\n * Browser-compatible Runtime that delegates all reads to a remote server\n * via `fetch()`. Used by EmrouteApp in `root` mode — same Emroute\n * instance runs in the browser, but the Runtime fetches files from the\n * real server instead of reading from disk.\n *\n * No bundling, no transpiling, no filesystem access.\n * No directory scanning — the remote server already has manifests.\n */\nvar __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n};\nimport { Runtime, } from \"./abstract.runtime.js\";\nexport class FetchRuntime extends Runtime {\n origin;\n /**\n * @param origin — Server origin, e.g. `'http://localhost:4100'` or `location.origin`.\n */\n constructor(origin, config = {}) {\n super(config);\n this.origin = origin.endsWith('/') ? origin.slice(0, -1) : origin;\n }\n handle(resource, init) {\n const url = this.toUrl(resource);\n return fetch(url, init);\n }\n query(resource, options) {\n if (options?.as === 'text') {\n return fetch(this.toUrl(resource)).then((r) => r.text());\n }\n return this.handle(resource, options);\n }\n async loadModule(path) {\n const url = `${this.origin}${path}`;\n const response = await fetch(url);\n const js = await response.text();\n const blob = new Blob([js], { type: 'application/javascript' });\n const objectUrl = URL.createObjectURL(blob);\n try {\n return await import(__rewriteRelativeImportExtension(objectUrl));\n }\n finally {\n URL.revokeObjectURL(objectUrl);\n }\n }\n toUrl(resource) {\n if (typeof resource === 'string')\n return `${this.origin}${resource}`;\n if (resource instanceof URL)\n return `${this.origin}${resource.pathname}${resource.search}`;\n return `${this.origin}${new URL(resource.url).pathname}`;\n }\n}\n//# sourceMappingURL=fetch.runtime.js.map",
|
|
27
|
+
"/// <reference path=\"../../type/navigation-api.d.ts\" />\n/**\n * Emroute App\n *\n * Browser entry point for `/app/` routes. Wraps an Emroute instance\n * (same server, same pipeline) with Navigation API glue that intercepts\n * link clicks, calls `htmlRouter.render()`, and injects the result.\n */\nimport { Emroute } from \"../../../core/server/emroute.server.js\";\nimport { FetchRuntime } from \"../../../runtime/fetch.runtime.js\";\nimport { ROUTES_MANIFEST_PATH, WIDGETS_MANIFEST_PATH, ELEMENTS_MANIFEST_PATH } from \"../../../core/runtime/abstract.runtime.js\";\nimport { DEFAULT_BASE_PATH } from \"../../../core/server/emroute.server.js\";\nimport { assertSafeRedirect, escapeHtml } from \"../../../core/util/html.util.js\";\nimport { ComponentElement } from \"../../element/component.element.js\";\nimport { MarkdownElement } from \"../../element/markdown.element.js\";\nimport { WidgetRegistry } from \"../../../core/widget/widget.registry.js\";\n/** Browser app — Navigation API wired to an Emroute. */\nexport class EmrouteApp {\n server;\n appBase;\n slot = null;\n abortController = null;\n constructor(server, options) {\n this.server = server;\n if (options?.basePath) {\n this.appBase = options.basePath.app;\n }\n else if (typeof document !== 'undefined') {\n const base = document.querySelector('base')?.getAttribute('href');\n this.appBase = base ? base.replace(/\\/$/, '') : DEFAULT_BASE_PATH.app;\n }\n else {\n this.appBase = DEFAULT_BASE_PATH.app;\n }\n }\n async initialize(slotSelector = 'router-slot') {\n this.slot = document.querySelector(slotSelector);\n if (!this.slot) {\n console.error('[EmrouteApp] Slot not found:', slotSelector);\n return;\n }\n if (!('navigation' in globalThis)) {\n console.warn('[EmrouteApp] Navigation API not available');\n return;\n }\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n navigation.addEventListener('navigate', (event) => {\n if (!event.canIntercept)\n return;\n if (event.hashChange)\n return;\n if (event.downloadRequest !== null)\n return;\n const url = new URL(event.destination.url);\n if (!this.isAppPath(url.pathname))\n return;\n event.intercept({\n scroll: 'manual',\n handler: async () => {\n await this.handleNavigation(url, event.signal);\n event.scroll();\n },\n });\n }, { signal });\n // SSR adoption — server already rendered this page, skip re-render\n const ssrRoute = this.slot.getAttribute('data-ssr-route');\n if (ssrRoute && (location.pathname === ssrRoute || location.pathname === ssrRoute + '/')) {\n this.slot.removeAttribute('data-ssr-route');\n return;\n }\n // Initial render\n await this.handleNavigation(new URL(location.href), this.abortController.signal);\n }\n dispose() {\n this.abortController?.abort();\n this.abortController = null;\n this.slot = null;\n }\n async navigate(url, options = {}) {\n try {\n const { finished } = navigation.navigate(url, {\n state: options.state,\n history: options.replace ? 'replace' : 'auto',\n });\n await finished;\n }\n catch (e) {\n if (e instanceof DOMException && e.name === 'AbortError')\n return;\n throw e;\n }\n }\n isAppPath(pathname) {\n return pathname === this.appBase || pathname.startsWith(this.appBase + '/');\n }\n stripAppBase(pathname) {\n if (pathname === this.appBase)\n return '/';\n if (pathname.startsWith(this.appBase + '/'))\n return pathname.slice(this.appBase.length);\n return pathname;\n }\n async handleNavigation(url, signal) {\n if (!this.slot || !this.server.htmlRenderer)\n return;\n const routePath = this.stripAppBase(url.pathname);\n const routeUrl = new URL(routePath + url.search, url.origin);\n try {\n const { content, title, redirect } = await this.server.htmlRenderer.render(routeUrl, signal);\n if (signal.aborted)\n return;\n if (redirect) {\n assertSafeRedirect(redirect);\n const target = redirect.startsWith('/') ? this.appBase + redirect : redirect;\n navigation.navigate(target, { history: 'replace' });\n return;\n }\n if (document.startViewTransition) {\n const transition = document.startViewTransition(() => {\n this.slot.setHTMLUnsafe(content);\n });\n signal.addEventListener('abort', () => transition.skipTransition(), { once: true });\n await transition.updateCallbackDone;\n }\n else {\n this.slot.setHTMLUnsafe(content);\n }\n if (title)\n document.title = title;\n }\n catch (error) {\n if (signal.aborted)\n return;\n console.error('[EmrouteApp] Navigation error:', error);\n if (this.slot) {\n const message = error instanceof Error ? error.message : String(error);\n this.slot.setHTMLUnsafe(`<h1>Error</h1><p>${escapeHtml(message)}</p>`);\n }\n }\n }\n}\n/**\n * Create and initialize the browser app.\n *\n * Stored on `globalThis.__emroute_app` for programmatic access.\n */\nexport async function createEmrouteApp(server, options) {\n const g = globalThis;\n if (g.__emroute_app) {\n console.warn('eMroute: App already initialized.');\n return g.__emroute_app;\n }\n const app = new EmrouteApp(server, options);\n await app.initialize();\n g.__emroute_app = app;\n return app;\n}\n/**\n * Boot the browser app from runtime manifests.\n *\n * Fetches route tree and widget manifest as JSON, creates lazy module\n * loaders via FetchRuntime, registers widgets for deferred hydration,\n * and wires the Navigation API.\n *\n * Consumer `main.ts` calls this after setting up MarkdownElement renderer,\n * custom elements, etc.\n */\nexport async function bootEmrouteApp(options) {\n const origin = options?.origin ?? location.origin;\n const runtime = new FetchRuntime(origin);\n // Fetch route tree\n const routesResponse = await runtime.handle(ROUTES_MANIFEST_PATH);\n if (!routesResponse.ok) {\n throw new Error(`[emroute] Failed to fetch ${ROUTES_MANIFEST_PATH}: ${routesResponse.status}`);\n }\n const routeTree = await routesResponse.json();\n // Fetch widget manifest (optional — app may have no widgets)\n const widgetsResponse = await runtime.handle(WIDGETS_MANIFEST_PATH);\n const widgetEntries = widgetsResponse.ok\n ? await widgetsResponse.json()\n : [];\n // Fetch element manifest (optional — app may have no custom elements)\n const elementsResponse = await runtime.handle(ELEMENTS_MANIFEST_PATH);\n const elementEntries = elementsResponse.ok\n ? await elementsResponse.json()\n : [];\n // Build lazy module loaders for all route + widget + element modules\n const moduleLoaders = buildLazyLoaders(routeTree, widgetEntries, elementEntries, runtime);\n // Register widgets: lazy in registry (loaded on demand during render),\n // lazy in DOM (module loads on connectedCallback for hydration).\n const widgets = new WidgetRegistry();\n for (const entry of widgetEntries) {\n widgets.addLazy(entry.name, entry.modulePath);\n ComponentElement.registerLazy(entry.name, moduleLoaders[entry.modulePath]);\n }\n // Register custom elements — import all modules, define when loaded\n for (const entry of elementEntries) {\n const loader = moduleLoaders[entry.modulePath];\n if (loader) {\n loader().then((mod) => {\n const cls = mod.default;\n if (typeof cls === 'function' && !customElements.get(entry.tagName)) {\n customElements.define(entry.tagName, cls);\n }\n }).catch((e) => {\n console.error(`[emroute] Failed to load element ${entry.tagName}:`, e);\n });\n }\n }\n // Wire context provider for both pages (Pipeline) and widgets (ComponentElement)\n if (options?.extendContext) {\n ComponentElement.setContextProvider(options.extendContext);\n }\n // Create Emroute instance (same class as SSR)\n const mdRenderer = MarkdownElement.getConfiguredRenderer();\n const server = await Emroute.create({\n routeTree,\n widgets,\n moduleLoaders,\n ...(mdRenderer ? { markdownRenderer: mdRenderer } : {}),\n ...(options?.extendContext ? { extendContext: options.extendContext } : {}),\n }, runtime);\n return createEmrouteApp(server, options);\n}\n/**\n * Walk the route tree, widget entries, and element entries to build a map of\n * `path → () => runtime.loadModule(path)` lazy loaders.\n */\nfunction buildLazyLoaders(tree, widgetEntries, elementEntries, runtime) {\n const paths = new Set();\n function walk(node) {\n const modulePath = node.files?.ts ?? node.files?.js;\n if (modulePath)\n paths.add(modulePath);\n if (node.redirect)\n paths.add(node.redirect);\n if (node.errorBoundary)\n paths.add(node.errorBoundary);\n if (node.children) {\n for (const child of Object.values(node.children))\n walk(child);\n }\n if (node.dynamic)\n walk(node.dynamic.child);\n if (node.wildcard)\n walk(node.wildcard.child);\n }\n walk(tree);\n for (const entry of widgetEntries)\n paths.add(entry.modulePath);\n for (const entry of elementEntries)\n paths.add(entry.modulePath);\n const loaders = {};\n for (const path of paths) {\n const absolute = path.startsWith('/') ? path : '/' + path;\n loaders[path] = () => runtime.loadModule(absolute);\n }\n return loaders;\n}\n//# sourceMappingURL=emroute.app.js.map",
|
|
28
28
|
"/**\n * Widget Component\n *\n * Embeddable unit within page content. Everything reusable that is not\n * a page is a Widget. Widgets render across all contexts (HTML, Markdown, SPA)\n * and are resolved by name via WidgetRegistry.\n *\n * Default rendering fallback chains (parallel to PageComponent):\n * - renderHTML: html file → md file in <mark-down> → base Component default\n * - renderMarkdown: md file → ''\n */\nimport { Component } from \"./abstract.component.js\";\nimport { escapeHtml, scopeWidgetCss } from \"../util/html.util.js\";\nexport class WidgetComponent extends Component {\n renderHTML(args) {\n const files = args.context.files;\n const style = files?.css ? `<style>${scopeWidgetCss(files.css, this.name)}</style>\\n` : '';\n if (files?.html) {\n return style + files.html;\n }\n if (files?.md) {\n return `${style}<mark-down>${escapeHtml(files.md)}</mark-down>`;\n }\n if (style) {\n return style + super.renderHTML(args);\n }\n return super.renderHTML(args);\n }\n renderMarkdown(args) {\n const files = args.context.files;\n if (files?.md) {\n return files.md;\n }\n return '';\n }\n}\n//# sourceMappingURL=widget.component.js.map",
|
|
29
29
|
"/**\n * Overlay Default CSS\n *\n * Styles for modals, toasts, and popovers. Works for both declarative\n * (commandfor/command + HTML attributes) and programmatic (OverlayService)\n * overlays. Uses CSS custom properties for theming.\n */\nexport const overlayCSS = /* css */ `\n:root {\n --overlay-backdrop: oklch(0% 0 0 / 0.5);\n --overlay-surface: oklch(100% 0 0);\n --overlay-radius: 8px;\n --overlay-shadow: 0 8px 32px oklch(0% 0 0 / 0.2);\n --overlay-toast-gap: 8px;\n --overlay-toast-duration: 5s;\n --overlay-z: 1000;\n}\n\n/* --- Modal (dialog) --- */\n\ndialog[data-overlay-modal] {\n border: none;\n padding: 0;\n background: var(--overlay-surface);\n border-radius: var(--overlay-radius);\n box-shadow: var(--overlay-shadow);\n max-width: min(90vw, 560px);\n max-height: 85vh;\n overflow: auto;\n opacity: 1;\n translate: 0 0;\n transition:\n opacity 200ms,\n translate 200ms;\n}\n\ndialog[data-overlay-modal][open] {\n transition:\n opacity 200ms,\n translate 200ms,\n display 200ms allow-discrete,\n overlay 200ms allow-discrete;\n\n @starting-style {\n opacity: 0;\n translate: 0 20px;\n }\n}\n\ndialog[data-overlay-modal]::backdrop {\n background: var(--overlay-backdrop);\n opacity: 1;\n transition: opacity 200ms;\n}\n\ndialog[data-overlay-modal][open]::backdrop {\n transition:\n opacity 200ms,\n display 200ms allow-discrete,\n overlay 200ms allow-discrete;\n\n @starting-style {\n opacity: 0;\n }\n}\n\ndialog[data-overlay-modal][data-dismissing] {\n opacity: 0;\n translate: 0 20px;\n}\n\ndialog[data-overlay-modal][data-dismissing]::backdrop {\n opacity: 0;\n}\n\n/* --- Toast container --- */\n\n[data-overlay-toast-container] {\n position: fixed;\n bottom: 16px;\n right: 16px;\n z-index: var(--overlay-z);\n display: flex;\n flex-direction: column;\n gap: var(--overlay-toast-gap);\n pointer-events: none;\n}\n\n/* --- Toast item --- */\n\n[data-overlay-toast] {\n pointer-events: auto;\n background: var(--overlay-surface);\n border-radius: var(--overlay-radius);\n box-shadow: var(--overlay-shadow);\n padding: 12px 16px;\n animation: overlay-toast-auto var(--overlay-toast-duration, 5s) ease-in-out forwards;\n}\n\n/* Manual toast (timeout: 0): no auto-dismiss, entry transition only */\n[data-overlay-toast][data-toast-manual] {\n animation: none;\n opacity: 1;\n translate: 0 0;\n transition:\n opacity 200ms,\n translate 200ms;\n\n @starting-style {\n opacity: 0;\n translate: 20px 0;\n }\n}\n\n/* Dismissed toast: CSS exit animation */\n[data-overlay-toast][data-dismissing] {\n animation: overlay-toast-exit 200ms ease-in forwards;\n}\n\n@keyframes overlay-toast-auto {\n 0% { opacity: 0; translate: 20px 0; }\n 10% { opacity: 1; translate: 0 0; }\n 80% { opacity: 1; translate: 0 0; }\n 100% { opacity: 0; translate: 0 0; display: none; }\n}\n\n@keyframes overlay-toast-exit {\n to { opacity: 0; translate: 20px 0; display: none; }\n}\n\n/* --- Popover --- */\n\n[data-overlay-popover] {\n border: none;\n padding: 0;\n margin: 0;\n background: var(--overlay-surface);\n border-radius: var(--overlay-radius);\n box-shadow: var(--overlay-shadow);\n opacity: 1;\n scale: 1;\n transition:\n opacity 200ms,\n scale 200ms;\n}\n\n[data-overlay-popover]:popover-open {\n position-anchor: auto;\n inset: unset;\n top: anchor(bottom);\n left: anchor(start);\n margin-top: 4px;\n transition:\n opacity 200ms,\n scale 200ms,\n display 200ms allow-discrete,\n overlay 200ms allow-discrete;\n\n @starting-style {\n opacity: 0;\n scale: 0.95;\n }\n}\n\n[data-overlay-popover][data-dismissing] {\n opacity: 0;\n scale: 0.95;\n}\n`;\n//# sourceMappingURL=overlay.css.js.map",
|
|
30
|
-
"/**\n * Overlay Service\n *\n * Programmatic API for modals, toasts, and popovers. For simple trigger\n * patterns, use declarative HTML (commandfor/command + popover/dialog)\n * with zero JS. This service covers dynamic content, programmatic\n * triggers, and complex workflows.\n *\n * dismissAll() is DOM-aware: it closes both programmatic overlays\n * managed by this service AND declarative popovers/dialogs found\n * via DOM queries.\n */\nimport { overlayCSS } from \"./overlay.css.js\";\nconst ANIMATION_SAFETY_TIMEOUT = 300;\n/**\n * Animate an element out by setting `data-dismissing`, waiting for\n * `transitionend`, then calling the provided callback. Includes a\n * safety timeout in case the transition event never fires.\n */\nfunction animateDismiss(el, onDone) {\n el.setAttribute('data-dismissing', '');\n let done = false;\n const finish = () => {\n if (done)\n return;\n done = true;\n onDone();\n };\n el.addEventListener('transitionend', finish, { once: true });\n setTimeout(finish, ANIMATION_SAFETY_TIMEOUT);\n}\nexport function createOverlayService() {\n let styleInjected = false;\n // Modal state\n let dialog = null;\n // Uses `any` because modalResolve is reassigned across multiple modal() calls\n // with different type parameters T. Each call creates a Promise.withResolvers<T>(),\n // so the resolver function signature changes (accepts T | PromiseLike<T | undefined>).\n // Type safety is maintained by closeModal<T>(value?: T) which ensures only valid\n // types are passed to the resolver.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let modalResolve = null;\n let modalOnClose;\n // Toast state\n let toastContainer = null;\n // Popover state\n let popoverEl = null;\n let popoverAnchorObserver = null;\n const supportsAnchor = typeof CSS !== 'undefined' &&\n CSS.supports('anchor-name', '--a');\n function injectCSS() {\n if (styleInjected)\n return;\n styleInjected = true;\n const style = document.createElement('style');\n style.textContent = overlayCSS;\n document.head.appendChild(style);\n }\n function ensureDialog() {\n if (dialog)\n return dialog;\n injectCSS();\n dialog = document.createElement('dialog');\n dialog.setAttribute('data-overlay-modal', '');\n document.body.appendChild(dialog);\n dialog.addEventListener('click', (e) => {\n if (e.target === dialog) {\n closeModal(undefined);\n }\n });\n return dialog;\n }\n function ensureToastContainer() {\n if (toastContainer)\n return toastContainer;\n injectCSS();\n toastContainer = document.createElement('div');\n toastContainer.setAttribute('data-overlay-toast-container', '');\n document.body.appendChild(toastContainer);\n return toastContainer;\n }\n function ensurePopover() {\n if (popoverEl)\n return popoverEl;\n injectCSS();\n popoverEl = document.createElement('div');\n popoverEl.setAttribute('data-overlay-popover', '');\n popoverEl.setAttribute('popover', '');\n document.body.appendChild(popoverEl);\n return popoverEl;\n }\n // --- Modal ---\n function modal(options) {\n const d = ensureDialog();\n // Clean up any lingering dismiss state from a previous close\n d.removeAttribute('data-dismissing');\n // Immediately dismiss popover — modal takes over the top layer\n hidePopoverImmediate();\n // Last wins: close current modal if open\n if (d.open) {\n d.close();\n if (modalResolve) {\n modalResolve(undefined);\n modalResolve = null;\n }\n if (modalOnClose) {\n modalOnClose();\n modalOnClose = undefined;\n }\n }\n d.innerHTML = '';\n options.render(d);\n modalOnClose = options.onClose;\n const { promise, resolve } = Promise.withResolvers();\n modalResolve = resolve;\n d.showModal();\n return promise;\n }\n function closeModal(value) {\n if (!dialog || !dialog.open)\n return;\n const resolve = modalResolve;\n const onClose = modalOnClose;\n const dialogRef = dialog;\n modalResolve = null;\n modalOnClose = undefined;\n animateDismiss(dialogRef, () => {\n if (dialogRef && dialogRef.open) {\n dialogRef.close();\n if (resolve)\n resolve(value);\n if (onClose)\n onClose();\n }\n });\n }\n // --- Toast ---\n /** Remove dead toasts (dismissed or animation-finished) from container. */\n function clearDeadToasts(container) {\n for (const child of [...container.children]) {\n const el = child;\n if (el.hasAttribute('data-dismissing')) {\n el.remove();\n }\n }\n }\n function toast(options) {\n const container = ensureToastContainer();\n // Clean up dead toasts before adding a new one\n clearDeadToasts(container);\n const el = document.createElement('div');\n el.setAttribute('data-overlay-toast', '');\n const timeout = options.timeout ?? 0;\n if (timeout === 0) {\n el.setAttribute('data-toast-manual', '');\n }\n else {\n el.style.setProperty('--overlay-toast-duration', `${timeout}ms`);\n }\n options.render(el);\n container.appendChild(el);\n let dismissed = false;\n const dismiss = () => {\n if (dismissed)\n return;\n dismissed = true;\n el.setAttribute('data-dismissing', '');\n };\n return { dismiss };\n }\n // --- Popover ---\n function popover(options) {\n const el = ensurePopover();\n // Last wins: hide current popover if showing\n cleanupPopoverAnchorObserver();\n try {\n el.hidePopover();\n }\n catch {\n // Not shown — ignore\n }\n el.removeAttribute('data-dismissing');\n el.innerHTML = '';\n options.render(el);\n // Anchor positioning\n if (supportsAnchor) {\n const anchorName = '--overlay-anchor';\n options.anchor.style.setProperty('anchor-name', anchorName);\n el.style.setProperty('position-anchor', anchorName);\n el.style.removeProperty('top');\n el.style.removeProperty('left');\n }\n else {\n const rect = options.anchor.getBoundingClientRect();\n el.style.top = `${rect.bottom + globalThis.scrollY}px`;\n el.style.left = `${rect.left + globalThis.scrollX}px`;\n el.style.position = 'absolute';\n }\n el.showPopover();\n // Watch for anchor disconnect\n watchAnchorDisconnect(options.anchor);\n }\n function watchAnchorDisconnect(anchor) {\n cleanupPopoverAnchorObserver();\n const parent = anchor.parentNode;\n if (!parent) {\n closePopover();\n return;\n }\n popoverAnchorObserver = new MutationObserver(() => {\n if (!document.contains(anchor)) {\n closePopover();\n }\n });\n popoverAnchorObserver.observe(parent, { childList: true });\n }\n /** Hide popover instantly without dismiss animation. */\n function hidePopoverImmediate() {\n cleanupPopoverAnchorObserver();\n if (!popoverEl)\n return;\n try {\n popoverEl.hidePopover();\n }\n catch {\n // Not shown — ignore\n }\n popoverEl.removeAttribute('data-dismissing');\n }\n function cleanupPopoverAnchorObserver() {\n if (popoverAnchorObserver) {\n popoverAnchorObserver.disconnect();\n popoverAnchorObserver = null;\n }\n }\n function closePopover() {\n cleanupPopoverAnchorObserver();\n if (!popoverEl)\n return;\n // Check if popover is showing via matches(':popover-open')\n let isOpen;\n try {\n isOpen = popoverEl.matches(':popover-open');\n }\n catch {\n // :popover-open may not be supported — fall back\n isOpen = popoverEl.hasAttribute('popover') && popoverEl.style.display !== 'none';\n }\n if (!isOpen)\n return;\n animateDismiss(popoverEl, () => {\n try {\n popoverEl.hidePopover();\n }\n catch {\n // Already hidden\n }\n });\n }\n // --- Dismiss all ---\n function dismissAll() {\n // Close programmatic modal\n if (dialog && dialog.open) {\n const resolve = modalResolve;\n const onClose = modalOnClose;\n modalResolve = null;\n modalOnClose = undefined;\n dialog.removeAttribute('data-dismissing');\n dialog.close();\n if (resolve)\n resolve(undefined);\n if (onClose)\n onClose();\n }\n // Hide programmatic popover\n hidePopoverImmediate();\n // Dismiss all toasts via CSS\n if (toastContainer) {\n for (const child of toastContainer.children) {\n child.setAttribute('data-dismissing', '');\n }\n }\n // Close declarative popovers found in the DOM\n try {\n for (const el of document.querySelectorAll(':popover-open')) {\n el.hidePopover();\n }\n }\n catch {\n // :popover-open not supported\n }\n // Close declarative dialogs found in the DOM (skip our own)\n for (const el of document.querySelectorAll('dialog[open]')) {\n if (el !== dialog)\n el.close();\n }\n }\n return {\n modal,\n closeModal,\n toast,\n popover,\n closePopover,\n dismissAll,\n };\n}\n//# sourceMappingURL=overlay.service.js.map",
|
|
30
|
+
"/**\n * Overlay Service\n *\n * Programmatic API for modals, toasts, and popovers. For simple trigger\n * patterns, use declarative HTML (commandfor/command + popover/dialog)\n * with zero JS. This service covers dynamic content, programmatic\n * triggers, and complex workflows.\n *\n * dismissAll() is DOM-aware: it closes both programmatic overlays\n * managed by this service AND declarative popovers/dialogs found\n * via DOM queries.\n */\nimport { overlayCSS } from \"./overlay.css.js\";\nconst ANIMATION_SAFETY_TIMEOUT = 300;\n/**\n * Animate an element out by setting `data-dismissing`, waiting for\n * `transitionend`, then calling the provided callback. Includes a\n * safety timeout in case the transition event never fires.\n */\nfunction animateDismiss(el, onDone) {\n el.setAttribute('data-dismissing', '');\n let done = false;\n const finish = () => {\n if (done)\n return;\n done = true;\n onDone();\n };\n el.addEventListener('transitionend', finish, { once: true });\n setTimeout(finish, ANIMATION_SAFETY_TIMEOUT);\n}\n/**\n * Populate a toast element from a cloned template.\n * Sets `[data-toast-message]` textContent, `data-toast-type` attribute,\n * and unhides confirm/reject buttons when labels are provided.\n */\nfunction fillTemplate(el, options, onConfirm, onReject) {\n const msgEl = el.querySelector('[data-toast-message]');\n if (msgEl && options.message) {\n msgEl.textContent = options.message;\n }\n if (options.type) {\n el.setAttribute('data-toast-type', options.type);\n }\n const confirmBtn = el.querySelector('[data-toast-confirm]');\n if (confirmBtn) {\n if (options.confirm) {\n confirmBtn.textContent = options.confirm;\n confirmBtn.hidden = false;\n if (onConfirm)\n confirmBtn.addEventListener('click', onConfirm, { once: true });\n }\n else {\n confirmBtn.hidden = true;\n }\n }\n const rejectBtn = el.querySelector('[data-toast-reject]');\n if (rejectBtn) {\n if (options.reject) {\n rejectBtn.textContent = options.reject;\n rejectBtn.hidden = false;\n if (onReject)\n rejectBtn.addEventListener('click', onReject, { once: true });\n }\n else {\n rejectBtn.hidden = true;\n }\n }\n}\n/**\n * Build toast inner content when no `<template id=\"overlay-toast\">` exists.\n * Creates a `<span>` with the message text, plus confirm/reject buttons\n * if labels are provided.\n */\nfunction buildFallback(el, options, onConfirm, onReject) {\n if (options.type) {\n el.setAttribute('data-toast-type', options.type);\n }\n const span = document.createElement('span');\n span.setAttribute('data-toast-message', '');\n span.textContent = options.message ?? '';\n el.appendChild(span);\n if (options.confirm) {\n const btn = document.createElement('button');\n btn.setAttribute('data-toast-confirm', '');\n btn.textContent = options.confirm;\n if (onConfirm)\n btn.addEventListener('click', onConfirm, { once: true });\n el.appendChild(btn);\n }\n if (options.reject) {\n const btn = document.createElement('button');\n btn.setAttribute('data-toast-reject', '');\n btn.textContent = options.reject;\n if (onReject)\n btn.addEventListener('click', onReject, { once: true });\n el.appendChild(btn);\n }\n}\nexport function createOverlayService() {\n let styleInjected = false;\n // Modal state\n let dialog = null;\n // Uses `any` because modalResolve is reassigned across multiple modal() calls\n // with different type parameters T. Each call creates a Promise.withResolvers<T>(),\n // so the resolver function signature changes (accepts T | PromiseLike<T | undefined>).\n // Type safety is maintained by closeModal<T>(value?: T) which ensures only valid\n // types are passed to the resolver.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let modalResolve = null;\n let modalOnClose;\n // Toast state\n let toastContainer = null;\n // Popover state\n let popoverEl = null;\n let popoverAnchorObserver = null;\n const supportsAnchor = typeof CSS !== 'undefined' &&\n CSS.supports('anchor-name', '--a');\n function injectCSS() {\n if (styleInjected)\n return;\n styleInjected = true;\n const style = document.createElement('style');\n style.textContent = overlayCSS;\n document.head.appendChild(style);\n }\n function ensureDialog() {\n if (dialog)\n return dialog;\n injectCSS();\n dialog = document.createElement('dialog');\n dialog.setAttribute('data-overlay-modal', '');\n document.body.appendChild(dialog);\n dialog.addEventListener('click', (e) => {\n if (e.target === dialog) {\n closeModal(undefined);\n }\n });\n return dialog;\n }\n function ensureToastContainer() {\n if (toastContainer)\n return toastContainer;\n injectCSS();\n toastContainer = document.createElement('div');\n toastContainer.setAttribute('data-overlay-toast-container', '');\n document.body.appendChild(toastContainer);\n return toastContainer;\n }\n function ensurePopover() {\n if (popoverEl)\n return popoverEl;\n injectCSS();\n popoverEl = document.createElement('div');\n popoverEl.setAttribute('data-overlay-popover', '');\n popoverEl.setAttribute('popover', '');\n document.body.appendChild(popoverEl);\n return popoverEl;\n }\n // --- Modal ---\n function modal(options) {\n const d = ensureDialog();\n // Clean up any lingering dismiss state from a previous close\n d.removeAttribute('data-dismissing');\n // Immediately dismiss popover — modal takes over the top layer\n hidePopoverImmediate();\n // Last wins: close current modal if open\n if (d.open) {\n d.close();\n if (modalResolve) {\n modalResolve(undefined);\n modalResolve = null;\n }\n if (modalOnClose) {\n modalOnClose();\n modalOnClose = undefined;\n }\n }\n d.innerHTML = '';\n options.render(d);\n modalOnClose = options.onClose;\n const { promise, resolve } = Promise.withResolvers();\n modalResolve = resolve;\n d.showModal();\n return promise;\n }\n function closeModal(value) {\n if (!dialog || !dialog.open)\n return;\n const resolve = modalResolve;\n const onClose = modalOnClose;\n const dialogRef = dialog;\n modalResolve = null;\n modalOnClose = undefined;\n animateDismiss(dialogRef, () => {\n if (dialogRef && dialogRef.open) {\n dialogRef.close();\n if (resolve)\n resolve(value);\n if (onClose)\n onClose();\n }\n });\n }\n // --- Toast ---\n /** Remove dead toasts (dismissed or animation-finished) from container. */\n function clearDeadToasts(container) {\n for (const child of [...container.children]) {\n const el = child;\n if (el.hasAttribute('data-dismissing')) {\n el.remove();\n }\n }\n }\n function toast(options) {\n const container = ensureToastContainer();\n // Clean up dead toasts before adding a new one\n clearDeadToasts(container);\n const el = document.createElement('div');\n el.setAttribute('data-overlay-toast', '');\n const isConfirmation = !!(options.confirm || options.reject);\n const timeout = isConfirmation ? 0 : (options.timeout ?? 0);\n if (timeout === 0) {\n el.setAttribute('data-toast-manual', '');\n }\n else {\n el.style.setProperty('--overlay-toast-duration', `${timeout}ms`);\n }\n // Confirmation promise plumbing\n let confirmResolve;\n let confirmPromise;\n if (isConfirmation) {\n const resolvers = Promise.withResolvers();\n confirmResolve = resolvers.resolve;\n confirmPromise = resolvers.promise;\n }\n const onConfirm = confirmResolve\n ? () => { confirmResolve(true); dismiss(); }\n : undefined;\n const onReject = confirmResolve\n ? () => { confirmResolve(false); dismiss(); }\n : undefined;\n // Render content\n if (options.render) {\n // Escape hatch: caller takes full control\n options.render(el);\n }\n else {\n // Template-based or fallback\n const template = document.querySelector('#overlay-toast');\n if (template) {\n const clone = template.content.cloneNode(true);\n el.appendChild(clone);\n fillTemplate(el, options, onConfirm, onReject);\n }\n else {\n buildFallback(el, options, onConfirm, onReject);\n }\n }\n container.appendChild(el);\n const id = performance.now();\n let dismissed = false;\n function dismiss() {\n if (dismissed)\n return;\n dismissed = true;\n el.setAttribute('data-dismissing', '');\n }\n function update(opts) {\n if (opts.message !== undefined) {\n const msgEl = el.querySelector('[data-toast-message]');\n if (msgEl)\n msgEl.textContent = opts.message;\n }\n if (opts.type !== undefined) {\n el.setAttribute('data-toast-type', opts.type);\n }\n if (opts.timeout !== undefined) {\n el.style.setProperty('--overlay-toast-duration', `${opts.timeout}ms`);\n // Restart animation by removing and re-adding the manual flag\n if (opts.timeout === 0) {\n el.setAttribute('data-toast-manual', '');\n }\n else {\n el.removeAttribute('data-toast-manual');\n }\n }\n }\n const handle = { id, dismiss, update };\n // For confirmation toasts, return a handle that is also PromiseLike<boolean>\n if (confirmPromise) {\n handle.then = confirmPromise.then.bind(confirmPromise);\n }\n return handle;\n }\n // Attach convenience methods\n toast.success = (message, timeout) => toast({ message, type: 'success', timeout: timeout ?? 5000 });\n toast.error = (message, timeout) => toast({ message, type: 'error', timeout: timeout ?? 5000 });\n toast.warning = (message, timeout) => toast({ message, type: 'warning', timeout: timeout ?? 5000 });\n toast.info = (message, timeout) => toast({ message, type: 'info', timeout: timeout ?? 5000 });\n // --- Popover ---\n function popover(options) {\n const el = ensurePopover();\n // Last wins: hide current popover if showing\n cleanupPopoverAnchorObserver();\n try {\n el.hidePopover();\n }\n catch {\n // Not shown — ignore\n }\n el.removeAttribute('data-dismissing');\n el.innerHTML = '';\n options.render(el);\n // Anchor positioning\n if (supportsAnchor) {\n const anchorName = '--overlay-anchor';\n options.anchor.style.setProperty('anchor-name', anchorName);\n el.style.setProperty('position-anchor', anchorName);\n el.style.removeProperty('top');\n el.style.removeProperty('left');\n }\n else {\n const rect = options.anchor.getBoundingClientRect();\n el.style.top = `${rect.bottom + globalThis.scrollY}px`;\n el.style.left = `${rect.left + globalThis.scrollX}px`;\n el.style.position = 'absolute';\n }\n el.showPopover();\n // Watch for anchor disconnect\n watchAnchorDisconnect(options.anchor);\n }\n function watchAnchorDisconnect(anchor) {\n cleanupPopoverAnchorObserver();\n const parent = anchor.parentNode;\n if (!parent) {\n closePopover();\n return;\n }\n popoverAnchorObserver = new MutationObserver(() => {\n if (!document.contains(anchor)) {\n closePopover();\n }\n });\n popoverAnchorObserver.observe(parent, { childList: true });\n }\n /** Hide popover instantly without dismiss animation. */\n function hidePopoverImmediate() {\n cleanupPopoverAnchorObserver();\n if (!popoverEl)\n return;\n try {\n popoverEl.hidePopover();\n }\n catch {\n // Not shown — ignore\n }\n popoverEl.removeAttribute('data-dismissing');\n }\n function cleanupPopoverAnchorObserver() {\n if (popoverAnchorObserver) {\n popoverAnchorObserver.disconnect();\n popoverAnchorObserver = null;\n }\n }\n function closePopover() {\n cleanupPopoverAnchorObserver();\n if (!popoverEl)\n return;\n // Check if popover is showing via matches(':popover-open')\n let isOpen;\n try {\n isOpen = popoverEl.matches(':popover-open');\n }\n catch {\n // :popover-open may not be supported — fall back\n isOpen = popoverEl.hasAttribute('popover') && popoverEl.style.display !== 'none';\n }\n if (!isOpen)\n return;\n animateDismiss(popoverEl, () => {\n try {\n popoverEl.hidePopover();\n }\n catch {\n // Already hidden\n }\n });\n }\n // --- Dismiss all ---\n function dismissAll() {\n // Close programmatic modal\n if (dialog && dialog.open) {\n const resolve = modalResolve;\n const onClose = modalOnClose;\n modalResolve = null;\n modalOnClose = undefined;\n dialog.removeAttribute('data-dismissing');\n dialog.close();\n if (resolve)\n resolve(undefined);\n if (onClose)\n onClose();\n }\n // Hide programmatic popover\n hidePopoverImmediate();\n // Dismiss all toasts via CSS\n if (toastContainer) {\n for (const child of toastContainer.children) {\n child.setAttribute('data-dismissing', '');\n }\n }\n // Close declarative popovers found in the DOM\n try {\n for (const el of document.querySelectorAll(':popover-open')) {\n el.hidePopover();\n }\n }\n catch {\n // :popover-open not supported\n }\n // Close declarative dialogs found in the DOM (skip our own)\n for (const el of document.querySelectorAll('dialog[open]')) {\n if (el !== dialog)\n el.close();\n }\n }\n return {\n modal,\n closeModal,\n toast: toast,\n popover,\n closePopover,\n dismissAll,\n };\n}\n//# sourceMappingURL=overlay.service.js.map",
|
|
31
31
|
"/**\n * Built-in Page Title Widget\n *\n * Sets document.title from .page.html and .page.md files without needing\n * a .page.ts component. Renders no visible output.\n *\n * Usage in .page.html:\n * <widget-page-title title=\"About Us\"></widget-page-title>\n */\nimport { WidgetComponent } from \"../../core/component/widget.component.js\";\nexport class PageTitleWidget extends WidgetComponent {\n name = 'page-title';\n getData(args) {\n return Promise.resolve({ title: args.params.title });\n }\n renderHTML(args) {\n const title = args.data?.title ?? args.params.title;\n if (title && typeof document !== 'undefined') {\n document.title = title;\n }\n return '';\n }\n renderMarkdown(_args) {\n return '';\n }\n validateParams(params) {\n if (!params.title || typeof params.title !== 'string') {\n return 'page-title widget requires a \"title\" string param';\n }\n return undefined;\n }\n}\n//# sourceMappingURL=page-title.widget.js.map",
|
|
32
32
|
"/**\n * Built-in Breadcrumb Widget\n *\n * Renders breadcrumb navigation from the current URL path.\n * Uses /html/ prefix for links (content-first routing convention).\n *\n * Usage in .page.html:\n * <widget-breadcrumb></widget-breadcrumb>\n * <widget-breadcrumb separator=\" / \" class=\"my-breadcrumbs\"></widget-breadcrumb>\n *\n * Usage in .page.md:\n * ```widget:breadcrumb\n * {}\n * ```\n */\nimport { WidgetComponent } from \"../../core/component/widget.component.js\";\nimport { escapeHtml } from \"../../core/util/html.util.js\";\nconst DEFAULT_HTML_SEPARATOR = ' \\u203A ';\nconst DEFAULT_MD_SEPARATOR = ' > ';\nexport class BreadcrumbWidget extends WidgetComponent {\n name = 'breadcrumb';\n getData(args) {\n const pathname = args.context.pathname || '/';\n const parts = pathname.split('/').filter(Boolean);\n const segments = [\n { label: 'Home', href: '/' },\n ];\n let accumulated = '';\n for (const part of parts) {\n accumulated += '/' + part;\n segments.push({\n label: part.charAt(0).toUpperCase() + part.slice(1).replace(/-/g, ' '),\n href: accumulated,\n });\n }\n return Promise.resolve({ segments });\n }\n renderHTML(args) {\n if (!args.data || args.data.segments.length === 0)\n return '';\n const sep = args.params.separator ?? DEFAULT_HTML_SEPARATOR;\n const segments = args.data.segments;\n const items = segments.map((seg, i) => {\n const escaped = escapeHtml(seg.label);\n if (i === segments.length - 1) {\n return `<span aria-current=\"page\">${escaped}</span>`;\n }\n return `<a href=\"${escapeHtml(seg.href)}\">${escaped}</a>`;\n });\n return `<nav aria-label=\"Breadcrumb\">${items.join(escapeHtml(sep))}</nav>`;\n }\n renderMarkdown(args) {\n if (!args.data || args.data.segments.length === 0)\n return '';\n const sep = args.params.separator ?? DEFAULT_MD_SEPARATOR;\n return args.data.segments\n .map((seg, i, arr) => i === arr.length - 1 ? `**${seg.label}**` : `[${seg.label}](${seg.href})`)\n .join(sep);\n }\n}\n//# sourceMappingURL=breadcrumb.widget.js.map",
|
|
33
33
|
"/**\n * SPA (Browser) Module\n *\n * Everything needed for the browser bundle:\n * - EmrouteApp: Navigation API glue wired to an EmrouteServer\n * - Custom elements for rendering and hydrating SSR islands\n * - Widget registry (built-in widgets are opt-in)\n */\nimport { RouterSlot } from \"../../element/slot.element.js\";\nimport { MarkdownElement } from \"../../element/markdown.element.js\";\nimport { ComponentElement } from \"../../element/component.element.js\";\nimport { WidgetRegistry } from \"../../../core/widget/widget.registry.js\";\nexport { bootEmrouteApp, createEmrouteApp, EmrouteApp } from \"./emroute.app.js\";\nexport { ComponentElement, MarkdownElement, RouterSlot, WidgetRegistry };\n// Re-export base classes and types for consumer code (pages, widgets)\nexport { PageComponent } from \"../../../core/component/page.component.js\";\nexport { WidgetComponent } from \"../../../core/component/widget.component.js\";\nexport { Component } from \"../../../core/component/abstract.component.js\";\nexport { RouteTrie } from \"../../../core/router/route.trie.js\";\nexport { DEFAULT_BASE_PATH } from \"../../../core/server/emroute.server.js\";\nexport { escapeHtml, scopeWidgetCss } from \"../../../core/util/html.util.js\";\nexport { setLogger } from \"../../../core/type/logger.type.js\";\n// Register core custom elements in the browser\nif (globalThis.customElements) {\n if (!customElements.get('router-slot'))\n customElements.define('router-slot', RouterSlot);\n if (!customElements.get('mark-down'))\n customElements.define('mark-down', MarkdownElement);\n}\n// Overlay API (tree-shakeable - only bundled if imported)\nexport { createOverlayService } from \"../../overlay/overlay.service.js\";\n// Optional: Built-in widgets (tree-shakeable - only bundled if imported)\nexport { PageTitleWidget } from \"../../widget/page-title.widget.js\";\nexport { BreadcrumbWidget } from \"../../widget/breadcrumb.widget.js\";\n//# sourceMappingURL=mod.js.map"
|
|
34
34
|
],
|
|
35
|
-
"mappings": "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",
|
|
36
|
-
"debugId": "
|
|
35
|
+
"mappings": "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",
|
|
36
|
+
"debugId": "BD93EBE5532178BB64756E2164756E21",
|
|
37
37
|
"names": []
|
|
38
38
|
}
|