@pnpm/releasing.commands 1100.4.2 → 1100.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,11 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
+ import { PnpmError } from '@pnpm/error';
4
+ import { createTarballFilename } from '../tarball/safeTarballFilename.js';
3
5
  import { summarizeTarball } from '../tarball/summarizeTarball.js';
4
6
  import { createStageContext } from './context.js';
5
7
  import { requireStageId } from './parsing.js';
6
- import { normalizePackageName, renderTarballSummary } from './rendering.js';
8
+ import { renderTarballSummary } from './rendering.js';
7
9
  import { stageRequest } from './request.js';
8
10
  export async function stageDownload(opts, params) {
9
11
  const stageId = requireStageId(params, 'download');
@@ -15,9 +17,14 @@ export async function stageDownload(opts, params) {
15
17
  });
16
18
  const tarballData = Buffer.from(await response.arrayBuffer());
17
19
  const summary = await summarizeTarball(tarballData);
18
- const filename = `${normalizePackageName(summary.name)}-${summary.version}-${stageId}.tgz`;
20
+ const filename = createTarballFilename({ name: summary.name, version: summary.version, suffix: stageId });
19
21
  const downloadedSummary = { ...summary, filename };
20
- await fs.writeFile(path.resolve(opts.dir ?? process.cwd(), filename), tarballData);
22
+ const downloadDir = path.resolve(opts.dir ?? process.cwd());
23
+ const outputPath = path.resolve(downloadDir, filename);
24
+ if (path.dirname(outputPath) !== downloadDir) {
25
+ throw new PnpmError('INVALID_TARBALL_FILENAME', `Invalid tarball filename "${filename}".`);
26
+ }
27
+ await fs.writeFile(outputPath, tarballData);
21
28
  if (opts.json)
22
29
  return JSON.stringify({ [summary.name]: downloadedSummary }, null, 2);
23
30
  return `${renderTarballSummary(downloadedSummary)}\n${filename}`;
@@ -1,5 +1,6 @@
1
1
  import type { PublishSummary } from '../tarball/publishSummary.js';
2
2
  import type { StageItem } from './types.js';
3
+ export { normalizePackageName } from '../tarball/safeTarballFilename.js';
3
4
  export declare function renderStageItem(item: StageItem): string;
4
5
  export declare function renderTarballSummary(summary: PublishSummary): string;
