From 180c162f1330d5295b8e5d47bc65cbf3ef1e8eb2 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 2 Dec 2021 14:43:27 +0100 Subject: [PATCH] TNS-51: Support namespaces as strings in require statements Signed-off-by: Alex Miller --- .gitignore | 1 + deps.edn | 9 +++++++++ .../clojure/tools/namespace/parse.cljc | 7 +++++-- .../clojure/tools/namespace/parse_test.clj | 20 ++++++++++++++++--- 4 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 deps.edn diff --git a/.gitignore b/.gitignore index eb5a316..4854732 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ target +.cpcache diff --git a/deps.edn b/deps.edn new file mode 100644 index 0000000..5412306 --- /dev/null +++ b/deps.edn @@ -0,0 +1,9 @@ +{:deps {org.clojure/tools.namespace {:local/root "." :deps/manifest :pom}} + :aliases + {:test + {:extra-paths ["src/test/clojure"] + :extra-deps {io.github.cognitect-labs/test-runner + {:git/tag "v0.5.0" :git/sha "b3fd0d2"}} + ;; :main-opts ["-m" "cognitect.test-runner" "-d" "src/test/clojure"] + :exec-fn cognitect.test-runner.api/test + :exec-args {:dirs ["src/test/clojure"]}}}} diff --git a/src/main/clojure/clojure/tools/namespace/parse.cljc b/src/main/clojure/clojure/tools/namespace/parse.cljc index 0699c94..3e76d45 100644 --- a/src/main/clojure/clojure/tools/namespace/parse.cljc +++ b/src/main/clojure/clojure/tools/namespace/parse.cljc @@ -75,7 +75,8 @@ [namespace :refer (x y)] or just [namespace]" [form] (and (sequential? form) ; should be a vector, but often is not - (symbol? (first form)) + (or (symbol? (first form)) + (string? (first form))) (or (keyword? (second form)) ; vector like [foo :as f] (= 1 (count form))))) ; bare vector like [foo] @@ -92,7 +93,9 @@ (list (symbol (str (when prefix (str prefix ".")) form))) (keyword? form) ; Some people write (:require ... :reload-all) nil - :else + (string? form) ; NPM dep, ignore + nil + :else (throw (ex-info "Unparsable namespace form" {:reason ::unparsable-ns-form :form form})))) diff --git a/src/test/clojure/clojure/tools/namespace/parse_test.clj b/src/test/clojure/clojure/tools/namespace/parse_test.clj index 03dabea..a3cbd53 100644 --- a/src/test/clojure/clojure/tools/namespace/parse_test.clj +++ b/src/test/clojure/clojure/tools/namespace/parse_test.clj @@ -171,11 +171,25 @@ (:require #?(:clj clojure.string :cljs goog.string)))") +(defn str->ns-decl [^String s] + (-> s + java.io.StringReader. + java.io.PushbackReader. + read-ns-decl)) + (deftest t-reader-conditionals (when (resolve 'clojure.core/reader-conditional?) (let [actual (-> reader-conditionals-string - java.io.StringReader. - java.io.PushbackReader. - read-ns-decl + str->ns-decl deps-from-ns-decl)] (is (= #{'clojure.string} actual))))) + +(def ns-with-npm-dependency + "(ns com.examples.one + (:require [\"foobar\"] [baz]))") + +(deftest cljs-string-dependency + (let [actual (-> ns-with-npm-dependency + str->ns-decl + deps-from-ns-decl)] + (is (= #{'baz} actual))))