js-on-sx: Object.assign ToObjects target, throws on null, walks string sources
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 41s

This commit is contained in:
2026-05-09 21:42:15 +00:00
parent 793eccfce2
commit 7d575cb1fe
2 changed files with 38 additions and 11 deletions

View File

@@ -4039,20 +4039,45 @@
(fn
(&rest args)
(cond
((= (len args) 0) (dict))
((= (len args) 0)
(raise (js-new-call TypeError (js-args "Object.assign called on null or undefined"))))
(else
(let
((target (nth args 0)))
(for-each
(fn
(src)
(when
(dict? src)
((raw-target (nth args 0)))
(cond
((or (= raw-target nil) (js-undefined? raw-target))
(raise (js-new-call TypeError (js-args "Object.assign called on null or undefined"))))
(else
(let
((target (js-coerce-this-arg raw-target)))
(for-each
(fn (k) (dict-set! target k (get src k)))
(keys src))))
(rest args))
target)))))
(fn
(src)
(cond
((or (= src nil) (js-undefined? src)) nil)
((dict? src)
(for-each
(fn
(k)
(if (js-key-internal? k) nil (dict-set! target k (get src k))))
(js-object-keys src)))
((= (type-of src) "string")
(let
((n (len src)))
(begin (js-object-assign-string-loop target src 0 n))))))
(rest args))
target))))))))
(define
js-object-assign-string-loop
(fn
(target s i n)
(cond
((>= i n) nil)
(else
(begin
(dict-set! target (js-to-string i) (char-at s i))
(js-object-assign-string-loop target s (+ i 1) n))))))
(define js-object-freeze (fn (o) o))