33} = require ( "fs" ) ;
44const { 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
2323exports . 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