Skip to content

astro build fails with pnpm (but works with npm) #12669

@eikowagenknecht

Description

@eikowagenknecht

Astro Info

Astro                    v5.0.3
Node                     v20.11.1
System                   Windows (x64)
Package Manager          pnpm
Output                   static
Adapter                  none
Integrations             @astrojs/tailwind
                         @astrojs/mdx
                         @astrojs/react
                         @astrojs/sitemap

If this issue only occurs in one browser, which browser is a problem?

No response

Describe the Bug

After upgrading to Astro 5, i noticed the following:

npm run astro build works:

PS C:\***\***\***.de> npm i

> ***[email protected] postinstall
> lefthook install

sync hooks: ✔️ (commit-msg, pre-commit)

added 667 packages, and audited 668 packages in 38s

236 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
PS C:\***\***\***.de> npm run astro build

> ***[email protected] astro
> astro build

16:12:33 [content] Syncing content
16:12:33 [content] Content config changed
16:12:33 [content] Astro version changed
16:12:33 [content] Clearing content store
[Shiki] The language "hex" doesn't exist, falling back to "plaintext".
16:12:33 [content] Synced content
16:12:33 [types] Generated 1.45s
16:12:33 [build] output: "static"
16:12:33 [build] directory: C:\***\***\***.de\dist\
16:12:33 [build] Collecting build info...
16:12:33 [build] ✓ Completed in 1.49s.
16:12:33 [build] Building static entrypoints...
16:12:36 [vite] ✓ built in 2.35s
16:12:36 [build] ✓ Completed in 2.37s.

 building client (vite) 
16:12:36 [vite] ✓ 83 modules transformed.
16:12:36 [vite] dist/_astro/client.DNpcs3m7.js            1.82 kB │ gzip:  0.91 kB
16:12:36 [vite] dist/_astro/ImageWithModal.C6dIqcxn.js   33.08 kB │ gzip: 11.58 kB
16:12:36 [vite] dist/_astro/index.EISe-aAG.js           141.72 kB │ gzip: 45.60 kB
16:12:36 [vite] ✓ built in 354ms

 generating static routes 
16:12:36 ▶ src/pages/404.astro
16:12:36   └─ /404.html (+10ms)
16:12:36 ▶ src/pages/blog.astro
16:12:36   └─ /blog/index.html (+7ms)
16:12:36 ▶ src/pages/consulting.astro
16:12:36   └─ /consulting/index.html (+2ms)
16:12:36 ▶ src/pages/datenschutz.astro
16:12:36   └─ /datenschutz/index.html (+2ms)
16:12:36 ▶ src/pages/impressum.astro
16:12:36   └─ /impressum/index.html (+2ms)
16:12:36 ▶ src/pages/posts/[...slug].astro
...
16:12:36   └─ /posts/markdown-test/index.html (+1ms)
16:12:36 ▶ src/pages/privacy-policy.astro
16:12:36   └─ /privacy-policy/index.html (+2ms)
16:12:36 ▶ src/pages/projects.astro
16:12:36   └─ /projects/index.html (+2ms)
16:12:36 λ src/pages/robots.txt.ts
16:12:36   └─ /robots.txt (+1ms)
16:12:36 λ src/pages/rss.xml.js
16:12:36   └─ /rss.xml (+9ms)
16:12:36 ▶ src/pages/simple-game-clock.astro
16:12:36   └─ /simple-game-clock/index.html (+1ms)
16:12:36 ▶ src/pages/tags/[tag].astro
16:12:36   ├─ /tags/blog/index.html (+2ms)
16:12:36   ├─ /tags/tech/index.html (+1ms)
16:12:36   ├─ /tags/home-automation/index.html (+1ms)
16:12:36   ├─ /tags/home-assistant/index.html (+1ms)
16:12:36   ├─ /tags/esp32/index.html (+1ms)
16:12:36   ├─ /tags/web-development/index.html (+1ms)
16:12:36   ├─ /tags/astro/index.html (+1ms)
16:12:36   ├─ /tags/obsidian/index.html (+1ms)
16:12:36   ├─ /tags/raspberry-pi/index.html (+1ms)
16:12:36   └─ /tags/games/index.html (+1ms)
16:12:36 ▶ src/pages/tags/index.astro
16:12:36   └─ /tags/index.html (+2ms)
16:12:36 ▶ src/pages/index.astro
16:12:36   └─ /index.html (+2ms)
16:12:36 ▶ /atom.xml
16:12:36   └─ /atom.xml/index.html (+2ms)
16:12:36 ▶ /cv
16:12:36   └─ /cv/index.html (+1ms)
16:12:36 ▶ /feed
16:12:36   └─ /feed/index.html (+1ms)
16:12:36 ✓ Completed in 324ms.

