Skip to content

Commit

Permalink
feat: add checkSatisfiesVersionsInDependency
Browse files Browse the repository at this point in the history
  • Loading branch information
christophehurpeau committed Dec 30, 2022
1 parent 839bf40 commit 59cb1d2
Show file tree
Hide file tree
Showing 12 changed files with 347 additions and 4 deletions.
17 changes: 16 additions & 1 deletion dist/check-package.d.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { CheckResolutionMessage } from './checks/checkResolutionsHasExplanation';
import type { GetDependencyPackageJson } from './utils/createGetDependencyPackageJson';
import type { DependencyName, DependencyTypes, PackageJson } from './utils/packageTypes';
import type { DependenciesRanges, DependencyName, DependencyTypes, PackageJson } from './utils/packageTypes';
import type { OnlyWarnsForOptionalDependencyMapping, OnlyWarnsFor } from './utils/warnForUtils';
export interface CreateCheckPackageOptions {
/** @internal */
Expand Down Expand Up @@ -157,6 +157,21 @@ export interface CheckPackageApi {
dependencies?: string[];
devDependencies?: string[];
}) => CheckPackageApi;
/**
* Check versions in a dependency
* Also useable to check if a dependency is not present
*
* @example
* Checking if `@lerna/version` has no dependency `@nrwl/devkit`
* ```
* .checkSatisfiesVersionsInDependency('@lerna/version', {
* dependencies: {
* '@nrwl/devkit': null,
* },
* })
* ```
*/
checkSatisfiesVersionsInDependency: (depName: string, dependenciesRanges: DependenciesRanges) => CheckPackageApi;
}
export declare function createCheckPackage(pkgDirectoryPath?: string, { internalWorkspacePkgDirectoryPath }?: CreateCheckPackageOptions): CheckPackageApi;
//# sourceMappingURL=check-package.d.ts.map
2 changes: 1 addition & 1 deletion dist/check-package.d.ts.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions dist/checks/checkSatisfiesVersionsInDependency.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { createReportError } from '../utils/createReportError';
import type { DependenciesRanges, PackageJson } from '../utils/packageTypes';
interface CheckSatisfiesVersionsInDependencyOptions {
customCreateReportError?: typeof createReportError;
}
export declare function checkSatisfiesVersionsInDependency(pkgPathName: string, depPkg: PackageJson, dependenciesRanges: DependenciesRanges, { customCreateReportError, }?: CheckSatisfiesVersionsInDependencyOptions): void;
export {};
//# sourceMappingURL=checkSatisfiesVersionsInDependency.d.ts.map
1 change: 1 addition & 0 deletions dist/checks/checkSatisfiesVersionsInDependency.d.ts.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

37 changes: 37 additions & 0 deletions dist/index-node14.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,35 @@ function checkSatisfiesVersionsFromDependency(pkg, pkgPathName, type, depKeys, d
});
}

function checkSatisfiesVersionsInDependency(pkgPathName, depPkg, dependenciesRanges, {
customCreateReportError = createReportError
} = {}) {
const reportError = customCreateReportError(`Satisfies Versions In Dependency "${depPkg.name}"`, pkgPathName);

for (const [dependenciesType, dependenciesTypeRanges] of getEntries(dependenciesRanges)) {
if (!dependenciesTypeRanges) return;
const dependencies = depPkg[dependenciesType];

for (const [dependencyName, dependencyRange] of getEntries(dependenciesTypeRanges)) {
if (dependencyRange == null) {
if (dependencies?.[dependencyName]) {
reportError(`Invalid "${dependencyName}" in ${dependenciesType} of "${depPkg.name}"`, 'it should not be present');
}
} else if (!dependencies) {
reportError(`Missing "${dependencyName}" in ${dependenciesType} of "${depPkg.name}"`, `"${dependenciesType}" is missing in "${depPkg.name}"`);
} else if (!dependencies[dependencyName]) {
reportError(`Missing "${dependencyName}" in ${dependenciesType} of "${depPkg.name}"`, `"${dependencyName}" is missing in ${dependenciesType}`);
} else if (!semver.satisfies(dependencies[dependencyName], dependencyRange, {
includePrerelease: true
}) && !semver.intersects(dependencies[dependencyName], dependencyRange, {
includePrerelease: true
})) {
reportError(`Invalid "${dependencyName}" in ${dependenciesType} of "${depPkg.name}"`, `"${dependencies[dependencyName]}" does not satisfies "${dependencyRange}"`);
}
}
}
}

