perf(web-read-card): lazy-load read grammars and guard empty-window copy
Only TypeScript, shell, and JSON grammars load at Web boot; the read card's wider langFromPath extension set loads through dynamic imports on first use, so a session that never opens a read card in one of those languages avoids ~1.6 MB of grammar modules and their synchronous init. ReadBlock/CodeBlock re-render on grammar-load via useSyncExternalStore, picking up highlighting once the grammar registers. ReadBlock hides the copy control on an empty window (a successful read of an empty file settles to lines: [] with card:'read'), matching TerminalBlock so it cannot wipe the clipboard.
This commit is contained in:
8 files changed
+216
-71
No files matched your search
@@ -31,6 +31,24 @@ describe('highlightToHtml', () => {
|
||||
expect(highlightToHtml('x', 'cobol')).toBeUndefined()
|
||||
expect(highlightToHtml('x', undefined)).toBeUndefined()
|
||||
})
|
||||
|
||||
// Every read-tool language hint whose grammar loads lazily (the boot set —
|
||||
// ts/js/bash/sh/json — is covered above). Touching each one drives its own
|
||||
// dynamic import thunk, so the whole LAZY_GRAMMARS table is exercised.
|
||||
const LAZY_ALIASES = [
|
||||
'py', 'rb', 'go', 'rs', 'java', 'c', 'cpp', 'cs', 'kotlin', 'swift', 'php',
|
||||
'yaml', 'toml', 'ini', 'md', 'mdx', 'html', 'css', 'scss', 'less', 'sql',
|
||||
'xml', 'lua',
|
||||
]
|
||||
|
||||
it('lazily loads every read-card grammar: plain first, highlighted after load', async () => {
|
||||
// First touch returns the plain fallback (undefined) and starts the import.
|
||||
for (const alias of LAZY_ALIASES) expect(highlightToHtml('x', alias)).toBeUndefined()
|
||||
// Once every grammar has registered, the same call highlights.
|
||||
await vi.waitFor(() => {
|
||||
for (const alias of LAZY_ALIASES) expect(highlightToHtml('x', alias)).toContain('shiki')
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe('CodeBlock', () => {
|
||||
|
||||
Reference in New Issue
Block a user