Skip to content

Commit 17be1dc

Browse files
committed
Parse require calls from JS files using Closure
1 parent c8c8561 commit 17be1dc

File tree

3 files changed

+43
-1
lines changed

3 files changed

+43
-1
lines changed

build.boot

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
(set-env!
2-
:dependencies '[[cheshire "5.6.3"]]
2+
:dependencies '[[cheshire "5.6.3"]
3+
[com.google.javascript/closure-compiler-unshaded "v20160911"]]
34
:source-paths #{"src"})
45

56
(require '[cljsjs.npm.build :refer [package]])

src/cljsjs/closure.clj

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
(ns cljsjs.closure
2+
(:require [clojure.java.io :as io])
3+
(:import [com.google.javascript.jscomp CompilerPass NodeTraversal
4+
CompilerOptions SourceFile NodeTraversal$Callback JSModule]
5+
[com.google.javascript.rhino Node]))
6+
7+
(defn is-require? [n]
8+
(and (= 2 (.getChildCount n))
9+
(.. n getFirstChild (matchesQualifiedName "require"))
10+
(.. n getSecondChild isString)))
11+
12+
(defn is-npm-require? [module-name]
13+
false)
14+
15+
(defn finder [requires]
16+
(reify NodeTraversal$Callback
17+
(shouldTraverse ^boolean [this t n parent]
18+
true)
19+
(visit ^void [this t n parent]
20+
(if (is-require? n)
21+
(swap! requires conj (.. n getSecondChild getString)))
22+
nil)))
23+
24+
(defn process-pass [compiler requires]
25+
(reify CompilerPass
26+
(process [this _ root]
27+
(NodeTraversal/traverseEs6 compiler root (finder requires)))))
28+
29+
(defn find-requires [f]
30+
(let [requires (atom [])
31+
module (doto (JSModule. "$singleton$")
32+
(.add (SourceFile/fromFile f)))
33+
closure-compiler (com.google.javascript.jscomp.Compiler.)
34+
pass (process-pass closure-compiler requires)]
35+
(doseq [input (.getInputs module)]
36+
(.process pass nil (.getAstRoot input closure-compiler)))
37+
@requires))
38+
39+
(comment
40+
(find-requires (io/file "node_modules/react/lib/React.js")))

src/cljsjs/npm/build.clj

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
(:require [cheshire.core :as json]
33
[clojure.java.io :as io]
44
[clojure.string :as string]
5+
[cljsjs.closure :as closure]
56
[boot.util :as util]
67
[boot.core :as boot]
78
[boot.task.built-in :as built-in]))

0 commit comments

Comments
 (0)