Skip to content

Commit 28db936

Browse files
authored
fix: pnpm install error (#138)
1 parent 4bbc955 commit 28db936

File tree

6 files changed

+209
-32
lines changed

6 files changed

+209
-32
lines changed

.changeset/five-badgers-greet.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"app-builder-bin": patch
3+
---
4+
5+
fix: pnpm install error for node module collector (https://github.com/electron-userland/electron-builder/issues/8519)

Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ test:
4545
cd pkg/node-modules/tar-demo/ && npm install
4646
cd pkg/node-modules/yarn-demo/ && yarn
4747
cd pkg/node-modules/parse-demo/ && yarn
48+
cd pkg/node-modules/es5-demo/ && pnpm install
4849
go test -v ./pkg/...
4950

5051
assets:
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"name": "pnpm-demo",
3+
"version": "1.0.0",
4+
"description": "",
5+
"main": "index.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1"
8+
},
9+
"keywords": [],
10+
"author": "",
11+
"license": "ISC",
12+
"dependencies": {
13+
"es5-ext": "0.10.53"
14+
}
15+
}

pkg/node-modules/es5-demo/pnpm-lock.yaml

+105
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/node-modules/nodeModuleCollector.go

+48-27
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ type Collector struct {
3636

3737
excludedDependencies map[string]bool
3838
allDependencies []*Dependency
39+
allDependenciesMap map[string]*Dependency
3940

4041
NodeModuleDirToDependencyMap map[string]*map[string]*Dependency `json:"nodeModuleDirToDependencyMap"`
4142

@@ -45,7 +46,13 @@ type Collector struct {
4546
func (t *Collector) readDependencyTree(dependency *Dependency) error {
4647
if t.rootDependency == nil {
4748
t.rootDependency = dependency
49+
t.allDependenciesMap = make(map[string]*Dependency)
4850
} else {
51+
key := dependency.alias + dependency.Version + dependency.dir
52+
if _, ok := t.allDependenciesMap[key]; ok {
53+
return nil
54+
}
55+
t.allDependenciesMap[key] = dependency
4956
t.allDependencies = append(t.allDependencies, dependency)
5057
}
5158

@@ -97,43 +104,57 @@ func (t *Collector) readDependencyTree(dependency *Dependency) error {
97104
}
98105

99106
func (t *Collector) writeToParentConflicDependency(d *Dependency) {
100-
p := d.parent
101-
last := d
102-
for p != t.rootDependency {
103-
if p.conflictDependency != nil {
104-
if c, ok := p.conflictDependency[d.Name]; ok {
105-
if c.Version == d.Version {
106-
return
107-
}
108-
break
107+
for p := d.parent; p != t.rootDependency; p = p.parent {
108+
if strings.HasPrefix(d.dir, p.dir) {
109+
if p.conflictDependency == nil {
110+
p.conflictDependency = make(map[string]*Dependency)
109111
}
112+
p.conflictDependency[d.alias] = d
113+
return
110114
}
111-
last = p
112-
p = p.parent
113115
}
114116

115-
if last.conflictDependency == nil {
116-
last.conflictDependency = make(map[string]*Dependency)
117+
if h, ok := t.HoiestedDependencyMap[d.alias]; ok {
118+
if h.Version == d.Version {
119+
return
120+
}
121+
122+
// for pnpm
123+
p := d.parent
124+
last := d
125+
for p != t.rootDependency {
126+
if t.HoiestedDependencyMap[p.alias] != nil {
127+
last = p
128+
break
129+
}
130+
131+
if p.conflictDependency != nil {
132+
if c, ok := p.conflictDependency[d.alias]; ok {
133+
if c.Version == d.Version {
134+
return
135+
}
136+
break
137+
}
138+
}
139+
last = p
140+
p = p.parent
141+
}
142+
143+
if last.conflictDependency == nil {
144+
last.conflictDependency = make(map[string]*Dependency)
145+
}
146+
last.conflictDependency[d.alias] = d
147+
return
117148
}
118-
last.conflictDependency[d.Name] = d
149+
150+
t.HoiestedDependencyMap[d.alias] = d
151+
119152
}
120153

121154
func (t *Collector) processHoistDependencyMap() {
122155
t.HoiestedDependencyMap = make(map[string]*Dependency)
123156
for _, d := range t.allDependencies {
124-
if e, ok := t.HoiestedDependencyMap[d.Name]; ok {
125-
if e.Version != d.Version {
126-
if d.parent == t.rootDependency {
127-
t.HoiestedDependencyMap[d.Name] = d
128-
t.writeToParentConflicDependency(e)
129-
} else {
130-
t.writeToParentConflicDependency(d)
131-
}
132-
}
133-
} else {
134-
t.HoiestedDependencyMap[d.Name] = d
135-
}
136-
157+
t.writeToParentConflicDependency(d)
137158
}
138159
}
139160

pkg/node-modules/nodeModuleCollector_test.go

+35-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package node_modules
22

33
import (
4+
"fmt"
45
"path"
56
"path/filepath"
67
"testing"
@@ -34,7 +35,7 @@ func TestReadDependencyTreeByNpm(t *testing.T) {
3435
g.Expect(r).To(ConsistOf([]string{
3536
"js-tokens", "react", "remote", "loose-envify",
3637
}))
37-
remoteModule := collector.HoiestedDependencyMap["@electron/remote"]
38+
remoteModule := collector.HoiestedDependencyMap["remote"]
3839
g.Expect(remoteModule.alias).To(Equal("remote"))
3940
g.Expect(remoteModule.Name).To(Equal("@electron/remote"))
4041
}
@@ -64,7 +65,7 @@ func TestReadDependencyTreeByPnpm(t *testing.T) {
6465
"js-tokens", "react", "remote", "loose-envify",
6566
}))
6667

67-
remoteModule := collector.HoiestedDependencyMap["@electron/remote"]
68+
remoteModule := collector.HoiestedDependencyMap["remote"]
6869
g.Expect(remoteModule.Name).To(Equal("@electron/remote"))
6970
g.Expect(remoteModule.alias).To(Equal("remote"))
7071
g.Expect(remoteModule.dir).To(Equal(filepath.Join(dir, "node_modules/.pnpm/@[email protected][email protected]/node_modules/@electron/remote")))
@@ -99,9 +100,8 @@ func TestReadDependencyTreeForTar(t *testing.T) {
99100
g.Expect(len(r)).To(Equal(46))
100101

101102
g.Expect(collector.HoiestedDependencyMap["tar"].dir).To(Equal(filepath.Join(dir, "node_modules/tar")))
102-
g.Expect(collector.HoiestedDependencyMap["minipass"].Version).To(Equal("7.1.2"))
103-
g.Expect(collector.HoiestedDependencyMap["minizlib"].Version).To(Equal("3.0.1"))
104-
g.Expect(collector.HoiestedDependencyMap["tar"].conflictDependency["ansi-regex"].Version).To(Equal("5.0.1"))
103+
g.Expect(collector.HoiestedDependencyMap["tar"].conflictDependency["minipass"].Version).To(Equal("7.1.2"))
104+
g.Expect(collector.HoiestedDependencyMap["tar"].conflictDependency["minizlib"].Version).To(Equal("3.0.1"))
105105
}
106106

107107
func TestReadDependencyTreeForYarn(t *testing.T) {
@@ -158,3 +158,33 @@ func TestReadDependencyTreeForParse(t *testing.T) {
158158
g.Expect(collector.HoiestedDependencyMap["asn1.js"].dir).To(Equal(filepath.Join(Dirname(), "parse-demo/node_modules/asn1.js")))
159159
g.Expect(collector.HoiestedDependencyMap["asn1.js"].Version).To(Equal("4.10.1"))
160160
}
161+
162+
func TestReadDependencyTreeForEs5(t *testing.T) {
163+
g := NewGomegaWithT(t)
164+
165+
collector := &Collector{
166+
unresolvedDependencies: make(map[string]bool),
167+
excludedDependencies: make(map[string]bool),
168+
NodeModuleDirToDependencyMap: make(map[string]*map[string]*Dependency),
169+
}
170+
171+
dir := path.Join(Dirname(), "es5-demo")
172+
173+
dependency, err := readPackageJson(dir)
174+
dependency.dir = dir
175+
176+
g.Expect(err).NotTo(HaveOccurred())
177+
178+
err = collector.readDependencyTree(dependency)
179+
g.Expect(err).NotTo(HaveOccurred())
180+
collector.processHoistDependencyMap()
181+
182+
fmt.Println(collector.HoiestedDependencyMap)
183+
184+
g.Expect(collector.HoiestedDependencyMap["d"].dir).To(Equal(filepath.Join(Dirname(), "es5-demo/node_modules/.pnpm/[email protected]/node_modules/d")))
185+
g.Expect(collector.HoiestedDependencyMap["d"].Version).To(Equal("1.0.2"))
186+
187+
g.Expect(collector.HoiestedDependencyMap["d"].conflictDependency["es5-ext"].dir).To(Equal(filepath.Join(Dirname(), "es5-demo/node_modules/.pnpm/[email protected]/node_modules/es5-ext")))
188+
g.Expect(collector.HoiestedDependencyMap["d"].conflictDependency["es5-ext"].Version).To(Equal("0.10.64"))
189+
190+
}

0 commit comments

Comments
 (0)