Skip to content

Commit 24a3653

Browse files
committed
allow customize javascript cwd when doing require/import
1 parent e905fab commit 24a3653

File tree

3 files changed

+33
-8
lines changed

3 files changed

+33
-8
lines changed

src/net/coruscation/js4clj/context.clj

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44
[org.graalvm.polyglot Context])
55
(:require [clojure.java.io :as io]))
66

7-
(defonce ^{:dynamic true :private true} *cjs-cwd*
8-
(str (System/getProperty "user.dir")
9-
"/node_modules"))
7+
(def ^{:dynamic true} *js-cwd*
8+
"cwd of the javascript environment when doing `require` or `import`.
9+
In most cases it is the directory contains `node_modules`
10+
11+
Default: cwd of the Clojure process"
12+
(System/getProperty "user.dir"))
1013

1114
(defn default-builder
1215
"Return a `org.graalvm.polyglot.Context$Builder` object with necessary options set for js4clj to function properly.
@@ -21,15 +24,17 @@
2124
2225
"
2326
[]
24-
(let [cwd-dir (io/file *cjs-cwd*)]
27+
(let [cwd-dir (io/file *js-cwd*)]
2528
(when (not (.exists cwd-dir))
2629
(.mkdirs cwd-dir)))
2730
(-> (Context/newBuilder (into-array String ["js"]))
2831
(.allowExperimentalOptions true)
2932
(.options (HashMap.
30-
{"js.esm-eval-returns-exports" "true"
31-
"js.commonjs-require" "true"
32-
"js.commonjs-require-cwd" *cjs-cwd*}))
33+
(merge {"js.esm-eval-returns-exports" "true"}
34+
(if *js-cwd*
35+
{"js.commonjs-require" "true"
36+
"js.commonjs-require-cwd" *js-cwd*}
37+
{}))))
3338
(.allowIO true)))
3439

3540
(def ^:dynamic *context-per-thread*

test/net/coruscation/js4clj/context_test.clj

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,14 @@
33
[clojure.test :refer [deftest is use-fixtures]]
44
[net.coruscation.js4clj.context :as subject]
55
[net.coruscation.js4clj.js :as js]
6+
[net.coruscation.js4clj.require :as require]
67
[net.coruscation.js4clj.test-utils :refer [fresh-context]]
78
[net.coruscation.js4clj.utils :refer [js-set! js.-]]))
89

10+
(use-fixtures :each #'fresh-context)
11+
12+
(def test-js-cwd "test/resources/js-cwd")
13+
914
(deftest *context-per-thread*-test
1015
(binding [subject/*context-per-thread* true]
1116
(.eval @subject/*context*
@@ -45,4 +50,8 @@
4550
(is (nil? (js.- js/globalThis
4651
demo))))
4752

48-
(use-fixtures :each #'fresh-context)
53+
(deftest *js-cwd*-test
54+
(binding [subject/*js-cwd* test-js-cwd]
55+
(subject/reinitialize-context!)
56+
(is (= "index.js" (js.- (require/load-es-module "sample-package")
57+
name)))))

test/resources/js-cwd/package.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"name": "js-cwd",
3+
"version": "1.0.0",
4+
"description": "",
5+
"main": "index.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1"
8+
},
9+
"author": "",
10+
"license": "ISC"
11+
}

0 commit comments

Comments
 (0)