mirror of
https://github.com/metosin/reitit.git
synced 2026-02-16 16:05:15 +00:00
Publish intermediate paths by default #175
Change current default of Ring routers and frontend to publish both leaf paths and intermediate paths as endpoints. `:name` in route data is required for intermediate frontend routes, and `:handler` for Ring routes.
This commit is contained in:
parent
841f581a17
commit
c42f76af92
3 changed files with 69 additions and 3 deletions
|
|
@ -265,6 +265,61 @@
|
||||||
{:endpoint data
|
{:endpoint data
|
||||||
:inherit {}}))
|
:inherit {}}))
|
||||||
|
|
||||||
|
(defn dissoc-in
|
||||||
|
"Dissociates an entry from a nested associative structure returning a new
|
||||||
|
nested structure. `keys` is a sequence of keys. Any empty maps that result
|
||||||
|
will not be present in the new structure."
|
||||||
|
[m [k & ks]]
|
||||||
|
(if ks
|
||||||
|
(if-let [nextmap (get m k)]
|
||||||
|
(let [newmap (dissoc-in nextmap ks)]
|
||||||
|
(if (seq newmap)
|
||||||
|
(assoc m k newmap)
|
||||||
|
(dissoc m k)))
|
||||||
|
m)
|
||||||
|
(dissoc m k)))
|
||||||
|
|
||||||
|
(defn transform-inherited-data
|
||||||
|
[transform-configs data]
|
||||||
|
(let [short-hands {:consume #(dissoc-in %1 %2)
|
||||||
|
:inherit (fn [d _] d)}]
|
||||||
|
(reduce
|
||||||
|
(fn [acc {:keys [kss transform]}]
|
||||||
|
(let [transform (or (get short-hands transform)
|
||||||
|
transform)]
|
||||||
|
(reduce (fn [{:keys [inherit endpoint]} ks]
|
||||||
|
(if (get-in inherit ks)
|
||||||
|
{:inherit (transform inherit ks) :endpoint data}
|
||||||
|
{:inherit inherit :endpoint endpoint}))
|
||||||
|
acc
|
||||||
|
kss)))
|
||||||
|
{:endpoint nil :inherit data}
|
||||||
|
transform-configs)))
|
||||||
|
|
||||||
|
(defn mk-intermediate-endpoint-transform
|
||||||
|
"Make function that returns map for valid endpoints, which are either a leaf path in
|
||||||
|
the route tree, or have route data for one or more of nested key sequences.
|
||||||
|
The returned map will contain data for the current endpoint under `:endpoint` and data to be
|
||||||
|
inherited for children under `:inherit`.
|
||||||
|
|
||||||
|
Provided arg should be a vector of maps with :kss, a seq of seq of keys, and :transform. Expanded route data
|
||||||
|
will be queried with each of the key sequences. If data exists in the key sequence, the provided `:transform` function
|
||||||
|
is called with `(transform data ks)`, so that the result is to be passed to children.
|
||||||
|
Query is repeated for each seq of seq with the same transform, moving on to the next transform.
|
||||||
|
All transforms are performed before passing data to children.
|
||||||
|
|
||||||
|
If none of the key seqs match, then falsy is returned to indicate that the path should
|
||||||
|
not be used as an endpoint.
|
||||||
|
|
||||||
|
Optionally, `:transform` may be specified with keywords `:consume` as short-hand for removing the matching data,
|
||||||
|
or `:inherit` for passing the data as-is to children."
|
||||||
|
[transform-configs]
|
||||||
|
(fn [prev-path path meta data childs]
|
||||||
|
(or (leaf-endpoint prev-path path meta data childs)
|
||||||
|
(and (map? data)
|
||||||
|
(seq childs)
|
||||||
|
(transform-inherited-data transform-configs data)))))
|
||||||
|
|
||||||
(defmacro goog-extend [type base-type ctor & methods]
|
(defmacro goog-extend [type base-type ctor & methods]
|
||||||
`(do
|
`(do
|
||||||
(def ~type (fn ~@ctor))
|
(def ~type (fn ~@ctor))
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,8 @@
|
||||||
(:require [clojure.set :as set]
|
(:require [clojure.set :as set]
|
||||||
[reitit.coercion :as coercion]
|
[reitit.coercion :as coercion]
|
||||||
[reitit.coercion :as rc]
|
[reitit.coercion :as rc]
|
||||||
[reitit.core :as r])
|
[reitit.core :as r]
|
||||||
|
[reitit.impl :as impl])
|
||||||
(:import goog.Uri
|
(:import goog.Uri
|
||||||
goog.Uri.QueryData))
|
goog.Uri.QueryData))
|
||||||
|
|
||||||
|
|
@ -45,13 +46,17 @@
|
||||||
([router name path-params]
|
([router name path-params]
|
||||||
(r/match-by-name router name path-params)))
|
(r/match-by-name router name path-params)))
|
||||||
|
|
||||||
|
(def frontend-endpoint (impl/mk-intermediate-endpoint-transform [{:kss [[:name]]
|
||||||
|
:transform :consume}]))
|
||||||
|
|
||||||
(defn router
|
(defn router
|
||||||
"Create a `reitit.core.router` from raw route data and optionally an options map.
|
"Create a `reitit.core.router` from raw route data and optionally an options map.
|
||||||
Enables request coercion. See [[reitit.core/router]] for details on options."
|
Enables request coercion. See [[reitit.core/router]] for details on options."
|
||||||
([raw-routes]
|
([raw-routes]
|
||||||
(router raw-routes {}))
|
(router raw-routes {}))
|
||||||
([raw-routes opts]
|
([raw-routes opts]
|
||||||
(r/router raw-routes (merge {:compile rc/compile-request-coercers} opts))))
|
(r/router raw-routes (merge {:compile rc/compile-request-coercers
|
||||||
|
:endpoint frontend-endpoint} opts))))
|
||||||
|
|
||||||
(defn match-by-name!
|
(defn match-by-name!
|
||||||
"Logs problems using console.warn"
|
"Logs problems using console.warn"
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,11 @@
|
||||||
([request respond _]
|
([request respond _]
|
||||||
(respond (handle request))))))
|
(respond (handle request))))))
|
||||||
|
|
||||||
|
(def ring-endpoint (impl/mk-intermediate-endpoint-transform [{:kss (for [method http-methods] [method :handler])
|
||||||
|
:transform :inherit}
|
||||||
|
{:kss [[:name]]
|
||||||
|
:transform :consume}]))
|
||||||
|
|
||||||
;;
|
;;
|
||||||
;; public api
|
;; public api
|
||||||
;;
|
;;
|
||||||
|
|
@ -93,7 +98,8 @@
|
||||||
([data opts]
|
([data opts]
|
||||||
(let [opts (merge {:coerce coerce-handler
|
(let [opts (merge {:coerce coerce-handler
|
||||||
:compile compile-result
|
:compile compile-result
|
||||||
::default-options-handler default-options-handler} opts)]
|
::default-options-handler default-options-handler
|
||||||
|
:endpoint ring-endpoint} opts)]
|
||||||
(r/router data opts))))
|
(r/router data opts))))
|
||||||
|
|
||||||
(defn routes
|
(defn routes
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue