diff --git a/re-natal.coffee b/re-natal.coffee index c0e12b3..2ff9693 100644 --- a/re-natal.coffee +++ b/re-natal.coffee @@ -232,11 +232,14 @@ init = (projName) -> handlersPath = "src/#{projNameUs}/handlers.cljs" subsPath = "src/#{projNameUs}/subs.cljs" + dbPath = "src/#{projNameUs}/db.cljs" exec "cp #{resources}cljs/handlers.cljs #{handlersPath}" exec "cp #{resources}cljs/subs.cljs #{subsPath}" + exec "cp #{resources}cljs/db.cljs #{dbPath}" edit handlersPath, [[projNameHyphRx, projNameHyph], [projNameRx, projName]] edit subsPath, [[projNameHyphRx, projNameHyph], [projNameRx, projName]] + edit dbPath, [[projNameHyphRx, projNameHyph], [projNameRx, projName]] fs.mkdirSync 'src/cljsjs' exec "echo '(ns cljsjs.react)' > src/cljsjs/react.cljs" @@ -283,8 +286,7 @@ init = (projName) -> exec 'npm i' fs.unlinkSync '.gitignore' - exec " - node -e + exec "node -e \"require('react-native/local-cli/cli').init('.', '#{projName}')\" " diff --git a/resources/cljs/db.cljs b/resources/cljs/db.cljs new file mode 100644 index 0000000..4ca749b --- /dev/null +++ b/resources/cljs/db.cljs @@ -0,0 +1,8 @@ +(ns $PROJECT_NAME_HYPHENATED$.db + (:require [schema.core :as s :include-macros true])) + +;; schema of app-db +(def schema {:greeting s/Str}) + +;; initial state of app-db +(def app-db {:greeting "Hello Clojure in iOS and Android!"}) diff --git a/resources/cljs/handlers.cljs b/resources/cljs/handlers.cljs index 6573729..2653dc5 100644 --- a/resources/cljs/handlers.cljs +++ b/resources/cljs/handlers.cljs @@ -1,15 +1,32 @@ (ns $PROJECT_NAME_HYPHENATED$.handlers (:require - [re-frame.core :refer [register-handler path trim-v after dispatch]])) + [re-frame.core :refer [register-handler after]] + [schema.core :as s :include-macros true] + [$PROJECT_NAME_HYPHENATED$.db :refer [app-db schema]])) -(def app-db {:greeting "Hello Clojure in iOS and Android!"}) +;; -- Middleware ------------------------------------------------------------ +;; +;; See https://github.com/Day8/re-frame/wiki/Using-Handler-Middleware +;; +(defn check-and-throw + "throw an exception if db doesn't match the schema." + [a-schema db] + (if-let [problems (s/check a-schema db)] + (throw (js/Error. (str "schema check failed: " problems))))) + +(def validate-schema-mw + (after (partial check-and-throw schema))) + +;; -- Handlers -------------------------------------------------------------- (register-handler :initialize-db + validate-schema-mw (fn [_ _] app-db)) (register-handler :set-greeting + validate-schema-mw (fn [db [_ value]] (assoc db :greeting value))) \ No newline at end of file diff --git a/resources/project.clj b/resources/project.clj index 43aca56..a0e54a3 100644 --- a/resources/project.clj +++ b/resources/project.clj @@ -6,7 +6,8 @@ :dependencies [[org.clojure/clojure "1.7.0"] [org.clojure/clojurescript "1.7.170"] [reagent "0.5.1" :exclusions [cljsjs/react]] - [re-frame "0.5.0"]] + [re-frame "0.6.0"] + [prismatic/schema "1.0.4"]] :plugins [[lein-cljsbuild "1.1.1"] [lein-figwheel "0.5.0-2"]] :clean-targets ["target/" "index.ios.js" "index.android.js"]