bun test v1.3.14 (0d9b296a)

tests/note-sharing-menu.test.ts:
(pass) note sharing menu > keeps sharing available while reading is locked and on the phone [0.32ms]
(pass) note sharing menu > shows a toast after copying the note for other platforms [0.14ms]
(pass) note sharing menu > explains why sharing a newly created local note is disabled [0.11ms]
(pass) note sharing menu > share dialog can enable an auto-generated access password [0.03ms]

apps/api/src/notebook-share-routes.test.mjs:
(pass) public notebook site controls > old share upgrade preserves scope, token, and password while settings patch is independent [58.38ms]
(pass) public notebook site controls > exclusion gates every read path, keeps independent shares, and restores idempotently [39.99ms]
(pass) public notebook site controls > original-note controls list live ancestor sites with independent exclusions and no new shares [34.27ms]
(pass) public notebook site controls > owner content management filters before paging and reports exclusions beyond the first page [43.67ms]
(pass) public notebook site controls > body and Chinese search filter before paging and combine with exact tags [34.91ms]
(pass) public notebook site controls > rejects invalid targets, unknown settings, non-HTTPS URLs and oversized merged settings [34.36ms]
(pass) public notebook site controls > homepages fall back on exclusion and aliases disclose identity only [33.97ms]
(pass) public notebook site controls > enabling or rotating passwords disables indexing and clearing does not re-enable it [40.68ms]
(pass) public notebook site controls > server HTML escapes metadata, preserves protected privacy, and denies excluded aliases [40.46ms]
(pass) public notebook site controls > Token pages without an alias remain noindex after opting in [31.99ms]
(pass) live recursive notebook sharing > upgrades existing data without creating individual shares; exposes only the live workspace subtree [33.40ms]
(pass) live recursive notebook sharing > publishes new and moved-in notes, edits, and moved-in subtrees without changing the token [33.76ms]
(pass) live recursive notebook sharing > moving a note or subtree out immediately denies its note and resource endpoints [33.05ms]
(pass) live recursive notebook sharing > deleted notes, resources, ancestors, and roots cannot be read [32.68ms]
(pass) live recursive notebook sharing > revocation closes every endpoint, keeps independent shares, and recreation gets a fresh token [33.56ms]
(pass) live recursive notebook sharing > interactive management is workspace scoped and rejects anonymous and API-token callers [32.11ms]
(pass) live recursive notebook sharing > internal links resolve only within the shared tree, even if an outside note has an independent share [32.26ms]
(pass) live recursive notebook sharing > resource streaming keeps range, MIME, and no-store behavior [31.47ms]
(pass) live recursive notebook sharing > independent child notebook shares survive parent revocation [34.66ms]
(pass) live recursive notebook sharing > even inconsistent cross-workspace notebook references do not grant access [32.84ms]
(pass) password-protected notebook shares > migrates an existing live link in place and protects directory, descendants and blobs [52.69ms]
(pass) password-protected notebook shares > rotating rejects previous passwords and cookies; clearing restores the same public link [64.14ms]
(pass) password-protected notebook shares > limits wrong attempts and resets attempt state when regenerating [97.73ms]
(pass) password-protected notebook shares > management requires a live share in the interactive user's workspace [33.10ms]
(pass) password-protected notebook shares > other share links have independent passwords and grants; revocation invalidates all reads [57.55ms]
(pass) workspace login cannot bypass the notebook password; an unlock grant is still required [49.36ms]
(pass) notebook share password recovery > upgrades a hash-only share in place without invalidating the old password [60.04ms]
(pass) notebook share password recovery > recovers on a fresh read, hides from other workspaces/agents, and clears ciphertext [59.94ms]
(pass) an older server rotating only the hash cannot display stale ciphertext [57.36ms]
(pass) missing deployment keys reject regeneration without changing the existing password [50.74ms]

