Skip to content

Commit 5757af6

Browse files
committed
Initial commit
0 parents  commit 5757af6

File tree

5 files changed

+116
-0
lines changed

5 files changed

+116
-0
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.nrepl-*
2+
node_modules
3+
target

README.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Cljsjs.npm
2+
3+
# NOT REALLY WORKING YET
4+
5+
Automatically package npm modules as jars with `deps.cljs` files.

build.boot

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
(set-env!
2+
:dependencies '[[cheshire "5.6.3"]]
3+
:source-paths #{"src"})
4+
5+
(require '[cljsjs.npm.build :refer [package]])

package.json

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"name": "cljsjs.npm",
3+
"version": "1.0.0",
4+
"description": "",
5+
"dependencies": {
6+
"material-ui": "^0.15.4",
7+
"react": "^15.3.1",
8+
"react-addons-create-fragment": "^15.3.1",
9+
"react-addons-transition-group": "^15.3.1",
10+
"react-dom": "^15.3.1",
11+
"react-tap-event-plugin": "^1.0.0"
12+
}
13+
}

src/cljsjs/npm/build.clj

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
(ns cljsjs.npm.build
2+
(:require [cheshire.core :as json]
3+
[clojure.java.io :as io]
4+
[clojure.string :as string]
5+
[boot.util :as util]
6+
[boot.core :as boot]
7+
[boot.task.built-in :as built-in]))
8+
9+
(defn read-json [file]
10+
(with-open [r (io/reader file)]
11+
(json/parse-stream r true)))
12+
13+
(defn parse-version [version-pattern]
14+
(let [[_ version] (re-find #"[\^](.*)" version-pattern)]
15+
version))
16+
17+
(defn copy-main [out {:keys [name main]}]
18+
(io/copy (io/file "node_modules" name main)
19+
(doto (io/file out "cljsjs.npm" name main)
20+
(io/make-parents))))
21+
22+
(defn with-files
23+
"Runs middleware with filtered fileset and merges the result back into complete fileset."
24+
[p middleware]
25+
(fn [next-handler]
26+
(fn [fileset]
27+
(let [merge-fileset-handler (fn [fileset']
28+
(next-handler (boot/commit! (assoc fileset :tree (merge (:tree fileset) (:tree fileset'))))))
29+
handler (middleware merge-fileset-handler)
30+
fileset (assoc fileset :tree (reduce-kv
31+
(fn [tree path x]
32+
(if (p x)
33+
(assoc tree path x)
34+
tree))
35+
(empty (:tree fileset))
36+
(:tree fileset)))]
37+
(handler fileset)))))
38+
39+
(defn package'
40+
"A Task, but not."
41+
[{:keys [name main]}]
42+
(let [out (boot/tmp-dir!)]
43+
(fn middleware [next-handler]
44+
(fn handler [fileset]
45+
(util/info "Package %s\n" name)
46+
(let [files (->> (file-seq (io/file "node_modules" name))
47+
(remove #(re-find #"^node_modules/.*/node_modules" (.getPath %)))
48+
(remove #(re-find #"^node_modules/.*/dist" (.getPath %)))
49+
(filter #(.endsWith (.getName %) ".js"))
50+
(map (fn [file]
51+
(let [path (.getPath file)
52+
[_ package-path] (re-find #"^node_modules/[^/]*/(.*)" path)
53+
aname (if (= main package-path)
54+
name
55+
(str name "/" (string/replace package-path #"\.js$" "")))
56+
aname (string/replace aname #"/" "\\$")]
57+
(io/copy file (doto (io/file out "cljsjs.npm" (string/replace path #"^node_modules/" "")) (io/make-parents)))
58+
{:file (str "cljsjs.npm/" (string/replace path #"^node_modules/" ""))
59+
:provides [aname]
60+
:module-type :commonjs}))))]
61+
(doto (io/file out "deps.cljs")
62+
(io/make-parents)
63+
(spit (pr-str {:foreign-libs (vec files)}))))
64+
(-> fileset
65+
(boot/add-resource out)
66+
boot/commit!
67+
next-handler)))))
68+
69+
(boot/deftask package
70+
[]
71+
(let [package-index (read-json (io/file "./package.json"))
72+
packages (map name (keys (:dependencies package-index)))]
73+
(fn middleware [next-handler]
74+
(let [next-handler (reduce (fn [next-handler package-name]
75+
(let [package-json (read-json (io/file "node_modules" package-name "package.json"))
76+
middleware (with-files (constantly false)
77+
(comp (package' package-json)
78+
(built-in/pom :project (symbol "cljsjs.npm" package-name)
79+
:version (:version package-json))
80+
(built-in/jar)
81+
(built-in/show :fileset true)))]
82+
(middleware next-handler)))
83+
next-handler
84+
(reverse packages))]
85+
(fn handler [fileset]
86+
(next-handler fileset))))))
87+
88+
(comment
89+
(read-json (io/file "node_modules" "react" "package.json"))
90+
(boot.core/boot (comp (package) (boot.task.built-in/target))))

0 commit comments

Comments
 (0)