0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-03-13 08:11:30 -05:00
penpot/frontend/src/app/util/object.cljs

79 lines
1.7 KiB
Text
Raw Normal View History

2020-04-24 15:26:05 +02:00
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; This Source Code Form is "Incompatible With Secondary Licenses", as
;; defined by the Mozilla Public License, v. 2.0.
;;
;; Copyright (c) 2020 UXBOX Labs SL
(ns app.util.object
2020-04-24 15:26:05 +02:00
"A collection of helpers for work with javascript objects."
(:refer-clojure :exclude [set! get get-in merge clone])
(:require
[cuerdas.core :as str]
[goog.object :as gobj]
["lodash/omit" :as omit]))
2020-04-24 15:26:05 +02:00
2020-10-09 12:29:35 +02:00
(defn new [] #js {})
2020-04-24 15:26:05 +02:00
(defn get
([obj k]
2020-05-05 12:34:51 +02:00
(when-not (nil? obj)
2020-04-24 15:26:05 +02:00
(unchecked-get obj k)))
([obj k default]
(let [result (get obj k)]
(if (undefined? result) default result))))
2020-04-24 15:26:05 +02:00
(defn get-in
[obj keys]
(loop [key (first keys)
keys (rest keys)
res obj]
(if (nil? key)
res
(if (nil? res)
res
(recur (first keys)
(rest keys)
(unchecked-get res key))))))
(defn without
[obj keys]
(let [keys (cond
(vector? keys) (into-array keys)
(array? keys) keys
:else (throw (js/Error. "unexpected input")))]
(omit obj keys)))
(defn clone
[a]
(js/Object.assign #js {} a))
(defn merge!
2020-04-24 15:26:05 +02:00
([a b]
(js/Object.assign a b))
([a b & more]
(reduce merge! (merge! a b) more)))
2020-04-24 15:26:05 +02:00
(defn merge
([a b]
(js/Object.assign #js {} a b))
([a b & more]
(reduce merge! (merge a b) more)))
(defn set!
[obj key value]
(unchecked-set obj key value)
obj)
(defn- props-key-fn
[key]
(if (or (= key :class) (= key :class-name))
"className"
(str/camel (name key))))
(defn clj->props
[props]
(clj->js props :keyword-fn props-key-fn))