MCPcopy Create free account
hub / github.com/XmirrorSecurity/OpenSCA-cli / ParsePackageJsonWithNode

Function ParsePackageJsonWithNode

opensca/sca/javascript/npm.go:119–186  ·  view source on GitHub ↗

ParsePackageJsonWithNode 借助node_modules解析package.json pkgjson: 需要解析的package.json nodeMap: node_modules信息 key:node_modules下的package.json路径 pkgMap: 项目中存在的package.json信息 key:package.json的name

(pkgjson *PackageJson, nodeMap map[string]*PackageJson, pkgMap map[string]*PackageJson)

Source from the content-addressed store, hash-verified

117// nodeMap: node_modules信息 key:node_modules下的package.json路径
118// pkgMap: 项目中存在的package.json信息 key:package.json的name
119func ParsePackageJsonWithNode(pkgjson *PackageJson, nodeMap map[string]*PackageJson, pkgMap map[string]*PackageJson) *model.DepGraph {
120
121 _dep := _depSet().LoadOrStore
122
123 findDep := func(dev bool, name, version, basedir string) *model.DepGraph {
124 var subjs *PackageJson
125 if subjs == nil && len(nodeMap) > 0 {
126 // 从node_modules中查找
127 _, subjs = findFromNodeModules(name, basedir, nodeMap)
128 }
129 if subjs == nil && len(pkgMap) > 0 {
130 // 从项目中查找
131 if c, err := semver.NewConstraint(version); err == nil {
132 if pkg, ok := pkgMap[name]; ok {
133 if v, err := semver.NewVersion(pkg.Version); err == nil {
134 if c.Check(v) {
135 subjs = pkg
136 }
137 }
138 }
139 }
140 }
141 if subjs == nil {
142 // 从外部数据源下载
143 subjs = npmOrigin(name, version)
144 }
145 if subjs == nil {
146 // 部分投毒组件会从官方库下架 这种构造一个虚拟的PacakgeJson保证检出
147 subjs = &PackageJson{
148 Name: name,
149 Version: version,
150 }
151 }
152 var dep *model.DepGraph
153 if dev {
154 dep = _dep(subjs.Name, subjs.Version, "dev")
155 } else {
156 dep = _dep(subjs.Name, subjs.Version)
157 }
158 if dep.Expand == nil {
159 // dep.AppendLicense(subjs.License)
160 dep.Expand = subjs
161 }
162 return dep
163 }
164
165 root := &model.DepGraph{Name: pkgjson.Name, Version: pkgjson.Version, Path: pkgjson.File.Relpath()}
166 // root.AppendLicense(pkgjson.License)
167 root.Expand = pkgjson
168
169 // 根节点需要添加开发组件 (需要在构建依赖图之前先添加开发组件 否则不会构建开发组件的子依赖)
170 for name, version := range pkgjson.DevDependencies {
171 root.AppendChild(findDep(true, name, version, pkgjson.File.Relpath()))
172 }
173
174 // 遍历*路径*构建依赖图
175 root.ForEachPath(func(p, n *model.DepGraph) bool {
176 js := n.Expand.(*PackageJson)

Callers 1

ScaMethod · 0.85

Calls 7

AppendChildMethod · 0.95
ForEachPathMethod · 0.95
ForEachNodeMethod · 0.95
_depSetFunction · 0.85
findFromNodeModulesFunction · 0.85
CheckMethod · 0.80
RelpathMethod · 0.80

Tested by

no test coverage detected