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.
Files changed (139) hide show
  1. package/dist/src/aberdeen.d.ts +928 -944
  2. package/dist/src/aberdeen.js +1693 -1704
  3. package/dist/src/aberdeen.js.map +3 -3
  4. package/dist/src/index.d.ts +12 -0
  5. package/dist/src/index.js +11 -0
  6. package/dist/src/index.js.map +10 -0
  7. package/dist/src/prediction.d.ts +7 -4
  8. package/dist/src/prediction.js +18 -23
  9. package/dist/src/prediction.js.map +3 -3
  10. package/dist/src/route.d.ts +112 -99
  11. package/dist/src/route.js +254 -254
  12. package/dist/src/route.js.map +3 -3
  13. package/dist/src/server-dom.d.ts +158 -0
  14. package/dist/src/server-dom.js +458 -0
  15. package/dist/src/server-dom.js.map +10 -0
  16. package/dist/src/server.d.ts +55 -0
  17. package/dist/src/server.js +25 -0
  18. package/dist/src/server.js.map +10 -0
  19. package/dist/src/transitions.js +7 -4
  20. package/dist/src/transitions.js.map +3 -3
  21. package/dist/tests/environment.d.ts +24 -0
  22. package/dist/tests/{fakedom.js → environment.js} +239 -288
  23. package/dist/tests/environment.js.map +11 -0
  24. package/dist/tests/helpers.d.ts +15 -3
  25. package/dist/tests/helpers.js +277 -306
  26. package/dist/tests/helpers.js.map +6 -5
  27. package/dist-docs/Tutorial/index.html +30 -30
  28. package/dist-docs/aberdeen/Aberdeen/index.html +350 -0
  29. package/dist-docs/aberdeen/InitOptions/index.html +4 -0
  30. package/dist-docs/aberdeen/KeyToString/index.html +2 -0
  31. package/dist-docs/aberdeen/PromiseProxy/index.html +6 -6
  32. package/dist-docs/aberdeen/SortKeyType/index.html +2 -0
  33. package/dist-docs/aberdeen/TargetType/index.html +2 -0
  34. package/dist-docs/aberdeen/ValueRef/index.html +2 -0
  35. package/dist-docs/aberdeen/WindowLike/index.html +5 -0
  36. package/dist-docs/aberdeen/{clone → createA}/index.html +10 -5
  37. package/dist-docs/aberdeen/index.html +13 -54
  38. package/dist-docs/assets/aberdeen/aberdeen.d.ts +928 -944
  39. package/dist-docs/assets/aberdeen/aberdeen.js +1693 -1704
  40. package/dist-docs/assets/aberdeen/aberdeen.js.map +3 -3
  41. package/dist-docs/assets/aberdeen/index.d.ts +12 -0
  42. package/dist-docs/assets/aberdeen/index.js +11 -0
  43. package/dist-docs/assets/aberdeen/index.js.map +10 -0
  44. package/dist-docs/assets/aberdeen/prediction.d.ts +7 -4
  45. package/dist-docs/assets/aberdeen/prediction.js +18 -23
  46. package/dist-docs/assets/aberdeen/prediction.js.map +3 -3
  47. package/dist-docs/assets/aberdeen/route.d.ts +112 -99
  48. package/dist-docs/assets/aberdeen/route.js +254 -254
  49. package/dist-docs/assets/aberdeen/route.js.map +3 -3
  50. package/dist-docs/assets/aberdeen/server-dom.d.ts +158 -0
  51. package/dist-docs/assets/aberdeen/server-dom.js +458 -0
  52. package/dist-docs/assets/aberdeen/server-dom.js.map +10 -0
  53. package/dist-docs/assets/aberdeen/server.d.ts +55 -0
  54. package/dist-docs/assets/aberdeen/server.js +25 -0
  55. package/dist-docs/assets/aberdeen/server.js.map +10 -0
  56. package/dist-docs/assets/aberdeen/transitions.js +7 -4
  57. package/dist-docs/assets/aberdeen/transitions.js.map +3 -3
  58. package/dist-docs/assets/navigation.js +1 -1
  59. package/dist-docs/assets/search.js +1 -1
  60. package/dist-docs/dispatcher/Dispatcher/index.html +5 -6
  61. package/dist-docs/dispatcher/MATCH_FAILED/index.html +2 -2
  62. package/dist-docs/dispatcher/MATCH_REST/index.html +2 -2
  63. package/dist-docs/dispatcher/index.html +2 -2
  64. package/dist-docs/hierarchy.html +1 -1
  65. package/dist-docs/index-1/index.html +2 -0
  66. package/dist-docs/index.html +2 -2
  67. package/dist-docs/media/CHANGELOG.md +14 -2
  68. package/dist-docs/modules.html +1 -1
  69. package/dist-docs/prediction/applyCanon/index.html +4 -3
  70. package/dist-docs/prediction/applyPrediction/index.html +4 -3
  71. package/dist-docs/prediction/index.html +2 -2
  72. package/dist-docs/route/Route/index.html +9 -9
  73. package/dist-docs/route/RouteApi/index.html +60 -0
  74. package/dist-docs/route/index.html +6 -15
  75. package/dist-docs/route/init/index.html +5 -0
  76. package/dist-docs/server/RenderToStringOptions/index.html +6 -0
  77. package/dist-docs/server/RenderToStringResult/index.html +6 -0
  78. package/dist-docs/server/index.html +4 -0
  79. package/dist-docs/server/renderToString/index.html +6 -0
  80. package/dist-docs/sitemap.xml +51 -155
  81. package/dist-docs/transitions/grow/index.html +2 -2
  82. package/dist-docs/transitions/index.html +2 -2
  83. package/dist-docs/transitions/shrink/index.html +2 -2
  84. package/package.json +17 -7
  85. package/skill/SKILL.md +28 -28
  86. package/skill/aberdeen.md +471 -3448
  87. package/skill/dispatcher.md +6 -16
  88. package/skill/prediction.md +17 -5
  89. package/skill/route.md +95 -77
  90. package/skill/transitions.md +3 -3
  91. package/src/aberdeen.ts +1226 -740
  92. package/src/index.ts +13 -0
  93. package/src/prediction.ts +25 -24
  94. package/src/route.ts +192 -142
  95. package/src/server-dom.ts +508 -0
  96. package/src/server.ts +74 -0
  97. package/src/transitions.ts +9 -3
  98. package/dist/tests/fakedom.d.ts +0 -9
  99. package/dist/tests/fakedom.js.map +0 -10
  100. package/dist-docs/aberdeen/A/index.html +0 -115
  101. package/dist-docs/aberdeen/CUSTOM_DUMP/index.html +0 -7
  102. package/dist-docs/aberdeen/NO_COPY/index.html +0 -2
  103. package/dist-docs/aberdeen/OPAQUE/index.html +0 -12
  104. package/dist-docs/aberdeen/clean/index.html +0 -11
  105. package/dist-docs/aberdeen/copy/index.html +0 -22
  106. package/dist-docs/aberdeen/count/index.html +0 -7
  107. package/dist-docs/aberdeen/cssVars/index.html +0 -11
  108. package/dist-docs/aberdeen/darkMode/index.html +0 -9
  109. package/dist-docs/aberdeen/default/index.html +0 -341
  110. package/dist-docs/aberdeen/derive/index.html +0 -18
  111. package/dist-docs/aberdeen/disableCreateDestroy/index.html +0 -6
  112. package/dist-docs/aberdeen/dump/index.html +0 -11
  113. package/dist-docs/aberdeen/insertCss/index.html +0 -30
  114. package/dist-docs/aberdeen/insertGlobalCss/index.html +0 -19
  115. package/dist-docs/aberdeen/invertString/index.html +0 -13
  116. package/dist-docs/aberdeen/isEmpty/index.html +0 -12
  117. package/dist-docs/aberdeen/map/index.html +0 -26
  118. package/dist-docs/aberdeen/merge/index.html +0 -11
  119. package/dist-docs/aberdeen/mount/index.html +0 -17
  120. package/dist-docs/aberdeen/multiMap/index.html +0 -28
  121. package/dist-docs/aberdeen/onEach/index.html +0 -19
  122. package/dist-docs/aberdeen/partition/index.html +0 -36
  123. package/dist-docs/aberdeen/peek/index.html +0 -40
  124. package/dist-docs/aberdeen/proxy/index.html +0 -35
  125. package/dist-docs/aberdeen/ref/index.html +0 -13
  126. package/dist-docs/aberdeen/runQueue/index.html +0 -13
  127. package/dist-docs/aberdeen/setErrorHandler/index.html +0 -16
  128. package/dist-docs/aberdeen/setSpacingCssVars/index.html +0 -8
  129. package/dist-docs/aberdeen/unmountAll/index.html +0 -5
  130. package/dist-docs/aberdeen/unproxy/index.html +0 -11
  131. package/dist-docs/route/back/index.html +0 -4
  132. package/dist-docs/route/current/index.html +0 -2
  133. package/dist-docs/route/go/index.html +0 -14
  134. package/dist-docs/route/interceptLinks/index.html +0 -8
  135. package/dist-docs/route/matchCurrent/index.html +0 -10
  136. package/dist-docs/route/persistScroll/index.html +0 -6
  137. package/dist-docs/route/push/index.html +0 -6
  138. package/dist-docs/route/setLog/index.html +0 -3
  139. package/dist-docs/route/up/index.html +0 -5
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../tests/fakedom.ts", "../../tests/helpers.ts"],
3
+ "sources": ["../../tests/environment.ts", "../../src/server-dom.ts", "../../tests/helpers.ts"],
4
4
  "sourcesContent": [
5
- "let 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};\nexport const clearBody = function(): void {\n document.body.childNodes.length = 0;\n};\n\nclass Node {\n parentNode: Element | null = null;\n childNodes: Node[] = [];\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\nclass 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?: {\n add: (...names: string[]) => void;\n remove: (...names: string[]) => void;\n toggle: (name: string, force?: boolean) => void;\n contains: (name: string) => boolean;\n };\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(): {\n add: (...names: string[]) => void;\n remove: (...names: string[]) => void;\n toggle: (name: string, force?: boolean) => void;\n contains: (name: string) => boolean;\n } {\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 public _scrollTop?: number;\n public _scrollLeft?: number;\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\n\n\nconst document = {\n createElement: (tag: string) => new Element(tag, 'http://www.w3.org/1999/xhtml'),\n createElementNS: (namespaceURI: string, tag: string) => new Element(tag, namespaceURI),\n createTextNode: (text: string) => new TextNode(text),\n head: new Element('head', 'http://www.w3.org/1999/xhtml'),\n body: new Element('body', 'http://www.w3.org/1999/xhtml')\n};\n\n// Browser history and location simulation\nclass FakeLocation {\n private _href: string = 'http://localhost/';\n \n get href(): string { return this._href; }\n set href(value: string) { \n if (value.startsWith('/')) {\n // Relative path - convert to absolute URL\n const currentUrl = new URL(this._href);\n this._href = `${currentUrl.protocol}//${currentUrl.host}${value}`;\n } else {\n this._href = value;\n }\n }\n\n get host(): string {\n const url = new URL(this._href);\n return url.host;\n }\n \n get pathname(): string { \n const url = new URL(this._href);\n return url.pathname;\n }\n set pathname(value: string) {\n const url = new URL(this._href);\n url.pathname = value;\n this._href = url.href;\n }\n \n get search(): string {\n const url = new URL(this._href);\n return url.search;\n }\n set search(value: string) {\n const url = new URL(this._href);\n url.search = value;\n this._href = url.href;\n }\n \n get hash(): string {\n const url = new URL(this._href);\n return url.hash;\n }\n set hash(value: string) {\n const url = new URL(this._href);\n url.hash = value;\n this._href = url.href;\n }\n}\n\nclass FakeHistory {\n private _state: any = null;\n private _entries: Array<{url: string, state: any}> = [];\n private _index: number = 0;\n \n constructor() {\n // Initialize with current location\n this._entries = [{url: location.href, state: null}];\n }\n \n get state(): any {\n return this._state;\n }\n \n pushState(state: any, title: string, url: string): void {\n // Remove any entries after current index (like real browser behavior)\n this._entries = this._entries.slice(0, this._index + 1);\n \n // Add new entry\n this._entries.push({url, state});\n this._index = this._entries.length - 1;\n this._state = state;\n \n // Update location\n location.href = url;\n }\n \n replaceState(state: any, title: string, url: string): void {\n // state = JSON.parse(JSON.stringify(state)); // clone state\n this._entries[this._index] = {url, state};\n this._state = state;\n \n // Update location\n location.href = url;\n }\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 \n // Trigger popstate event asynchronously\n setTimeout(() => {\n const event = {\n type: 'popstate',\n state: this._state,\n target: window,\n preventDefault: () => {},\n stopPropagation: () => {}\n };\n window.dispatchEvent(event);\n }, 0);\n }\n }\n \n back(): void {\n this.go(-1);\n }\n \n forward(): void {\n this.go(1);\n }\n \n // Test helper methods\n _reset(): void {\n this._state = null;\n this._entries = [{url: location.href, state: null}];\n this._index = 0;\n }\n \n _getLength(): number {\n return this._entries.length;\n }\n}\n\nclass FakeWindow {\n private _listeners: Record<string, Set<Function>> = {};\n \n addEventListener(type: string, listener: Function): void {\n if (!this._listeners[type]) {\n this._listeners[type] = new Set();\n }\n this._listeners[type].add(listener);\n }\n \n removeEventListener(type: string, listener: Function): void {\n if (this._listeners[type]) {\n this._listeners[type].delete(listener);\n }\n }\n \n dispatchEvent(event: any): void {\n const listeners = this._listeners[event.type];\n if (listeners) {\n for (const listener of listeners) {\n listener.call(this, event);\n }\n }\n }\n\n matchMedia(query: string): MediaQueryList {\n if (!mediaQueries.has(query)) {\n mediaQueries.set(query, new MediaQueryList(query));\n }\n return mediaQueries.get(query)!;\n }\n \n // Test helper\n _reset(): void {\n this._listeners = {};\n }\n}\n\nconst location = new FakeLocation();\nconst history = new FakeHistory();\nconst window = new FakeWindow();\n\n// Reset function for tests\nexport const resetBrowserState = function(): void {\n location.href = 'http://localhost/';\n history._reset();\n // Don't reset window listeners as they're registered by the modules being tested\n};\n\ntype TimeoutItem = {\n func: () => void | Promise<void>;\n time: number;\n realId: ReturnType<typeof global.setTimeout>;\n};\n\nlet timeouts: TimeoutItem[] = [];\nlet currentTime: number = 0;\nlet deferredErrors: any[] = [];\n\nconst realSetTimeout = global.setTimeout;\nconst realClearTimeout = global.clearTimeout;\n\nfunction 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\nconst setTimeout = function(func: () => void, time: number): void {\n const item: TimeoutItem = { func, time: time + currentTime, realId: undefined! };\n item.realId = realSetTimeout(() => {\n try { fireItem(item); }\n catch (e) { deferredErrors.push(e); }\n }, time);\n timeouts.push(item);\n};\n\nconst queueMicrotask = function(func: () => void): void {\n const item: TimeoutItem = { func, time: 0, realId: undefined! };\n item.realId = realSetTimeout(() => {\n try { fireItem(item); }\n 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.\nexport 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 // Rethrow errors from background-fired timeouts\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 // Find the earliest timeout\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\n if (item.time > targetTime) break;\n\n // Fire early, cancel real timer\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\nconst IGNORE_OUTPUT = new Set(\"tagName-> attrs-> events-> childNodes-> parentNode-> class= namespaceURI->\".split(\" \"));\n\nclass 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\nfunction getComputedStyle(el: Element): Record<string, string> {\n return el._style;\n}\n\n// MediaQueryList mock for testing\nclass MediaQueryList {\n matches: boolean;\n media: string;\n private listeners: Set<(event: any) => void> = new Set();\n\n constructor(query: string) {\n this.media = query;\n // Check if there's a preset value, otherwise default to light mode\n const preset = mediaQueryPresets.get(query);\n this.matches = preset !== undefined ? preset : (query.includes('dark') ? false : true);\n }\n\n addEventListener(type: string, listener: (event: any) => void) {\n if (type === 'change') {\n this.listeners.add(listener);\n }\n }\n\n removeEventListener(type: string, listener: (event: any) => void) {\n if (type === 'change') {\n this.listeners.delete(listener);\n }\n }\n\n // Test helper to simulate media query changes\n _trigger(matches: boolean) {\n this.matches = matches;\n const event = { matches, media: this.media };\n for (const listener of this.listeners) {\n listener(event);\n }\n }\n}\n\nconst mediaQueries = new Map<string, MediaQueryList>();\nconst mediaQueryPresets = new Map<string, boolean>();\n\n// Set media query value and trigger change event if already initialized\nexport function setMediaQuery(query: string, matches: boolean) {\n mediaQueryPresets.set(query, matches);\n // If already created, update it and trigger change\n if (mediaQueries.has(query)) {\n mediaQueries.get(query)!._trigger(matches);\n }\n}\n\nconst globals = {Node, Element, TextNode, document, window, setTimeout, queueMicrotask, getComputedStyle, location, history, URLSearchParams};\nObject.assign(global, globals);\nObject.assign(window, globals);\n",
6
- "import { expect } from 'bun:test';\nimport * as fakedom from './fakedom';\nexport * as fakedom from './fakedom';\n\n// Fakedom must be imported first, as it sets up the global environment.\nimport A from \"aberdeen\";\n\nfunction toDisplay(value: any) {\n\tif (value instanceof Map) {\n\t\tlet results: string[] = []\n\t\tvalue.forEach((value,key) => results.push(JSON.stringify(key)+\": \"+JSON.stringify(value)))\n\t\treturn \"map{\" + results.join(\", \") + \"}\"\n\t} else {\n\t\treturn JSON.stringify(value)\n\t}\n}\n\nexport class AssertError extends Error {\n\tconstructor(text: string, actual: any, expected: any, expectLiteral: boolean = false) {\n\t\ttext += `\n\t\tActual: ${toDisplay(actual)}\n\t\tExpected: ${expectLiteral ? expected : toDisplay(expected)}`\n\t\tsuper(text)\n\t}\n}\n\nexport function assert(bool: any, msg?: string): void {\n\tif (!bool) throw new AssertError(`assert failed${msg ? \": \"+msg : \"\"}`, bool, \"something trueish\", true)\n}\n\nexport function assertContains(actual: any, expected: {indexOf: (v: any)=>number}, msg?: string): void {\n\tactual = (''+actual)\n\tif (actual.indexOf(expected) < 0) throw new AssertError(`contains failed ${msg ? \": \"+msg : \"\"}`, actual, `something containing '${expected}'`, true)\n}\n\nexport function getBody(): string {\n\treturn document.body.toString().replace(/^body{(.*)}$/,'$1').replace(/^body\\b/,'')\n}\n\nexport function assertBody(expected: string): void {\n\tlet actual = getBody();\n\tif (actual !== expected) throw new Error(`assertBody failed\\nActual: ${actual}\\nExpected: ${expected}`)\n}\n\n/** Get the full CSS content from the :root style tag in head */\nexport function getCss(): string {\n\tlet css = '';\n\tfor(const el of document.head.childNodes) {\n\t\tif (el instanceof Element && el.tagName === 'style') {\n\t\t\tcss += el.textContent + \"\\n\";\n\t\t}\n\t}\n\treturn css;\n}\n\nexport function assertCss(...expected: string[]) {\n\tconst found = getCss().split(\"\\n\").map(s => s.trim()).filter(s => s);\n\texpect(found).toEqual(expected);\n}\n\n\nexport async function assertThrow(what: string, func: ()=>void): Promise<void>;\nexport async function assertThrow(func: ()=>void): Promise<void>;\n\nexport async function assertThrow(a: any, b?: any): Promise<void> {\n\tif (typeof a == 'function') {\n\t\tb = a\n\t\ta = undefined\n\t}\n\ttry {\n\t\tawait b()\n\t} catch(e) {\n const s = ''+e\n\t\tif (a && s.indexOf(a)<0) throw new AssertError(`wrong exception`, s, `something containing \"${a}\"`, true)\n\t\treturn\n\t}\n\tthrow new AssertError(`exception expected`, undefined, `something containing \"${a}\"`, true)\n}\n\nexport const passTime = fakedom.passTime\n\nexport function assertDomUpdates(expected: {new?: number, changed?: number}) {\n\tconst counts = fakedom.getCounts()\n\tif (expected.new!=null) expect(counts.new).toEqual(expected.new)\n\tif (expected.changed!=null) expect(counts.changed).toEqual(expected.changed)\n}\n\nexport async function reset() {\n\tA.copy(A.cssVars, {});\n\tA.unmountAll();\n\ttry {\n\t\tawait fakedom.passTime(2001); // wait for deletion transitions\n\t\tassertBody(``);\n\t} finally {\n\t\t// Force-clear DOM and state even if errors occurred\n\t\tfakedom.clearBody();\n\t}\n\tfakedom.resetCounts();\n\tA.setErrorHandler();\n}\n"
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, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\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
+ "import { expect, beforeEach } from 'bun:test';\nimport { createEnvironment, Element, type TestEnvironment } from './environment';\n\n// A fresh, isolated environment (window + DOM + Aberdeen instance) is created before every\n// test (see `beforeEach` below), so tests never need to clean up after themselves.\n//\n// The exported `A`/`document`/etc. below are `let`s that `newEnvironment()` reassigns for each\n// test. This relies on ES module *live bindings*: `import { A } from './helpers'` is a live\n// alias to this module's binding, so every read of `A` in a test body sees the current\n// environment's instance. Two rules make this work, and both must be followed in tests:\n// 1. Use a *named* import — `import { A }`, not `import A` (a default import copies the value\n// once and would never update).\n// 2. Read `A` inside the test body (which runs after the `beforeEach`). Hoisting it into a\n// module-level `const myA = A` at import time would pin the very first environment and\n// silently break per-test isolation.\nlet env: TestEnvironment;\nexport let A: TestEnvironment['A'];\nexport let window: any;\nexport let document: any;\nexport let location: any;\nexport let history: any;\nexport let setTimeout: TestEnvironment['setTimeout'];\nexport let passTime: TestEnvironment['passTime'];\n\nfunction newEnvironment() {\n\tenv = createEnvironment();\n\tA = env.A;\n\twindow = env.window;\n\tdocument = env.document;\n\tlocation = env.location;\n\thistory = env.history;\n\tsetTimeout = env.setTimeout;\n\tpassTime = env.passTime;\n}\n\nnewEnvironment(); // initial environment (for module-load-time reads)\nbeforeEach(newEnvironment); // a fresh environment before each test (this file is preloaded)\n\n/** Preset a media-query match value for the current environment. */\nexport function setMediaQuery(query: string, matches: boolean) { env.setMediaQuery(query, matches); }\n\n/** DOM operation counters for the current environment. */\nexport function getCounts() { return env.getCounts(); }\n\nfunction toDisplay(value: any) {\n\tif (value instanceof Map) {\n\t\tlet results: string[] = []\n\t\tvalue.forEach((value,key) => results.push(JSON.stringify(key)+\": \"+JSON.stringify(value)))\n\t\treturn \"map{\" + results.join(\", \") + \"}\"\n\t} else {\n\t\treturn JSON.stringify(value)\n\t}\n}\n\nexport class AssertError extends Error {\n\tconstructor(text: string, actual: any, expected: any, expectLiteral: boolean = false) {\n\t\ttext += `\n\t\tActual: ${toDisplay(actual)}\n\t\tExpected: ${expectLiteral ? expected : toDisplay(expected)}`\n\t\tsuper(text)\n\t}\n}\n\nexport function assert(bool: any, msg?: string): void {\n\tif (!bool) throw new AssertError(`assert failed${msg ? \": \"+msg : \"\"}`, bool, \"something trueish\", true)\n}\n\nexport function assertContains(actual: any, expected: {indexOf: (v: any)=>number}, msg?: string): void {\n\tactual = (''+actual)\n\tif (actual.indexOf(expected) < 0) throw new AssertError(`contains failed ${msg ? \": \"+msg : \"\"}`, actual, `something containing '${expected}'`, true)\n}\n\nexport function getBody(): string {\n\treturn document.body.toString().replace(/^body{(.*)}$/,'$1').replace(/^body\\b/,'')\n}\n\nexport function assertBody(expected: string): void {\n\tlet actual = getBody();\n\tif (actual !== expected) throw new Error(`assertBody failed\\nActual: ${actual}\\nExpected: ${expected}`)\n}\n\n/** Get the full CSS content from the :root style tag in head */\nexport function getCss(): string {\n\tlet css = '';\n\tfor(const el of document.head.childNodes) {\n\t\tif (el instanceof Element && el.tagName === 'style') {\n\t\t\tcss += el.textContent + \"\\n\";\n\t\t}\n\t}\n\treturn css;\n}\n\nexport function assertCss(...expected: string[]) {\n\tconst found = getCss().split(\"\\n\").map(s => s.trim()).filter(s => s);\n\texpect(found).toEqual(expected);\n}\n\n\nexport async function assertThrow(what: string, func: ()=>void): Promise<void>;\nexport async function assertThrow(func: ()=>void): Promise<void>;\n\nexport async function assertThrow(a: any, b?: any): Promise<void> {\n\tif (typeof a == 'function') {\n\t\tb = a\n\t\ta = undefined\n\t}\n\ttry {\n\t\tawait b()\n\t} catch(e) {\n const s = ''+e\n\t\tif (a && s.indexOf(a)<0) throw new AssertError(`wrong exception`, s, `something containing \"${a}\"`, true)\n\t\treturn\n\t}\n\tthrow new AssertError(`exception expected`, undefined, `something containing \"${a}\"`, true)\n}\n\nexport function assertDomUpdates(expected: {new?: number, changed?: number}) {\n\tconst counts = env.getCounts()\n\tif (expected.new!=null) expect(counts.new).toEqual(expected.new)\n\tif (expected.changed!=null) expect(counts.changed).toEqual(expected.changed)\n}\n"
7
8
  ],
8
- "mappings": "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",
9
- "debugId": "CFA9235CDB3924EF64756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "E9E14C2775DDDF9564756E2164756E21",
10
11
  "names": []
11
12
  }