Skip to content

Commit e48e2aa

Browse files
committed
Require searches recursively node_modules dir
1 parent 64f1044 commit e48e2aa

File tree

3 files changed

+59
-33
lines changed

3 files changed

+59
-33
lines changed

src/NativeScript/GlobalObject.moduleLoader.mm

Lines changed: 57 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,51 @@
4545
return nil;
4646
}
4747

48-
static NSString* resolveFile(NSString* filePath) {
49-
if (stat<S_IFREG>(filePath)) {
50-
return filePath;
51-
} else if (NSString* path = stat<S_IFREG>([filePath stringByAppendingPathExtension:@"js"])) {
48+
static NSString* resolveDirectory(NSString* absolutePath, WTF::HashMap<WTF::String, WTF::String, WTF::ASCIICaseInsensitiveHash>& cache, NSError** error) {
49+
if (cache.contains(absolutePath)) {
50+
return cache.get(absolutePath);
51+
}
52+
53+
if (stat<S_IFREG>(absolutePath)) {
54+
cache.set(absolutePath, absolutePath);
55+
return absolutePath;
56+
}
57+
58+
if (NSString* path = stat<S_IFREG>([absolutePath stringByAppendingPathExtension:@"js"])) {
59+
cache.set(absolutePath, path);
5260
return path;
53-
} else if (NSString* path = stat<S_IFREG>([filePath stringByAppendingPathExtension:@"json"])) {
61+
}
62+
63+
if (NSString* path = stat<S_IFREG>([absolutePath stringByAppendingPathExtension:@"json"])) {
64+
cache.set(absolutePath, path);
5465
return path;
5566
}
5667

68+
if (stat<S_IFDIR>(absolutePath)) {
69+
NSString* mainName = @"index.js";
70+
71+
NSString* packageJsonPath = [absolutePath stringByAppendingPathComponent:@"package.json"];
72+
if (stat<S_IFREG>(packageJsonPath)) {
73+
NSData* packageJsonData = [NSData dataWithContentsOfFile:packageJsonPath options:0 error:error];
74+
if (!packageJsonData && error) {
75+
return nil;
76+
}
77+
78+
NSDictionary* packageJson = [NSJSONSerialization JSONObjectWithData:packageJsonData options:0 error:error];
79+
if (!packageJson && error) {
80+
return nil;
81+
}
82+
83+
if (NSString* packageMain = [packageJson objectForKey:@"main"]) {
84+
mainName = packageMain;
85+
}
86+
}
87+
88+
NSString* resolved = resolveDirectory([absolutePath stringByAppendingPathComponent:mainName], cache, error);
89+
cache.set(absolutePath, resolved);
90+
return resolved;
91+
}
92+
5793
return nil;
5894
}
5995

@@ -94,42 +130,32 @@
94130
absolutePath = [[absolutePath stringByAppendingPathComponent:path] stringByStandardizingPath];
95131
}
96132

97-
WTF::String requestedPath = absolutePath;
98-
if (self->modulePathCache().contains(requestedPath)) {
99-
return deferred->resolve(execState, jsString(execState, self->modulePathCache().get(requestedPath)));
100-
}
101-
102-
NSString* absoluteFilePath = resolveFile(absolutePath);
103-
if (!absoluteFilePath && stat<S_IFDIR>(absolutePath)) {
104-
NSString* mainFileName = @"index.js";
105-
106-
NSString* packageJsonPath = [absolutePath stringByAppendingPathComponent:@"package.json"];
107-
if (stat<S_IFREG>(packageJsonPath)) {
108-
NSError* error = nil;
109-
NSData* packageJsonData = [NSData dataWithContentsOfFile:packageJsonPath options:0 error:&error];
110-
if (!packageJsonData && error) {
111-
return deferred->reject(execState, self->interop()->wrapError(execState, error));
112-
}
133+
NSError* error = nil;
134+
NSString* absoluteFilePath = resolveDirectory(absolutePath, self->modulePathCache(), &error);
113135

114-
NSDictionary* packageJson = [NSJSONSerialization JSONObjectWithData:packageJsonData options:0 error:&error];
115-
if (!packageJson && error) {
116-
return deferred->reject(execState, self->interop()->wrapError(execState, error));
117-
}
136+
if (error) {
137+
return deferred->reject(execState, self->interop()->wrapError(execState, error));
138+
}
118139

119-
if (NSString* packageMain = [packageJson objectForKey:@"main"]) {
120-
mainFileName = packageMain;
140+
if (!absoluteFilePath) {
141+
NSString* currentSearchPath = [static_cast<NSString*>(referrerValue.toWTFString(execState)) stringByDeletingLastPathComponent];
142+
do {
143+
NSString* currentNodeModulesPath = [[currentSearchPath stringByAppendingPathComponent:@"node_modules"] stringByStandardizingPath];
144+
if (stat<S_IFDIR>(currentNodeModulesPath)) {
145+
absoluteFilePath = resolveDirectory([currentNodeModulesPath stringByAppendingPathComponent:path], self->modulePathCache(), &error);
146+
if (absoluteFilePath) {
147+
break;
148+
}
121149
}
122-
}
123-
124-
absoluteFilePath = resolveFile([absolutePath stringByAppendingPathComponent:mainFileName]);
150+
currentSearchPath = [currentSearchPath stringByDeletingLastPathComponent];
151+
} while (currentSearchPath.length > self->applicationPath().length());
125152
}
126153

127154
if (!absoluteFilePath) {
128155
WTF::String errorMessage = WTF::String::format("Could not find module '%s'. Computed path '%s'.", keyValue.toWTFString(execState).utf8().data(), absolutePath.UTF8String);
129156
return deferred->reject(execState, createError(execState, errorMessage));
130157
}
131158

132-
self->modulePathCache().set(requestedPath, absoluteFilePath);
133159
return deferred->resolve(execState, jsString(execState, absoluteFilePath));
134160
}
135161

tests/TestRunner/app/shared

Submodule shared updated 21 files

0 commit comments

Comments
 (0)