Skip to content

Commit 486748c

Browse files
authored
Fix #651: allow :require + rename + renamed value in other clause (#652)
1 parent f008c6d commit 486748c

File tree

4 files changed

+79
-52
lines changed

4 files changed

+79
-52
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
[Squint](https://github.com/squint-cljs/squint): Light-weight ClojureScript dialect
44

5+
## v0.8.145 (2024-04-11)
6+
7+
- [#651](https://github.com/squint-cljs/squint/issues/651) Support `:require` + `:rename` + allow renamed value to be used in other :require clause
8+
59
## v0.8.144 (2025-04-09)
610

711
- Fix [#649](https://github.com/squint-cljs/squint/issues/649): reset ns when compiling file and fix initial global object

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
"prettier": "^2.7.1",
3636
"react": "^18.2.0",
3737
"react-dom": "^18.2.0",
38-
"shadow-cljs": "^2.19.8",
38+
"shadow-cljs": "^2.28.23",
3939
"squint-cljs": ".",
4040
"typescript": "^5.3.3"
4141
},

src/squint/compiler_common.cljc

Lines changed: 32 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -300,19 +300,16 @@
300300
(when (contains? current-ns expr)
301301
(str (when *repl*
302302
(str "globalThis." (munge *cljs-ns*) ".")) (munged-name expr)))
303-
(let [renamed (:rename current-ns)
304-
expr (get renamed expr expr)]
305-
(or
306-
(when (contains? (:refers current-ns) expr)
307-
(str (when *repl*
308-
(str "globalThis." (munge *cljs-ns*) "."))
309-
(munged-name expr)))
310-
(some-> (maybe-core-var expr env) munge)
311-
(when (let [alias (get (:aliases current-ns) expr)]
312-
alias)
313-
(str (when *repl*
314-
(str "globalThis." (munge *cljs-ns*) "."))
315-
(munged-name expr)))))
303+
(when (contains? (:refers current-ns) expr)
304+
(str (when *repl*
305+
(str "globalThis." (munge *cljs-ns*) "."))
306+
(munged-name expr)))
307+
(some-> (maybe-core-var expr env) munge)
308+
(when (let [alias (get (:aliases current-ns) expr)]
309+
alias)
310+
(str (when *repl*
311+
(str "globalThis." (munge *cljs-ns*) "."))
312+
(munged-name expr)))
316313
(let [m (munged-name expr)]
317314
m)))))]
318315
(emit-return (escape-jsx expr env)
@@ -544,21 +541,19 @@
544541
(= 'cherry.core libname))
545542
(let [libname (resolve-ns env libname)
546543
[libname suffix] (str/split (if (string? libname) libname (str libname)) #"\$" 2)
547-
[p & _props] (when suffix
548-
(str/split suffix #"\."))
549-
default? (and as (= "default" p))
544+
default? (= "default" suffix) ;; we only support a default suffix for now anyway
550545
as (when as (munge as))
551546
expr (str
552-
(when (and as (= "default" p))
547+
(when (and as default?)
553548
(if *repl*
554-
(statement (format "const %s = (await import('%s')).default" as libname))
549+
(statement (format "const %s = (await import('%s')).%s" as libname suffix))
555550
(statement (format "import %s from '%s'" as libname))))
556-
(when (and (not as) (not p) (not refer))
551+
(when (and (not as) (not suffix) (not refer))
557552
;; import presumably for side effects
558553
(if *repl*
559554
(statement (format "await import('%s')" libname))
560555
(statement (format "import '%s'" libname))))
561-
(when (and as (not= "default" p))
556+
(when (and as (not default?))
562557
(swap! *imported-vars* update libname (fnil identity #{}))
563558
(statement (if *repl*
564559
(format "var %s = await import('%s')" as libname)
@@ -569,27 +564,30 @@
569564
(let [current (:current ns-state)]
570565
(update-in ns-state [current :refers]
571566
(fn [refers]
572-
(merge refers (zipmap refer (repeat libname))))))))
573-
(when rename
574-
(swap! (:ns-state env)
575-
(fn [ns-state]
576-
(let [current (:current ns-state)]
577-
(update-in ns-state [current :rename]
578-
merge (zipmap (vals rename) (keys rename)))))))
579-
(let [munged-refers (map munge refer)]
567+
(merge refers (zipmap (map (fn [refer]
568+
(get rename refer refer)) refer) (repeat libname))))))))
569+
(let [referred+renamed (str/join ", "
570+
(map (fn [refer]
571+
(str (munge refer)
572+
(when-let [renamed (get rename refer)]
573+
(str " as " (munge renamed)))))
574+
refer))]
580575
(if *repl*
581-
(str (statement (format "var { %s } = (await import ('%s'))%s" (str/join ", " munged-refers) libname
582-
(if default? ".default"
583-
"")))
576+
(str (statement (format "var { %s } = (await import ('%s'))%s" (str/replace referred+renamed " as " ": ") libname
577+
(if suffix
578+
(str "." suffix)
579+
"")))
584580
(str/join (map (fn [sym]
585581
(statement (str "globalThis." (munge current-ns-name) "." sym " = " sym)))
586-
munged-refers)))
582+
(map (fn [refer]
583+
(get rename refer refer))
584+
refer))))
587585

588586
(if default?
589587
(let [libname* ((:gensym env) "default")]
590588
(str (statement (format "import %s from '%s'" libname* libname))
591-
(statement (format "const { %s } = %s" (str/join ", " (map munge refer)) libname*))))
592-
(statement (format "import { %s } from '%s'" (str/join ", " (map munge refer)) libname)))))))]
589+
(statement (format "const { %s } = %s" referred+renamed libname*))))
590+
(statement (format "import { %s } from '%s'" referred+renamed libname)))))))]
593591
(when as
594592
(swap! (:ns-state env)
595593
(fn [ns-state]

test/squint/compiler_test.cljs

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1694,6 +1694,9 @@
16941694
(is (jsv! '(not (some? nil))))
16951695
(is (jsv! '(not (some? js/undefined)))))
16961696

1697+
1698+
;;; begin ns / require related tests
1699+
16971700
(deftest ns-test
16981701
(is (str/includes? (squint/compile-string (pr-str '(ns foo (:require ["./popup.css" ]))))
16991702
"import './popup.css'"))
@@ -1706,6 +1709,28 @@
17061709
(str/trim (squint/compile-string "(ns foo (:require [\"some-js-lib\" :refer [atom]])) atom" {:repl true}))
17071710
"foo.atom;")))
17081711

1712+
(deftest require-test
1713+
(let [s (squint/compile-string "(ns test-namespace (:require [\"some-js-library\" :refer [existsSync] :rename {existsSync exists}])) (exists \"README.md\")")]
1714+
(is (and
1715+
(str/includes? s "existsSync as exists")
1716+
(str/includes? s "exists(\"README.md\")"))))
1717+
(let [s (squint/compile-string "(ns test-namespace (:require [\"some-js-library\" :refer [existsSync] :rename {existsSync exists}])) (exists \"README.md\")"
1718+
{:repl true})]
1719+
(is (and
1720+
(str/includes? s "existsSync: exists")
1721+
(str/includes? s "globalThis.test_namespace.exists(\"README.md\")"))))
1722+
(testing "alias + refer"
1723+
(let [s (squint/compile-string "(ns foo (:require [\"node:fs\" :as \"fs\" :refer [existsSync]]))")]
1724+
(is (and
1725+
(str/includes? s "import * as fs from 'node:fs';")
1726+
(str/includes? s "import { existsSync } from 'node:fs'"))))
1727+
(let [s (squint/compile-string "(ns foo (:require [\"node:fs\" :as fs :refer [existsSync]]))"
1728+
{:repl true})]
1729+
(is (str/includes? s "var fs = await import('node:fs');
1730+
var { existsSync } = (await import ('node:fs'));
1731+
globalThis.foo.existsSync = existsSync;
1732+
globalThis.foo.fs = fs;")))))
1733+
17091734
(deftest default-require-test
17101735
(let [js (squint/compile-string "(ns foo (:require [\"some-js-lib$default\" :as a :refer [atom]])) atom")]
17111736
(is (str/includes? js "import default$1 from 'some-js-lib'"))
@@ -1732,20 +1757,6 @@
17321757
(p/catch (fn [err] (is (throw err))))
17331758
(p/finally done))))
17341759

1735-
(deftest letfn-test
1736-
(is (= 3 (jsv! '(letfn [(f [x] (g x)) (g [x] (inc x))] (f 2)))))
1737-
(is (= 20 (jsv! '(do (defn foo [] (letfn [(g [x] (f x)) (f [x] (* 2 x))] (g 10))) (foo))))))
1738-
1739-
(deftest refer-clojure-exclude-test
1740-
(is (= "yolo" (jsv! '(do (ns foo (:refer-clojure :exclude [assoc])) (defn assoc [m x y] :yolo) (assoc {} :foo :bar))))))
1741-
1742-
(deftest double-names-in-sig-test
1743-
(is (= 2 (jsv! '(do (defn foo [x x] x) (foo 1 2))))))
1744-
1745-
(deftest try-catch-test
1746-
(is (= 2 (jsv! '(try (assoc :foo 1 2) (catch :default _ 2)))))
1747-
(is (= 2 (jsv! '(try (assoc :foo 1 2) (catch :default _ 2))))))
1748-
17491760
(deftest require-with-kebab-case-alias-test
17501761
(let [s (squint/compile-string "(ns test-namespace (:require [\"some-js-library$default\" :as some-js-lib])) (some-js-lib/some_fn)")]
17511762
(is (str/includes? s "import some_js_lib from 'some-js-library';"))
@@ -1765,9 +1776,23 @@
17651776
(doseq [repl [false true]]
17661777
(let [js (squint/compile-string "(require '[clojure.string :as str-ing]) (str-ing/join [1 2 3])" {:repl repl})]
17671778
(is (not (str/includes? js "str-ing")))
1768-
(is (str/includes? js "str_ing"))))
1769-
(let [s (squint/compile-string "(ns test-namespace (:require [\"some-js-library\" :refer [existsSync] :rename {existsSync exists}])) (exists \"README.md\")")]
1770-
(is (str/includes? s "existsSync(\"README.md\")"))))
1779+
(is (str/includes? js "str_ing")))))
1780+
1781+
;;; end ns / require related tests
1782+
1783+
(deftest letfn-test
1784+
(is (= 3 (jsv! '(letfn [(f [x] (g x)) (g [x] (inc x))] (f 2)))))
1785+
(is (= 20 (jsv! '(do (defn foo [] (letfn [(g [x] (f x)) (f [x] (* 2 x))] (g 10))) (foo))))))
1786+
1787+
(deftest refer-clojure-exclude-test
1788+
(is (= "yolo" (jsv! '(do (ns foo (:refer-clojure :exclude [assoc])) (defn assoc [m x y] :yolo) (assoc {} :foo :bar))))))
1789+
1790+
(deftest double-names-in-sig-test
1791+
(is (= 2 (jsv! '(do (defn foo [x x] x) (foo 1 2))))))
1792+
1793+
(deftest try-catch-test
1794+
(is (= 2 (jsv! '(try (assoc :foo 1 2) (catch :default _ 2)))))
1795+
(is (= 2 (jsv! '(try (assoc :foo 1 2) (catch :default _ 2))))))
17711796

17721797
(deftest dissoc!-test
17731798
(is (eq #js {"1" 2 "3" 4} (jsv! '(dissoc! {"1" 2 "3" 4}))))

0 commit comments

Comments
 (0)