Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit dc9a3ca

Browse files
committed
2.2 semver
1 parent 5669758 commit dc9a3ca

File tree

2 files changed

+53
-5
lines changed

2 files changed

+53
-5
lines changed

test/packagejson.test.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,25 @@ describe("package.json", () => {
7171
)
7272
);
7373
});
74+
// 2.2
75+
it('should use specific version of "moment"', () => {
76+
assert.equal(
77+
json.dependencies.moment,
78+
"2.10.2",
79+
'"moment" should use the specific version'
80+
);
81+
});
82+
it('should have installed specific version of "moment"', async () => {
83+
assert.ok(
84+
await doesNotThrow(
85+
() =>
86+
isModuleInstalled({
87+
name: "moment",
88+
type: "dependency",
89+
version: "2.10.2"
90+
}),
91+
'"moment" not installed'
92+
)
93+
);
94+
});
7495
});

test/utils.js

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ const {
33
} = require("fs");
44
const { join } = require("path");
55

6-
const getPackageJson = async () => {
6+
const getPackageJson = async (dir = process.cwd()) => {
77
// load package.json file
8-
const pathToPackageJson = join(process.cwd(), "package.json");
8+
const pathToPackageJson = join(dir, "package.json");
99
const packageJson = await readFile(pathToPackageJson, "utf8").catch(
1010
console.error
1111
);
@@ -22,29 +22,40 @@ const getPackageJson = async () => {
2222

2323
exports.getPackageJson = getPackageJson;
2424

25+
const versionMatch = (current, expected) => {
26+
let currentSemver = current;
27+
if (["~", "^"].includes(current[0])) {
28+
currentSemver = current.substring(1);
29+
}
30+
return currentSemver === expected;
31+
};
32+
2533
/**
2634
* isModuleInstalled
2735
* @param { name, type } params
2836
* "name" - the name of the dependency
2937
* "type" - "dependency", "devDependency", "peerDependency"
3038
* @returns boolean
3139
*/
32-
const isModuleInstalled = async ({ name, type }) => {
40+
const isModuleInstalled = async ({ name, type, version }) => {
3341
// 1. load package.json file
3442
const json = await getPackageJson();
3543

3644
// 2. verify package lists dependency by type
3745
let installCommand;
3846
let hasDependency;
47+
let currentVersion;
3948

4049
switch (type) {
4150
case "dependency":
4251
installCommand = "--save";
4352
hasDependency = !!json.dependencies && json.dependencies[name];
53+
currentVersion = json.dependencies[name];
4454
break;
4555
case "devDependency":
4656
installCommand = "--save-dev";
4757
hasDependency = !!json.devDependencies && json.devDependencies[name];
58+
currentVersion = json.devDependencies[name];
4859
break;
4960
case "peerDependency":
5061
throw new Error("Peer dependencies unsupported");
@@ -56,7 +67,14 @@ const isModuleInstalled = async ({ name, type }) => {
5667
throw new Error(`Run "npm install ${installCommand} ${name}"`);
5768
}
5869

59-
// 3. verify node_module installed
70+
// 3. if version, check dependency version
71+
if (version && !versionMatch(currentVersion, version)) {
72+
throw new Error(
73+
`Dependency ${name} version ${currentVersion} does not match expected ${version}`
74+
);
75+
}
76+
77+
// 4. verify node_module installed
6078
const pathToNodeModule = join(process.cwd(), "node_modules", name);
6179
const hasNodeModules = await readdir(pathToNodeModule).catch(() => {
6280
throw new Error('Missing node_modules. Run "npm install"');
@@ -65,7 +83,16 @@ const isModuleInstalled = async ({ name, type }) => {
6583
throw new Error('Missing node_modules. Run "npm install"');
6684
}
6785

68-
// 4. is installed
86+
// 5. if version, has installed node_module version
87+
if (version) {
88+
const nodeModulePackageJson = await getPackageJson(pathToNodeModule);
89+
if (!versionMatch(nodeModulePackageJson.version, version)) {
90+
throw new Error(
91+
`Dependency ${name} version ${version} is not yet installed. Run "npm install"`
92+
);
93+
}
94+
}
95+
6996
return true;
7097
};
7198

0 commit comments

Comments
 (0)