Skip to content

fix(content-layer): populate imagePaths in renderMarkdown metadata#15968

Merged
matthewp merged 4 commits intowithastro:mainfrom
chasemccoy:fix/rendermarkdown-imagepaths
Mar 19, 2026
Merged

fix(content-layer): populate imagePaths in renderMarkdown metadata#15968
matthewp merged 4 commits intowithastro:mainfrom
chasemccoy:fix/rendermarkdown-imagepaths

Conversation

@chasemccoy
Copy link
Copy Markdown
Contributor

Summary

renderMarkdown from LoaderContext returns image paths as metadata.localImagePaths and metadata.remoteImagePaths (separate arrays), but the runtime's renderEntry function checks for a combined metadata.imagePaths to decide whether to resolve __ASTRO_IMAGE_ placeholders into optimized <img> tags.

Because imagePaths is never set by renderMarkdown, images in custom loaders that use it are never resolved — the __ASTRO_IMAGE_ attributes remain in the final HTML.

The built-in glob() loader avoids this because it uses entryType.getRenderFunction(config), which explicitly combines the two arrays:

return {
  html: result.code,
  metadata: {
    ...result.metadata,
    imagePaths: result.metadata.localImagePaths.concat(result.metadata.remoteImagePaths),
  },
};

This PR applies the same combination in #processMarkdown (which backs the renderMarkdown context helper), so custom loaders get the same image optimization behavior as the built-in glob() loader.

Changes

  • packages/astro/src/content/content-layer.ts: In #processMarkdown, spread metadata and add a combined imagePaths field from localImagePaths + remoteImagePaths.

Notes

Custom loaders also need to pass assetImports to store.set() for the images to be registered with Vite's asset pipeline. This is required alongside the imagePaths metadata fix. It may be worth documenting this in the Content Loader API reference, or having store.set() automatically extract imagePaths from rendered.metadata when assetImports isn't explicitly provided.

Test plan

  • Create a custom object loader that uses renderMarkdown with markdown containing relative image paths
  • Verify images render correctly (no __ASTRO_IMAGE_ placeholders in output)
  • Verify existing glob() loader behavior is unchanged

Made with Cursor

`renderMarkdown` from `LoaderContext` returned `localImagePaths` and
`remoteImagePaths` as separate metadata fields, but the runtime's
`renderEntry` function checks for a combined `imagePaths` field to
decide whether to resolve `__ASTRO_IMAGE_` placeholders. This caused
images in custom loaders using `renderMarkdown` to never be optimized.

Combines the two arrays into `imagePaths` in `#processMarkdown`,
matching the behavior of the markdown content entry type's
`getRenderFunction`.

Made-with: Cursor
@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Mar 17, 2026

🦋 Changeset detected

Latest commit: 318512a

The changes in this PR will be included in the next version bump.

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions github-actions bot added the pkg: astro Related to the core `astro` package (scope) label Mar 17, 2026
Adds a test that ensures renderMarkdown returns a combined `imagePaths`
array in the rendered metadata, which is required by the runtime's
`renderEntry` to resolve __ASTRO_IMAGE_ placeholders.

Made-with: Cursor
@codspeed-hq
Copy link
Copy Markdown

codspeed-hq bot commented Mar 18, 2026

Merging this PR will not alter performance

✅ 18 untouched benchmarks


Comparing chasemccoy:fix/rendermarkdown-imagepaths (318512a) with main (4741b09)

Open in CodSpeed

