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

123 lines
2.3 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/.
;;
2022-09-20 23:23:22 +02:00
;; Copyright (c) KALEIDOS INC
2020-04-24 15:26:05 +02:00
(ns app.util.object
2020-04-24 15:26:05 +02:00
"A collection of helpers for work with javascript objects."
2023-09-12 14:00:18 +02:00
(:refer-clojure :exclude [set! new get get-in merge clone contains? array?])
(:require
[cuerdas.core :as str]))
2020-04-24 15:26:05 +02:00
2023-09-12 14:00:18 +02:00
(defn array?
[o]
(.isArray js/Array o))
(defn create [] #js {})
2020-10-09 12:29:35 +02:00
2020-04-24 15:26:05 +02:00
(defn get
([obj k]
(when (some? 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
2021-06-02 15:51:20 +02:00
(defn contains?
[obj k]
(when (some? obj)
(js/Object.hasOwn obj k)))
2021-06-02 15:51:20 +02:00
2021-04-21 17:20:38 +02:00
(defn get-keys
[obj]
(js/Object.keys ^js obj))
2020-04-24 15:26:05 +02:00
(defn get-in
2021-05-31 18:06:28 +02:00
([obj keys]
(get-in obj keys nil))
([obj keys default]
(loop [key (first keys)
keys (rest keys)
res obj]
(if (or (nil? key) (nil? res))
(or res default)
(recur (first keys)
(rest keys)
(unchecked-get res key))))))
2020-04-24 15:26:05 +02:00
(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 unset!
[obj key]
(js-delete obj key)
obj)
2021-05-31 18:06:28 +02:00
(defn update!
[obj key f & args]
(let [found (get obj key ::not-found)]
(if-not (identical? ::not-found found)
(do (unchecked-set obj key (apply f found args))
obj)
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))
2020-11-18 17:36:14 +01:00
(defn ^boolean in?
[obj prop]
(js* "~{} in ~{}" prop obj))
(defn map->obj
[x]
(cond
(nil? x)
nil
(keyword? x)
(name x)
(map? x)
(reduce-kv (fn [m k v]
(let [k (if (keyword? k) (name k) k)]
(unchecked-set m k (^function map->obj v))
m))
#js {}
x)
(coll? x)
(reduce (fn [arr v]
(.push arr v)
arr)
(array)
x)
:else x))