bun test v1.3.14 (0d9b296a)

apps/extension/platform-save.test.mjs:
(pass) starting the region picker only injects its explicit script and writes nothing [30.68ms]
(pass) a selected region uses the memo and image-localization pipeline without whole-page capture [11.10ms]
(pass) region wrong-frame cannot create a note [3.76ms]
(pass) region no-tab cannot create a note [3.40ms]
(pass) region wrong-extension cannot create a note [3.28ms]
(pass) region changed-url cannot create a note [3.16ms]
(pass) region empty cannot create a note [6.86ms]
(pass) region not-region cannot create a note [3.51ms]
(pass) Android without desktop menu/window APIs can initialize and save from the popup [17.84ms]
(pass) BOSS popup detects login preview through the serialized DOM probe without creating or expanding anything [8.67ms]
(pass) BOSS readable page retains the adapted badge; failed or stale probes are unknown [15.72ms]
(pass) BOSS login preview can still save an explicit text selection without capturing the incomplete job [10.09ms]
(pass) wechat: toolbar and dedicated menu save the same note through the real parser [117.73ms]
(pass) jike: toolbar and dedicated menu save the same note through the real parser [24.03ms]
(pass) sspai: toolbar and dedicated menu save the same note through the real parser [53.36ms]
(pass) juejin: toolbar and dedicated menu save the same note through the real parser [105.14ms]
(pass) douban: toolbar and dedicated menu save the same note through the real parser [25.56ms]
(pass) boss: toolbar and dedicated menu save the same note through the real parser [21.45ms]
(pass) xueqiu: toolbar and dedicated menu save the same note through the real parser [40.74ms]
(pass) substack-note: toolbar and dedicated menu save the same note through the real parser [27.70ms]
(pass) hacker-news: toolbar and dedicated menu save the same note through the real parser [33.56ms]
(pass) v2ex: toolbar and dedicated menu save the same note through the real parser [21.45ms]
(pass) xiaoyuzhou: toolbar and dedicated menu save the same note through the real parser [46.53ms]
(pass) facebook: toolbar and dedicated menu save the same note through the real parser [55.06ms]
(pass) instagram: toolbar and dedicated menu save the same note through the real parser [72.96ms]
(pass) threads: toolbar and dedicated menu save the same note through the real parser [42.15ms]
(pass) bluesky: toolbar and dedicated menu save the same note through the real parser [39.04ms]
(pass) linkedin: toolbar and dedicated menu save the same note through the real parser [57.83ms]
(pass) Douban toolbar keeps paragraphs and archives all images after installing its own request rule [13.66ms]
(pass) Douban menu keeps paragraphs and archives all images after installing its own request rule [12.72ms]
(pass) Douban rule failure preserves one note and reports incomplete archival [11.06ms]
(pass) Sspai toolbar supplies its image source header before archiving [23.99ms]
(pass) Sspai menu supplies its image source header before archiving [25.45ms]
(pass) Juejin toolbar saves the complete comparison table alongside archived article images [67.40ms]
(pass) Juejin menu saves the complete comparison table alongside archived article images [72.64ms]
(pass) Sspai toolbar retains article updates and archives their images without changing publication time [27.26ms]
(pass) Sspai menu retains article updates and archives their images without changing publication time [25.89ms]
(pass) WeChat toolbar cleans publisher promotions before archiving body images [45.50ms]
(pass) WeChat menu cleans publisher promotions before archiving body images [44.52ms]
(pass) a new platform toolbar still saves a valid selection instead of its full article [9.11ms]
(pass) Xiaoyuzhou saves the current client route using MAIN-world props while bootstrap JSON stays old [11.98ms]
(pass) request, extension, tab and frame correlation reject unrelated responses [9.22ms]
(pass) failDownload: keeps the saved body, reports external images, and never creates twice [18.66ms]
(pass) failUpload: keeps the saved body, reports external images, and never creates twice [33.70ms]
(pass) failRewrite: keeps the saved body, reports external images, and never creates twice [22.09ms]
(pass) editConflict: keeps the saved body, reports external images, and never creates twice [20.17ms]
(pass) images beyond the limit count towards partial status after 30 successful uploads [15.54ms]
(pass) no Show Notes is a successful, explicitly qualified note [10.68ms]
(pass) wechat: unreadable content never falls back to a whole-page note [7.14ms]
(pass) jike: unreadable content never falls back to a whole-page note [5.65ms]
(pass) sspai: unreadable content never falls back to a whole-page note [6.44ms]
(pass) juejin: unreadable content never falls back to a whole-page note [6.66ms]
(pass) douban: unreadable content never falls back to a whole-page note [5.90ms]
(pass) boss: unreadable content never falls back to a whole-page note [5.73ms]
(pass) xueqiu: unreadable content never falls back to a whole-page note [5.75ms]
(pass) substack-note: unreadable content never falls back to a whole-page note [5.81ms]
(pass) hacker-news: unreadable content never falls back to a whole-page note [5.89ms]
(pass) v2ex: unreadable content never falls back to a whole-page note [5.42ms]
(pass) xiaoyuzhou: unreadable content never falls back to a whole-page note [5.86ms]
(pass) facebook: unreadable content never falls back to a whole-page note [6.28ms]
(pass) instagram: unreadable content never falls back to a whole-page note [6.32ms]
(pass) threads: unreadable content never falls back to a whole-page note [7.86ms]
(pass) bluesky: unreadable content never falls back to a whole-page note [7.08ms]
(pass) linkedin: unreadable content never falls back to a whole-page note [39.82ms]
(pass) navigation while resolving the notebook cancels the old content before creation [10.70ms]
(pass) denyInstance: gives an actionable permission error without creating a note [4.75ms]
(pass) denyScripting: gives an actionable permission error without creating a note [5.28ms]
(pass) a stale sender URL after SPA navigation does not reject the current post [33.43ms]
(pass) a stale sender URL after SPA navigation still cancels real navigation [20.19ms]
(pass) a pending saving toast cannot replace the already clicked post with a later right-click [17.61ms]
(pass) queued social menu clips freeze each clicked post before a later right-click [99.29ms]
(pass) Bluesky toolbar saves rendered link destinations without hidden text [16.74ms]
(pass) Bluesky menu saves rendered link destinations without hidden text [15.75ms]
(pass) medium-article: unreadable rendered article returns an error without creating a fallback note [27.93ms]
(pass) substack-article: unreadable rendered article returns an error without creating a fallback note [8.68ms]
(pass) Douban list menu saves only the selected own short comment [11.37ms]
(pass) Jike Web detail login redirects show access guidance and never save the QR page as a post [4.63ms]
(pass) jike: no clicked selection still rejects the restricted whole page [4.17ms]
(pass) jike: a lost selection retains the clicked text without saving the restricted whole page [7.07ms]
(pass) jike: a stable selection saves only the selected passage [11.05ms]
(pass) jike: navigateBeforeSelectionCapture refuses a stale selection before note creation [6.92ms]
(pass) jike: navigateDuringNotebookLookup refuses a stale selection before note creation [6.66ms]
(pass) douban: no clicked selection still rejects the restricted whole page [5.46ms]
(pass) douban: a lost selection retains the clicked text without saving the restricted whole page [8.63ms]
(pass) douban: a stable selection saves only the selected passage [9.47ms]
(pass) douban: navigateBeforeSelectionCapture refuses a stale selection before note creation [6.96ms]
(pass) douban: navigateDuringNotebookLookup refuses a stale selection before note creation [7.15ms]
(pass) restricted toolbar and another tab's selection-menu never exchange capture replies [119.38ms]
(pass) restricted toolbar and another tab's generic-toolbar never exchange capture replies [123.49ms]
(pass) selection menu rejects navigation during capture without saving a different page [7.43ms]
(pass) selection menu rejects navigation during notebook without saving a different page [7.38ms]
(pass) selection menu rejects navigation during queued without saving a different page [10.68ms]
(pass) iframe selection keeps its own source while binding the top-level tab [8.41ms]
(pass) iframe selection navigation is rejected [7.39ms]
(pass) selection menu retains the browser text fallback when injection is unavailable on the same page [6.34ms]
(pass) a timed-out capture's late reply cannot complete the next queued selection [16.42ms]
(pass) medium-article: actual capture/save keeps platform metadata and uses shared image archival [47.63ms]
(pass) substack-article: actual capture/save keeps platform metadata and uses shared image archival [16.83ms]
(pass) Jike topic menu saves precisely the marked card while toolbar asks for a post or selection [26.29ms]
(pass) a real Substack paywall warns and refuses a whole-article preview [9.28ms]
(pass) Substack restricted article still saves an explicit visible passage [9.94ms]
(pass) Substack article identity survives missing body and refuses a paywall-only generic fallback [29.83ms]
(pass) medium-article: failDownload keeps one note and reports incomplete image archival [34.63ms]
(pass) medium-article: failUpload keeps one note and reports incomplete image archival [35.69ms]
(pass) medium-article: failRewrite keeps one note and reports incomplete image archival [39.63ms]
(pass) substack-article: failDownload keeps one note and reports incomplete image archival [13.63ms]
(pass) substack-article: failUpload keeps one note and reports incomplete image archival [13.24ms]
(pass) substack-article: failRewrite keeps one note and reports incomplete image archival [15.72ms]
(pass) generic toolbar and selection report failDownload instead of complete image archival [17.96ms]
(pass) generic toolbar and selection report failUpload instead of complete image archival [17.41ms]
(pass) generic toolbar and selection report failRewrite instead of complete image archival [18.57ms]
(pass) LinkedIn toolbar saves professional metadata without changing the author or publication label [22.28ms]
(pass) LinkedIn menu saves professional metadata without changing the author or publication label [22.99ms]
(pass) Xueqiu right-click on a truncated feed saves only the selected full public detail and archives its image [14.24ms]
(pass) selection-menu: a queued click keeps A after the live selection becomes B [37.32ms]
(pass) generic-toolbar: a queued click keeps A after the live selection becomes B [22.51ms]
(pass) platform-toolbar: a queued click keeps A after the live selection becomes B [21.95ms]
(pass) feed-toolbar: a queued click keeps A after the live selection becomes B [21.45ms]
(pass) a whole-page toolbar click cannot become a later selection while queued [24.07ms]
(pass) selection feedback delay cannot change the clicked passage [8.37ms]
(pass) changed selection saves the original literal text without Markdown reinterpretation [9.58ms]
(pass) stable rich selection preserves code blank lines and archives its selected image [12.22ms]
(pass) current signed-in Jike Web detail saves through the platform route [22.97ms]
(pass) current signed-in Jike Web detail cancels navigation [12.61ms]
(pass) native Jike Web feed menu resolves current props and expands only the selected original post [18.38ms]
(pass) Jike Web card identity recycling during notebook lookup cancels before creating a memo [11.11ms]
(pass) Jike Web detail same-author post mismatch before-capture creates no memo [7.32ms]
(pass) Jike Web detail same-author post mismatch during-notebook-lookup creates no memo [13.19ms]
(pass) legacy Jike Web share detail retains its H5 data identity checks [11.77ms]
(pass) Jike Web detail rejects DOM from another post even when current props match the route [9.03ms]
(pass) Jike Web gallery detail normal verifies content and retains nine images [15.17ms]
(pass) Jike Web gallery detail images-only verifies content and retains nine images [14.74ms]
(pass) Jike Web gallery detail changed-image verifies content and retains nine images [9.13ms]
(pass) Jike Web detail expands its selected card before verifying the full public body [29.27ms]