function readPkgJson(packagePath) {
return JSON.parse(readFileSync(packagePath, 'utf8'));
}
Expand Down Expand Up @@ -878,6 +907,14 @@ function createCheckPackage(pkgDirectoryPath = '.', {
}
}));
return this;
},

checkSatisfiesVersionsInDependency(depName, dependenciesRanges) {
jobs.push(new Job(this.checkSatisfiesVersionsInDependency.name, async () => {
const depPkg = await getDependencyPackageJson(depName);
checkSatisfiesVersionsInDependency(pkgPathName, depPkg, dependenciesRanges);
}));
return this;
}

};
Expand Down
2 changes: 1 addition & 1 deletion dist/index-node14.mjs.map

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions dist/utils/packageTypes.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ export type PackageJson = Except<PackageJsonFromTypeFest, 'name'> & {
name: string;
resolutionsExplained?: Record<string, string>;
} & Partial<Record<DependencyTypes, Dependency>>;
export type DependenciesRanges = Partial<Record<DependencyTypes, Record<DependencyName, string | null>>>;
export {};
//# sourceMappingURL=packageTypes.d.ts.map
2 changes: 1 addition & 1 deletion dist/utils/packageTypes.d.ts.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

35 changes: 35 additions & 0 deletions src/check-package.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,12 @@ import { checkResolutionsHasExplanation } from './checks/checkResolutionsHasExpl
import { checkResolutionsVersionsMatch } from './checks/checkResolutionsVersionsMatch';
import { checkSatisfiesVersions } from './checks/checkSatisfiesVersions';
import { checkSatisfiesVersionsFromDependency } from './checks/checkSatisfiesVersionsFromDependency';
import { checkSatisfiesVersionsInDependency } from './checks/checkSatisfiesVersionsInDependency';
import type { GetDependencyPackageJson } from './utils/createGetDependencyPackageJson';
import { createGetDependencyPackageJson } from './utils/createGetDependencyPackageJson';
import { getEntries } from './utils/object';
import type {
DependenciesRanges,
DependencyName,
DependencyTypes,
PackageJson,
Expand Down Expand Up @@ -245,6 +247,25 @@ export interface CheckPackageApi {
devDependencies?: string[];
},
) => CheckPackageApi;

/**
* Check versions in a dependency
* Also useable to check if a dependency is not present
*
* @example
* Checking if `@lerna/version` has no dependency `@nrwl/devkit`
* ```
* .checkSatisfiesVersionsInDependency('@lerna/version', {
* dependencies: {
* '@nrwl/devkit': null,
* },
* })
* ```
*/
checkSatisfiesVersionsInDependency: (
depName: string,
dependenciesRanges: DependenciesRanges,
) => CheckPackageApi;
}

export function createCheckPackage(
Expand Down Expand Up @@ -759,5 +780,19 @@ export function createCheckPackage(
);
return this;
},

checkSatisfiesVersionsInDependency(depName, dependenciesRanges) {
jobs.push(
new Job(this.checkSatisfiesVersionsInDependency.name, async () => {
const depPkg = await getDependencyPackageJson(depName);
checkSatisfiesVersionsInDependency(
pkgPathName,
depPkg,
dependenciesRanges,
);
}),
);
return this;
},
};
}

0 comments on commit 59cb1d2

Please sign in to comment.