site

Website's source files.
Log | Files | Refs | Submodules | LICENSE

commit 35f826a362fff9ec2b70995b8919da6045c0c875
parent 6f5ceba8b103d9b7568940a989a29580ab6b24fc
Author: Ryan Jeffrey <ryan@ryanmj.xyz>
Date:   Thu, 27 Jan 2022 13:45:27 -0800

Begin transition to clojurescript

Diffstat:
Adeps.edn | 1+
Mpackage-lock.json | 35++++++++++++++++++++++++++++++++++-
Mpackage.json | 3++-
Ashadow-cljs.edn | 17+++++++++++++++++
Asrc/main/rmjxyz/app.cljs | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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" + [] + )