|
64 | 64 | {:type ::module-import-error |
65 | 65 | :error e})))))) |
66 | 66 |
|
| 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 | + |
67 | 99 | (defn require-js |
68 | 100 | "(require-js '[\"module-name\" :alias ns]) |
69 | 101 |
|
|
72 | 104 | Like node.js, this function finds JavaScript modules from the node_modules directory, |
73 | 105 | it supports ECMAScript modules and legacy CommonJS modules." |
74 | 106 | {: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