|
1 | 1 | import fs from "node:fs/promises"; |
2 | 2 | import path from "node:path"; |
| 3 | +import validatePackageName from "validate-npm-package-name"; |
3 | 4 | import semverValid from "semver/functions/valid.js"; |
4 | 5 | import tarList from "tar/lib/list.js"; |
5 | 6 | import type { ReadEntry } from "tar"; |
@@ -39,10 +40,14 @@ const isTarball = (file: unknown): file is string => { |
39 | 40 | return typeof file === "string" && path.extname(file) === TARBALL_EXTNAME; |
40 | 41 | }; |
41 | 42 |
|
42 | | -const validateVersion = (version: unknown): string | undefined => { |
| 43 | +const normalizeVersion = (version: unknown): string | undefined => { |
43 | 44 | return semverValid(version as string) ?? undefined; |
44 | 45 | }; |
45 | 46 |
|
| 47 | +const validateName = (name: unknown): name is string => { |
| 48 | + return validatePackageName(name as string).validForNewPackages; |
| 49 | +}; |
| 50 | + |
46 | 51 | const readPackageJson = async (...pathSegments: string[]): Promise<string> => { |
47 | 52 | const file = path.resolve(...pathSegments); |
48 | 53 |
|
@@ -110,13 +115,13 @@ export async function readManifest( |
110 | 115 | try { |
111 | 116 | manifestJson = JSON.parse(manifestContents) as Record<string, unknown>; |
112 | 117 | name = manifestJson["name"]; |
113 | | - version = validateVersion(manifestJson["version"]); |
| 118 | + version = normalizeVersion(manifestJson["version"]); |
114 | 119 | publishConfig = manifestJson["publishConfig"] ?? {}; |
115 | 120 | } catch (error) { |
116 | 121 | throw new errors.PackageJsonParseError(packageSpec, error); |
117 | 122 | } |
118 | 123 |
|
119 | | - if (typeof name !== "string" || name.length === 0) { |
| 124 | + if (!validateName(name)) { |
120 | 125 | throw new errors.InvalidPackageNameError(name); |
121 | 126 | } |
122 | 127 |
|
|
0 commit comments