|
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