commit 35f826a362fff9ec2b70995b8919da6045c0c875
parent 6f5ceba8b103d9b7568940a989a29580ab6b24fc
Author: Ryan Jeffrey <ryan@ryanmj.xyz>
Date: Thu, 27 Jan 2022 13:45:27 -0800
Begin transition to clojurescript
Diffstat:
5 files changed, 127 insertions(+), 2 deletions(-)
diff --git a/deps.edn b/deps.edn
@@ -0,0 +1 @@
+{:deps {org.clojure/clojurescript {:mvn/version "1.10.758"}}}
diff --git a/package-lock.json b/package-lock.json
@@ -12,7 +12,8 @@
"devDependencies": {
"@types/express": "^4.17.13",
"@types/express-handlebars": "^6.0.0",
- "@types/node": "^17.0.10"
+ "@types/node": "^17.0.10",
+ "source-map-support": "^0.5.21"
}
},
"node_modules/@types/body-parser": {
@@ -152,6 +153,12 @@
"concat-map": "0.0.1"
}
},
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
"node_modules/bytes": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
@@ -676,6 +683,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
"node_modules/statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
@@ -882,6 +899,12 @@
"concat-map": "0.0.1"
}
},
+ "buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
"bytes": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
@@ -1278,6 +1301,16 @@
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
},
+ "source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
"statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
diff --git a/package.json b/package.json
@@ -7,6 +7,7 @@
"devDependencies": {
"@types/express": "^4.17.13",
"@types/express-handlebars": "^6.0.0",
- "@types/node": "^17.0.10"
+ "@types/node": "^17.0.10",
+ "source-map-support": "^0.5.21"
}
}
diff --git a/shadow-cljs.edn b/shadow-cljs.edn
@@ -0,0 +1,17 @@
+;; shadow-cljs configuration
+{:source-paths
+ ["src/dev"
+ "src/main"
+ "src/test"]
+
+ :dependencies
+ []
+
+ :builds
+ {:app {:target :node-script
+ :output-to "bin/main.js"
+ :main rmjxyz.app/main!
+ :devtools {:after-load rmjxyz.app/reload!}
+ }
+ }
+ }
diff --git a/src/main/rmjxyz/app.cljs b/src/main/rmjxyz/app.cljs
@@ -0,0 +1,73 @@
+(ns rmjxyz.app
+ (:require [cljs.nodejs :as nodejs]
+ ["express" :as express]
+ ["express-handlebars" :as exphbs]
+ [cljs.core.async :refer-macros [go]]
+ [cljs.pprint :refer [pprint]]
+ [cljs.core.async.interop :refer-macros [<p!]]))
+
+(println "Initializing server...")
+(defonce app (atom nil))
+(defonce index-windows (atom nil))
+(defonce fs (js/require "fs"))
+(defonce permStrings ["---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"])
+(defonce mons [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
+ "Aug", "Sep", "Oct", "Nov", "Dec" ])
+
+(defn mon-by-index
+ "Get a month (abbreviation) by its index. Returns nil if i is out of range."
+ [i]
+ (nth mons i nil))
+
+(defn permissions-to-string
+ "Convert Unix file permission mode to string. Return nil on invalid mode."
+ [mode]
+ (nth permStrings mode nil))
+
+(defn ls-time
+ "Convert time stamp in milliseconds to LS time format."
+ [timeMS]
+ (let [file-date (js/Date. timeMS)]
+ (str (mon-by-index (.getMonth file-date)) " " (.getDate file-date)
+ ;; If the file was updated this year then set the last column to the
+ ;; hour and minute. Else, the last column should be the year.
+ (if (= (compare (.getFullYear file-date) (.getFullYear (js/Date.))) 0)
+ (str (.getHours file-date) ":" (.getMinutes file-date))
+ (str (.getFullYear file-date))))))
+
+(defn create-lstat
+ "Create an LSStat object for use in rendering."
+ [path]
+ (let [stats (.statSync fs path)
+ unixFilePerms (if stats(.toString (bit-and (.-mode stats) (js/parseInt "777")))
+ nil)]
+ (if stats
+ (js-obj
+ "perms" (str (if (.isDirectory stats) "d" "-")
+ (permissions-to-string (js/parseInt (first unixFilePerms)))
+ (permissions-to-string (js/parseInt (second unixFilePerms)))
+ (permissions-to-string (js/parseInt (nth unixFilePerms 2))))
+ "numLinks" (.-nlink stats)
+ "fileSize" (.-size stats)
+ "mtime" (ls-time (.-mtimeMs stats))
+ "basename" path))))
+
+(defn create-windows
+ "Create the window data for the site."
+ []
+ (set! index-windows []))
+
+(defn routes
+ "Set the server's routes."
+ [^js app]
+ (.get app "/" (fn [req res next] (.render (.status 200 res) "index",
+ (js-obj)))))
+(defn main!
+ "Main function"
+ []
+ (create-lstat "./"))
+
+(defn reload!
+ "Reload"
+ []
+ )