- Add the missing accent to "línea" in `markdown.md` and `cli.md`.
- Translate a lingering English word ("The" to "La") in `default-theme-config.md`.
- Translate remaining English placeholder texts in `default-theme-home-page.md` and sync the hero text with the actual `config.ts` translation.
- change "tu" to "su" in `default-theme-last-updated.md`.
- Update the pagination terminology from "próximo" to "Siguiente" in `default-theme-layout.md`.
- Remove the redundant `{#layout}` anchor from the main document heading.
- Fix Portuguese slip-ups by changing "gerará" to "generará" and "obter" to "obtener".
- Add the missing "Contenido Markdown" section
- Standardize the "Get Started" button translation from "Iniciar" to "Comenzar".
- Fix terminology by replacing incorrect translations like "funciones" with "características" and adding missing accents.
- Translate example image paths in the frontmatter code block (e.g., `/icono-de-caracteristica-genial.svg`).
- Fix Portuguese remnants (changing "ou" to "o" in the comments).
- Improve technical phrasing (e.g., using "sobrescribiendo" instead of "anulando").
add maxSize of 64MB to the markdown compile result LRUCache, such that
large pages do not grow this cache unboundedly.
change the cache key from JSON.stringify({ src, ts, relativePath })
(which not only included the entire source of each file in each key, but
also instantiated an object and called JSON.stringify), to a simpler
string concatenation with the sha256 hash of src.
Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
Based-on-patch-by: Calum H. (IMB11) <contact@cal.engineer>
previously, cli.ts was injecting onAfterConfigResolve solely to print
the version banner. Now, build() itself will log the version after
resolving the config, unless the caller has supplied a different
onAfterConfigResolve.
BREAKING CHANGE: callers of vitepress' build() will now notice the
version banner gets printed. To disable that, pass a noop function:
```ts
build(root, {
onAfterConfigResolve() {},
})
```
gray-matter memoizes every parsed result in a plain cache object keyed
by the full input string, except when it is passed an options object.
310f934938/index.js (L44-L47)
such cache is never bounded, or cleared, so on large sites memory usage
skyrockets.
with this change, we are always passing an empty options object on every
call to matter() to bypass its internal cache.
Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
Original-patch-by: Calum H. (IMB11) <contact@cal.engineer>
bundle() and generateSitemap() are plain workers now; build() wraps
them in tasks alongside render. Keeps the MPA asset copies and the
MPA client build under the bundles spinner instead of running after
it resolves, and skips the sitemap spinner when sitemap generation
is off.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Expose the any-typed highlight escape hatch on the exported
MarkdownRenderer type and accept it in the preConfig/config hooks,
instead of special-casing only the internal singleton.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Default codepoint sort matches the pages sort below and is not
locale/ICU dependent; route order is only consumed by exact-match
lookups, so ordering stays unobservable.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Move the rendering pages body into a standalone render() invoked
via bind, taking the bundle output whole. The SSR entry import now
fails under the rendering spinner, and the hashmap.json write runs
inside the task alongside the other rendering outputs.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Hoist the groups[].name body out of resolveViteConfig into a
module-level function partially applied with themeEntryRE via bind,
instead of re-creating a closure over bundle() locals per config.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replace the remaining sync writes and the tempDir removal in
build()/generateMetadataScript() with fs/promises, and switch
linkVue to the async packageDirectory lookup with an async unlink.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Lets bundle() receive the build outputs from the spinner-wrapped
callback directly instead of smuggling them through outer let
bindings with a definite-assignment assertion.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Store the promise of the extracted loadData() directly in the
per-id map rather than resolving a hand-made pending promise at the
end of the load hook. This also propagates loader errors to the
other build's pending consumer, which previously awaited forever.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Collapse the duplicated listen branches and await the listening
event; serve() now also rejects on listen errors like EADDRINUSE
instead of crashing in the callback.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Iterate the log parser with for-await instead of data/end/error
callbacks (spawn errors are forwarded by destroying the stream), and
await the single-file lookup with events.once, which rejects on
child error by itself.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
pipeline() replaces the manual finish/error promise and also
surfaces SitemapStream errors, which pipe() never forwarded to the
write stream.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
once() also rejects if the child emits error first, so the manual
promise wiring is unnecessary.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Content, include, route-template and search reads now run
concurrently, so large sites can hit EMFILE/ENFILE. Route all async
reads through a shared readFile util that retries with backoff.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Expanding an include that is its own ancestor recursed forever.
Track the ancestor chain and leave such includes unexpanded; the
same file can still be included repeatedly as a sibling.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Resolve includes through replaceAsync and fs/promises so include
files are read without blocking the event loop while pages render
concurrently.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Drop the existsSync pre-check in favor of catching ENOENT from the
read itself, and skip indexing when a page renders to nothing (file
gone or excluded via search: false) instead of feeding empty html to
the section splitter.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Split the block parser and fence renderer into factories, extract
region extraction, and type the snippet token instead of ts-ignoring
its src field.
Reading the file now handles ENOENT/EISDIR explicitly: a missing
snippet previously threw from statSync before the 'path not found'
message could render, so that branch was unreachable.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
It is internal and its only caller passes every argument; apply the
fallbacks at the call site instead of hiding them in the signature
after the required siteConfig parameter.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Read the 404 page with fs/promises, replace the trimChar helper with
a regex, and flatten the if/else around listen.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Swap the remaining sync fs calls in renderPage for fs/promises,
switch head-script minification to the async minify API, and make
resolvePageImports async for the realpath call. Pages render under
buildConcurrency, so blocking calls here stall the whole batch.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
createContentLoader already maps files with bounded concurrency, but
the sync stat/read calls serialized the actual I/O.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A fixed ui-custom name still gives adblock filter lists a stable
string to match on. Emit the Carbon/BuySellAds chunks with just the
content hash instead. Changes the emitted filenames for those chunks
and, transitively, the hashes of chunks that import them.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Now that dev updates actually reach the index, any changed markdown
file was being ingested — including srcExclude'd include partials and
dynamic route templates, which are not pages and produced dead search
results. Mirror the initial scan and only index files present in
siteConfig.pages.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
createContentLoader called md.renderAsync without a MarkdownEnv, so
the internal link plugin fell back to defaults and always emitted
.html links in rendered content and excerpts even with cleanUrls
enabled, and plugins reading env.path/relativePath broke. Build the
same env as a normal page render and forward it to both calls.
fixes#4331closes#5299
Co-authored-by: TowyTowy <towy@airreps.link>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Re-indexing only invalidated the bare @localSearchIndex module; the
per-locale modules that carry the data were still served from the
transform cache, and the browser module cache pinned them too. Version
the locale import in dev so every index update loads fresh data.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Rewrites were computed from the locally globbed pages only, so pages
injected via the config were present in siteConfig.pages but never
entered the rewrites map.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
importerMap values were srcDir-relative paths computed with
path.posix.relative, which garbles on Windows drive-letter case
mismatches, and the delete cleanup used a relative key against the
absolute-keyed map so it never removed anything. Store module ids
instead, derive the cache key with a win32-aware relative, and prune
both the include entry and page references after invalidating.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>