@@ -20,24 +20,35 @@ Copyright (c) OWASP Foundation. All Rights Reserved.
20
20
import { existsSync , readdirSync , readFileSync } from 'fs'
21
21
import { dirname , extname , isAbsolute , join , sep } from 'path'
22
22
23
+ export function isNonNullable < T > ( value : T ) : value is NonNullable < T > {
24
+ // NonNullable: not null and not undefined
25
+ return value !== null && value !== undefined
26
+ }
27
+
28
+ export const structuredClonePolyfill : < T > ( value : T ) => T = typeof structuredClone === 'function'
29
+ ? structuredClone
30
+ : function ( value ) { return JSON . parse ( JSON . stringify ( value ) ) }
31
+
23
32
export interface PackageDescription {
24
33
path : string
25
34
packageJson : any
26
35
}
27
36
37
+ const PACKAGE_MANIFEST_FILENAME = 'package.json'
38
+
28
39
export function getPackageDescription ( path : string ) : PackageDescription | undefined {
29
40
const isSubDirOfNodeModules = isSubDirectoryOfNodeModulesFolder ( path )
30
41
31
42
while ( isAbsolute ( path ) ) {
32
- const pathToPackageJson = join ( path , 'package.json' )
43
+ const pathToPackageJson = join ( path , PACKAGE_MANIFEST_FILENAME )
33
44
if ( existsSync ( pathToPackageJson ) ) {
34
45
try {
35
46
const contentOfPackageJson = loadJsonFile ( pathToPackageJson ) ?? { }
36
47
// only look for valid candidate if we are in a node_modules subdirectory
37
48
if ( ! isSubDirOfNodeModules || isValidPackageJSON ( contentOfPackageJson ) ) {
38
49
return {
39
50
path : pathToPackageJson ,
40
- packageJson : loadJsonFile ( pathToPackageJson ) ?? { }
51
+ packageJson : contentOfPackageJson
41
52
}
42
53
}
43
54
} catch {
@@ -54,12 +65,14 @@ export function getPackageDescription (path: string): PackageDescription | undef
54
65
return undefined
55
66
}
56
67
68
+ const NODE_MODULES_FOLDERNAME = 'node_modules'
69
+
57
70
function isNodeModulesFolder ( path : string ) : boolean {
58
- return path . endsWith ( `${ sep } node_modules ` )
71
+ return path . endsWith ( `${ sep } ${ NODE_MODULES_FOLDERNAME } ` )
59
72
}
60
73
61
74
function isSubDirectoryOfNodeModulesFolder ( path : string ) : boolean {
62
- return path . includes ( `${ sep } node_modules ${ sep } ` )
75
+ return path . includes ( `${ sep } ${ NODE_MODULES_FOLDERNAME } ${ sep } ` )
63
76
}
64
77
65
78
export function isValidPackageJSON ( pkg : any ) : boolean {
0 commit comments