aberdeen 1.18.1 → 1.19.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/README.md +9 -0
- package/dist/src/aberdeen.d.ts +29 -0
- package/{dist-docs/assets/aberdeen/aberdeen.js → dist/src/aberdeen.dev.js} +796 -21
- package/dist/src/aberdeen.dev.js.map +12 -0
- package/dist/src/aberdeen.js +79 -19
- package/dist/src/aberdeen.js.map +3 -3
- package/dist/src/devtools.d.ts +26 -0
- package/dist/tests/fakedom.js +20 -3
- package/dist/tests/fakedom.js.map +3 -3
- package/dist/tests/helpers.js +20 -3
- package/dist/tests/helpers.js.map +3 -3
- package/html-to-aberdeen +9 -5
- package/package.json +17 -10
- package/skill/A.md +127 -0
- package/skill/Dispatcher.md +51 -0
- package/skill/OPAQUE.md +15 -0
- package/skill/PromiseProxy.md +25 -0
- package/skill/Route.md +50 -0
- package/skill/SKILL.md +272 -156
- package/skill/applyCanon.md +20 -0
- package/skill/applyPrediction.md +15 -0
- package/skill/back.md +11 -0
- package/skill/clean.md +43 -0
- package/skill/clone.md +15 -0
- package/skill/copy.md +40 -0
- package/skill/count.md +32 -0
- package/skill/cssVars.md +15 -0
- package/skill/darkMode.md +26 -0
- package/skill/derive.md +56 -0
- package/skill/developer-tools.md +23 -0
- package/skill/disableCreateDestroy.md +11 -0
- package/skill/dump.md +37 -0
- package/skill/freeze.md +20 -0
- package/skill/full-example-multi-page-app.md +146 -0
- package/skill/go.md +25 -0
- package/skill/grow.md +13 -0
- package/skill/html-to-aberdeen.md +9 -0
- package/skill/insertCss.md +79 -0
- package/skill/insertGlobalCss.md +68 -0
- package/skill/interceptLinks.md +19 -0
- package/skill/invertString.md +32 -0
- package/skill/isEmpty.md +38 -0
- package/skill/map.md +16 -0
- package/skill/matchCurrent.md +27 -0
- package/skill/merge.md +27 -0
- package/skill/mount.md +48 -0
- package/skill/multiMap.md +15 -0
- package/skill/onEach.md +14 -0
- package/skill/partition.md +15 -0
- package/skill/peek.md +36 -0
- package/skill/persistScroll.md +13 -0
- package/skill/proxy.md +11 -0
- package/skill/push.md +13 -0
- package/skill/ref.md +39 -0
- package/skill/runQueue.md +34 -0
- package/skill/setErrorHandler.md +48 -0
- package/skill/setLog.md +9 -0
- package/skill/setSpacingCssVars.md +31 -0
- package/skill/shrink.md +13 -0
- package/skill/unmountAll.md +9 -0
- package/skill/unproxy.md +43 -0
- package/skill/up.md +13 -0
- package/src/aberdeen.ts +220 -82
- package/src/devtools.ts +685 -0
- package/dist-docs/.nojekyll +0 -1
- package/dist-docs/Tutorial/index.html +0 -305
- 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/PromiseProxy/index.html +0 -8
- package/dist-docs/aberdeen/clean/index.html +0 -11
- package/dist-docs/aberdeen/clone/index.html +0 -5
- 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/index.html +0 -54
- 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/assets/aberdeen/aberdeen.d.ts +0 -961
- package/dist-docs/assets/aberdeen/aberdeen.js.map +0 -11
- package/dist-docs/assets/aberdeen/dispatcher.d.ts +0 -57
- package/dist-docs/assets/aberdeen/dispatcher.js +0 -66
- package/dist-docs/assets/aberdeen/dispatcher.js.map +0 -10
- package/dist-docs/assets/aberdeen/helpers/reverseSortedSet.d.ts +0 -96
- package/dist-docs/assets/aberdeen/prediction.d.ts +0 -33
- package/dist-docs/assets/aberdeen/prediction.js +0 -112
- package/dist-docs/assets/aberdeen/prediction.js.map +0 -10
- package/dist-docs/assets/aberdeen/route.d.ts +0 -137
- package/dist-docs/assets/aberdeen/route.js +0 -287
- package/dist-docs/assets/aberdeen/route.js.map +0 -10
- package/dist-docs/assets/aberdeen/transitions.d.ts +0 -18
- package/dist-docs/assets/aberdeen/transitions.js +0 -47
- package/dist-docs/assets/aberdeen/transitions.js.map +0 -10
- package/dist-docs/assets/custom.js +0 -573
- package/dist-docs/assets/favicon.png +0 -0
- package/dist-docs/assets/hierarchy.js +0 -1
- package/dist-docs/assets/highlight.css +0 -134
- package/dist-docs/assets/icons.js +0 -18
- package/dist-docs/assets/icons.svg +0 -1
- package/dist-docs/assets/main.js +0 -60
- package/dist-docs/assets/navigation.js +0 -1
- package/dist-docs/assets/search.js +0 -1
- package/dist-docs/assets/style.css +0 -1640
- package/dist-docs/dispatcher/Dispatcher/index.html +0 -21
- package/dist-docs/dispatcher/MATCH_FAILED/index.html +0 -2
- package/dist-docs/dispatcher/MATCH_REST/index.html +0 -2
- package/dist-docs/dispatcher/index.html +0 -4
- package/dist-docs/hierarchy.html +0 -1
- package/dist-docs/index.html +0 -61
- package/dist-docs/media/CHANGELOG.md +0 -260
- package/dist-docs/modules.html +0 -1
- package/dist-docs/prediction/applyCanon/index.html +0 -13
- package/dist-docs/prediction/applyPrediction/index.html +0 -8
- package/dist-docs/prediction/index.html +0 -9
- package/dist-docs/route/Route/index.html +0 -23
- 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/index.html +0 -15
- 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
- package/dist-docs/sitemap.xml +0 -239
- package/dist-docs/transitions/grow/index.html +0 -6
- package/dist-docs/transitions/index.html +0 -5
- package/dist-docs/transitions/shrink/index.html +0 -6
- package/skill/aberdeen.md +0 -4584
- package/skill/dispatcher.md +0 -129
- package/skill/prediction.md +0 -73
- package/skill/route.md +0 -322
- package/skill/transitions.md +0 -59
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aberdeen developer tools — a live scope-tree inspector.
|
|
3
|
+
*
|
|
4
|
+
* This module is a thin *wrapper* around the core: it re-exports the whole `aberdeen`
|
|
5
|
+
* API and additionally wires up the dev tools. In a dev build the `aberdeen` entry point
|
|
6
|
+
* resolves to the bundle produced from this file, so importing `aberdeen` gives the app
|
|
7
|
+
* the normal API *plus* the tooling. Production resolves to the bare core instead, where
|
|
8
|
+
* all of this is absent.
|
|
9
|
+
*
|
|
10
|
+
* The core emits instrumentation events through a sink we install via `_connectDev`. Since
|
|
11
|
+
* this wrapper loads synchronously (before the app's first `mount()`), the sink is in place
|
|
12
|
+
* in time to capture the initial render — no dynamic import, no event buffering.
|
|
13
|
+
*
|
|
14
|
+
* Event protocol (args after an implicit timestamp):
|
|
15
|
+
* create scope, parentScope, Error — a scope was created
|
|
16
|
+
* render scope — a scope (re)started rendering
|
|
17
|
+
* node scope, node, atScopeLevel — a DOM node was added by `scope`
|
|
18
|
+
* read scope, target, key — `scope` subscribed to target[key]
|
|
19
|
+
* schedule scope, key, oldVal, newVal, Error — a change scheduled `scope` to re-render
|
|
20
|
+
* delete scope — a scope was permanently removed
|
|
21
|
+
*
|
|
22
|
+
* Open with `?abdev=1` or Ctrl/Cmd+Alt+A.
|
|
23
|
+
*/
|
|
24
|
+
import A from "./aberdeen.js";
|
|
25
|
+
export * from "./aberdeen.js";
|
|
26
|
+
export default A;
|
package/dist/tests/fakedom.js
CHANGED
|
@@ -35,6 +35,23 @@ var getCounts = function() {
|
|
|
35
35
|
var clearBody = function() {
|
|
36
36
|
document.body.childNodes.length = 0;
|
|
37
37
|
};
|
|
38
|
+
function makeStyle() {
|
|
39
|
+
const s = {};
|
|
40
|
+
Object.defineProperties(s, {
|
|
41
|
+
setProperty: { value(k, v) {
|
|
42
|
+
s[k] = v;
|
|
43
|
+
changeCount++;
|
|
44
|
+
} },
|
|
45
|
+
removeProperty: { value(k) {
|
|
46
|
+
delete s[k];
|
|
47
|
+
changeCount++;
|
|
48
|
+
} },
|
|
49
|
+
getPropertyValue: { value(k) {
|
|
50
|
+
return s[k] ?? "";
|
|
51
|
+
} }
|
|
52
|
+
});
|
|
53
|
+
return s;
|
|
54
|
+
}
|
|
38
55
|
|
|
39
56
|
class Node {
|
|
40
57
|
parentNode = null;
|
|
@@ -59,7 +76,7 @@ class Node {
|
|
|
59
76
|
class Element extends Node {
|
|
60
77
|
tagName;
|
|
61
78
|
namespaceURI;
|
|
62
|
-
_style =
|
|
79
|
+
_style = makeStyle();
|
|
63
80
|
attrs = {};
|
|
64
81
|
events = {};
|
|
65
82
|
_classList;
|
|
@@ -195,7 +212,7 @@ class Element extends Node {
|
|
|
195
212
|
set style(val) {
|
|
196
213
|
if (val !== "")
|
|
197
214
|
throw new Error("non-empty style string cannot be emulated");
|
|
198
|
-
this._style =
|
|
215
|
+
this._style = makeStyle();
|
|
199
216
|
changeCount++;
|
|
200
217
|
}
|
|
201
218
|
get style() {
|
|
@@ -588,5 +605,5 @@ export {
|
|
|
588
605
|
clearBody
|
|
589
606
|
};
|
|
590
607
|
|
|
591
|
-
//# debugId=
|
|
608
|
+
//# debugId=6A274713F60ECF7C64756E2164756E21
|
|
592
609
|
//# sourceMappingURL=fakedom.js.map
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../tests/fakedom.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\n// Bun lacks `Temporal`, so install a mock. Each type uses a private brand so that\n// calling a method on a proxied instance throws, matching the real behavior.\nconst Temporal: Record<string, new (...args: any[]) => object> = {};\nfor (const name of \"Duration Instant PlainDate PlainDateTime PlainMonthDay PlainTime PlainYearMonth ZonedDateTime\".split(\" \")) {\n Temporal[name] = class {\n #brand = true;\n toString() {\n this.#brand; // throws if `this` is a proxy rather than the real instance\n return `[Temporal.${name}]`;\n }\n };\n}\n\n\nconst globals = {Node, Element, TextNode, document, window, setTimeout, queueMicrotask, getComputedStyle, location, history, URLSearchParams, Temporal};\nObject.assign(global, globals);\nObject.assign(window, globals);\n"
|
|
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\n// A minimal stand-in for CSSStyleDeclaration: a plain string bag (so `style[prop]` keeps working)\n// plus the setProperty/getPropertyValue/removeProperty methods needed for custom properties.\n// The methods are non-enumerable so they don't leak into `Object.keys()`/`for..in` iteration.\nfunction makeStyle(): Record<string, string> {\n const s: Record<string, string> = {};\n Object.defineProperties(s, {\n setProperty: { value(k: string, v: string) { s[k] = v; changeCount++; } },\n removeProperty: { value(k: string) { delete s[k]; changeCount++; } },\n getPropertyValue: { value(k: string) { return s[k] ?? \"\"; } },\n });\n return s;\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> = makeStyle();\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 = makeStyle();\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\n// Bun lacks `Temporal`, so install a mock. Each type uses a private brand so that\n// calling a method on a proxied instance throws, matching the real behavior.\nconst Temporal: Record<string, new (...args: any[]) => object> = {};\nfor (const name of \"Duration Instant PlainDate PlainDateTime PlainMonthDay PlainTime PlainYearMonth ZonedDateTime\".split(\" \")) {\n Temporal[name] = class {\n #brand = true;\n toString() {\n this.#brand; // throws if `this` is a proxy rather than the real instance\n return `[Temporal.${name}]`;\n }\n };\n}\n\n\nconst globals = {Node, Element, TextNode, document, window, setTimeout, queueMicrotask, getComputedStyle, location, history, URLSearchParams, Temporal};\nObject.assign(global, globals);\nObject.assign(window, globals);\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "6A274713F60ECF7C64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/tests/helpers.js
CHANGED
|
@@ -35,6 +35,23 @@ var getCounts = function() {
|
|
|
35
35
|
var clearBody = function() {
|
|
36
36
|
document2.body.childNodes.length = 0;
|
|
37
37
|
};
|
|
38
|
+
function makeStyle() {
|
|
39
|
+
const s = {};
|
|
40
|
+
Object.defineProperties(s, {
|
|
41
|
+
setProperty: { value(k, v) {
|
|
42
|
+
s[k] = v;
|
|
43
|
+
changeCount++;
|
|
44
|
+
} },
|
|
45
|
+
removeProperty: { value(k) {
|
|
46
|
+
delete s[k];
|
|
47
|
+
changeCount++;
|
|
48
|
+
} },
|
|
49
|
+
getPropertyValue: { value(k) {
|
|
50
|
+
return s[k] ?? "";
|
|
51
|
+
} }
|
|
52
|
+
});
|
|
53
|
+
return s;
|
|
54
|
+
}
|
|
38
55
|
|
|
39
56
|
class Node {
|
|
40
57
|
parentNode = null;
|
|
@@ -59,7 +76,7 @@ class Node {
|
|
|
59
76
|
class Element2 extends Node {
|
|
60
77
|
tagName;
|
|
61
78
|
namespaceURI;
|
|
62
|
-
_style =
|
|
79
|
+
_style = makeStyle();
|
|
63
80
|
attrs = {};
|
|
64
81
|
events = {};
|
|
65
82
|
_classList;
|
|
@@ -195,7 +212,7 @@ class Element2 extends Node {
|
|
|
195
212
|
set style(val) {
|
|
196
213
|
if (val !== "")
|
|
197
214
|
throw new Error("non-empty style string cannot be emulated");
|
|
198
|
-
this._style =
|
|
215
|
+
this._style = makeStyle();
|
|
199
216
|
changeCount++;
|
|
200
217
|
}
|
|
201
218
|
get style() {
|
|
@@ -685,5 +702,5 @@ export {
|
|
|
685
702
|
AssertError
|
|
686
703
|
};
|
|
687
704
|
|
|
688
|
-
//# debugId=
|
|
705
|
+
//# debugId=7761AADF40E4135564756E2164756E21
|
|
689
706
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../tests/fakedom.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\n// Bun lacks `Temporal`, so install a mock. Each type uses a private brand so that\n// calling a method on a proxied instance throws, matching the real behavior.\nconst Temporal: Record<string, new (...args: any[]) => object> = {};\nfor (const name of \"Duration Instant PlainDate PlainDateTime PlainMonthDay PlainTime PlainYearMonth ZonedDateTime\".split(\" \")) {\n Temporal[name] = class {\n #brand = true;\n toString() {\n this.#brand; // throws if `this` is a proxy rather than the real instance\n return `[Temporal.${name}]`;\n }\n };\n}\n\n\nconst globals = {Node, Element, TextNode, document, window, setTimeout, queueMicrotask, getComputedStyle, location, history, URLSearchParams, Temporal};\nObject.assign(global, globals);\nObject.assign(window, globals);\n",
|
|
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\n// A minimal stand-in for CSSStyleDeclaration: a plain string bag (so `style[prop]` keeps working)\n// plus the setProperty/getPropertyValue/removeProperty methods needed for custom properties.\n// The methods are non-enumerable so they don't leak into `Object.keys()`/`for..in` iteration.\nfunction makeStyle(): Record<string, string> {\n const s: Record<string, string> = {};\n Object.defineProperties(s, {\n setProperty: { value(k: string, v: string) { s[k] = v; changeCount++; } },\n removeProperty: { value(k: string) { delete s[k]; changeCount++; } },\n getPropertyValue: { value(k: string) { return s[k] ?? \"\"; } },\n });\n return s;\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> = makeStyle();\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 = makeStyle();\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\n// Bun lacks `Temporal`, so install a mock. Each type uses a private brand so that\n// calling a method on a proxied instance throws, matching the real behavior.\nconst Temporal: Record<string, new (...args: any[]) => object> = {};\nfor (const name of \"Duration Instant PlainDate PlainDateTime PlainMonthDay PlainTime PlainYearMonth ZonedDateTime\".split(\" \")) {\n Temporal[name] = class {\n #brand = true;\n toString() {\n this.#brand; // throws if `this` is a proxy rather than the real instance\n return `[Temporal.${name}]`;\n }\n };\n}\n\n\nconst globals = {Node, Element, TextNode, document, window, setTimeout, queueMicrotask, getComputedStyle, location, history, URLSearchParams, Temporal};\nObject.assign(global, globals);\nObject.assign(window, globals);\n",
|
|
6
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"
|
|
7
7
|
],
|
|
8
|
-
"mappings": "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",
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "7761AADF40E4135564756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
package/html-to-aberdeen
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
//
|
|
4
|
-
// received any human code review.
|
|
3
|
+
// NOTE: This script was created by Claude Sonnet 3.7, and hasn't
|
|
4
|
+
// received any human code review. As it doesn't use the filesystem
|
|
5
|
+
// nor the network, it should be safe enough. And it does the job!
|
|
5
6
|
|
|
6
7
|
export function parseHTML(html) {
|
|
7
8
|
const result = {
|
|
@@ -281,7 +282,9 @@ function convertStyleToAberdeen(styleString) {
|
|
|
281
282
|
handleGroup('padding-left', 'padding-right', 'ph');
|
|
282
283
|
|
|
283
284
|
for (const [key, value] of Object.entries(props)) {
|
|
284
|
-
const shortcut =
|
|
285
|
+
const shortcut = key.startsWith('--')
|
|
286
|
+
? '$' + key.slice(2)
|
|
287
|
+
: (CSS_PROPERTY_TO_SHORTCUT[key] || key);
|
|
285
288
|
addPart(shortcut, value);
|
|
286
289
|
}
|
|
287
290
|
|
|
@@ -357,8 +360,9 @@ function processElement(node, indentLevel) {
|
|
|
357
360
|
const textContent = element.children[0].content.trim();
|
|
358
361
|
if (i === chain.length - 1) {
|
|
359
362
|
// If it's the last element in the chain and there are no other children,
|
|
360
|
-
// use the '#' syntax for text
|
|
361
|
-
|
|
363
|
+
// use the '#' syntax for text. A space before '#' is required so it
|
|
364
|
+
// isn't parsed as part of the preceding attribute/style value.
|
|
365
|
+
result += ' #' + escapeString(textContent);
|
|
362
366
|
} else {
|
|
363
367
|
// Treat text like any other attribute
|
|
364
368
|
const textAttr = { name: 'text', value: textContent };
|
package/package.json
CHANGED
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aberdeen",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.19.0",
|
|
4
4
|
"author": "Frank van Viegen",
|
|
5
5
|
"main": "dist/src/aberdeen.js",
|
|
6
6
|
"devDependencies": {
|
|
7
7
|
"@biomejs/biome": "^1.9.4",
|
|
8
8
|
"@types/bun": "^1.3.12",
|
|
9
|
-
"
|
|
10
|
-
"typedoc-plugin-markdown": "^4.9.0",
|
|
9
|
+
"readme-tsdoc": "^1.3.0",
|
|
11
10
|
"typescript": "^5.8.3"
|
|
12
11
|
},
|
|
13
12
|
"exports": {
|
|
14
13
|
".": {
|
|
15
|
-
"development": "./dist/src/aberdeen.js",
|
|
14
|
+
"development": "./dist/src/aberdeen.dev.js",
|
|
15
|
+
"types": "./dist/src/aberdeen.d.ts",
|
|
16
|
+
"default": "./dist/src/aberdeen.js"
|
|
17
|
+
},
|
|
18
|
+
"./tooled": {
|
|
19
|
+
"types": "./dist/src/aberdeen.d.ts",
|
|
20
|
+
"default": "./dist/src/aberdeen.dev.js"
|
|
21
|
+
},
|
|
22
|
+
"./untooled": {
|
|
16
23
|
"types": "./dist/src/aberdeen.d.ts",
|
|
17
24
|
"default": "./dist/src/aberdeen.js"
|
|
18
25
|
},
|
|
@@ -43,6 +50,9 @@
|
|
|
43
50
|
},
|
|
44
51
|
"./package.json": "./package.json"
|
|
45
52
|
},
|
|
53
|
+
"bin": {
|
|
54
|
+
"html-to-aberdeen": "./html-to-aberdeen"
|
|
55
|
+
},
|
|
46
56
|
"description": "Build fast reactive UIs in pure TypeScript/JavaScript without a virtual DOM.",
|
|
47
57
|
"files": [
|
|
48
58
|
"dist",
|
|
@@ -50,18 +60,15 @@
|
|
|
50
60
|
"src",
|
|
51
61
|
"skill"
|
|
52
62
|
],
|
|
53
|
-
"bin": {
|
|
54
|
-
"html-to-aberdeen": "./html-to-aberdeen"
|
|
55
|
-
},
|
|
56
63
|
"license": "MIT",
|
|
57
64
|
"scripts": {
|
|
58
|
-
"build": "bun run build:clean && bun run build:src && bun run build:
|
|
65
|
+
"build": "bun run build:clean && bun run build:src && bun run build:src:dev && bun run build:types && bun run build:tests && bun run build:skill",
|
|
59
66
|
"build:clean": "rm -rf dist dist-docs",
|
|
60
67
|
"build:src": "bun build src/aberdeen.ts src/dispatcher.ts src/prediction.ts src/route.ts src/transitions.ts --sourcemap --target browser --external '*/aberdeen.js' --outdir dist/src/",
|
|
68
|
+
"build:src:dev": "bun build src/devtools.ts --sourcemap --target browser --outdir dist/src --entry-naming 'aberdeen.dev.[ext]'",
|
|
61
69
|
"build:types": "tsc",
|
|
62
70
|
"build:tests": "bun build tests/helpers.ts tests/fakedom.ts --sourcemap --target bun --external 'aberdeen' --outdir dist/tests/",
|
|
63
|
-
"build:
|
|
64
|
-
"build:skill": "typedoc --plugin typedoc-plugin-markdown --out skill --tsconfig tsconfig.json --entryPoints src/aberdeen.ts src/dispatcher.ts src/prediction.ts src/route.ts src/transitions.ts --excludeInternal --excludePrivate --hideGenerator --readme none --router module && rm -rf skill/assets skill/documents skill/README.md && cat SKILL.md > skill/SKILL.md && awk '/^-+$/ { count++; next } count >= 2' docs/Tutorial.md >> skill/SKILL.md",
|
|
71
|
+
"build:skill": "bash scripts/build-skill.sh",
|
|
65
72
|
"test": "bun test --bail",
|
|
66
73
|
"prepack": "bun test && bun run build"
|
|
67
74
|
},
|