Switch to bun, clean up web implementation
This commit is contained in:
23 files changed
+240
-173
No files matched your search
@@ -1 +1 @@
|
||||
4429706825984325407
|
||||
3599957386864841107
|
||||
@@ -11,13 +11,16 @@ class Interpreter {
|
||||
this.handler = handler;
|
||||
this.initialize(root);
|
||||
}
|
||||
initialize(root) {
|
||||
initialize(root, handler = null) {
|
||||
this.global = {};
|
||||
this.local = {};
|
||||
this.root = root;
|
||||
this.nodes = [root];
|
||||
this.stack = [root];
|
||||
this.templates = {};
|
||||
if (handler) {
|
||||
this.handler = handler;
|
||||
}
|
||||
}
|
||||
createListener(event_name, element, bubbles) {
|
||||
if (bubbles) {
|
||||
|
||||
@@ -11,13 +11,16 @@ class Interpreter {
|
||||
this.handler = handler;
|
||||
this.initialize(root);
|
||||
}
|
||||
initialize(root) {
|
||||
initialize(root, handler = null) {
|
||||
this.global = {};
|
||||
this.local = {};
|
||||
this.root = root;
|
||||
this.nodes = [root];
|
||||
this.stack = [root];
|
||||
this.templates = {};
|
||||
if (handler) {
|
||||
this.handler = handler;
|
||||
}
|
||||
}
|
||||
createListener(event_name, element, bubbles) {
|
||||
if (bubbles) {
|
||||
@@ -73,6 +76,86 @@ class Interpreter {
|
||||
}
|
||||
}
|
||||
|
||||
// src/ts/set_attribute.ts
|
||||
function setAttributeInner(node, field, value, ns) {
|
||||
if (ns === "style") {
|
||||
node.style.setProperty(field, value);
|
||||
return;
|
||||
}
|
||||
if (!!ns) {
|
||||
node.setAttributeNS(ns, field, value);
|
||||
return;
|
||||
}
|
||||
switch (field) {
|
||||
case "value":
|
||||
if (node.value !== value) {
|
||||
node.value = value;
|
||||
}
|
||||
break;
|
||||
case "initial_value":
|
||||
node.defaultValue = value;
|
||||
break;
|
||||
case "checked":
|
||||
node.checked = truthy(value);
|
||||
break;
|
||||
case "initial_checked":
|
||||
node.defaultChecked = truthy(value);
|
||||
break;
|
||||
case "selected":
|
||||
node.selected = truthy(value);
|
||||
break;
|
||||
case "initial_selected":
|
||||
node.defaultSelected = truthy(value);
|
||||
break;
|
||||
case "dangerous_inner_html":
|
||||
node.innerHTML = value;
|
||||
break;
|
||||
default:
|
||||
if (!truthy(value) && isBoolAttr(field)) {
|
||||
node.removeAttribute(field);
|
||||
} else {
|
||||
node.setAttribute(field, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
var truthy = function(val) {
|
||||
return val === "true" || val === true;
|
||||
};
|
||||
var isBoolAttr = function(field) {
|
||||
switch (field) {
|
||||
case "allowfullscreen":
|
||||
case "allowpaymentrequest":
|
||||
case "async":
|
||||
case "autofocus":
|
||||
case "autoplay":
|
||||
case "checked":
|
||||
case "controls":
|
||||
case "default":
|
||||
case "defer":
|
||||
case "disabled":
|
||||
case "formnovalidate":
|
||||
case "hidden":
|
||||
case "ismap":
|
||||
case "itemscope":
|
||||
case "loop":
|
||||
case "multiple":
|
||||
case "muted":
|
||||
case "nomodule":
|
||||
case "novalidate":
|
||||
case "open":
|
||||
case "playsinline":
|
||||
case "readonly":
|
||||
case "required":
|
||||
case "reversed":
|
||||
case "selected":
|
||||
case "truespeed":
|
||||
case "webkitdirectory":
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
// src/ts/interpreter_web.ts
|
||||
class PlatformInterpreter extends Interpreter {
|
||||
m;
|
||||
@@ -126,5 +209,6 @@ class PlatformInterpreter extends Interpreter {
|
||||
}
|
||||
}
|
||||
export {
|
||||
setAttributeInner,
|
||||
PlatformInterpreter
|
||||
};
|
||||
@@ -11,6 +11,12 @@ mod write_native_mutations;
|
||||
#[cfg(all(feature = "binary-protocol", feature = "sledgehammer"))]
|
||||
pub use write_native_mutations::*;
|
||||
|
||||
#[cfg(feature = "sledgehammer")]
|
||||
pub mod unified_bindings;
|
||||
|
||||
#[cfg(feature = "sledgehammer")]
|
||||
pub use unified_bindings::*;
|
||||
|
||||
// Common bindings for minimal usage.
|
||||
#[cfg(all(feature = "minimal_bindings", feature = "webonly"))]
|
||||
pub mod minimal_bindings {
|
||||
@@ -28,9 +34,3 @@ pub mod minimal_bindings {
|
||||
pub fn collectFormValues(node: JsValue) -> JsValue;
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "sledgehammer")]
|
||||
pub mod unified_bindings;
|
||||
|
||||
#[cfg(feature = "sledgehammer")]
|
||||
pub use unified_bindings::*;
|
||||
@@ -28,7 +28,7 @@ export class Interpreter {
|
||||
this.initialize(root);
|
||||
}
|
||||
|
||||
initialize(root: HTMLElement) {
|
||||
initialize(root: HTMLElement, handler: EventListener | null = null) {
|
||||
this.global = {};
|
||||
this.local = {};
|
||||
this.root = root;
|
||||
@@ -36,6 +36,10 @@ export class Interpreter {
|
||||
this.nodes = [root];
|
||||
this.stack = [root];
|
||||
this.templates = {};
|
||||
|
||||
if (handler) {
|
||||
this.handler = handler;
|
||||
}
|
||||
}
|
||||
|
||||
createListener(event_name: string, element: HTMLElement, bubbles: boolean) {
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
// We're using sledgehammer directly
|
||||
|
||||
import { Interpreter } from "./interpreter_core";
|
||||
export { setAttributeInner } from "./set_attribute";
|
||||
|
||||
export class PlatformInterpreter extends Interpreter {
|
||||
m: any;
|
||||
|
||||
@@ -6,40 +6,13 @@ use wasm_bindgen::prelude::wasm_bindgen;
|
||||
|
||||
use sledgehammer_bindgen::bindgen;
|
||||
|
||||
/// Combine the interpreter class with the sledgehammer_bindgen generated methods.
|
||||
pub fn native_js() -> String {
|
||||
format!("{}\n{}", include_str!("./js/native.js"), GENERATED_JS,)
|
||||
}
|
||||
|
||||
pub const SLEDGEHAMMER_JS: &str = GENERATED_JS;
|
||||
|
||||
/// Extensions to the interpreter that are specific to the web platform.
|
||||
#[cfg(feature = "webonly")]
|
||||
#[wasm_bindgen(module = "src/js/web.js")]
|
||||
extern "C" {
|
||||
pub type WebInterpreter;
|
||||
|
||||
#[wasm_bindgen(method, js_name = "saveTemplate")]
|
||||
pub fn save_template(this: &WebInterpreter, nodes: Vec<Node>, tmpl_id: u16);
|
||||
|
||||
#[wasm_bindgen(method)]
|
||||
pub fn hydrate(this: &WebInterpreter, ids: Vec<u32>);
|
||||
|
||||
#[wasm_bindgen(method, js_name = "getNode")]
|
||||
pub fn get_node(this: &WebInterpreter, id: u32) -> Node;
|
||||
}
|
||||
|
||||
#[cfg(feature = "webonly")]
|
||||
type PlatformInterpreter = WebInterpreter;
|
||||
|
||||
#[cfg(feature = "webonly")]
|
||||
impl Interpreter {
|
||||
/// Convert the interpreter to a web interpreter, enabling methods like hydrate and save_template.
|
||||
pub fn as_web(&self) -> &WebInterpreter {
|
||||
use wasm_bindgen::prelude::JsCast;
|
||||
&self.js_channel().unchecked_ref()
|
||||
}
|
||||
}
|
||||
|
||||
#[bindgen(module)]
|
||||
mod js {
|
||||
/// The interpreter extends the core interpreter which contains the state for the interpreter along with some functions that all platforms use like `AppendChildren`.
|
||||
@@ -222,3 +195,34 @@ mod js {
|
||||
"{this.els = this.stack.splice(this.stack.length - $n$); let node = this.LoadChild($array$); node.replaceWith(...this.els);}"
|
||||
}
|
||||
}
|
||||
|
||||
/// Extensions to the interpreter that are specific to the web platform.
|
||||
#[cfg(feature = "webonly")]
|
||||
#[wasm_bindgen(module = "src/js/web.js")]
|
||||
extern "C" {
|
||||
pub type WebInterpreter;
|
||||
|
||||
#[wasm_bindgen(method)]
|
||||
pub fn initialize(this: &WebInterpreter, root: Node, handler: &js_sys::Function);
|
||||
|
||||
#[wasm_bindgen(method, js_name = "saveTemplate")]
|
||||
pub fn save_template(this: &WebInterpreter, nodes: Vec<Node>, tmpl_id: u16);
|
||||
|
||||
#[wasm_bindgen(method)]
|
||||
pub fn hydrate(this: &WebInterpreter, ids: Vec<u32>);
|
||||
|
||||
#[wasm_bindgen(method, js_name = "getNode")]
|
||||
pub fn get_node(this: &WebInterpreter, id: u32) -> Node;
|
||||
}
|
||||
|
||||
#[cfg(feature = "webonly")]
|
||||
type PlatformInterpreter = WebInterpreter;
|
||||
|
||||
#[cfg(feature = "webonly")]
|
||||
impl Interpreter {
|
||||
/// Convert the interpreter to a web interpreter, enabling methods like hydrate and save_template.
|
||||
pub fn as_web(&self) -> &WebInterpreter {
|
||||
use wasm_bindgen::prelude::JsCast;
|
||||
&self.js_channel().unchecked_ref()
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user