Skip to content

Commit 81b4d99

Browse files
committed
Add require-cjs back to the require.clj
1 parent 76f315b commit 81b4d99

File tree

1 file changed

+44
-19
lines changed

1 file changed

+44
-19
lines changed

src/net/coruscation/js4clj/require.clj

Lines changed: 44 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,38 @@
6464
{:type ::module-import-error
6565
:error e}))))))
6666

67+
68+
(defn- require-commonjs-module [name]
69+
(let [module (-> @*context*
70+
(.eval "js"
71+
(str "require('" name "')")))]
72+
(assert (.hasMembers module)
73+
(str name " is not a module"))
74+
module))
75+
76+
77+
(defn require-helper
78+
[require-module-fn]
79+
(letfn [(do-require ([[module-name & flags]]
80+
(when-not (string? module-name)
81+
(throw (ex-info "module-name must be a string"
82+
{:module-name module-name
83+
:expected-type String
84+
:received-type (class module-name)})))
85+
(let [flag-map (parse-flags flags)
86+
module (require-module-fn module-name)
87+
alias-name (:as flag-map)
88+
qualified-module-name (symbol (str "js4clj.modules." (normalize-module-name module-name)))]
89+
(when-not (symbol? alias-name)
90+
(throw (ex-info "alias must be a string"
91+
{:alias alias-name
92+
:expected-type clojure.lang.Symbol
93+
:received-type (class alias-name)})))
94+
(internal-module module qualified-module-name alias-name))))]
95+
(fn [modules]
96+
(doseq [module modules]
97+
(do-require module)))))
98+
6799
(defn require-js
68100
"(require-js '[\"module-name\" :alias ns])
69101
@@ -72,22 +104,15 @@
72104
Like node.js, this function finds JavaScript modules from the node_modules directory,
73105
it supports ECMAScript modules and legacy CommonJS modules."
74106
{:clj-kondo/lint-as 'clojure.core/require}
75-
([[module-name & flags]]
76-
(when-not (string? module-name)
77-
(throw (ex-info "module-name must be a string"
78-
{:module-name module-name
79-
:expected-type String
80-
:received-type (class module-name)})))
81-
(let [flag-map (parse-flags flags)
82-
module (require-module-dynamic module-name)
83-
alias-name (:as flag-map)
84-
qualified-module-name (symbol (str "js4clj.modules." (normalize-module-name module-name)))]
85-
(when-not (symbol? alias-name)
86-
(throw (ex-info "alias must be a string"
87-
{:alias alias-name
88-
:expected-type clojure.lang.Symbol
89-
:received-type (class alias-name)})))
90-
(internal-module module qualified-module-name alias-name)))
91-
([module & args]
92-
(require-js module)
93-
(when args (apply require-js args))))
107+
[& module-specs]
108+
((require-helper require-module-dynamic) module-specs))
109+
110+
(defn require-cjs
111+
"Like `require-js` but use `require` internally instead of `import`
112+
113+
It exists mainly due to `import` provided by GraalJS will error out when there's an `exports` field in the package.json, even when `main` field is presented. While `require` will ignore `exports`.
114+
115+
Also check https://github.com/oracle/graaljs/pull/904, this function will be useless if the upstream issue is resolved."
116+
{:clj-kondo/lint-as 'clojure.core/require}
117+
[& module-specs]
118+
((require-helper require-commonjs-module) module-specs))

0 commit comments

Comments
 (0)