Skip to content

Commit 0f2c963

Browse files
authored
fix: missing ms package when pruning non-prod dependencies (#8851)
1 parent 7fc7846 commit 0f2c963

File tree

7 files changed

+94
-4
lines changed

7 files changed

+94
-4
lines changed

.changeset/many-lemons-press.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"app-builder-lib": patch
3+
---
4+
5+
Fix the issue of the missing ms package

packages/app-builder-lib/src/node-module-collector/nodeModulesCollector.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { exec, log } from "builder-util"
77
export abstract class NodeModulesCollector {
88
private nodeModules: NodeModuleInfo[]
99
protected dependencyPathMap: Map<string, string>
10+
protected allDependencies: Map<string, DependencyTree> = new Map()
1011

1112
constructor(private readonly rootDir: string) {
1213
this.dependencyPathMap = new Map()
@@ -47,7 +48,7 @@ export abstract class NodeModulesCollector {
4748
}
4849
}
4950

50-
public convertToDependencyGraph(tree: DependencyTree): DependencyGraph {
51+
private convertToDependencyGraph(tree: DependencyTree): DependencyGraph {
5152
const result: DependencyGraph = { ".": {} }
5253

5354
const flatten = (node: DependencyTree, parentKey = ".") => {
@@ -73,6 +74,16 @@ export abstract class NodeModulesCollector {
7374
return result
7475
}
7576

77+
getAllDependencies(tree: DependencyTree) {
78+
const dependencies = tree.dependencies || {}
79+
for (const [key, value] of Object.entries(dependencies)) {
80+
if (value.dependencies && Object.keys(value.dependencies).length > 0) {
81+
this.allDependencies.set(`${key}@${value.version}`, value)
82+
this.getAllDependencies(value)
83+
}
84+
}
85+
}
86+
7687
abstract getCommand(): string
7788
abstract getArgs(): string[]
7889
abstract removeNonProductionDependencie(tree: DependencyTree): void
@@ -139,6 +150,7 @@ export abstract class NodeModulesCollector {
139150
public async getNodeModules(): Promise<NodeModuleInfo[]> {
140151
const tree = await this.getDependenciesTree()
141152
const realTree = this.getTreeFromWorkspaces(tree)
153+
this.getAllDependencies(realTree)
142154
this.removeNonProductionDependencie(realTree)
143155
const dependencyGraph = this.convertToDependencyGraph(realTree)
144156
const hoisterResult = hoist(this.transToHoisterTree(dependencyGraph), { check: true })

packages/app-builder-lib/src/node-module-collector/npmNodeModulesCollector.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@ export class NpmNodeModulesCollector extends NodeModulesCollector {
1717
removeNonProductionDependencie(tree: DependencyTree) {
1818
const dependencies = tree.dependencies || {}
1919
const _dependencies = tree._dependencies || {}
20+
if (dependencies && Object.keys(dependencies).length === 0) {
21+
tree.dependencies = this.allDependencies.get(`${tree.name}@${tree.version}`)?.dependencies || {}
22+
}
23+
2024
for (const [key, value] of Object.entries(dependencies)) {
21-
if (!_dependencies[key]) {
25+
if (!_dependencies[key] || Object.keys(value).length === 0) {
2226
delete dependencies[key]
2327
continue
2428
}

packages/app-builder-lib/src/node-module-collector/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export interface DependencyTree {
1111
readonly from?: string
1212
readonly workspaces?: string[]
1313
readonly path: string
14-
dependencies: {
14+
dependencies?: {
1515
[packageName: string]: DependencyTree
1616
}
1717
// for npm list --json

packages/app-builder-lib/src/node-module-collector/yarnNodeModulesCollector.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@ export class YarnNodeModulesCollector extends NodeModulesCollector {
1717
removeNonProductionDependencie(tree: DependencyTree) {
1818
const dependencies = tree.dependencies || {}
1919
const _dependencies = tree._dependencies || {}
20+
if (dependencies && Object.keys(dependencies).length === 0) {
21+
tree.dependencies = this.allDependencies.get(`${tree.name}@${tree.version}`)?.dependencies || {}
22+
}
23+
2024
for (const [key, value] of Object.entries(dependencies)) {
21-
if (!_dependencies[key]) {
25+
if (!_dependencies[key] || Object.keys(value).length === 0) {
2226
delete dependencies[key]
2327
continue
2428
}

test/snapshots/HoistedNodeModuleTest.js.snap

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,41 @@ exports[`yarn electron-clear-data 2`] = `
457457
}
458458
`;
459459

460+
exports[`yarn ms 1`] = `
461+
{
462+
"linux": [],
463+
}
464+
`;
465+
466+
exports[`yarn ms 2`] = `
467+
{
468+
"description": "Tiny millisecond conversion utility",
469+
"devDependencies": {
470+
"eslint": "4.18.2",
471+
"expect.js": "0.3.1",
472+
"husky": "0.14.3",
473+
"lint-staged": "5.0.0",
474+
"mocha": "4.0.1",
475+
"prettier": "2.0.5",
476+
},
477+
"files": [
478+
"index.js",
479+
],
480+
"license": "MIT",
481+
"lint-staged": {
482+
"*.js": [
483+
"npm run lint",
484+
"prettier --single-quote --write",
485+
"git add",
486+
],
487+
},
488+
"main": "./index",
489+
"name": "ms",
490+
"repository": "vercel/ms",
491+
"version": "2.1.3",
492+
}
493+
`;
494+
460495
exports[`yarn parse-asn1 1`] = `
461496
{
462497
"linux": [],

test/src/HoistedNodeModuleTest.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,36 @@ test.ifAll("yarn some module add by manual instead of install", () =>
198198
)
199199
)
200200

201+
//github.com/electron-userland/electron-builder/issues/8842
202+
test.ifAll("yarn ms", () =>
203+
assertPack(
204+
"test-app-hoisted",
205+
{
206+
targets: linuxDirTarget,
207+
},
208+
{
209+
isInstallDepsBefore: true,
210+
projectDirCreated: projectDir => {
211+
return Promise.all([
212+
modifyPackageJson(projectDir, data => {
213+
data.dependencies = {
214+
"@sentry/electron": "5.11.0",
215+
"electron-clear-data": "^1.0.5",
216+
}
217+
data.devDependencies = {
218+
electron: "34.0.2",
219+
}
220+
}),
221+
outputFile(path.join(projectDir, "yarn.lock"), ""),
222+
])
223+
},
224+
packed: async context => {
225+
expect(await readAsarJson(path.join(context.getResources(Platform.LINUX), "app.asar"), "node_modules/ms/package.json")).toMatchSnapshot()
226+
},
227+
}
228+
)
229+
)
230+
201231
//github.com/electron-userland/electron-builder/issues/8426
202232
test.ifAll("yarn parse-asn1", () =>
203233
assertPack(

0 commit comments

Comments
 (0)