@askrjs/askr 0.0.31 → 0.0.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/benchmark.js +2 -2
- package/dist/data/index.d.ts +43 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/index.js +293 -0
- package/dist/data/index.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/renderer/children.js +1 -0
- package/dist/renderer/children.js.map +1 -1
- package/dist/renderer/dom.js +1 -1
- package/dist/renderer/dom.js.map +1 -1
- package/dist/renderer/fastpath.js +2 -1
- package/dist/renderer/fastpath.js.map +1 -1
- package/dist/resources/index.d.ts +2 -1
- package/dist/resources/index.js +2 -1
- package/package.json +6 -2
|
@@ -6,7 +6,7 @@ import "./env.js";
|
|
|
6
6
|
import { _reconcilerRecordedParents } from "./keyed.js";
|
|
7
7
|
import { isBulkCommitActive, markFastPathApplied } from "../runtime/fastlane.js";
|
|
8
8
|
import { cleanupInstanceIfPresent, removeAllListeners } from "./cleanup.js";
|
|
9
|
-
import { createDOMNode } from "./dom.js";
|
|
9
|
+
import { createDOMNode, updateElementFromVnode } from "./dom.js";
|
|
10
10
|
function applyRendererFastPath(parent, keyedVnodes, oldKeyMap, unkeyedVnodes) {
|
|
11
11
|
if (typeof document === "undefined") return null;
|
|
12
12
|
const totalKeyed = keyedVnodes.length;
|
|
@@ -55,6 +55,7 @@ function applyRendererFastPath(parent, keyedVnodes, oldKeyMap, unkeyedVnodes) {
|
|
|
55
55
|
if (!el) el = oldKeyMap?.get(key);
|
|
56
56
|
} else el = localOldKeyMap?.get(key) ?? oldKeyMap?.get(key);
|
|
57
57
|
if (el) {
|
|
58
|
+
updateElementFromVnode(el, vnode);
|
|
58
59
|
finalNodes.push(el);
|
|
59
60
|
reusedCount++;
|
|
60
61
|
} else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastpath.js","names":[],"sources":["../../src/renderer/fastpath.ts"],"sourcesContent":["import type { VNode } from './types';\nimport { createDOMNode } from './dom';\nimport { _reconcilerRecordedParents } from './keyed';\nimport { logger } from '../dev/logger';\nimport { getRuntimeEnv } from './env';\nimport { cleanupInstanceIfPresent, removeAllListeners } from './cleanup';\nimport { setDevValue, incDevCounter } from '../runtime/dev-namespace';\nimport { isSchedulerExecuting } from '../runtime/scheduler';\nimport { isBulkCommitActive, markFastPathApplied } from '../runtime/fastlane';\n\nexport const IS_DOM_AVAILABLE = typeof document !== 'undefined';\n\n// Apply the \"renderer\" fast-path: build final node list reusing existing\n// elements by key when possible, then perform a single atomic replaceChildren\n// commit. Returns a new key map when the fast-path is applied, otherwise\n// returns null to indicate the caller should continue with fallback paths.\nexport function applyRendererFastPath(\n parent: Element,\n keyedVnodes: Array<{ key: string | number; vnode: VNode }>,\n oldKeyMap?: Map<string | number, Element>,\n unkeyedVnodes?: VNode[]\n): Map<string | number, Element> | null {\n // SSR guard: fast-path is DOM-specific\n if (typeof document === 'undefined') return null;\n\n const totalKeyed = keyedVnodes.length;\n if (totalKeyed === 0 && (!unkeyedVnodes || unkeyedVnodes.length === 0))\n return null;\n\n // Dev invariant: ensure we are executing inside the scheduler/commit flush\n if (!isSchedulerExecuting()) {\n logger.warn(\n '[Askr][FASTPATH][DEV] Fast-path reconciliation invoked outside scheduler execution'\n );\n }\n\n // Choose lookup strategy depending on size (linear scan for small lists)\n let parentChildrenArr: Element[] | undefined;\n let localOldKeyMap: Map<string | number, Element> | undefined;\n\n if (totalKeyed <= 20) {\n // Small lists: use array scan (faster than Map overhead for ≤20 items)\n try {\n parentChildrenArr = Array.from(\n parent.children,\n (child) => child as Element\n );\n } catch (e) {\n parentChildrenArr = undefined;\n void e;\n }\n } else if (!oldKeyMap || oldKeyMap.size === 0) {\n // Medium/large lists without existing key map: build from DOM\n localOldKeyMap = new Map<string | number, Element>();\n try {\n for (let ch = parent.firstElementChild; ch; ch = ch.nextElementSibling) {\n const k = ch.getAttribute('data-key');\n if (k !== null) {\n localOldKeyMap.set(k, ch);\n const n = Number(k);\n if (!Number.isNaN(n)) localOldKeyMap.set(n, ch);\n }\n }\n } catch (e) {\n localOldKeyMap = undefined;\n void e;\n }\n }\n // else: reuse oldKeyMap directly (most common case for repeat renders)\n\n const finalNodes: Node[] = [];\n let mapLookups = 0;\n let createdNodes = 0;\n let reusedCount = 0;\n\n for (let i = 0; i < keyedVnodes.length; i++) {\n const { key, vnode } = keyedVnodes[i];\n mapLookups++;\n\n let el: Element | undefined;\n if (totalKeyed <= 20 && parentChildrenArr) {\n const ks = String(key);\n for (let j = 0; j < parentChildrenArr.length; j++) {\n const ch = parentChildrenArr[j];\n const k = ch.getAttribute('data-key');\n if (k !== null && (k === ks || Number(k) === (key as number))) {\n el = ch;\n break;\n }\n }\n if (!el) el = oldKeyMap?.get(key);\n } else {\n el = localOldKeyMap?.get(key as string | number) ?? oldKeyMap?.get(key);\n }\n\n if (el) {\n finalNodes.push(el);\n reusedCount++;\n } else {\n const newEl = createDOMNode(vnode);\n if (newEl) {\n finalNodes.push(newEl);\n createdNodes++;\n }\n }\n }\n\n // Add unkeyed nodes (detached as well)\n if (unkeyedVnodes && unkeyedVnodes.length) {\n for (const vnode of unkeyedVnodes) {\n const newEl = createDOMNode(vnode);\n if (newEl) {\n finalNodes.push(newEl);\n createdNodes++;\n }\n }\n }\n\n // Atomic commit\n try {\n const tFragmentStart = Date.now();\n const fragment = document.createDocumentFragment();\n let fragmentAppendCount = 0;\n for (let i = 0; i < finalNodes.length; i++) {\n fragment.appendChild(finalNodes[i]);\n fragmentAppendCount++;\n }\n\n // Pre-cleanup: remove component instances that will be removed by replaceChildren\n try {\n // At this point, any reused nodes have been moved into the fragment,\n // so whatever remains under parent will be removed by replaceChildren.\n for (let n = parent.firstChild; n; ) {\n const next = n.nextSibling;\n if (n instanceof Element) removeAllListeners(n);\n cleanupInstanceIfPresent(n);\n n = next;\n }\n } catch (e) {\n void e;\n }\n\n try {\n incDevCounter('__DOM_REPLACE_COUNT');\n setDevValue('__LAST_DOM_REPLACE_STACK_FASTPATH', new Error().stack);\n } catch (e) {\n void e;\n }\n\n parent.replaceChildren(fragment);\n\n // Record that we performed exactly one DOM commit.\n try {\n setDevValue('__LAST_FASTPATH_COMMIT_COUNT', 1);\n } catch (e) {\n void e;\n }\n\n // If a runtime bulk commit is active, mark this parent as fast-path applied.\n try {\n if (isBulkCommitActive()) markFastPathApplied(parent);\n } catch (e) {\n void e;\n }\n\n // Phase: bookkeeping - populate newKeyMap\n const newKeyMap = new Map<string | number, Element>();\n for (let i = 0; i < keyedVnodes.length; i++) {\n const key = keyedVnodes[i].key;\n const node = finalNodes[i];\n if (node instanceof Element) newKeyMap.set(key, node as Element);\n }\n\n // Dev tracing\n try {\n const stats = {\n n: totalKeyed,\n moves: 0,\n lisLen: 0,\n t_lookup: 0,\n t_fragment: Date.now() - tFragmentStart,\n t_commit: 0,\n t_bookkeeping: 0,\n fragmentAppendCount,\n mapLookups,\n createdNodes,\n reusedCount,\n } as const;\n if (typeof globalThis !== 'undefined') {\n setDevValue('__LAST_FASTPATH_STATS', stats);\n setDevValue('__LAST_FASTPATH_REUSED', reusedCount > 0);\n incDevCounter('fastpathHistoryPush');\n }\n const env = getRuntimeEnv();\n if (\n env.ASKR_FASTPATH_DEBUG === '1' ||\n env.ASKR_FASTPATH_DEBUG === 'true'\n ) {\n logger.warn(\n '[Askr][FASTPATH]',\n JSON.stringify({ n: totalKeyed, createdNodes, reusedCount })\n );\n }\n } catch (e) {\n void e;\n }\n\n // Record that reconciler recorded stats for this parent in this pass\n try {\n _reconcilerRecordedParents.add(parent);\n } catch (e) {\n void e;\n }\n\n return newKeyMap;\n } catch (e) {\n void e;\n return null;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fastpath.js","names":[],"sources":["../../src/renderer/fastpath.ts"],"sourcesContent":["import type { VNode } from './types';\nimport { createDOMNode, updateElementFromVnode } from './dom';\nimport { _reconcilerRecordedParents } from './keyed';\nimport { logger } from '../dev/logger';\nimport { getRuntimeEnv } from './env';\nimport { cleanupInstanceIfPresent, removeAllListeners } from './cleanup';\nimport { setDevValue, incDevCounter } from '../runtime/dev-namespace';\nimport { isSchedulerExecuting } from '../runtime/scheduler';\nimport { isBulkCommitActive, markFastPathApplied } from '../runtime/fastlane';\n\nexport const IS_DOM_AVAILABLE = typeof document !== 'undefined';\n\n// Apply the \"renderer\" fast-path: build final node list reusing existing\n// elements by key when possible, then perform a single atomic replaceChildren\n// commit. Returns a new key map when the fast-path is applied, otherwise\n// returns null to indicate the caller should continue with fallback paths.\nexport function applyRendererFastPath(\n parent: Element,\n keyedVnodes: Array<{ key: string | number; vnode: VNode }>,\n oldKeyMap?: Map<string | number, Element>,\n unkeyedVnodes?: VNode[]\n): Map<string | number, Element> | null {\n // SSR guard: fast-path is DOM-specific\n if (typeof document === 'undefined') return null;\n\n const totalKeyed = keyedVnodes.length;\n if (totalKeyed === 0 && (!unkeyedVnodes || unkeyedVnodes.length === 0))\n return null;\n\n // Dev invariant: ensure we are executing inside the scheduler/commit flush\n if (!isSchedulerExecuting()) {\n logger.warn(\n '[Askr][FASTPATH][DEV] Fast-path reconciliation invoked outside scheduler execution'\n );\n }\n\n // Choose lookup strategy depending on size (linear scan for small lists)\n let parentChildrenArr: Element[] | undefined;\n let localOldKeyMap: Map<string | number, Element> | undefined;\n\n if (totalKeyed <= 20) {\n // Small lists: use array scan (faster than Map overhead for ≤20 items)\n try {\n parentChildrenArr = Array.from(\n parent.children,\n (child) => child as Element\n );\n } catch (e) {\n parentChildrenArr = undefined;\n void e;\n }\n } else if (!oldKeyMap || oldKeyMap.size === 0) {\n // Medium/large lists without existing key map: build from DOM\n localOldKeyMap = new Map<string | number, Element>();\n try {\n for (let ch = parent.firstElementChild; ch; ch = ch.nextElementSibling) {\n const k = ch.getAttribute('data-key');\n if (k !== null) {\n localOldKeyMap.set(k, ch);\n const n = Number(k);\n if (!Number.isNaN(n)) localOldKeyMap.set(n, ch);\n }\n }\n } catch (e) {\n localOldKeyMap = undefined;\n void e;\n }\n }\n // else: reuse oldKeyMap directly (most common case for repeat renders)\n\n const finalNodes: Node[] = [];\n let mapLookups = 0;\n let createdNodes = 0;\n let reusedCount = 0;\n\n for (let i = 0; i < keyedVnodes.length; i++) {\n const { key, vnode } = keyedVnodes[i];\n mapLookups++;\n\n let el: Element | undefined;\n if (totalKeyed <= 20 && parentChildrenArr) {\n const ks = String(key);\n for (let j = 0; j < parentChildrenArr.length; j++) {\n const ch = parentChildrenArr[j];\n const k = ch.getAttribute('data-key');\n if (k !== null && (k === ks || Number(k) === (key as number))) {\n el = ch;\n break;\n }\n }\n if (!el) el = oldKeyMap?.get(key);\n } else {\n el = localOldKeyMap?.get(key as string | number) ?? oldKeyMap?.get(key);\n }\n\n if (el) {\n updateElementFromVnode(el, vnode);\n finalNodes.push(el);\n reusedCount++;\n } else {\n const newEl = createDOMNode(vnode);\n if (newEl) {\n finalNodes.push(newEl);\n createdNodes++;\n }\n }\n }\n\n // Add unkeyed nodes (detached as well)\n if (unkeyedVnodes && unkeyedVnodes.length) {\n for (const vnode of unkeyedVnodes) {\n const newEl = createDOMNode(vnode);\n if (newEl) {\n finalNodes.push(newEl);\n createdNodes++;\n }\n }\n }\n\n // Atomic commit\n try {\n const tFragmentStart = Date.now();\n const fragment = document.createDocumentFragment();\n let fragmentAppendCount = 0;\n for (let i = 0; i < finalNodes.length; i++) {\n fragment.appendChild(finalNodes[i]);\n fragmentAppendCount++;\n }\n\n // Pre-cleanup: remove component instances that will be removed by replaceChildren\n try {\n // At this point, any reused nodes have been moved into the fragment,\n // so whatever remains under parent will be removed by replaceChildren.\n for (let n = parent.firstChild; n; ) {\n const next = n.nextSibling;\n if (n instanceof Element) removeAllListeners(n);\n cleanupInstanceIfPresent(n);\n n = next;\n }\n } catch (e) {\n void e;\n }\n\n try {\n incDevCounter('__DOM_REPLACE_COUNT');\n setDevValue('__LAST_DOM_REPLACE_STACK_FASTPATH', new Error().stack);\n } catch (e) {\n void e;\n }\n\n parent.replaceChildren(fragment);\n\n // Record that we performed exactly one DOM commit.\n try {\n setDevValue('__LAST_FASTPATH_COMMIT_COUNT', 1);\n } catch (e) {\n void e;\n }\n\n // If a runtime bulk commit is active, mark this parent as fast-path applied.\n try {\n if (isBulkCommitActive()) markFastPathApplied(parent);\n } catch (e) {\n void e;\n }\n\n // Phase: bookkeeping - populate newKeyMap\n const newKeyMap = new Map<string | number, Element>();\n for (let i = 0; i < keyedVnodes.length; i++) {\n const key = keyedVnodes[i].key;\n const node = finalNodes[i];\n if (node instanceof Element) newKeyMap.set(key, node as Element);\n }\n\n // Dev tracing\n try {\n const stats = {\n n: totalKeyed,\n moves: 0,\n lisLen: 0,\n t_lookup: 0,\n t_fragment: Date.now() - tFragmentStart,\n t_commit: 0,\n t_bookkeeping: 0,\n fragmentAppendCount,\n mapLookups,\n createdNodes,\n reusedCount,\n } as const;\n if (typeof globalThis !== 'undefined') {\n setDevValue('__LAST_FASTPATH_STATS', stats);\n setDevValue('__LAST_FASTPATH_REUSED', reusedCount > 0);\n incDevCounter('fastpathHistoryPush');\n }\n const env = getRuntimeEnv();\n if (\n env.ASKR_FASTPATH_DEBUG === '1' ||\n env.ASKR_FASTPATH_DEBUG === 'true'\n ) {\n logger.warn(\n '[Askr][FASTPATH]',\n JSON.stringify({ n: totalKeyed, createdNodes, reusedCount })\n );\n }\n } catch (e) {\n void e;\n }\n\n // Record that reconciler recorded stats for this parent in this pass\n try {\n _reconcilerRecordedParents.add(parent);\n } catch (e) {\n void e;\n }\n\n return newKeyMap;\n } catch (e) {\n void e;\n return null;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import { getSignal } from "../runtime/component.js";
|
|
2
2
|
import { ResourceResult, capture, on, resource, stream, task, timer } from "../runtime/operations.js";
|
|
3
|
-
|
|
3
|
+
import { Mutation, Query, QueryConsistency, createMutation, createQuery, invalidate } from "../data/index.js";
|
|
4
|
+
export { type Mutation, type Query, type QueryConsistency, type ResourceResult, capture, createMutation, createQuery, getSignal, invalidate, on, resource, stream, task, timer };
|
package/dist/resources/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import { getSignal } from "../runtime/component.js";
|
|
2
2
|
import { capture, on, resource, stream, task, timer } from "../runtime/operations.js";
|
|
3
|
-
|
|
3
|
+
import { createMutation, createQuery, invalidate } from "../data/index.js";
|
|
4
|
+
export { capture, createMutation, createQuery, getSignal, invalidate, on, resource, stream, task, timer };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@askrjs/askr",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.33",
|
|
4
4
|
"description": "Actor-backed deterministic UI framework",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"askr",
|
|
@@ -50,6 +50,10 @@
|
|
|
50
50
|
"import": "./dist/resources/index.js",
|
|
51
51
|
"types": "./dist/resources/index.d.ts"
|
|
52
52
|
},
|
|
53
|
+
"./data": {
|
|
54
|
+
"import": "./dist/data/index.js",
|
|
55
|
+
"types": "./dist/data/index.d.ts"
|
|
56
|
+
},
|
|
53
57
|
"./fx": {
|
|
54
58
|
"import": "./dist/fx/index.js",
|
|
55
59
|
"types": "./dist/fx/index.d.ts"
|
|
@@ -97,7 +101,7 @@
|
|
|
97
101
|
"bench:tier4": "vp test bench -c vitest.bench.dom.tier4.config.ts --run"
|
|
98
102
|
},
|
|
99
103
|
"devDependencies": {
|
|
100
|
-
"@axe-core/playwright": "^4.11.
|
|
104
|
+
"@axe-core/playwright": "^4.11.3",
|
|
101
105
|
"@playwright/test": "^1.59.1",
|
|
102
106
|
"@types/node": "^25.6.0",
|
|
103
107
|
"jsdom": "^29.1.1",
|