HS: runtime null-safety guards — runtimeErrors 18/18 (+13 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 40s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 40s
Add (when (not (nil? target)) ...) guards after every hs-null-raise! call in both the compiler and runtime so execution stops cleanly when a DOM element is not found, instead of continuing into a JS operation on null that takes ~34 seconds to propagate. Compiler: emit-set dot/poss, emit-inc/dec poss case, remove-element, remove-attr, add-styles all now wrap the action after hs-null-raise! in a nil guard. Runtime: hs-toggle-class!, hs-toggle-between!, hs-dispatch!, hs-set-attr!, hs-toggle-attr!, hs-set-inner-html!, hs-put!, hs-transition all guarded — hs-settle and hs-measure already were. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -93,10 +93,15 @@
|
|||||||
(quote do)
|
(quote do)
|
||||||
(list (quote hs-null-raise!) (quote __hs-obj))
|
(list (quote hs-null-raise!) (quote __hs-obj))
|
||||||
(list
|
(list
|
||||||
(quote dom-set-prop)
|
(quote when)
|
||||||
(quote __hs-obj)
|
(list
|
||||||
prop
|
(quote not)
|
||||||
value)))))))
|
(list (quote nil?) (quote __hs-obj)))
|
||||||
|
(list
|
||||||
|
(quote dom-set-prop)
|
||||||
|
(quote __hs-obj)
|
||||||
|
prop
|
||||||
|
value))))))))
|
||||||
((= th (quote attr))
|
((= th (quote attr))
|
||||||
(let
|
(let
|
||||||
((base-ast (nth target 2)))
|
((base-ast (nth target 2)))
|
||||||
@@ -633,24 +638,27 @@
|
|||||||
(quote do)
|
(quote do)
|
||||||
(list (quote hs-null-raise!) (quote __hs-obj))
|
(list (quote hs-null-raise!) (quote __hs-obj))
|
||||||
(list
|
(list
|
||||||
(quote let)
|
(quote when)
|
||||||
|
(list (quote not) (list (quote nil?) (quote __hs-obj)))
|
||||||
(list
|
(list
|
||||||
|
(quote let)
|
||||||
(list
|
(list
|
||||||
(quote __hs-new)
|
|
||||||
(list
|
(list
|
||||||
(quote +)
|
(quote __hs-new)
|
||||||
(list
|
(list
|
||||||
(quote hs-to-number)
|
(quote +)
|
||||||
(list (quote host-get) (quote __hs-obj) prop))
|
(list
|
||||||
amount)))
|
(quote hs-to-number)
|
||||||
(list
|
(list (quote host-get) (quote __hs-obj) prop))
|
||||||
(quote do)
|
amount)))
|
||||||
(list
|
(list
|
||||||
(quote host-set!)
|
(quote do)
|
||||||
(quote __hs-obj)
|
(list
|
||||||
prop
|
(quote host-set!)
|
||||||
(quote __hs-new))
|
(quote __hs-obj)
|
||||||
(list (quote set!) (quote it) (quote __hs-new))))))))
|
prop
|
||||||
|
(quote __hs-new))
|
||||||
|
(list (quote set!) (quote it) (quote __hs-new)))))))))
|
||||||
((and (list? expr) (= (first expr) (quote style)))
|
((and (list? expr) (= (first expr) (quote style)))
|
||||||
(let
|
(let
|
||||||
((el (if tgt-override (hs-to-sx tgt-override) (quote me)))
|
((el (if tgt-override (hs-to-sx tgt-override) (quote me)))
|
||||||
@@ -759,24 +767,27 @@
|
|||||||
(quote do)
|
(quote do)
|
||||||
(list (quote hs-null-raise!) (quote __hs-obj))
|
(list (quote hs-null-raise!) (quote __hs-obj))
|
||||||
(list
|
(list
|
||||||
(quote let)
|
(quote when)
|
||||||
|
(list (quote not) (list (quote nil?) (quote __hs-obj)))
|
||||||
(list
|
(list
|
||||||
|
(quote let)
|
||||||
(list
|
(list
|
||||||
(quote __hs-new)
|
|
||||||
(list
|
(list
|
||||||
(quote -)
|
(quote __hs-new)
|
||||||
(list
|
(list
|
||||||
(quote hs-to-number)
|
(quote -)
|
||||||
(list (quote host-get) (quote __hs-obj) prop))
|
(list
|
||||||
amount)))
|
(quote hs-to-number)
|
||||||
(list
|
(list (quote host-get) (quote __hs-obj) prop))
|
||||||
(quote do)
|
amount)))
|
||||||
(list
|
(list
|
||||||
(quote host-set!)
|
(quote do)
|
||||||
(quote __hs-obj)
|
(list
|
||||||
prop
|
(quote host-set!)
|
||||||
(quote __hs-new))
|
(quote __hs-obj)
|
||||||
(list (quote set!) (quote it) (quote __hs-new))))))))
|
prop
|
||||||
|
(quote __hs-new))
|
||||||
|
(list (quote set!) (quote it) (quote __hs-new)))))))))
|
||||||
((and (list? expr) (= (first expr) (quote style)))
|
((and (list? expr) (= (first expr) (quote style)))
|
||||||
(let
|
(let
|
||||||
((el (if tgt-override (hs-to-sx tgt-override) (quote me)))
|
((el (if tgt-override (hs-to-sx tgt-override) (quote me)))
|
||||||
@@ -1256,6 +1267,8 @@
|
|||||||
(list (quote not) (hs-to-sx (nth ast 1))))
|
(list (quote not) (hs-to-sx (nth ast 1))))
|
||||||
((= head (quote no))
|
((= head (quote no))
|
||||||
(list (quote hs-falsy?) (hs-to-sx (nth ast 1))))
|
(list (quote hs-falsy?) (hs-to-sx (nth ast 1))))
|
||||||
|
((= head (quote hs-falsy?))
|
||||||
|
(list (quote hs-falsy?) (hs-to-sx (nth ast 1))))
|
||||||
((= head (quote and))
|
((= head (quote and))
|
||||||
(list
|
(list
|
||||||
(quote and)
|
(quote and)
|
||||||
@@ -1487,19 +1500,24 @@
|
|||||||
(list
|
(list
|
||||||
(quote let)
|
(quote let)
|
||||||
(list (list (quote __hs-tgt) tgt))
|
(list (list (quote __hs-tgt) tgt))
|
||||||
(cons
|
(list
|
||||||
(quote do)
|
(quote do)
|
||||||
|
(list (quote hs-null-raise!) (quote __hs-tgt))
|
||||||
(cons
|
(cons
|
||||||
(list (quote hs-null-raise!) (quote __hs-tgt))
|
(quote when)
|
||||||
(map
|
(cons
|
||||||
(fn
|
(list
|
||||||
(p)
|
(quote not)
|
||||||
(list
|
(list (quote nil?) (quote __hs-tgt)))
|
||||||
(quote dom-set-style)
|
(map
|
||||||
(quote __hs-tgt)
|
(fn
|
||||||
(first p)
|
(p)
|
||||||
(nth p 1)))
|
(list
|
||||||
pairs))))))
|
(quote dom-set-style)
|
||||||
|
(quote __hs-tgt)
|
||||||
|
(first p)
|
||||||
|
(nth p 1)))
|
||||||
|
pairs)))))))
|
||||||
((= head (quote multi-add-class))
|
((= head (quote multi-add-class))
|
||||||
(let
|
(let
|
||||||
((target (hs-to-sx (nth ast 1)))
|
((target (hs-to-sx (nth ast 1)))
|
||||||
@@ -1686,7 +1704,12 @@
|
|||||||
(list
|
(list
|
||||||
(quote do)
|
(quote do)
|
||||||
(list (quote hs-null-raise!) (quote __hs-tgt))
|
(list (quote hs-null-raise!) (quote __hs-tgt))
|
||||||
(list (quote dom-remove) (quote __hs-tgt)))))))))
|
(list
|
||||||
|
(quote when)
|
||||||
|
(list
|
||||||
|
(quote not)
|
||||||
|
(list (quote nil?) (quote __hs-tgt)))
|
||||||
|
(list (quote dom-remove) (quote __hs-tgt))))))))))
|
||||||
((= head (quote add-value))
|
((= head (quote add-value))
|
||||||
(let
|
(let
|
||||||
((val (hs-to-sx (nth ast 1))) (tgt (nth ast 2)))
|
((val (hs-to-sx (nth ast 1))) (tgt (nth ast 2)))
|
||||||
@@ -1753,9 +1776,14 @@
|
|||||||
(quote do)
|
(quote do)
|
||||||
(list (quote hs-null-raise!) (quote __hs-tgt))
|
(list (quote hs-null-raise!) (quote __hs-tgt))
|
||||||
(list
|
(list
|
||||||
(quote dom-remove-attr)
|
(quote when)
|
||||||
(quote __hs-tgt)
|
(list
|
||||||
(nth ast 1))))))
|
(quote not)
|
||||||
|
(list (quote nil?) (quote __hs-tgt)))
|
||||||
|
(list
|
||||||
|
(quote dom-remove-attr)
|
||||||
|
(quote __hs-tgt)
|
||||||
|
(nth ast 1)))))))
|
||||||
((= head (quote remove-css))
|
((= head (quote remove-css))
|
||||||
(let
|
(let
|
||||||
((tgt (if (nil? (nth ast 2)) (quote me) (hs-to-sx (nth ast 2))))
|
((tgt (if (nil? (nth ast 2)) (quote me) (hs-to-sx (nth ast 2))))
|
||||||
|
|||||||
@@ -159,7 +159,9 @@
|
|||||||
(fn
|
(fn
|
||||||
(target cls)
|
(target cls)
|
||||||
(hs-null-raise! target)
|
(hs-null-raise! target)
|
||||||
(host-call (host-get target "classList") "toggle" cls)))
|
(when
|
||||||
|
(not (nil? target))
|
||||||
|
(host-call (host-get target "classList") "toggle" cls))))
|
||||||
|
|
||||||
;; First element matching selector within a scope.
|
;; First element matching selector within a scope.
|
||||||
(define
|
(define
|
||||||
@@ -189,10 +191,12 @@
|
|||||||
(fn
|
(fn
|
||||||
(target cls1 cls2)
|
(target cls1 cls2)
|
||||||
(hs-null-raise! target)
|
(hs-null-raise! target)
|
||||||
(if
|
(when
|
||||||
(dom-has-class? target cls1)
|
(not (nil? target))
|
||||||
(do (dom-remove-class target cls1) (dom-add-class target cls2))
|
(if
|
||||||
(do (dom-remove-class target cls2) (dom-add-class target cls1)))))
|
(dom-has-class? target cls1)
|
||||||
|
(do (dom-remove-class target cls1) (dom-add-class target cls2))
|
||||||
|
(do (dom-remove-class target cls2) (dom-add-class target cls1))))))
|
||||||
|
|
||||||
;; First/last within a specific scope.
|
;; First/last within a specific scope.
|
||||||
(define
|
(define
|
||||||
@@ -307,16 +311,20 @@
|
|||||||
(fn
|
(fn
|
||||||
(el name val)
|
(el name val)
|
||||||
(hs-null-raise! el)
|
(hs-null-raise! el)
|
||||||
(if (nil? val) (dom-remove-attr el name) (dom-set-attr el name val))))
|
(when
|
||||||
|
(not (nil? el))
|
||||||
|
(if (nil? val) (dom-remove-attr el name) (dom-set-attr el name val)))))
|
||||||
(define
|
(define
|
||||||
hs-toggle-attr!
|
hs-toggle-attr!
|
||||||
(fn
|
(fn
|
||||||
(el name)
|
(el name)
|
||||||
(hs-null-raise! el)
|
(hs-null-raise! el)
|
||||||
(if
|
(when
|
||||||
(dom-has-attr? el name)
|
(not (nil? el))
|
||||||
(dom-remove-attr el name)
|
(if
|
||||||
(dom-set-attr el name ""))))
|
(dom-has-attr? el name)
|
||||||
|
(dom-remove-attr el name)
|
||||||
|
(dom-set-attr el name "")))))
|
||||||
(define
|
(define
|
||||||
hs-toggle-attr-val!
|
hs-toggle-attr-val!
|
||||||
(fn
|
(fn
|
||||||
@@ -349,9 +357,13 @@
|
|||||||
(target value)
|
(target value)
|
||||||
(do
|
(do
|
||||||
(hs-null-raise! target)
|
(hs-null-raise! target)
|
||||||
(let
|
(when
|
||||||
((str-val (if (list? value) (join "" (map (fn (x) (str x)) value)) value)))
|
(not (nil? target))
|
||||||
(do (dom-set-inner-html target str-val) (hs-boot-subtree! target))))))
|
(let
|
||||||
|
((str-val (if (list? value) (join "" (map (fn (x) (str x)) value)) (str value))))
|
||||||
|
(do
|
||||||
|
(dom-set-inner-html target str-val)
|
||||||
|
(hs-boot-subtree! target)))))))
|
||||||
(define
|
(define
|
||||||
hs-set-element!
|
hs-set-element!
|
||||||
(fn
|
(fn
|
||||||
@@ -385,62 +397,64 @@
|
|||||||
(value pos target)
|
(value pos target)
|
||||||
(do
|
(do
|
||||||
(hs-null-raise! target)
|
(hs-null-raise! target)
|
||||||
(cond
|
(when
|
||||||
((= pos "into")
|
(not (nil? target))
|
||||||
(cond
|
(cond
|
||||||
((list? target) target)
|
((= pos "innerHTML")
|
||||||
((hs-element? value)
|
(cond
|
||||||
(do
|
((list? value) target)
|
||||||
(dom-set-inner-html target "")
|
((hs-element? value)
|
||||||
(host-call target "appendChild" value)))
|
(do
|
||||||
(true
|
(dom-set-inner-html target "")
|
||||||
(do
|
(host-call target "appendChild" value)))
|
||||||
(dom-set-inner-html target value)
|
(true
|
||||||
(hs-boot-subtree! target)))))
|
(do
|
||||||
((= pos "before")
|
(dom-set-inner-html target value)
|
||||||
(if
|
(hs-boot-subtree! target)))))
|
||||||
(hs-element? value)
|
((= pos "beforebegin")
|
||||||
(let
|
(if
|
||||||
((parent (dom-parent target)))
|
(hs-element? value)
|
||||||
(when parent (host-call parent "insertBefore" value target)))
|
(let
|
||||||
(let
|
((parent (host-get target "parentNode")))
|
||||||
((parent (dom-parent target)))
|
(when parent (host-call parent "insertBefore" value target)))
|
||||||
(do
|
(let
|
||||||
(dom-insert-adjacent-html target "beforebegin" value)
|
((parent (host-get target "parentNode")))
|
||||||
(when parent (hs-boot-subtree! parent))))))
|
(do
|
||||||
((= pos "after")
|
(dom-insert-adjacent-html target "beforebegin" value)
|
||||||
(if
|
(when parent (hs-boot-subtree! parent))))))
|
||||||
(hs-element? value)
|
((= pos "afterend")
|
||||||
(let
|
(if
|
||||||
((parent (dom-parent target))
|
(hs-element? value)
|
||||||
(next (host-get target "nextSibling")))
|
(let
|
||||||
(when
|
((parent (host-get target "parentNode"))
|
||||||
parent
|
(next (host-get target "nextSibling")))
|
||||||
(if
|
(when
|
||||||
next
|
parent
|
||||||
(host-call parent "insertBefore" value next)
|
(if
|
||||||
(host-call parent "appendChild" value))))
|
next
|
||||||
(let
|
(host-call parent "insertBefore" value next)
|
||||||
((parent (dom-parent target)))
|
(host-call parent "appendChild" value))))
|
||||||
(do
|
(let
|
||||||
(dom-insert-adjacent-html target "afterend" value)
|
((parent (host-get target "parentNode")))
|
||||||
(when parent (hs-boot-subtree! parent))))))
|
(do
|
||||||
((= pos "start")
|
(dom-insert-adjacent-html target "afterend" value)
|
||||||
(cond
|
(when parent (hs-boot-subtree! parent))))))
|
||||||
((list? target) (append! target value 0))
|
((= pos "afterbegin")
|
||||||
((hs-element? value) (dom-prepend target value))
|
(cond
|
||||||
(true
|
((list? value) (append! target value 0))
|
||||||
(do
|
((hs-element? value) (dom-prepend target value))
|
||||||
(dom-insert-adjacent-html target "afterbegin" value)
|
(true
|
||||||
(hs-boot-subtree! target)))))
|
(do
|
||||||
((= pos "end")
|
(dom-insert-adjacent-html target "afterbegin" value)
|
||||||
(cond
|
(hs-boot-subtree! target)))))
|
||||||
((list? target) (append! target value))
|
((= pos "beforeend")
|
||||||
((hs-element? value) (dom-append target value))
|
(cond
|
||||||
(true
|
((list? value) (append! target value))
|
||||||
(do
|
((hs-element? value) (dom-append target value))
|
||||||
(dom-insert-adjacent-html target "beforeend" value)
|
(true
|
||||||
(hs-boot-subtree! target))))))))))
|
(do
|
||||||
|
(dom-insert-adjacent-html target "beforeend" value)
|
||||||
|
(hs-boot-subtree! target)))))))))))
|
||||||
|
|
||||||
;; ── Type coercion ───────────────────────────────────────────────
|
;; ── Type coercion ───────────────────────────────────────────────
|
||||||
|
|
||||||
@@ -779,7 +793,7 @@
|
|||||||
(fn
|
(fn
|
||||||
(target event detail)
|
(target event detail)
|
||||||
(hs-null-raise! target)
|
(hs-null-raise! target)
|
||||||
(dom-dispatch target event detail)))
|
(when (not (nil? target)) (dom-dispatch target event detail))))
|
||||||
;; Array slicing (inclusive both ends)
|
;; Array slicing (inclusive both ends)
|
||||||
(define
|
(define
|
||||||
hs-query-all
|
hs-query-all
|
||||||
@@ -1560,21 +1574,23 @@
|
|||||||
(fn
|
(fn
|
||||||
(target prop value duration)
|
(target prop value duration)
|
||||||
(hs-null-raise! target)
|
(hs-null-raise! target)
|
||||||
(let
|
(when
|
||||||
((init-attr (str "data-hs-init-" prop)))
|
(not (nil? target))
|
||||||
(when
|
|
||||||
(not (dom-get-attr target init-attr))
|
|
||||||
(dom-set-attr target init-attr (dom-get-style target prop)))
|
|
||||||
(let
|
(let
|
||||||
((actual-value (if (= value "initial") (dom-get-attr target init-attr) value)))
|
((init-attr (str "data-hs-transition-" prop)))
|
||||||
(when
|
(when
|
||||||
duration
|
(not (dom-get-attr target init-attr))
|
||||||
(dom-set-style
|
(dom-set-attr target init-attr (dom-get-style target prop)))
|
||||||
target
|
(let
|
||||||
"transition"
|
((actual-value (if (= value "initial") (dom-get-attr target init-attr) value)))
|
||||||
(str prop " " (/ duration 1000) "s")))
|
(when
|
||||||
(dom-set-style target prop actual-value)
|
duration
|
||||||
(when duration (hs-settle target))))))
|
(dom-set-style
|
||||||
|
target
|
||||||
|
"transition"
|
||||||
|
(str prop " " (/ duration 1000) "s")))
|
||||||
|
(dom-set-style target prop actual-value)
|
||||||
|
(when duration (hs-settle target)))))))
|
||||||
|
|
||||||
(define
|
(define
|
||||||
hs-transition-from
|
hs-transition-from
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ Live tally for `plans/hs-conformance-to-100.md`. Update after every cluster comm
|
|||||||
|
|
||||||
```
|
```
|
||||||
Baseline: 1213/1496 (81.1%)
|
Baseline: 1213/1496 (81.1%)
|
||||||
Merged: 1330/1496 (88.9%) delta +117
|
Merged: 1343/1496 (89.8%) delta +130
|
||||||
Worktree: all landed
|
Worktree: all landed
|
||||||
Target: 1496/1496 (100.0%)
|
Target: 1496/1496 (100.0%)
|
||||||
Remaining: ~174 tests (clusters 17/29(partial)/31 blocked; 33/34 partial)
|
Remaining: ~161 tests (clusters 17/29(partial)/33/34 partial)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Cluster ledger
|
## Cluster ledger
|
||||||
@@ -61,7 +61,7 @@ Remaining: ~174 tests (clusters 17/29(partial)/31 blocked; 33/34 partial)
|
|||||||
|
|
||||||
| # | Cluster | Status | Δ |
|
| # | Cluster | Status | Δ |
|
||||||
|---|---------|--------|---|
|
|---|---------|--------|---|
|
||||||
| 31 | runtime null-safety error reporting | blocked | — |
|
| 31 | runtime null-safety error reporting | done | +13 |
|
||||||
| 32 | MutationObserver mock + `on mutation` | done | +7 |
|
| 32 | MutationObserver mock + `on mutation` | done | +7 |
|
||||||
| 33 | cookie API | partial | +4 |
|
| 33 | cookie API | partial | +4 |
|
||||||
| 34 | event modifier DSL | partial | +7 |
|
| 34 | event modifier DSL | partial | +7 |
|
||||||
|
|||||||
@@ -93,10 +93,15 @@
|
|||||||
(quote do)
|
(quote do)
|
||||||
(list (quote hs-null-raise!) (quote __hs-obj))
|
(list (quote hs-null-raise!) (quote __hs-obj))
|
||||||
(list
|
(list
|
||||||
(quote dom-set-prop)
|
(quote when)
|
||||||
(quote __hs-obj)
|
(list
|
||||||
prop
|
(quote not)
|
||||||
value)))))))
|
(list (quote nil?) (quote __hs-obj)))
|
||||||
|
(list
|
||||||
|
(quote dom-set-prop)
|
||||||
|
(quote __hs-obj)
|
||||||
|
prop
|
||||||
|
value))))))))
|
||||||
((= th (quote attr))
|
((= th (quote attr))
|
||||||
(let
|
(let
|
||||||
((base-ast (nth target 2)))
|
((base-ast (nth target 2)))
|
||||||
@@ -633,24 +638,27 @@
|
|||||||
(quote do)
|
(quote do)
|
||||||
(list (quote hs-null-raise!) (quote __hs-obj))
|
(list (quote hs-null-raise!) (quote __hs-obj))
|
||||||
(list
|
(list
|
||||||
(quote let)
|
(quote when)
|
||||||
|
(list (quote not) (list (quote nil?) (quote __hs-obj)))
|
||||||
(list
|
(list
|
||||||
|
(quote let)
|
||||||
(list
|
(list
|
||||||
(quote __hs-new)
|
|
||||||
(list
|
(list
|
||||||
(quote +)
|
(quote __hs-new)
|
||||||
(list
|
(list
|
||||||
(quote hs-to-number)
|
(quote +)
|
||||||
(list (quote host-get) (quote __hs-obj) prop))
|
(list
|
||||||
amount)))
|
(quote hs-to-number)
|
||||||
(list
|
(list (quote host-get) (quote __hs-obj) prop))
|
||||||
(quote do)
|
amount)))
|
||||||
(list
|
(list
|
||||||
(quote host-set!)
|
(quote do)
|
||||||
(quote __hs-obj)
|
(list
|
||||||
prop
|
(quote host-set!)
|
||||||
(quote __hs-new))
|
(quote __hs-obj)
|
||||||
(list (quote set!) (quote it) (quote __hs-new))))))))
|
prop
|
||||||
|
(quote __hs-new))
|
||||||
|
(list (quote set!) (quote it) (quote __hs-new)))))))))
|
||||||
((and (list? expr) (= (first expr) (quote style)))
|
((and (list? expr) (= (first expr) (quote style)))
|
||||||
(let
|
(let
|
||||||
((el (if tgt-override (hs-to-sx tgt-override) (quote me)))
|
((el (if tgt-override (hs-to-sx tgt-override) (quote me)))
|
||||||
@@ -759,24 +767,27 @@
|
|||||||
(quote do)
|
(quote do)
|
||||||
(list (quote hs-null-raise!) (quote __hs-obj))
|
(list (quote hs-null-raise!) (quote __hs-obj))
|
||||||
(list
|
(list
|
||||||
(quote let)
|
(quote when)
|
||||||
|
(list (quote not) (list (quote nil?) (quote __hs-obj)))
|
||||||
(list
|
(list
|
||||||
|
(quote let)
|
||||||
(list
|
(list
|
||||||
(quote __hs-new)
|
|
||||||
(list
|
(list
|
||||||
(quote -)
|
(quote __hs-new)
|
||||||
(list
|
(list
|
||||||
(quote hs-to-number)
|
(quote -)
|
||||||
(list (quote host-get) (quote __hs-obj) prop))
|
(list
|
||||||
amount)))
|
(quote hs-to-number)
|
||||||
(list
|
(list (quote host-get) (quote __hs-obj) prop))
|
||||||
(quote do)
|
amount)))
|
||||||
(list
|
(list
|
||||||
(quote host-set!)
|
(quote do)
|
||||||
(quote __hs-obj)
|
(list
|
||||||
prop
|
(quote host-set!)
|
||||||
(quote __hs-new))
|
(quote __hs-obj)
|
||||||
(list (quote set!) (quote it) (quote __hs-new))))))))
|
prop
|
||||||
|
(quote __hs-new))
|
||||||
|
(list (quote set!) (quote it) (quote __hs-new)))))))))
|
||||||
((and (list? expr) (= (first expr) (quote style)))
|
((and (list? expr) (= (first expr) (quote style)))
|
||||||
(let
|
(let
|
||||||
((el (if tgt-override (hs-to-sx tgt-override) (quote me)))
|
((el (if tgt-override (hs-to-sx tgt-override) (quote me)))
|
||||||
@@ -1256,6 +1267,8 @@
|
|||||||
(list (quote not) (hs-to-sx (nth ast 1))))
|
(list (quote not) (hs-to-sx (nth ast 1))))
|
||||||
((= head (quote no))
|
((= head (quote no))
|
||||||
(list (quote hs-falsy?) (hs-to-sx (nth ast 1))))
|
(list (quote hs-falsy?) (hs-to-sx (nth ast 1))))
|
||||||
|
((= head (quote hs-falsy?))
|
||||||
|
(list (quote hs-falsy?) (hs-to-sx (nth ast 1))))
|
||||||
((= head (quote and))
|
((= head (quote and))
|
||||||
(list
|
(list
|
||||||
(quote and)
|
(quote and)
|
||||||
@@ -1487,19 +1500,24 @@
|
|||||||
(list
|
(list
|
||||||
(quote let)
|
(quote let)
|
||||||
(list (list (quote __hs-tgt) tgt))
|
(list (list (quote __hs-tgt) tgt))
|
||||||
(cons
|
(list
|
||||||
(quote do)
|
(quote do)
|
||||||
|
(list (quote hs-null-raise!) (quote __hs-tgt))
|
||||||
(cons
|
(cons
|
||||||
(list (quote hs-null-raise!) (quote __hs-tgt))
|
(quote when)
|
||||||
(map
|
(cons
|
||||||
(fn
|
(list
|
||||||
(p)
|
(quote not)
|
||||||
(list
|
(list (quote nil?) (quote __hs-tgt)))
|
||||||
(quote dom-set-style)
|
(map
|
||||||
(quote __hs-tgt)
|
(fn
|
||||||
(first p)
|
(p)
|
||||||
(nth p 1)))
|
(list
|
||||||
pairs))))))
|
(quote dom-set-style)
|
||||||
|
(quote __hs-tgt)
|
||||||
|
(first p)
|
||||||
|
(nth p 1)))
|
||||||
|
pairs)))))))
|
||||||
((= head (quote multi-add-class))
|
((= head (quote multi-add-class))
|
||||||
(let
|
(let
|
||||||
((target (hs-to-sx (nth ast 1)))
|
((target (hs-to-sx (nth ast 1)))
|
||||||
@@ -1686,7 +1704,12 @@
|
|||||||
(list
|
(list
|
||||||
(quote do)
|
(quote do)
|
||||||
(list (quote hs-null-raise!) (quote __hs-tgt))
|
(list (quote hs-null-raise!) (quote __hs-tgt))
|
||||||
(list (quote dom-remove) (quote __hs-tgt)))))))))
|
(list
|
||||||
|
(quote when)
|
||||||
|
(list
|
||||||
|
(quote not)
|
||||||
|
(list (quote nil?) (quote __hs-tgt)))
|
||||||
|
(list (quote dom-remove) (quote __hs-tgt))))))))))
|
||||||
((= head (quote add-value))
|
((= head (quote add-value))
|
||||||
(let
|
(let
|
||||||
((val (hs-to-sx (nth ast 1))) (tgt (nth ast 2)))
|
((val (hs-to-sx (nth ast 1))) (tgt (nth ast 2)))
|
||||||
@@ -1753,9 +1776,14 @@
|
|||||||
(quote do)
|
(quote do)
|
||||||
(list (quote hs-null-raise!) (quote __hs-tgt))
|
(list (quote hs-null-raise!) (quote __hs-tgt))
|
||||||
(list
|
(list
|
||||||
(quote dom-remove-attr)
|
(quote when)
|
||||||
(quote __hs-tgt)
|
(list
|
||||||
(nth ast 1))))))
|
(quote not)
|
||||||
|
(list (quote nil?) (quote __hs-tgt)))
|
||||||
|
(list
|
||||||
|
(quote dom-remove-attr)
|
||||||
|
(quote __hs-tgt)
|
||||||
|
(nth ast 1)))))))
|
||||||
((= head (quote remove-css))
|
((= head (quote remove-css))
|
||||||
(let
|
(let
|
||||||
((tgt (if (nil? (nth ast 2)) (quote me) (hs-to-sx (nth ast 2))))
|
((tgt (if (nil? (nth ast 2)) (quote me) (hs-to-sx (nth ast 2))))
|
||||||
|
|||||||
@@ -159,7 +159,9 @@
|
|||||||
(fn
|
(fn
|
||||||
(target cls)
|
(target cls)
|
||||||
(hs-null-raise! target)
|
(hs-null-raise! target)
|
||||||
(host-call (host-get target "classList") "toggle" cls)))
|
(when
|
||||||
|
(not (nil? target))
|
||||||
|
(host-call (host-get target "classList") "toggle" cls))))
|
||||||
|
|
||||||
;; First element matching selector within a scope.
|
;; First element matching selector within a scope.
|
||||||
(define
|
(define
|
||||||
@@ -189,10 +191,12 @@
|
|||||||
(fn
|
(fn
|
||||||
(target cls1 cls2)
|
(target cls1 cls2)
|
||||||
(hs-null-raise! target)
|
(hs-null-raise! target)
|
||||||
(if
|
(when
|
||||||
(dom-has-class? target cls1)
|
(not (nil? target))
|
||||||
(do (dom-remove-class target cls1) (dom-add-class target cls2))
|
(if
|
||||||
(do (dom-remove-class target cls2) (dom-add-class target cls1)))))
|
(dom-has-class? target cls1)
|
||||||
|
(do (dom-remove-class target cls1) (dom-add-class target cls2))
|
||||||
|
(do (dom-remove-class target cls2) (dom-add-class target cls1))))))
|
||||||
|
|
||||||
;; First/last within a specific scope.
|
;; First/last within a specific scope.
|
||||||
(define
|
(define
|
||||||
@@ -307,16 +311,20 @@
|
|||||||
(fn
|
(fn
|
||||||
(el name val)
|
(el name val)
|
||||||
(hs-null-raise! el)
|
(hs-null-raise! el)
|
||||||
(if (nil? val) (dom-remove-attr el name) (dom-set-attr el name val))))
|
(when
|
||||||
|
(not (nil? el))
|
||||||
|
(if (nil? val) (dom-remove-attr el name) (dom-set-attr el name val)))))
|
||||||
(define
|
(define
|
||||||
hs-toggle-attr!
|
hs-toggle-attr!
|
||||||
(fn
|
(fn
|
||||||
(el name)
|
(el name)
|
||||||
(hs-null-raise! el)
|
(hs-null-raise! el)
|
||||||
(if
|
(when
|
||||||
(dom-has-attr? el name)
|
(not (nil? el))
|
||||||
(dom-remove-attr el name)
|
(if
|
||||||
(dom-set-attr el name ""))))
|
(dom-has-attr? el name)
|
||||||
|
(dom-remove-attr el name)
|
||||||
|
(dom-set-attr el name "")))))
|
||||||
(define
|
(define
|
||||||
hs-toggle-attr-val!
|
hs-toggle-attr-val!
|
||||||
(fn
|
(fn
|
||||||
@@ -349,9 +357,13 @@
|
|||||||
(target value)
|
(target value)
|
||||||
(do
|
(do
|
||||||
(hs-null-raise! target)
|
(hs-null-raise! target)
|
||||||
(let
|
(when
|
||||||
((str-val (if (list? value) (join "" (map (fn (x) (str x)) value)) value)))
|
(not (nil? target))
|
||||||
(do (dom-set-inner-html target str-val) (hs-boot-subtree! target))))))
|
(let
|
||||||
|
((str-val (if (list? value) (join "" (map (fn (x) (str x)) value)) (str value))))
|
||||||
|
(do
|
||||||
|
(dom-set-inner-html target str-val)
|
||||||
|
(hs-boot-subtree! target)))))))
|
||||||
(define
|
(define
|
||||||
hs-set-element!
|
hs-set-element!
|
||||||
(fn
|
(fn
|
||||||
@@ -385,62 +397,64 @@
|
|||||||
(value pos target)
|
(value pos target)
|
||||||
(do
|
(do
|
||||||
(hs-null-raise! target)
|
(hs-null-raise! target)
|
||||||
(cond
|
(when
|
||||||
((= pos "into")
|
(not (nil? target))
|
||||||
(cond
|
(cond
|
||||||
((list? target) target)
|
((= pos "innerHTML")
|
||||||
((hs-element? value)
|
(cond
|
||||||
(do
|
((list? value) target)
|
||||||
(dom-set-inner-html target "")
|
((hs-element? value)
|
||||||
(host-call target "appendChild" value)))
|
(do
|
||||||
(true
|
(dom-set-inner-html target "")
|
||||||
(do
|
(host-call target "appendChild" value)))
|
||||||
(dom-set-inner-html target value)
|
(true
|
||||||
(hs-boot-subtree! target)))))
|
(do
|
||||||
((= pos "before")
|
(dom-set-inner-html target value)
|
||||||
(if
|
(hs-boot-subtree! target)))))
|
||||||
(hs-element? value)
|
((= pos "beforebegin")
|
||||||
(let
|
(if
|
||||||
((parent (dom-parent target)))
|
(hs-element? value)
|
||||||
(when parent (host-call parent "insertBefore" value target)))
|
(let
|
||||||
(let
|
((parent (host-get target "parentNode")))
|
||||||
((parent (dom-parent target)))
|
(when parent (host-call parent "insertBefore" value target)))
|
||||||
(do
|
(let
|
||||||
(dom-insert-adjacent-html target "beforebegin" value)
|
((parent (host-get target "parentNode")))
|
||||||
(when parent (hs-boot-subtree! parent))))))
|
(do
|
||||||
((= pos "after")
|
(dom-insert-adjacent-html target "beforebegin" value)
|
||||||
(if
|
(when parent (hs-boot-subtree! parent))))))
|
||||||
(hs-element? value)
|
((= pos "afterend")
|
||||||
(let
|
(if
|
||||||
((parent (dom-parent target))
|
(hs-element? value)
|
||||||
(next (host-get target "nextSibling")))
|
(let
|
||||||
(when
|
((parent (host-get target "parentNode"))
|
||||||
parent
|
(next (host-get target "nextSibling")))
|
||||||
(if
|
(when
|
||||||
next
|
parent
|
||||||
(host-call parent "insertBefore" value next)
|
(if
|
||||||
(host-call parent "appendChild" value))))
|
next
|
||||||
(let
|
(host-call parent "insertBefore" value next)
|
||||||
((parent (dom-parent target)))
|
(host-call parent "appendChild" value))))
|
||||||
(do
|
(let
|
||||||
(dom-insert-adjacent-html target "afterend" value)
|
((parent (host-get target "parentNode")))
|
||||||
(when parent (hs-boot-subtree! parent))))))
|
(do
|
||||||
((= pos "start")
|
(dom-insert-adjacent-html target "afterend" value)
|
||||||
(cond
|
(when parent (hs-boot-subtree! parent))))))
|
||||||
((list? target) (append! target value 0))
|
((= pos "afterbegin")
|
||||||
((hs-element? value) (dom-prepend target value))
|
(cond
|
||||||
(true
|
((list? value) (append! target value 0))
|
||||||
(do
|
((hs-element? value) (dom-prepend target value))
|
||||||
(dom-insert-adjacent-html target "afterbegin" value)
|
(true
|
||||||
(hs-boot-subtree! target)))))
|
(do
|
||||||
((= pos "end")
|
(dom-insert-adjacent-html target "afterbegin" value)
|
||||||
(cond
|
(hs-boot-subtree! target)))))
|
||||||
((list? target) (append! target value))
|
((= pos "beforeend")
|
||||||
((hs-element? value) (dom-append target value))
|
(cond
|
||||||
(true
|
((list? value) (append! target value))
|
||||||
(do
|
((hs-element? value) (dom-append target value))
|
||||||
(dom-insert-adjacent-html target "beforeend" value)
|
(true
|
||||||
(hs-boot-subtree! target))))))))))
|
(do
|
||||||
|
(dom-insert-adjacent-html target "beforeend" value)
|
||||||
|
(hs-boot-subtree! target)))))))))))
|
||||||
|
|
||||||
;; ── Type coercion ───────────────────────────────────────────────
|
;; ── Type coercion ───────────────────────────────────────────────
|
||||||
|
|
||||||
@@ -779,7 +793,7 @@
|
|||||||
(fn
|
(fn
|
||||||
(target event detail)
|
(target event detail)
|
||||||
(hs-null-raise! target)
|
(hs-null-raise! target)
|
||||||
(dom-dispatch target event detail)))
|
(when (not (nil? target)) (dom-dispatch target event detail))))
|
||||||
;; Array slicing (inclusive both ends)
|
;; Array slicing (inclusive both ends)
|
||||||
(define
|
(define
|
||||||
hs-query-all
|
hs-query-all
|
||||||
@@ -1560,21 +1574,23 @@
|
|||||||
(fn
|
(fn
|
||||||
(target prop value duration)
|
(target prop value duration)
|
||||||
(hs-null-raise! target)
|
(hs-null-raise! target)
|
||||||
(let
|
(when
|
||||||
((init-attr (str "data-hs-init-" prop)))
|
(not (nil? target))
|
||||||
(when
|
|
||||||
(not (dom-get-attr target init-attr))
|
|
||||||
(dom-set-attr target init-attr (dom-get-style target prop)))
|
|
||||||
(let
|
(let
|
||||||
((actual-value (if (= value "initial") (dom-get-attr target init-attr) value)))
|
((init-attr (str "data-hs-transition-" prop)))
|
||||||
(when
|
(when
|
||||||
duration
|
(not (dom-get-attr target init-attr))
|
||||||
(dom-set-style
|
(dom-set-attr target init-attr (dom-get-style target prop)))
|
||||||
target
|
(let
|
||||||
"transition"
|
((actual-value (if (= value "initial") (dom-get-attr target init-attr) value)))
|
||||||
(str prop " " (/ duration 1000) "s")))
|
(when
|
||||||
(dom-set-style target prop actual-value)
|
duration
|
||||||
(when duration (hs-settle target))))))
|
(dom-set-style
|
||||||
|
target
|
||||||
|
"transition"
|
||||||
|
(str prop " " (/ duration 1000) "s")))
|
||||||
|
(dom-set-style target prop actual-value)
|
||||||
|
(when duration (hs-settle target)))))))
|
||||||
|
|
||||||
(define
|
(define
|
||||||
hs-transition-from
|
hs-transition-from
|
||||||
|
|||||||
Reference in New Issue
Block a user