apps/extension/capture-bundle.test.mjs:
(pass) whole-page and selection captures share table conversion and preserve code blank lines [143.18ms]
(pass) Medium page capture retains story blocks and both images without article controls [237.86ms]
(pass) Substack article capture retains sections and images on custom domains without subscription UI [114.67ms]
(pass) the injected page capture is a standalone classic script [583.95ms]

apps/extension/popup.test.mjs:
(pass) area selection requests permission in the click and starts the picker without capturing the page [0.31ms]
(pass) popup requests instance permission synchronously within the click before capturing [0.14ms]
(pass) denied permission prevents popup capture [0.08ms]
(pass) instance permission omits nonstandard ports while connection keeps the configured endpoint [0.26ms]
(pass) missing configuration never requests permissions or capture [0.04ms]
(pass) popup retains background failures and localized success fallback [0.07ms]
(pass) React popup shows login-required while retaining explicit selected-text capture [160.50ms]
(pass) React popup shows content-restricted while retaining explicit selected-text capture [16.63ms]
(pass) React popup does not label an unknown page adapted from a platform name alone [16.62ms]

apps/extension/region-clip.test.mjs:
(pass) region conversion preserves only chosen visible content and does not alter the source DOM [7.99ms]
(pass) shrinking a table or code block keeps indivisible Markdown containers intact [3.23ms]

 149 pass
 0 fail
 828 expect() calls
Ran 149 tests across 4 files. [4.61s]
