Skip to content

fix: sync json output of pack and publish#9247

Merged
wraithgar merged 1 commit into
latestfrom
gar/pack-json
Apr 16, 2026
Merged

fix: sync json output of pack and publish#9247
wraithgar merged 1 commit into
latestfrom
gar/pack-json

Conversation

@wraithgar
Copy link
Copy Markdown
Contributor

@wraithgar wraithgar commented Apr 16, 2026

BREAKING CHANGE: the --json output of npm pack and npm publish have changed. They are now always consistent, and in the same format.

Previously, npm pack would output an array of entries and npm publish an object. The npm publish object also changed forms depending on if workspaces were being published.

Now, the output is always an object with the package name as the top level index.

fixes npm/statusboard#1073

BREAKING CHANGE: the --json output of `npm pack` and `npm publish` have changed.  They are now always consistent, and in the same format.

Previously, `npm pack` would output an array of entries and `npm publish` an object.  The `npm publish` object also changed forms depending on if workspaces were also being published.

Now, the output is always an object with the package name as the top level index.
@wraithgar wraithgar requested a review from a team as a code owner April 16, 2026 18:16
@wraithgar wraithgar merged commit 2e9b26e into latest Apr 16, 2026
22 checks passed
@wraithgar wraithgar deleted the gar/pack-json branch April 16, 2026 20:53
reggi pushed a commit that referenced this pull request Apr 21, 2026
BREAKING CHANGE: the --json output of `npm pack` and `npm publish` have
changed. They are now always consistent, and in the same format.

Previously, `npm pack` would output an array of entries and `npm
publish` an object. The `npm publish` object also changed forms
depending on if workspaces were being published.

Now, the output is always an object with the package name as the top
level index.

fixes npm/statusboard#1073
reggi added a commit that referenced this pull request May 20, 2026
`npm stage download <id> --json` currently emits the package contents
under a literal `"undefined"` key because `logTar` is called without a
`key` option.

### Before

```json
{
  "undefined": {
    "name": "polo-meow-meow-meow",
    "version": "1.0.3",
    ...
  }
}
```

### After

```json
{
  "polo-meow-meow-meow": {
    "name": "polo-meow-meow-meow",
    "version": "1.0.3",
    ...
  }
}
```

This matches the JSON shape of `npm publish --json` and `npm pack
--json`.

### Background

The `key == null` fallback in `lib/utils/tar.js` (that would have
rendered a bare object when no key was passed) was removed from `latest`
in #9247 ("fix: sync json output of pack and publish") as a `BREAKING
CHANGE`. Per that PR:

> BREAKING CHANGE: the --json output of `npm pack` and `npm publish`
have changed. They are now always consistent, and in the same format.
>
> Previously, `npm pack` would output an array of entries and `npm
publish` an object. The `npm publish` object also changed forms
depending on if workspaces were being published.
>
> Now, the output is always an object with the package name as the top
level index.

When #9201 (npm stage) landed, it added a new `logTar` caller in
`lib/commands/stage/download.js` that did not pass a `key`, silently
violating the v12 contract established in #9247 and producing the
`"undefined"` wrapper. This PR brings the new caller into compliance.

### Repro

```
npm stage download <stage-id> --json
```

A follow-up backports this to `release/v11` for consistent output across
branches: #9381.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
reggi added a commit that referenced this pull request May 20, 2026
Backports #9380 to `release/v11` to keep `npm stage download --json`
output consistent across branches.

On `release/v11`, the `key == null` guard in `lib/utils/tar.js` was
emitting the bare object (no wrapper key). This change adds a key so the
output matches `latest` and aligns with `npm publish --json` / `npm pack
--json`.

### Before (on release/v11)

```json
{
  "name": "polo-meow-meow-meow",
  "version": "1.0.3",
  ...
}
```

### After

```json
{
  "polo-meow-meow-meow": {
    "name": "polo-meow-meow-meow",
    "version": "1.0.3",
    ...
  }
}
```

### Background

The `key == null` fallback in `lib/utils/tar.js` (still present on
`release/v11`) was removed from `latest` in #9247 ("fix: sync json
output of pack and publish") as a `BREAKING CHANGE`. Per that PR:

> BREAKING CHANGE: the --json output of `npm pack` and `npm publish`
have changed. They are now always consistent, and in the same format.
>
> Previously, `npm pack` would output an array of entries and `npm
publish` an object. The `npm publish` object also changed forms
depending on if workspaces were being published.
>
> Now, the output is always an object with the package name as the top
level index.

That breaking change was intentionally not backported to v11
(maintenance branch), so the fallback still exists here. This backport
keeps the call-site contract aligned across branches so consumers get
the same `{ "<pkg>": {...} }` shape on both.

Clean cherry-pick of 9f7834d from #9380.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Make pack --json return an object like publish --json instead of an array

2 participants