5
6
  export declare function renderStagePublishSummary(summary: PublishSummary | {
@@ -8,4 +9,3 @@ export declare function renderStagePublishSummary(summary: PublishSummary | {
8
9
  }, opts: {
9
10
  dryRun: boolean;
10
11
  }): string;
11
- export declare function normalizePackageName(name: string): string;
@@ -1,3 +1,4 @@
1
+ export { normalizePackageName } from '../tarball/safeTarballFilename.js';
1
2
  export function renderStageItem(item) {
2
3
  const { id, packageName, version, tag, createdAt, actor, actorType, shasum, ...rest } = item;
3
4
  return renderKeyValues({
@@ -38,9 +39,6 @@ export function renderStagePublishSummary(summary, opts) {
38
39
  }
39
40
  return `+ ${id} (staged)`;
40
41
  }
41
- export function normalizePackageName(name) {
42
- return name.replace('@', '').replace('/', '-');
43
- }
44
42
  function renderKeyValues(values) {
45
43
  return Object.entries(values)
46
44
  .flatMap(([key, value]) => value == null ? [] : [`${key}: ${renderValue(value)}`])
@@ -0,0 +1,8 @@
1
+ interface CreateTarballFilenameOptions {
2
+ name: string;
3
+ version: string;
4
+ suffix?: string;
5
+ }
6
+ export declare function createTarballFilename({ name, version, suffix }: CreateTarballFilenameOptions): string;
7
+ export declare function normalizePackageName(name: string): string;
8
+ export {};
@@ -0,0 +1,21 @@
1
+ import path from 'node:path';
2
+ import { PnpmError } from '@pnpm/error';
3
+ import { valid } from 'semver';
4
+ import validateNpmPackageName from 'validate-npm-package-name';
5
+ export function createTarballFilename({ name, version, suffix }) {
6
+ if (!validateNpmPackageName(name).validForOldPackages) {
7
+ throw new PnpmError('INVALID_PACKAGE_NAME', `Invalid package name "${name}".`);
8
+ }
9
+ if (!valid(version)) {
10
+ throw new PnpmError('INVALID_PACKAGE_VERSION', `Invalid package version "${version}".`);
11
+ }
12
+ const filename = `${normalizePackageName(name)}-${version}${suffix == null ? '' : `-${suffix}`}.tgz`;
13
+ if (path.basename(filename) !== filename || path.win32.basename(filename) !== filename) {
14
+ throw new PnpmError('INVALID_TARBALL_FILENAME', `Invalid tarball filename "${filename}".`);
15
+ }
16
+ return filename;
17
+ }
18
+ export function normalizePackageName(name) {
19
+ return name.replace('@', '').replace('/', '-');
20
+ }
21
+ //# sourceMappingURL=safeTarballFilename.js.map
@@ -3,6 +3,7 @@ import { gunzipSync } from 'node:zlib';
3
3
  import { PnpmError } from '@pnpm/error';
4
4
  import tar from 'tar-stream';
5
5
  import { extractBundledDependencies } from './publishSummary.js';
6
+ import { createTarballFilename } from './safeTarballFilename.js';
6
7
  /**
7
8
  * Parse a packed (gzipped or plain) tarball buffer and return the same
8
9
  * {@link PublishSummary} shape that `pnpm publish --json` emits.
@@ -66,7 +67,7 @@ export async function summarizeTarball(tarballData) {
66
67
  unpackedSize,
67
68
  shasum: createHash('sha1').update(tarballData).digest('hex'),
68
69
  integrity: `sha512-${createHash('sha512').update(tarballData).digest('base64')}`,
69
- filename: `${normalizePackageName(manifest.name)}-${manifest.version}.tgz`,
70
+ filename: createTarballFilename({ name: manifest.name, version: manifest.version }),
70
71
  files,
71
72
  entryCount,
72
73
  bundled: bundled.size > 0 ? Array.from(bundled).sort() : extractBundledDependencies(manifest),
@@ -80,7 +81,4 @@ function maybeGunzip(tarballData) {
80
81
  return tarballData;
81
82
  }
82
83
  }
83
- function normalizePackageName(name) {
84
- return name.replace('@', '').replace('/', '-');
85
- }
86
84
  //# sourceMappingURL=summarizeTarball.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pnpm/releasing.commands",
3
- "version": "1100.4.2",
3
+ "version": "1100.4.4",
4
4
  "description": "Commands for deploy, pack, and publish",
5
5
  "keywords": [
6
6
  "pnpm",
@@ -50,36 +50,36 @@
50
50
  "validate-npm-package-name": "7.0.2",
51
51
  "write-json-file": "^7.0.0",
52
52
  "write-yaml-file": "^6.0.0",
53
- "@pnpm/bins.resolver": "1100.0.6",
53
+ "@pnpm/bins.resolver": "1100.0.7",
54
54
  "@pnpm/catalogs.types": "1100.0.0",
55
- "@pnpm/cli.common-cli-options-help": "1100.0.1",
56
- "@pnpm/cli.utils": "1101.0.9",
57
- "@pnpm/config.reader": "1101.6.0",
58
- "@pnpm/config.pick-registry-for-package": "1100.0.7",
55
+ "@pnpm/cli.common-cli-options-help": "1100.0.2",
56
+ "@pnpm/cli.utils": "1101.0.11",
57
+ "@pnpm/config.pick-registry-for-package": "1100.0.8",
58
+ "@pnpm/config.reader": "1101.8.0",
59
59
  "@pnpm/constants": "1100.0.0",
60
- "@pnpm/deps.path": "1100.0.6",
61
- "@pnpm/engine.runtime.node-resolver": "1101.1.4",
62
- "@pnpm/engine.runtime.commands": "1100.1.2",
63
- "@pnpm/exec.pnpm-cli-runner": "1100.0.1",
64
- "@pnpm/exec.lifecycle": "1100.0.15",
65
- "@pnpm/fetching.directory-fetcher": "1100.0.14",
60
+ "@pnpm/deps.path": "1100.0.7",
61
+ "@pnpm/engine.runtime.commands": "1100.1.4",
62
+ "@pnpm/engine.runtime.node-resolver": "1101.1.6",
66
63
  "@pnpm/error": "1100.0.0",
64
+ "@pnpm/exec.lifecycle": "1100.0.17",
65
+ "@pnpm/fetching.directory-fetcher": "1100.0.16",
66
+ "@pnpm/exec.pnpm-cli-runner": "1100.0.1",
67
+ "@pnpm/fs.indexed-pkg-importer": "1100.0.13",
67
68
  "@pnpm/fs.is-empty-dir-or-nothing": "1100.0.0",
68
69
  "@pnpm/fs.packlist": "1100.0.1",
69
- "@pnpm/installing.client": "1100.2.5",
70
- "@pnpm/fs.indexed-pkg-importer": "1100.0.11",
71
- "@pnpm/lockfile.types": "1100.0.9",
72
- "@pnpm/network.auth-header": "1101.1.0",
73
- "@pnpm/lockfile.fs": "1100.1.3",
74
- "@pnpm/installing.commands": "1100.7.2",
70
+ "@pnpm/installing.client": "1100.2.7",
71
+ "@pnpm/lockfile.fs": "1100.1.4",
72
+ "@pnpm/lockfile.types": "1100.0.10",
73
+ "@pnpm/installing.commands": "1100.8.0",
74
+ "@pnpm/network.auth-header": "1101.1.1",
75
+ "@pnpm/network.fetch": "1100.1.2",
75
76
  "@pnpm/network.git-utils": "1100.0.1",
76
- "@pnpm/releasing.exportable-manifest": "1100.1.3",
77
- "@pnpm/resolving.resolver-base": "1100.4.0",
78
77
  "@pnpm/network.web-auth": "1101.1.0",
79
- "@pnpm/workspace.projects-sorter": "1100.0.5",
80
- "@pnpm/types": "1101.3.0",
81
- "@pnpm/network.fetch": "1100.1.0",
82
- "@pnpm/workspace.projects-filter": "1100.0.18"
78
+ "@pnpm/releasing.exportable-manifest": "1100.1.5",
79
+ "@pnpm/resolving.resolver-base": "1100.4.1",
80
+ "@pnpm/types": "1101.3.1",
81
+ "@pnpm/workspace.projects-filter": "1100.0.20",
82
+ "@pnpm/workspace.projects-sorter": "1100.0.6"
83
83
  },
84
84
  "peerDependencies": {
85
85
  "@pnpm/logger": "^1001.0.1"
@@ -102,16 +102,16 @@
102
102
  "tar": "^7.5.15",
103
103
  "undici": "^7.26.0",
104
104
  "write-yaml-file": "^6.0.0",
105
- "@pnpm/assert-project": "1100.0.13",
105
+ "@pnpm/assert-project": "1100.0.15",
106
106
  "@pnpm/catalogs.config": "1100.0.0",
107
- "@pnpm/hooks.pnpmfile": "1100.0.12",
107
+ "@pnpm/hooks.pnpmfile": "1100.0.14",
108
108
  "@pnpm/logger": "1100.0.0",
109
- "@pnpm/prepare": "1100.0.13",
110
- "@pnpm/test-ipc-server": "1100.0.0",
109
+ "@pnpm/prepare": "1100.0.15",
110
+ "@pnpm/releasing.commands": "1100.4.4",
111
111
  "@pnpm/test-fixtures": "1100.0.0",
112
- "@pnpm/releasing.commands": "1100.4.2",
113
- "@pnpm/testing.command-defaults": "1100.0.3",
114
- "@pnpm/testing.registry-mock": "1100.0.3"
112
+ "@pnpm/test-ipc-server": "1100.0.0",
113
+ "@pnpm/testing.command-defaults": "1100.0.5",
114
+ "@pnpm/testing.registry-mock": "1100.0.5"
115
115
  },
116
116
  "engines": {
117
117
  "node": ">=22.13"