From 1b85b8949ab8d77a308fa5757061c33d252797ea Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Fri, 15 Dec 2023 21:26:33 +0100 Subject: [PATCH 1/3] fix: support 'workspace:^' notation for specifying valid dependency versions --- src/package-manifest.test.ts | 4 ++++ src/package-manifest.ts | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/package-manifest.test.ts b/src/package-manifest.test.ts index d2ce788..af9f77c 100644 --- a/src/package-manifest.test.ts +++ b/src/package-manifest.test.ts @@ -66,6 +66,7 @@ describe('package-manifest', () => { a: '1.0.0', b: '^2.0.0', c: '~4.3.0', + d: 'workspace:^', }, }; const validated = { @@ -77,6 +78,7 @@ describe('package-manifest', () => { a: '1.0.0', b: '^2.0.0', c: '~4.3.0', + d: 'workspace:^', }, peerDependencies: {}, }; @@ -100,6 +102,7 @@ describe('package-manifest', () => { a: '1.0.0', b: '^2.0.0', c: '~4.3.0', + d: 'workspace:^', }, }; const validated = { @@ -112,6 +115,7 @@ describe('package-manifest', () => { a: '1.0.0', b: '^2.0.0', c: '~4.3.0', + d: 'workspace:^', }, }; await fs.promises.writeFile(manifestPath, JSON.stringify(unvalidated)); diff --git a/src/package-manifest.ts b/src/package-manifest.ts index facdd61..353d1d8 100644 --- a/src/package-manifest.ts +++ b/src/package-manifest.ts @@ -139,7 +139,10 @@ export function readPackageManifestNameField( function isValidPackageManifestVersionField( version: unknown, ): version is string { - return isTruthyString(version) && semver.validRange(version) !== null; + return ( + (isTruthyString(version) && semver.validRange(version) !== null) || + version === 'workspace:^' + ); } /** From 1c38aa8096c2258a24d24939768d78f2923f8ff2 Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Fri, 15 Dec 2023 22:02:52 +0100 Subject: [PATCH 2/3] Create separate function for dependency validation --- src/package-manifest.ts | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/package-manifest.ts b/src/package-manifest.ts index 353d1d8..29d0a96 100644 --- a/src/package-manifest.ts +++ b/src/package-manifest.ts @@ -138,10 +138,26 @@ export function readPackageManifestNameField( */ function isValidPackageManifestVersionField( version: unknown, +): version is string { + return isTruthyString(version); +} + +/** + * Type guard to ensure that the provided version value is a valid dependency version + * specifier for a package manifest. This function validates both semantic versioning + * ranges and the special 'workspace:^' notation. + * + * @param version - The value to check. + * @returns `true` if the version is a valid string that either + * represents a semantic versioning range or is exactly 'workspace:^'. + * Otherwise, it returns `false`. + */ +function isValidPackageManifestDependencyValue( + version: unknown, ): version is string { return ( - (isTruthyString(version) && semver.validRange(version) !== null) || - version === 'workspace:^' + isValidPackageManifestVersionField(version) && + (semver.validRange(version) !== null || version === 'workspace:^') ); } @@ -288,7 +304,8 @@ function isValidPackageManifestDependenciesField( (isPlainObject(depsValue) && Object.entries(depsValue).every(([pkgName, version]) => { return ( - isTruthyString(pkgName) && isValidPackageManifestVersionField(version) + isTruthyString(pkgName) && + isValidPackageManifestDependencyValue(version) ); })) ); From e20fd7dcaaa370e1b0109dc7d9ec000a77716a9d Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Fri, 15 Dec 2023 22:34:52 +0100 Subject: [PATCH 3/3] fix manifest version validation --- src/package-manifest.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/package-manifest.ts b/src/package-manifest.ts index 29d0a96..a4aa6d5 100644 --- a/src/package-manifest.ts +++ b/src/package-manifest.ts @@ -139,7 +139,7 @@ export function readPackageManifestNameField( function isValidPackageManifestVersionField( version: unknown, ): version is string { - return isTruthyString(version); + return isTruthyString(version) && semver.validRange(version) !== null; } /** @@ -156,8 +156,7 @@ function isValidPackageManifestDependencyValue( version: unknown, ): version is string { return ( - isValidPackageManifestVersionField(version) && - (semver.validRange(version) !== null || version === 'workspace:^') + isValidPackageManifestVersionField(version) || version === 'workspace:^' ); }