forked from RyanMcG/lein-npm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
npm.clj
107 lines (93 loc) · 2.91 KB
/
npm.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
(ns leiningen.npm
(:require [leiningen.help :as help]
[leiningen.core.main :as main]
[cheshire.core :as json]
[clojure.java.io :as io]
[clojure.java.shell :refer [sh]]
[leiningen.npm.process :refer [exec iswin]]
[leiningen.npm.deps :refer [resolve-node-deps]]
[robert.hooke]
[leiningen.deps]))
(defn- json-file
[filename project]
(io/file (project :root) filename))
(defn- locate-npm
[]
(if (iswin)
(sh "cmd" "/C" "for" "%i" "in" "(npm)" "do" "@echo." "%~$PATH:i")
(sh "which" "npm")))
(defn environmental-consistency
[project & files]
(doseq [filename files]
(when (.exists (json-file filename project))
(do
(println
(format "Your project already has a %s file. " filename)
"Please remove it.")
(main/abort))))
(when-not (= 0 ((locate-npm) :exit))
(do
(println "Unable to find npm on your path. Please install it.")
(main/abort))))
(defn- invoke
[project & args]
(let [return-code (exec (project :root) (cons "npm" args))]
(when (> return-code 0)
(main/exit return-code))))
(defn transform-deps
[deps]
(apply hash-map (flatten deps)))
(defn- project->package
[project]
(json/generate-string
(merge {:private true} ;; prevent npm warnings about repository and README
(project :nodejs)
{:name (project :name)
:description (project :description)
:version (project :version)
:dependencies (transform-deps (resolve-node-deps project))})
{:pretty true}))
(defn write-json-file
[filename content project]
(doto (json-file filename project)
(spit content)
(.deleteOnExit)))
(defn remove-json-file
[filename project]
(.delete (json-file filename project)))
(defmacro with-json-file
[filename content project & forms]
`(try
(write-json-file ~filename ~content ~project)
~@forms
(finally (remove-json-file ~filename ~project))))
(defn npm-debug
[project]
(with-json-file "package.json" (project->package project) project
(println "lein-npm generated package.json:\n")
(println (slurp "package.json"))))
(defn npm
"Invoke the NPM package manager."
([project]
(environmental-consistency project "package.json")
(println (help/help-for "npm"))
(main/abort))
([project & args]
(environmental-consistency project "package.json")
(cond
(= ["pprint"] args)
(npm-debug project)
:else
(with-json-file "package.json" (project->package project) project
(apply invoke project args)))))
(defn install-deps
[project]
(environmental-consistency project)
(with-json-file "package.json" (project->package project) project
(invoke project "install")))
(defn wrap-deps
[f & args]
(apply f args)
(install-deps (first args)))
(defn install-hooks []
(robert.hooke/add-hook #'leiningen.deps/deps wrap-deps))