<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/a-green-build-doesn-t-always-mean-a-safe-release--gmrcsr4sk" -->

---
title: A green build doesn’t always mean a safe release.
description: A migration from tsup to tsdown in a TypeScript open source library appeared successful since the build passed, but the generated package no longer matched the...
canonical: https://daily.dev/posts/a-green-build-doesn-t-always-mean-a-safe-release--gmrcsr4sk
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: A green build doesn’t always mean a safe release. | daily.dev
og:description: A migration from tsup to tsdown in a TypeScript open source library appeared successful since the build passed, but the generated package no longer matched the...
og:url: https://daily.dev/posts/a-green-build-doesn-t-always-mean-a-safe-release--gmrcsr4sk
og:image: https://api.daily.dev/og/posts/gmRCSr4sK.png
og:image:alt: A green build doesn’t always mean a safe release.
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# A green build doesn’t always mean a safe release.

**[nyaomaru](https://daily.dev/sources/graxwfjk0eop4zs3tdzdr)** · [@nyaomaru](https://daily.dev/nyaomaru) · 1 min read · 0 upvotes · 0 comments

## Summary

A migration from tsup to tsdown in a TypeScript open source library appeared successful since the build passed, but the generated package no longer matched the contract declared in package.json exports. The author notes the migration itself was fine, but verifying from a consumer's perspective was necessary to catch the mismatch, with a detailed writeup promised later.

## Content

I recently migrated a real TypeScript OSS library from `tsup` to `tsdown`.

The config change was tiny, and the first build passed.

But the generated package no longer matched the contract already exposed through `package.json` exports.

The migration itself was still good, I just had to verify the package from a consumer’s point of view.

Writing up the details for Wednesday. 🔧

#TypeScript #OpenSource #tsdown

## Similar posts on daily.dev

- [Build and publish a TypeScript package to npm](https://daily.dev/posts/build-and-publish-a-typescript-package-to-npm-x7yihxfvp) · Flavio Copes · 1 upvotes · 1 comments
- [TypeScript 6.0 Migration Guide: What's Changed and How to Update](https://daily.dev/posts/typescript-6-0-migration-guide-what-s-changed-and-how-to-update-cjiclvukg) · SitePoint · 5 upvotes · 0 comments
- [TypeScript 6.0 is your final warning](https://daily.dev/posts/typescript-6-0-is-your-final-warning-2tbdrcemi) · Bytes by ui.dev · 144 upvotes · 15 comments
- [Migrating ts-loader to TypeScript 7.1 with AI](https://daily.dev/posts/migrating-ts-loader-to-typescript-7-1-with-ai-nylu3j8a3) · John Reilly · 39 upvotes · 6 comments
- [Upgrading to TypeScript 6: A Real-World Migration](https://daily.dev/posts/upgrading-to-typescript-6-a-real-world-migration-wo1pvxrxk) · TypeScript.TV · 2 upvotes · 0 comments

---

Tags: [#typescript](https://daily.dev/tags/typescript)

[View this post on daily.dev](https://daily.dev/posts/a-green-build-doesn-t-always-mean-a-safe-release--gmrcsr4sk)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"DiscussionForumPosting","mainEntityOfPage":"https://daily.dev/posts/a-green-build-doesn-t-always-mean-a-safe-release--gmrcsr4sk","headline":"A green build doesn’t always mean a safe release.","text":"A migration from tsup to tsdown in a TypeScript open source library appeared successful since the build passed, but the generated package no longer matched the contract declared in package.json exports. The author notes the migration itself was fine, but verifying from a consumer's perspective was necessary to catch the mismatch, with a detailed writeup promised later.","url":"https://daily.dev/posts/a-green-build-doesn-t-always-mean-a-safe-release--gmrcsr4sk","datePublished":"2026-10-03T16:44:37.729Z","dateModified":"2026-10-03T16:44:50.171Z","author":{"@type":"Person","name":"nyaomaru","url":"https://daily.dev/nyaomaru","image":"https://avatars.githubusercontent.com/u/90489696?v=4","interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"EndorseAction"},"userInteractionCount":280}},"interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"isPartOf":{"@type":"WebPage","url":"https://daily.dev/sources/graxwfjk0eop4zs3tdzdr","name":"nyaomaru"}}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"nyaomaru","item":"https://daily.dev/sources/graxwfjk0eop4zs3tdzdr"},{"@type":"ListItem","position":3,"name":"A green build doesn’t always mean a safe release."}]}
```

