@askrjs/askr 0.0.3 → 0.0.5
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 +8 -5
- package/dist/fx.d.ts +186 -0
- package/dist/fx.js +636 -0
- package/dist/fx.js.map +1 -0
- package/dist/index.d.ts +74 -407
- package/dist/index.js +3706 -779
- package/dist/index.js.map +1 -1
- package/dist/{types-DLTViI21.d.ts → jsx-AzPM8gMS.d.ts} +6 -21
- package/dist/{jsx/jsx-dev-runtime.d.ts → jsx-dev-runtime.d.ts} +3 -2
- package/dist/jsx-dev-runtime.js +17 -0
- package/dist/jsx-dev-runtime.js.map +1 -0
- package/dist/jsx-runtime.d.ts +14 -0
- package/dist/{chunk-SALJX5PZ.js → jsx-runtime.js} +6 -9
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/resources.d.ts +21 -0
- package/dist/resources.js +785 -0
- package/dist/resources.js.map +1 -0
- package/dist/router-DaGtH1Sq.d.ts +36 -0
- package/dist/router.d.ts +64 -0
- package/dist/{chunk-2ONGHQ7Z.js → router.js} +719 -689
- package/dist/router.js.map +1 -0
- package/dist/ssr.d.ts +123 -0
- package/dist/{index.cjs → ssr.js} +1472 -2737
- package/dist/ssr.js.map +1 -0
- package/dist/types-uOPfcrdz.d.ts +25 -0
- package/dist/vite/index.d.ts +17 -0
- package/dist/vite/index.js +2306 -0
- package/dist/vite/index.js.map +1 -0
- package/package.json +37 -28
- package/dist/chunk-2ONGHQ7Z.js.map +0 -1
- package/dist/chunk-H3NSVHA7.js +0 -80
- package/dist/chunk-H3NSVHA7.js.map +0 -1
- package/dist/chunk-JHOGWTAW.js +0 -16
- package/dist/chunk-JHOGWTAW.js.map +0 -1
- package/dist/chunk-OFW6DFBM.js +0 -716
- package/dist/chunk-OFW6DFBM.js.map +0 -1
- package/dist/chunk-SALJX5PZ.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -501
- package/dist/jsx/jsx-dev-runtime.cjs +0 -46
- package/dist/jsx/jsx-dev-runtime.cjs.map +0 -1
- package/dist/jsx/jsx-dev-runtime.d.cts +0 -11
- package/dist/jsx/jsx-dev-runtime.js +0 -19
- package/dist/jsx/jsx-dev-runtime.js.map +0 -1
- package/dist/jsx/jsx-runtime.cjs +0 -54
- package/dist/jsx/jsx-runtime.cjs.map +0 -1
- package/dist/jsx/jsx-runtime.d.cts +0 -20
- package/dist/jsx/jsx-runtime.d.ts +0 -20
- package/dist/jsx/jsx-runtime.js +0 -16
- package/dist/jsx/jsx-runtime.js.map +0 -1
- package/dist/navigate-CZEUXFPM.js +0 -16
- package/dist/navigate-CZEUXFPM.js.map +0 -1
- package/dist/route-USEXGOBT.js +0 -31
- package/dist/route-USEXGOBT.js.map +0 -1
- package/dist/ssr-QJ5NTQR6.js +0 -28
- package/dist/ssr-QJ5NTQR6.js.map +0 -1
- package/dist/types-DLTViI21.d.cts +0 -50
- package/src/jsx/index.ts +0 -4
- package/src/jsx/jsx-dev-runtime.ts +0 -23
- package/src/jsx/jsx-runtime.ts +0 -48
- package/src/jsx/types.ts +0 -46
- package/src/jsx/utils.ts +0 -19
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dev/invariant.ts","../src/dev/logger.ts","../src/runtime/scheduler.ts","../src/renderer/utils.ts","../src/renderer/keyed.ts","../src/common/jsx.ts","../src/runtime/dev-namespace.ts","../src/runtime/fastlane.ts","../src/runtime/ssr-bridge.ts","../src/runtime/operations.ts"],"names":["isBulkCommitActive","ssr","renderData"],"mappings":"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","file":"resources.js","sourcesContent":["/**\n * Invariant assertion utilities for correctness checking\n * Production-safe: invariants are enforced at build-time or with minimal overhead\n *\n * Core principle: fail fast when invariants are violated\n * All functions throw descriptive errors for debugging\n */\n\n/**\n * Assert a condition; throw with context if false\n * @internal\n */\nexport function invariant(\n condition: boolean,\n message: string,\n context?: Record<string, unknown>\n): asserts condition {\n if (!condition) {\n const contextStr = context ? '\\n' + JSON.stringify(context, null, 2) : '';\n throw new Error(`[Askr Invariant] ${message}${contextStr}`);\n }\n}\n\n/**\n * Assert object property exists and has correct type\n * @internal\n */\nexport function assertProperty<T extends object, K extends keyof T>(\n obj: T,\n prop: K,\n expectedType?: string\n): asserts obj is T & Required<Pick<T, K>> {\n invariant(prop in obj, `Object missing required property '${String(prop)}'`, {\n object: obj,\n });\n\n if (expectedType) {\n const actualType = typeof obj[prop];\n invariant(\n actualType === expectedType,\n `Property '${String(prop)}' has type '${actualType}', expected '${expectedType}'`,\n { value: obj[prop], expectedType }\n );\n }\n}\n\n/**\n * Assert a reference is not null/undefined\n * @internal\n */\nexport function assertDefined<T>(\n value: T | null | undefined,\n message: string\n): asserts value is T {\n invariant(value !== null && value !== undefined, message, { value });\n}\n\n/**\n * Assert a task runs exactly once atomically\n * Useful for verifying lifecycle events fire precisely when expected\n * @internal\n */\nexport class Once {\n private called = false;\n private calledAt: number | null = null;\n readonly name: string;\n\n constructor(name: string) {\n this.name = name;\n }\n\n check(): boolean {\n return this.called;\n }\n\n mark(): void {\n invariant(\n !this.called,\n `${this.name} called multiple times (previously at ${this.calledAt}ms)`,\n { now: Date.now() }\n );\n this.called = true;\n this.calledAt = Date.now();\n }\n\n reset(): void {\n this.called = false;\n this.calledAt = null;\n }\n}\n\n/**\n * Assert a value falls in an enumerated set\n * @internal\n */\nexport function assertEnum<T extends readonly unknown[]>(\n value: unknown,\n allowedValues: T,\n fieldName: string\n): asserts value is T[number] {\n invariant(\n allowedValues.includes(value),\n `${fieldName} must be one of [${allowedValues.join(', ')}], got ${JSON.stringify(value)}`,\n { value, allowed: allowedValues }\n );\n}\n\n/**\n * Assert execution context (scheduler, component, etc)\n * @internal\n */\nexport function assertContext(\n actual: unknown,\n expected: unknown,\n contextName: string\n): asserts actual is typeof expected {\n invariant(\n actual === expected,\n `Invalid ${contextName} context. Expected ${expected}, got ${actual}`,\n { expected, actual }\n );\n}\n\n/**\n * Assert scheduling precondition (not reentering, not during render, etc)\n * @internal\n */\nexport function assertSchedulingPrecondition(\n condition: boolean,\n violationMessage: string\n): asserts condition {\n invariant(condition, `[Scheduler Precondition] ${violationMessage}`);\n}\n\n/**\n * Assert state precondition\n * @internal\n */\nexport function assertStatePrecondition(\n condition: boolean,\n violationMessage: string\n): asserts condition {\n invariant(condition, `[State Precondition] ${violationMessage}`);\n}\n\n/**\n * Verify AbortController lifecycle\n * @internal\n */\nexport function assertAbortControllerState(\n signal: AbortSignal,\n expectedAborted: boolean,\n context: string\n): void {\n invariant(\n signal.aborted === expectedAborted,\n `AbortSignal ${expectedAborted ? 'should be' : 'should not be'} aborted in ${context}`,\n { actual: signal.aborted, expected: expectedAborted }\n );\n}\n\n/**\n * Guard: throw if callback is null when it shouldn't be\n * Used for notifyUpdate, event handlers, etc.\n * @internal\n */\nexport function assertCallbackAvailable<\n T extends (...args: unknown[]) => unknown,\n>(callback: T | null | undefined, callbackName: string): asserts callback is T {\n invariant(\n callback !== null && callback !== undefined,\n `${callbackName} callback is required but not available`,\n { callback }\n );\n}\n\n/**\n * Verify evaluation generation prevents stale evaluations\n * @internal\n */\nexport function assertEvaluationGeneration(\n current: number,\n latest: number,\n context: string\n): void {\n invariant(\n current === latest,\n `Stale evaluation generation in ${context}: current ${current}, latest ${latest}`,\n { current, latest }\n );\n}\n\n/**\n * Verify mounted flag state\n * @internal\n */\nexport function assertMountedState(\n mounted: boolean,\n expectedMounted: boolean,\n context: string\n): void {\n invariant(\n mounted === expectedMounted,\n `Invalid mounted state in ${context}: expected ${expectedMounted}, got ${mounted}`,\n { mounted, expected: expectedMounted }\n );\n}\n\n/**\n * Verify no null target when rendering\n * @internal\n */\nexport function assertRenderTarget(\n target: Element | null,\n context: string\n): asserts target is Element {\n invariant(target !== null, `Cannot render in ${context}: target is null`, {\n target,\n });\n}\n","/**\n * Centralized logger interface\n * - Keeps production builds silent for debug/warn/info messages\n * - Ensures consistent behavior across the codebase\n * - Protects against missing `console` in some environments\n */\n\nfunction callConsole(method: string, args: unknown[]): void {\n const c = typeof console !== 'undefined' ? (console as unknown) : undefined;\n if (!c) return;\n const fn = (c as Record<string, unknown>)[method];\n if (typeof fn === 'function') {\n try {\n (fn as (...a: unknown[]) => unknown).apply(console, args as unknown[]);\n } catch {\n // ignore logging errors\n }\n }\n}\n\nexport const logger = {\n debug: (...args: unknown[]) => {\n if (process.env.NODE_ENV === 'production') return;\n callConsole('debug', args);\n },\n\n info: (...args: unknown[]) => {\n if (process.env.NODE_ENV === 'production') return;\n callConsole('info', args);\n },\n\n warn: (...args: unknown[]) => {\n if (process.env.NODE_ENV === 'production') return;\n callConsole('warn', args);\n },\n\n error: (...args: unknown[]) => {\n callConsole('error', args);\n },\n};\n","/**\n * Serialized update scheduler — safer design (no inline execution, explicit flush)\n *\n * Key ideas:\n * - Never execute a task inline from `enqueue`.\n * - `flush()` is explicit and non-reentrant.\n * - `runWithSyncProgress()` allows enqueues temporarily but does not run tasks\n * inline; it runs `fn` and then does an explicit `flush()`.\n * - `waitForFlush()` is race-free with a monotonic `flushVersion`.\n */\n\nimport { assertSchedulingPrecondition, invariant } from '../dev/invariant';\nimport { logger } from '../dev/logger';\n\nconst MAX_FLUSH_DEPTH = 50;\n\ntype Task = () => void;\n\nfunction isBulkCommitActive(): boolean {\n try {\n const fb = (\n globalThis as {\n __ASKR_FASTLANE?: { isBulkCommitActive?: () => boolean };\n }\n ).__ASKR_FASTLANE;\n return typeof fb?.isBulkCommitActive === 'function'\n ? !!fb.isBulkCommitActive()\n : false;\n } catch (e) {\n void e;\n return false;\n }\n}\n\nexport class Scheduler {\n private q: Task[] = [];\n private head = 0;\n\n private running = false;\n private inHandler = false;\n private depth = 0;\n private executionDepth = 0; // for compat with existing diagnostics\n\n // Monotonic flush version increments at end of each flush\n private flushVersion = 0;\n\n // Best-effort microtask kick scheduling\n private kickScheduled = false;\n\n // Escape hatch flag for runWithSyncProgress\n private allowSyncProgress = false;\n\n // Waiters waiting for flushVersion >= target\n private waiters: Array<{\n target: number;\n resolve: () => void;\n reject: (err: unknown) => void;\n timer?: ReturnType<typeof setTimeout>;\n }> = [];\n\n // Keep a lightweight taskCount for compatibility/diagnostics\n private taskCount = 0;\n\n enqueue(task: Task): void {\n assertSchedulingPrecondition(\n typeof task === 'function',\n 'enqueue() requires a function'\n );\n\n // Strict rule: during bulk commit, only allow enqueues if runWithSyncProgress enabled\n if (isBulkCommitActive() && !this.allowSyncProgress) {\n if (process.env.NODE_ENV !== 'production') {\n throw new Error(\n '[Scheduler] enqueue() during bulk commit (not allowed)'\n );\n }\n return;\n }\n\n // Enqueue task and account counts\n this.q.push(task);\n this.taskCount++;\n\n // Microtask kick: best-effort, but avoid if we are in handler or running or bulk commit\n if (\n !this.running &&\n !this.kickScheduled &&\n !this.inHandler &&\n !isBulkCommitActive()\n ) {\n this.kickScheduled = true;\n queueMicrotask(() => {\n this.kickScheduled = false;\n if (this.running) return;\n if (isBulkCommitActive()) return;\n try {\n this.flush();\n } catch (err) {\n setTimeout(() => {\n throw err;\n });\n }\n });\n }\n }\n\n flush(): void {\n invariant(\n !this.running,\n '[Scheduler] flush() called while already running'\n );\n\n // Dev-only guard: disallow flush during bulk commit unless allowed\n if (process.env.NODE_ENV !== 'production') {\n if (isBulkCommitActive() && !this.allowSyncProgress) {\n throw new Error(\n '[Scheduler] flush() started during bulk commit (not allowed)'\n );\n }\n }\n\n this.running = true;\n this.depth = 0;\n let fatal: unknown = null;\n\n try {\n while (this.head < this.q.length) {\n this.depth++;\n if (\n process.env.NODE_ENV !== 'production' &&\n this.depth > MAX_FLUSH_DEPTH\n ) {\n throw new Error(\n `[Scheduler] exceeded MAX_FLUSH_DEPTH (${MAX_FLUSH_DEPTH}). Likely infinite update loop.`\n );\n }\n\n const task = this.q[this.head++];\n try {\n this.executionDepth++;\n task();\n this.executionDepth--;\n } catch (err) {\n // ensure executionDepth stays balanced\n if (this.executionDepth > 0) this.executionDepth = 0;\n fatal = err;\n break;\n }\n\n // Account for executed task in taskCount\n if (this.taskCount > 0) this.taskCount--;\n }\n } finally {\n this.running = false;\n this.depth = 0;\n this.executionDepth = 0;\n\n // Compact queue\n if (this.head >= this.q.length) {\n this.q.length = 0;\n this.head = 0;\n } else if (this.head > 0) {\n const remaining = this.q.length - this.head;\n // HOT PATH: compact in-place to avoid slice() allocations (GC tail spikes)\n for (let i = 0; i < remaining; i++) {\n this.q[i] = this.q[this.head + i];\n }\n this.q.length = remaining;\n this.head = 0;\n }\n\n // Advance flush epoch and resolve waiters\n this.flushVersion++;\n this.resolveWaiters();\n }\n\n if (fatal) throw fatal;\n }\n\n runWithSyncProgress<T>(fn: () => T): T {\n const prev = this.allowSyncProgress;\n this.allowSyncProgress = true;\n\n const g = globalThis as {\n queueMicrotask?: (...args: unknown[]) => void;\n setTimeout?: (...args: unknown[]) => unknown;\n };\n const origQueueMicrotask = g.queueMicrotask;\n const origSetTimeout = g.setTimeout;\n\n if (process.env.NODE_ENV !== 'production') {\n g.queueMicrotask = () => {\n throw new Error(\n '[Scheduler] queueMicrotask not allowed during runWithSyncProgress'\n );\n };\n g.setTimeout = () => {\n throw new Error(\n '[Scheduler] setTimeout not allowed during runWithSyncProgress'\n );\n };\n }\n\n // Snapshot flushVersion so we can ensure we always complete an epoch\n const startVersion = this.flushVersion;\n\n try {\n const res = fn();\n\n // Flush deterministically if tasks were enqueued (and we're not already running)\n if (!this.running && this.q.length - this.head > 0) {\n this.flush();\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (this.q.length - this.head > 0) {\n throw new Error(\n '[Scheduler] tasks remain after runWithSyncProgress flush'\n );\n }\n }\n\n return res;\n } finally {\n // Restore guarded globals\n if (process.env.NODE_ENV !== 'production') {\n g.queueMicrotask = origQueueMicrotask;\n g.setTimeout = origSetTimeout;\n }\n\n // If no flush happened during the protected window, complete an epoch so\n // observers (tests) see progress even when fast-lane did synchronous work\n // without enqueuing tasks.\n try {\n if (this.flushVersion === startVersion) {\n this.flushVersion++;\n this.resolveWaiters();\n }\n } catch (e) {\n void e;\n }\n\n this.allowSyncProgress = prev;\n }\n }\n\n waitForFlush(targetVersion?: number, timeoutMs = 2000): Promise<void> {\n const target =\n typeof targetVersion === 'number' ? targetVersion : this.flushVersion + 1;\n if (this.flushVersion >= target) return Promise.resolve();\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n const ns =\n (\n globalThis as unknown as Record<string, unknown> & {\n __ASKR__?: Record<string, unknown>;\n }\n ).__ASKR__ || {};\n const diag = {\n flushVersion: this.flushVersion,\n queueLen: this.q.length - this.head,\n running: this.running,\n inHandler: this.inHandler,\n bulk: isBulkCommitActive(),\n namespace: ns,\n };\n reject(\n new Error(\n `waitForFlush timeout ${timeoutMs}ms: ${JSON.stringify(diag)}`\n )\n );\n }, timeoutMs);\n\n this.waiters.push({ target, resolve, reject, timer });\n });\n }\n\n getState() {\n // Provide the compatibility shape expected by diagnostics/tests\n return {\n queueLength: this.q.length - this.head,\n running: this.running,\n depth: this.depth,\n executionDepth: this.executionDepth,\n taskCount: this.taskCount,\n flushVersion: this.flushVersion,\n // New fields for optional inspection\n inHandler: this.inHandler,\n allowSyncProgress: this.allowSyncProgress,\n };\n }\n\n setInHandler(v: boolean) {\n this.inHandler = v;\n }\n\n isInHandler(): boolean {\n return this.inHandler;\n }\n\n isExecuting(): boolean {\n return this.running || this.executionDepth > 0;\n }\n\n // Clear pending synchronous tasks (used by fastlane enter/exit)\n clearPendingSyncTasks(): number {\n const remaining = this.q.length - this.head;\n if (remaining <= 0) return 0;\n\n if (this.running) {\n this.q.length = this.head;\n this.taskCount = Math.max(0, this.taskCount - remaining);\n queueMicrotask(() => {\n try {\n this.flushVersion++;\n this.resolveWaiters();\n } catch (e) {\n void e;\n }\n });\n return remaining;\n }\n\n this.q.length = 0;\n this.head = 0;\n this.taskCount = Math.max(0, this.taskCount - remaining);\n this.flushVersion++;\n this.resolveWaiters();\n return remaining;\n }\n\n private resolveWaiters() {\n if (this.waiters.length === 0) return;\n const ready: Array<() => void> = [];\n const remaining: typeof this.waiters = [];\n\n for (const w of this.waiters) {\n if (this.flushVersion >= w.target) {\n if (w.timer) clearTimeout(w.timer);\n ready.push(w.resolve);\n } else {\n remaining.push(w);\n }\n }\n\n this.waiters = remaining;\n for (const r of ready) r();\n }\n}\n\nexport const globalScheduler = new Scheduler();\n\nexport function isSchedulerExecuting(): boolean {\n return globalScheduler.isExecuting();\n}\n\nexport function scheduleEventHandler(handler: EventListener): EventListener {\n return (event: Event) => {\n globalScheduler.setInHandler(true);\n try {\n handler.call(null, event);\n } catch (error) {\n logger.error('[Askr] Event handler error:', error);\n } finally {\n globalScheduler.setInHandler(false);\n // If the handler enqueued tasks while we disallowed microtask kicks,\n // ensure we schedule a microtask to flush them now that the handler\n // has completed. This avoids tests timing out waiting for flush.\n const state = globalScheduler.getState();\n if ((state.queueLength ?? 0) > 0 && !state.running) {\n queueMicrotask(() => {\n try {\n if (!globalScheduler.isExecuting()) globalScheduler.flush();\n } catch (err) {\n setTimeout(() => {\n throw err;\n });\n }\n });\n }\n }\n };\n}\n","/**\n * Shared utilities for the renderer module.\n * Consolidates common patterns to reduce code duplication.\n */\n\nimport { globalScheduler } from '../runtime/scheduler';\nimport { logger } from '../dev/logger';\nimport { __ASKR_set, __ASKR_incCounter } from './diag';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ListenerEntry {\n handler: EventListener;\n original: EventListener;\n options?: boolean | AddEventListenerOptions;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Event Handler Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Parse an event prop name (e.g., 'onClick') to its DOM event name (e.g., 'click')\n */\nexport function parseEventName(propName: string): string | null {\n if (!propName.startsWith('on') || propName.length <= 2) return null;\n return (\n propName.slice(2).charAt(0).toLowerCase() + propName.slice(3).toLowerCase()\n );\n}\n\n/**\n * Get default event listener options for passive events\n */\nexport function getPassiveOptions(\n eventName: string\n): AddEventListenerOptions | undefined {\n if (\n eventName === 'wheel' ||\n eventName === 'scroll' ||\n eventName.startsWith('touch')\n ) {\n return { passive: true };\n }\n return undefined;\n}\n\n/**\n * Create a wrapped event handler that integrates with the scheduler\n */\nexport function createWrappedHandler(\n handler: EventListener,\n flushAfter = false\n): EventListener {\n return (event: Event) => {\n globalScheduler.setInHandler(true);\n try {\n handler(event);\n } catch (error) {\n logger.error('[Askr] Event handler error:', error);\n } finally {\n globalScheduler.setInHandler(false);\n if (flushAfter) {\n // If the handler enqueued tasks while we disallowed microtask kicks,\n // ensure we schedule a microtask to flush them\n const state = globalScheduler.getState();\n if ((state.queueLength ?? 0) > 0 && !state.running) {\n queueMicrotask(() => {\n try {\n if (!globalScheduler.isExecuting()) globalScheduler.flush();\n } catch (err) {\n queueMicrotask(() => {\n throw err;\n });\n }\n });\n }\n }\n }\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Prop/Attribute Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Props that should be skipped during attribute processing */\nexport function isSkippedProp(key: string): boolean {\n return key === 'children' || key === 'key';\n}\n\n/** Check if prop should be ignored for prop-change detection */\nexport function isIgnoredForPropChanges(key: string): boolean {\n if (key === 'children' || key === 'key') return true;\n if (key.startsWith('on') && key.length > 2) return true;\n if (key.startsWith('data-')) return true;\n return false;\n}\n\n/**\n * Check if an element's current attribute value differs from vnode value\n */\nexport function hasPropChanged(\n el: Element,\n key: string,\n value: unknown\n): boolean {\n try {\n if (key === 'class' || key === 'className') {\n return el.className !== String(value);\n }\n if (key === 'value' || key === 'checked') {\n return (el as HTMLElement & Record<string, unknown>)[key] !== value;\n }\n const attr = el.getAttribute(key);\n if (value === undefined || value === null || value === false) {\n return attr !== null;\n }\n return String(value) !== attr;\n } catch {\n return true;\n }\n}\n\n/**\n * Check if a vnode has non-trivial props (excluding events and data-*)\n */\nexport function hasNonTrivialProps(props: Record<string, unknown>): boolean {\n for (const k of Object.keys(props)) {\n if (isIgnoredForPropChanges(k)) continue;\n return true;\n }\n return false;\n}\n\n/**\n * Check for prop changes between vnode and existing element\n */\nexport function checkPropChanges(\n el: Element,\n props: Record<string, unknown>\n): boolean {\n for (const k of Object.keys(props)) {\n if (isIgnoredForPropChanges(k)) continue;\n if (hasPropChanged(el, k, props[k])) {\n return true;\n }\n }\n return false;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Key Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Extract key from a vnode object\n */\nexport function extractKey(vnode: unknown): string | number | undefined {\n if (typeof vnode !== 'object' || vnode === null) return undefined;\n const obj = vnode as Record<string, unknown>;\n const rawKey =\n obj.key ?? (obj.props as Record<string, unknown> | undefined)?.key;\n if (rawKey === undefined) return undefined;\n return typeof rawKey === 'symbol'\n ? String(rawKey)\n : (rawKey as string | number);\n}\n\n/**\n * Build a key map from element's children\n */\nexport function buildKeyMapFromChildren(\n parent: Element\n): Map<string | number, Element> {\n const map = new Map<string | number, Element>();\n for (let ch = parent.firstElementChild; ch; ch = ch.nextElementSibling) {\n const k = ch.getAttribute('data-key');\n if (k !== null) {\n map.set(k, ch);\n const n = Number(k);\n if (!Number.isNaN(n)) map.set(n, ch);\n }\n }\n return map;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Diagnostic Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Record DOM replace operation for diagnostics\n */\nexport function recordDOMReplace(source: string): void {\n try {\n __ASKR_incCounter('__DOM_REPLACE_COUNT');\n __ASKR_set(`__LAST_DOM_REPLACE_STACK_${source}`, new Error().stack);\n } catch {\n // ignore\n }\n}\n\n/**\n * Record fast-path stats for diagnostics\n */\nexport function recordFastPathStats(\n stats: Record<string, unknown>,\n counterName?: string\n): void {\n try {\n __ASKR_set('__LAST_FASTPATH_STATS', stats);\n __ASKR_set('__LAST_FASTPATH_COMMIT_COUNT', 1);\n if (counterName) {\n __ASKR_incCounter(counterName);\n }\n } catch {\n // ignore\n }\n}\n\n/**\n * Conditionally log debug info for fast-path operations\n */\nexport function logFastPathDebug(\n message: string,\n indexOrData?: number | unknown,\n data?: unknown\n): void {\n if (\n process.env.ASKR_FASTPATH_DEBUG === '1' ||\n process.env.ASKR_FASTPATH_DEBUG === 'true'\n ) {\n if (data !== undefined) {\n logger.warn(`[Askr][FASTPATH] ${message}`, indexOrData, data);\n } else if (indexOrData !== undefined) {\n logger.warn(`[Askr][FASTPATH] ${message}`, indexOrData);\n } else {\n logger.warn(`[Askr][FASTPATH] ${message}`);\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Performance Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Get current high-resolution timestamp\n */\nexport function now(): number {\n return typeof performance !== 'undefined' && performance.now\n ? performance.now()\n : Date.now();\n}\n","import type { VNode } from './types';\nimport {\n extractKey,\n buildKeyMapFromChildren,\n isIgnoredForPropChanges,\n hasPropChanged,\n hasNonTrivialProps,\n} from './utils';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Key Map Registry\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const keyedElements = new WeakMap<\n Element,\n Map<string | number, Element>\n>();\n\n/**\n * Retrieve existing keyed map for a parent element (runtime use)\n */\nexport function getKeyMapForElement(el: Element) {\n return keyedElements.get(el);\n}\n\n/**\n * Populate a keyed map for an element by scanning its immediate children\n * for `data-key` attributes. Proactive initialization for runtime layers.\n */\nexport function populateKeyMapForElement(parent: Element): void {\n try {\n if (keyedElements.has(parent)) return;\n\n let domMap = buildKeyMapFromChildren(parent);\n\n // Fallback: map by textContent when keys are not materialized as attrs\n if (domMap.size === 0) {\n domMap = new Map();\n const children = Array.from(parent.children);\n for (const ch of children) {\n const text = (ch.textContent || '').trim();\n if (text) {\n domMap.set(text, ch);\n const n = Number(text);\n if (!Number.isNaN(n)) domMap.set(n, ch);\n }\n }\n }\n\n if (domMap.size > 0) keyedElements.set(parent, domMap);\n } catch {\n // ignore\n }\n}\n\n// Track which parents had the reconciler record fast-path stats during the\n// current evaluation, so we can preserve diagnostics across additional\n// reconciliations within the same render pass without leaking between runs.\nexport const _reconcilerRecordedParents = new WeakSet<Element>();\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Fast-Path Eligibility\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface KeyedVnode {\n key: string | number;\n vnode: VNode;\n}\n\n/**\n * Extract keyed vnodes from children array\n */\nfunction extractKeyedVnodes(newChildren: VNode[]): KeyedVnode[] {\n const result: KeyedVnode[] = [];\n for (const child of newChildren) {\n const key = extractKey(child);\n if (key !== undefined) {\n result.push({ key, vnode: child });\n }\n }\n return result;\n}\n\n/**\n * Compute LIS (Longest Increasing Subsequence) length for positions\n */\nfunction computeLISLength(positions: number[]): number {\n const tails: number[] = [];\n for (const pos of positions) {\n if (pos === -1) continue;\n let lo = 0;\n let hi = tails.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (tails[mid] < pos) lo = mid + 1;\n else hi = mid;\n }\n if (lo === tails.length) tails.push(pos);\n else tails[lo] = pos;\n }\n return tails.length;\n}\n\n/**\n * Check if any vnode has non-trivial props\n */\nfunction checkVnodesHaveProps(keyedVnodes: KeyedVnode[]): boolean {\n for (const { vnode } of keyedVnodes) {\n if (typeof vnode !== 'object' || vnode === null) continue;\n const vnodeObj = vnode as unknown as { props?: Record<string, unknown> };\n if (vnodeObj.props && hasNonTrivialProps(vnodeObj.props)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check for prop changes between vnodes and existing elements\n */\nfunction checkVnodePropChanges(\n keyedVnodes: KeyedVnode[],\n oldKeyMap: Map<string | number, Element> | undefined\n): boolean {\n for (const { key, vnode } of keyedVnodes) {\n const el = oldKeyMap?.get(key);\n if (!el || typeof vnode !== 'object' || vnode === null) continue;\n const vnodeObj = vnode as unknown as { props?: Record<string, unknown> };\n const props = vnodeObj.props || {};\n for (const k of Object.keys(props)) {\n if (isIgnoredForPropChanges(k)) continue;\n if (hasPropChanged(el, k, props[k])) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Determine if keyed reorder fast-path should be used\n */\nexport function isKeyedReorderFastPathEligible(\n parent: Element,\n newChildren: VNode[],\n oldKeyMap: Map<string | number, Element> | undefined\n) {\n const keyedVnodes = extractKeyedVnodes(newChildren);\n const totalKeyed = keyedVnodes.length;\n const newKeyOrder = keyedVnodes.map((kv) => kv.key);\n const oldKeyOrder = oldKeyMap ? Array.from(oldKeyMap.keys()) : [];\n\n // Count moves needed\n let moveCount = 0;\n for (let i = 0; i < newKeyOrder.length; i++) {\n const k = newKeyOrder[i];\n if (i >= oldKeyOrder.length || oldKeyOrder[i] !== k || !oldKeyMap?.has(k)) {\n moveCount++;\n }\n }\n\n // Check move threshold triggers\n const FAST_MOVE_THRESHOLD_ABS = 64;\n const FAST_MOVE_THRESHOLD_REL = 0.1;\n const cheapMoveTrigger =\n totalKeyed >= 128 &&\n oldKeyOrder.length > 0 &&\n moveCount >\n Math.max(\n FAST_MOVE_THRESHOLD_ABS,\n Math.floor(totalKeyed * FAST_MOVE_THRESHOLD_REL)\n );\n\n // Compute LIS trigger for large lists\n let lisTrigger = false;\n let lisLen = 0;\n if (totalKeyed >= 128) {\n const parentChildren = Array.from(parent.children);\n const positions = keyedVnodes.map(({ key }) => {\n const el = oldKeyMap?.get(key);\n return el?.parentElement === parent ? parentChildren.indexOf(el) : -1;\n });\n lisLen = computeLISLength(positions);\n lisTrigger = lisLen < Math.floor(totalKeyed * 0.5);\n }\n\n // Check for props that would prevent fast-path\n const hasPropsPresent = checkVnodesHaveProps(keyedVnodes);\n const hasPropChanges = checkVnodePropChanges(keyedVnodes, oldKeyMap);\n\n const useFastPath =\n (cheapMoveTrigger || lisTrigger) && !hasPropChanges && !hasPropsPresent;\n\n return {\n useFastPath,\n totalKeyed,\n moveCount,\n lisLen,\n hasPropChanges,\n } as const;\n}\n","/**\n * Common call contracts: JSX element shape\n */\n\nimport type { Props } from './props';\n\nexport const ELEMENT_TYPE = Symbol.for('askr.element');\nexport const Fragment = Symbol.for('askr.fragment');\n\nexport interface JSXElement {\n /** Internal element marker (optional for plain vnode objects) */\n $$typeof?: symbol;\n\n /** Element type: string, component, Fragment, etc */\n type: unknown;\n\n /** Props bag */\n props: Props;\n\n /** Optional key (normalized by runtime) */\n key?: string | number | null;\n}\n","/**\n * Dev-only namespace helpers for diagnostics\n *\n * Centralizes the repetitive globalThis.__ASKR__ access pattern\n * used throughout runtime for dev-mode diagnostics.\n */\n\ntype DevNamespace = Record<string, unknown>;\n\n/**\n * Get or create the __ASKR__ dev namespace on globalThis.\n * Returns empty object in production to avoid allocations.\n */\nexport function getDevNamespace(): DevNamespace {\n if (process.env.NODE_ENV === 'production') return {};\n try {\n const g = globalThis as unknown as Record<string, DevNamespace>;\n if (!g.__ASKR__) g.__ASKR__ = {};\n return g.__ASKR__;\n } catch {\n return {};\n }\n}\n\n/**\n * Set a value in the dev namespace (no-op in production).\n */\nexport function setDevValue(key: string, value: unknown): void {\n if (process.env.NODE_ENV === 'production') return;\n try {\n getDevNamespace()[key] = value;\n } catch {\n // ignore\n }\n}\n\n/**\n * Get a value from the dev namespace (returns undefined in production).\n */\nexport function getDevValue<T>(key: string): T | undefined {\n if (process.env.NODE_ENV === 'production') return undefined;\n try {\n return getDevNamespace()[key] as T | undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Delete a value from the dev namespace (no-op in production).\n */\nexport function deleteDevValue(key: string): void {\n if (process.env.NODE_ENV === 'production') return;\n try {\n delete getDevNamespace()[key];\n } catch {\n // ignore\n }\n}\n","import { globalScheduler } from './scheduler';\nimport { logger } from '../dev/logger';\nimport type { ComponentInstance } from './component';\nimport {\n getKeyMapForElement,\n isKeyedReorderFastPathEligible,\n populateKeyMapForElement,\n} from '../renderer/keyed';\nimport { Fragment } from '../common/jsx';\nimport { setDevValue, getDevValue } from './dev-namespace';\n\nlet _bulkCommitActive = false;\nlet _appliedParents: WeakSet<Element> | null = null;\n\nexport function enterBulkCommit(): void {\n _bulkCommitActive = true;\n // Initialize registry of parents that had fast-path applied during this bulk commit\n _appliedParents = new WeakSet<Element>();\n\n // Clear any previously scheduled synchronous scheduler tasks so they don't\n // retrigger evaluations during the committed fast-path.\n try {\n const cleared = globalScheduler.clearPendingSyncTasks?.() ?? 0;\n setDevValue('__ASKR_FASTLANE_CLEARED_TASKS', cleared);\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') throw err;\n }\n}\n\nexport function exitBulkCommit(): void {\n _bulkCommitActive = false;\n // Clear registry to avoid leaking across commits\n _appliedParents = null;\n}\n\nexport function isBulkCommitActive(): boolean {\n return _bulkCommitActive;\n}\n\n// Mark that a fast-path was applied on a parent element during the active\n// bulk commit. No-op if there is no active bulk commit.\nexport function markFastPathApplied(parent: Element): void {\n if (!_appliedParents) return;\n try {\n _appliedParents.add(parent);\n } catch (e) {\n void e;\n }\n}\n\nexport function isFastPathApplied(parent: Element): boolean {\n return !!(_appliedParents && _appliedParents.has(parent));\n}\n\nfunction finalizeReadSubscriptions(instance: ComponentInstance): void {\n const newSet = instance._pendingReadStates ?? new Set();\n const oldSet = instance._lastReadStates ?? new Set();\n const token = instance._currentRenderToken;\n\n if (token === undefined) return;\n\n // Remove subscriptions for states that were read previously but not in this render\n for (const s of oldSet) {\n if (!newSet.has(s)) {\n const readers = (s as { _readers?: Map<ComponentInstance, number> })\n ._readers;\n if (readers) readers.delete(instance);\n }\n }\n\n // Commit token becomes the authoritative token for this instance's last render\n instance.lastRenderToken = token;\n\n // Record subscriptions for states read during this render\n for (const s of newSet) {\n let readers = (s as { _readers?: Map<ComponentInstance, number> })._readers;\n if (!readers) {\n readers = new Map();\n (s as { _readers?: Map<ComponentInstance, number> })._readers = readers;\n }\n readers.set(instance, instance.lastRenderToken ?? 0);\n }\n\n instance._lastReadStates = newSet;\n instance._pendingReadStates = new Set();\n instance._currentRenderToken = undefined;\n}\n\n/**\n * Attempt to execute a runtime fast-lane for a single component's synchronous\n * render result. Returns true if the fast-lane was used and commit was done.\n *\n * Preconditions (checked conservatively):\n * - The render result is an intrinsic element root with keyed children\n * - The renderer's fast-path heuristics indicate to use the fast-path\n * - No mount operations are pending on the component instance\n * - No child vnodes are component functions (avoid async/component mounts)\n */\n\n// Helper to unwrap Fragment vnodes to get the first intrinsic element child\nfunction unwrapFragmentForFastPath(vnode: unknown): unknown {\n if (!vnode || typeof vnode !== 'object' || !('type' in vnode)) return vnode;\n const v = vnode as {\n type: unknown;\n children?: unknown;\n props?: { children?: unknown };\n };\n // Check if it's a Fragment\n if (\n typeof v.type === 'symbol' &&\n (v.type === Fragment || String(v.type) === 'Symbol(askr.fragment)')\n ) {\n const children = v.children || v.props?.children;\n if (Array.isArray(children) && children.length > 0) {\n // Return the first child that's an intrinsic element\n for (const child of children) {\n if (child && typeof child === 'object' && 'type' in child) {\n const c = child as { type: unknown };\n if (typeof c.type === 'string') {\n return child;\n }\n }\n }\n }\n }\n return vnode;\n}\n\nexport function classifyUpdate(instance: ComponentInstance, result: unknown) {\n // Returns a classification describing whether this update is eligible for\n // the reorder-only fast-lane. The classifier mirrors renderer-level\n // heuristics and performs runtime-level checks (mounts, effects, component\n // children) that the renderer cannot reason about.\n\n // Unwrap Fragment to get the actual element vnode for classification\n const unwrappedResult = unwrapFragmentForFastPath(result);\n\n if (\n !unwrappedResult ||\n typeof unwrappedResult !== 'object' ||\n !('type' in unwrappedResult)\n )\n return { useFastPath: false, reason: 'not-vnode' };\n\n const vnode = unwrappedResult as {\n type: unknown;\n children?: unknown;\n props?: { children?: unknown };\n };\n if (vnode == null || typeof vnode.type !== 'string')\n return { useFastPath: false, reason: 'not-intrinsic' };\n\n const parent = instance.target;\n if (!parent) return { useFastPath: false, reason: 'no-root' };\n\n const firstChild = parent.children[0] as Element | undefined;\n if (!firstChild) return { useFastPath: false, reason: 'no-first-child' };\n if (firstChild.tagName.toLowerCase() !== String(vnode.type).toLowerCase())\n return { useFastPath: false, reason: 'root-tag-mismatch' };\n\n const children = vnode.children || vnode.props?.children;\n if (!Array.isArray(children))\n return { useFastPath: false, reason: 'no-children-array' };\n\n // Avoid component child vnodes (they may mount/unmount or trigger async)\n for (const c of children) {\n if (\n typeof c === 'object' &&\n c !== null &&\n 'type' in c &&\n typeof (c as { type?: unknown }).type === 'function'\n ) {\n return { useFastPath: false, reason: 'component-child-present' };\n }\n }\n\n if (instance.mountOperations.length > 0)\n return { useFastPath: false, reason: 'pending-mounts' };\n\n // Ask renderer for keyed reorder eligibility (prop differences & heuristics)\n // Ensure a keyed map is available for the first child by populating it proactively.\n try {\n populateKeyMapForElement(firstChild);\n } catch {\n // ignore\n }\n\n const oldKeyMap = getKeyMapForElement(firstChild);\n const decision = isKeyedReorderFastPathEligible(\n firstChild,\n children,\n oldKeyMap\n );\n\n if (!decision.useFastPath || decision.totalKeyed < 128)\n return { ...decision, useFastPath: false, reason: 'renderer-declined' };\n\n return { ...decision, useFastPath: true } as const;\n}\n\nexport function commitReorderOnly(\n instance: ComponentInstance,\n result: unknown\n): boolean {\n // Performs the minimal, synchronous reorder-only commit.\n const evaluate = (\n globalThis as {\n __ASKR_RENDERER?: {\n evaluate?: (node: unknown, target: Element | null) => void;\n };\n }\n ).__ASKR_RENDERER?.evaluate;\n\n if (typeof evaluate !== 'function') {\n logger.warn(\n '[Tempo][FASTPATH][DEV] renderer.evaluate not available; declining fast-lane'\n );\n return false;\n }\n\n const schedBefore =\n process.env.NODE_ENV !== 'production' ? globalScheduler.getState() : null;\n\n enterBulkCommit();\n\n try {\n globalScheduler.runWithSyncProgress(() => {\n evaluate(result, instance.target);\n\n // Finalize runtime bookkeeping (read subscriptions / tokens)\n try {\n finalizeReadSubscriptions(instance);\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') throw e;\n }\n });\n\n // Clear any synchronous tasks scheduled during the commit\n const clearedAfter = globalScheduler.clearPendingSyncTasks?.() ?? 0;\n setDevValue('__FASTLANE_CLEARED_AFTER', clearedAfter);\n\n // Dev-only invariant checks\n if (process.env.NODE_ENV !== 'production') {\n validateFastLaneInvariants(instance, schedBefore);\n }\n\n return true;\n } finally {\n exitBulkCommit();\n }\n // Dev-only: verify bulk commit flag was properly cleared (after finally to avoid no-unsafe-finally)\n if (process.env.NODE_ENV !== 'production') {\n if (isBulkCommitActive()) {\n throw new Error(\n 'Fast-lane invariant violated: bulk commit flag still set after commit'\n );\n }\n }\n}\n\n/**\n * Validates fast-lane invariants in dev mode.\n * Extracted to reduce complexity in commitReorderOnly.\n */\nfunction validateFastLaneInvariants(\n instance: ComponentInstance,\n schedBefore: ReturnType<typeof globalScheduler.getState> | null\n): void {\n const commitCount = getDevValue<number>('__LAST_FASTPATH_COMMIT_COUNT') ?? 0;\n const invariants = {\n commitCount,\n mountOps: instance.mountOperations.length,\n cleanupFns: instance.cleanupFns.length,\n };\n setDevValue('__LAST_FASTLANE_INVARIANTS', invariants);\n\n if (commitCount !== 1) {\n console.error(\n '[FASTLANE][INV] commitCount',\n commitCount,\n 'diag',\n (globalThis as Record<string, unknown>).__ASKR_DIAG\n );\n throw new Error(\n 'Fast-lane invariant violated: expected exactly one DOM commit during reorder-only commit'\n );\n }\n\n if (invariants.mountOps > 0) {\n throw new Error(\n 'Fast-lane invariant violated: mount operations were registered during bulk commit'\n );\n }\n\n if (invariants.cleanupFns > 0) {\n throw new Error(\n 'Fast-lane invariant violated: cleanup functions were added during bulk commit'\n );\n }\n\n const schedAfter = globalScheduler.getState();\n if (\n schedBefore &&\n schedAfter &&\n schedAfter.taskCount > schedBefore.taskCount\n ) {\n console.error(\n '[FASTLANE] schedBefore, schedAfter',\n schedBefore,\n schedAfter\n );\n console.error('[FASTLANE] enqueue logs', getDevValue('__ENQUEUE_LOGS'));\n throw new Error(\n 'Fast-lane invariant violated: scheduler enqueued leftover work during bulk commit'\n );\n }\n\n // Final quiescence assertion\n let finalState = globalScheduler.getState();\n const executing = globalScheduler.isExecuting();\n let outstandingAfter = Math.max(\n 0,\n finalState.taskCount - (executing ? 1 : 0)\n );\n\n if (outstandingAfter !== 0) {\n // Attempt to clear newly enqueued synchronous tasks\n let attempts = 0;\n while (attempts < 5) {\n const cleared = globalScheduler.clearPendingSyncTasks?.() ?? 0;\n if (cleared === 0) break;\n attempts++;\n }\n finalState = globalScheduler.getState();\n outstandingAfter = Math.max(\n 0,\n finalState.taskCount - (globalScheduler.isExecuting() ? 1 : 0)\n );\n if (outstandingAfter !== 0) {\n console.error(\n '[FASTLANE] Post-commit enqueue logs:',\n getDevValue('__ENQUEUE_LOGS')\n );\n console.error(\n '[FASTLANE] Cleared counts:',\n getDevValue('__FASTLANE_CLEARED_TASKS'),\n getDevValue('__FASTLANE_CLEARED_AFTER')\n );\n throw new Error(\n `Fast-lane invariant violated: scheduler has ${finalState.taskCount} pending task(s) after commit`\n );\n }\n }\n}\n\nexport function tryRuntimeFastLaneSync(\n instance: ComponentInstance,\n result: unknown\n): boolean {\n const cls = classifyUpdate(instance, result);\n if (!cls.useFastPath) {\n // Clear stale fast-path diagnostics\n setDevValue('__LAST_FASTPATH_STATS', undefined);\n setDevValue('__LAST_FASTPATH_COMMIT_COUNT', 0);\n return false;\n }\n\n try {\n return commitReorderOnly(instance, result);\n } catch (err) {\n // Surface dev-only invariant failures, otherwise decline silently\n if (process.env.NODE_ENV !== 'production') throw err;\n return false;\n }\n}\n\n// Expose fastlane bridge on globalThis for environments/tests\nif (typeof globalThis !== 'undefined') {\n (globalThis as Record<string, unknown>).__ASKR_FASTLANE = {\n isBulkCommitActive,\n enterBulkCommit,\n exitBulkCommit,\n tryRuntimeFastLaneSync,\n markFastPathApplied,\n isFastPathApplied,\n };\n}\n","import type { RenderContext } from '../common/ssr';\n\nexport type SSRBridge = {\n getCurrentSSRContext(): RenderContext | null;\n throwSSRDataMissing(): never;\n\n // Deterministic SSR render-phase data lookup\n getCurrentRenderData(): Record<string, unknown> | null;\n getNextKey(): string;\n};\n\nconst defaultBridge: SSRBridge = {\n getCurrentSSRContext() {\n return null;\n },\n throwSSRDataMissing() {\n throw new Error(\n '[Askr] SSR data missing (SSR bridge not installed). ' +\n 'If you are rendering on the server, ensure you are using the askr SSR entrypoints.'\n );\n },\n getCurrentRenderData() {\n return null;\n },\n getNextKey() {\n throw new Error(\n '[Askr] getNextKey() called outside SSR render phase (SSR bridge not installed).'\n );\n },\n};\n\nlet bridge: SSRBridge = defaultBridge;\n\nexport function installSSRBridge(next: SSRBridge): void {\n bridge = next;\n}\n\nexport function getSSRBridge(): SSRBridge {\n return bridge;\n}\n","import {\n getCurrentComponentInstance,\n registerMountOperation,\n type ComponentInstance,\n} from './component';\nimport { getCurrentContextFrame } from './context';\nimport { ResourceCell } from './resource-cell';\nimport { state } from './state';\nimport { globalScheduler } from './scheduler';\nimport { getSSRBridge } from './ssr-bridge';\nimport { SSRDataMissingError } from '../common/ssr-errors';\n\n// Memoization cache for derive() (centralized)\n\nexport interface ResourceResult<T> {\n value: T | null;\n pending: boolean;\n error: Error | null;\n refresh(): void;\n}\n\n/**\n * Resource primitive — simple, deterministic async primitive\n * Usage: resource(fn, deps)\n * - fn receives { signal }\n * - captures execution context once at creation (synchronous step only)\n * - executes at most once per generation; stale async results are ignored\n * - refresh() cancels in-flight execution, increments generation and re-runs\n * - exposes { value, pending, error, refresh }\n * - during SSR, async results are disallowed and will throw synchronously\n */\nexport function resource<T>(\n fn: (opts: { signal: AbortSignal }) => Promise<T> | T,\n deps: unknown[] = []\n): ResourceResult<T> {\n const instance = getCurrentComponentInstance();\n // Create a non-null alias early so it can be used in nested closures\n // without TypeScript complaining about possible null access.\n const inst = instance as ComponentInstance;\n\n if (!instance) {\n const ssr = getSSRBridge();\n // If we're in a synchronous SSR render that has resolved data, use it.\n const renderData = ssr.getCurrentRenderData();\n if (renderData) {\n const key = ssr.getNextKey();\n if (!(key in renderData)) {\n ssr.throwSSRDataMissing();\n }\n const val = renderData[key] as T;\n return {\n value: val,\n pending: false,\n error: null,\n refresh: () => {},\n } as ResourceResult<T>;\n }\n\n // If we are in an SSR render pass without supplied data, throw for clarity.\n const ssrCtx = ssr.getCurrentSSRContext();\n if (ssrCtx) {\n ssr.throwSSRDataMissing();\n }\n\n // No active component instance and not in SSR render with data.\n // Autopilot invariant: resources must be created during render within an app.\n throw new Error(\n '[Askr] resource() must be called during component render inside an app. ' +\n 'Do not create resources at module scope or outside render.'\n );\n }\n\n // Internal ResourceCell — pure state machine now moved to its own module\n // to keep component wiring separate and ensure no component access here.\n // (See ./resource-cell.ts)\n\n // If we're in a synchronous SSR render that was supplied resolved data, use it\n const ssr = getSSRBridge();\n const renderData = ssr.getCurrentRenderData();\n if (renderData) {\n // Deterministic key generation: the collection step and render step use\n // the same incremental key generation to align resources.\n const key = ssr.getNextKey();\n if (!(key in renderData)) {\n ssr.throwSSRDataMissing();\n }\n\n // Commit synchronous value from render data and return a stable snapshot\n const val = renderData[key] as T;\n\n const holder = state<{\n cell?: ResourceCell<T>;\n snapshot: ResourceResult<T>;\n }>({\n cell: undefined,\n snapshot: {\n value: val,\n pending: false,\n error: null,\n refresh: () => {},\n },\n });\n\n const h = holder();\n h.snapshot.value = val;\n h.snapshot.pending = false;\n h.snapshot.error = null;\n holder.set(h);\n return h.snapshot;\n }\n\n // Persist a holder so the snapshot identity is stable across renders.\n const holder = state<{ cell?: ResourceCell<T>; snapshot: ResourceResult<T> }>(\n {\n cell: undefined,\n snapshot: {\n value: null,\n pending: true,\n error: null,\n refresh: () => {},\n },\n }\n );\n\n const h = holder();\n\n // Initialize cell on first call\n if (!h.cell) {\n const frame = getCurrentContextFrame();\n const cell = new ResourceCell<T>(fn, deps, frame);\n // Attach debug label (component name) for richer logs\n cell.ownerName = inst.fn?.name || '<anonymous>';\n h.cell = cell;\n h.snapshot = cell.snapshot as ResourceResult<T>;\n\n // Subscribe and schedule component updates when cell changes\n const unsubscribe = cell.subscribe(() => {\n const cur = holder();\n cur.snapshot.value = cell.snapshot.value;\n cur.snapshot.pending = cell.snapshot.pending;\n cur.snapshot.error = cell.snapshot.error;\n holder.set(cur);\n try {\n inst._enqueueRun?.();\n } catch {\n // ignore\n }\n });\n\n // Cleanup on unmount\n inst.cleanupFns.push(() => {\n unsubscribe();\n cell.abort();\n });\n\n // Render invariant: do NOT start async work during render on the client.\n // SSR remains strict/synchronous and must throw immediately if async is encountered.\n if (inst.ssr) {\n // SSR: must run synchronously so missing data throws during render\n cell.start(true, false);\n if (!cell.pending) {\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n }\n } else {\n // Client: start after render via scheduler (never inline)\n globalScheduler.enqueue(() => {\n try {\n cell.start(false, false);\n } catch (err) {\n // Non-SSR: reflect synchronous errors into snapshot via manual update\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = (err as Error) ?? null;\n holder.set(cur);\n inst._enqueueRun?.();\n return;\n }\n\n // If the resource completed synchronously, subscribers were not notified.\n // Force a re-render so the component can observe the value.\n if (!cell.pending) {\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n holder.set(cur);\n inst._enqueueRun?.();\n }\n });\n }\n }\n\n const cell = h.cell!;\n\n // Detect dependency changes and refresh immediately\n const depsChanged =\n !cell.deps ||\n cell.deps.length !== deps.length ||\n cell.deps.some((d, i) => d !== deps[i]);\n\n if (depsChanged) {\n cell.deps = deps.slice();\n cell.generation++;\n cell.pending = true;\n cell.error = null;\n try {\n if (inst.ssr) {\n cell.start(true, false);\n if (!cell.pending) {\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n }\n } else {\n globalScheduler.enqueue(() => {\n cell.start(false, false);\n if (!cell.pending) {\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n holder.set(cur);\n inst._enqueueRun?.();\n }\n });\n }\n } catch (err) {\n if (err instanceof SSRDataMissingError) throw err;\n cell.error = err as Error;\n cell.pending = false;\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n // Do not call holder.set() here; this is still render.\n }\n }\n\n // Return the stable snapshot object owned by the cell\n return h.snapshot;\n}\n\nexport function on(\n target: EventTarget,\n event: string,\n handler: EventListener\n): void {\n const ownerIsRoot = getCurrentComponentInstance()?.isRoot ?? false;\n // Register the listener to be attached on mount. If the owner is not the\n // root app instance, fail loudly to prevent silent no-op behavior.\n registerMountOperation(() => {\n if (!ownerIsRoot) {\n throw new Error('[Askr] on() may only be used in root components');\n }\n target.addEventListener(event, handler);\n // Return cleanup function\n return () => {\n target.removeEventListener(event, handler);\n };\n });\n}\n\nexport function timer(intervalMs: number, fn: () => void): void {\n const ownerIsRoot = getCurrentComponentInstance()?.isRoot ?? false;\n // Register the timer to be started on mount. Fail loudly when used outside\n // of the root component to avoid silent no-ops.\n registerMountOperation(() => {\n if (!ownerIsRoot) {\n throw new Error('[Askr] timer() may only be used in root components');\n }\n const id = setInterval(fn, intervalMs);\n // Return cleanup function\n return () => {\n clearInterval(id);\n };\n });\n}\n\nexport function stream<T>(\n _source: unknown,\n _options?: Record<string, unknown>\n): { value: T | null; pending: boolean; error: Error | null } {\n // Stub implementation: no-op.\n return { value: null, pending: true, error: null };\n}\n\nexport function task(\n fn: () => void | (() => void) | Promise<void | (() => void)>\n): void {\n const ownerIsRoot = getCurrentComponentInstance()?.isRoot ?? false;\n // Register the task to run on mount. Fail loudly when used outside the root\n // component so callers get immediate feedback rather than silent no-op.\n registerMountOperation(async () => {\n if (!ownerIsRoot) {\n throw new Error('[Askr] task() may only be used in root components');\n }\n // Execute the task (may be async) and return its cleanup\n return await fn();\n });\n}\n\n/**\n * Capture the result of a synchronous expression at call time and return a\n * thunk that returns the captured value later. This is a low-level helper for\n * cases where async continuations need to observe a snapshot of values at the\n * moment scheduling occurred.\n *\n * Usage (public API):\n * const snapshot = capture(() => someState());\n * Promise.resolve().then(() => { use(snapshot()); });\n */\nexport function capture<T>(fn: () => T): () => T {\n const value = fn();\n return () => value;\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common call contracts: Router types
|
|
3
|
+
*/
|
|
4
|
+
interface RouteHandler {
|
|
5
|
+
(params: Record<string, string>, context?: {
|
|
6
|
+
signal: AbortSignal;
|
|
7
|
+
}): unknown;
|
|
8
|
+
}
|
|
9
|
+
interface Route {
|
|
10
|
+
path: string;
|
|
11
|
+
handler: RouteHandler;
|
|
12
|
+
namespace?: string;
|
|
13
|
+
}
|
|
14
|
+
interface RouteMatch {
|
|
15
|
+
path: string;
|
|
16
|
+
params: Readonly<Record<string, string>>;
|
|
17
|
+
name?: string;
|
|
18
|
+
namespace?: string;
|
|
19
|
+
}
|
|
20
|
+
interface RouteQuery {
|
|
21
|
+
get(key: string): string | null;
|
|
22
|
+
getAll(key: string): string[];
|
|
23
|
+
has(key: string): boolean;
|
|
24
|
+
toJSON(): Record<string, string | string[]>;
|
|
25
|
+
}
|
|
26
|
+
interface RouteSnapshot {
|
|
27
|
+
path: string;
|
|
28
|
+
params: Readonly<Record<string, string>>;
|
|
29
|
+
query: Readonly<RouteQuery>;
|
|
30
|
+
hash: string | null;
|
|
31
|
+
name?: string;
|
|
32
|
+
namespace?: string;
|
|
33
|
+
matches: readonly RouteMatch[];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export type { Route as R, RouteSnapshot as a, RouteHandler as b, RouteMatch as c, RouteQuery as d };
|
package/dist/router.d.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { a as RouteSnapshot, b as RouteHandler, R as Route } from './router-DaGtH1Sq.js';
|
|
2
|
+
export { c as RouteMatch, d as RouteQuery } from './router-DaGtH1Sq.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Route definition and matching
|
|
6
|
+
* Supports dynamic route registration for micro frontends
|
|
7
|
+
*
|
|
8
|
+
* Optimization: Index by depth but maintain insertion order within each depth
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
declare function route(): RouteSnapshot;
|
|
12
|
+
declare function route(path: string, handler?: RouteHandler, namespace?: string): void;
|
|
13
|
+
/**
|
|
14
|
+
* Get all registered routes
|
|
15
|
+
*/
|
|
16
|
+
declare function getRoutes(): Route[];
|
|
17
|
+
/**
|
|
18
|
+
* Clear all registered routes (mainly for testing)
|
|
19
|
+
*/
|
|
20
|
+
declare function clearRoutes(): void;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Client-side navigation with History API
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Navigate to a new path
|
|
28
|
+
* Updates URL, resolves route, and re-mounts app with new handler
|
|
29
|
+
*/
|
|
30
|
+
declare function navigate(path: string): void;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Link component for client-side navigation
|
|
34
|
+
*/
|
|
35
|
+
interface LinkProps {
|
|
36
|
+
href: string;
|
|
37
|
+
children?: unknown;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Link component that prevents default navigation and uses navigate()
|
|
41
|
+
* Provides declarative way to navigate between routes
|
|
42
|
+
*
|
|
43
|
+
* Respects:
|
|
44
|
+
* - Middle-click (opens in new tab)
|
|
45
|
+
* - Ctrl/Cmd+click (opens in new tab)
|
|
46
|
+
* - Shift+click (opens in new window)
|
|
47
|
+
* - Right-click context menu
|
|
48
|
+
*/
|
|
49
|
+
declare function Link({ href, children }: LinkProps): unknown;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Layout helper.
|
|
53
|
+
*
|
|
54
|
+
* A layout is just a normal component that wraps children.
|
|
55
|
+
* Persistence and reuse are handled by the runtime via component identity.
|
|
56
|
+
*
|
|
57
|
+
* This helper exists purely for readability and convention.
|
|
58
|
+
*/
|
|
59
|
+
type LayoutComponent<P = object> = (props: P & {
|
|
60
|
+
children?: unknown;
|
|
61
|
+
}) => unknown;
|
|
62
|
+
declare function layout<P = object>(Layout: LayoutComponent<P>): (children?: unknown, props?: P) => unknown;
|
|
63
|
+
|
|
64
|
+
export { Link, type LinkProps, Route, RouteHandler, RouteSnapshot, clearRoutes, getRoutes, layout, navigate, route };
|