Skip to content

Commit 6f0af4a

Browse files
committed
Change npm imports to use browserify's resolve()
This uses https://github.com/browserify/resolve for resolution. A few reasons: 1. It has a clean API for giving a `basedir` argument 2. It is pure JavaScript and (given a working `fs` and `path` implementation), can run in a webview/browser tab, rather than being node-internal Then, use the basedir configuration to make sure `npm` imports are resolved relative to the module containing the import (not relative to the compiler). Also update the test to have a handwritten node_modules with pyret-test-files. This ensures that when we run the _compiler_, whose working directory is the root of the repo, it must be using this new infrastructure to find the pyret-test-files module.
1 parent 55bbd45 commit 6f0af4a

File tree

12 files changed

+101
-15
lines changed

12 files changed

+101
-15
lines changed

package-lock.json

Lines changed: 57 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@
2929
"lockfile": "^1.0.4",
3030
"mkdirp": "^0.5.1",
3131
"node-uuid": "^1.4.8",
32-
"pyret-test-files": "git://github.com/brownplt/pyret-test-files#main",
3332
"q": "~1.0.1",
3433
"requirejs": "^2.3.7",
34+
"resolve": "^1.22.10",
3535
"s-expression": "~2.2.0",
3636
"seedrandom": "~2.3.10",
3737
"sha.js": "^2.4.11",

src/arr/compiler/cli-module-loader.arr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ fun module-finder(ctxt :: CLIContext, dep :: CS.Dependency):
352352
else if protocol == "npm":
353353
package-name = args.get(0)
354354
path = args.get(1)
355-
locator = NPM.make-npm-locator(package-name, path)
355+
locator = NPM.make-npm-locator(package-name, path, ctxt.current-load-path)
356356
clp = ctxt.current-load-path
357357
real-path = get-real-path(clp, locator.path)
358358
new-context = ctxt.{current-load-path: Filesystem.dirname(real-path)}

src/arr/compiler/locators/npm.arr

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import filesystem as FS
55
import file("../compile-structs.arr") as CS
66
import file("./file.arr") as F
77

8-
fun make-npm-locator(package-name, path):
9-
package-path = R.resolve(package-name)
8+
fun make-npm-locator(package-name, path, current-load-path):
9+
package-path = R.resolve(package-name, current-load-path)
1010
F.file-locator(
1111
FS.resolve(FS.join(FS.dirname(package-path), path)),
1212
CS.standard-globals

src/js/trove/require-node-compile-dependencies.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,5 @@ define("http", [], function () {return http;});
3838
ws = nodeRequire("ws");
3939
define("ws", [], function () { return ws });
4040

41+
resolve = nodeRequire("resolve");
42+
define("resolve", [], function () { return resolve });

src/js/trove/require-node-dependencies.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,5 @@ define("path", [], function () { return path; });
4444
http = nodeRequire("http");
4545
define("http", [], function () {return http;});
4646

47+
resolve = nodeRequire("resolve");
48+
define("resolve", [], function () {return resolve;});

src/js/trove/require-util.js

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,20 @@
66
},
77
types: {}
88
},
9-
nativeRequires: [],
10-
theModule: function(runtime, _, _) {
11-
function resolve(moduleName) {
12-
runtime.checkArgsInternal1('require-util', 'resolve', moduleName, runtime.String);
9+
nativeRequires: ["resolve"],
10+
theModule: function(runtime, _, _, browserifyResolve) {
11+
function resolve(moduleName, baseDir) {
12+
console.log(moduleName, baseDir);
13+
runtime.checkArgsInternal2('require-util', 'resolve', moduleName, runtime.String, baseDir, runtime.String);
1314
try {
14-
return require.resolve(moduleName);
15+
return runtime.pauseStack((restarter) => {
16+
browserifyResolve(moduleName, { basedir: baseDir }, (err, resolved) => {
17+
if(err) { restarter.error(runtime.makeMessageException(`Error resolving ${moduleName} from ${baseDir}: ${String(err)}`)); }
18+
restarter.resume(resolved);
19+
});
20+
});
1521
} catch (err) {
16-
throw runtime.throwMessageException(`Error resolving ${moduleName}: ${String(err)}`);
22+
throw runtime.throwMessageException(`Error resolving ${moduleName} from ${baseDir}: ${String(err)}`);
1723
}
1824
}
1925
function cannotResolve(moduleName) {
@@ -29,4 +35,4 @@
2935
resolve: runtime.makeFunction(_resolve, 'resolve')
3036
}, {});
3137
}
32-
})
38+
})

tests/pyret/tests/node_modules/pyret-test-files/README.md

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/pyret/tests/node_modules/pyret-test-files/lib/nested-in-lib.arr

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/pyret/tests/node_modules/pyret-test-files/package.json

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/pyret/tests/node_modules/pyret-test-files/require-nested.arr

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/pyret/tests/node_modules/pyret-test-files/root-of-package.arr

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)