16:12:36 [@astrojs/sitemap] `sitemap-index.xml` created at `dist`
16:12:36 [build] 36 page(s) built in 4.58s
16:12:36 [build] Complete!
PS C:\***\***\***.de>

pnpm run astro build fails:

PS C:\***\***\***.de> pnpm i
Lockfile is up to date, resolution step is skipped
Packages: +642
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Progress: resolved 642, reused 642, downloaded 0, added 642, done
node_modules/.pnpm/[email protected]/node_modules/sharp: Running install script, done in 76ms
node_modules/.pnpm/[email protected]/node_modules/lefthook: Running postinstall script, done in 271ms

dependencies:
+ @astrojs/mdx 4.0.1
+ @astrojs/react 4.0.0
+ @astrojs/rss 4.0.10
+ @astrojs/sitemap 3.2.1
+ @astrojs/tailwind 5.1.3
+ @r4ai/remark-callout 0.6.2
+ @radix-ui/react-dialog 1.1.2
+ @types/mdast 4.0.4
+ astro 5.0.3
+ clsx 2.1.1
+ hast-util-from-html-isomorphic 2.0.0
+ react 18.3.1
+ react-dom 18.3.1
+ rehype-autolink-headings 7.1.0
+ rehype-slug 6.0.0
+ remark-github-blockquote-alert 1.3.0
+ remark-toc 9.0.0
+ sanitize-html 2.13.1
+ tailwind-merge 2.5.5
+ unified 11.0.5
+ unist-util-visit 5.0.0

devDependencies:
+ @astrojs/check 0.9.4
+ @biomejs/biome 1.9.4
+ @commitlint/cli 19.6.0
+ @commitlint/config-conventional 19.6.0
+ @commitlint/types 19.5.0
+ @tailwindcss/forms 0.5.9
+ @tailwindcss/typography 0.5.15
+ @types/react 18.3.13
+ @types/react-dom 18.3.1
+ lefthook 1.9.0
+ prettier 3.4.2
+ prettier-plugin-astro 0.14.1
+ prettier-plugin-tailwindcss 0.6.9
+ tailwindcss 3.4.16
+ typescript 5.7.2

> ***[email protected] postinstall C:\***\***\***.de
> lefthook install

sync hooks: ✔️ (pre-commit, commit-msg)

Done in 4.9s
PS C:\***\***\***.de> pnpm run astro build

> ***[email protected] astro C:\***\***\***.de
> astro "build"

