Skip to content

Commit a2eed82

Browse files
authored
Fix recursive dependency downloading (codesandbox#264)
1 parent 4975a67 commit a2eed82

File tree

1 file changed

+39
-24
lines changed

1 file changed

+39
-24
lines changed

src/sandbox/eval/npm/fetch-npm-module.js

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as pathUtils from 'common/utils/path';
33
import resolve from 'browser-resolve';
44

55
import type { Module } from '../entities/module';
6-
import Manager from '../manager';
6+
import Manager, { Manifest } from '../manager';
77

88
import DependencyNotFoundError from '../../errors/dependency-not-found-error';
99
import getDependencyName from '../utils/get-dependency-name';
@@ -31,12 +31,14 @@ export function getCombinedMetas() {
3131

3232
function normalize(depName: string, files: MetaFiles, fileObject: Meta = {}) {
3333
for (let i = 0; i < files.length; i += 1) {
34-
const absolutePath = pathUtils.join(
35-
'/node_modules',
36-
depName,
37-
files[i].path
38-
);
39-
fileObject[absolutePath] = true; // eslint-disable-line no-param-reassign
34+
if (files[i].type === 'file') {
35+
const absolutePath = pathUtils.join(
36+
'/node_modules',
37+
depName,
38+
files[i].path
39+
);
40+
fileObject[absolutePath] = true; // eslint-disable-line no-param-reassign
41+
}
4042

4143
if (files[i].files) {
4244
normalize(depName, files[i].files, fileObject);
@@ -91,28 +93,36 @@ function downloadDependency(depName: string, depVersion: string, path: string) {
9193
return packages[path];
9294
}
9395

94-
export default async function fetchModule(
95-
path: string,
96-
currentPath: string,
97-
manager: Manager,
98-
defaultExtensions: Array<string> = ['js', 'jsx', 'json']
99-
): Promise<Module> {
100-
const dependencyName = getDependencyName(path);
101-
96+
function findDependencyVersion(manifest: Manifest, dependencyName: string) {
10297
let version = null;
10398

104-
if (manager.manifest.dependencyDependencies[dependencyName]) {
105-
version = manager.manifest.dependencyDependencies[dependencyName].resolved;
99+
if (manifest.dependencyDependencies[dependencyName]) {
100+
version = manifest.dependencyDependencies[dependencyName].resolved;
106101
} else {
107-
const dep = manager.manifest.dependencies.find(
108-
m => m.name === dependencyName
109-
);
102+
const dep = manifest.dependencies.find(m => m.name === dependencyName);
110103

111104
if (dep) {
112105
version = dep.version;
113106
}
114107
}
115108

109+
if (version) {
110+
return version;
111+
}
112+
113+
return null;
114+
}
115+
116+
export default async function fetchModule(
117+
path: string,
118+
currentPath: string,
119+
manager: Manager,
120+
defaultExtensions: Array<string> = ['js', 'jsx', 'json']
121+
): Promise<Module> {
122+
const dependencyName = getDependencyName(path);
123+
124+
const version = findDependencyVersion(manager.manifest, dependencyName);
125+
116126
if (!version) {
117127
throw new DependencyNotFoundError(path);
118128
}
@@ -132,14 +142,19 @@ export default async function fetchModule(
132142
return callback(null, manager.transpiledModules[p].module.code);
133143
}
134144

135-
const depName = getDependencyName(p);
136-
const depInfo = manager.manifest.dependencyDependencies[depName];
145+
const depPath = p.replace('/node_modules/', '');
146+
const depName = getDependencyName(depPath);
147+
148+
const subDepVersion = findDependencyVersion(
149+
manager.manifest,
150+
depName
151+
);
137152

138-
if (depInfo) {
153+
if (subDepVersion) {
139154
try {
140155
const module = await downloadDependency(
141156
depName,
142-
depInfo.resolved,
157+
subDepVersion,
143158
p
144159
);
145160

0 commit comments

Comments
 (0)