|
255 | 255 |
|
256 | 256 | String
|
257 | 257 | (-foreign? [this] false)
|
| 258 | + (-closure-lib? [this] false) |
258 | 259 | (-url [this] nil)
|
259 | 260 | (-provides [this] (:provides (deps/parse-js-ns (string/split-lines this))))
|
260 | 261 | (-requires [this] (:requires (deps/parse-js-ns (string/split-lines this))))
|
261 | 262 | (-source [this] this)
|
262 | 263 |
|
263 | 264 | clojure.lang.IPersistentMap
|
264 | 265 | (-foreign? [this] (:foreign this))
|
| 266 | + (-closure-lib? [this] (:closure-lib this)) |
265 | 267 | (-url [this] (or (:url this)
|
266 | 268 | (deps/to-url (:file this))))
|
267 | 269 | (-provides [this] (map name (:provides this)))
|
|
273 | 275 | (defrecord JavaScriptFile [foreign ^URL url ^URL source-url provides requires lines source-map]
|
274 | 276 | deps/IJavaScript
|
275 | 277 | (-foreign? [this] foreign)
|
| 278 | + (-closure-lib? [this] (:closure-lib this)) |
276 | 279 | (-url [this] url)
|
277 | 280 | (-provides [this] provides)
|
278 | 281 | (-requires [this] requires)
|
|
291 | 294 | (JavaScriptFile. foreign url source-url (map name provides) (map name requires) lines source-map)))
|
292 | 295 |
|
293 | 296 | (defn map->javascript-file [m]
|
294 |
| - (javascript-file |
295 |
| - (:foreign m) |
296 |
| - (when-let [f (:file m)] |
297 |
| - (deps/to-url f)) |
298 |
| - (when-let [sf (:source-file m)] |
299 |
| - (deps/to-url sf)) |
300 |
| - (:provides m) |
301 |
| - (:requires m) |
302 |
| - (:lines m) |
303 |
| - (:source-map m))) |
| 297 | + (merge |
| 298 | + (javascript-file |
| 299 | + (:foreign m) |
| 300 | + (when-let [f (:file m)] |
| 301 | + (deps/to-url f)) |
| 302 | + (when-let [sf (:source-file m)] |
| 303 | + (deps/to-url sf)) |
| 304 | + (:provides m) |
| 305 | + (:requires m) |
| 306 | + (:lines m) |
| 307 | + (:source-map m)) |
| 308 | + (when (:closure-lib m) |
| 309 | + {:closure-lib true}))) |
304 | 310 |
|
305 | 311 | (defn read-js
|
306 | 312 | "Read a JavaScript file returning a map of file information."
|
|
1121 | 1127 | (- (count (.split #"\r?\n" fdeps-str -1)) 1)
|
1122 | 1128 | 0)})))))))
|
1123 | 1129 |
|
| 1130 | +(defn lib-rel-path [{:keys [lib-path url] :as ijs}] |
| 1131 | + (string/replace |
| 1132 | + (util/path url) |
| 1133 | + (str (io/file (System/getProperty "user.dir") lib-path) File/separator) |
| 1134 | + "")) |
| 1135 | + |
1124 | 1136 | (defn ^String rel-output-path
|
1125 | 1137 | "Given an IJavaScript which is either in memory, in a jar file,
|
1126 | 1138 | or is a foreign lib, return the path relative to the output
|
1127 | 1139 | directory."
|
1128 |
| - [js] |
1129 |
| - (let [url (deps/-url js)] |
1130 |
| - (cond |
1131 |
| - url |
1132 |
| - (if (deps/-foreign? js) |
1133 |
| - (util/get-name url) |
1134 |
| - (path-from-jarfile url)) |
1135 |
| - |
1136 |
| - (string? js) |
1137 |
| - (let [digest (MessageDigest/getInstance "SHA-1")] |
1138 |
| - (.reset digest) |
1139 |
| - (.update digest (.getBytes ^String js "utf8")) |
1140 |
| - (str |
1141 |
| - (->> (DatatypeConverter/printHexBinary (.digest digest)) |
1142 |
| - (take 7) |
1143 |
| - (apply str)) |
1144 |
| - ".js")) |
1145 |
| - |
1146 |
| - :else (str (random-string 5) ".js")))) |
| 1140 | + ([js] (rel-output-path js nil)) |
| 1141 | + ([js opts] |
| 1142 | + (let [url (deps/-url js)] |
| 1143 | + (cond |
| 1144 | + url |
| 1145 | + (cond |
| 1146 | + (deps/-closure-lib? js) (lib-rel-path js) |
| 1147 | + (deps/-foreign? js) (util/get-name url) |
| 1148 | + :else (path-from-jarfile url)) |
| 1149 | + |
| 1150 | + (string? js) |
| 1151 | + (let [digest (MessageDigest/getInstance "SHA-1")] |
| 1152 | + (.reset digest) |
| 1153 | + (.update digest (.getBytes ^String js "utf8")) |
| 1154 | + (str |
| 1155 | + (->> (DatatypeConverter/printHexBinary (.digest digest)) |
| 1156 | + (take 7) |
| 1157 | + (apply str)) |
| 1158 | + ".js")) |
| 1159 | + |
| 1160 | + :else (str (random-string 5) ".js"))))) |
1147 | 1161 |
|
1148 | 1162 | (defn write-javascript
|
1149 | 1163 | "Write or copy a JavaScript file to output directory. Only write if the file
|
1150 | 1164 | does not already exist. Return IJavaScript for the file on disk at the new
|
1151 | 1165 | location."
|
1152 | 1166 | [opts js]
|
1153 | 1167 | (let [out-dir (io/file (util/output-directory opts))
|
1154 |
| - out-name (rel-output-path js) |
| 1168 | + out-name (rel-output-path js opts) |
1155 | 1169 | out-file (io/file out-dir out-name)
|
1156 | 1170 | ijs {:url (deps/to-url out-file)
|
1157 | 1171 | :requires (deps/-requires js)
|
|
1171 | 1185 | (let [url ^URL (deps/-url js)]
|
1172 | 1186 | (or (not url)
|
1173 | 1187 | (= (.getProtocol url) "jar")
|
| 1188 | + (deps/-closure-lib? js) |
1174 | 1189 | (deps/-foreign? js))))
|
1175 | 1190 |
|
1176 | 1191 | (defn source-on-disk
|
|
0 commit comments