16:13:23 [content] Syncing content
16:13:23 [content] Content config changed
16:13:23 [content] Astro version changed
16:13:23 [content] Clearing content store
[Shiki] The language "hex" doesn't exist, falling back to "plaintext".
16:13:24 [content] Synced content
16:13:24 [types] Generated 1.13s
16:13:24 [build] output: "static"
16:13:24 [build] directory: C:\***\***\***.de\dist\
16:13:24 [build] Collecting build info...
16:13:24 [build] ✓ Completed in 1.18s.
16:13:24 [build] Building static entrypoints...
16:13:29 [ERROR] [vite] x Build failed in 4.50s
[vite]: Rollup failed to resolve import "fsevents" from "C:/***/***/***.de/node_modules/.pnpm/[email protected]/node_modules/rollup/dist/es/shared/node-entry.js".
This is most likely unintended because it can break your application at runtime.
If you do want to externalize this module explicitly add it to
`build.rollupOptions.external`
  Stack trace:
    at viteWarn (file:///C:/***/***/***.de/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]/node_modules/vite/dist/node/chunks/dep-yUJfKD1i.js:50728:17)
    at onRollupWarning (file:///C:/***/***/***.de/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]/node_modules/vite/dist/node/chunks/dep-yUJfKD1i.js:50758:5)
    at file:///C:/***/***/***.de/node_modules/.pnpm/[email protected]/node_modules/rollup/dist/es/shared/node-entry.js:19475:13
    at ModuleLoader.handleInvalidResolvedId (file:///C:/***/***/***.de/node_modules/.pnpm/[email protected]/node_modules/rollup/dist/es/shared/node-entry.js:20090:26)  
    at async file:///C:/***/***/***.de/node_modules/.pnpm/[email protected]/node_modules/rollup/dist/es/shared/node-entry.js:20036:32
 ELIFECYCLE  Command failed with exit code 1.
PS C:\***\***\***.de> 

The culprit seems to be the rss config. As soon as I remove the file, it works with pnpm as well:

import { getCollection } from "astro:content";
import { SITE } from "@/config";
import mdxRenderer from "@astrojs/mdx/server.js";
import reactRenderer from "@astrojs/react/server.js";
import rss from "@astrojs/rss";
import { experimental_AstroContainer as AstroContainer } from "astro/container";
import sanitizeHtml from "sanitize-html";

export async function GET(context) {
  const container = await AstroContainer.create();
  container.addServerRenderer({ renderer: mdxRenderer });
  container.addServerRenderer({ renderer: reactRenderer });
  const publishedBlogEntries = await getCollection("posts", ({ data }) => {
    return Boolean(data.published);
  });

  const sortedPosts = Object.values(publishedBlogEntries).sort((a, b) => {
    if (!a.data.published || !b.data.published) {
      return -1;
    }
    return (
      new Date(b.data.published).valueOf() -
      new Date(a.data.published).valueOf()
    );
  });

  return rss({
    title: SITE.title,
    description: SITE.description,
    site: context.site,
    items: await Promise.all(
      sortedPosts.map(async (post) => {
        const rssEntry = {
          title: post.data.title,
          description: post.data.description,
          pubDate: post.data.published,
          link: `/posts/${post.slug}/`,
        };

        // For now, only add the content when it can be rendered.
        // Should be fixed soon, see https://github.com/withastro/astro/issues/11407
        try {
          const { Content } = await post.render();
          const postHtml = await container.renderToString(Content);
          const sanitizedHtml = sanitizeHtml(postHtml, {
            allowedTags: sanitizeHtml.defaults.allowedTags.concat(["img"]),
          });

          rssEntry.content = sanitizedHtml;
        } catch (error) {
          console.log(`Can't render feed content for ${post.slug}, skipping.`);
        }

        return rssEntry;
      }),
    ),
    customData: "<language>en-us</language>",
    stylesheet: "/assets/styles/rss.xsl",
  });
}

Removing the import { experimental_AstroContainer as AstroContainer } from "astro/container"; fixes the hangup.

Reminds me of #11128, but since that one has been fixed apparently, it might be something else as well.

What's the expected result?

Compilation working with pnpm as well.

Link to Minimal Reproducible Example

No link because Stackblitz doesn't allow using pnpm as far as I can tell.

Participation

  • I am willing to submit a pull request for this issue.

Metadata

Metadata

Assignees

Labels

- P4: importantViolate documented behavior or significantly impacts performance (priority)feat: containerRelated to the container API (scope)

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions