Conversation
…crosstalk, dispose re-entry; add retrack() for derived pulls; widget ARIA bind() (Tabs/Accordion/Tooltip/Popover/Combobox/Select/FileUpload/datePicker); effect() onCleanup; security (xlink:href, JSON reviver, loadRemoteModule/Wasm allowlist); lazy router pagehide; publish.mjs order + provenance; bench 2187/2187 tests, 0 lint
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Comprehensive hardening pass across reactivity, rendering, SSR, widgets, security, and build tooling.
Reactivity & rendering
retrack()primitive forderivedpulls (skips cleanup+re-add Set churn; preserves dynamic-dep correctness)effect()gainsonCleanupcallback param for ergonomic teardownderived()gainsequalsoption to suppress equivalent recomputeseach()itemGetterwraps inuntracked()so rows don't over-subscribebindChildNodeO(n²) diff → O(n+m) with Set; dedupes duplicate node refsbatchflush wrapped in try/finally so throwing subscriber can't strand pendingSignalslifecycle.fireUnmountdefers + re-checksisConnected(no false unmount on re-parent)keepAlivedisposed flag; cached subtrees cleaned on anchor disposeSSR
hydrate()/hydrateIslands/hydrateProgressivelyusereplaceChildren/replaceWithso reactive bindings actually drive the visible DOMrunInSSRContextusesAsyncLocalStoragefor per-request isolationserializeStatewith byte cap + escape U+2028/9;deserializeStatedev-warn without validatorAsync & data
workerFnper-task FIFO queue +addEventListener(no onmessage crosstalk); terminate-on-errorinfiniteQuerygeneration guard + abort on key changeofflineStoresingle-txput/remove, cursor-snapshot sync, pull skips items with pending local editsquerydedup promise capture, sync-throw cleanup,onSettledin finally, idempotent dispose + gcTimer dedupchunkLoadertrue LRU, invalidate clears preloaded, closures replacethis.loadserviceWorkerlistener tracking + detach on updateincrementalRegeneration,routerSSR,wakeLock,clearQueryCacherefetchers:.catchinstead of silentWidgets — WAI-ARIA
bind()layerTabs/Accordion/Tooltip/Popover/Combobox/Select/FileUpload/datePickerLoading+toastlive-region semantics;a11y.announceisConnected-guarded;FocusTrapkeydown cleanupdatePickerday-1 anchor fixes Jan-31→Mar-3 overflowformwrappedSet clears manualErrors on editSecurity
URL_ATTRIBUTESaddsxlink:href,formtarget,ping,datapersist+dragDropJSON.parse revivers block__proto__/constructor/prototypeloadRemoteModule/loadWasmModule/preloadWasmrequireallowedOriginsor explicitunsafelyAllowAnyOrigin(CWE-829)compiled.staticTemplate/precompilerequireTrustedHTMLbrand (CWE-79)queueMicrotasknavigations.catchunhandled rejectionsspeech.tsutterance listeners{ once: true }+ disposed-guardAPI / ergonomics
useSelector→select(redux/zustand),useDefaultPluginRegistry→setDefaultPluginRegistrytakePendingError,trustHTML/TrustedHTML,Disposetype,__resetQueryCache,__resetDialogStack,__removeRouterPagehideHandler[SibuJS]across modulescreateRouter()(honorssideEffects: false)Build / release
tsup --clean;./cdnsubpath export;publishConfig.provenance: truepublish.mjspublishes BEFORE git commit/tag (no orphan commits on publish failure)runArgsthrows on failure (was silently returning null)tsconfig.jsondropstypes: ["vitest"]— zero src/ deps on test-only typesPerformance
propagateDirtyiterative worklist with already-dirty skipbindChildNodeSet-based reuse detectiondt-aware (frame-rate independent + NaN guards)socket/streamauto-reconnect +maxReconnects=10defaultTests / DX
noUnusedVariables+ unused biome suppressions cleaneddispose.tssnapshots childNodes (no live NodeList mutation during walk)Related Issue
Closes #
Type of Change
Checklist