From f706c6a338ae38f7b3c7bb4b12a770fd50989376 Mon Sep 17 00:00:00 2001 From: MickaelK Date: Sat, 16 Dec 2023 03:36:28 +1100 Subject: [PATCH] feature (lib): assertion in frontend --- public/assets/lib/assert.js | 6 ++++++ public/assets/lib/rx.js | 15 +++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 public/assets/lib/assert.js diff --git a/public/assets/lib/assert.js b/public/assets/lib/assert.js new file mode 100644 index 00000000..2825c7b8 --- /dev/null +++ b/public/assets/lib/assert.js @@ -0,0 +1,6 @@ +export default class assert { + static type(object, type) { + if (object instanceof type) return; + throw new Error(`assertion failed - unexpected type for ${object.toString()}`); + } +} diff --git a/public/assets/lib/rx.js b/public/assets/lib/rx.js index 5cf23e5b..5b716fbf 100644 --- a/public/assets/lib/rx.js +++ b/public/assets/lib/rx.js @@ -1,4 +1,5 @@ import { onDestroy } from "./skeleton/index.js"; +import assert from "./assert.js"; import * as rxjs from "./vendor/rxjs.min.js"; // https://github.com/ReactiveX/rxjs/issues/4416#issuecomment-620847759 @@ -20,19 +21,19 @@ const getFn = (obj, arg0, ...args) => { }; export function applyMutation($node, ...keys) { - if (!$node) throw new Error("undefined node"); + assert.type($node, window.HTMLElement); const execute = getFn($node, ...keys); return rxjs.tap((val) => Array.isArray(val) ? execute(...val) : execute(val)); } export function applyMutations($node, ...keys) { - if (!$node) throw new Error("undefined node"); + assert.type($node, window.HTMLElement); const execute = getFn($node, ...keys); return rxjs.tap((vals) => vals.forEach((val) => execute(val))); } export function stateMutation($node, attr) { - if (!$node) throw new Error("undefined node"); + assert.type($node, window.HTMLElement); return rxjs.tap((val) => $node[attr] = val); } @@ -41,12 +42,14 @@ export function preventDefault() { } export function onClick($node) { - if (!$node) throw new Error("undefined node"); - return rxjs.fromEvent($node, "click").pipe(rxjs.map(() => $node)); + assert.type($node, window.HTMLElement); + return rxjs.fromEvent($node, "click").pipe( + rxjs.map(() => $node) + ); } export function onLoad($node) { - if (!$node) throw new Error("undefined node"); + assert.type($node, window.HTMLElement); return new rxjs.Observable((observer) => { $node.onload = () => { observer.next($node);