@chasemccoy chasemccoy requested a review from matthewp March 19, 2026 16:36
@matthewp matthewp merged commit 3e7a9d5 into withastro:main Mar 19, 2026
43 of 44 checks passed
@astrobot-houston astrobot-houston mentioned this pull request Mar 19, 2026
dadezzz pushed a commit to dadezzz/ice-notes that referenced this pull request Mar 24, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [astro](https://astro.build) ([source](https://github.com/withastro/astro/tree/HEAD/packages/astro)) | [`6.0.6` → `6.0.8`](https://renovatebot.com/diffs/npm/astro/6.0.6/6.0.8) | ![age](https://developer.mend.io/api/mc/badges/age/npm/astro/6.0.8?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/astro/6.0.6/6.0.8?slim=true) |

---

### Release Notes

<details>
<summary>withastro/astro (astro)</summary>

### [`v6.0.8`](https://github.com/withastro/astro/blob/HEAD/packages/astro/CHANGELOG.md#608)

[Compare Source](https://github.com/withastro/astro/compare/astro@6.0.7...astro@6.0.8)

##### Patch Changes

- [#&#8203;15978](withastro/astro#15978) [`6d182fe`](withastro/astro@6d182fe) Thanks [@&#8203;seroperson](https://github.com/seroperson)! - Fixes a bug where Astro Actions didn't properly support nested object properties, causing problems when users used zod functions such as `superRefine` or `discriminatedUnion`.

- [#&#8203;16011](withastro/astro#16011) [`e752170`](withastro/astro@e752170) Thanks [@&#8203;matthewp](https://github.com/matthewp)! - Fixes a dev server hang on the first request when using the Cloudflare adapter

- [#&#8203;15997](withastro/astro#15997) [`1fddff7`](withastro/astro@1fddff7) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Fixes `Astro.rewrite()` failing when the target path contains duplicate slashes (e.g. `//about`). The duplicate slashes are now collapsed before URL parsing, preventing them from being interpreted as a protocol-relative URL.

### [`v6.0.7`](https://github.com/withastro/astro/blob/HEAD/packages/astro/CHANGELOG.md#607)

[Compare Source](https://github.com/withastro/astro/compare/astro@6.0.6...astro@6.0.7)

##### Patch Changes

- [#&#8203;15950](withastro/astro#15950) [`acce5e8`](withastro/astro@acce5e8) Thanks [@&#8203;matthewp](https://github.com/matthewp)! - Fixes a build regression in projects with multiple frontend integrations where `server:defer` server islands could fail at runtime when all pages are prerendered.

- [#&#8203;15988](withastro/astro#15988) [`c93b4a0`](withastro/astro@c93b4a0) Thanks [@&#8203;ossaidqadri](https://github.com/ossaidqadri)! - Fix styles from dynamically imported components not being injected on first dev server load.

- [#&#8203;15968](withastro/astro#15968) [`3e7a9d5`](withastro/astro@3e7a9d5) Thanks [@&#8203;chasemccoy](https://github.com/chasemccoy)! - Fixes `renderMarkdown` in custom content loaders not resolving images in markdown content. Images referenced in markdown processed by `renderMarkdown` are now correctly optimized, matching the behavior of the built-in `glob()` loader.

- [#&#8203;15990](withastro/astro#15990) [`1e6017f`](withastro/astro@1e6017f) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Fixes an issue where `Astro.currentLocale` would always be the default locale instead of the actual one when using a dynamic route like `[locale].astro` or `[locale]/index.astro`. It now resolves to the correct locale from the URL.

- [#&#8203;15990](withastro/astro#15990) [`1e6017f`](withastro/astro@1e6017f) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Fixes an issue where visiting an invalid locale URL (e.g. `/asdf/`) would show the content of a dynamic `[locale]` page with a 404 status code, instead of showing your custom 404 page. Now, the correct 404 page is rendered when the locale in the URL doesn't match any configured locale.

- [#&#8203;15960](withastro/astro#15960) [`1d84020`](withastro/astro@1d84020) Thanks [@&#8203;matthewp](https://github.com/matthewp)! - Fixes Cloudflare dev server islands with `prerenderEnvironment: 'node'` by sharing the serialized manifest encryption key across dev environments and routing server island requests through the SSR runtime.

- [#&#8203;15735](withastro/astro#15735) [`9685e2d`](withastro/astro@9685e2d) Thanks [@&#8203;fa-sharp](https://github.com/fa-sharp)! - Fixes an EventEmitter memory leak when serving static pages from Node.js middleware.

  When using the middleware handler, requests that were being passed on to Express / Fastify (e.g. static files / pre-rendered pages / etc.) weren't cleaning up socket listeners before calling `next()`, causing a memory leak warning. This fix makes sure to run the cleanup before calling `next()`.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My43Ni4yIiwidXBkYXRlZEluVmVyIjoiNDMuODYuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: Renovate Bot <renovate@zarantonello.dev>
Co-committed-by: Renovate Bot <renovate@zarantonello.dev>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pkg: astro Related to the core `astro` package (scope)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants