binaryage / binaryage/cljs-oops

goog.isDateLike is triggered by others' sketchy practices

Aperta
#27 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
Clojure
Stelle
350
Fork
13
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

I've had to stop using cljs-oops for a subset of my uses, specifically https://capacitorjs.com plugins[1], because their top-level plugin modules return a Proxy that behaves somewhat like this (not exactly, but this achieves a similar effect):

```
const p = new Proxy({}, {get: () => () => true})
```

That is to say, `typeof p.anythingAtAll` is 'function'.

Unfortunately, `goog.isDateLike` [only looks](https://github.com/google/closure-library/blob/5ee9c7f1ee0090017f813b9e6516d4fa0fc2d0fd/closure/goog/base.js#L1322) for `goog.isObject` and `typeof val.getFullYear == 'function'`.

I fully appreciate that this style of duck-typed checking is common in JS, including for promises (as thenables) and similar -- and also that this is more of an upstream quirk than anything else.

That said, given that upstream libraries can't always be changed, I wanted to propose configuration to pick which of the safety checks are run, one at a time (maybe a set like `#{:date-like :string-like ...}`?)

I find that I rarely trigger the `date-like` check in ordinary use and disabling it for my own codebase would be helpful for this situation -- on the other hand, I find the other runtime checks valuable and do run into them, so I would love to leave them enabled.

I almost wrote the PR alongside the issue, but I wanted to get your thoughts before doing so, in case you have a preference for how such a thing would work.

Thanks so much for the library -- I like it enough to have wrapped it at https://github.com/tekacs/access in a different syntax, which is primarily how I use it. :)

[1]: such as `@capacitor/filesystem`, which returns the output of `registerPlugin` in `@capacitor/core`

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Direzione di ricerca

Inizia esaminando goog.isDateLike in closure/goog/base.js, in particolare i suoi controlli goog.isObject e getFullYear, e confronta tale comportamento con i controlli a runtime di cljs-oops. Il lavoro è completo quando i chiamanti possono disabilitare indipendentemente il controllo date-like lasciando abilitati gli altri controlli; il contenuto non indica file del progetto o test da eseguire.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
clojure, javascript
Ambito
tooling
Tipo di issue
Funzionalità
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.