aberdeen 1.17.0 → 2.0.0
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/dist/src/aberdeen.d.ts +928 -944
- package/dist/src/aberdeen.js +1693 -1704
- package/dist/src/aberdeen.js.map +3 -3
- package/dist/src/index.d.ts +12 -0
- package/dist/src/index.js +11 -0
- package/dist/src/index.js.map +10 -0
- package/dist/src/prediction.d.ts +7 -4
- package/dist/src/prediction.js +18 -23
- package/dist/src/prediction.js.map +3 -3
- package/dist/src/route.d.ts +112 -99
- package/dist/src/route.js +254 -254
- package/dist/src/route.js.map +3 -3
- package/dist/src/server-dom.d.ts +158 -0
- package/dist/src/server-dom.js +458 -0
- package/dist/src/server-dom.js.map +10 -0
- package/dist/src/server.d.ts +55 -0
- package/dist/src/server.js +25 -0
- package/dist/src/server.js.map +10 -0
- package/dist/src/transitions.js +7 -4
- package/dist/src/transitions.js.map +3 -3
- package/dist/tests/environment.d.ts +24 -0
- package/dist/tests/{fakedom.js → environment.js} +239 -288
- package/dist/tests/environment.js.map +11 -0
- package/dist/tests/helpers.d.ts +15 -3
- package/dist/tests/helpers.js +277 -306
- package/dist/tests/helpers.js.map +6 -5
- package/dist-docs/Tutorial/index.html +30 -30
- package/dist-docs/aberdeen/Aberdeen/index.html +350 -0
- package/dist-docs/aberdeen/InitOptions/index.html +4 -0
- package/dist-docs/aberdeen/KeyToString/index.html +2 -0
- package/dist-docs/aberdeen/PromiseProxy/index.html +6 -6
- package/dist-docs/aberdeen/SortKeyType/index.html +2 -0
- package/dist-docs/aberdeen/TargetType/index.html +2 -0
- package/dist-docs/aberdeen/ValueRef/index.html +2 -0
- package/dist-docs/aberdeen/WindowLike/index.html +5 -0
- package/dist-docs/aberdeen/{clone → createA}/index.html +10 -5
- package/dist-docs/aberdeen/index.html +13 -54
- package/dist-docs/assets/aberdeen/aberdeen.d.ts +928 -944
- package/dist-docs/assets/aberdeen/aberdeen.js +1693 -1704
- package/dist-docs/assets/aberdeen/aberdeen.js.map +3 -3
- package/dist-docs/assets/aberdeen/index.d.ts +12 -0
- package/dist-docs/assets/aberdeen/index.js +11 -0
- package/dist-docs/assets/aberdeen/index.js.map +10 -0
- package/dist-docs/assets/aberdeen/prediction.d.ts +7 -4
- package/dist-docs/assets/aberdeen/prediction.js +18 -23
- package/dist-docs/assets/aberdeen/prediction.js.map +3 -3
- package/dist-docs/assets/aberdeen/route.d.ts +112 -99
- package/dist-docs/assets/aberdeen/route.js +254 -254
- package/dist-docs/assets/aberdeen/route.js.map +3 -3
- package/dist-docs/assets/aberdeen/server-dom.d.ts +158 -0
- package/dist-docs/assets/aberdeen/server-dom.js +458 -0
- package/dist-docs/assets/aberdeen/server-dom.js.map +10 -0
- package/dist-docs/assets/aberdeen/server.d.ts +55 -0
- package/dist-docs/assets/aberdeen/server.js +25 -0
- package/dist-docs/assets/aberdeen/server.js.map +10 -0
- package/dist-docs/assets/aberdeen/transitions.js +7 -4
- package/dist-docs/assets/aberdeen/transitions.js.map +3 -3
- package/dist-docs/assets/navigation.js +1 -1
- package/dist-docs/assets/search.js +1 -1
- package/dist-docs/dispatcher/Dispatcher/index.html +5 -6
- package/dist-docs/dispatcher/MATCH_FAILED/index.html +2 -2
- package/dist-docs/dispatcher/MATCH_REST/index.html +2 -2
- package/dist-docs/dispatcher/index.html +2 -2
- package/dist-docs/hierarchy.html +1 -1
- package/dist-docs/index-1/index.html +2 -0
- package/dist-docs/index.html +2 -2
- package/dist-docs/media/CHANGELOG.md +14 -2
- package/dist-docs/modules.html +1 -1
- package/dist-docs/prediction/applyCanon/index.html +4 -3
- package/dist-docs/prediction/applyPrediction/index.html +4 -3
- package/dist-docs/prediction/index.html +2 -2
- package/dist-docs/route/Route/index.html +9 -9
- package/dist-docs/route/RouteApi/index.html +60 -0
- package/dist-docs/route/index.html +6 -15
- package/dist-docs/route/init/index.html +5 -0
- package/dist-docs/server/RenderToStringOptions/index.html +6 -0
- package/dist-docs/server/RenderToStringResult/index.html +6 -0
- package/dist-docs/server/index.html +4 -0
- package/dist-docs/server/renderToString/index.html +6 -0
- package/dist-docs/sitemap.xml +51 -155
- package/dist-docs/transitions/grow/index.html +2 -2
- package/dist-docs/transitions/index.html +2 -2
- package/dist-docs/transitions/shrink/index.html +2 -2
- package/package.json +17 -7
- package/skill/SKILL.md +28 -28
- package/skill/aberdeen.md +471 -3448
- package/skill/dispatcher.md +6 -16
- package/skill/prediction.md +17 -5
- package/skill/route.md +95 -77
- package/skill/transitions.md +3 -3
- package/src/aberdeen.ts +1226 -740
- package/src/index.ts +13 -0
- package/src/prediction.ts +25 -24
- package/src/route.ts +192 -142
- package/src/server-dom.ts +508 -0
- package/src/server.ts +74 -0
- package/src/transitions.ts +9 -3
- package/dist/tests/fakedom.d.ts +0 -9
- package/dist/tests/fakedom.js.map +0 -10
- package/dist-docs/aberdeen/A/index.html +0 -115
- package/dist-docs/aberdeen/CUSTOM_DUMP/index.html +0 -7
- package/dist-docs/aberdeen/NO_COPY/index.html +0 -2
- package/dist-docs/aberdeen/OPAQUE/index.html +0 -12
- package/dist-docs/aberdeen/clean/index.html +0 -11
- package/dist-docs/aberdeen/copy/index.html +0 -22
- package/dist-docs/aberdeen/count/index.html +0 -7
- package/dist-docs/aberdeen/cssVars/index.html +0 -11
- package/dist-docs/aberdeen/darkMode/index.html +0 -9
- package/dist-docs/aberdeen/default/index.html +0 -341
- package/dist-docs/aberdeen/derive/index.html +0 -18
- package/dist-docs/aberdeen/disableCreateDestroy/index.html +0 -6
- package/dist-docs/aberdeen/dump/index.html +0 -11
- package/dist-docs/aberdeen/insertCss/index.html +0 -30
- package/dist-docs/aberdeen/insertGlobalCss/index.html +0 -19
- package/dist-docs/aberdeen/invertString/index.html +0 -13
- package/dist-docs/aberdeen/isEmpty/index.html +0 -12
- package/dist-docs/aberdeen/map/index.html +0 -26
- package/dist-docs/aberdeen/merge/index.html +0 -11
- package/dist-docs/aberdeen/mount/index.html +0 -17
- package/dist-docs/aberdeen/multiMap/index.html +0 -28
- package/dist-docs/aberdeen/onEach/index.html +0 -19
- package/dist-docs/aberdeen/partition/index.html +0 -36
- package/dist-docs/aberdeen/peek/index.html +0 -40
- package/dist-docs/aberdeen/proxy/index.html +0 -35
- package/dist-docs/aberdeen/ref/index.html +0 -13
- package/dist-docs/aberdeen/runQueue/index.html +0 -13
- package/dist-docs/aberdeen/setErrorHandler/index.html +0 -16
- package/dist-docs/aberdeen/setSpacingCssVars/index.html +0 -8
- package/dist-docs/aberdeen/unmountAll/index.html +0 -5
- package/dist-docs/aberdeen/unproxy/index.html +0 -11
- package/dist-docs/route/back/index.html +0 -4
- package/dist-docs/route/current/index.html +0 -2
- package/dist-docs/route/go/index.html +0 -14
- package/dist-docs/route/interceptLinks/index.html +0 -8
- package/dist-docs/route/matchCurrent/index.html +0 -10
- package/dist-docs/route/persistScroll/index.html +0 -6
- package/dist-docs/route/push/index.html +0 -6
- package/dist-docs/route/setLog/index.html +0 -3
- package/dist-docs/route/up/index.html +0 -5
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../tests/environment.ts", "../../src/server-dom.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"// A self-contained, fake browser environment for tests. The DOM classes themselves live in\n// src/server-dom.ts (shared with the `aberdeen/server` SSR entry); this file adds the test-only\n// pieces — fake timers, media-query presets and history/location simulation — and ties them to\n// a fresh Aberdeen instance.\n//\n// `createEnvironment()` returns a brand-new, isolated environment (its own window, document,\n// timers and Aberdeen instance) so each test starts from a clean slate without any cleanup.\nimport { createA } from \"aberdeen\";\nimport type { Aberdeen } from \"aberdeen\";\nimport { Node, Element, TextNode, createDocument, getCounts, resetCounts } from \"../src/server-dom.js\";\n\nexport { Node, Element, TextNode };\n\nexport interface TestEnvironment {\n A: Aberdeen;\n window: any;\n document: any;\n location: any;\n history: any;\n /** The fake `setTimeout` of this environment (controlled by `passTime`). */\n setTimeout: (func: () => void, time?: number) => void;\n /** Fast-forward this environment's fake time, firing scheduled timers/microtasks. */\n passTime: (ms?: number) => Promise<void>;\n /** Preset a media-query match value (and notify listeners if already created). */\n setMediaQuery: (query: string, matches: boolean) => void;\n /** DOM operation counters (shared module-level, reset when the environment is created). */\n getCounts: () => { new: number; changed: number };\n resetCounts: () => void;\n}\n\nconst realSetTimeout = globalThis.setTimeout;\nconst realClearTimeout = globalThis.clearTimeout;\n\n/** Create a fresh, fully isolated fake-browser environment with its own Aberdeen instance. */\nexport function createEnvironment(): TestEnvironment {\n // --- Fake timers (per environment) -------------------------------------------------------\n type TimeoutItem = { func: () => void | Promise<void>; time: number; realId: ReturnType<typeof realSetTimeout> };\n let timeouts: TimeoutItem[] = [];\n let currentTime = 0;\n let deferredErrors: any[] = [];\n\n function fireItem(item: TimeoutItem) {\n const idx = timeouts.indexOf(item);\n if (idx < 0) return; // Already fired by passTime or another path\n timeouts.splice(idx, 1);\n if (item.time > currentTime) currentTime = item.time;\n item.func();\n }\n const setTimeout = function (func: () => void, time: number = 0): void {\n const item: TimeoutItem = { func, time: time + currentTime, realId: undefined! };\n item.realId = realSetTimeout(() => {\n try { fireItem(item); } catch (e) { deferredErrors.push(e); }\n }, time);\n timeouts.push(item);\n };\n const queueMicrotask = function (func: () => void): void {\n const item: TimeoutItem = { func, time: 0, realId: undefined! };\n item.realId = realSetTimeout(() => {\n try { fireItem(item); } catch (e) { deferredErrors.push(e); }\n }, 0);\n timeouts.push(item);\n };\n\n // Fast-forward fake time, firing all timeouts up to `ms` ms ahead (default 0).\n // Awaits async timer callbacks so microtasks and chained timers complete too.\n // Rethrows any errors from timeouts that fired via real timers in the background.\n const passTime = async function (ms: number = 0): Promise<void> {\n let targetTime = currentTime + ms;\n while (true) {\n await new Promise(resolve => realSetTimeout(resolve, 0));\n\n if (deferredErrors.length) {\n const err = deferredErrors.shift();\n throw err;\n }\n\n if (!timeouts.length) {\n // Async I/O (e.g. database commits) may still be in flight, about to schedule\n // new timeouts. Retry a few real event-loop ticks before giving up.\n let settled = false;\n for (let r = 0; r < 5 && !settled; r++) {\n await new Promise(resolve => realSetTimeout(resolve, 0));\n settled = timeouts.length > 0;\n }\n if (!settled) break;\n }\n\n let smallestIdx = 0;\n for (let idx = 1; idx < timeouts.length; idx++) {\n if (timeouts[idx].time < timeouts[smallestIdx].time) smallestIdx = idx;\n }\n let item = timeouts[smallestIdx];\n if (item.time > targetTime) break;\n\n timeouts.splice(smallestIdx, 1);\n realClearTimeout(item.realId);\n if (item.time > currentTime) currentTime = item.time;\n await item.func();\n }\n currentTime = targetTime;\n };\n\n // --- Media queries (per environment) -----------------------------------------------------\n const mediaQueries = new Map<string, MediaQueryList>();\n const mediaQueryPresets = new Map<string, boolean>();\n class MediaQueryList {\n matches: boolean;\n media: string;\n private listeners: Set<(event: any) => void> = new Set();\n constructor(query: string) {\n this.media = query;\n const preset = mediaQueryPresets.get(query);\n this.matches = preset !== undefined ? preset : (query.includes('dark') ? false : true);\n }\n addEventListener(type: string, listener: (event: any) => void) { if (type === 'change') this.listeners.add(listener); }\n removeEventListener(type: string, listener: (event: any) => void) { if (type === 'change') this.listeners.delete(listener); }\n _trigger(matches: boolean) {\n this.matches = matches;\n for (const listener of this.listeners) listener({ matches, media: this.media });\n }\n }\n function setMediaQuery(query: string, matches: boolean) {\n mediaQueryPresets.set(query, matches);\n if (mediaQueries.has(query)) mediaQueries.get(query)!._trigger(matches);\n }\n\n // --- Location / history / window (per environment) ---------------------------------------\n class FakeLocation {\n private _href: string = 'http://localhost/';\n get href(): string { return this._href; }\n set href(value: string) {\n if (value.startsWith('/')) {\n const currentUrl = new URL(this._href);\n this._href = `${currentUrl.protocol}//${currentUrl.host}${value}`;\n } else this._href = value;\n }\n get host(): string { return new URL(this._href).host; }\n get pathname(): string { return new URL(this._href).pathname; }\n set pathname(value: string) { const u = new URL(this._href); u.pathname = value; this._href = u.href; }\n get search(): string { return new URL(this._href).search; }\n set search(value: string) { const u = new URL(this._href); u.search = value; this._href = u.href; }\n get hash(): string { return new URL(this._href).hash; }\n set hash(value: string) { const u = new URL(this._href); u.hash = value; this._href = u.href; }\n }\n class FakeHistory {\n private _state: any = null;\n private _entries: Array<{ url: string, state: any }> = [{ url: 'http://localhost/', state: null }];\n private _index: number = 0;\n get state(): any { return this._state; }\n pushState(state: any, _title: string, url: string): void {\n this._entries = this._entries.slice(0, this._index + 1);\n this._entries.push({ url, state });\n this._index = this._entries.length - 1;\n this._state = state;\n location.href = url;\n }\n replaceState(state: any, _title: string, url: string): void {\n this._entries[this._index] = { url, state };\n this._state = state;\n location.href = url;\n }\n go(delta: number): void {\n const newIndex = this._index + delta;\n if (newIndex >= 0 && newIndex < this._entries.length) {\n this._index = newIndex;\n const entry = this._entries[this._index];\n this._state = entry.state;\n location.href = entry.url;\n setTimeout(() => window.dispatchEvent({\n type: 'popstate', state: this._state, target: window,\n preventDefault: () => {}, stopPropagation: () => {},\n }), 0);\n }\n }\n back(): void { this.go(-1); }\n forward(): void { this.go(1); }\n }\n class FakeWindow {\n private _listeners: Record<string, Set<Function>> = {};\n addEventListener(type: string, listener: Function): void { (this._listeners[type] ||= new Set()).add(listener); }\n removeEventListener(type: string, listener: Function): void { this._listeners[type]?.delete(listener); }\n dispatchEvent(event: any): void { this._listeners[event.type]?.forEach(l => l.call(this, event)); }\n matchMedia(query: string): MediaQueryList {\n if (!mediaQueries.has(query)) mediaQueries.set(query, new MediaQueryList(query));\n return mediaQueries.get(query)!;\n }\n }\n\n const location = new FakeLocation();\n const history = new FakeHistory();\n const window: any = new FakeWindow();\n const getComputedStyle = (el: Element) => el._style;\n\n // --- DOM + Aberdeen instance -------------------------------------------------------------\n const document = createDocument();\n Object.assign(window, { document, Node, Element, TextNode, location, history, setTimeout, queueMicrotask, getComputedStyle });\n document.defaultView = window;\n\n const A = createA(window);\n resetCounts(); // Start counting DOM ops from a clean slate for this environment.\n\n return { A, window, document, location, history, setTimeout, passTime, setMediaQuery, getCounts, resetCounts };\n}\n",
|
|
6
|
+
"/**\n * A minimal, dependency-free DOM implementation that Aberdeen can render into when no\n * real browser DOM is available (server-side rendering, automated tests).\n *\n * It implements just enough of the `Node`/`Element`/`Text` interfaces for Aberdeen's\n * renderer, plus two serializers:\n * - {@link serializeHtml} produces real HTML (used for SSR output).\n * - `Element.toString()` produces a terse, test-oriented representation (used by the\n * test suite's `assertBody`).\n *\n * The same classes back both the test fake-DOM (`tests/fakedom.ts`) and the public\n * `aberdeen/server` entry point, so there is a single source of truth for DOM behaviour.\n */\n\n// ---------------------------------------------------------------------------\n// Instrumentation (used by the test suite to count DOM operations)\n// ---------------------------------------------------------------------------\n\nlet newCount: number = 0, changeCount: number = 0;\nexport const resetCounts = function(): void { newCount = changeCount = 0; };\nexport const getCounts = function(): { new: number, changed: number } {\n return { new: newCount, changed: changeCount };\n};\n\n// ---------------------------------------------------------------------------\n// DOM node classes\n// ---------------------------------------------------------------------------\n\nexport class Node {\n parentNode: Element | null = null;\n childNodes: Node[] = [];\n /** The document that created this node; its `defaultView` is the owning window. */\n ownerDocument: any = null;\n\n get nextSibling(): Node | undefined {\n return this.getSibling(+1);\n }\n\n get previousSibling(): Node | undefined {\n return this.getSibling(-1);\n }\n\n getSibling(delta: number): Node | undefined {\n if (!this.parentNode) return undefined;\n let siblings = this.parentNode.childNodes;\n let idx = siblings.indexOf(this);\n if (idx < 0) throw new Error(\"not part of siblings!?\");\n return siblings[idx + delta];\n }\n}\n\ntype ClassList = {\n add: (...names: string[]) => void;\n remove: (...names: string[]) => void;\n toggle: (name: string, force?: boolean) => void;\n contains: (name: string) => boolean;\n};\n\nexport class Element extends Node {\n tagName: string;\n namespaceURI?: string;\n _style: Record<string, string> = {};\n attrs: Record<string, string> = {};\n events: Record<string, Set<Function>> = {};\n _classList?: ClassList;\n _scrollTop?: number;\n _scrollLeft?: number;\n\n constructor(tag: string, namespaceURI?: string) {\n super();\n this.tagName = tag;\n this.namespaceURI = namespaceURI;\n this.childNodes = [];\n newCount++;\n }\n\n appendChild(node: Node): void {\n this.insertBefore(node, null);\n }\n\n insertBefore(node: Node, ref: Node | null): void {\n if (node.parentNode) node.parentNode.removeChild(node);\n else changeCount++;\n node.parentNode = this;\n if (ref) {\n let idx = this.childNodes.indexOf(ref);\n if (idx < 0) throw new Error(\"non-existing ref node\");\n this.childNodes.splice(idx, 0, node);\n } else {\n this.childNodes.push(node);\n }\n }\n\n removeChild(node: Node): void {\n let idx = this.childNodes.indexOf(node);\n if (idx < 0) throw new Error(\"no such child\");\n this.childNodes.splice(idx, 1);\n node.parentNode = null;\n changeCount++;\n }\n\n remove(): void {\n this.parentNode?.removeChild(this);\n }\n\n replaceChild(newNode: Node, oldNode: Node): void {\n this.insertBefore(newNode, oldNode);\n this.removeChild(oldNode);\n }\n\n setAttribute(k: string, v: any): void {\n if (v == null || v === '') delete this.attrs[k];\n else this.attrs[k] = '' + v;\n changeCount++;\n }\n\n getAttribute(k: string): string | undefined {\n return this.attrs[k];\n }\n\n removeAttribute(k: string): void {\n delete this.attrs[k];\n changeCount++;\n }\n\n get classList(): ClassList {\n return this._classList || (this._classList = {\n add: (...names: string[]) => {\n let set = this._getClassSet();\n for(const name of names) set.add(name);\n this._setClassSet(set);\n },\n remove: (...names: string[]) => {\n let set = this._getClassSet();\n for(const name of names) set.delete(name);\n this._setClassSet(set);\n },\n toggle: (name: string, force?: boolean) => {\n if (force === true || (force !== false && !this._getClassSet().has(name))) this._classList!.add(name);\n else this._classList!.remove(name);\n },\n contains: (name: string) => this._getClassSet().has(name),\n });\n }\n\n get parentElement(): Element | undefined {\n if (this.parentNode instanceof Element) return this.parentNode;\n return undefined;\n }\n\n _getClassSet(): Set<string> {\n return new Set(this.attrs.class ? this.attrs.class.split(' ') : []);\n }\n\n _setClassSet(map: Set<string>): void {\n this.setAttribute('class', Array.from(map).sort().join(' ') || undefined);\n }\n\n get firstChild(): Node | undefined {\n return this.childNodes[0];\n }\n\n get lastChild(): Node | undefined {\n return this.childNodes[this.childNodes.length - 1];\n }\n\n set textContent(text: string) {\n this.childNodes = [new TextNode(text)];\n }\n\n get textContent() {\n let text = '';\n for(let child of this.childNodes) {\n if (child instanceof TextNode) {\n text += child.textContent;\n }\n }\n return text;\n }\n\n querySelectorAll(selector: string): Element[] {\n const results: Element[] = [];\n this._querySelectorAllRecursive(selector, results);\n return results;\n }\n\n private _querySelectorAllRecursive(selector: string, results: Element[]): void {\n for (const child of this.childNodes) {\n if (child instanceof Element) {\n if (child.tagName === selector) {\n results.push(child);\n }\n child._querySelectorAllRecursive(selector, results);\n }\n }\n }\n\n set innerHTML(html: string) {\n this.childNodes = [];\n if (html) {\n let n = new Element('fake-emulated-html');\n n.textContent = html;\n this.appendChild(n);\n }\n }\n\n set style(val: string) {\n if (val !== '') throw new Error(\"non-empty style string cannot be emulated\");\n this._style = {};\n changeCount++;\n }\n\n get style(): Record<string, string> {\n for(let k in this._style) {\n if (this._style[k] === '') delete this._style[k];\n }\n return this._style;\n }\n\n set className(v: string) {\n this.attrs.class = v;\n changeCount++;\n }\n\n get offsetHeight(): number {\n return 20;\n }\n\n get offsetWidth(): number {\n return 200;\n }\n\n get scrollTop(): number {\n return this._scrollTop || 0;\n }\n\n set scrollTop(value: number) {\n this._scrollTop = value;\n }\n\n get scrollLeft(): number {\n return this._scrollLeft || 0;\n }\n\n set scrollLeft(value: number) {\n this._scrollLeft = value;\n }\n\n /**\n * Terse, test-oriented serialization (NOT valid HTML). Shows attributes (`=`),\n * DOM properties (`->`), styles (`:`) and nested children. Used by `assertBody`.\n */\n toString(): string {\n let arr: string[] = [];\n for(let [symbol, items, toKebab] of [['=', this.attrs, false], ['->', this, false], [':', this.style, true]] as [string, Record<string, any>, boolean][]) {\n for(let key of Object.keys(items).sort()) {\n const outputKey = toKebab ? key.replace(/[A-Z]/g, l => `-${l.toLowerCase()}`) : key;\n const prefix = outputKey + symbol;\n if (key[0] === '_' || IGNORE_OUTPUT.has(prefix)) continue;\n let value = '' + items[key];\n if (value.indexOf(\" \") >= 0 || value.indexOf(\"}\") >= 0 || !value.length) value = JSON.stringify(value);\n arr.push(prefix + value);\n }\n }\n for(let child of this.childNodes) arr.push(child.toString());\n\n const cls = this.attrs['class'] ? \".\" + this.attrs['class'].replace(/ /g, '.') : '';\n return this.tagName + cls + (arr.length ? `{${arr.join(' ')}}` : '');\n }\n\n addEventListener(name: string, func: Function): void {\n this.events[name] = this.events[name] || new Set();\n this.events[name].add(func);\n changeCount++;\n }\n\n removeEventListener(name: string, func: Function): void {\n if (this.events[name]) {\n if (this.events[name].delete(func)) {\n changeCount++;\n }\n }\n }\n\n event(info: string | { type: string; [key: string]: any }): void {\n if (typeof info === 'string') info = {type: info};\n let type = info.type;\n info.target = this;\n info.preventDefault = function() {};\n info.stopPropagation = function() { info.stopped = true; };\n let node: Element | null = this;\n while(node && !info.stopped) {\n let funcs = node.events[type];\n if (funcs) {\n for(let func of funcs) {\n func.call(node, info);\n }\n }\n node = node.parentNode;\n }\n }\n\n getElementById(id: string): Element | undefined {\n if (this.attrs.id === id) return this;\n for(let child of this.childNodes) {\n if (child instanceof Element) {\n let el = child.getElementById(id);\n if (el) return el;\n }\n }\n return undefined;\n }\n}\n\nconst IGNORE_OUTPUT = new Set(\"tagName-> attrs-> events-> childNodes-> parentNode-> class= namespaceURI-> ownerDocument->\".split(\" \"));\n\nexport class TextNode extends Node {\n textContent: string;\n\n constructor(textContent: string) {\n super();\n this.textContent = '' + textContent;\n newCount++;\n }\n\n toString(): string {\n return JSON.stringify(this.textContent);\n }\n\n remove() {\n this.parentNode?.removeChild(this);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Document factory\n// ---------------------------------------------------------------------------\n\nexport interface ServerDocument {\n createElement(tag: string): Element;\n createElementNS(namespaceURI: string, tag: string): Element;\n createTextNode(text: string): TextNode;\n head: Element;\n body: Element;\n /** The owning window, set by {@link createWindow}. */\n defaultView: any;\n}\n\nconst XHTML_NS = 'http://www.w3.org/1999/xhtml';\n\n/** Create a fresh, isolated document. Use one per SSR request to avoid cross-request state. */\nexport function createDocument(): ServerDocument {\n const doc: ServerDocument = {\n createElement: (tag: string) => own(new Element(tag, XHTML_NS)),\n createElementNS: (namespaceURI: string, tag: string) => own(new Element(tag, namespaceURI)),\n createTextNode: (text: string) => own(new TextNode(text)),\n head: new Element('head', XHTML_NS),\n body: new Element('body', XHTML_NS),\n defaultView: null,\n };\n function own<T extends Node>(node: T): T { node.ownerDocument = doc; return node; }\n own(doc.head);\n own(doc.body);\n return doc;\n}\n\n// ---------------------------------------------------------------------------\n// HTML serialization\n// ---------------------------------------------------------------------------\n\nconst VOID_ELEMENTS = new Set(\"area base br col embed hr img input link meta param source track wbr\".split(\" \"));\n// Elements whose text content must NOT be HTML-escaped.\nconst RAW_TEXT_ELEMENTS = new Set([\"script\", \"style\"]);\n\nfunction escapeText(s: string): string {\n return s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, \"&\").replace(/\"/g, \""\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\nfunction styleToString(style: Record<string, string>): string {\n let out = '';\n for (const key of Object.keys(style)) {\n const value = style[key];\n if (value === '') continue;\n const prop = key.replace(/[A-Z]/g, l => `-${l.toLowerCase()}`);\n out += `${prop}:${value};`;\n }\n return out;\n}\n\n/**\n * Serialize a node (and its descendants) to an HTML string.\n *\n * Notes/limitations:\n * - Event listeners are dropped (they are client-only by design).\n * - DOM properties set directly on elements (e.g. `input.value` via `value:` arg) are not\n * reflected as attributes and therefore do not appear in the output.\n */\nexport function serializeHtml(node: Node): string {\n if (node instanceof TextNode) return escapeText(node.textContent);\n if (!(node instanceof Element)) return '';\n\n const tag = node.tagName;\n // Wrapper produced by `innerHTML` / the `html:` arg — emit its content verbatim.\n if (tag === 'fake-emulated-html') return node.textContent;\n\n let html = '<' + tag;\n for (const key of Object.keys(node.attrs)) {\n html += ` ${key}=\"${escapeAttr(node.attrs[key])}\"`;\n }\n const styleStr = styleToString(node.style);\n if (styleStr) html += ` style=\"${escapeAttr(styleStr)}\"`;\n html += '>';\n\n if (VOID_ELEMENTS.has(tag)) return html;\n\n if (RAW_TEXT_ELEMENTS.has(tag)) {\n html += node.textContent;\n } else {\n for (const child of node.childNodes) html += serializeHtml(child);\n }\n return html + '</' + tag + '>';\n}\n\n/** Serialize the children of a container element to an HTML string (the container tag itself is omitted). */\nexport function serializeChildren(node: Element): string {\n let html = '';\n for (const child of node.childNodes) html += serializeHtml(child);\n return html;\n}\n\n// ---------------------------------------------------------------------------\n// Minimal injectable window / location / history (sufficient for SSR routing)\n// ---------------------------------------------------------------------------\n\nexport class ServerLocation {\n private _href: string = 'http://localhost/';\n constructor(href: string = 'http://localhost/') {\n // Goes through the setter, which absolutizes path-only URLs (e.g. Express `req.originalUrl`).\n this.href = href;\n }\n\n get href(): string { return this._href; }\n set href(value: string) {\n this._href = value.startsWith('/')\n ? `${new URL(this._href).origin}${value}`\n : value;\n }\n get origin(): string { return new URL(this._href).origin; }\n get host(): string { return new URL(this._href).host; }\n get pathname(): string { return new URL(this._href).pathname; }\n set pathname(v: string) { const u = new URL(this._href); u.pathname = v; this._href = u.href; }\n get search(): string { return new URL(this._href).search; }\n set search(v: string) { const u = new URL(this._href); u.search = v; this._href = u.href; }\n get hash(): string { return new URL(this._href).hash; }\n set hash(v: string) { const u = new URL(this._href); u.hash = v; this._href = u.href; }\n}\n\nexport class ServerHistory {\n state: any = null;\n constructor(private location: ServerLocation) {}\n pushState(state: any, _title: string, url: string): void { this.state = state; this.location.href = url; }\n replaceState(state: any, _title: string, url: string): void { this.state = state; this.location.href = url; }\n go(_delta: number): void { /* no navigation during SSR */ }\n back(): void {}\n forward(): void {}\n}\n\nexport interface ServerWindow {\n document: ServerDocument;\n Node: typeof Node;\n Element: typeof Element;\n location: ServerLocation;\n history: ServerHistory;\n addEventListener(type: string, listener: Function): void;\n removeEventListener(type: string, listener: Function): void;\n dispatchEvent(event: any): void;\n matchMedia(query: string): { matches: boolean; media: string; addEventListener(): void; removeEventListener(): void };\n}\n\n/**\n * Create a fresh, isolated window (carrying its own document and the `Node`/`Element`\n * constructors) bound to `url`. Use one per SSR request. Satisfies Aberdeen's `WindowLike`.\n */\nexport function createWindow(url: string = 'http://localhost/'): ServerWindow {\n const location = new ServerLocation(url);\n const history = new ServerHistory(location);\n const listeners: Record<string, Set<Function>> = {};\n const document = createDocument();\n const win: ServerWindow = {\n document,\n Node,\n Element,\n location,\n history,\n addEventListener(type, listener) { (listeners[type] ||= new Set()).add(listener); },\n removeEventListener(type, listener) { listeners[type]?.delete(listener); },\n dispatchEvent(event) { listeners[event.type]?.forEach(l => l.call(this, event)); },\n matchMedia(query) {\n return { matches: false, media: query, addEventListener() {}, removeEventListener() {} };\n },\n };\n document.defaultView = win;\n return win;\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "B6E7B31869CE5FFC64756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
package/dist/tests/helpers.d.ts
CHANGED
|
@@ -1,4 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
import { type TestEnvironment } from './environment';
|
|
2
|
+
export declare let A: TestEnvironment['A'];
|
|
3
|
+
export declare let window: any;
|
|
4
|
+
export declare let document: any;
|
|
5
|
+
export declare let location: any;
|
|
6
|
+
export declare let history: any;
|
|
7
|
+
export declare let setTimeout: TestEnvironment['setTimeout'];
|
|
8
|
+
export declare let passTime: TestEnvironment['passTime'];
|
|
9
|
+
/** Preset a media-query match value for the current environment. */
|
|
10
|
+
export declare function setMediaQuery(query: string, matches: boolean): void;
|
|
11
|
+
/** DOM operation counters for the current environment. */
|
|
12
|
+
export declare function getCounts(): {
|
|
13
|
+
new: number;
|
|
14
|
+
changed: number;
|
|
15
|
+
};
|
|
2
16
|
export declare class AssertError extends Error {
|
|
3
17
|
constructor(text: string, actual: any, expected: any, expectLiteral?: boolean);
|
|
4
18
|
}
|
|
@@ -13,9 +27,7 @@ export declare function getCss(): string;
|
|
|
13
27
|
export declare function assertCss(...expected: string[]): void;
|
|
14
28
|
export declare function assertThrow(what: string, func: () => void): Promise<void>;
|
|
15
29
|
export declare function assertThrow(func: () => void): Promise<void>;
|
|
16
|
-
export declare const passTime: (ms?: number) => Promise<void>;
|
|
17
30
|
export declare function assertDomUpdates(expected: {
|
|
18
31
|
new?: number;
|
|
19
32
|
changed?: number;
|
|
20
33
|
}): void;
|
|
21
|
-
export declare function reset(): Promise<void>;
|