apps/api/src/share-page.test.mjs:
(pass) public memo share pages > recognizes only a single-note share path [0.13ms]
(pass) public memo share pages > puts the note in the first HTML response and keeps the app shell [32.96ms]
(pass) public memo share pages > independently renders update time (%s) and footer branding (%s) in the first HTML response [31.36ms]
(pass) public memo share pages > independently renders update time (%s) and footer branding (%s) in the first HTML response [31.96ms]
(pass) public memo share pages > independently renders update time (%s) and footer branding (%s) in the first HTML response [31.29ms]
(pass) public memo share pages > independently renders update time (%s) and footer branding (%s) in the first HTML response [30.43ms]
(pass) public memo share pages > returns markdown for the direct link and for an explicit markdown accept [31.06ms]
(pass) public memo share pages > omits the body when the share is missing, deleted, or password protected [33.63ms]
(pass) public memo share pages > serves a custom address like the token and keeps password-protected notes out [32.40ms]
(pass) public memo share pages > treats the stored default title as untitled in metadata and markdown [31.74ms]
(pass) public memo share pages > HEAD keeps the headers and omits the body [36.00ms]
(pass) public memo share pages > production entrypoints serve the share page from the worker [0.41ms]

apps/api/src/share-routes.test.mjs:
(pass) public memo shares > returns share tokens only for referenced notes that are also public [40.41ms]
(pass) public memo shares > defaults both presentation settings on for migrated shares and new shares [35.58ms]
(pass) public memo shares > persists all four time/branding combinations independently without changing passwords [98.50ms]
(pass) public memo shares > reads existing fonts and new catalog choices through the same stored preference [34.16ms]
(pass) public memo shares > publishes the author's built-in note font and ignores anything else [32.77ms]
(pass) public memo shares > publishes account prose with the public share [32.99ms]
(pass) public memo shares > saves a signed-in user's published note font [32.35ms]
(pass) public memo shares > serves shared PDF byte ranges with public-share cache controls [42.53ms]
(pass) public memo shares > serves filename-detected shared audio inline [32.53ms]
(pass) public memo shares > serves filename-detected shared video inline [31.36ms]
(pass) memo share management > revocation retries succeed and keep the old link inaccessible [31.48ms]
(pass) memo share management > lists only live shares from the signed-in workspace without exposing passwords [31.36ms]
(pass) memo share management > paginates shares and requires an interactive user session [31.85ms]
(pass) password-protected memo shares > accepts an owner-chosen password, trims it, and keeps the password gate [49.70ms]
(pass) password-protected memo shares > rejects custom passwords outside the supported length [31.86ms]
(pass) password-protected memo shares > keeps existing shares public until a password is enabled [37.36ms]
(pass) password-protected memo shares > unlocks with the generated password and then serves the note and attachments [57.20ms]
(pass) password-protected memo shares > clearing the password ignores a supplied value and makes the existing link public again [39.45ms]
(pass) workspace login cannot bypass a memo's password or attachment gate [47.14ms]
(pass) memo share password recovery > returns encrypted-at-rest passwords only through authenticated single-share reads [48.39ms]
(pass) one-step memo sharing > concurrent creation and retries reuse one link; reopening preserves its password [44.38ms]
(pass) public SVG previews use the same sandbox and preserve the original [30.40ms]
(pass) custom memo share addresses > serves the note at the custom address while the token link keeps working [30.93ms]
(pass) custom memo share addresses > links between public notes prefer the custom address [29.86ms]
(pass) custom memo share addresses > rejects invalid, reserved and already used addresses [30.21ms]
(pass) custom memo share addresses > clearing or changing the address retires the old one immediately [31.06ms]
(pass) custom memo share addresses > keeps a released address bound to its workspace so other tenants cannot take over old links [32.77ms]
(pass) custom memo share addresses > keeps the password gate and scopes the unlock grant to the custom address [53.01ms]

packages/shared/src/sharing.test.mjs:
(pass) shared memo resources > rewrites owned images and attachments without touching external links [0.24ms]
(pass) shared memo resources > rewrites references to publicly shared notes without exposing private targets [0.03ms]
(pass) notebook shares use their own attachment scope, link within the directory, and disable private memo links [0.03ms]

apps/web/src/components/dialogs/ShareMemoDialog.test.mjs:
(pass) ShareMemoDialog raw markdown link support > generates public share URLs and .md alternates [0.09ms]
(pass) ShareMemoDialog raw markdown link support > renders compact raw markdown strip with copy button and i18n labels [0.03ms]
(pass) ShareMemoDialog raw markdown link support > renders open markdown button in actions footer when not password protected [0.02ms]
(pass) ShareMemoDialog raw markdown link support > switches compact hint text when password protection is active [0.02ms]

 81 pass
 0 fail
 746 expect() calls
Ran 81 tests across 6 files. [3.01s]
